diff --git a/AUTHORS.md b/AUTHORS.md
index 43adc3bb1..96412ff63 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -5,39 +5,38 @@ Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
and provided thanks to the work of the following contributors:
* [Gargron](https://github.com/Gargron)
-* [ThibG](https://github.com/ThibG)
-* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
* [dependabot[bot]](https://github.com/apps/dependabot)
+* [ClearlyClaire](https://github.com/ClearlyClaire)
+* [dependabot-preview[bot]](https://github.com/apps/dependabot-preview)
* [ykzts](https://github.com/ykzts)
* [akihikodaki](https://github.com/akihikodaki)
* [mjankowski](https://github.com/mjankowski)
* [unarist](https://github.com/unarist)
-* [yiskah](https://github.com/yiskah)
-* [nolanlawson](https://github.com/nolanlawson)
* [abcang](https://github.com/abcang)
+* [yiskah](https://github.com/yiskah)
+* [noellabo](https://github.com/noellabo)
+* [nolanlawson](https://github.com/nolanlawson)
* [mayaeh](https://github.com/mayaeh)
* [ysksn](https://github.com/ysksn)
* [sorin-davidoi](https://github.com/sorin-davidoi)
-* [noellabo](https://github.com/noellabo)
* [lynlynlynx](https://github.com/lynlynlynx)
* [m4sk1n](mailto:me@m4sk.in)
* [Marcin Mikołajczak](mailto:me@m4sk.in)
-* [Kjwon15](https://github.com/Kjwon15)
+* [tribela](https://github.com/tribela)
* [renatolond](https://github.com/renatolond)
* [alpaca-tc](https://github.com/alpaca-tc)
-* [jeroenpraat](https://github.com/jeroenpraat)
+* [zunda](https://github.com/zunda)
* [nclm](https://github.com/nclm)
* [ineffyble](https://github.com/ineffyble)
-* [zunda](https://github.com/zunda)
* [shleeable](https://github.com/shleeable)
* [Masoud Abkenar](mailto:ampbox@gmail.com)
* [blackle](https://github.com/blackle)
* [Quent-in](https://github.com/Quent-in)
* [JantsoP](https://github.com/JantsoP)
+* [ariasuni](https://github.com/ariasuni)
* [nullkal](https://github.com/nullkal)
* [yookoala](https://github.com/yookoala)
* [Brawaru](https://github.com/Brawaru)
-* [ariasuni](https://github.com/ariasuni)
* [Aditoo17](https://github.com/Aditoo17)
* [Quenty31](https://github.com/Quenty31)
* [marek-lach](https://github.com/marek-lach)
@@ -45,7 +44,9 @@ and provided thanks to the work of the following contributors:
* [ashfurrow](https://github.com/ashfurrow)
* [danhunsaker](https://github.com/danhunsaker)
* [eramdam](https://github.com/eramdam)
+* [Jeroen](mailto:jeroenpraat@users.noreply.github.com)
* [takayamaki](https://github.com/takayamaki)
+* [dunn](https://github.com/dunn)
* [masarakki](https://github.com/masarakki)
* [ticky](https://github.com/ticky)
* [trwnh](https://github.com/trwnh)
@@ -53,15 +54,15 @@ and provided thanks to the work of the following contributors:
* [hinaloe](https://github.com/hinaloe)
* [hcmiya](https://github.com/hcmiya)
* [stephenburgess8](https://github.com/stephenburgess8)
-* [Wonderfall](mailto:wonderfall@targaryen.house)
+* [Wonderfall](https://github.com/Wonderfall)
* [matteoaquila](https://github.com/matteoaquila)
* [yukimochi](https://github.com/yukimochi)
* [palindromordnilap](https://github.com/palindromordnilap)
* [rkarabut](https://github.com/rkarabut)
+* [jeroenpraat](mailto:jeroenpraat@users.noreply.github.com)
* [nightpool](https://github.com/nightpool)
* [Artoria2e5](https://github.com/Artoria2e5)
* [marrus-sh](https://github.com/marrus-sh)
-* [dunn](https://github.com/dunn)
* [krainboltgreene](https://github.com/krainboltgreene)
* [pfigel](https://github.com/pfigel)
* [BoFFire](https://github.com/BoFFire)
@@ -73,18 +74,19 @@ and provided thanks to the work of the following contributors:
* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
* [Sylvhem](https://github.com/Sylvhem)
* [MitarashiDango](https://github.com/MitarashiDango)
+* [rinsuki](https://github.com/rinsuki)
* [angristan](https://github.com/angristan)
* [JeanGauthier](https://github.com/JeanGauthier)
* [kschaper](https://github.com/kschaper)
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
* [koyuawsmbrtn](https://github.com/koyuawsmbrtn)
* [BenLubar](https://github.com/BenLubar)
+* [mkljczk](https://github.com/mkljczk)
* [adbelle](https://github.com/adbelle)
* [evanminto](https://github.com/evanminto)
* [MightyPork](https://github.com/MightyPork)
* [ashleyhull-versent](https://github.com/ashleyhull-versent)
* [yhirano55](https://github.com/yhirano55)
-* [rinsuki](https://github.com/rinsuki)
* [devkral](https://github.com/devkral)
* [camponez](https://github.com/camponez)
* [hugogameiro](https://github.com/hugogameiro)
@@ -100,7 +102,6 @@ and provided thanks to the work of the following contributors:
* [lindwurm](https://github.com/lindwurm)
* [victorhck](mailto:victorhck@geeko.site)
* [voidsatisfaction](https://github.com/voidsatisfaction)
-* [mkljczk](https://github.com/mkljczk)
* [hikari-no-yume](https://github.com/hikari-no-yume)
* [seefood](https://github.com/seefood)
* [jackjennings](https://github.com/jackjennings)
@@ -135,10 +136,11 @@ and provided thanks to the work of the following contributors:
* [kadiix](https://github.com/kadiix)
* [kodacs](https://github.com/kodacs)
* [marcin mikołajczak](mailto:me@m4sk.in)
-* [JMendyk](https://github.com/JMendyk)
* [KScl](https://github.com/KScl)
* [sterdev](https://github.com/sterdev)
+* [mashirozx](https://github.com/mashirozx)
* [TheKinrar](https://github.com/TheKinrar)
+* [007lva](https://github.com/007lva)
* [AA4ch1](https://github.com/AA4ch1)
* [alexgleason](https://github.com/alexgleason)
* [Bèr Kessels](mailto:ber@berk.es)
@@ -150,6 +152,7 @@ and provided thanks to the work of the following contributors:
* [hendotcat](https://github.com/hendotcat)
* [d6rkaiz](https://github.com/d6rkaiz)
* [ladyisatis](https://github.com/ladyisatis)
+* [JMendyk](https://github.com/JMendyk)
* [JohnD28](https://github.com/JohnD28)
* [znz](https://github.com/znz)
* [saper](https://github.com/saper)
@@ -159,6 +162,7 @@ and provided thanks to the work of the following contributors:
* [ekiru](https://github.com/ekiru)
* [geta6](https://github.com/geta6)
* [happycoloredbanana](https://github.com/happycoloredbanana)
+* [joenepraat](https://github.com/joenepraat)
* [leopku](https://github.com/leopku)
* [SansPseudoFix](https://github.com/SansPseudoFix)
* [spla](mailto:sp@mastodont.cat)
@@ -169,13 +173,13 @@ and provided thanks to the work of the following contributors:
* [nzws](https://github.com/nzws)
* [duxovni](https://github.com/duxovni)
* [smorimoto](https://github.com/smorimoto)
-* [mashirozx](https://github.com/mashirozx)
* [178inaba](https://github.com/178inaba)
* [acid-chicken](https://github.com/acid-chicken)
* [xgess](https://github.com/xgess)
* [alyssais](https://github.com/alyssais)
* [aablinov](https://github.com/aablinov)
* [stalker314314](https://github.com/stalker314314)
+* [cohosh](https://github.com/cohosh)
* [cutls](https://github.com/cutls)
* [huertanix](https://github.com/huertanix)
* [eleboucher](https://github.com/eleboucher)
@@ -184,7 +188,7 @@ and provided thanks to the work of the following contributors:
* [treby](https://github.com/treby)
* [jpdevries](https://github.com/jpdevries)
* [gdpelican](https://github.com/gdpelican)
-* [Korbinian](mailto:kontakt@korbinian-michl.de)
+* [MonaLisaOverrdrive](https://github.com/MonaLisaOverrdrive)
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
* [panarom](https://github.com/panarom)
* [Dar13](https://github.com/Dar13)
@@ -204,6 +208,7 @@ and provided thanks to the work of the following contributors:
* [gled-rs](https://github.com/gled-rs)
* [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl)
* [R0ckweb](https://github.com/R0ckweb)
+* [Izorkin](https://github.com/Izorkin)
* [unasuke](https://github.com/unasuke)
* [caasi](https://github.com/caasi)
* [chr-1x](https://github.com/chr-1x)
@@ -211,13 +216,14 @@ and provided thanks to the work of the following contributors:
* [foxiehkins](https://github.com/foxiehkins)
* [highemerly](https://github.com/highemerly)
* [hoodie](mailto:hoodiekitten@outlook.com)
+* [kaiyou](https://github.com/kaiyou)
* [luzi82](https://github.com/luzi82)
* [slice](https://github.com/slice)
* [tmm576](https://github.com/tmm576)
* [unsmell](mailto:unsmell@users.noreply.github.com)
* [valerauko](https://github.com/valerauko)
* [chriswmartin](https://github.com/chriswmartin)
-* [vahnj](https://github.com/vahnj)
+* [SuperSandro2000](https://github.com/SuperSandro2000)
* [ikuradon](https://github.com/ikuradon)
* [AndreLewin](https://github.com/AndreLewin)
* [0xflotus](https://github.com/0xflotus)
@@ -254,17 +260,20 @@ and provided thanks to the work of the following contributors:
* [ian-kelling](https://github.com/ian-kelling)
* [immae](https://github.com/immae)
* [J0WI](https://github.com/J0WI)
+* [vahnj](https://github.com/vahnj)
* [foozmeat](https://github.com/foozmeat)
* [jasonrhodes](https://github.com/jasonrhodes)
* [Jason Snell](mailto:jason@newrelic.com)
* [jviide](https://github.com/jviide)
* [YuleZ](https://github.com/YuleZ)
+* [jtracey](https://github.com/jtracey)
* [crakaC](https://github.com/crakaC)
* [tkbky](https://github.com/tkbky)
* [Kaylee](mailto:kaylee@codethat.sucks)
* [Kazhnuz](https://github.com/Kazhnuz)
* [mkody](https://github.com/mkody)
* [connyduck](https://github.com/connyduck)
+* [Tak](https://github.com/Tak)
* [LindseyB](https://github.com/LindseyB)
* [Lorenz Diener](mailto:halcyon@icosahedron.website)
* [Markus Amalthea Magnuson](mailto:markus.magnuson@gmail.com)
@@ -282,9 +291,9 @@ and provided thanks to the work of the following contributors:
* [lumenwrites](https://github.com/lumenwrites)
* [remram44](https://github.com/remram44)
* [sts10](https://github.com/sts10)
-* [SuperSandro2000](https://github.com/SuperSandro2000)
* [u1-liquid](https://github.com/u1-liquid)
* [rosylilly](https://github.com/rosylilly)
+* [withshubh](https://github.com/withshubh)
* [sim6](https://github.com/sim6)
* [Sir-Boops](https://github.com/Sir-Boops)
* [stemid](https://github.com/stemid)
@@ -305,15 +314,16 @@ and provided thanks to the work of the following contributors:
* [anon5r](https://github.com/anon5r)
* [aus-social](https://github.com/aus-social)
* [bsky](mailto:me@imbsky.net)
+* [chandrn7](https://github.com/chandrn7)
* [codl](https://github.com/codl)
* [cpsdqs](https://github.com/cpsdqs)
* [barzamin](https://github.com/barzamin)
+* [gol-cha](https://github.com/gol-cha)
* [fhalna](https://github.com/fhalna)
* [haoyayoi](https://github.com/haoyayoi)
* [ik11235](https://github.com/ik11235)
* [kawax](https://github.com/kawax)
* [shrft](https://github.com/shrft)
-* [007lva](https://github.com/007lva)
* [mbajur](https://github.com/mbajur)
* [matsurai25](https://github.com/matsurai25)
* [mecab](https://github.com/mecab)
@@ -353,7 +363,7 @@ and provided thanks to the work of the following contributors:
* [a2](https://github.com/a2)
* [alfiedotwtf](https://github.com/alfiedotwtf)
* [0xa](https://github.com/0xa)
-* [ArisuOngaku](https://github.com/ArisuOngaku)
+* [ashpieboop](https://github.com/ashpieboop)
* [virtualpain](https://github.com/virtualpain)
* [sapphirus](https://github.com/sapphirus)
* [amandavisconti](https://github.com/amandavisconti)
@@ -367,6 +377,7 @@ and provided thanks to the work of the following contributors:
* [orlea](https://github.com/orlea)
* [armandfardeau](https://github.com/armandfardeau)
* [raboof](https://github.com/raboof)
+* [aldatsa](https://github.com/aldatsa)
* [jumbosushi](https://github.com/jumbosushi)
* [acuteaura](https://github.com/acuteaura)
* [ayumin](https://github.com/ayumin)
@@ -375,7 +386,7 @@ and provided thanks to the work of the following contributors:
* [li-bei](https://github.com/li-bei)
* [Benedikt Geißler](mailto:benedikt@g5r.eu)
* [BenisonSebastian](https://github.com/BenisonSebastian)
-* [blakebarnett](https://github.com/blakebarnett)
+* [Blake](mailto:blake.barnett@postmates.com)
* [Brad Janke](mailto:brad.janke@gmail.com)
* [bclindner](https://github.com/bclindner)
* [brycied00d](https://github.com/brycied00d)
@@ -395,10 +406,12 @@ and provided thanks to the work of the following contributors:
* [colindean](https://github.com/colindean)
* [DeeUnderscore](https://github.com/DeeUnderscore)
* [dachinat](https://github.com/dachinat)
-* [monsterpit-firedemon](https://github.com/monsterpit-firedemon)
+* [Daggertooth](mailto:dev@monsterpit.net)
* [watilde](https://github.com/watilde)
+* [dalehenries](https://github.com/dalehenries)
* [daprice](https://github.com/daprice)
* [da2x](https://github.com/da2x)
+* [danieljakots](https://github.com/danieljakots)
* [codesections](https://github.com/codesections)
* [dar5hak](https://github.com/dar5hak)
* [kant](https://github.com/kant)
@@ -423,6 +436,7 @@ and provided thanks to the work of the following contributors:
* [espenronnevik](https://github.com/espenronnevik)
* [Expenses](mailto:expenses@airmail.cc)
* [fabianonline](https://github.com/fabianonline)
+* [shello](https://github.com/shello)
* [Finariel](https://github.com/Finariel)
* [siuying](https://github.com/siuying)
* [zoc](https://github.com/zoc)
@@ -433,7 +447,7 @@ and provided thanks to the work of the following contributors:
* [hattori6789](https://github.com/hattori6789)
* [algernon](https://github.com/algernon)
* [Fastbyte01](https://github.com/Fastbyte01)
-* [myfreeweb](https://github.com/myfreeweb)
+* [unrelentingtech](https://github.com/unrelentingtech)
* [gfaivre](https://github.com/gfaivre)
* [Fiaxhs](https://github.com/Fiaxhs)
* [rasjonell](https://github.com/rasjonell)
@@ -445,17 +459,20 @@ and provided thanks to the work of the following contributors:
* [Habu-Kagumba](https://github.com/Habu-Kagumba)
* [suzukaze](https://github.com/suzukaze)
* [Hiromi-Kai](https://github.com/Hiromi-Kai)
-* [hishamhm](https://github.com/hishamhm)
-* [Slaynash](https://github.com/Slaynash)
-* [musashino205](https://github.com/musashino205)
-* [iwaim](https://github.com/iwaim)
-* [valrus](https://github.com/valrus)
-* [IMcD23](https://github.com/IMcD23)
-* [yi0713](https://github.com/yi0713)
-* [iblech](https://github.com/iblech)
+* [Hisham Muhammad](mailto:hisham@gobolinux.org)
+* [Hugo "Slaynash" Flores](mailto:hugoflores@hotmail.fr)
+* [INAGAKI Hiroshi](mailto:musashino205@users.noreply.github.com)
+* [IWAI, Masaharu](mailto:iwaim.sub@gmail.com)
+* [Ian McCowan](mailto:imccowan@gmail.com)
+* [Ian McDowell](mailto:me@ianmcdowell.net)
+* [Iijima Yasushi](mailto:kurage.cc@gmail.com)
+* [Ikko Ashimine](mailto:eltociear@gmail.com)
+* [Ingo Blechschmidt](mailto:iblech@web.de)
* [J Yeary](mailto:usbsnowcrash@users.noreply.github.com)
-* [jack-michaud](https://github.com/jack-michaud)
-* [Floppy](https://github.com/Floppy)
+* [Jack Michaud](mailto:jack-michaud@users.noreply.github.com)
+* [Jakub Mendyk](mailto:jakubmendyk.szkola@gmail.com)
+* [James](mailto:james.allen.vaughan@gmail.com)
+* [James Smith](mailto:james@floppy.org.uk)
* [Jarek Lipski](mailto:pub@loomchild.net)
* [Jennifer Glauche](mailto:=^.^=@github19.jglauche.de)
* [Jennifer Kruse](mailto:jenkr55@gmail.com)
@@ -464,6 +481,7 @@ and provided thanks to the work of the following contributors:
* [Jessica K. Litwin](mailto:jessica@litw.in)
* [Jo Decker](mailto:trolldecker@users.noreply.github.com)
* [Joan Montané](mailto:jmontane@users.noreply.github.com)
+* [Joe](mailto:401283+htmlbyjoe@users.noreply.github.com)
* [Jonathan Klee](mailto:klee.jonathan@gmail.com)
* [Jordan Guerder](mailto:jguerder@fr.pulseheberg.net)
* [Joseph Mingrone](mailto:jehops@users.noreply.github.com)
@@ -483,7 +501,6 @@ and provided thanks to the work of the following contributors:
* [Krzysztof Jurewicz](mailto:krzysztof.jurewicz@gmail.com)
* [Leo Wzukw](mailto:leowzukw@users.noreply.github.com)
* [Leonie](mailto:62470640+bubblineyuri@users.noreply.github.com)
-* [Levi Bard](mailto:taktaktaktaktaktaktaktaktaktak@gmail.com)
* [Lex Alexander](mailto:l.alexander10@gmail.com)
* [Lorenz Diener](mailto:lorenzd@gmail.com)
* [Luc Didry](mailto:ldidry@users.noreply.github.com)
@@ -560,6 +577,7 @@ and provided thanks to the work of the following contributors:
* [ScienJus](mailto:i@scienjus.com)
* [Scott Larkin](mailto:scott@codeclimate.com)
* [Scott Sweeny](mailto:scott@ssweeny.net)
+* [Sean](mailto:sean@sean.taipei)
* [Sebastian Hübner](mailto:imolein@users.noreply.github.com)
* [Sebastian Morr](mailto:sebastian@morr.cc)
* [Sergei Č](mailto:noiwex1911@gmail.com)
@@ -570,8 +588,10 @@ and provided thanks to the work of the following contributors:
* [Shouko Yu](mailto:imshouko@gmail.com)
* [Sina Mashek](mailto:sina@mashek.xyz)
* [Soft. Dev](mailto:24978+nileshkumar@users.noreply.github.com)
+* [Sophie Parker](mailto:dev@cortices.me)
* [Soshi Kato](mailto:mail@sossii.com)
* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
+* [Stanislas](mailto:stanislas.lange@pm.me)
* [StefOfficiel](mailto:pichard.stephane@free.fr)
* [Steven Tappert](mailto:admin@dark-it.net)
* [Stéphane Guillou](mailto:stephane.guillou@member.fsf.org)
@@ -630,9 +650,9 @@ and provided thanks to the work of the following contributors:
* [evilny0](mailto:evilny0@moomoocamp.net)
* [febrezo](mailto:felixbrezo@gmail.com)
* [fsubal](mailto:fsubal@users.noreply.github.com)
+* [fusagiko / takayamaki](mailto:24884114+takayamaki@users.noreply.github.com)
* [fusshi-](mailto:dikky1218@users.noreply.github.com)
* [gentaro](mailto:gentaroooo@gmail.com)
-* [gol-cha](mailto:info@mevo.xyz)
* [guigeekz](mailto:pattusg@gmail.com)
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
* [haosbvnker](mailto:github@chaosbunker.com)
@@ -645,7 +665,7 @@ and provided thanks to the work of the following contributors:
* [jooops](mailto:joops@autistici.org)
* [jukper](mailto:jukkaperanto@gmail.com)
* [jumoru](mailto:jumoru@mailbox.org)
-* [kaiyou](mailto:pierre@jaury.eu)
+* [kaias1jp](mailto:kaias1jp@gmail.com)
* [karlyeurl](mailto:karl.yeurl@gmail.com)
* [kawaguchi](mailto:jiikko@users.noreply.github.com)
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
@@ -705,104 +725,131 @@ This document is provided for informational purposes only. Since it is only upda
Following people have contributed to translation of Mastodon:
-- ᏦᏁᎢᎵᏫ 😷 (KNTRO) (*Spanish, Argentina*)
+- GunChleoc (*Scottish Gaelic*)
+- ᛤᚤᛠᛥⴲ 👽 (KNTRO) (*Spanish, Argentina*)
+- adrmzz (*Sardinian*)
+- Hồ Nhất Duy (kantcer) (*Vietnamese*)
+- Zoltán Gera (gerazo) (*Hungarian*)
- Sveinn í Felli (sveinki) (*Icelandic*)
- qezwan (*Persian, Sorani (Kurdish)*)
-- Hồ Nhất Duy (kantcer) (*Vietnamese*)
-- taicv (*Vietnamese*)
-- Zoltán Gera (gerazo) (*Hungarian*)
-- ButterflyOfFire (BoFFire) (*French, Arabic, Kabyle*)
-- adrmzz (*Sardinian*)
+- NCAA (*Danish*)
- Ramdziana F Y (rafeyu) (*Indonesian*)
-- Evert Prants (IcyDiamond) (*Estonian*)
-- Daniele Lira Mereb (danilmereb) (*Portuguese, Brazilian*)
+- taicv (*Vietnamese*)
+- ButterflyOfFire (BoFFire) (*French, Arabic, Kabyle*)
- Xosé M. (XoseM) (*Spanish, Galician*)
-- Kristijan Tkalec (lapor) (*Slovenian*)
-- stan ionut (stanionut12) (*Romanian*)
+- Evert Prants (IcyDiamond) (*Estonian*)
- Besnik_b (*Albanian*)
- Emanuel Pina (emanuelpina) (*Portuguese*)
-- Thai Localization (thl10n) (*Thai*)
-- 奈卜拉 (nebula_moe) (*Chinese Simplified*)
- Jeong Arm (Kjwon15) (*Japanese, Korean, Esperanto*)
-- Michal Stanke (mstanke) (*Czech*)
-- Alix Rossi (palindromordnilap) (*French, Corsican*)
+- Alix Rossi (palindromordnilap) (*French, Esperanto, Corsican*)
+- Thai Localization (thl10n) (*Thai*)
+- Daniele Lira Mereb (danilmereb) (*Portuguese, Brazilian*)
+- Joene (joenepraat) (*Dutch*)
+- Kristijan Tkalec (lapor) (*Slovenian*)
+- stan ionut (stanionut12) (*Romanian*)
- spla (*Spanish, Catalan*)
-- Imre Kristoffer Eilertsen (DandelionSprout) (*Norwegian*)
-- Jeroen (jeroenpraat) (*Dutch*)
-- borys_sh (*Ukrainian*)
-- Miguel Mayol (mitcoes) (*Spanish, Catalan*)
+- мачко (ma4ko) (*Bulgarian*)
+- 奈卜拉 (nebula_moe) (*Chinese Simplified*)
+- kamee (*Armenian*)
+- AJ-عجائب البرمجة (Esmail_Hazem) (*Arabic*)
+- Michal Stanke (mstanke) (*Czech*)
- Danial Behzadi (danialbehzadi) (*Persian*)
-- yeft (*Chinese Traditional, Chinese Traditional, Hong Kong*)
+- borys_sh (*Ukrainian*)
+- Asier Iturralde Sarasola (aldatsa) (*Basque*)
+- Imre Kristoffer Eilertsen (DandelionSprout) (*Norwegian*)
- koyu (*German*)
+- yeft (*Chinese Traditional, Chinese Traditional, Hong Kong*)
+- Miguel Mayol (mitcoes) (*Spanish, Catalan*)
+- Sasha Sorokin (Brawaru) (*French, Catalan, Danish, German, Greek, Hungarian, Armenian, Korean, Russian, Albanian, Swedish, Ukrainian, Vietnamese, Galician*)
+- Roboron (*Spanish*)
- Koala Yeung (yookoala) (*Chinese Traditional, Hong Kong*)
+- Ondřej Pokorný (unextro) (*Czech*)
- Osoitz (*Basque*)
- Peterandre (*Norwegian, Norwegian Nynorsk*)
- tzium (*Sardinian*)
+- Mélanie Chauvel (ariasuni) (*French, Arabic, Czech, German, Greek, Hungarian, Slovenian, Ukrainian, Chinese Simplified, Portuguese, Brazilian, Persian, Norwegian Nynorsk, Esperanto, Breton, Corsican, Sardinian, Kabyle*)
- Iváns (Ivans_translator) (*Galician*)
-- Sasha Sorokin (Sasha-Sorokin) (*French, Catalan, Danish, German, Greek, Hungarian, Armenian, Korean, Russian, Albanian, Swedish, Ukrainian, Vietnamese, Galician*)
-- kamee (*Armenian*)
+- Maya Minatsuki (mayaeh) (*Japanese*)
+- Manuel Viens (manuelviens) (*French*)
+- Alessandro Levati (Oct326) (*Italian*)
+- lamnatos (*Greek*)
+- Sean Young (assanges) (*Chinese Traditional*)
- tolstoevsky (*Russian*)
- enolp (*Asturian*)
-- FédiQuébec (manuelviens) (*French*)
-- lamnatos (*Greek*)
-- Maya Minatsuki (mayaeh) (*Japanese*)
+- Jasmine Cam Andrever (gourmas) (*Cornish*)
+- gagik_ (*Armenian*)
- Masoud Abkenar (mabkenar) (*Persian*)
-- Alessandro Levati (Oct326) (*Italian*)
- arshat (*Kazakh*)
-- Roboron (*Spanish*)
-- ariasuni (*French, Arabic, Czech, German, Greek, Hungarian, Slovenian, Ukrainian, Chinese Simplified, Portuguese, Brazilian, Persian, Norwegian Nynorsk, Esperanto, Breton, Corsican, Sardinian, Kabyle*)
-- Ali Demirtaş (alidemirtas) (*Turkish*)
-- Em St Cenydd (cancennau) (*Welsh*)
+- Marcin Mikołajczak (mkljczkk) (*Czech, Polish, Russian*)
- Marek Ľach (mareklach) (*Polish, Slovak*)
+- Ali Demirtaş (alidemirtas) (*Turkish*)
+- Blak Ouille (BlakOuille16) (*French*)
+- Em St Cenydd (cancennau) (*Welsh*)
+- Diluns (*Occitan*)
- Muha Aliss (muhaaliss) (*Turkish*)
- Jurica (ahjk) (*Croatian*)
- Aditoo17 (*Czech*)
-- Diluns (*Occitan*)
-- gagik_ (*Armenian*)
- vishnuvaratharajan (*Tamil*)
-- Marcin Mikołajczak (mkljczkk) (*Czech, Polish, Russian*)
+- pulmonarycosignerkindness (*Swedish*)
+- cybergene (cyber-gene) (*Japanese*)
+- Takeçi (polygoat) (*French, Italian*)
+- xatier (*Chinese Traditional*)
+- Ihor Hordiichuk (ihor_ck) (*Ukrainian*)
- regulartranslator (*Portuguese, Brazilian*)
+- ozzii (*French, Serbian (Cyrillic)*)
+- Irfan (Irfan_Radz) (*Malay*)
+- Saederup92 (*Danish*)
- Akarshan Biswas (biswasab) (*Bengali, Sanskrit*)
- Yi-Jyun Pan (pan93412) (*Chinese Traditional*)
+- Rafael H L Moretti (Moretti) (*Portuguese, Brazilian*)
- d5Ziif3K (*Ukrainian*)
- GiorgioHerbie (*Italian*)
-- Rafael H L Moretti (Moretti) (*Portuguese, Brazilian*)
-- Saederup92 (*Danish*)
- christalleras (*Norwegian Nynorsk*)
-- cybergene (cyber-gene) (*Japanese*)
- Taloran (*Norwegian Nynorsk*)
- ThibG (*French, Icelandic*)
-- xatier (*Chinese Traditional*)
- otrapersona (*Spanish, Spanish, Mexico*)
+- Store (HelaBasa) (*Sinhala*)
+- Mauzi (*German, Swedish*)
- atarashiako (*Chinese Simplified*)
- 101010 (101010pl) (*Polish*)
+- erictapen (*German*)
+- Tagomago (tagomago) (*French, Spanish*)
+- Jaz-Michael King (jazmichaelking) (*Welsh*)
+- coxde (*Chinese Simplified*)
+- T. E. Kalaycı (tekrei) (*Turkish*)
- silkevicious (*Italian*)
- Floxu (fredrikdim1) (*Norwegian Nynorsk*)
+- Ryo (DrRyo) (*Korean*)
- Bertil Hedkvist (Berrahed) (*Swedish*)
- William(ѕ)ⁿ (wmlgr) (*Spanish*)
- norayr (*Armenian*)
+- Satnam S Virdi (pika10singh) (*Punjabi*)
- Tiago Epifânio (tfve) (*Portuguese*)
-- Ryo (DrRyo) (*Korean*)
+- Balázs Meskó (mesko.balazs) (*Hungarian*)
+- Sokratis Alichanidis (alichani) (*Greek*)
- Mentor Gashi (mentorgashi.com) (*Albanian*)
-- Jaz-Michael King (jazmichaelking) (*Welsh*)
- carolinagiorno (*Portuguese, Brazilian*)
+- Hayk Khachatryan (brutusromanus123) (*Armenian*)
- Roby Thomas (roby.thomas) (*Malayalam*)
- Bharat Kumar (Marwari) (*Hindi*)
+- Austra Muizniece (aus_m) (*Latvian*)
- ThonyVezbe (*Breton*)
+- v4vachan (*Malayalam*)
- dkdarshan760 (*Sanskrit*)
-- Tagomago (tagomago) (*French, Spanish*)
- tykayn (*French*)
- axi (*Finnish*)
-- Selyan Slimane AMIRI (slimane_AMIRI) (*Kabyle*)
-- Balázs Meskó (mesko.balazs) (*Hungarian*)
+- Selyan Slimane AMIRI (SelyanKab) (*Kabyle*)
+- Timur Seber (seber) (*Tatar*)
- taoxvx (*Danish*)
- Hrach Mkrtchyan (mhrach87) (*Armenian*)
- sabri (thetomatoisavegetable) (*Spanish, Spanish, Argentina*)
- Dewi (Unkorneg) (*French, Breton*)
-- Coelacanthus (*Chinese Simplified*)
+- CoelacanthusHex (*Chinese Simplified*)
- syncopams (*Chinese Simplified, Chinese Traditional, Chinese Traditional, Hong Kong*)
+- Rhys Harrison (rhedders) (*Esperanto*)
+- Hakim Oubouali (zenata1) (*Standard Moroccan Tamazight*)
- SteinarK (*Norwegian Nynorsk*)
-- Sokratis Alichanidis (alichani) (*Greek*)
+- Lalo Tafolla (lalotafo) (*Spanish, Spanish, Mexico*)
- Mathias B. Vagnes (vagnes) (*Norwegian*)
- dashersyed (*Urdu (Pakistan)*)
- Acolyte (666noob404) (*Ukrainian*)
@@ -811,104 +858,124 @@ Following people have contributed to translation of Mastodon:
- Damjan Dimitrioski (gnud) (*Macedonian*)
- PPNplus (*Thai*)
- shioko (*Chinese Simplified*)
-- v4vachan (*Malayalam*)
-- Hakim Oubouali (zenata1) (*Standard Moroccan Tamazight*)
+- ZiriSut (*Kabyle*)
- Evgeny Petrov (kondra007) (*Russian*)
- Gwenn (Belvar) (*Breton*)
- StanleyFrew (*French*)
-- Hayk Khachatryan (brutusromanus123) (*Armenian*)
+- Nikita Epifanov (Nikets) (*Russian*)
- jaranta (*Finnish*)
-- Felicia (midsommar) (*Swedish*)
+- Slobodan Simić (Слободан Симић) (slsimic) (*Serbian (Cyrillic)*)
+- Felicia Jongleur (midsommar) (*Swedish*)
- Denys (dector) (*Ukrainian*)
+- iVampireSP (*Chinese Simplified, Chinese Traditional*)
- Pukima (pukimaaa) (*German*)
+- 游荡 (MamaShip) (*Chinese Simplified*)
- Vanege (*Esperanto*)
+- Rikard Linde (rikardlinde) (*Swedish*)
- Jess Rafn (therealyez) (*Danish*)
- strubbl (*German*)
- Stasiek Michalski (hellcp) (*Polish*)
- dxwc (*Bengali*)
- jmontane (*Catalan*)
- Liboide (*Spanish*)
+- Hexandcube (hexandcube) (*Polish*)
+- Chris Kay (chriskarasoulis) (*Greek*)
- Johan Schiff (schyffel) (*Swedish*)
- Arunmozhi (tecoholic) (*Tamil*)
+- zer0-x (ZER0-X) (*Arabic*)
- kat (katktv) (*Russian, Ukrainian*)
-- Rikard Linde (rikardlinde) (*Swedish*)
+- Lauren Liberda (selfisekai) (*Polish*)
+- mynameismonkey (*Welsh*)
- oti4500 (*Hungarian, Ukrainian*)
-- Laura (selfisekai) (*Polish*)
-- Rachida S. (ZiriSut) (*Kabyle*)
+- Mats Gunnar Ahlqvist (goqbi) (*Swedish*)
- diazepan (*Spanish, Spanish, Argentina*)
- marzuquccen (*Kabyle*)
-- Juan José Salvador Piedra (JuanjoSalvador) (*Spanish*)
+- VictorCorreia (victorcorreia1984) (*Afrikaans*)
- Tigran (tigransimonyan) (*Armenian*)
+- Juan José Salvador Piedra (JuanjoSalvador) (*Spanish*)
- BurekzFinezt (*Serbian (Cyrillic)*)
- SHeija (*Finnish*)
+- Gearguy (*Finnish*)
- atriix (*Swedish*)
- Jack R (isaac.97_WT) (*Spanish*)
- antonyho (*Chinese Traditional, Hong Kong*)
+- asnomgtu (*Hungarian*)
+- ahangarha (*Persian*)
- andruhov (*Russian, Ukrainian*)
-- Aryamik Sharma (Aryamik) (*Swedish, Hindi*)
- phena109 (*Chinese Traditional, Hong Kong*)
+- Aryamik Sharma (Aryamik) (*Swedish, Hindi*)
+- Unmual (*Spanish*)
- 森の子リスのミーコの大冒険 (Phroneris) (*Japanese*)
- るいーね (ruine) (*Japanese*)
-- ahangarha (*Persian*)
- Sam Tux (imahbub) (*Bengali*)
+- Kristoffer Grundström (Umeaboy) (*Swedish*)
- igordrozniak (*Polish*)
-- Unmual (*Spanish*)
- Isaac Huang (caasih) (*Chinese Traditional*)
- AW Unad (awcodify) (*Indonesian*)
- Allen Zhong (AstroProfundis) (*Chinese Simplified*)
- Cutls (cutls) (*Japanese*)
-- Ray (Ipsumry) (*Spanish*)
- Falling Snowdin (tghgg) (*Vietnamese*)
-- coxde (*Chinese Simplified*)
+- Ray (Ipsumry) (*Spanish*)
+- Gianfranco Fronteddu (gianfro.gianfro) (*Sardinian*)
- Rasmus Lindroth (RasmusLindroth) (*Swedish*)
- Andrea Lo Iacono (niels0n) (*Italian*)
+- Parodper (*Galician*)
+- fucsia (*Italian*)
+- NadieAishi (*Spanish, Spanish, Mexico*)
- Kinshuk Sunil (kinshuksunil) (*Hindi*)
- Ullas Joseph (ullasjoseph) (*Malayalam*)
- Goudarz Jafari (Goudarz) (*Persian*)
- Yu-Pai Liu (tedliou) (*Chinese Traditional*)
- Amarin Cemthong (acitmaster) (*Thai*)
+- Johannes Nilsson (nlssn) (*Swedish*)
- juanda097 (juanda-097) (*Spanish*)
- Anunnakey (*Macedonian*)
-- fragola (*Italian*)
+- erikkemp (*Dutch*)
- erikstl (*Esperanto*)
-- twpenguin (*Chinese Traditional*)
- bobchao (*Chinese Traditional*)
-- Esther (esthermations) (*Portuguese*)
+- twpenguin (*Chinese Traditional*)
- MadeInSteak (*Finnish*)
-- Heimen Stoffels (vistausss) (*Dutch*)
+- Esther (esthermations) (*Portuguese*)
+- t_aus_m (*German*)
+- Heimen Stoffels (Vistaus) (*Dutch*)
- Rajarshi Guha (rajarshiguha) (*Bengali*)
-- Andrew (iAndrew3) (*Romanian*)
+- Mo_der Steven (SakuraPuare) (*Chinese Simplified*)
- Gopal Sharma (gopalvirat) (*Hindi*)
- arethsu (*Swedish*)
-- Tofiq Abdula (Xwla) (*Sorani (Kurdish)*)
- Carlos Solís (csolisr) (*Esperanto*)
+- Tofiq Abdula (Xwla) (*Sorani (Kurdish)*)
- Parthan S Ramanujam (parthan) (*Tamil*)
- Kasper Nymand (KasperNymand) (*Danish*)
+- Jeff Huang (s8321414) (*Chinese Traditional*)
- TS (morte) (*Finnish*)
- subram (*Turkish*)
- SensDeViata (*Ukrainian*)
- Ptrcmd (ptrcmd) (*Chinese Traditional*)
- SergioFMiranda (*Portuguese, Brazilian*)
-- Scvoet (scvoet) (*Chinese Simplified*)
+- Percy (scvoet) (*Chinese Simplified*)
+- Vivek K J (Vivekkj) (*Malayalam*)
- hiroTS (*Chinese Traditional*)
- johne32rus23 (*Russian*)
- AzureNya (*Chinese Simplified*)
- OctolinGamer (octolingamer) (*Portuguese, Brazilian*)
- Ram varma (ram4varma) (*Tamil*)
-- Hexandcube (hexandcube) (*Polish*)
- 北䑓如法 (Nyoho) (*Japanese*)
+- Pukima (Pukimaa) (*German*)
+- diorama (*Italian*)
+- Daniel Dimitrov (daniel.dimitrov) (*Bulgarian*)
- frumble (*German*)
- kekkepikkuni (*Tamil*)
-- Neo_Chen (NeoChen1024) (*Chinese Traditional*)
- oorsutri (*Tamil*)
-- Rhys Harrison (rhedders) (*Esperanto*)
+- Neo_Chen (NeoChen1024) (*Chinese Traditional*)
- Nithin V (Nithin896) (*Tamil*)
+- Marcus Myge (mygg-priv) (*Norwegian*)
- Miro Rauhala (mirorauhala) (*Finnish*)
-- diorama (*Italian*)
- AlexKoala (alexkoala) (*Korean*)
+- ಚಿರಾಗ್ ನಟರಾಜ್ (chiraag-nataraj) (*Kannada*)
- Aswin C (officialcjunior) (*Malayalam*)
- Guillaume Turchini (orion78fr) (*French*)
- Ganesh D (auntgd) (*Marathi*)
+- mawoka-myblock (mawoka) (*German*)
- dragnucs2 (*Arabic*)
- Ryan Ho (koungho) (*Chinese Traditional*)
- Pedro Henrique (exploronauta) (*Portuguese, Brazilian*)
@@ -916,203 +983,245 @@ Following people have contributed to translation of Mastodon:
- Vasanthan (vasanthan) (*Tamil*)
- 硫酸鶏 (acid_chicken) (*Japanese*)
- clarmin b8 (clarminb8) (*Sorani (Kurdish)*)
+- programizer (*German*)
- manukp (*Malayalam*)
-- psymyn (*Hebrew*)
- earth dweller (sanethoughtyt) (*Marathi*)
+- psymyn (*Hebrew*)
- meijerivoi (toilet) (*Finnish*)
- essaar (*Tamil*)
- serubeena (*Swedish*)
-- Karol Kosek (krkkPL) (*Polish*)
- Rintan (*Japanese*)
-- valarivan (*Tamil*)
+- Karol Kosek (krkkPL) (*Polish*)
+- Khó͘ Tiat-lêng (khotiatleng) (*Chinese Traditional, Taigi*)
- Hernik (hernik27) (*Czech*)
-- Sebastián Andil (Selrond) (*Slovak*)
+- valarivan (*Tamil*)
+- kuchengrab (*German*)
+- friedbeans (*Croatian*)
+- Abi Turi (abi123) (*Georgian*)
- Hinaloe (hinaloe) (*Japanese*)
-- filippodb (*Italian*)
+- Sebastián Andil (Selrond) (*Slovak*)
- KEINOS (*Japanese*)
+- filippodb (*Italian*)
+- Asbjørn Olling (a2) (*Danish*)
- Balázs Meskó (meskobalazs) (*Hungarian*)
- Bottle (suryasalem2010) (*Tamil*)
-- JzshAC (*Chinese Simplified*)
- Wrya ali (John12) (*Sorani (Kurdish)*)
-- Khóo (khootiatling) (*Chinese Traditional*)
-- Steven Tappert (sammy8806) (*German*)
+- JzshAC (*Chinese Simplified*)
- Antillion (antillion99) (*Spanish*)
-- Pukima (Pukimaa) (*German*)
+- Steven Tappert (sammy8806) (*German*)
- Reg3xp (*Persian*)
-- hiphipvargas (*Portuguese*)
+- Wassim EL BOUHAMIDI (elbouhamidiw) (*Arabic*)
- gowthamanb (*Tamil*)
+- hiphipvargas (*Portuguese*)
- Ch. (sftblw) (*Korean*)
-- Jeff Huang (s8321414) (*Chinese Traditional*)
- Arttu Ylhävuori (arttu.ylhavuori) (*Finnish*)
- tctovsli (*Norwegian Nynorsk*)
- Timo Tijhof (Krinkle) (*Dutch*)
+- Mikkel B. Goldschmidt (mikkelbjoern) (*Danish*)
+- mecqor labi (mecqorlabi) (*Persian*)
+- Odyssey346 (alexader612) (*Norwegian*)
- Yamagishi Kazutoshi (ykzts) (*Japanese, Icelandic, Sorani (Kurdish)*)
+- Eban (ebanDev) (*French, Esperanto*)
- vjasiegd (*Polish*)
- SamitiMed (samiti3d) (*Thai*)
+- Nícolas Lavinicki (nclavinicki) (*Portuguese, Brazilian*)
+- snatcher (*Portuguese, Brazilian*)
- Rekan Adl (rekan-adl1) (*Sorani (Kurdish)*)
+- VSx86 (*Russian*)
- umelard (*Hebrew*)
- Antara2Cinta (Se7enTime) (*Indonesian*)
-- VSx86 (*Russian*)
-- Daniel Dimitrov (danny-dimitrov) (*Bulgarian*)
- parnikkapore (*Thai*)
-- mynameismonkey (*Welsh*)
- Sherwan Othman (sherwanothman11) (*Sorani (Kurdish)*)
- Yassine Aït-El-Mouden (yaitelmouden) (*Standard Moroccan Tamazight*)
- SKELET (*Danish*)
-- Mo_der Steven (SakuraPuare) (*Chinese Simplified*)
- Fei Yang (Fei1Yang) (*Chinese Traditional*)
-- ALEM FARID (faridatcemlulaqbayli) (*Kabyle*)
-- enipra (*Armenian*)
-- musix (*Persian*)
+- Ğani (freegnu) (*Tatar*)
- Renato "Lond" Cerqueira (renatolond) (*Portuguese, Brazilian*)
+- enipra (*Armenian*)
+- ALEM FARID (faridatcemlulaqbayli) (*Kabyle*)
+- musix (*Persian*)
- ギャラ (gyara) (*Japanese, Chinese Simplified*)
- Hougo (hougo) (*French*)
- ybardapurkar (*Marathi*)
+- 亜緯丹穂 (ayiniho) (*Japanese*)
- Adrián Lattes (haztecaso) (*Spanish*)
+- Mordi Sacks (MordiSacks) (*Hebrew*)
+- Trinsec (*Dutch*)
+- Tigran's Tips (tigrank08) (*Armenian*)
- TracyJacks (*Chinese Simplified*)
+- Szabolcs Gál (galszabolcs810624) (*Hungarian*)
+- Vladislav Săcrieriu (vladislavs14) (*Romanian*)
+- danreznik (*Hebrew*)
- rasheedgm (*Kannada*)
-- GatoOscuro (*Spanish*)
-- mecqor labi (mecqorlabi) (*Persian*)
-- Belkacem Mohammed (belkacem77) (*Kabyle*)
-- Navjot Singh (nspeaks) (*Hindi*)
- omquylzu (*Latvian*)
+- c6ristian (*German*)
+- Belkacem Mohammed (belkacem77) (*Kabyle*)
+- lexxai (*Ukrainian*)
+- Navjot Singh (nspeaks) (*Hindi*)
- Ozai (*German*)
- Sahak Petrosyan (petrosyan) (*Armenian*)
-- siamano (*Thai, Esperanto*)
+- Oymate (*Bengali*)
- Viorel-Cătălin Răpițeanu (rapiteanu) (*Romanian*)
+- siamano (*Thai, Esperanto*)
- Siddhartha Sarathi Basu (quinoa_biryani) (*Bengali*)
- Pachara Chantawong (pachara2202) (*Thai*)
-- mkljczk (*Polish*)
-- Skew (noan.perrot) (*French*)
- Zijian Zhao (jobs2512821228) (*Chinese Simplified*)
-- turtle836 (*German*)
+- Skew (noan.perrot) (*French*)
+- mkljczk (*Polish*)
- Guru Prasath Anandapadmanaban (guruprasath) (*Tamil*)
-- Lamin (laminne) (*Japanese*)
+- turtle836 (*German*)
- Marcepanek_ (thekingmarcepan) (*Polish*)
-- Feruz Oripov (FeruzOripov) (*Russian*)
+- Lamin (laminne) (*Japanese*)
- Yann Aguettaz (yann-a) (*French*)
+- Feruz Oripov (FeruzOripov) (*Russian*)
+- serapolis (*Chinese Simplified, Chinese Traditional*)
- Mick Onio (xgc.redes) (*Asturian*)
-- Tianqi Zhang (tina.zhang040609) (*Chinese Simplified*)
- Malik Mann (dermalikmann) (*German*)
- dadosch (*German*)
- r3dsp1 (*Chinese Traditional, Hong Kong*)
-- padulafacundo (*Spanish*)
- hg6 (*Hindi*)
+- Tianqi Zhang (tina.zhang040609) (*Chinese Simplified*)
+- padulafacundo (*Spanish*)
+- johannes hove-henriksen (J0hsHH) (*Norwegian*)
- Orlando Murcio (Atos20) (*Spanish, Mexico*)
+- Padraic Calpin (padraic-padraic) (*Slovenian*)
+- cenegd (*Chinese Simplified*)
- piupiupiudiu (*Chinese Simplified*)
- shdy (*German*)
-- Padraic Calpin (padraic-padraic) (*Slovenian*)
- Ильзира Рахматуллина (rahmatullinailzira53) (*Tatar*)
-- cenegd (*Chinese Simplified*)
- Hugh Liu (youloveonlymeh) (*Chinese Simplified*)
- Pixelcode (realpixelcode) (*German*)
- Yogesh K S (yogi) (*Kannada*)
+- Adithya K (adithyak04) (*Malayalam*)
+- Dennis Reimund (reimunddennis7) (*German*)
- Rakino (rakino) (*Chinese Simplified*)
-- Miquel Sabaté Solà (mssola) (*Catalan*)
+- Michał Sidor (michcioperz) (*Polish*)
- AmazighNM (*Kabyle*)
+- Miquel Sabaté Solà (mssola) (*Catalan*)
- Jothipazhani Nagarajan (jothipazhani.n) (*Tamil*)
-- Clash Clans (KURD12345) (*Sorani (Kurdish)*)
- hallomaurits (*Dutch*)
- alnd hezh (alndhezh) (*Sorani (Kurdish)*)
+- Clash Clans (KURD12345) (*Sorani (Kurdish)*)
- Solid Rhino (SolidRhino) (*Dutch*)
-- k_taka (peaceroad) (*Japanese*)
-- Hallo Abdullah (hallo_hamza12) (*Sorani (Kurdish)*)
-- hussama (*Portuguese, Brazilian*)
-- Sébastien Feugère (smonff) (*French*)
+- Metehan Özyürek (MetehanOzyurek) (*Turkish*)
- 林水溶 (shuiRong) (*Chinese Simplified*)
-- eichkat3r (*German*)
-- OminousCry (*Russian*)
-- SnDer (*Dutch*)
+- Sébastien Feugère (smonff) (*French*)
+- Y.Yamashiro (uist1idrju3i) (*Japanese*)
+- Takeshi Umeda (noellabo) (*Japanese*)
+- k_taka (peaceroad) (*Japanese*)
+- hussama (*Portuguese, Brazilian*)
+- Hallo Abdullah (hallo_hamza12) (*Sorani (Kurdish)*)
+- Ashok314 (ashok314) (*Hindi*)
- PifyZ (*French*)
+- OminousCry (*Russian*)
+- Robert Yano (throwcalmbobaway) (*Spanish, Mexico*)
- Tom_ (*Czech*)
- Tagada (Tagadda) (*French*)
- shafouz (*Portuguese, Brazilian*)
+- Yasin İsa YILDIRIM (redsfyre) (*Turkish*)
+- eichkat3r (*German*)
+- SnDer (*Dutch*)
- Kahina Mess (K_hina) (*Kabyle*)
-- Nathaël Noguès (NatNgs) (*French*)
-- Kk (kishorkumara3) (*Kannada*)
- Swati Sani (swatisani) (*Urdu (Pakistan)*)
-- Shrinivasan T (tshrinivasan) (*Tamil*)
-- さっかりんにーさん (saccharin23) (*Japanese*)
-- 夜楓Yoka (Yoka2627) (*Chinese Simplified*)
+- Kk (kishorkumara3) (*Kannada*)
- Daniel M. (daniconil) (*Catalan*)
+- Shrinivasan T (tshrinivasan) (*Tamil*)
+- 夜楓Yoka (Yoka2627) (*Chinese Simplified*)
+- Nathaël Noguès (NatNgs) (*French*)
+- さっかりんにーさん (saccharin23) (*Japanese*)
+- Rex_sa (rex07) (*Arabic*)
+- Robin van der Vliet (RobinvanderVliet) (*Esperanto*)
- Vikatakavi (*Kannada*)
-- SusVersiva (*Catalan*)
- Tradjincal (tradjincal) (*French*)
- pullopen (*Chinese Simplified*)
-- Robin van der Vliet (RobinvanderVliet) (*Esperanto*)
+- SusVersiva (*Catalan*)
+- Marvin (magicmarvman) (*German*)
- Zinkokooo (*Basque*)
-- mmokhi (*Persian*)
- Livingston Samuel (livingston) (*Tamil*)
-- prabhjot (*Hindi*)
-- sergioaraujo1 (*Portuguese, Brazilian*)
- CyberAmoeba (pseudoobscura) (*Chinese Simplified*)
- tsundoker (*Malayalam*)
+- eorn (*Breton*)
+- prabhjot (*Hindi*)
+- mmokhi (*Persian*)
+- sergioaraujo1 (*Portuguese, Brazilian*)
+- Entelekheia-ousia (*Chinese Simplified*)
+- Pierre Morvan (Iriep) (*Breton*)
+- oscfd (*Spanish*)
- skaaarrr (*German*)
-- Ricardo Colin (rysard) (*Spanish*)
- mkljczk (mykylyjczyk) (*Polish*)
-- Philipp Fischbeck (PFischbeck) (*German*)
- fedot (*Russian*)
- Paz Galindo (paz.almendra.g) (*Spanish*)
-- GaggiX (*Italian*)
-- ralozkolya (*Georgian*)
+- Ricardo Colin (rysard) (*Spanish*)
+- Philipp Fischbeck (PFischbeck) (*German*)
- Zoé Bőle (zoe1337) (*German*)
+- EzigboOmenana (*Cornish*)
+- GaggiX (*Italian*)
- Lukas Fülling (lfuelling) (*German*)
- JackXu (Merman-Jack) (*Chinese Simplified*)
-- Aymeric (AymBroussier) (*French*)
+- ralozkolya (*Georgian*)
+- Apple (blackteaovo) (*Chinese Simplified*)
+- asala4544 (*Basque*)
+- Xurxo Guerra (xguerrap) (*Galician*)
+- qwerty287 (*German*)
- Anoop (anoopp) (*Malayalam*)
- pezcurrel (*Italian*)
+- Samir Tighzert (samir_t7) (*Kabyle*)
- Dremski (*Bulgarian*)
-- Xurxo Guerra (xguerrap) (*Galician*)
+- Dennis Reimund (reimund_dennis) (*German*)
+- ru_mactunnag (*Scottish Gaelic*)
+- Nocta (*French*)
+- Aymeric (AymBroussier) (*French*)
- mashirozx (*Chinese Simplified*)
- Albatroz Jeremias (albjeremias) (*Portuguese*)
-- Samir Tighzert (samir_t7) (*Kabyle*)
-- Apple (blackteaovo) (*Chinese Simplified*)
-- Nocta (*French*)
-- OpenAlgeria (*Arabic*)
-- tamaina (*Japanese*)
-- abidin toumi (Zet24) (*Arabic*)
-- xpac1985 (xpac) (*German*)
-- Kaede (kaedech) (*Japanese*)
-- ÀŘǾŚ PÀŚĦÀÍ (arospashai) (*Sorani (Kurdish)*)
- Matias Lavik (matiaslavik) (*Norwegian Nynorsk*)
-- smedvedev (*Russian*)
-- mikel (mikelalas) (*Spanish*)
-- Doug (douglasalvespe) (*Portuguese, Brazilian*)
-- Trond Boksasp (boksasp) (*Norwegian*)
-- Fleva (*Sardinian*)
-- Mohammad Adnan Mahmood (adnanmig) (*Arabic*)
-- Sais Lakshmanan (Saislakshmanan) (*Tamil*)
- Amith Raj Shetty (amithraj1989) (*Kannada*)
+- abidin toumi (Zet24) (*Arabic*)
+- mikel (mikelalas) (*Spanish*)
+- OpenAlgeria (*Arabic*)
- random_person (*Spanish*)
-- djoerd (*Dutch*)
-- Baban Abdulrahman (baban.abdulrehman) (*Sorani (Kurdish)*)
-- ebrezhoneg (*Breton*)
-- dashty (*Sorani (Kurdish)*)
-- Salh_haji6 (*Sorani (Kurdish)*)
-- Amir Kurdo (kuraking202) (*Sorani (Kurdish)*)
-- おさ (osapon) (*Japanese*)
-- Ranj A Abdulqadir (RanjAhmed) (*Sorani (Kurdish)*)
-- umonaca (*Chinese Simplified*)
-- Bartek Fijałkowski (brateq) (*Polish*)
-- tateisu (*Japanese*)
-- centumix (*Japanese*)
-- Jari Ronkainen (ronchaine) (*Finnish*)
-- Savarín Electrográfico Marmota Intergalactica (herrero.maty) (*Spanish*)
-- Torsten Högel (torstenhoegel) (*German*)
+- Sais Lakshmanan (Saislakshmanan) (*Tamil*)
+- Trond Boksasp (boksasp) (*Norwegian*)
+- xpac1985 (xpac) (*German*)
+- Zlr- (cZeler) (*French*)
+- Mohammad Adnan Mahmood (adnanmig) (*Arabic*)
+- mimikun (*Japanese*)
+- smedvedev (*Russian*)
+- asretro (*Chinese Traditional, Hong Kong*)
+- tamaina (*Japanese*)
+- Aman Alam (aalam) (*Punjabi*)
+- ÀŘǾŚ PÀŚĦÀÍ (arospashai) (*Sorani (Kurdish)*)
+- Kaede (kaedech) (*Japanese*)
+- Doug (douglasalvespe) (*Portuguese, Brazilian*)
+- Fleva (*Sardinian*)
- Abijeet Patro (Abijeet) (*Basque*)
-- Ács Zoltán (acszoltan111) (*Hungarian*)
-- Benjamin Cobb (benjamincobb) (*German*)
-- waweic (*German*)
-- Aries (orlea) (*Japanese*)
-- silverscat_3 (SilversCat) (*Japanese*)
-- kavitha129 (*Tamil*)
-- dcapillae (*Spanish*)
- SamOak (*Portuguese, Brazilian*)
-- capiscuas (*Spanish*)
+- Aries (orlea) (*Japanese*)
+- Bartek Fijałkowski (brateq) (*Polish*)
- NeverMine17 (*Russian*)
-- Nithya Mary (nithyamary25) (*Tamil*)
-- t_aus_m (*German*)
+- Brodi (brodi1) (*Dutch*)
+- Ács Zoltán (zoli111) (*Hungarian*)
+- capiscuas (*Spanish*)
+- Benjamin Cobb (benjamincobb) (*German*)
+- djoerd (*Dutch*)
+- waweic (*German*)
+- Amir Kurdo (kuraking202) (*Sorani (Kurdish)*)
- dobrado (*Portuguese, Brazilian*)
+- Baban Abdulrahman (baban.abdulrehman) (*Sorani (Kurdish)*)
+- dcapillae (*Spanish*)
+- Azad ahmad (dashty) (*Sorani (Kurdish)*)
+- Salh_haji6 (*Sorani (Kurdish)*)
+- Ranj A Abdulqadir (RanjAhmed) (*Sorani (Kurdish)*)
+- tateisu (*Japanese*)
+- Savarín Electrográfico Marmota Intergalactica (herrero.maty) (*Spanish*)
+- ebrezhoneg (*Breton*)
+- 于晚霞 (xissshawww) (*Chinese Simplified*)
+- silverscat_3 (SilversCat) (*Japanese*)
+- centumix (*Japanese*)
+- umonaca (*Chinese Simplified*)
+- Ni Futchi (futchitwo) (*Japanese*)
+- おさ (osapon) (*Japanese*)
+- kavitha129 (*Tamil*)
- Hannah (Aniqueper1) (*Chinese Simplified*)
- Jiniux (*Italian*)
-- 于晚霞 (xissshawww) (*Chinese Simplified*)
+- Jari Ronkainen (ronchaine) (*Finnish*)
+- Nithya Mary (nithyamary25) (*Tamil*)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bc853aaa3..12d1563c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@ Changelog
All notable changes to this project will be documented in this file.
-## Unreleased
+## [3.4.0] - 2021-05-16
### Added
- **Add follow recommendations for onboarding** ([Gargron](https://github.com/tootsuite/mastodon/pull/15945), [Gargron](https://github.com/tootsuite/mastodon/pull/16161), [Gargron](https://github.com/tootsuite/mastodon/pull/16060), [Gargron](https://github.com/tootsuite/mastodon/pull/16077), [Gargron](https://github.com/tootsuite/mastodon/pull/16078), [Gargron](https://github.com/tootsuite/mastodon/pull/16160), [Gargron](https://github.com/tootsuite/mastodon/pull/16079), [noellabo](https://github.com/tootsuite/mastodon/pull/16044), [noellabo](https://github.com/tootsuite/mastodon/pull/16045), [Gargron](https://github.com/tootsuite/mastodon/pull/16152), [Gargron](https://github.com/tootsuite/mastodon/pull/16153), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16082), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16173), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16159), [ClearlyClaire](https://github.com/tootsuite/mastodon/pull/16189))
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 31f0a1319..0d563559b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -24,9 +24,17 @@ You can submit translations via [Crowdin](https://crowdin.com/project/mastodon).
## 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.
+**Please use clean, concise titles for your pull requests.** Unless the pull request is about refactoring code, updating dependencies or other internal tasks, assume that the person reading the pull request title is not a programmer or Mastodon developer, but instead a Mastodon user or server administrator, and **try to describe your change or fix from their perspective**. We use commit squashing, so the final commit in the main branch will carry the title of the pull request, and commits from the main branch are fed into the changelog. The changelog is separated into [keepachangelog.com categories](https://keepachangelog.com/en/1.0.0/), and while that spec does not prescribe how the entries ought to be named, for easier sorting, start your pull request titles using one of the verbs "Add", "Change", "Deprecate", "Remove", or "Fix" (present tense).
-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.
+Example:
+
+|Not ideal|Better|
+|---|----|
+|Fixed NoMethodError in RemovalWorker|Fix nil error when removing statuses caused by race condition|
+
+It is not always possible to phrase every change in such a manner, but it is desired.
+
+**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:
diff --git a/Gemfile.lock b/Gemfile.lock
index 45cfc27d8..8a63e1d65 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -364,7 +364,7 @@ GEM
net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.1.0)
nio4r (2.5.7)
- nokogiri (1.11.3)
+ nokogiri (1.11.4)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
nokogumbo (2.0.4)
@@ -428,7 +428,7 @@ GEM
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (4.0.6)
- puma (5.3.0)
+ puma (5.3.1)
nio4r (~> 2.0)
pundit (2.1.0)
activesupport (>= 3.0.0)
diff --git a/README.md b/README.md
index 94d0d2b71..3e0c4e97e 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@ Mastodon acts as an OAuth2 provider so 3rd party apps can use the REST and Strea
- **PostgreSQL** 9.5+
- **Redis** 4+
- **Ruby** 2.5+
-- **Node.js** 10.13+
+- **Node.js** 12+
The repository includes deployment configurations for **Docker and docker-compose**, but also a few specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**stand-alone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
diff --git a/SECURITY.md b/SECURITY.md
index 7625597fe..9d351fce6 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -4,8 +4,9 @@
| Version | Supported |
| ------- | ------------------ |
-| 3.1.x | :white_check_mark: |
-| < 3.1 | :x: |
+| 3.4.x | :white_check_mark: |
+| 3.3.x | :white_check_mark: |
+| < 3.3 | :x: |
## Reporting a Vulnerability
diff --git a/Vagrantfile b/Vagrantfile
index bfe2c374f..4d0cc0f76 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -12,7 +12,7 @@ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
# Add repo for NodeJS
-curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -
+curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
# Add firewall rule to redirect 80 to PORT and save
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb
index 92ccb8061..f301666db 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -7,8 +7,9 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
after_action :insert_pagination_headers, unless: -> { truthy_param?(:pinned) }
def index
- @statuses = load_statuses
- render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
+ @statuses = load_statuses
+ accountIds = @statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
+ render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id), account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id)
end
private
diff --git a/app/controllers/api/v1/bookmarks_controller.rb b/app/controllers/api/v1/bookmarks_controller.rb
index aa3fb88f0..f666a1d8d 100644
--- a/app/controllers/api/v1/bookmarks_controller.rb
+++ b/app/controllers/api/v1/bookmarks_controller.rb
@@ -6,8 +6,9 @@ class Api::V1::BookmarksController < Api::BaseController
after_action :insert_pagination_headers
def index
- @statuses = load_statuses
- render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
+ @statuses = load_statuses
+ accountIds = @statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
+ render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id), account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id)
end
private
diff --git a/app/controllers/api/v1/favourites_controller.rb b/app/controllers/api/v1/favourites_controller.rb
index 21836bc17..651a057d5 100644
--- a/app/controllers/api/v1/favourites_controller.rb
+++ b/app/controllers/api/v1/favourites_controller.rb
@@ -6,8 +6,9 @@ class Api::V1::FavouritesController < Api::BaseController
after_action :insert_pagination_headers
def index
- @statuses = load_statuses
- render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
+ @statuses = load_statuses
+ accountIds = @statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
+ render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id), account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id)
end
private
diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 106fc8224..d8f4db42f 100644
--- a/app/controllers/api/v1/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -30,8 +30,9 @@ class Api::V1::StatusesController < Api::BaseController
@context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
statuses = [@status] + @context.ancestors + @context.descendants
+ accountIds = statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
- render json: @context, serializer: REST::ContextSerializer, relationships: StatusRelationshipsPresenter.new(statuses, current_user&.account_id)
+ render json: @context, serializer: REST::ContextSerializer, relationships: StatusRelationshipsPresenter.new(statuses, current_user&.account_id), account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id)
end
def create
@@ -46,7 +47,8 @@ class Api::V1::StatusesController < Api::BaseController
application: doorkeeper_token.application,
poll: status_params[:poll],
idempotency: request.headers['Idempotency-Key'],
- with_rate_limit: true)
+ with_rate_limit: true,
+ quote_id: status_params[:quote_id].presence)
render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
end
@@ -85,6 +87,7 @@ class Api::V1::StatusesController < Api::BaseController
:spoiler_text,
:visibility,
:scheduled_at,
+ :quote_id,
media_ids: [],
poll: [
:multiple,
diff --git a/app/controllers/api/v1/timelines/home_controller.rb b/app/controllers/api/v1/timelines/home_controller.rb
index ae6dbcb8b..c07e1a820 100644
--- a/app/controllers/api/v1/timelines/home_controller.rb
+++ b/app/controllers/api/v1/timelines/home_controller.rb
@@ -6,11 +6,13 @@ class Api::V1::Timelines::HomeController < Api::BaseController
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
def show
- @statuses = load_statuses
+ @statuses = load_statuses
+ accountIds = @statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
render json: @statuses,
each_serializer: REST::StatusSerializer,
relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id),
+ account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id),
status: account_home_feed.regenerating? ? 206 : 200
end
diff --git a/app/controllers/api/v1/timelines/list_controller.rb b/app/controllers/api/v1/timelines/list_controller.rb
index a15eae468..bc13ed5ec 100644
--- a/app/controllers/api/v1/timelines/list_controller.rb
+++ b/app/controllers/api/v1/timelines/list_controller.rb
@@ -9,9 +9,12 @@ class Api::V1::Timelines::ListController < Api::BaseController
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
def show
+ accountIds = @statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
+
render json: @statuses,
each_serializer: REST::StatusSerializer,
- relationships: StatusRelationshipsPresenter.new(@statuses, current_user.account_id)
+ relationships: StatusRelationshipsPresenter.new(@statuses, current_user.account_id),
+ account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id)
end
private
diff --git a/app/controllers/api/v1/timelines/public_controller.rb b/app/controllers/api/v1/timelines/public_controller.rb
index d253b744f..1a778012b 100644
--- a/app/controllers/api/v1/timelines/public_controller.rb
+++ b/app/controllers/api/v1/timelines/public_controller.rb
@@ -5,8 +5,10 @@ class Api::V1::Timelines::PublicController < Api::BaseController
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
def show
- @statuses = load_statuses
- render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
+ @statuses = load_statuses
+ accountIds = @statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
+
+ render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id), account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id)
end
private
diff --git a/app/controllers/api/v1/timelines/tag_controller.rb b/app/controllers/api/v1/timelines/tag_controller.rb
index 64a1db58d..c7afd4580 100644
--- a/app/controllers/api/v1/timelines/tag_controller.rb
+++ b/app/controllers/api/v1/timelines/tag_controller.rb
@@ -5,8 +5,9 @@ class Api::V1::Timelines::TagController < Api::BaseController
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
def show
- @statuses = load_statuses
- render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
+ @statuses = load_statuses
+ accountIds = @statuses.filter(&:quote?).map { |status| status.quote.account_id }.uniq
+ render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id), account_relationships: AccountRelationshipsPresenter.new(accountIds, current_user&.account_id)
end
private
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index b60901040..0ebfab75d 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -18,6 +18,7 @@ module SettingsHelper
en: 'English',
eo: 'Esperanto',
'es-AR': 'Español (Argentina)',
+ 'es-MX': 'Español (México)',
es: 'Español',
et: 'Eesti',
eu: 'Euskara',
diff --git a/app/javascript/mastodon/actions/bookmarks.js b/app/javascript/mastodon/actions/bookmarks.js
index 544ed2ff2..b3e0a2ab4 100644
--- a/app/javascript/mastodon/actions/bookmarks.js
+++ b/app/javascript/mastodon/actions/bookmarks.js
@@ -1,5 +1,7 @@
+import { fetchRelationships } from './accounts';
import api, { getLinks } from '../api';
import { importFetchedStatuses } from './importer';
+import { uniq } from '../utils/uniq';
export const BOOKMARKED_STATUSES_FETCH_REQUEST = 'BOOKMARKED_STATUSES_FETCH_REQUEST';
export const BOOKMARKED_STATUSES_FETCH_SUCCESS = 'BOOKMARKED_STATUSES_FETCH_SUCCESS';
@@ -20,6 +22,7 @@ export function fetchBookmarkedStatuses() {
api(getState).get('/api/v1/bookmarks').then(response => {
const next = getLinks(response).refs.find(link => link.rel === 'next');
dispatch(importFetchedStatuses(response.data));
+ dispatch(fetchRelationships(uniq(response.data.map(item => item.reblog ? item.reblog.account.id : item.account.id))));
dispatch(fetchBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
}).catch(error => {
dispatch(fetchBookmarkedStatusesFail(error));
@@ -61,6 +64,7 @@ export function expandBookmarkedStatuses() {
api(getState).get(url).then(response => {
const next = getLinks(response).refs.find(link => link.rel === 'next');
dispatch(importFetchedStatuses(response.data));
+ dispatch(fetchRelationships(uniq(response.data.map(item => item.reblog ? item.reblog.account.id : item.account.id))));
dispatch(expandBookmarkedStatusesSuccess(response.data, next ? next.uri : null));
}).catch(error => {
dispatch(expandBookmarkedStatusesFail(error));
diff --git a/app/javascript/mastodon/actions/boosts.js b/app/javascript/mastodon/actions/boosts.js
index 6e14065d6..c0f0f3acc 100644
--- a/app/javascript/mastodon/actions/boosts.js
+++ b/app/javascript/mastodon/actions/boosts.js
@@ -11,7 +11,7 @@ export function initBoostModal(props) {
dispatch({
type: BOOSTS_INIT_MODAL,
- privacy
+ privacy,
});
dispatch(openModal('BOOST', props));
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 891403969..fb4d26cf2 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -20,6 +20,8 @@ export const COMPOSE_SUBMIT_FAIL = 'COMPOSE_SUBMIT_FAIL';
export const COMPOSE_REPLY = 'COMPOSE_REPLY';
export const COMPOSE_REPLY_CANCEL = 'COMPOSE_REPLY_CANCEL';
export const COMPOSE_DIRECT = 'COMPOSE_DIRECT';
+export const COMPOSE_QUOTE = 'COMPOSE_QUOTE';
+export const COMPOSE_QUOTE_CANCEL = 'COMPOSE_QUOTE_CANCEL';
export const COMPOSE_MENTION = 'COMPOSE_MENTION';
export const COMPOSE_RESET = 'COMPOSE_RESET';
export const COMPOSE_UPLOAD_REQUEST = 'COMPOSE_UPLOAD_REQUEST';
@@ -100,6 +102,23 @@ export function cancelReplyCompose() {
};
};
+export function quoteCompose(status, routerHistory) {
+ return (dispatch, getState) => {
+ dispatch({
+ type: COMPOSE_QUOTE,
+ status: status,
+ });
+
+ ensureComposeIsVisible(getState, routerHistory);
+ };
+};
+
+export function cancelQuoteCompose() {
+ return {
+ type: COMPOSE_QUOTE_CANCEL,
+ };
+};
+
export function resetCompose() {
return {
type: COMPOSE_RESET,
@@ -147,6 +166,7 @@ export function submitCompose(routerHistory) {
spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
visibility: getState().getIn(['compose', 'privacy']),
poll: getState().getIn(['compose', 'poll'], null),
+ quote_id: getState().getIn(['compose', 'quote_from'], null),
}, {
headers: {
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
diff --git a/app/javascript/mastodon/actions/favourites.js b/app/javascript/mastodon/actions/favourites.js
index 9448b1efe..9b28ac4c4 100644
--- a/app/javascript/mastodon/actions/favourites.js
+++ b/app/javascript/mastodon/actions/favourites.js
@@ -1,5 +1,7 @@
+import { fetchRelationships } from './accounts';
import api, { getLinks } from '../api';
import { importFetchedStatuses } from './importer';
+import { uniq } from '../utils/uniq';
export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST';
export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS';
@@ -20,6 +22,7 @@ export function fetchFavouritedStatuses() {
api(getState).get('/api/v1/favourites').then(response => {
const next = getLinks(response).refs.find(link => link.rel === 'next');
dispatch(importFetchedStatuses(response.data));
+ dispatch(fetchRelationships(uniq(response.data.map(item => item.reblog ? item.reblog.account.id : item.account.id))));
dispatch(fetchFavouritedStatusesSuccess(response.data, next ? next.uri : null));
}).catch(error => {
dispatch(fetchFavouritedStatusesFail(error));
@@ -64,6 +67,7 @@ export function expandFavouritedStatuses() {
api(getState).get(url).then(response => {
const next = getLinks(response).refs.find(link => link.rel === 'next');
dispatch(importFetchedStatuses(response.data));
+ dispatch(fetchRelationships(uniq(response.data.map(item => item.reblog ? item.reblog.account.id : item.account.id))));
dispatch(expandFavouritedStatusesSuccess(response.data, next ? next.uri : null));
}).catch(error => {
dispatch(expandFavouritedStatusesFail(error));
diff --git a/app/javascript/mastodon/actions/importer/index.js b/app/javascript/mastodon/actions/importer/index.js
index f4372fb31..35032fc70 100644
--- a/app/javascript/mastodon/actions/importer/index.js
+++ b/app/javascript/mastodon/actions/importer/index.js
@@ -70,6 +70,10 @@ export function importFetchedStatuses(statuses) {
processStatus(status.reblog);
}
+ if (status.quote && status.quote.id) {
+ processStatus(status.quote);
+ }
+
if (status.poll && status.poll.id) {
pushUnique(polls, normalizePoll(status.poll));
}
diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js
index abd5681d4..1b9d781a7 100644
--- a/app/javascript/mastodon/actions/importer/normalizer.js
+++ b/app/javascript/mastodon/actions/importer/normalizer.js
@@ -60,7 +60,10 @@ export function normalizeStatus(status, normalOldStatus) {
normalStatus.search_index = normalOldStatus.get('search_index');
normalStatus.contentHtml = normalOldStatus.get('contentHtml');
normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml');
+ normalStatus.spoiler_text = normalOldStatus.get('spoiler_text');
normalStatus.hidden = normalOldStatus.get('hidden');
+ normalStatus.quote = normalOldStatus.get('quote');
+ normalStatus.quote_hidden = normalOldStatus.get('quote_hidden');
} else {
// If the status has a CW but no contents, treat the CW as if it were the
// status' contents, to avoid having a CW toggle with seemingly no effect.
@@ -77,6 +80,29 @@ export function normalizeStatus(status, normalOldStatus) {
normalStatus.contentHtml = emojify(normalStatus.content, emojiMap);
normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(spoilerText), emojiMap);
normalStatus.hidden = expandSpoilers ? false : spoilerText.length > 0 || normalStatus.sensitive;
+
+ if (status.quote && status.quote.id) {
+ const quote_spoilerText = status.quote.spoiler_text || '';
+ const quote_searchContent = [quote_spoilerText, status.quote.content].join('\n\n').replace(/
/g, '\n').replace(/<\/p>
/g, '\n\n'); + + const quote_emojiMap = makeEmojiMap(normalStatus.quote); + + const quote_account_emojiMap = makeEmojiMap(status.quote.account); + const displayName = normalStatus.quote.account.display_name.length === 0 ? normalStatus.quote.account.username : normalStatus.quote.account.display_name; + normalStatus.quote.account.display_name_html = emojify(escapeTextContentForBrowser(displayName), quote_account_emojiMap); + normalStatus.quote.search_index = domParser.parseFromString(quote_searchContent, 'text/html').documentElement.textContent; + let docElem = domParser.parseFromString(normalStatus.quote.content, 'text/html').documentElement; + Array.from(docElem.querySelectorAll('p,br'), line => { + let parentNode = line.parentNode; + if (line.nextSibling) { + parentNode.insertBefore(document.createTextNode(' '), line.nextSibling); + } + }); + let _contentHtml = docElem.textContent; + normalStatus.quote.contentHtml = '
'+emojify(_contentHtml.substr(0, 150), quote_emojiMap) + (_contentHtml.substr(150) ? '...' : '')+'
'; + normalStatus.quote.spoilerHtml = emojify(escapeTextContentForBrowser(quote_spoilerText), quote_emojiMap); + normalStatus.quote_hidden = expandSpoilers ? false : quote_spoilerText.length > 0 || normalStatus.quote.sensitive; + } } return normalStatus; diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 3464ac995..22f1e0cbb 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -46,7 +46,7 @@ defineMessages({ }); const fetchRelatedRelationships = (dispatch, notifications) => { - const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id); + const accountIds = notifications.map(item => item.account.id); if (accountIds.length > 0) { dispatch(fetchRelationships(accountIds)); diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js index 3fc7c0702..0c520a796 100644 --- a/app/javascript/mastodon/actions/statuses.js +++ b/app/javascript/mastodon/actions/statuses.js @@ -30,6 +30,9 @@ export const STATUS_COLLAPSE = 'STATUS_COLLAPSE'; export const REDRAFT = 'REDRAFT'; +export const QUOTE_REVEAL = 'QUOTE_REVEAL'; +export const QUOTE_HIDE = 'QUOTE_HIDE'; + export function fetchStatusRequest(id, skipLoading) { return { type: STATUS_FETCH_REQUEST, @@ -272,3 +275,25 @@ export function toggleStatusCollapse(id, isCollapsed) { isCollapsed, }; } + +export function hideQuote(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + + return { + type: QUOTE_HIDE, + ids, + }; +}; + +export function revealQuote(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + + return { + type: QUOTE_REVEAL, + ids, + }; +}; diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index 31ae09e4a..d82bf1d0d 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -1,9 +1,11 @@ +import { fetchRelationships } from './accounts'; import { importFetchedStatus, importFetchedStatuses } from './importer'; import { submitMarkers } from './markers'; import api, { getLinks } from 'mastodon/api'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import compareId from 'mastodon/compare_id'; import { usePendingItems as preferPendingItems } from 'mastodon/initial_state'; +import { uniq } from '../utils/uniq'; export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; export const TIMELINE_DELETE = 'TIMELINE_DELETE'; @@ -39,6 +41,7 @@ export function updateTimeline(timeline, status, accept) { } dispatch(importFetchedStatus(status)); + dispatch(fetchRelationships([status.reblog ? status.reblog.account.id : status.account.id, status.quote ? status.quote.account.id : null].filter(function(e){return e}))); dispatch({ type: TIMELINE_UPDATE, @@ -111,6 +114,7 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { api(getState).get(path, { params }).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); + dispatch(fetchRelationships(uniq(response.data.map(item => item.reblog ? item.reblog.account.id : item.account.id).concat(response.data.map(item => item.quote ? item.quote.account.id : null)).filter(function(e){return e})))); dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.status === 206, isLoadingRecent, isLoadingMore, isLoadingRecent && preferPendingItems)); if (timelineId === 'home') { diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index 2e7ce2e60..5c303a1a0 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -236,10 +236,12 @@ class MediaGallery extends React.PureComponent { visible: PropTypes.bool, autoplay: PropTypes.bool, onToggleVisibility: PropTypes.func, + quote: PropTypes.bool, }; static defaultProps = { standalone: false, + quote: false, }; state = { @@ -310,7 +312,7 @@ class MediaGallery extends React.PureComponent { } render () { - const { media, intl, sensitive, height, defaultWidth, standalone, autoplay } = this.props; + const { media, intl, sensitive, height, defaultWidth, standalone, autoplay, quote } = this.props; const { visible } = this.state; const width = this.state.width || defaultWidth; @@ -332,6 +334,10 @@ class MediaGallery extends React.PureComponent { const size = media.take(4).size; const uncached = media.every(attachment => attachment.get('type') === 'unknown'); + if (quote && style.height) { + style.height /= 2; + } + if (standalone && this.isFullSizeEligible()) { children =(.+)<\/p>$/, '\1')
+ html = Sanitize.clean(html).delete("\n").truncate(150)
+ html = encode_custom_emojis(html, status.emojis) if options[:custom_emojify]
+ html.html_safe
+ end
+
def reformat(html)
sanitize(html, Sanitize::Config::MASTODON_STRICT)
rescue ArgumentError
@@ -206,6 +218,12 @@ class Formatter
end
# rubocop:enable Metrics/BlockNesting
+ def quotify(html, status)
+ url = ActivityPub::TagManager.instance.url_for(status.quote)
+ link = encode_and_link_urls(url)
+ html.sub(/(<[^>]+>)\z/, "
QT: #{link}\\1")
+ end
+
def rewrite(text, entities)
text = text.to_s
diff --git a/app/models/concerns/account_avatar.rb b/app/models/concerns/account_avatar.rb
index 2d5ebfca3..1af53ed23 100644
--- a/app/models/concerns/account_avatar.rb
+++ b/app/models/concerns/account_avatar.rb
@@ -21,7 +21,7 @@ module AccountAvatar
has_attached_file :avatar, styles: ->(f) { avatar_styles(f) }, convert_options: { all: '-strip' }, processors: [:lazy_thumbnail]
validates_attachment_content_type :avatar, content_type: IMAGE_MIME_TYPES
validates_attachment_size :avatar, less_than: LIMIT
- remotable_attachment :avatar, LIMIT
+ remotable_attachment :avatar, LIMIT, suppress_errors: false
end
def avatar_original_url
diff --git a/app/models/concerns/account_header.rb b/app/models/concerns/account_header.rb
index 067e166eb..72a3d0566 100644
--- a/app/models/concerns/account_header.rb
+++ b/app/models/concerns/account_header.rb
@@ -22,7 +22,7 @@ module AccountHeader
has_attached_file :header, styles: ->(f) { header_styles(f) }, convert_options: { all: '-strip' }, processors: [:lazy_thumbnail]
validates_attachment_content_type :header, content_type: IMAGE_MIME_TYPES
validates_attachment_size :header, less_than: LIMIT
- remotable_attachment :header, LIMIT
+ remotable_attachment :header, LIMIT, suppress_errors: false
end
def header_original_url
diff --git a/app/models/concerns/account_merging.rb b/app/models/concerns/account_merging.rb
index c3b7018f2..8d37c6e56 100644
--- a/app/models/concerns/account_merging.rb
+++ b/app/models/concerns/account_merging.rb
@@ -15,7 +15,7 @@ module AccountMerging
Status, StatusPin, MediaAttachment, Poll, Report, Tombstone, Favourite,
Follow, FollowRequest, Block, Mute, AccountIdentityProof,
AccountModerationNote, AccountPin, AccountStat, ListAccount,
- PollVote, Mention, AccountDeletionRequest, AccountNote
+ PollVote, Mention, AccountDeletionRequest, AccountNote, FollowRecommendationSuppression
]
owned_classes.each do |klass|
@@ -43,6 +43,10 @@ module AccountMerging
end
end
+ CanonicalEmailBlock.where(reference_account_id: other_account.id).find_each do |record|
+ record.update_attribute(:reference_account_id, id)
+ end
+
# Some follow relationships have moved, so the cache is stale
Rails.cache.delete_matched("followers_hash:#{id}:*")
Rails.cache.delete_matched("relationships:#{id}:*")
diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb
index 56b9c0164..ffe8a7565 100644
--- a/app/models/concerns/remotable.rb
+++ b/app/models/concerns/remotable.rb
@@ -28,9 +28,11 @@ module Remotable
end
rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError => e
Rails.logger.debug "Error fetching remote #{attachment_name}: #{e}"
+ public_send("#{attachment_name}=", nil) if public_send("#{attachment_name}_file_name").present?
raise e unless suppress_errors
rescue Paperclip::Errors::NotIdentifiedByImageMagickError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Paperclip::Error, Mastodon::DimensionsValidationError, Mastodon::StreamValidationError => e
Rails.logger.debug "Error fetching remote #{attachment_name}: #{e}"
+ public_send("#{attachment_name}=", nil) if public_send("#{attachment_name}_file_name").present?
end
nil
diff --git a/app/models/status.rb b/app/models/status.rb
index 847921ac2..6e088570d 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -23,6 +23,7 @@
# in_reply_to_account_id :bigint(8)
# poll_id :bigint(8)
# deleted_at :datetime
+# quote_id :bigint(8)
#
class Status < ApplicationRecord
@@ -55,6 +56,7 @@ class Status < ApplicationRecord
belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true
belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true
+ belongs_to :quote, foreign_key: 'quote_id', class_name: 'Status', inverse_of: :quoted, optional: true
has_many :favourites, inverse_of: :status, dependent: :destroy
has_many :bookmarks, inverse_of: :status, dependent: :destroy
@@ -63,6 +65,7 @@ class Status < ApplicationRecord
has_many :mentions, dependent: :destroy, inverse_of: :status
has_many :active_mentions, -> { active }, class_name: 'Mention', inverse_of: :status
has_many :media_attachments, dependent: :nullify
+ has_many :quoted, foreign_key: 'quote_id', class_name: 'Status', inverse_of: :quote, dependent: :nullify
has_and_belongs_to_many :tags
has_and_belongs_to_many :preview_cards
@@ -77,6 +80,7 @@ class Status < ApplicationRecord
validates_with DisallowedHashtagsValidator
validates :reblog, uniqueness: { scope: :account }, if: :reblog?
validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
+ validates :quote_visibility, inclusion: { in: %w(public unlisted) }, if: :quote?
accepts_nested_attributes_for :poll
@@ -169,6 +173,14 @@ class Status < ApplicationRecord
!reblog_of_id.nil?
end
+ def quote?
+ !quote_id.nil? && quote
+ end
+
+ def quote_visibility
+ quote&.visibility
+ end
+
def within_realtime_window?
created_at >= REAL_TIME_WINDOW.ago
end
@@ -229,7 +241,7 @@ class Status < ApplicationRecord
fields = [spoiler_text, text]
fields += preloadable_poll.options unless preloadable_poll.nil?
- @emojis = CustomEmoji.from_text(fields.join(' '), account.domain)
+ @emojis = CustomEmoji.from_text(fields.join(' '), account.domain) + (quote? ? CustomEmoji.from_text([quote.spoiler_text, quote.text].join(' '), quote.account.domain) : [])
end
def replies_count
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index d92aae7b3..a7d948976 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -177,7 +177,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end
def href
- explore_hashtag_url(object)
+ tag_url(object)
end
def name
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index 6f9e1ca63..a9e15e6f8 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -9,6 +9,9 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
:atom_uri, :in_reply_to_atom_uri,
:conversation
+ attribute :quote_url, if: -> { object.quote? }
+ attribute :misskey_quote, key: :_misskey_quote, if: -> { object.quote? }
+ attribute :misskey_content, key: :_misskey_content, if: -> { object.quote? }
attribute :content
attribute :content_map, if: :language?
@@ -125,6 +128,16 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
end
end
+ def quote_url
+ ActivityPub::TagManager.instance.uri_for(object.quote) if object.quote?
+ end
+
+ alias misskey_quote quote_url
+
+ def misskey_content
+ object.text if object.quote?
+ end
+
def local?
object.account.local?
end
@@ -170,6 +183,8 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
attributes :type, :media_type, :url, :name, :blurhash
attribute :focal_point, if: :focal_point?
+ attribute :width, if: :width?
+ attribute :height, if: :height?
has_one :icon, serializer: ActivityPub::ImageSerializer, if: :thumbnail?
@@ -204,6 +219,22 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
def thumbnail?
object.thumbnail.present?
end
+
+ def width?
+ object.file.meta&.dig('original', 'width').present?
+ end
+
+ def height?
+ object.file.meta&.dig('original', 'height').present?
+ end
+
+ def width
+ object.file.meta.dig('original', 'width')
+ end
+
+ def height
+ object.file.meta.dig('original', 'height')
+ end
end
class MentionSerializer < ActivityPub::Serializer
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index d39092b56..6683ac48f 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -5,7 +5,8 @@ class REST::InstanceSerializer < ActiveModel::Serializer
attributes :uri, :title, :short_description, :description, :email,
:version, :urls, :stats, :thumbnail,
- :languages, :registrations, :approval_required, :invites_enabled
+ :languages, :registrations, :approval_required, :invites_enabled,
+ :feature_quote
has_one :contact_account, serializer: REST::AccountSerializer
@@ -69,6 +70,10 @@ class REST::InstanceSerializer < ActiveModel::Serializer
Setting.min_invite_role == 'user'
end
+ def feature_quote
+ true
+ end
+
private
def instance_presenter
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index bb6df90b7..f49b365bf 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -15,6 +15,8 @@ class REST::StatusSerializer < ActiveModel::Serializer
attribute :content, unless: :source_requested?
attribute :text, if: :source_requested?
+ attribute :quote_id, if: -> { object.quote? }
+
belongs_to :reblog, serializer: REST::StatusSerializer
belongs_to :application, if: :show_application?
belongs_to :account, serializer: REST::AccountSerializer
@@ -39,6 +41,10 @@ class REST::StatusSerializer < ActiveModel::Serializer
object.in_reply_to_account_id&.to_s
end
+ def quote_id
+ object.quote_id.to_s
+ end
+
def current_user?
!current_user.nil?
end
@@ -167,3 +173,23 @@ class REST::StatusSerializer < ActiveModel::Serializer
end
end
end
+
+class REST::NestedQuoteSerializer < REST::StatusSerializer
+ attribute :quote do
+ nil
+ end
+ attribute :quote_muted, if: :current_user?
+
+ def quote_muted
+ if instance_options && instance_options[:account_relationships]
+ instance_options[:account_relationships].muting[object.account_id] ? true : false || instance_options[:account_relationships].blocking[object.account_id] || instance_options[:account_relationships].blocked_by[object.account_id] || instance_options[:account_relationships].domain_blocking[object.account_id] || false
+ else
+ current_user.account.muting?(object.account) || object.account.blocking?(current_user.account) || current_user.account.blocking?(object.account) || current_user.account.domain_blocking?(object.account.domain)
+ end
+ end
+
+end
+
+class REST::StatusSerializer < ActiveModel::Serializer
+ belongs_to :quote, serializer: REST::NestedQuoteSerializer
+end
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index bb2e8f665..4ab6912e5 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -106,8 +106,16 @@ class ActivityPub::ProcessAccountService < BaseService
end
def set_fetchable_attributes!
- @account.avatar_remote_url = image_url('icon') || '' unless skip_download?
- @account.header_remote_url = image_url('image') || '' unless skip_download?
+ begin
+ @account.avatar_remote_url = image_url('icon') || '' unless skip_download?
+ rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError
+ RedownloadAvatarWorker.perform_in(rand(30..600).seconds, @account.id)
+ end
+ begin
+ @account.header_remote_url = image_url('image') || '' unless skip_download?
+ rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError
+ RedownloadHeaderWorker.perform_in(rand(30..600).seconds, @account.id)
+ end
@account.statuses_count = outbox_total_items if outbox_total_items.present?
@account.following_count = following_total_items if following_total_items.present?
@account.followers_count = followers_total_items if followers_total_items.present?
@@ -282,7 +290,7 @@ class ActivityPub::ProcessAccountService < BaseService
end
def lock_options
- { redis: Redis.current, key: "process_account:#{@uri}" }
+ { redis: Redis.current, key: "process_account:#{@uri}", autorelease: 15.minutes.seconds }
end
def process_tags
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index fa1636e41..0e41240af 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -67,7 +67,7 @@ class FetchLinkCardService < BaseService
urls = @status.text.scan(URL_PATTERN).map { |array| Addressable::URI.parse(array[1]).normalize }
else
html = Nokogiri::HTML(@status.text)
- links = html.css('a')
+ links = html.css(':not(.quote-inline) > a')
urls = links.filter_map { |a| Addressable::URI.parse(a['href']) unless skip_link?(a) }.filter_map(&:normalize)
end
@@ -175,6 +175,6 @@ class FetchLinkCardService < BaseService
end
def lock_options
- { redis: Redis.current, key: "fetch:#{@url}" }
+ { redis: Redis.current, key: "fetch:#{@url}", autorelease: 15.minutes.seconds }
end
end
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 0a383d6a3..f594b02a2 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -26,11 +26,13 @@ class PostStatusService < BaseService
@options = options
@text = @options[:text] || ''
@in_reply_to = @options[:thread]
+ @quote_id = @options[:quote_id]
return idempotency_duplicate if idempotency_given? && idempotency_duplicate?
validate_media!
preprocess_attributes!
+ preprocess_quote!
if scheduled?
schedule_status!
@@ -47,6 +49,19 @@ class PostStatusService < BaseService
private
+ def status_from_uri(uri)
+ ActivityPub::TagManager.instance.uri_to_resource(uri, Status)
+ end
+
+ def quote_from_url(url)
+ return nil if url.nil?
+
+ quote = ResolveURLService.new.call(url)
+ status_from_uri(quote.uri) if quote
+ rescue
+ nil
+ end
+
def preprocess_attributes!
@sensitive = (@options[:sensitive].nil? ? @account.user&.setting_default_sensitive : @options[:sensitive]) || @options[:spoiler_text].present?
@text = @options.delete(:spoiler_text) if @text.blank? && @options[:spoiler_text].present?
@@ -54,10 +69,21 @@ class PostStatusService < BaseService
@visibility = :unlisted if @visibility&.to_sym == :public && @account.silenced?
@scheduled_at = @options[:scheduled_at]&.to_datetime
@scheduled_at = nil if scheduled_in_the_past?
+ if @quote_id.nil? && md = @text.match(/QT:\s*\[\s*(https:\/\/.+?)\s*\]/)
+ @quote_id = quote_from_url(md[1])&.id
+ @text.sub!(/QT:\s*\[.*?\]/, '')
+ end
rescue ArgumentError
raise ActiveRecord::RecordInvalid
end
+ def preprocess_quote!
+ if @quote_id.present?
+ quote = Status.find(@quote_id)
+ @quote_id = quote.reblog_of_id.to_s if quote.reblog?
+ end
+ end
+
def process_status!
# The following transaction block is needed to wrap the UPDATEs to
# the media attachments when the status is created
@@ -164,6 +190,7 @@ class PostStatusService < BaseService
language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account),
application: @options[:application],
rate_limit: @options[:with_rate_limit],
+ quote_id: @quote_id,
}.compact
end
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index 6e4d6e72a..b680c8e96 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -141,6 +141,6 @@ class RemoveStatusService < BaseService
end
def lock_options
- { redis: Redis.current, key: "distribute:#{@status.id}" }
+ { redis: Redis.current, key: "distribute:#{@status.id}", autorelease: 5.minutes.seconds }
end
end
diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb
index 493995447..5400612bf 100644
--- a/app/services/resolve_account_service.rb
+++ b/app/services/resolve_account_service.rb
@@ -146,6 +146,6 @@ class ResolveAccountService < BaseService
end
def lock_options
- { redis: Redis.current, key: "resolve:#{@username}@#{@domain}" }
+ { redis: Redis.current, key: "resolve:#{@username}@#{@domain}", autorelease: 15.minutes.seconds }
end
end
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index daf164949..25231d440 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -25,6 +25,9 @@
- if status.preloadable_poll
= render_poll_component(status)
+ - if status.quote?
+ = render partial: "quote_status", locals: {status: status.quote}
+
- if !status.media_attachments.empty?
- if status.media_attachments.first.video?
= render_video_component(status, width: 670, height: 380, detailed: true)
diff --git a/app/views/statuses/_quote_status.html.haml b/app/views/statuses/_quote_status.html.haml
new file mode 100644
index 000000000..fa0b7b1b1
--- /dev/null
+++ b/app/views/statuses/_quote_status.html.haml
@@ -0,0 +1,35 @@
+.status.quote-status{ dataurl: ActivityPub::TagManager.instance.url_for(status) }
+ = link_to ActivityPub::TagManager.instance.url_for(status.account), class: 'status__display-name u-url', target: stream_link_target, rel: 'noopener' do
+ .status__avatar
+ %div
+ = image_tag status.account.avatar_static_url, width: 18, height: 18, alt: '', class: 'u-photo account__avatar'
+ %span.display-name
+ %bdi
+ %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true)
+
+ %span.display-name__account
+ = acct(status.account)
+ = fa_icon('lock') if status.account.locked?
+
+ .status__content.emojify<
+ - if status.spoiler_text?
+ %p{ :style => ('margin-bottom: 0' unless current_account&.user&.setting_expand_spoilers) }<
+ %span.p-summary> #{Formatter.instance.format_spoiler(status)}
+ %button.status__content__spoiler-link= t('statuses.show_more')
+ .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}" }
+ = Formatter.instance.format_in_quote(status, custom_emojify: true)
+
+ - if !status.media_attachments.empty?
+ - if status.media_attachments.first.video?
+ - video = status.media_attachments.first
+ = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), frameRate: video.file.meta.dig('original', 'frame_rate'), blurhash: video.blurhash, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description, media: [ActiveModelSerializers::SerializableResource.new(video, serializer: REST::MediaAttachmentSerializer)].as_json, quote: true do
+ = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
+ - elsif status.media_attachments.first.audio?
+ - audio = status.media_attachments.first
+ = react_component :audio, src: audio.file.url(:original), height: 60, alt: audio.description, duration: audio.file.meta.dig(:original, :duration) do
+ = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
+ - else
+ = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }, quote: true do
+ = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
+ - elsif status.preview_card
+ = react_component :card, maxDescription: 10, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json, quote: true
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index 728e6b9b0..d134b1008 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -34,6 +34,9 @@
- if status.preloadable_poll
= render_poll_component(status)
+ - if status.quote?
+ = render partial: "statuses/quote_status", locals: {status: status.quote}
+
- if !status.media_attachments.empty?
- if status.media_attachments.first.video?
= render_video_component(status, width: 610, height: 343)
diff --git a/app/workers/distribution_worker.rb b/app/workers/distribution_worker.rb
index 4e20ef31b..e85cd7e95 100644
--- a/app/workers/distribution_worker.rb
+++ b/app/workers/distribution_worker.rb
@@ -4,7 +4,7 @@ class DistributionWorker
include Sidekiq::Worker
def perform(status_id)
- RedisLock.acquire(redis: Redis.current, key: "distribute:#{status_id}") do |lock|
+ RedisLock.acquire(redis: Redis.current, key: "distribute:#{status_id}", autorelease: 5.minutes.seconds) do |lock|
if lock.acquired?
FanOutOnWriteService.new.call(Status.find(status_id))
else
diff --git a/app/workers/redownload_avatar_worker.rb b/app/workers/redownload_avatar_worker.rb
new file mode 100644
index 000000000..df17b7718
--- /dev/null
+++ b/app/workers/redownload_avatar_worker.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class RedownloadAvatarWorker
+ include Sidekiq::Worker
+ include ExponentialBackoff
+ include JsonLdHelper
+
+ sidekiq_options queue: 'pull', retry: 7
+
+ def perform(id)
+ account = Account.find(id)
+
+ return if account.suspended? || DomainBlock.rule_for(account.domain)&.reject_media?
+ return if account.avatar_remote_url.blank? || account.avatar_file_name.present?
+
+ account.reset_avatar!
+ account.save!
+ rescue ActiveRecord::RecordNotFound
+ # Do nothing
+ rescue Mastodon::UnexpectedResponseError => e
+ response = e.response
+
+ if response_error_unsalvageable?(response)
+ # Give up
+ else
+ raise e
+ end
+ end
+end
diff --git a/app/workers/redownload_header_worker.rb b/app/workers/redownload_header_worker.rb
new file mode 100644
index 000000000..3b142ec5f
--- /dev/null
+++ b/app/workers/redownload_header_worker.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class RedownloadHeaderWorker
+ include Sidekiq::Worker
+ include ExponentialBackoff
+ include JsonLdHelper
+
+ sidekiq_options queue: 'pull', retry: 7
+
+ def perform(id)
+ account = Account.find(id)
+
+ return if account.suspended? || DomainBlock.rule_for(account.domain)&.reject_media?
+ return if account.header_remote_url.blank? || account.header_file_name.present?
+
+ account.reset_header!
+ account.save!
+ rescue ActiveRecord::RecordNotFound
+ # Do nothing
+ rescue Mastodon::UnexpectedResponseError => e
+ response = e.response
+
+ if response_error_unsalvageable?(response)
+ # Give up
+ else
+ raise e
+ end
+ end
+end
diff --git a/config/application.rb b/config/application.rb
index 8200a2fcf..749b8aa58 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -73,6 +73,7 @@ module Mastodon
:eo,
:es,
:'es-AR',
+ :'es-MX',
:et,
:eu,
:fa,
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index 2d47a9aaf..35f2c3178 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -7,7 +7,7 @@
"check_name": "SQL",
"message": "Possible SQL injection",
"file": "app/models/report.rb",
- "line": 112,
+ "line": 113,
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
"code": "Admin::ActionLog.from(\"(#{[Admin::ActionLog.where(:target_type => \"Report\", :target_id => id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Account\", :target_id => target_account_id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Status\", :target_id => status_ids, :created_at => ((created_at..updated_at))).unscope(:order)].map do\n \"(#{query.to_sql})\"\n end.join(\" UNION ALL \")}) AS admin_action_logs\")",
"render_path": null,
@@ -67,7 +67,7 @@
"check_name": "SQL",
"message": "Possible SQL injection",
"file": "app/models/account.rb",
- "line": 491,
+ "line": 479,
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
"code": "find_by_sql([\" WITH first_degree AS (\\n SELECT target_account_id\\n FROM follows\\n WHERE account_id = ?\\n UNION ALL\\n SELECT ?\\n )\\n SELECT\\n accounts.*,\\n (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?)\\n WHERE accounts.id IN (SELECT * FROM first_degree)\\n AND #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n GROUP BY accounts.id\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, account.id, limit, offset])",
"render_path": null,
@@ -120,6 +120,26 @@
"confidence": "High",
"note": ""
},
+ {
+ "warning_type": "Mass Assignment",
+ "warning_code": 105,
+ "fingerprint": "874be88fedf4c680926845e9a588d3197765a6ccbfdd76466b44cc00151c612e",
+ "check_name": "PermitAttributes",
+ "message": "Potentially dangerous key allowed for mass assignment",
+ "file": "app/controllers/api/v1/admin/reports_controller.rb",
+ "line": 78,
+ "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
+ "code": "params.permit(:resolved, :account_id, :target_account_id)",
+ "render_path": null,
+ "location": {
+ "type": "method",
+ "class": "Api::V1::Admin::ReportsController",
+ "method": "filter_params"
+ },
+ "user_input": ":account_id",
+ "confidence": "High",
+ "note": ""
+ },
{
"warning_type": "SQL Injection",
"warning_code": 0,
@@ -127,7 +147,7 @@
"check_name": "SQL",
"message": "Possible SQL injection",
"file": "app/models/account.rb",
- "line": 460,
+ "line": 448,
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
"code": "find_by_sql([\" SELECT\\n accounts.*,\\n ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n WHERE #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, limit, offset])",
"render_path": null,
@@ -207,7 +227,7 @@
"check_name": "SQL",
"message": "Possible SQL injection",
"file": "app/models/account.rb",
- "line": 507,
+ "line": 495,
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
"code": "find_by_sql([\" SELECT\\n accounts.*,\\n (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank\\n FROM accounts\\n LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?)\\n WHERE #{query} @@ #{textsearch}\\n AND accounts.suspended_at IS NULL\\n AND accounts.moved_to_account_id IS NULL\\n GROUP BY accounts.id\\n ORDER BY rank DESC\\n LIMIT ? OFFSET ?\\n\".squish, account.id, account.id, limit, offset])",
"render_path": null,
@@ -241,6 +261,6 @@
"note": ""
}
],
- "updated": "2020-12-07 01:17:13 +0100",
- "brakeman_version": "4.10.0"
+ "updated": "2021-05-11 20:22:27 +0900",
+ "brakeman_version": "5.0.1"
}
diff --git a/config/initializers/1_hosts.rb b/config/initializers/1_hosts.rb
index eaf6e0181..6ff0845c4 100644
--- a/config/initializers/1_hosts.rb
+++ b/config/initializers/1_hosts.rb
@@ -31,5 +31,6 @@ Rails.application.configure do
config.hosts << host if host.present?
config.hosts << web_host if web_host.present?
config.hosts.concat(alternate_domains) if alternate_domains.present?
+ config.host_authorization = { exclude: ->(request) { request.path == '/health' } }
end
end
diff --git a/config/locales/activerecord.cs.yml b/config/locales/activerecord.cs.yml
index 580cabbfc..bd0b28efb 100644
--- a/config/locales/activerecord.cs.yml
+++ b/config/locales/activerecord.cs.yml
@@ -19,7 +19,7 @@ cs:
account:
attributes:
username:
- invalid: pouze písmena, číslice a podtržítka
+ invalid: musí obsahovat pouze písmena, číslice a podtržítka
reserved: je vyhrazeno
status:
attributes:
diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml
index ec8dad1b1..d5f19ca64 100644
--- a/config/locales/activerecord.en.yml
+++ b/config/locales/activerecord.en.yml
@@ -24,7 +24,7 @@ en:
status:
attributes:
reblog:
- taken: of status already exists
+ taken: of post already exists
user:
attributes:
email:
diff --git a/config/locales/activerecord.es-MX.yml b/config/locales/activerecord.es-MX.yml
index 9326e89d1..da658a338 100644
--- a/config/locales/activerecord.es-MX.yml
+++ b/config/locales/activerecord.es-MX.yml
@@ -2,6 +2,9 @@
es-MX:
activerecord:
attributes:
+ poll:
+ expires_at: Vencimiento
+ options: Opciones
user:
agreement: Acuerdo de Servicio
email: Dirección de correo electrónico
@@ -16,7 +19,12 @@ es-MX:
account:
attributes:
username:
+ invalid: solo puede contener letras, números y guiones bajos
reserved: está reservado
+ status:
+ attributes:
+ reblog:
+ taken: del estado ya existe
user:
attributes:
email:
diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml
index e05c9c1e2..0c4d6e5cf 100644
--- a/config/locales/activerecord.es.yml
+++ b/config/locales/activerecord.es.yml
@@ -2,6 +2,9 @@
es:
activerecord:
attributes:
+ poll:
+ expires_at: Vencimiento
+ options: Opciones
user:
agreement: Acuerdo de Servicio
email: Dirección de correo electrónico
@@ -16,7 +19,12 @@ es:
account:
attributes:
username:
+ invalid: solo puede contener letras, números y guiones bajos
reserved: está reservado
+ status:
+ attributes:
+ reblog:
+ taken: del estado ya existe
user:
attributes:
email:
diff --git a/config/locales/activerecord.gd.yml b/config/locales/activerecord.gd.yml
index eb09e8866..2920b561e 100644
--- a/config/locales/activerecord.gd.yml
+++ b/config/locales/activerecord.gd.yml
@@ -24,7 +24,7 @@ gd:
status:
attributes:
reblog:
- taken: "– tha seo aig an staid mu thràth"
+ taken: "– tha seo aig a’ phost mu thràth"
user:
attributes:
email:
diff --git a/config/locales/activerecord.hu.yml b/config/locales/activerecord.hu.yml
index db2fdb693..ac8cfd773 100644
--- a/config/locales/activerecord.hu.yml
+++ b/config/locales/activerecord.hu.yml
@@ -28,5 +28,5 @@ hu:
user:
attributes:
email:
- blocked: nem engedélyezett e-mail szolgáltatót használ
- unreachable: úgy látszik, nem létezik
+ blocked: egy letiltott e-mail szolgáltatót használ
+ unreachable: úgy tűnik, hogy nem létezik
diff --git a/config/locales/activerecord.th.yml b/config/locales/activerecord.th.yml
index 5b693e2af..ef93d4ce9 100644
--- a/config/locales/activerecord.th.yml
+++ b/config/locales/activerecord.th.yml
@@ -22,7 +22,7 @@ th:
status:
attributes:
reblog:
- taken: ของสถานะมีอยู่แล้ว
+ taken: ของโพสต์มีอยู่แล้ว
user:
attributes:
email:
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index b49f70d11..c1d44a8be 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -1,7 +1,7 @@
---
cs:
about:
- about_hashtag_html: Tohle jsou veřejné tooty označené hashtagem #%{hashtag}. Pokud máte účet kdekoliv ve fedivesmíru, můžete s nimi interagovat.
+ about_hashtag_html: Tohle jsou veřejné příspěvky označené hashtagem #%{hashtag}. Pokud máte účet kdekoliv ve fedivesmíru, můžete s nimi interagovat.
about_mastodon_html: 'Sociální síť budoucnosti: žádné reklamy, žádné korporátní sledování, etický design a decentralizace! S Mastodonem vlastníte svoje data!'
about_this: O tomto serveru
active_count_after: aktivních
@@ -32,14 +32,14 @@ cs:
server_stats: 'Statistika serveru:'
source_code: Zdrojový kód
status_count_after:
- few: tooty
- many: tootů
- one: toot
- other: tootů
+ few: příspěvky
+ many: příspěvků
+ one: příspěvek
+ other: příspěvků
status_count_before: Kteří napsali
tagline: Sledujte své přátele a objevujte nové
terms: Podmínky používání
- unavailable_content: Nedostupný obsah
+ unavailable_content: Moderované servery
unavailable_content_description:
domain: Server
reason: Důvod
@@ -58,7 +58,7 @@ cs:
user_count_before: Domov
what_is_mastodon: Co je Mastodon?
accounts:
- choices_html: 'Volby uživatele %{name}:'
+ choices_html: 'Volby %{name}:'
endorsements_hint: Z webového rozhraní můžete podpořit lidi, které sledujete. Ti se poté zobrazí zde.
featured_tags_hint: Můžete vybrat konkrétní hashtagy, které se zobrazí zde.
follow: Sledovat
@@ -69,25 +69,25 @@ cs:
other: Sledujících
following: Sledovaní
instance_actor_flash: Tento účet je virtuální aktér, který představuje server samotný, nikoliv jednotlivého uživatele. Používá se pro účely federace a neměl by být pozastaven.
- joined: Založen %{date}
+ joined: Uživatelem od %{date}
last_active: naposledy aktivní
link_verified_on: Vlastnictví tohoto odkazu bylo zkontrolováno %{date}
media: Média
- moved_html: "%{name} se přesunul/a na %{new_profile_link}:"
+ moved_html: "%{name} se přesunul a na %{new_profile_link}:"
network_hidden: Tato informace není k dispozici
never_active: Nikdy
nothing_here: Nic tu není!
people_followed_by: Lidé, které sleduje %{name}
- people_who_follow: Lidé, kteří sledují uživatele %{name}
+ people_who_follow: Lidé, kteří sledují %{name}
pin_errors:
following: Osobu, kterou chcete podpořit, už musíte sledovat
posts:
- few: Tooty
- many: Tootů
- one: Toot
- other: Tootů
- posts_tab_heading: Tooty
- posts_with_replies: Tooty a odpovědi
+ few: Příspěvky
+ many: Příspěvků
+ one: Příspěvek
+ other: Příspěvků
+ posts_tab_heading: Příspěvky
+ posts_with_replies: Příspěvky a odpovědi
roles:
admin: Administrátor
bot: Robot
@@ -105,7 +105,7 @@ cs:
delete: Smazat
destroyed_msg: Moderátorská poznámka byla úspěšně zničena!
accounts:
- add_email_domain_block: Blokovat e-maily na této doméně
+ add_email_domain_block: Blokovat e-mailovou doménu
approve: Schválit
approve_all: Schválit vše
approved_msg: Žádost o registraci uživatele %{username} úspěšně schválena
@@ -126,15 +126,15 @@ cs:
deleted: Smazáno
demote: Degradovat
destroyed_msg: Data účtu %{username} jsou nyní ve frontě k okamžitému smazání
- disable: Zablokovat
+ disable: Zmrazit
disable_two_factor_authentication: Vypnout 2FA
- disabled: Blokováno
+ disabled: Zmrazen
display_name: Zobrazované jméno
domain: Doména
edit: Upravit
email: E-mail
email_status: Stav e-mailu
- enable: Povolit
+ enable: Rozmrazit
enabled: Povoleno
enabled_msg: Účet %{username} byl úspěšně rozmrazen
followers: Sledující
@@ -142,9 +142,9 @@ cs:
header: Záhlaví
inbox_url: URL příchozí schránky
invite_request_text: Důvody založení
- invited_by: Pozván/a uživatelem
+ invited_by: Pozván uživatelem
ip: IP adresa
- joined: Založen
+ joined: Uživatel založen
location:
all: Všechny
local: Místní
@@ -197,7 +197,7 @@ cs:
staff: Člen personálu
user: Uživatel
search: Hledat
- search_same_email_domain: Ostatní uživatelé s e-mailem na stejné doméně
+ search_same_email_domain: Ostatní uživatelé se stejnou e-mailovou doménou
search_same_ip: Další uživatelé se stejnou IP adresou
sensitive: Citlivý
sensitized: označen jako citlivý
@@ -205,9 +205,9 @@ cs:
show:
created_reports: Vytvořená hlášení
targeted_reports: Nahlášeni ostatními
- silence: Ztišit
- silenced: Uživatel ztišen
- statuses: Tooty
+ silence: Omezit
+ silenced: Omezen
+ statuses: Příspěvky
subscribe: Odebírat
suspended: Uživatel pozastaven
suspension_irreversible: Data tohoto účtu byla nevratně smazána. Účet můžete obnovit, aby byl použitelný, ale nebudou obnovena žádná jeho dřívější data.
@@ -225,7 +225,7 @@ cs:
view_domain: Zobrazit souhrn domény
warn: Varovat
web: Web
- whitelisted: Na bílé listině
+ whitelisted: Povoleno federovat
action_logs:
action_types:
assigned_to_self_report: Přiřadit hlášení
@@ -236,7 +236,7 @@ cs:
create_custom_emoji: Vytvořit vlastní emoji
create_domain_allow: Povolit doménu
create_domain_block: Zablokovat doménu
- create_email_domain_block: Zablokovat e-maily na doméně
+ create_email_domain_block: Zablokovat e-mailovou doménu
create_ip_block: Vytvořit IP pravidlo
create_unavailable_domain: Vytvořit nedostupnou doménu
demote_user: Snížit roli uživatele
@@ -244,9 +244,9 @@ cs:
destroy_custom_emoji: Odstranit vlastní emoji
destroy_domain_allow: Odstranit povolenou doménu
destroy_domain_block: Odstranit blokování domény
- destroy_email_domain_block: Odstranit blokování e-mailů na doméně
+ destroy_email_domain_block: Smazat blokaci e-mailové domény
destroy_ip_block: Smazat IP pravidlo
- destroy_status: Odstranit stav
+ destroy_status: Odstranit Příspěvek
destroy_unavailable_domain: Smazat nedostupnou doménu
disable_2fa_user: Vypnout 2FA
disable_custom_emoji: Zakázat vlastní emoji
@@ -269,7 +269,7 @@ cs:
update_announcement: Aktualizovat oznámení
update_custom_emoji: Aktualizovat vlastní emoji
update_domain_block: Změnit blokaci domény
- update_status: Aktualizovat stav
+ update_status: Aktualizovat Příspěvek
actions:
assigned_to_self_report_html: Uživatel %{name} si přidělil hlášení %{target}
change_email_user_html: Uživatel %{name} změnil e-mailovou adresu uživatele %{target}
@@ -277,19 +277,20 @@ cs:
create_account_warning_html: Uživatel %{name} poslal varování uživateli %{target}
create_announcement_html: Uživatel %{name} vytvořil nové oznámení %{target}
create_custom_emoji_html: Uživatel %{name} nahrál nové emoji %{target}
- create_domain_allow_html: Uživatel %{name} přidal doménu %{target} na bílou listinu
+ create_domain_allow_html: Uživatel %{name} povolil federaci s doménou %{target}
create_domain_block_html: Uživatel %{name} zablokoval doménu %{target}
- create_email_domain_block_html: Uživatel %{name} přidal e-mailovou doménu %{target} na černou listinu
+ create_email_domain_block_html: Uživatel %{name} zablokoval e-mailovou doménu %{target}
create_ip_block_html: "%{name} vytvořil pravidlo pro IP %{target}"
create_unavailable_domain_html: "%{name} zastavil doručování na doménu %{target}"
demote_user_html: Uživatel %{name} degradoval uživatele %{target}
destroy_announcement_html: Uživatel %{name} odstranil oznámení %{target}
destroy_custom_emoji_html: Uživatel %{name} zničil emoji %{target}
- destroy_domain_allow_html: Uživatel %{name} odebral doménu %{target} z bílé listiny
+ destroy_domain_allow_html: Uživatel %{name} zakázal federaci s doménou %{target}
destroy_domain_block_html: Uživatel %{name} odblokoval doménu %{target}
- destroy_email_domain_block_html: Uživatel %{name} odebral e-mailovou doménu %{target} z černé listiny
+ destroy_email_domain_block_html: Uživatel %{name} odblokoval e-mailovou doménu %{target}
destroy_ip_block_html: "%{name} odstranil pravidlo pro IP %{target}"
- destroy_status_html: Uživatel %{name} odstranil toot uživatele %{target}
+ destroy_status_html: Uživatel %{name} odstranil příspěvek uživatele %{target}
+ destroy_unavailable_domain_html: "%{name} obnovil doručování na doménu %{target}"
disable_2fa_user_html: Uživatel %{name} vypnul dvoufázové ověřování pro uživatele %{target}
disable_custom_emoji_html: Uživatel %{name} zakázal emoji %{target}
disable_user_html: Uživatel %{name} zakázal přihlašování pro uživatele %{target}
@@ -311,14 +312,14 @@ cs:
update_announcement_html: Uživatel %{name} aktualizoval oznámení %{target}
update_custom_emoji_html: Uživatel %{name} aktualizoval emoji %{target}
update_domain_block_html: "%{name} aktualizoval blokaci domény %{target}"
- update_status_html: Uživatel %{name} aktualizoval toot uživatele %{target}
- deleted_status: "(smazaný toot)"
+ update_status_html: Uživatel %{name} aktualizoval příspěvek uživatele %{target}
+ deleted_status: "(smazaný příspěvek)"
empty: Nebyly nalezeny žádné záznamy.
filter_by_action: Filtrovat podle akce
filter_by_user: Filtrovat podle uživatele
title: Auditovací protokol
announcements:
- destroyed_msg: Oznámení bylo úspěšně odstraněno
+ destroyed_msg: Oznámení bylo úspěšně odstraněno!
edit:
title: Upravit oznámení
empty: Nebyla nalezena žádná oznámení.
@@ -327,13 +328,13 @@ cs:
create: Vytvořit oznámení
title: Nové oznámení
publish: Zveřejnit
- published_msg: Oznámení bylo úspěšně zveřejněno
+ published_msg: Oznámení bylo úspěšně zveřejněno!
scheduled_for: Naplánováno na %{time}
- scheduled_msg: Zveřejnění oznámení bylo naplánováno
+ scheduled_msg: Zveřejnění oznámení bylo naplánováno!
title: Oznámení
unpublish: Skrýt
- unpublished_msg: Zveřejněné oznámení bylo skryto
- updated_msg: Oznámení bylo úspěšně aktualizováno
+ unpublished_msg: Zveřejněné oznámení bylo úspěšně skryto!
+ updated_msg: Oznámení bylo úspěšně aktualizováno!
custom_emojis:
assign_category: Přiřadit kategorii
by_domain: Doména
@@ -372,7 +373,7 @@ cs:
backlog: nevyřízené úlohy
config: Konfigurace
feature_deletions: Smazání účtů
- feature_invites: Odkazy pozvánek
+ feature_invites: Zvací odkazy
feature_profile_directory: Adresář profilů
feature_registrations: Registrace
feature_relay: Federovací most
@@ -389,16 +390,16 @@ cs:
space: Využití prostoru
title: Přehled
total_users: uživatelů celkem
- trends: Trendy
+ trends: Populární hashtagy
week_interactions: interakcí tento týden
week_users_active: aktivních tento týden
week_users_new: uživatelů tento týden
- whitelist_mode: Režim bílé listiny
+ whitelist_mode: Režim omezené federace
domain_allows:
- add_new: Přidat doménu na bílou listinu
- created_msg: Doména byla úspěšně přidána na bílou listinu
- destroyed_msg: Doména byla odstraněna z bílé listiny
- undo: Odstranit z bílé listiny
+ add_new: Povolit federaci s doménou
+ created_msg: S doménou byla úspěšně povolena federace
+ destroyed_msg: S doménou byla zakázána federace
+ undo: Zakázat federaci s doménou
domain_blocks:
add_new: Přidat novou blokaci domény
created_msg: Blokace domény se právě vyřizuje
@@ -445,16 +446,16 @@ cs:
view: Zobrazit blokaci domény
email_domain_blocks:
add_new: Přidat
- created_msg: E-mailová doména úspěšně přidána na černou listinu
+ created_msg: E-mailová doména úspěšně zablokována
delete: Smazat
- destroyed_msg: E-mailová doména úspěšně odstraněna z černé listiny
+ destroyed_msg: E-mailová doména úspěšně odblokována
domain: Doména
- empty: Na černé listině aktuálně nejsou žádné e-mailové domény.
+ empty: Žádné e-mailové domény nejsou aktuálně blokovány.
from_html: z domény %{domain}
new:
create: Přidat doménu
- title: Nová položka pro černou listinu e-mailů
- title: Černá listina e-mailů
+ title: Blokovat novou e-mailovou doménu
+ title: Blokované e-mailové domény
follow_recommendations:
description_html: "Doporučená sledování pomáhají novým uživatelům rychle najít zajímavý obsah. Pokud uživatel neinteragoval s ostatními natolik, aby mu byla vytvořena doporučená sledování na míru, jsou použity tyto účty. Jsou přepočítávány na denní bázi ze směsi účtů s největším nedávným zapojením a nejvyšším počtem místních sledovatelů pro daný jazyk."
language: Pro jazyk
@@ -464,8 +465,26 @@ cs:
title: Doporučená sledování
unsuppress: Obnovit doporučení sledování
instances:
+ back_to_all: Vše
+ back_to_limited: Omezený
+ back_to_warning: Varování
by_domain: Doména
+ delivery:
+ all: Vše
+ clear: Vymazat chyby doručení
+ restart: Restartovat doručování
+ stop: Zastavit doručování
+ title: Doručování
+ unavailable: Nedostupný
+ unavailable_message: Doručování nedostupné
+ warning: Varování
+ warning_message:
+ few: Doručení selhává %{count} dny
+ many: Doručení selhává %{count} dnů
+ one: Doručení selhává %{count} den
+ other: Doručení selhává %{count} dnů
delivery_available: Doručení je k dispozici
+ delivery_error_days: Dny chybného doručování
delivery_error_hint: Není-li možné doručení po dobu %{count} dnů, bude automaticky označen za nedoručitelný.
empty: Nebyly nalezeny žádné domény.
known_accounts:
@@ -475,7 +494,7 @@ cs:
other: "%{count} známých účtů"
moderation:
all: Všechny
- limited: Omezené
+ limited: Omezený
title: Moderování
private_comment: Soukromý komentář
public_comment: Veřejný komentář
@@ -515,17 +534,17 @@ cs:
relays:
add_new: Přidat nový most
delete: Smazat
- description_html: "Federovací most je přechodový server, který vyměňuje velká množství veřejných tootů mezi servery, které je z něj odebírají a publikují na něj. Může pomoci malým a středně velkým serverům objevovat obsah z fedivesmíru, což by jinak vyžadovalo, aby místní uživatelé manuálně sledovali jiné lidi na vzdálených serverech."
+ description_html: "Federovací most je zprostředkující server, který vyměňuje velké objemy veřejných příspěvků mezi servery, které je z něj odebírají a publikují na něj. Může pomoci malým a středně velkým serverům objevovat obsah z fedivesmíru, což by jinak vyžadovalo, aby místní uživatelé ručně začali sledovat jiné lidi na vzdálených serverech."
disable: Zakázat
disabled: Zakázáno
enable: Povolit
- enable_hint: Po zapnutí začne váš server odebírat všechny veřejné tooty z tohoto mostu a odesílat na něj své vlastní veřejné tooty.
+ enable_hint: Po zapnutí začne váš server odebírat všechny veřejné příspěvky z tohoto mostu a odesílat na něj své vlastní veřejné příspěvky.
enabled: Povoleno
inbox_url: URL mostu
pending: Čeká na souhlas mostu
save_and_enable: Uložit a povolit
setup: Nastavit připojení k mostu
- signatures_not_enabled: Dokud je povolen zabezpečený režim nebo režim bílé listiny, nebudou mosty správně fungovat
+ signatures_not_enabled: Dokud je povolen zabezpečený režim nebo režim omezené federace, nebudou mosty fungovat správně
status: Stav
title: Mosty
report_notes:
@@ -581,11 +600,11 @@ cs:
title: Pravidla serveru
settings:
activity_api_enabled:
- desc_html: Počty lokálně publikovaných tootů, aktivních uživatelů a nových registrací, v týdenních intervalech
+ desc_html: Počty lokálně publikovaných příspěvků, aktivních uživatelů a nových registrací, v týdenních intervalech
title: Publikovat hromadné statistiky o uživatelské aktivitě v API
bootstrap_timeline_accounts:
- desc_html: Je-li uživatelských jmen více, oddělte je čárkami. Lze zadat pouze místní a odemčené účty. Je-li seznam prázdný, jsou výchozí hodnotou všichni místní administrátoři.
- title: Výchozí sledovaní pro nové uživatele
+ desc_html: Více uživatelských jmen oddělte čárkou. U těchto účtů bude zaručeno, že budou vždy zobrazeny mezi doporučenými sledováními
+ title: Doporučit tyto účty novým uživatelům
contact_information:
email: Pracovní e-mail
username: Uživatelské jméno pro kontaktování
@@ -637,8 +656,8 @@ cs:
open: Kdokoliv se může registrovat
title: Režim registrací
show_known_fediverse_at_about_page:
- desc_html: Je-li tohle vypnuto, bude veřejná časová osa, na kterou odkazuje hlavní stránka serveru, omezena pouze na místní obsah
- title: Zobrazit na nepřihlášené stránce časové osy federovaný obsah
+ desc_html: Je-li vypnuto, bude veřejná časová osa, na kterou odkazuje hlavní stránka serveru, omezena pouze na místní obsah
+ title: Zahrnout federovaný obsah na neautentizované stránce veřejné časové osy
show_staff_badge:
desc_html: Zobrazit na stránce uživatele odznak člena personálu
title: Zobrazit odznak personálu
@@ -664,9 +683,9 @@ cs:
title: Nastavení stránky
trendable_by_default:
desc_html: Ovlivňuje hashtagy, které nebyly dříve zakázány
- title: Povolit zobrazení hashtagů v trendech i bez předchozího posouzení
+ title: Povolit zobrazení hashtagů mezi populárními i bez předchozího posouzení
trends:
- desc_html: Veřejně zobrazit populární hashtagy, které byly předtím schváleny
+ desc_html: Veřejně zobrazit dříve schválené hashtagy, které jsou zrovna populární
title: Populární hashtagy
site_uploads:
delete: Odstranit nahraný soubor
@@ -682,8 +701,8 @@ cs:
media:
title: Média
no_media: Žádná média
- no_status_selected: Nebyly změněny žádné tooty, neboť žádné nebyly vybrány
- title: Tooty účtu
+ no_status_selected: Nebyly změněny žádné příspěvky, neboť žádné nebyly vybrány
+ title: Příspěvky účtu
with_media: S médii
system_checks:
database_schema_check:
@@ -697,14 +716,14 @@ cs:
accounts_today: Dnešní jedinečná použití
accounts_week: Jedinečná použití tento týden
breakdown: Přehled dnešního používání podle zdroje
- last_active: Naposledy aktivní
+ last_active: Nedávno použité
most_popular: Nejpopulárnější
- most_recent: Nejnovější
+ most_recent: Nedávno vytvořené
name: Hashtag
review: Stav schválení
reviewed: Schválen
title: Hashtagy
- trending_right_now: Právě je trendy
+ trending_right_now: Populární právě teď
unique_uses_today: Dnes použilo %{count} uživatelů
unreviewed: Nezkontrolováno
updated_msg: Nastavení hashtagů bylo úspěšně aktualizováno
@@ -724,7 +743,7 @@ cs:
body_remote: Někdo z domény %{domain} nahlásil uživatele %{target}
subject: Nové hlášení pro %{instance} (#%{id})
new_trending_tag:
- body: 'Hashtag #%{name} je dnes populární, ale nebyl dříve schválen. Pokud to nedovolíte, nebude veřejně zobrazen. Pokud tento formulář uložíte jak je, už o něm opět neuslyšíte.'
+ body: 'Hashtag #%{name} je dnes populární, ale nebyl dříve schválen. Pokud to nedovolíte, nebude veřejně zobrazen. Nebo pouze uložte formulář tak, jak je, a už o něm neuslyšíte.'
subject: Nový hashtag ke schválení na %{instance} (#%{name})
aliases:
add_new: Vytvořit alias
@@ -744,14 +763,14 @@ cs:
guide_link: https://cs.crowdin.com/project/mastodon
guide_link_text: Každý může pomoci.
sensitive_content: Citlivý obsah
- toot_layout: Rozložení tootů
+ toot_layout: Rozložení příspěvků
application_mailer:
notification_preferences: Změnit předvolby e-mailů
salutation: "%{name},"
settings: 'Změnit předvolby e-mailů: %{link}'
view: 'Zobrazit:'
view_profile: Zobrazit profil
- view_status: Zobrazit toot
+ view_status: Zobrazit příspěvek
applications:
created: Aplikace úspěšně vytvořena
destroyed: Aplikace úspěšně smazána
@@ -815,7 +834,7 @@ cs:
close: Nebo můžete toto okno klidně zavřít.
return: Zobrazit profil uživatele
web: Přejít na web
- title: Sledovat uživatele %{acct}
+ title: Sledovat %{acct}
challenge:
confirm: Pokračovat
hint_html: "Tip: Po dobu jedné hodiny vás o heslo nebudeme znovu žádat."
@@ -827,7 +846,7 @@ cs:
invalid_signature: není platný podpis typu Ed25519
date:
formats:
- default: "%-d. %b %Y"
+ default: "%d. %b %Y"
with_month_name: "%d. %B %Y"
datetime:
distance_in_words:
@@ -888,7 +907,7 @@ cs:
archive_takeout:
date: Datum
download: Stáhnout váš archiv
- hint_html: Můžete si vyžádat archiv vašich tootů a nahraných médií. Exportovaná data budou ve formátu ActivityPub a budou čitelná kterýmkoliv kompatibilním softwarem. Archiv si můžete vyžádat každých 7 dní.
+ hint_html: Můžete si vyžádat archiv vašich příspěvků a nahraných médií. Exportovaná data budou ve formátu ActivityPub a budou čitelná kterýmkoliv kompatibilním softwarem. Archiv si můžete vyžádat každých 7 dní.
in_progress: Kompiluji váš archiv…
request: Vyžádat váš archiv
size: Velikost
@@ -897,7 +916,7 @@ cs:
csv: CSV
domain_blocks: Blokování domén
lists: Seznamy
- mutes: Skryli jste
+ mutes: Skrýváte
storage: Paměť médií
featured_tags:
add_new: Přidat nový
@@ -907,7 +926,7 @@ cs:
filters:
contexts:
account: Profily
- home: Domovská časová osa
+ home: Domovská časová osa a seznamy
notifications: Oznámení
public: Veřejné časové osy
thread: Konverzace
@@ -926,7 +945,7 @@ cs:
developers: Vývojáři
more: Více…
resources: Zdroje
- trending_now: Aktuální trendy
+ trending_now: Právě populární
generic:
all: Všechny
changes_saved_msg: Změny byly úspěšně uloženy!
@@ -951,12 +970,12 @@ cs:
keybase:
invalid_token: Keybase tokeny jsou hashe podpisů a musí být dlouhé 66 hexadecimálních znaků
verification_failed: Keybase nerozpoznává tento token jako podpis uživatele %{kb_username} na Keybase. Zkuste to prosím znovu z Keybase.
- wrong_user: Nelze vytvořit důkaz pro uživatele %{proving}, zatímco jste přihlášeni jako %{current}. Přihlaste se jako %{proving} a zkuste to znovu.
- explanation_html: Zde můžete kryptograficky připojit vaše ostatní identity, například profil Keybase. To dovolí jiným lidem vám posílat šifrované zprávy a důvěřovat obsahu, který jim pošlete.
+ wrong_user: Nelze vytvořit důkaz pro %{proving}, zatímco jste přihlášeni jako %{current}. Přihlaste se jako %{proving} a zkuste to znovu.
+ explanation_html: Zde můžete kryptograficky propojit další své identity z jiných platforem, jako například Keybase. To umožňuje jiným lidem poslat vám šifrované zprávy na těchto platformách a důvěřovat, že obsah, který jim posíláte, pochází od vás.
i_am_html: Na %{service} jsem %{username}.
identity: Identita
inactive: Neaktivní
- publicize_checkbox: 'A tootnout tohle:'
+ publicize_checkbox: 'A odeslat tohle:'
publicize_toot: 'Je to dokázáno! Na %{service} jsem %{username}: %{url}'
remove: Odstranit důkaz z účtu
removed: Úspěšně odstraněn důkaz z účtu
@@ -991,7 +1010,7 @@ cs:
'604800': 1 týden
'86400': 1 den
expires_in_prompt: Nikdy
- generate: Vygenerovat pozvánku
+ generate: Vygenerovat zvací odkaz
invited_by: 'Pozval váš uživatel:'
max_uses:
few: "%{count} použití"
@@ -999,7 +1018,7 @@ cs:
one: 1 použití
other: "%{count} použití"
max_uses_prompt: Bez omezení
- prompt: Vygenerujte a sdílejte s ostatními odkazy a umožněte jim přístup na tento server
+ prompt: Generujte a sdílejte s ostatními odkazy umožňující jim přístup na tento server
table:
expires_at: Vyprší
uses: Použití
@@ -1009,8 +1028,8 @@ cs:
limit: Dosáhli jste maximálního počtu seznamů
media_attachments:
validations:
- images_and_video: K tootu, který již obsahuje obrázky, nelze připojit video
- not_ready: Nelze připojit soubory před jejich zpracováním. Zkuste to znovu za chvíli.
+ images_and_video: K příspěvku, který již obsahuje obrázky, nelze připojit video
+ not_ready: Nelze připojit soubory před jejich zpracováním. Zkuste to znovu za chvíli!
too_many: Nelze připojit více než 4 soubory
migrations:
acct: Přesunuto na
@@ -1019,7 +1038,7 @@ cs:
cancelled_msg: Přesměrování bylo úspěšně zrušeno.
errors:
already_moved: je stejný účet, na který jste se již přesunuli
- missing_also_known_as: neodkazuje na tento účet
+ missing_also_known_as: není aliasem tohoto účtu
move_to_self: nemůže být aktuální účet
not_found: nebyl nalezen
on_cooldown: Probíhá období odpočinku
@@ -1066,12 +1085,12 @@ cs:
other: "%{count} nových oznámení od vaší poslední návštěvy \U0001F418"
title: Ve vaší nepřítomnosti…
favourite:
- body: 'Váš toot si oblíbil uživatel %{name}:'
- subject: Uživatel %{name} si oblíbil váš toot
+ body: 'Váš příspěvek si oblíbil uživatel %{name}:'
+ subject: Uživatel %{name} si oblíbil váš příspěvek
title: Nové oblíbení
follow:
- body: Uživatel %{name} vás nyní sleduje!
- subject: Uživatel %{name} vás nyní sleduje
+ body: "%{name} vás nyní sleduje!"
+ subject: "%{name} vás nyní sleduje"
title: Nový sledující
follow_request:
action: Spravovat žádosti o sledování
@@ -1086,11 +1105,11 @@ cs:
poll:
subject: Anketa od %{name} skončila
reblog:
- body: 'Uživatel %{name} boostnul váš toot:'
- subject: Uživatel %{name} boostnul váš toot
+ body: 'Uživatel %{name} boostnul váš příspěvek:'
+ subject: Uživatel %{name} boostnul váš příspěvek
title: Nový boost
status:
- subject: Nový toot od %{name}
+ subject: Nový příspěvek od %{name}
notifications:
email_events: Události pro e-mailová oznámení
email_events_hint: 'Vyberte události, pro které chcete dostávat oznámení:'
@@ -1165,16 +1184,16 @@ cs:
remote_interaction:
favourite:
proceed: Pokračovat k oblíbení
- prompt: 'Chcete si oblíbit tento toot:'
+ prompt: 'Chcete si oblíbit tento příspěvek:'
reblog:
proceed: Pokračovat k boostnutí
- prompt: 'Chcete boostnout tento toot:'
+ prompt: 'Chcete boostnout tento příspěvek:'
reply:
proceed: Pokračovat k odpovědi
- prompt: 'Chcete odpovědět na tento toot:'
+ prompt: 'Chcete odpovědět na tento příspěvek:'
scheduled_statuses:
- over_daily_limit: Překročili jste limit %{limit} tootů naplánovaných na tento den
- over_total_limit: Překročili jste limit %{limit} naplánovaných tootů
+ over_daily_limit: Překročili jste limit %{limit} příspěvků naplánovaných na tento den
+ over_total_limit: Překročili jste limit %{limit} naplánovaných příspěvků
too_soon: Plánované datum musí být v budoucnosti
sessions:
activity: Nejnovější aktivita
@@ -1209,7 +1228,7 @@ cs:
firefox_os: Firefox OS
ios: iOS
linux: Linux
- mac: Mac
+ mac: macOS
other: neznámá platforma
windows: Windows
windows_mobile: Windows Mobile
@@ -1265,14 +1284,14 @@ cs:
one: 'obsahoval nepovolený hashtag: %{tags}'
other: 'obsahoval nepovolené hashtagy: %{tags}'
errors:
- in_reply_not_found: Stav, na který se pokoušíte odpovědět, neexistuje.
+ in_reply_not_found: Příspěvek, na který se pokoušíte odpovědět, neexistuje.
language_detection: Zjistit jazyk automaticky
open_in_web: Otevřít na webu
over_character_limit: byl překročen limit %{max} znaků
pin_errors:
- limit: Už jste si připnuli maximální počet tootů
- ownership: Nelze připnout toot někoho jiného
- private: Neveřejné tooty nelze připnout
+ limit: Už jste si připnuli maximální počet příspěvků
+ ownership: Nelze připnout příspěvek někoho jiného
+ private: Neveřejné příspěvky nelze připnout
reblog: Boosty nelze připnout
poll:
total_people:
@@ -1301,8 +1320,8 @@ cs:
unlisted: Neuvedené
unlisted_long: Uvidí kdokoliv, ale nebude zahrnut ve veřejných časových osách
stream_entries:
- pinned: Připnutý toot
- reblogged: boostnul/a
+ pinned: Připnutý příspěvek
+ reblogged: boostnul
sensitive_content: Citlivý obsah
tags:
does_not_match_previous_name: se neshoduje s předchozím názvem
@@ -1399,7 +1418,7 @@ cs:
month: "%b %Y"
two_factor_authentication:
add: Přidat
- disable: Vypnout
+ disable: Vypnout 2FA
disabled_success: Dvoufázové ověření bylo úspěšně vypnuto
edit: Upravit
enabled: Dvoufázové ověřování je zapnuto
@@ -1425,16 +1444,16 @@ cs:
title: Pokus o přihlášení
warning:
explanation:
- disable: Zatímco je váš účet zmrazen, zůstávají data vašeho účtu nedotčena. Dokud ale nebude odemčen, nemůžete vykonávat žádné akce.
+ disable: Nemůžete se přihlásit do svého účtu nebo ho jakkoliv jinak používat, ale váš profil a ostatní data zůstávají nedotčeny.
sensitive: Vámi nahrané a odkazované mediální soubory budou považovány za citlivé.
- silence: Zatímco je váš účet omezen, mohou vaše tooty na tomto serveru vidět pouze lidé, kteří váš již sledují, a můžete být vyloučeni z různých veřejných seznamů. Ostatní vás však pořád mohou manuálně sledovat.
- suspend: Váš účet byl pozastaven a všechny vaše tooty a nahrané mediální soubory byly nenávratně odstraněny z tohoto serveru a serverů, na kterých jste měli sledující.
+ silence: Nadále můžete používat svůj účet, ale pouze lidé, kteří vás již sledovali, uvidí vaše příspěvky na tomto serveru a můžete být vyjmuti z různých veřejných seznamů. Ostatní vás však stále mohou ručně začít sledovat.
+ suspend: Nemůžete už používat svůj účet a váš profil a ostatní data již nejsou dostupná. Stále se můžete přihlásit pro vyžádání zálohy svých dat, dokud nebudou zcela smazána, ale ponecháme si některé údaje, abychom vám zabránili ve vyhýbání se pozastavení.
get_in_touch: Můžete odpovědět na tento e-mail a spojit se s personálem serveru %{instance}.
review_server_policies: Zkontrolujte pravidla serveru
statuses: 'Konkrétně kvůli:'
subject:
disable: Váš účet %{acct} byl zmrazen
- none: Varování pro uživatele %{acct}
+ none: Varování pro %{acct}
sensitive: Média z Vašeho účtu %{acct} byla označena za citlivá
silence: Váš účet %{acct} byl omezen
suspend: Váš účet %{acct} byl pozastaven
@@ -1449,7 +1468,7 @@ cs:
edit_profile_step: Svůj profil si můžete přizpůsobit nahráním avataru a obrázku záhlaví, změnou zobrazovaného jména a další. Chcete-li posoudit nové sledující předtím, než vás mohou sledovat, můžete svůj účet uzamknout.
explanation: Zde je pár tipů do začátku
final_action: Začít psát
- final_step: 'Začněte psát! I když nemáte sledující, mohou vaše zprávy vidět jiní lidé, například na místní časové ose a v hashtazích. Můžete se ostatním představit pomocí hashtagu #introductions.'
+ final_step: 'Začněte psát! I když nemáte sledující, mohou vaše veřejné příspěvky vidět jiní lidé, například na místní časové ose a v hashtazích. Můžete se ostatním představit pomocí hashtagu #introductions.'
full_handle: Vaše celá adresa profilu
full_handle_hint: Tohle je, co byste řekli svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru.
review_preferences_action: Změnit předvolby
@@ -1463,7 +1482,7 @@ cs:
title: Vítejte na palubě, %{name}!
users:
follow_limit_reached: Nemůžete sledovat více než %{limit} lidí
- generic_access_help_html: Máte potíže s přístupem ke svému účtu? Napište nám o pomoc na %{email}.
+ generic_access_help_html: Máte potíže s přístupem ke svému účtu? Můžete nás kontaktovat pro pomoc na %{email}
invalid_otp_token: Neplatný kód pro dvoufázové ověřování
invalid_sign_in_token: Neplatný bezpečnostní kód
otp_lost_help_html: Pokud jste ztratili přístup k oběma, spojte se s %{email}
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 79e8d8cca..8121c6645 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -289,6 +289,7 @@ da:
enable_custom_emoji_html: "%{name} aktiverede humørikonet %{target}"
enable_user_html: "%{name} aktiverede indlogning for brugeren %{target}"
memorialize_account_html: "%{name} gjorde %{target}s konto til en mindeside"
+ promote_user_html: "%{name} forfremmede brugeren %{target}"
remove_avatar_user_html: "%{name} fjernede %{target}s profilbillede"
reopen_report_html: "%{name} genåbnede anmeldelsen %{target}"
reset_password_user_html: "%{name} nulstillede adgangskoden for brugeren %{target}"
@@ -854,6 +855,7 @@ da:
caches: Indhold, cachelagret af andre servere, kan fortsat eksistere
data_removal: Dine indlæg og andre data fjernes permanent
email_change_html: Du kan skifte e-mailadresse uden at slette din konto
+ email_contact_html: Hvis det stadig ikke ankommer, kan du sende en e-mail til %{email} for hjælp
email_reconfirmation_html: Modtager du ikke bekræftelsese-mailen, kan du anmode om en ny
irreversible: Du vil ikke kunne gendanne/genaktivere din konto
more_details_html: For yderligere oplysningerer, tjek fortrolighedspolitikken.
diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml
index da102b7d4..be39a8f17 100644
--- a/config/locales/devise.cs.yml
+++ b/config/locales/devise.cs.yml
@@ -21,7 +21,7 @@ cs:
action: Potvrdit e-mailovou adresu
action_with_app: Potvrdit a vrátit se do %{app}
explanation: S touto e-mailovou adresou jste si již účet na serveru %{host} vytvořili. K jeho aktivaci vám zbývá jedno kliknutí. Pokud jste to nebyli vy, považujte tento e-mail za bezpředmětný.
- explanation_when_pending: S touto e-mailovou adresou jste si již pozvánku na server %{host} vyžádali. Jakmile svou e-mailovou adresu potvrdíte, vaši žádost posoudíme. Můžete se přihlásit, změnit podrobnosti svého účtu nebo ho smazat, ale do schválení účtu nebudete mít k většině funkcí přístup. Pokud bude vaše žádost zamítnuta, vaše data budou odstraněna, a nebude od vás vyžadována žádná další akce. Pokud jste to nebyli vy, považujte tento e-mail za bezpředmětný.
+ explanation_when_pending: Pro tuto e-mailovou adresu bylo požádáno o pozvánku na %{host}. Jakmile svou e-mailovou adresu potvrdíte, vaši žádost posoudíme. Můžete se přihlásit, změnit podrobnosti svého účtu nebo ho smazat, ale do schválení účtu nebudete mít k většině funkcí přístup. Pokud bude vaše žádost zamítnuta, vaše data budou odstraněna, a nebude od vás vyžadována žádná další akce. Pokud jste to nebyli vy, považujte tento e-mail za bezpředmětný.
extra_html: Přečtěte si prosím také pravidla tohoto serveru a naše podmínky používání.
subject: 'Mastodon: Potvrzení účtu na serveru %{instance}'
title: Potvrďte e-mailovou adresu
diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml
index 29489aeb0..7cfae2da6 100644
--- a/config/locales/devise.es.yml
+++ b/config/locales/devise.es.yml
@@ -65,3 +65,51 @@ es:
explanation: La siguiente clave de seguridad ha sido añadida a su cuenta
subject: 'Mastodon: Nueva clave de seguridad'
title: Se ha añadido una nueva clave de seguridad
+ deleted:
+ explanation: La siguiente clave de seguridad ha sido eliminada de tu cuenta
+ subject: 'Mastodon: Clave de seguridad eliminada'
+ title: Una de tus claves de seguridad ha sido eliminada
+ webauthn_disabled:
+ explanation: La autenticación con claves de seguridad ha sido deshabilitada para tu cuenta. Ahora el inicio de sesión solo es posible utilizando el token generado por la aplicación TOTP emparejada.
+ subject: 'Mastodon: Autenticación con claves de seguridad deshabilitada'
+ title: Claves de seguridad deshabilitadas
+ webauthn_enabled:
+ explanation: La autenticación con clave de seguridad ha sido habilitada para tu cuenta. Ahora tu clave de seguridad puede ser utilizada para iniciar sesión.
+ subject: 'Mastodon: Autenticación de clave de seguridad habilitada'
+ title: Claves de seguridad habilitadas
+ omniauth_callbacks:
+ failure: No se te pudo autenticar desde %{kind} porque “%{reason}”.
+ success: Autenticado correctamente desde la cuenta de %{kind}.
+ passwords:
+ no_token: No puedes acceder a esta página si no vienes desde un correo electrónico de restablecimiento de contraseña. Si vienes desde un correo electrónico de restablecimiento de contraseña, por favor asegúrate de utilizar la URL completa proporcionada.
+ send_instructions: Si tu dirección de correo electrónico existe en nuestra base de datos, recibirás un enlace de recuperación de contraseña en tu dirección de correo electrónico en pocos minutos. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico.
+ send_paranoid_instructions: Si tu dirección de correo electrónico existe en nuestra base de datos, recibirás un enlace de recuperación de contraseña en tu dirección de correo electrónico en pocos minutos. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico.
+ updated: Tu contraseña ha sido cambiada con éxito. Has iniciado sesión.
+ updated_not_active: Tu contraseña se ha cambiado con éxito.
+ registrations:
+ destroyed: "¡Hasta otra! Tu cuenta ha sido cancelada con éxito. Esperamos verte de nuevo pronto."
+ signed_up: "¡Bienvenido! Te has registrado correctamente."
+ signed_up_but_inactive: Te has registrado con éxito. Sin embargo, no se ha podido iniciar sesión porque tu cuenta aún no está activada.
+ signed_up_but_locked: Te has registrado con éxito. Sin embargo, no se ha podido iniciar sesión porque tu cuenta está bloqueada.
+ signed_up_but_pending: Un mensaje con un enlace de confirmación ha sido enviado a tu dirección de correo electrónico. Después de hacer clic en el enlace, revisaremos tu solicitud. Serás notificado si se aprueba.
+ signed_up_but_unconfirmed: Un mensaje con un enlace de confirmación ha sido enviado a tu dirección de correo electrónico. Por favor, sigue el enlace para activar tu cuenta. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico.
+ update_needs_confirmation: Has actualizado tu cuenta con éxito, pero necesitamos verificar tu nueva dirección de correo electrónico. Por favor, comprueba tu correo electrónico y sigue el enlace de confirmación para confirmar tu nueva dirección de correo electrónico. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico.
+ updated: Tu cuenta se ha actualizado con éxito.
+ sessions:
+ already_signed_out: Sesión cerrada con éxito.
+ signed_in: Sesión iniciada con éxito.
+ signed_out: Sesión cerrada con éxito.
+ unlocks:
+ send_instructions: En unos minutos recibirás un correo electrónico con instrucciones para desbloquear tu cuenta. Por favor, comprueba tu carpeta de correo no deseado si no recibes dicho correo electrónico.
+ send_paranoid_instructions: Si tu cuenta existe, en unos minutos recibirás un correo electrónico con instrucciones para desbloquearla. Por favor, revisa tu carpeta de correo no deseado si no recibes dicho correo electrónico.
+ unlocked: Tu cuenta ha sido desbloqueada con éxito. Por favor, inicia sesión para continuar.
+ errors:
+ messages:
+ already_confirmed: ya estaba confirmada, por favor intenta iniciar sesión
+ confirmation_period_expired: necesita confirmarse dentro de %{period}, por favor, solicita una nueva
+ expired: ha caducado, por favor solicita una nueva
+ not_found: no encontrado
+ not_locked: no estaba bloqueada
+ not_saved:
+ one: '1 error impidió que este %{resource} se guardase:'
+ other: "%{count} errores impidieron que este %{resource} se guardase:"
diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml
index a60d2e88b..d05985f4d 100644
--- a/config/locales/devise.hu.yml
+++ b/config/locales/devise.hu.yml
@@ -2,19 +2,19 @@
hu:
devise:
confirmations:
- confirmed: Az e-mail címed sikeresen megerősítésre került.
- send_instructions: Pár percen belül kapni fogsz egy e-mailt az e-mail címed megerősítéséhez szükséges lépésekről.
- send_paranoid_instructions: Ha az e-mail címed létezik az adatbázisunkban, pár percen belül kapni fogsz egy e-mailt az e-mail címed megerősítéséhez szükséges lépésekről.
+ confirmed: Az e-mail címedet sikeresen megerősítettük.
+ send_instructions: Néhány percen belül kapni fogsz egy levelet az e-mail cím megerősítésére vonatkozó utasításokkal. Kérjük, ellenőrizd a spam mappádat, ha nem látod az e-mailt a beérkezett e-mailek közt.
+ send_paranoid_instructions: Ha az e-mail címed már szerepel az adatbázisunkban, néhány percen belül kapsz egy levelet az e-mail cím megerősítésére vonatkozó utasításokkal. Kérjük, ellenőrizd a spam mappád, ha nem látod az e-mailt.
failure:
already_authenticated: Már bejelentkeztél.
- inactive: Fiókodat még nem aktiválták.
+ inactive: A fiókod még nincs aktiválva.
invalid: Helytelen %{authentication_keys} vagy jelszó.
- last_attempt: Már csak egy próbálkozásod maradt mielőtt a fiókodat lezárjuk.
- locked: Fiókod le van zárva.
+ last_attempt: Már csak egy próbálkozásod maradt, mielőtt a fiókodat zároljuk.
+ locked: A fiókodat zároltuk.
not_found_in_database: Helytelen %{authentication_keys} vagy jelszó.
- pending: Fiókod még engedélyezés alatt áll.
- timeout: A munkamenet lejárt. Jelentkezz be újra a folytatáshoz.
- unauthenticated: A folytatás előtt be kell jelentkezned.
+ pending: A fiókod még felülvizsgálat alatt áll.
+ timeout: A munkameneted lejárt. Kérjük, a folytatáshoz jelentkezz be újra.
+ unauthenticated: A folytatás előtt be kell jelentkezned vagy regisztrálnod kell.
unconfirmed: A folytatás előtt meg kell erősítened az e-mail címed.
mailer:
confirmation_instructions:
@@ -23,11 +23,11 @@ hu:
explanation: Ezzel az e-mail címmel kezdeményeztek regisztrációt a(z) %{host} oldalon. Csak egy kattintás, és a felhasználói fiókodat aktiváljuk. Ha a regisztrációt nem te kezdeményezted, kérjük tekintsd ezt az e-mailt tárgytalannak.
explanation_when_pending: Ezzel az e-mail címmel meghívást kértél a(z) %{host} oldalon. Ahogy megerősíted az e-mail címed, átnézzük a jelentkezésedet. Ennek ideje alatt nem tudsz belépni. Ha a jelentkezésed elutasítjuk, az adataidat töröljük, más teendőd nincs. Ha a kérelmet nem te kezdeményezted, kérjük tekintsd ezt az e-mailt tárgytalannak.
extra_html: Kérjük tekintsd át a a szerver szabályzatát és a felhasználási feltételeket.
- subject: 'Mastodon: Megerősítési lépések %{instance}'
+ subject: 'Mastodon: Megerősítési lépések ehhez az instancehez: %{instance}'
title: E-mail cím megerősítése
email_changed:
- explanation: 'A fiókodhoz tartozó e-mail címet az alábbira módosítod:'
- extra: Ha nem te kezdeményezted a fiókodhoz tartozó e-mail cím módosítását, valaki hozzáférhetett a fiókodhoz. Legjobb, ha azonnal megváltoztatod a jelszavadat; ha nem férsz hozzá a fiókodhoz, vedd fel a kapcsolatot a szervered adminisztrátorával.
+ explanation: 'A fiókodhoz tartozó e-mail cím a következőre változik:'
+ extra: Ha nem változtattad meg az e-mail címed, akkor valószínű, hogy valaki hozzáférhetett a fiókodhoz. Kérjük, azonnal változtasd meg a jelszavadat, vagy lépj kapcsolatba a szerver adminisztrátorával, ha ki vagy zárva a fiókodból.
subject: 'Mastodon: a fiókodhoz tartozó e-mail címet megváltoztattuk'
title: Új e-mail cím
password_change:
@@ -47,11 +47,11 @@ hu:
subject: 'Mastodon: Jelszó visszaállítási lépések'
title: Jelszó visszaállítása
two_factor_disabled:
- explanation: A fiókod kétlépcsős hitelesítését letiltottuk. A bejelentkezés most már csak e-mail címmel és jelszóval lehetséges.
- subject: Kétlépcsős azonosítás letiltva
- title: Kétlépcsős hitelesítés engedélyezve
+ explanation: A fiókod kétlépcsős hitelesítését kikapcsoltuk. A bejelentkezés mostantól csak az e-mail cím és a jelszó használatával lesz lehetséges.
+ subject: Kétlépcsős azonosítás kikapcsolva
+ title: Kétlépcsős hitelesítés kikapcsolva
two_factor_enabled:
- explanation: Kétlépcsős hitelesítés engedélyezve van a fiókodban. Bejelentkezéshez a párosított TOTP alkalmazás által létrehozott tokenre lesz szükség.
+ explanation: A kétlépcsős hitelesítést engedélyeztük a fiókodban. A bejelentkezéshez a párosított TOTP alkalmazás által generált tokenre lesz szükség.
subject: Kétlépcsős azonosítás engedélyezve
title: Kétlépcsős hitelesítés engedélyezve
two_factor_recovery_codes_changed:
@@ -91,8 +91,8 @@ hu:
signed_up: Üdvözlünk! Sikeresen regisztráltál.
signed_up_but_inactive: Sikeresen regisztráltál. Ennek ellenére nem tudunk beléptetni, ugyanis a fiókodat még nem aktiválták.
signed_up_but_locked: Sikeresen regisztráltál. Ennek ellenére nem tudunk beléptetni, ugyanis a fiókod le van zárva.
- signed_up_but_pending: Egy üzenetet a megerősítési linkkel kiküldtünk az e-mail címedre. Ha kattintasz a linkre, átnézzük a kérelmedet. Értesítünk, ha jóváhagytuk.
- signed_up_but_unconfirmed: Egy üzenetet a megerősítési linkkel kiküldtünk az e-mail címedre. Kérjük használd a linket a fiókod aktiválásához.
+ signed_up_but_pending: Egy megerősítési hivatkozással ellátott üzenetet kiküldtünk az e-mail címedre. Ha kattintasz a hivatkozásra, átnézzük a kérelmedet. Értesítünk, ha jóváhagytuk.
+ signed_up_but_unconfirmed: Egy megerősítési hivatkozással ellátott üzenetet kiküldtünk az e-mail címedre. Kérjük használd a hivatkozást a fiókod aktiválásához. Ellenőrizd a spam mappádat, ha nem kaptad meg ezt a levelet.
update_needs_confirmation: Sikeresen frissítetted a fiókodat, de szükségünk van az e-mail címed megerősítésére. Kérlek ellenőrizd az e-mailedet és kövesd a levélben szereplő megerősítési linket az e-mail címed megerősítéséhez. Ellenőrizd a levélszemét mappád, ha nem kaptál volna ilyen levelet.
updated: Fiókod frissítése sikeres.
sessions:
diff --git a/config/locales/devise.it.yml b/config/locales/devise.it.yml
index 31e3c7f94..53e8169e4 100644
--- a/config/locales/devise.it.yml
+++ b/config/locales/devise.it.yml
@@ -20,7 +20,7 @@ it:
confirmation_instructions:
action: Verifica indirizzo email
action_with_app: Conferma e torna a %{app}
- explanation: Hai creato un account su %{host} con questo indirizzo email. Sei lonatno solo un clic dall'attivarlo. Se non sei stato tu, per favore ignora questa email.
+ explanation: Hai creato un account su %{host} con questo indirizzo email. Sei lontano solo un clic dall'attivarlo. Se non sei stato tu, per favore ignora questa email.
explanation_when_pending: Hai richiesto un invito a %{host} con questo indirizzo email. Una volta confermato il tuo indirizzo e-mail, analizzeremo la tua richiesta. Non potrai eseguire l'accesso fino a quel momento. Se la tua richiesta sarà rifiutata, i tuoi dati saranno rimossi, quindi nessun'altra azione ti sarà richiesta. Se non fossi stato tu, per favore ignora questa email.
extra_html: Per favore controllale regole del server e i nostri termini di servizio.
subject: 'Mastodon: Istruzioni di conferma per %{instance}'
diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml
index a83070893..e727e47c7 100644
--- a/config/locales/devise.zh-CN.yml
+++ b/config/locales/devise.zh-CN.yml
@@ -13,9 +13,9 @@ zh-CN:
locked: 你的帐户已被锁定。
not_found_in_database: "%{authentication_keys}或密码错误。"
pending: 你的帐号仍在审核中。
- timeout: 您的会话已过期。请重新登录再继续操作。
+ timeout: 你的会话已过期。请重新登录再继续操作。
unauthenticated: 继续操作前请注册或者登录。
- unconfirmed: 您必须先确认您的电子邮件地址才能继续。
+ unconfirmed: 你必须先确认你的电子邮件地址才能继续。
mailer:
confirmation_instructions:
action: 验证电子邮件地址
@@ -62,19 +62,19 @@ zh-CN:
subject: Mastodon:帐户解锁信息
webauthn_credential:
added:
- explanation: 以下安全密钥已添加到您的帐户
+ explanation: 以下安全密钥已添加到你的帐户
subject: Mastodon:新的安全密钥
title: 已添加一个新的安全密钥
deleted:
- explanation: 以下安全密钥已从您的账户中删除
+ explanation: 以下安全密钥已从你的账户中删除
subject: Mastodon:安全密钥已删除
- title: 您的安全密钥之一已被删除
+ title: 你的安全密钥之一已被删除
webauthn_disabled:
- explanation: 您的帐户已禁用安全密钥认证。现在只能使用配对的 TOTP 应用程序生成的令牌登录。
+ explanation: 你的帐户已禁用安全密钥认证。现在只能使用配对的 TOTP 应用程序生成的令牌登录。
subject: Mastodon:安全密钥认证已禁用
title: 安全密钥已禁用
webauthn_enabled:
- explanation: 您的帐户已启用安全密钥身份验证。您的安全密钥现在可以用于登录。
+ explanation: 你的帐户已启用安全密钥身份验证。你的安全密钥现在可以用于登录。
subject: Mastodon:安全密钥认证已启用
title: 已启用安全密钥
omniauth_callbacks:
diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml
index 13b3df74b..120a21b65 100644
--- a/config/locales/doorkeeper.cs.yml
+++ b/config/locales/doorkeeper.cs.yml
@@ -138,12 +138,12 @@ cs:
read:notifications: vidět vaše oznámení
read:reports: vidět vaše hlášení
read:search: vyhledávat za vás
- read:statuses: vidět všechny tooty
+ read:statuses: vidět všechny příspěvky
write: měnit všechna data vašeho účtu
write:accounts: měnit váš profil
write:blocks: blokovat účty a domény
- write:bookmarks: přidávat tooty do záložek
- write:favourites: označovat tooty jako oblíbené
+ write:bookmarks: přidávat příspěvky do záložek
+ write:favourites: oblibovat si příspěvky
write:filters: vytvářet filtry
write:follows: sledovat lidi
write:lists: vytvářet seznamy
@@ -151,4 +151,4 @@ cs:
write:mutes: skrývat lidi a konverzace
write:notifications: mazat vaše oznámení
write:reports: nahlašovat jiné uživatele
- write:statuses: zveřejňovat tooty
+ write:statuses: zveřejňovat příspěvky
diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml
index ec322f071..8aa099284 100644
--- a/config/locales/doorkeeper.en.yml
+++ b/config/locales/doorkeeper.en.yml
@@ -138,12 +138,12 @@ en:
read:notifications: see your notifications
read:reports: see your reports
read:search: search on your behalf
- read:statuses: see all statuses
+ read:statuses: see all posts
write: modify all your account's data
write:accounts: modify your profile
write:blocks: block accounts and domains
- write:bookmarks: bookmark statuses
- write:favourites: favourite statuses
+ write:bookmarks: bookmark posts
+ write:favourites: favourite posts
write:filters: create filters
write:follows: follow people
write:lists: create lists
@@ -151,4 +151,4 @@ en:
write:mutes: mute people and conversations
write:notifications: clear your notifications
write:reports: report other people
- write:statuses: publish statuses
+ write:statuses: publish posts
diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml
index a55b83e8f..e3bb4d91f 100644
--- a/config/locales/doorkeeper.es.yml
+++ b/config/locales/doorkeeper.es.yml
@@ -83,6 +83,10 @@ es:
invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado.
invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente.
invalid_redirect_uri: La URI de redirección incluida no es válida.
+ invalid_request:
+ missing_param: 'Falta este parámetro requerido: %{value}.'
+ request_not_authorized: La solicitud debe ser autorizada. Hay un parámetro requerido para autorizar la solicitud que falta o no es válido.
+ unknown: Falta un parámetro requerido en la solicitud, o esta incluye un valor no admitido de parámetro, o bien está mal formulada.
invalid_resource_owner: Las credenciales proporcionadas del propietario del recurso no son válidas, o el propietario del recurso no puede ser encontrado
invalid_scope: El ámbito pedido es inválido, desconocido o erróneo.
invalid_token:
diff --git a/config/locales/doorkeeper.gd.yml b/config/locales/doorkeeper.gd.yml
index 0d06b9264..4b3bccf67 100644
--- a/config/locales/doorkeeper.gd.yml
+++ b/config/locales/doorkeeper.gd.yml
@@ -138,12 +138,12 @@ gd:
read:notifications: na brathan agad faicinn
read:reports: na gearanan agad fhaicinn
read:search: lorg a dhèanamh às do leth
- read:statuses: na staidean uile fhaicinn
+ read:statuses: na postaichean uile fhaicinn
write: dàta sam bith a’ cunntais agad atharrachadh
write:accounts: a’ phròifil agad atharrachadh
write:blocks: cunntasan is àrainnean a bhacadh
- write:bookmarks: comharran-lìn a dhèanamh de staidean
- write:favourites: staidean a chur ris na h-annsachdan
+ write:bookmarks: comharran-lìn a dhèanamh de phostaichean
+ write:favourites: postaichean a chur ris na h-annsachdan
write:filters: criathragan a chruthachadh
write:follows: leantainn air daoine
write:lists: liostaichean a chruthachadh
@@ -151,4 +151,4 @@ gd:
write:mutes: daoine is còmhraidhean a mhùchadh
write:notifications: na brathan agad fhalamhachadh
write:reports: gearan a dhèanamh mu chàch
- write:statuses: staidean fhoillseachadh
+ write:statuses: postaichean fhoillseachadh
diff --git a/config/locales/doorkeeper.hu.yml b/config/locales/doorkeeper.hu.yml
index e65a66618..644f71c57 100644
--- a/config/locales/doorkeeper.hu.yml
+++ b/config/locales/doorkeeper.hu.yml
@@ -119,8 +119,8 @@ hu:
title: OAuth engedély szükséges
scopes:
admin:read: szerver minden adatának olvasása
- admin:read:accounts: minden érzékeny fiókadat olvasása
- admin:read:reports: minden bejelentés és bejelentett fiók érzékeny adatainak olvasása
+ admin:read:accounts: minden kényes fiókadat olvasása
+ admin:read:reports: minden bejelentés és bejelentett fiók kényes adatainak olvasása
admin:write: szerver minden adatának változtatása
admin:write:accounts: moderációs műveletek végzése fiókokon
admin:write:reports: moderációs műveletek végzése bejelentéseken
@@ -138,12 +138,12 @@ hu:
read:notifications: értesítések megtekintése
read:reports: bejelentések megtekintése
read:search: nevedben keresés
- read:statuses: tülkök megtekintése
+ read:statuses: bejegyzések megtekintése
write: fiókod adatainak megváltoztatása
write:accounts: profilod megváltoztatása
write:blocks: fiókok és domainek letiltása
- write:bookmarks: könyvjelzők állapota
- write:favourites: tülkök kedvencnek jelölése
+ write:bookmarks: bejegyzések könyvjelzőzése
+ write:favourites: bejegyzések kedvencnek jelölése
write:filters: szűrők létrehozása
write:follows: mások követése
write:lists: listák létrehozása
@@ -151,4 +151,4 @@ hu:
write:mutes: emberek és beszélgetések némítása
write:notifications: értesítések törlése
write:reports: mások bejelentése
- write:statuses: tülkök közzététele
+ write:statuses: bejegyzések közzététele
diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml
index d20825c24..1bc8dc684 100644
--- a/config/locales/doorkeeper.ja.yml
+++ b/config/locales/doorkeeper.ja.yml
@@ -138,12 +138,12 @@ ja:
read:notifications: 通知の読み取り
read:reports: 通報の読み取り
read:search: あなたの代わりに検索
- read:statuses: すべてのトゥートの読み取り
+ read:statuses: すべての投稿の読み取り
write: アカウントのすべてのデータの変更
write:accounts: プロフィールの変更
write:blocks: ユーザーのブロックやドメインの非表示
- write:bookmarks: トゥートのブックマーク登録
- write:favourites: トゥートのお気に入り登録
+ write:bookmarks: 投稿のブックマーク登録
+ write:favourites: 投稿のお気に入り登録
write:filters: フィルターの変更
write:follows: あなたの代わりにフォロー、アンフォロー
write:lists: リストの変更
@@ -151,4 +151,4 @@ ja:
write:mutes: アカウントや会話のミュート
write:notifications: 通知の消去
write:reports: 通報の作成
- write:statuses: トゥートの投稿
+ write:statuses: 投稿の送信
diff --git a/config/locales/doorkeeper.sc.yml b/config/locales/doorkeeper.sc.yml
index 667268f41..db857affd 100644
--- a/config/locales/doorkeeper.sc.yml
+++ b/config/locales/doorkeeper.sc.yml
@@ -143,7 +143,7 @@ sc:
write:accounts: modificare su profilu tuo
write:blocks: blocare contos e domìnios
write:bookmarks: agiùnghere is istados a is sinnalibros
- write:favourites: pònnere istados in is preferidos
+ write:favourites: pone istados in is preferidos
write:filters: creare filtros
write:follows: sighire persones
write:lists: creare listas
diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml
index 7703646c5..54ca4dc14 100644
--- a/config/locales/doorkeeper.th.yml
+++ b/config/locales/doorkeeper.th.yml
@@ -125,12 +125,12 @@ th:
read:notifications: ดูการแจ้งเตือนของคุณ
read:reports: ดูรายงานของคุณ
read:search: ค้นหาในนามของคุณ
- read:statuses: ดูสถานะทั้งหมด
+ read:statuses: ดูโพสต์ทั้งหมด
write: ปรับเปลี่ยนข้อมูลบัญชีทั้งหมดของคุณ
write:accounts: ปรับเปลี่ยนโปรไฟล์ของคุณ
write:blocks: ปิดกั้นบัญชีและโดเมน
- write:bookmarks: เพิ่มที่คั่นหน้าสถานะ
- write:favourites: ชื่นชอบสถานะ
+ write:bookmarks: เพิ่มที่คั่นหน้าโพสต์
+ write:favourites: ชื่นชอบโพสต์
write:filters: สร้างตัวกรอง
write:follows: ติดตามผู้คน
write:lists: สร้างรายการ
@@ -138,4 +138,4 @@ th:
write:mutes: ซ่อนผู้คนและการสนทนา
write:notifications: ล้างการแจ้งเตือนของคุณ
write:reports: รายงานผู้คนอื่น ๆ
- write:statuses: เผยแพร่สถานะ
+ write:statuses: เผยแพร่โพสต์
diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml
index fae700282..97cc26854 100644
--- a/config/locales/doorkeeper.vi.yml
+++ b/config/locales/doorkeeper.vi.yml
@@ -75,7 +75,7 @@ vi:
created_at: Đã cho phép
date_format: "%Y-%m-%d %H:%M:%S"
scopes: Quyền hạn
- title: Các ứng dụng mà bạn cho phép
+ title: Các ứng dụng đang cho phép
errors:
messages:
access_denied: Chủ sở hữu tài nguyên hoặc máy chủ đã từ chối yêu cầu.
@@ -109,7 +109,7 @@ vi:
notice: Ứng dụng cập nhật.
authorized_applications:
destroy:
- notice: Ứng dụng bị gỡ.
+ notice: Đã gỡ bỏ ứng dụng.
layouts:
admin:
nav:
diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml
index 79b56ffd9..23d424f12 100644
--- a/config/locales/doorkeeper.zh-CN.yml
+++ b/config/locales/doorkeeper.zh-CN.yml
@@ -38,7 +38,7 @@ zh-CN:
application: 应用
callback_url: 回调 URL
delete: 删除
- empty: 您没有申请。
+ empty: 你没有申请。
name: 名称
new: 创建新应用
scopes: 权限范围
@@ -129,12 +129,12 @@ zh-CN:
read: 读取你的帐户数据
read:accounts: 查看账号信息
read:blocks: 查看你的屏蔽列表
- read:bookmarks: 查看您的书签
+ read:bookmarks: 查看你的书签
read:favourites: 查看喜欢的嘟文
read:filters: 查看你的过滤器
read:follows: 查看你的关注
read:lists: 查看你的列表
- read:mutes: 查看你的隐藏列表
+ read:mutes: 查看你的静音列表
read:notifications: 查看你的通知
read:reports: 查看你的报告
read:search: 以你的身份搜索
@@ -148,7 +148,7 @@ zh-CN:
write:follows: 关注其他人
write:lists: 创建列表
write:media: 上传媒体文件
- write:mutes: 隐藏用户和对话
+ write:mutes: 静音用户和对话
write:notifications: 清除你的通知
write:reports: 报告他人
write:statuses: 发表嘟文
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 441a7c0dc..54b21660f 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1443,7 +1443,7 @@ en:
edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account.
explanation: Here are some tips to get you started
final_action: Start posting
- final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.'
+ final_step: 'Start posting! Even without followers your public posts may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.'
full_handle: Your full handle
full_handle_hint: This is what you would tell your friends so they can message or follow you from another server.
review_preferences_action: Change preferences
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 0890512e8..a7dc45892 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -7,6 +7,7 @@ es-MX:
active_count_after: activo
active_footnote: Usuarios Activos Mensuales (UAM)
administered_by: 'Administrado por:'
+ api: API
apps: Aplicaciones móviles
apps_platforms: Utiliza Mastodon desde iOS, Android y otras plataformas
browse_directory: Navega por el directorio de perfiles y filtra por intereses
@@ -14,6 +15,7 @@ es-MX:
browse_public_posts: Navega por un transmisión en vivo de publicaciones públicas en Mastodon
contact: Contacto
contact_missing: No especificado
+ contact_unavailable: No disponible
discover_users: Descubrir usuarios
documentation: Documentación
federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodon y más allá.
@@ -80,6 +82,7 @@ es-MX:
posts_with_replies: Toots con respuestas
roles:
admin: Administrador
+ bot: Bot
group: Grupo
moderator: Moderador
unavailable: Perfil no disponible
@@ -99,6 +102,7 @@ es-MX:
approve_all: Aprobar todos
approved_msg: La solicitud de registro de %{username} ha sido aprobada correctamente
are_you_sure: "¿Estás seguro?"
+ avatar: Avatar
by_domain: Dominio
change_email:
changed_msg: "¡El correo electrónico se ha actualizado correctamente!"
@@ -131,9 +135,11 @@ es-MX:
inbox_url: URL de la bandeja de entrada
invite_request_text: Razones para unirse
invited_by: Invitado por
+ ip: IP
joined: Unido
location:
all: Todos
+ local: Local
remote: Remoto
title: Localización
login_status: Estado del login
@@ -210,6 +216,7 @@ es-MX:
username: Nombre de usuario
view_domain: Ver resumen del dominio
warn: Adevertir
+ web: Web
whitelisted: Añadido a la lista blanca
action_logs:
action_types:
@@ -223,6 +230,7 @@ es-MX:
create_domain_block: Crear Bloqueo de Dominio
create_email_domain_block: Crear Bloqueo de Dominio de Correo Electrónico
create_ip_block: Crear regla IP
+ create_unavailable_domain: Crear Dominio No Disponible
demote_user: Degradar Usuario
destroy_announcement: Eliminar Anuncio
destroy_custom_emoji: Eliminar Emoji Personalizado
@@ -231,6 +239,7 @@ es-MX:
destroy_email_domain_block: Eliminar Bloqueo de Dominio de Correo Electrónico
destroy_ip_block: Eliminar regla IP
destroy_status: Eliminar Estado
+ destroy_unavailable_domain: Eliminar Dominio No Disponible
disable_2fa_user: Deshabilitar 2FA
disable_custom_emoji: Deshabilitar Emoji Personalizado
disable_user: Deshabilitar Usuario
@@ -264,6 +273,7 @@ es-MX:
create_domain_block_html: "%{name} bloqueó el dominio %{target}"
create_email_domain_block_html: "%{name} bloqueó el dominio de correo electrónico %{target}"
create_ip_block_html: "%{name} creó una regla para la IP %{target}"
+ create_unavailable_domain_html: "%{name} detuvo las entregas al dominio %{target}"
demote_user_html: "%{name} degradó al usuario %{target}"
destroy_announcement_html: "%{name} eliminó el anuncio %{target}"
destroy_custom_emoji_html: "%{name} destruyó emoji %{target}"
@@ -272,6 +282,7 @@ es-MX:
destroy_email_domain_block_html: "%{name} desbloqueó el dominio de correo electrónico %{target}"
destroy_ip_block_html: "%{name} eliminó una regla para la IP %{target}"
destroy_status_html: "%{name} eliminó el estado por %{target}"
+ destroy_unavailable_domain_html: "%{name} reanudó las entregas al dominio %{target}"
disable_2fa_user_html: "%{name} desactivó el requisito de dos factores para el usuario %{target}"
disable_custom_emoji_html: "%{name} desactivó el emoji %{target}"
disable_user_html: "%{name} deshabilitó el inicio de sesión para el usuario %{target}"
@@ -313,7 +324,7 @@ es-MX:
scheduled_for: Programado para %{time}
scheduled_msg: "¡Anuncio programado para su publicación!"
title: Anuncios
- unpublish: Eliminar publicación
+ unpublish: Retirar publicación
unpublished_msg: "¡Anuncio despublicado con éxito!"
updated_msg: "¡Anuncio actualizado con éxito!"
custom_emojis:
@@ -329,6 +340,7 @@ es-MX:
disable: Deshabilitar
disabled: Desactivado
disabled_msg: Se deshabilitó con éxito ese emoji
+ emoji: Emoji
enable: Habilitar
enabled: Activado
enabled_msg: Se habilitó con éxito ese emoji
@@ -366,6 +378,7 @@ es-MX:
recent_users: Usuarios recientes
search: Búsqueda por texto completo
single_user_mode: Modo único usuario
+ software: Software
space: Uso de almacenamiento
title: Tablero
total_users: usuarios en total
@@ -434,16 +447,33 @@ es-MX:
title: Nueva entrada en la lista negra de correo
title: Lista negra de correo
follow_recommendations:
- description_html: "Las recomendaciones de cuentas a las que seguir ayudan a los nuevos usuarios a encontrar rápidamente contenido interesante. Cuando un usuario no ha interactuado con otros lo suficiente como para formar recomendaciones personalizadas de seguimiento, estas cuentas se recomiendan en su lugar. Se recalculan diariamente a partir de una mezcla de cuentas con las interacciones más recientes y el mayor número de seguidores para un idioma determinado."
+ description_html: "Las recomendaciones de cuentas ayudan a los nuevos usuarios a encontrar rápidamente contenido interesante. Cuando un usuario no ha interactuado con otros lo suficiente como para suscitar recomendaciones personalizadas de cuentas a las que seguir, en su lugar se le recomiendan estas cuentas. Se recalculan diariamente a partir de una mezcla de cuentas con el mayor número de interacciones recientes y con el mayor número de seguidores locales con un idioma determinado."
language: Para el idioma
status: Estado
- suppress: Eliminar recomendación de cuentas a las que seguir
- suppressed: Eliminado
- title: Recomendaciones de cuentas a las que seguir
- unsuppress: Restaurar recomendaciones de cuentas a las que seguir
+ suppress: Suprimir recomendación de cuentas
+ suppressed: Suprimida
+ title: Recomendaciones de cuentas
+ unsuppress: Restaurar recomendaciones de cuentas
instances:
+ back_to_all: Todos
+ back_to_limited: Limitados
+ back_to_warning: Advertencia
by_domain: Dominio
+ delivery:
+ all: Todos
+ clear: Limpiar errores de entrega
+ restart: Reiniciar entrega
+ stop: Detener entrega
+ title: Entrega
+ unavailable: No disponible
+ unavailable_message: Entrega no disponible
+ warning: Advertencia
+ warning_message:
+ one: Fallo de entrega %{count} día
+ other: Fallo de entrega %{count} días
delivery_available: Entrega disponible
+ delivery_error_days: Días de error de entrega
+ delivery_error_hint: Si la entrega no es posible a lo largo de %{count} días, se marcará automáticamente como no entregable.
empty: No se encontraron dominios.
known_accounts:
one: "%{count} cuenta conocida"
@@ -546,9 +576,9 @@ es-MX:
rules:
add_new: Añadir norma
delete: Eliminar
- description_html: Aunque la mayoría de las afirmaciones de haber leído y aceptado los términos de servicio, normalmente la gente no los lee hasta después de que surja un problema. Haz que sea más fácil ver las reglas de tu servidor de un vistazo, proporcionándolas en una lista de puntos. Intenta mantener reglas individuales cortas y sencillas, pero intenta no dividirlas en muchos objetos separados.
+ description_html: Aunque la mayoría afirma haber leído y estar de acuerdo con los términos de servicio, la gente normalmente no los lee hasta después de que surja algún problema. Haz que sea más fácil ver las normas de tu servidor de un vistazo estipulándolas en una lista de puntos. Intenta que cada norma sea corta y sencilla, pero sin estar divididas en muchos puntos.
edit: Editar norma
- empty: Aún no se han definido reglas del servidor.
+ empty: Aún no se han definido las normas del servidor.
title: Normas del servidor
settings:
activity_api_enabled:
@@ -671,6 +701,7 @@ es-MX:
last_active: Última actividad
most_popular: Más popular
most_recent: Más reciente
+ name: Hashtag
review: Estado de revisión
reviewed: Revisado
title: Etiquetas
@@ -683,7 +714,7 @@ es-MX:
add_new: Añadir nuevo
delete: Borrar
edit_preset: Editar aviso predeterminado
- empty: Aún no ha definido ninguna advertencia predefinida.
+ empty: Aún no has definido ningún preajuste de advertencia.
title: Editar configuración predeterminada de avisos
admin_mailer:
new_pending_account:
@@ -717,6 +748,7 @@ es-MX:
toot_layout: Diseño de los toots
application_mailer:
notification_preferences: Cambiar preferencias de correo electrónico
+ salutation: "%{name}:"
settings: 'Cambiar preferencias de correo: %{link}'
view: 'Vista:'
view_profile: Ver perfil
@@ -751,6 +783,9 @@ es-MX:
migrate_account: Mudarse a otra cuenta
migrate_account_html: Si deseas redireccionar esta cuenta a otra distinta, puedes configurarlo aquí.
or_log_in_with: O inicia sesión con
+ providers:
+ cas: CAS
+ saml: SAML
register: Registrarse
registration_closed: "%{instance} no está aceptando nuevos miembros"
resend_confirmation: Volver a enviar el correo de confirmación
@@ -791,15 +826,24 @@ es-MX:
errors:
invalid_key: no es una clave Ed25519 o Curve25519 válida
invalid_signature: no es una firma Ed25519 válida
+ date:
+ formats:
+ default: "%d %b %Y"
+ with_month_name: "%d %B %Y"
datetime:
distance_in_words:
+ about_x_hours: "%{count} h"
about_x_months: "%{count}m"
about_x_years: "%{count}a"
almost_x_years: "%{count}a"
half_a_minute: Justo ahora
+ less_than_x_minutes: "%{count} m"
less_than_x_seconds: Justo ahora
over_x_years: "%{count}a"
+ x_days: "%{count} d"
+ x_minutes: "%{count} m"
x_months: "%{count}m"
+ x_seconds: "%{count} s"
deletes:
challenge_not_passed: Los datos introducidos son incorrectos
confirm_password: Ingresa tu contraseña actual para demostrar tu identidad
@@ -851,6 +895,7 @@ es-MX:
size: Tamaño
blocks: Personas que has bloqueado
bookmarks: Marcadores
+ csv: CSV
domain_blocks: Bloqueos de dominios
lists: Listas
mutes: Tienes en silencio
@@ -1046,8 +1091,13 @@ es-MX:
number:
human:
decimal_units:
+ format: "%n %u"
units:
+ billion: MM
+ million: M
+ quadrillion: MB
thousand: m
+ trillion: B
otp_authentication:
code_hint: Introduce el código generado por tu aplicación de autentificación para confirmar
description_html: Si habilitas autenticación de dos factores a través de una aplicación de autenticación, el ingreso requerirá que estés en posesión de tu teléfono, que generará códigos para que ingreses.
@@ -1061,6 +1111,7 @@ es-MX:
next: Próximo
older: Más antiguo
prev: Anterior
+ truncate: "…"
polls:
errors:
already_voted: Ya has votado en esta encuesta
@@ -1122,15 +1173,40 @@ es-MX:
activity: Última actividad
browser: Navegador
browsers:
+ alipay: Alipay
+ blackberry: Blackberry
+ chrome: Chrome
+ edge: Microsoft Edge
+ electron: Electron
+ firefox: Firefox
generic: Desconocido
+ ie: Internet Explorer
+ micro_messenger: MicroMessenger
nokia: Navegador de Nokia S40 Ovi
+ opera: Opera
+ otter: Otter
+ phantom_js: PhantomJS
qq: Navegador QQ
+ safari: Safari
+ uc_browser: UCBrowser
+ weibo: Weibo
current_session: Sesión actual
description: "%{browser} en %{platform}"
explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon.
+ ip: IP
platforms:
+ adobe_air: Adobe Air
+ android: Android
+ blackberry: Blackberry
+ chrome_os: ChromeOS
+ firefox_os: Firefox OS
+ ios: iOS
+ linux: GNU Linux
mac: Mac
other: Desconocido
+ windows: Windows
+ windows_mobile: Windows Mobile
+ windows_phone: Windows Phone
revoke: Revocar
revoke_success: Sesión revocada exitosamente
title: Sesiones
@@ -1158,6 +1234,9 @@ es-MX:
webauthn_authentication: Claves de seguridad
statuses:
attached:
+ audio:
+ one: "%{count} audio"
+ other: "%{count} audios"
description: 'Adjunto: %{attached}'
image:
one: "%{count} imagen"
@@ -1193,8 +1272,9 @@ es-MX:
show_older: Mostrar más antiguos
show_thread: Mostrar discusión
sign_in_to_participate: Regístrate para participar en la conversación
+ title: "%{name}: «%{quote}»"
visibilities:
- direct: Directo
+ direct: Directa
private: Sólo mostrar a seguidores
private_long: Solo mostrar a tus seguidores
public: Público
@@ -1297,6 +1377,7 @@ es-MX:
time:
formats:
default: "%d de %b del %Y, %H:%M"
+ month: "%b %Y"
two_factor_authentication:
add: Añadir
disable: Deshabilitar
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 0f8984863..9f2f593ce 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -7,6 +7,7 @@ es:
active_count_after: activo
active_footnote: Usuarios Activos Mensuales (UAM)
administered_by: 'Administrado por:'
+ api: API
apps: Aplicaciones móviles
apps_platforms: Utiliza Mastodon desde iOS, Android y otras plataformas
browse_directory: Navega por el directorio de perfiles y filtra por intereses
@@ -14,6 +15,7 @@ es:
browse_public_posts: Navega por un transmisión en vivo de publicaciones públicas en Mastodon
contact: Contacto
contact_missing: No especificado
+ contact_unavailable: No disponible
discover_users: Descubrir usuarios
documentation: Documentación
federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodon y más allá.
@@ -80,6 +82,7 @@ es:
posts_with_replies: Publicaciones y respuestas
roles:
admin: Administrador
+ bot: Bot
group: Grupo
moderator: Moderador
unavailable: Perfil no disponible
@@ -99,6 +102,7 @@ es:
approve_all: Aprobar todos
approved_msg: La solicitud de registro de %{username} ha sido aprobada correctamente
are_you_sure: "¿Estás seguro?"
+ avatar: Avatar
by_domain: Dominio
change_email:
changed_msg: "¡El correo electrónico se ha actualizado correctamente!"
@@ -131,9 +135,11 @@ es:
inbox_url: URL de la bandeja de entrada
invite_request_text: Razones para unirse
invited_by: Invitado por
+ ip: IP
joined: Unido
location:
all: Todos
+ local: Local
remote: Remoto
title: Localización
login_status: Estado del login
@@ -210,6 +216,7 @@ es:
username: Nombre de usuario
view_domain: Ver resumen del dominio
warn: Adevertir
+ web: Web
whitelisted: Añadido a la lista blanca
action_logs:
action_types:
@@ -333,6 +340,7 @@ es:
disable: Deshabilitar
disabled: Desactivado
disabled_msg: Se deshabilitó con éxito ese emoji
+ emoji: Emoji
enable: Habilitar
enabled: Activado
enabled_msg: Se habilitó con éxito ese emoji
@@ -370,6 +378,7 @@ es:
recent_users: Usuarios recientes
search: Búsqueda por texto completo
single_user_mode: Modo único usuario
+ software: Software
space: Uso de almacenamiento
title: Tablero
total_users: usuarios en total
@@ -692,6 +701,7 @@ es:
last_active: Última actividad
most_popular: Más popular
most_recent: Más reciente
+ name: Hashtag
review: Estado de revisión
reviewed: Revisado
title: Etiquetas
@@ -738,6 +748,7 @@ es:
toot_layout: Diseño de las publicaciones
application_mailer:
notification_preferences: Cambiar preferencias de correo electrónico
+ salutation: "%{name}:"
settings: 'Cambiar preferencias de correo: %{link}'
view: 'Vista:'
view_profile: Ver perfil
@@ -772,6 +783,9 @@ es:
migrate_account: Mudarse a otra cuenta
migrate_account_html: Si deseas redireccionar esta cuenta a otra distinta, puedes configurarlo aquí.
or_log_in_with: O inicia sesión con
+ providers:
+ cas: CAS
+ saml: SAML
register: Registrarse
registration_closed: "%{instance} no está aceptando nuevos miembros"
resend_confirmation: Volver a enviar el correo de confirmación
@@ -812,15 +826,24 @@ es:
errors:
invalid_key: no es una clave Ed25519 o Curve25519 válida
invalid_signature: no es una firma Ed25519 válida
+ date:
+ formats:
+ default: "%d %b %Y"
+ with_month_name: "%d %B %Y"
datetime:
distance_in_words:
+ about_x_hours: "%{count} h"
about_x_months: "%{count}m"
about_x_years: "%{count}a"
almost_x_years: "%{count}a"
half_a_minute: Justo ahora
+ less_than_x_minutes: "%{count} m"
less_than_x_seconds: Justo ahora
over_x_years: "%{count}a"
+ x_days: "%{count} d"
+ x_minutes: "%{count} m"
x_months: "%{count}m"
+ x_seconds: "%{count} s"
deletes:
challenge_not_passed: Los datos introducidos son incorrectos
confirm_password: Ingresa tu contraseña actual para demostrar tu identidad
@@ -872,6 +895,7 @@ es:
size: Tamaño
blocks: Personas que has bloqueado
bookmarks: Marcadores
+ csv: CSV
domain_blocks: Bloqueos de dominios
lists: Listas
mutes: Tienes en silencio
@@ -1067,8 +1091,13 @@ es:
number:
human:
decimal_units:
+ format: "%n %u"
units:
+ billion: MM
+ million: M
+ quadrillion: MB
thousand: m
+ trillion: B
otp_authentication:
code_hint: Introduce el código generado por tu aplicación de autentificación para confirmar
description_html: Si habilitas autenticación de dos factores a través de una aplicación de autenticación, el ingreso requerirá que estés en posesión de tu teléfono, que generará códigos para que ingreses.
@@ -1082,6 +1111,7 @@ es:
next: Próximo
older: Más antiguo
prev: Anterior
+ truncate: "…"
polls:
errors:
already_voted: Ya has votado en esta encuesta
@@ -1143,15 +1173,40 @@ es:
activity: Última actividad
browser: Navegador
browsers:
+ alipay: Alipay
+ blackberry: Blackberry
+ chrome: Chrome
+ edge: Microsoft Edge
+ electron: Electron
+ firefox: Firefox
generic: Desconocido
+ ie: Internet Explorer
+ micro_messenger: MicroMessenger
nokia: Navegador de Nokia S40 Ovi
+ opera: Opera
+ otter: Otter
+ phantom_js: PhantomJS
qq: Navegador QQ
+ safari: Safari
+ uc_browser: UCBrowser
+ weibo: Weibo
current_session: Sesión actual
description: "%{browser} en %{platform}"
explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon.
+ ip: IP
platforms:
+ adobe_air: Adobe Air
+ android: Android
+ blackberry: Blackberry
+ chrome_os: ChromeOS
+ firefox_os: Firefox OS
+ ios: iOS
+ linux: GNU Linux
mac: Mac
other: Desconocido
+ windows: Windows
+ windows_mobile: Windows Mobile
+ windows_phone: Windows Phone
revoke: Revocar
revoke_success: Sesión revocada exitosamente
title: Sesiones
@@ -1179,6 +1234,9 @@ es:
webauthn_authentication: Claves de seguridad
statuses:
attached:
+ audio:
+ one: "%{count} audio"
+ other: "%{count} audios"
description: 'Adjunto: %{attached}'
image:
one: "%{count} imagen"
@@ -1214,6 +1272,7 @@ es:
show_older: Mostrar más antiguos
show_thread: Mostrar discusión
sign_in_to_participate: Regístrate para participar en la conversación
+ title: "%{name}: «%{quote}»"
visibilities:
direct: Directa
private: Sólo mostrar a seguidores
@@ -1318,6 +1377,7 @@ es:
time:
formats:
default: "%d de %b del %Y, %H:%M"
+ month: "%b %Y"
two_factor_authentication:
add: Añadir
disable: Deshabilitar
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index bba190ec5..647767b0d 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -70,7 +70,7 @@ gd:
following: A’ leantainn
instance_actor_flash: "’S e actar biortail a tha sa chunntas seo a riochdaicheas am frithealaiche fhèin seach cleachdaiche sònraichte. Tha e ’ga chleachdadh a chùm co-nasgaidh agus cha bu chòir dhut a chur à rèim."
joined: Air ballrachd fhaighinn %{date}
- last_active: gnìomhach an turas mu dheireadh
+ last_active: an gnìomh mu dheireadh
link_verified_on: Chaidh dearbhadh cò leis a tha an ceangal seo %{date}
media: Meadhanan
moved_html: 'Chaidh %{name} imrich gu %{new_profile_link}:'
@@ -238,6 +238,7 @@ gd:
create_domain_block: Cruthaich bacadh àrainne
create_email_domain_block: Cruthaich bacadh àrainne puist-d
create_ip_block: Cruthaich riaghailt IP
+ create_unavailable_domain: Cruthaich àrainn nach eil ri fhaighinn
demote_user: Ìslich an cleachdaiche
destroy_announcement: Sguab às am brath-fios
destroy_custom_emoji: Sguab às an t-Emoji gnàthaichte
@@ -246,6 +247,7 @@ gd:
destroy_email_domain_block: Sguab às bacadh na h-àrainne puist-d
destroy_ip_block: Sguab às an riaghailt IP
destroy_status: Sguab às am post
+ destroy_unavailable_domain: Sguab às àrainn nach eil ri fhaighinn
disable_2fa_user: Cuir an dearbhadh dà-cheumnach à comas
disable_custom_emoji: Cuir an t-Emoji gnàthaichte à comas
disable_user: Cuir an cleachdaiche à comas
@@ -279,6 +281,7 @@ gd:
create_domain_block_html: Bhac %{name} an àrainn %{target}
create_email_domain_block_html: Bhac %{name} an àrainn puist-d %{target}
create_ip_block_html: Chruthaich %{name} riaghailt dhan IP %{target}
+ create_unavailable_domain_html: Sguir %{name} ris an lìbhrigeadh dhan àrainn %{target}
demote_user_html: Dh’ìslich %{name} an cleachdaiche %{target}
destroy_announcement_html: Sguab %{name} às am brath-fios %{target}
destroy_custom_emoji_html: Mhill %{name} an Emoji %{target}
@@ -287,6 +290,7 @@ gd:
destroy_email_domain_block_html: Dì-bhac %{name} an àrainn puist-d %{target}
destroy_ip_block_html: Sguab %{name} às riaghailt dhan IP %{target}
destroy_status_html: Thug %{name} post aig %{target} air falbh
+ destroy_unavailable_domain_html: Lean %{name} air adhart leis an lìbhrigeadh dhan àrainn %{target}
disable_2fa_user_html: Chuir %{name} riatanas an dearbhaidh dà-cheumnaich à comas dhan chleachdaiche %{target}
disable_custom_emoji_html: Chuir %{name} an Emoji %{target} à comas
disable_user_html: Chuir %{name} an clàradh a-steach à comas dhan chleachdaiche %{target}
@@ -461,8 +465,27 @@ gd:
title: Molaidhean leantainn
unsuppress: Aisig am moladh leantainn
instances:
+ back_to_all: Na h-uile
+ back_to_limited: Cuingichte
+ back_to_warning: Rabhadh
by_domain: Àrainn
+ delivery:
+ all: Na h-uile
+ clear: Falamhaich na mearachdan lìbhrigidh
+ restart: Ath-thòisich air an lìbhrigeadh
+ stop: Cuir stad air an lìbhrigeadh
+ title: Lìbhrigeadh
+ unavailable: Chan eil e ri làimh
+ unavailable_message: Chan eil lìbhrigeadh ri fhaighinn
+ warning: Rabhadh
+ warning_message:
+ few: Dh’fhàillig leis an lìbhrigeadh fad %{count} làithean
+ one: Dh’fhàillig leis an lìbhrigeadh fad %{count} latha
+ other: Dh’fhàillig leis an lìbhrigeadh fad %{count} latha
+ two: Dh’fhàillig leis an lìbhrigeadh fad %{count} latha
delivery_available: Tha lìbhrigeadh ri fhaighinn
+ delivery_error_days: Làithean le mearachd lìbhrigidh
+ delivery_error_hint: Mura gabh a lìbhrigeadh fad %{count} là(ithean), thèid comharra a chur ris gu fèin-obrachail a dh’innseas nach gabh a lìbhrigeadh.
empty: Cha deach àrainn a lorg.
known_accounts:
few: "%{count} cunntasan as aithne dhuinn"
@@ -511,7 +534,7 @@ gd:
relays:
add_new: Cuir ath-sheachadan ùr ris
delete: Sguab às
- description_html: "’S e frithealaiche eadar-mheadhanach a th’ ann an ath-sheachadan co-nasgaidh a nì iomlaid air grunnan mòra de dhùdan poblach eadar na frithealaichean a dh’fho-sgrìobhas ’s a dh’fhoillsicheas dha. ’S urrainn dha cuideachadh a thoirt do dh’fhrithealaichean beaga is meadhanach mòr ach an lorg iad susbaint sa cho-shaoghal agus às an aonais, bhiodh aig cleachdaichean ionadail leantainn air daoine eile air frithealaichean cèine a làimh."
+ description_html: "’S e frithealaiche eadar-mheadhanach a th’ ann an ath-sheachadan co-nasgaidh a nì iomlaid air grunnan mòra de phostaichean poblach eadar na frithealaichean a dh’fho-sgrìobhas ’s a dh’fhoillsicheas dha. ’S urrainn dha cuideachadh a thoirt do dh’fhrithealaichean beaga is meadhanach mòr ach an lorg iad susbaint sa cho-shaoghal agus às an aonais, bhiodh aig cleachdaichean ionadail leantainn air daoine eile air frithealaichean cèine a làimh."
disable: Cuir à comas
disabled: Chaidh a chur à comas
enable: Cuir an comas
@@ -727,18 +750,18 @@ gd:
created_msg: Chaidh an t-alias ùr a chruthachadh. ’S urrainn dhut tòiseachadh air imrich on seann-chunntas a-nis.
deleted_msg: Chaidh an t-alias a thoirt air falbh. Chan urrainn dhut imrich on chunntas ud chan fhear seo tuilleadh.
empty: Chan eil alias agad.
- hint_html: Nam bu mhiann leat imrich o chunntas eile dhan fhear seo, ’s urrainn dhut alias a chruthachadh an-seo agus feumaidh tu sin a dhèanamh mus urrainn dhut tòiseachadh air an luchd-leantainn agad imrich on seann-chunntas dhan fhear seo. Tha an gnìomh seo fhèin neo-chronail is can eil e buan. Tòisichidh tu air imrich a’ chunntais on t-seann-chunntas.
+ hint_html: Nam bu mhiann leat imrich o chunntas eile dhan fhear seo, ’s urrainn dhut alias a chruthachadh an-seo agus feumaidh tu sin a dhèanamh mus urrainn dhut tòiseachadh air an luchd-leantainn agad imrich on seann-chunntas dhan fhear seo. Tha an gnìomh seo fhèin neo-chronail is chan eil e buan. Tòisichidh tu air imrich a’ chunntais on t-seann-chunntas.
remove: Dì-cheangail an t-alias
appearance:
advanced_web_interface: Eadar-aghaidh-lìn adhartach
- advanced_web_interface_hint: 'Ma tha thu airson leud gu lèir na sgrìn agad a chleachdadh, leigidh an eadar-aghaidh-lìn adhartach leat gun rèitich thu mòran cholbhan eadar-dhealaichte ach a faic thu na thogras tu de dh’fhiosrachadh aig an aon àm: Dachaigh, brathan, loidhne-ama cho-naisgte, na thogras tu de liostaichean is tagaichean hais.'
+ advanced_web_interface_hint: 'Ma tha thu airson leud gu lèir na sgrìn agad a chleachdadh, leigidh an eadar-aghaidh-lìn adhartach leat gun rèitich thu mòran cholbhan eadar-dhealaichte ach am faic thu na thogras tu de dh’fhiosrachadh aig an aon àm: Dachaigh, brathan, loidhne-ama cho-naisgte, na thogras tu de liostaichean is tagaichean hais.'
animations_and_accessibility: Beòthachaidhean agus so-ruigsinneachd
confirmation_dialogs: Còmhraidhean dearbhaidh
discovery: Lorg
localization:
body: Tha Mastodon ’ga eadar-theangachadh le saor-thoilich.
guide_link: https://crowdin.com/project/mastodon
- guide_link_text: "’S urrainn do dhuine sam bith cuideachadh."
+ guide_link_text: "’S urrainn do neach sam bith cuideachadh."
sensitive_content: Susbaint fhrionasach
toot_layout: Co-dhealbhachd nam postaichean
application_mailer:
@@ -762,7 +785,7 @@ gd:
checkbox_agreement_html: Gabhaidh mi ri riaghailtean an fhrithealaiche ’s teirmichean a’ chleachdaidh
checkbox_agreement_without_rules_html: Gabhaidh mi ri teirmichean a’ chleachdaidh
delete_account: Sguab às an cunntas
- delete_account_html: Nam bu mhiann leat an cunntas agad a sguabadh às, Nì thu an-seo e. Thèid dearbhadh iarraidh ort.
+ delete_account_html: Nam bu mhiann leat an cunntas agad a sguabadh às, nì thu an-seo e. Thèid dearbhadh iarraidh ort.
description:
prefix_invited_by_user: Thug @%{name} cuireadh dhut ach am faigh thu ballrachd air an fhrithealaiche seo de Mhastodon!
prefix_sign_up: Clàraich le Mastodon an-diugh!
@@ -1020,7 +1043,7 @@ gd:
not_found: "– cha deach seo a lorg"
on_cooldown: Tha àm socrachaidh ort
followers_count: Luchd-leantainn aig àm na h-imrich
- incoming_migrations: Ag imrich o chunntas eile
+ incoming_migrations: Imrich o chunntas eile
incoming_migrations_html: Airson imrich o chunntas eile dhan fhear seo, feumaidh tu alias cunntais a chruthachadh an toiseach.
moved_msg: Tha an cunntas agad ’ga ath-stiùireadh gu %{acct} a-nis ’s an luchd-leantainn agad ’gan imrich.
not_redirecting: Chan eil an cunntas agad ’ga ath-stiùireadh gu cunntas sam bith eile aig an àm seo.
@@ -1141,7 +1164,7 @@ gd:
followers: Luchd-leantainn
following: A’ leantainn
invited: Air cuireadh fhaighinn
- last_active: Gnìomhach an turas mu dheireadh
+ last_active: An gnìomh mu dheireadh
most_recent: As ùire
moved: Air imrich
mutual: Co-dhàimh
@@ -1226,8 +1249,8 @@ gd:
export: Às-phortadh dàta
featured_tags: Tagaichean hais brosnaichte
identity_proofs: Dearbhaidhean na dearbh-aithne
- import: Ion-phortaich
- import_and_export: Ion-phortaich is às-phortaich
+ import: Ion-phortadh
+ import_and_export: Ion-phortadh ⁊ às-phortadh
migrate: Imrich cunntais
notifications: Brathan
preferences: Roghainnean
@@ -1266,7 +1289,7 @@ gd:
open_in_web: Fosgail air an lìon
over_character_limit: chaidh thu thar crìoch charactaran de %{max}
pin_errors:
- limit: Tha an àireamh as motha de dhùdan prìnichte agad a tha ceadaichte
+ limit: Tha an àireamh as motha de phostaichean prìnichte agad a tha ceadaichte
ownership: Chan urrainn dhut post càich a phrìneachadh
private: Chan urrainn dhut post neo-phoblach a phrìneachadh
reblog: Chan urrainn dhut brosnachadh a phrìneachadh
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 09d758902..50a116e72 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -43,7 +43,7 @@ gl:
reason: Razón
rejecting_media: 'Os ficheiros multimedia deste servidor non serán procesados e non se amosarán miniaturas, o que require un clic manual no ficheiro orixinal:'
rejecting_media_title: Multimedia filtrado
- silenced: 'As publicacións deste servidor non se amosarán en conversas e liñas temporais, nin terás notificacións das súas usuarias agás que as sigas:'
+ silenced: 'As publicacións destes servidores non se amosarán en conversas e cronoloxías públicas, nin terás notificacións xeradas polas interaccións das usuarias, a menos que as estés a seguir:'
silenced_title: Servidores acalados
suspended: 'Non se procesarán, almacenarán nin intercambiarán datos destes servidores, o que fai imposíbel calquera interacción ou comunicación coas usuarias dende estes servidores:'
suspended_title: Servidores suspendidos
@@ -639,7 +639,7 @@ gl:
title: Estado do rexistro
show_known_fediverse_at_about_page:
desc_html: Si activado, mostraralle os toots de todo o fediverso coñecido nunha vista previa. Si non só mostrará os toots locais.
- title: Mostrar vista previa do fediverso na liña temporal
+ title: Incluír contido federado na páxina da cronoloxía pública sen autenticación
show_staff_badge:
desc_html: Mostrar unha insignia de membresía nunha páxina de usuaria
title: Mostrar insigna de membresía
@@ -660,8 +660,8 @@ gl:
desc_html: Utilizado para vistas previsas vía OpenGraph e API. Recoméndase 1200x630px
title: Icona do servidor
timeline_preview:
- desc_html: Mostrar liña de tempo pública na páxina de inicio
- title: vista previa da liña temporal
+ desc_html: Mostrar ligazón á cronoloxía pública na páxina de benvida e permitir o acceso API á cronoloxía pública sen ter autenticación
+ title: Permitir acceso á cronoloxía pública sen autenticación
title: Axustes do sitio
trendable_by_default:
desc_html: Afecta ós cancelos que non foron rexeitados de xeito previo
@@ -908,9 +908,9 @@ gl:
filters:
contexts:
account: Perfís
- home: Liña temporal inicial
+ home: Inicio e listaxes
notifications: Avisos
- public: Liñas temporais públicas
+ public: Cronoloxías públicas
thread: Conversas
edit:
title: Editar filtro
@@ -1126,7 +1126,7 @@ gl:
preferences:
other: Outro
posting_defaults: Valores por omisión
- public_timelines: Liñas temporais públicas
+ public_timelines: Cronoloxías públicas
reactions:
errors:
limit_reached: Acadouse o límite das diferentes reaccións
@@ -1280,7 +1280,7 @@ gl:
public: Público
public_long: Visible para calquera
unlisted: Non listado
- unlisted_long: Visible para calquera, pero non listado en liñas de tempo públicas
+ unlisted_long: Visible para calquera, pero non en cronoloxías públicas
stream_entries:
pinned: Publicación fixada
reblogged: promovido
@@ -1430,15 +1430,15 @@ gl:
edit_profile_step: Podes personalizar o teu perfil subindo un avatar, cabeceira, cambiar o nome público e aínda máis. Se restrinxes a túa conta podes revisar a conta das persoas que solicitan seguirte antes de permitirlles o acceso aos teus toots.
explanation: Aquí ten alunhas endereitas para ir aprendendo
final_action: Comece a publicar
- final_step: 'Publica! Incluso sen seguidoras as túas mensaxes serán vistas por outras, por exemplo na liña temporal local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.'
+ final_step: 'Publica! Incluso sen seguidoras as túas mensaxes públicas serán vistas por outras, por exemplo na cronoloxía local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.'
full_handle: O seu alcume completo
full_handle_hint: Esto é o que lle dirá aos seus amigos para que poidan seguila ou enviarlle mensaxes desde outro servidor.
review_preferences_action: Cambiar preferencias
review_preferences_step: Lembre establecer as preferencias, tales como qué correos-e lle querería recibir, ou o nivel de intimidade por omisión para as súas mensaxes. Se non lle molestan as imaxes con movemento, pode escoller que os GIF se reproduzan automáticamente.
subject: Benvida a Mastodon
- tip_federated_timeline: A liña temporal federada é unha visión reducida da rede Mastodon. Inclúe xente a que segue xente que ti segues, así que non é completa.
- tip_following: Por omisión segues a Admin(s) no teu servidor. Para atopar máis xente interesante, mira nas liñas temporais local e federada.
- tip_local_timeline: A liña temporal local é unha ollada xeral sobre a xente en %{instance}. Son as súas veciñas máis próximas!
+ tip_federated_timeline: A cronoloxía federada é unha visión reducida da rede Mastodon. Inclúe xente a que segue xente que ti segues, así que non é completa.
+ tip_following: Por defecto segues a Admin(s) no teu servidor. Para atopar máis xente interesante, mira nas cronoloxías local e federada.
+ tip_local_timeline: A cronoloxía local é unha ollada xeral sobre a xente en %{instance}. Son as súas veciñas máis próximas!
tip_mobile_webapp: Si o navegador móbil lle ofrece engadir Mastodon a pantalla de inicio, pode recibir notificacións push. En moitos aspectos comportarase como un aplicativo nativo!
tips: Consellos
title: Benvida, %{name}!
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 1dd540683..542b5553b 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -1,7 +1,7 @@
---
hu:
about:
- about_hashtag_html: Ezek a #%{hashtag} hashtaggel ellátott publikus tülkök. Reagálhatsz rájuk, ha már van felhasználói fiókod valahol a föderációban.
+ about_hashtag_html: Ezek a #%{hashtag} hashtaggel ellátott nyilvános bejegyzések. Reagálhatsz rájuk, ha már van felhasználói fiókod valahol a föderációban.
about_mastodon_html: 'A jövő közösségi hálózata: Hirdetések és céges megfigyelés nélkül, etikus dizájnnal és decentralizációval! Legyél a saját adataid ura a Mastodonnal!'
about_this: Névjegy
active_count_after: aktív
@@ -11,8 +11,8 @@ hu:
apps: Mobil appok
apps_platforms: Használd a Mastodont iOS-ről, Androidról vagy más platformról
browse_directory: Böngészd a profilokat és szűrj érdeklődési körre
- browse_local_posts: Nézz bele a szerver publikus, élő adatfolyamába
- browse_public_posts: Nézz bele a Mastodon élő adatfolyamába
+ browse_local_posts: Nézz bele a szerver élő, nyilvános bejegyzéseibe
+ browse_public_posts: Nézz bele a Mastodon élő, nyilvános bejegyzéseibe
contact: Kapcsolat
contact_missing: Nincs megadva
contact_unavailable: N/A
@@ -32,9 +32,9 @@ hu:
server_stats: 'Szerver statisztika:'
source_code: Forráskód
status_count_after:
- one: tülköt küldött
- other: tülköt küldött
- status_count_before: eddig
+ one: bejegyzést írt
+ other: bejegyzést írt
+ status_count_before: Eddig
tagline: Kövess barátokat és találj újakat
terms: Felhasználási feltételek
unavailable_content: A tartalom nem elérhető
@@ -43,7 +43,7 @@ hu:
reason: 'Indok:'
rejecting_media: A szerverről származó médiafájlok nem kerülnek feldolgozásra, és nem jelennek meg miniatűrök, amelyek kézi átkattintást igényelnek a másik szerverre.
rejecting_media_title: Kiszűrt média
- silenced: A szerver hozzászólásai csak a saját hírvonalon jelennek meg, ha követik a szerzőt.
+ silenced: 'Az ezen szerverekről származó bejegyzéseket elrejtjük a nyilvános idővonalakról és beszélgetésekből, a rajtuk lévő felhasználók műveleteiről nem küldünk értesítéseket, hacsak nem követed őket:'
silenced_title: Elnémított szerverek
suspended: Nem fogsz tudni követni senkit ebből a szerverből, és nem kerül feldolgozásra vagy tárolásra a tőle származó adat, és nincs adatcsere.
suspended_title: Felfüggesztett szerverek
@@ -78,10 +78,10 @@ hu:
pin_errors:
following: Ehhez szükséges, hogy kövesd már a felhasználót
posts:
- one: Tülk
- other: Tülk
- posts_tab_heading: Tülkölés
- posts_with_replies: Tülkölés válaszokkal
+ one: Bejegyzés
+ other: Bejegyzés
+ posts_tab_heading: Bejegyzés
+ posts_with_replies: Bejegyzés válaszokkal
roles:
admin: Adminisztrátor
bot: Bot
@@ -193,15 +193,15 @@ hu:
search: Keresés
search_same_email_domain: Felhasználók ugyanezzel az email domainnel
search_same_ip: Más felhasználók ugyanezzel az IP-vel
- sensitive: Szenzitív
- sensitized: szenzitívnek jelölve
+ sensitive: Kényes
+ sensitized: kényesnek jelölve
shared_inbox_url: Megosztott bejövő üzenetek URL
show:
created_reports: Létrehozott jelentések
targeted_reports: Jelentések ezzel kapcsolatban
silence: Némítás
silenced: Némított
- statuses: Tülkök
+ statuses: Bejegyzés
subscribe: Feliratkozás
suspended: Felfüggesztett
suspension_irreversible: Ennek a fióknak az adatait visszaállíthatatlanul törölték. Visszavonhatod a fiók felfüggesztését, hogy újra használható legyen, de a régi adatok ettől még nem fognak visszatérni.
@@ -209,7 +209,7 @@ hu:
time_in_queue: Várakozás a sorban %{time}
title: Fiókok
unconfirmed_email: Nem megerősített e-mail
- undo_sensitized: Szenzitív jelölés levétele
+ undo_sensitized: Kényesnek jelölés visszavonása
undo_silenced: Némítás visszavonása
undo_suspension: Felfüggesztés visszavonása
unsilenced_msg: A %{username} fiók korlátozásait sikeresen levettük
@@ -232,6 +232,7 @@ hu:
create_domain_block: Domain tiltás létrehozása
create_email_domain_block: E-mail domain tiltás létrehozása
create_ip_block: IP szabály létrehozása
+ create_unavailable_domain: Elérhetetlen domain létrehozása
demote_user: Felhasználó lefokozása
destroy_announcement: Közlemény törlése
destroy_custom_emoji: Egyéni emodzsi törlése
@@ -239,7 +240,8 @@ hu:
destroy_domain_block: Domain tiltás törlése
destroy_email_domain_block: E-mail domain tiltás törlése
destroy_ip_block: IP szabály törlése
- destroy_status: Állapot törlése
+ destroy_status: Bejegyzés törlése
+ destroy_unavailable_domain: Elérhetetlen domain törlése
disable_2fa_user: Kétlépcsős hitelesítés letiltása
disable_custom_emoji: Egyéni emodzsi letiltása
disable_user: Felhasználói letiltása
@@ -251,17 +253,17 @@ hu:
reopen_report: Jelentés újranyitása
reset_password_user: Jelszó visszaállítása
resolve_report: Jelentés megoldása
- sensitive_account: A fiókodban minden média szenzitívnek jelölése
+ sensitive_account: A fiókodban minden média kényesnek jelölése
silence_account: Fiók némítása
suspend_account: Fiók felfüggesztése
unassigned_report: Jelentés hozzárendelésének megszüntetése
- unsensitive_account: A fiókodban minden média szenzitív állapotának törlése
+ unsensitive_account: A fiókodban minden média kényesként jelölésének törlése
unsilence_account: Fiók némításának feloldása
unsuspend_account: Fiók felfüggesztésének feloldása
update_announcement: Közlemény frissítése
update_custom_emoji: Egyéni emodzsi frissítése
update_domain_block: Domain tiltás frissítése
- update_status: Állapot frissítése
+ update_status: Bejegyzés frissítése
actions:
assigned_to_self_report_html: "%{name} a %{target} bejelentést magához rendelte"
change_email_user_html: "%{name} megváltoztatta %{target} felhasználó e-mail címét"
@@ -273,6 +275,7 @@ hu:
create_domain_block_html: "%{name} letiltotta a %{target} domaint"
create_email_domain_block_html: "%{name} letiltotta a %{target} e-mail domaint"
create_ip_block_html: "%{name} létrehozott egy szabályt a %{target} IP-vel kapcsolatban"
+ create_unavailable_domain_html: "%{name} leállította a kézbesítést a %{target} domainbe"
demote_user_html: "%{name} lefokozta %{target} felhasználót"
destroy_announcement_html: "%{name} törölte a %{target} közleményt"
destroy_custom_emoji_html: "%{name} törölte a %{target} emodzsit"
@@ -280,7 +283,8 @@ hu:
destroy_domain_block_html: "%{name} engedélyezte a %{target} domaint"
destroy_email_domain_block_html: "%{name} engedélyezte a %{target} e-mail domaint"
destroy_ip_block_html: "%{name} törölt egy szabályt a %{target} IP-vel kapcsolatban"
- destroy_status_html: "%{name} eltávolította az alábbi felhasználó tülkjét: %{target}"
+ destroy_status_html: "%{name} eltávolította %{target} felhasználó bejegyzését"
+ destroy_unavailable_domain_html: "%{name} újraindította a kézbesítést a %{target} domainbe"
disable_2fa_user_html: "%{name} kikapcsolta a kétlépcsős azonosítást %{target} felhasználó fiókján"
disable_custom_emoji_html: "%{name} letiltotta a %{target} emodzsit"
disable_user_html: "%{name} letiltotta %{target} felhasználó bejelentkezését"
@@ -292,18 +296,18 @@ hu:
reopen_report_html: "%{name} újranyitotta a %{target} bejelentést"
reset_password_user_html: "%{name} visszaállította %{target} felhasználó jelszavát"
resolve_report_html: "%{name} megoldotta a %{target} bejelentést"
- sensitive_account_html: "%{name} szenzitívnek jelölte %{target} médiatartalmát"
+ sensitive_account_html: "%{name} kényesnek jelölte %{target} médiatartalmát"
silence_account_html: "%{name} lenémította %{target} felhasználói fiókját"
suspend_account_html: "%{name} felfüggesztette %{target} felhasználói fiókját"
unassigned_report_html: "%{name} törölte a %{target} bejelentés hozzárendelését"
- unsensitive_account_html: "%{name} levette a szenzitív jelölést %{target} médiatartalmáról"
+ unsensitive_account_html: "%{name} levette a kényesnek jelölést %{target} médiatartalmáról"
unsilence_account_html: "%{name} feloldotta a némítást %{target} felhasználói fiókján"
unsuspend_account_html: "%{name} feloldotta %{target} felhasználói fiókjának felfüggesztését"
update_announcement_html: "%{name} frissítette a %{target} közleményt"
update_custom_emoji_html: "%{name} frissítette a %{target} emodzsit"
update_domain_block_html: "%{name} frissítette a %{target} domain tiltását"
- update_status_html: "%{name} frissítette %{target} felhasználó tülkjét"
- deleted_status: "(törölt tülk)"
+ update_status_html: "%{name} frissítette %{target} felhasználó bejegyzését"
+ deleted_status: "(törölt bejegyzés)"
empty: Nem található napló.
filter_by_action: Szűrés művelet alapján
filter_by_user: Szűrés felhasználó alapján
@@ -401,7 +405,7 @@ hu:
create: Tiltás létrehozása
hint: A domain tiltása nem gátolja meg az új fiókok hozzáadását az abatbázishoz, de visszamenőlegesen és automatikusan aktivál bizonyos moderációs szabályokat ezen fiókok esetében.
severity:
- desc_html: A Némítás elrejti az adott felhasználó tülkjeit mindenki elől, aki nem követi az adott felhasználót. A Felfüggesztés eltávolítja az adott felhasználó által létrehozott minden tartalmat, ide értve a médiafájlokat és a fiókadatokat is. Válaszd az Egyik sem opciót, ha csupán a médiafájlokat szeretnéd elutasítani.
+ desc_html: A Némítás elrejti az adott felhasználó bejegyzéseit mindenki elől, aki nem követi őt. A Felfüggesztés eltávolítja az adott felhasználó által létrehozott minden tartalmat, ide értve a médiafájlokat és a fiókadatokat is. Válaszd az Egyik sem opciót, ha csupán a médiafájlokat szeretnéd elutasítani.
noop: Egyik sem
silence: Némítás
suspend: Felfüggesztés
@@ -453,8 +457,25 @@ hu:
title: Követési ajánlatok
unsuppress: Követési ajánlatok visszaállítása
instances:
+ back_to_all: Mind
+ back_to_limited: Korlátozott
+ back_to_warning: Figyelmeztetés
by_domain: Domain
+ delivery:
+ all: Mind
+ clear: Kézbesítési hibák törlése
+ restart: Kézbesítés újraindítása
+ stop: Kézbesítés leállítása
+ title: Kézbesítés
+ unavailable: Nem elérhető
+ unavailable_message: Kézbesítés nem elérhető
+ warning: Figyelmeztetés
+ warning_message:
+ one: Kézbesítés sikertelen %{count} napja
+ other: Kézbesítés sikertelen %{count} napja
delivery_available: Kézbesítés elérhető
+ delivery_error_days: Kézbesítési hiba időtartama
+ delivery_error_hint: Ha a kézbesítés lehetetlen %{count} napig, automatikusan kézbesíthetetlennek lesz megjelölve.
empty: Nem található domain.
known_accounts:
one: "%{count} ismert fiók"
@@ -501,11 +522,11 @@ hu:
relays:
add_new: Új relé hozzáadása
delete: Törlés
- description_html: A föderációs relé egy olyan köztes szerver, mely nagy mennyiségű publikus tülköt cserél az erre feliratkozó vagy publikáló szerverek között. Ezzel segíthet kis és közepes szervereknek tartalmat megtalálni a föderációban, mely egyébként csak akkor válna lehetővé, ha a saját felhasználóink más szervereken lévő fiókokat követnének.
+ description_html: A föderációs relé egy olyan köztes szerver, mely nagy mennyiségű nyilvános bejegyzést cserél az erre feliratkozó vagy erre publikáló szerverek között. Ezzel segíthetsz kis és közepes szervereknek tartalmat megtalálni a föderációban, mely egyébként csak akkor válna lehetővé, ha a saját felhasználóik más szervereken lévő fiókokat követnének.
disable: Kikapcsolás
disabled: Kikapcsolva
enable: Bekapcsolás
- enable_hint: Ha bekapcsolod, a szerver minden nyilvános tülkre feliratkozik ezen a relén, valamint az összes nyilvános tülköt elküldi ennek.
+ enable_hint: Ha bekapcsolod, a szerver minden nyilvános bejegyzésre feliratkozik ezen a relén, valamint az összes nyilvános bejegyzést elküldi ennek.
enabled: Bekapcsolva
inbox_url: Relé URL
pending: Várakozás a relé jóváhagyására
@@ -563,7 +584,7 @@ hu:
title: Szerverszabályzat
settings:
activity_api_enabled:
- desc_html: Helyi tülkök, aktív felhasználók és új regisztrációk száma heti bontásban
+ desc_html: Helyi bejegyzések, aktív felhasználók és új regisztrációk száma heti bontásban
title: Felhasználói aktivitás összesített statisztikájának publikussá tétele
bootstrap_timeline_accounts:
desc_html: Az egyes felhasználóneveket vesszővel válaszd el! Csak helyi és aktivált fiókok esetében működik. Üresen (alapértelmezettként) minden helyi adminisztrátorra érvényes.
@@ -594,8 +615,8 @@ hu:
desc_html: Domainek, amelyekkel ez a szerver kapcsolatban áll
title: Szerverek listájának közzététele, melyekkel ez a szerver kapcsolatban áll
preview_sensitive_media:
- desc_html: Más weboldalakon linkelt tartalmaink előnézetében mindenképp benne lesz egy bélyegkép még akkor is, ha a médiát szenzitívnek jelölték meg
- title: Szenzitív média mutatása OpenGraph előnézetben
+ desc_html: Más weboldalakon linkelt tartalmaink előnézetében mindenképp benne lesz egy bélyegkép még akkor is, ha a médiát kényesnek jelölték meg
+ title: Kényes média mutatása OpenGraph előnézetben
profile_directory:
desc_html: Lehetővé teszi, hogy a felhasználóinkat megtalálják
title: Profil adatbázis engedélyezése
@@ -619,7 +640,7 @@ hu:
open: Bárki regisztrálhat
title: Regisztrációs mód
show_known_fediverse_at_about_page:
- desc_html: Ha aktív, az előnézetben minden tülk megjelenik a velünk kapcsolatban álló szerverekről, egyébként csak helyi tülköket mutatunk.
+ desc_html: Ha le van tiltva, a nyilvános, főoldalról elérhető idővonalon csak helyi tartalmak jelennek meg
title: Mutassuk az általunk ismert föderációt az idővonal előnézetben
show_staff_badge:
desc_html: Stáb-jelvény megjelenítése a felhasználó oldalán
@@ -657,19 +678,19 @@ hu:
back_to_account: Vissza a fiók oldalára
batch:
delete: Törlés
- nsfw_off: Szenzitív megjelölés törlése
- nsfw_on: Megjelölés szenzitív tartalomként
+ nsfw_off: Kényesnek jelölés törlése
+ nsfw_on: Megjelölés kényes tartalomként
deleted: Törölve
failed_to_execute: Végrehajtás sikertelen
media:
title: Média
- no_media: Nem található médiafájl
- no_status_selected: Nem változtattunk meg semmit, mert semmi sem volt kiválasztva
- title: Felhasználó tülkjei
- with_media: Médiafájlokkal
+ no_media: Nincs média
+ no_status_selected: Nem változtattunk meg egy bejegyzést sem, mert semmi sem volt kiválasztva
+ title: Fiók bejegyzései
+ with_media: Médiával
system_checks:
database_schema_check:
- message_html: Vannak elintézetlen adatbázis migrációink. Kérlek, futtasd őket, hogy biztosítsd, az alkalmazás megfelelően működik
+ message_html: Vannak esedékes adatbázis migrációink. Kérlek, futtasd őket, hogy biztosítsd, hogy az alkalmazás megfelelően működjön
rules_check:
action: Szerver szabályok menedzselése
message_html: Még nem definiáltál egy szerver szabályt sem.
@@ -687,7 +708,7 @@ hu:
reviewed: Engedélyezett
title: Hashtagek
trending_right_now: Most trendi
- unique_uses_today: "%{count} mai tülkölés"
+ unique_uses_today: "%{count} mai bejegyzés"
unreviewed: Még nem engedélyezett
updated_msg: A hashtag beállításokat sikeresen frissítettük
title: Karbantartás
@@ -725,15 +746,15 @@ hu:
body: A Mastodont önkéntesek fordítják.
guide_link: https://crowdin.com/project/mastodon
guide_link_text: Bárki közreműködhet.
- sensitive_content: Szenzitív tartalom
- toot_layout: Tülkök megjelenése
+ sensitive_content: Kényes tartalom
+ toot_layout: Bejegyzések elrendezése
application_mailer:
notification_preferences: E-mail beállítások módosítása
salutation: "%{name}!"
settings: 'E-mail beállítások módosítása: %{link}'
view: 'Megtekintés:'
view_profile: Profil megtekintése
- view_status: Tülk megtekintése
+ view_status: Bejegyzés megtekintése
applications:
created: Alkalmazás sikeresen létrehozva
destroyed: Alkalmazás sikeresen eltávolítva
@@ -752,7 +773,7 @@ hu:
description:
prefix_invited_by_user: "@%{name} meghív téged, hogy csatlakozz erre a Mastodon szerverre!"
prefix_sign_up: Regisztrláj még ma a Mastodonra!
- suffix: Egy fiókkal követhetsz másokat, tülkölhetsz, eszmét cserélhetsz más Mastodon szerverek felhasználóival!
+ suffix: Egy fiókkal követhetsz másokat, bejegyzéseket tehetsz közzé, eszmét cserélhetsz más Mastodon szerverek felhasználóival!
didnt_get_confirmation: Nem kaptad meg a megerősítési lépéseket?
dont_have_your_security_key: Nincs biztonsági kulcsod?
forgot_password: Elfelejtetted a jelszavad?
@@ -779,9 +800,9 @@ hu:
title: Beállítás
status:
account_status: Fiók állapota
- confirming: Várakozás a visszaigazolásra.
+ confirming: Várakozás az e-mailes visszaigazolásra.
functional: A fiókod teljesen működőképes.
- pending: A jelentkezésed engedélyezésre vár. Ez eltarthat egy ideig. Kapsz egy e-mailt, ha az elbírálás megtörtént.
+ pending: A jelentkezésed engedélyezésre vár. Ez eltarthat egy ideig. Kapsz egy e-mailt, ha a kérelmedet jóváhagyták.
redirecting_to: A fiókod inaktív, mert jelenleg ide %{acct} van átirányítva.
too_fast: Túl gyorsan küldted el az űrlapot, próbáld később.
trouble_logging_in: Problémád van a bejelentkezéssel?
@@ -795,7 +816,7 @@ hu:
following: 'Siker! Mostantól követed az alábbi felhasználót:'
post_follow:
close: Akár be is zárhatod ezt az ablakot.
- return: Visszatérés a felhasználó profiloldalára
+ return: A felhasználó profiljának mutatása
web: Megtekintés a weben
title: "%{acct} követése"
challenge:
@@ -834,7 +855,7 @@ hu:
warning:
before: 'Mielőtt továbbmész, kérlek olvasd el ezt alaposan:'
caches: Más szerverek által cache-elt tartalmak még megmaradhatnak
- data_removal: A tülkjeid és minden más adatod véglegesen törlődni fog
+ data_removal: Bejegyzéseid és minden más adatod véglegesen törlődni fog
email_change_html: Megváltoztathatod az email címed a fiókod törlése nélkül
email_contact_html: Ha még mindig nem érkezik meg, emailezhetsz ide %{email} segítségért
email_reconfirmation_html: Ha nem kaptad meg a megerősítő emailt, itt újrakérheted
@@ -870,7 +891,7 @@ hu:
archive_takeout:
date: Dátum
download: Archív letöltése
- hint_html: Itt kérhető egy archív az összes feltöltött tülködről és médiádról. Az exportált adatok ActivityPub formátumban lesznek, melyet bármilyen szabványos program tud olvasni. 7 naponként kérhetsz ilyen archívot.
+ hint_html: Itt kérhető egy archív az összes feltöltött bejegyzésedről és médiádról. Az exportált adatok ActivityPub formátumban lesznek, melyet bármilyen szabványos program tud olvasni. 7 naponként kérhetsz ilyen archívot.
in_progress: Archív összeállítása...
request: Archív kérése
size: Méret
@@ -885,7 +906,7 @@ hu:
add_new: Új hozzáadása
errors:
limit: Már kiemelted a maximálisan engedélyezett számú hashtaget
- hint_html: "Mik a kiemelt hashtagek? Ezek állandóan megjelennek a nyilvános profilodon és lehetővé teszik, hogy mások kifejezetten az ezekhez tartozó tülkjeidet böngésszék. Jó eszköz ez kreatív munkák vagy hosszútávú projektek nyomonkövetésére."
+ hint_html: "Mik a kiemelt hashtagek? Ezek állandóan megjelennek a nyilvános profilodon és lehetővé teszik, hogy mások kifejezetten az ezekhez tartozó bejegyzéseidet böngésszék. Jó eszköz ez kreatív munkák vagy hosszútávú projektek nyomonkövetésére."
filters:
contexts:
account: Profil
@@ -987,9 +1008,9 @@ hu:
limit: Elérted a hozzáadható listák maximális számát
media_attachments:
validations:
- images_and_video: Nem csatolhatsz videót olyan tülkhöz, amelyhez már csatoltál képet
+ images_and_video: Nem csatolhatsz videót olyan bejegyzéshez, amelyhez már csatoltál képet
not_ready: Nem lehet olyan fájlt csatolni, melynek még nem fejeződött be a feldolgozása. Próbáld kicsit később!
- too_many: Maximum négy fájlt csatolhatsz a tülkhöz
+ too_many: Maximum négy fájlt csatolhatsz
migrations:
acct: Az új fiók felhasznalonev@domain formátumban
cancel: Átirányítás törlése
@@ -1040,8 +1061,8 @@ hu:
other: "%{count} új értesítésed érkezett legutóbbi látogatásod óta \U0001F418"
title: Amíg távol voltál…
favourite:
- body: 'A tülködet kedvencnek jelölte %{name}:'
- subject: "%{name} kedvencnek jelölte a tülködet"
+ body: 'A bejegyzésedet kedvencnek jelölte %{name}:'
+ subject: "%{name} kedvencnek jelölte a bejegyzésedet"
title: Új kedvencnek jelölés
follow:
body: "%{name} mostantól követ téged!"
@@ -1060,11 +1081,11 @@ hu:
poll:
subject: "%{name} szavazása véget ért"
reblog:
- body: 'A tülködet %{name} megtolta:'
- subject: "%{name} megtolta a tülködet"
+ body: 'A bejegyzésedet %{name} megtolta:'
+ subject: "%{name} megtolta a bejegyzésedet"
title: Új megtolás
status:
- subject: "%{name} tülkölt egyet"
+ subject: "%{name} bejegyzést írt"
notifications:
email_events: Események email értesítésekhez
email_events_hint: 'Válaszd ki azokat az eseményeket, melyekről értesítést szeretnél:'
@@ -1106,7 +1127,7 @@ hu:
too_many_options: nem lehet több, mint %{max} opció
preferences:
other: Egyéb
- posting_defaults: Tülkölés alapértelmezései
+ posting_defaults: Bejegyzések alapértelmezései
public_timelines: Nyilvános idővonalak
reactions:
errors:
@@ -1139,17 +1160,17 @@ hu:
remote_interaction:
favourite:
proceed: Jelöljük kedvencnek
- prompt: 'Ezt a tülköt szeretnéd kedvencnek jelölni:'
+ prompt: 'Ezt a bejegyzést szeretnéd kedvencnek jelölni:'
reblog:
- proceed: Megtolás
- prompt: 'Ezt a tülköt szeretnéd megtolni:'
+ proceed: Tovább a megtoláshoz
+ prompt: 'Ezt a bejegyzést szeretnéd megtolni:'
reply:
proceed: Válaszadás
- prompt: 'Erre a tülkre szeretnél válaszolni:'
+ prompt: 'Erre a bejegyzésre szeretnél válaszolni:'
scheduled_statuses:
- over_daily_limit: Túllépted az időzített tülkökre vonatkozó napi limitet (%{limit})
- over_total_limit: Túllépted az időzített tülkökre vonatkozó limitet (%{limit})
- too_soon: Az időzítéshez jövőbeni időpont kell
+ over_daily_limit: Túllépted az időzített bejegyzésekre vonatkozó %{limit} db-os napi limitet
+ over_total_limit: Túllépted az időzített bejegyzésekre vonatkozó %{limit} db-os limitet
+ too_soon: Az időzített időpontnak a jövőben kell lennie
sessions:
activity: Legutóbbi tevékenység
browser: Böngésző
@@ -1216,7 +1237,7 @@ hu:
statuses:
attached:
audio:
- one: "%{count} audio"
+ one: "%{count} hang"
other: "%{count} hang"
description: 'Csatolva: %{attached}'
image:
@@ -1231,15 +1252,15 @@ hu:
one: 'tiltott hashtaget tartalmaz: %{tags}'
other: 'tiltott hashtageket tartalmaz: %{tags}'
errors:
- in_reply_not_found: Már nem létezik az a tülk, melyre válaszolni szeretnél.
+ in_reply_not_found: Már nem létezik az a bejegyzés, melyre válaszolni szeretnél.
language_detection: Nyelv automatikus felismerése
open_in_web: Megnyitás a weben
- over_character_limit: Túllépted a maximális %{max} karakteres keretet
+ over_character_limit: túllépted a maximális %{max} karakteres keretet
pin_errors:
- limit: Elérted a kitűzhető tülkök maximális számát
- ownership: Nem tűzheted ki valaki más tülkjét
- private: Csak nyilvános tülköt tűzhetsz ki
- reblog: Megtolt tülköt nem tudsz kitűzni
+ limit: Elérted a kitűzhető bejegyzések maximális számát
+ ownership: Nem tűzheted ki valaki más bejegyzését
+ private: Nem nyilvános bejegyzéseket nem tűzhetsz ki
+ reblog: Megtolt bejegyzést nem tudsz kitűzni
poll:
total_people:
one: "%{count} személy"
@@ -1257,15 +1278,15 @@ hu:
visibilities:
direct: Közvetlen
private: Csak követőknek
- private_long: A tülk csak követőidnek jelenik meg
+ private_long: Csak a követőidnek jelenik meg
public: Nyilvános
- public_long: Bárki láthatja a tülköt
+ public_long: Bárki láthatja
unlisted: Listázatlan
unlisted_long: Mindenki látja, de a nyilvános idővonalakon nem jelenik meg
stream_entries:
- pinned: Kitűzött tülk
+ pinned: Kitűzött bejegyzés
reblogged: megtolta
- sensitive_content: Szenzitív tartalom
+ sensitive_content: Kényes tartalom
tags:
does_not_match_previous_name: nem illeszkedik az előző névvel
terms:
@@ -1274,10 +1295,10 @@ hu:
Kérhetsz mentést minden tárolt adatodról, tülködről, média fájlodról, profil- és háttér képedről.
+Kérhetsz mentést minden tárolt adatodról, bejegyzésedről, média fájlodról, profil- és háttér képedről.
Bármikor visszaállíthatatlanul le is törölheted a fiókodat.
@@ -1319,7 +1340,7 @@ hu:Igen. A sütik pici állományok, melyeket az oldalunk a böngésződön keresztül a háttértáradra rak, ha engedélyezed ezt. Ezek a sütik teszik lehetővé, hogy az oldalunk felismerje a böngésződet, és ha regisztráltál, hozzá tudjon kötni a fiókodhoz.
-Arra is használjuk a sütiket, hogy elmenthessük a beállításaidat egy következő látogatás céljából.
+Arra is használjuk a sütiket, hogy elmenthessük a beállításaidat egy következő látogatás alkalmára.
Az azonosításodra alkalmazható adatokat nem adjuk el, nem kereskedünk vele, nem adjuk át külső szereplőnek. Ez nem foglalja magában azon harmadik személyeket, aki az üzemeltetésben, felhasználók kiszolgálásban és a tevékenységünkben segítenek, de csak addig, amíg ők is elfogadják, hogy ezeket az adatokat bizalmasan kezelik. Akkor is átadhatjuk ezeket az adatokat, ha erre hitünk szerint törvény kötelez minket, ha betartatjuk az oldalunk szabályzatát vagy megvédjük a saját vagy mások személyiségi jogait, tulajdonát, biztonságát.
-A nyilvános tartalmaidat más hálózatban lévő szerverek letölthetik. A nyilvános és csak követőknek szánt tülkjeid olyan szerverekre is elküldődnek, melyeken követőid vannak. A közvetlen üzenetek is átkerülnek a címzettek szervereire, ha ők más szerveren regisztráltak.
+A nyilvános tartalmaidat más hálózatban lévő szerverek letölthetik. A nyilvános és csak követőknek szánt bejegyzéseid olyan szerverekre is elküldődnek, melyeken követőid vannak. A közvetlen üzenetek is átkerülnek a címzettek szervereire, ha ők más szerveren regisztráltak.
-Ha felhatalmazol egy alkalmazást, hogy használja a fiókodat, a jóváhagyott hatásköröktől függően ez elérheti a nyilvános profiladataidat, a követettjeid listáját, a követőidet, listáidat, tülkjeidet és kedvenceidet is. Ezek az alkalmazások ugyanakkor sosem érhetik el a jelszavadat és e-mail címedet.
+Ha felhatalmazol egy alkalmazást, hogy használja a fiókodat, a jóváhagyott hatásköröktől függően ez elérheti a nyilvános profiladataidat, a követettjeid listáját, a követőidet, listáidat, bejegyzéseidet és kedvenceidet is. Ezek az alkalmazások ugyanakkor sosem érhetik el a jelszavadat és e-mail címedet.
Bạn có thể tải xuống một bản sao lưu trữ nội dung của bạn, bao gồm các tút, tệp đính kèm phương tiện, ảnh đại diện và ảnh bìa.
+Bạn có thể tải xuống một bản sao lưu trữ nội dung của bạn, bao gồm các tút, tập tin đính kèm, ảnh đại diện và ảnh bìa.
Bạn có thể xóa tài khoản của mình bất cứ lúc nào.
Có. Cookie là các tệp nhỏ mà một trang web hoặc nhà cung cấp dịch vụ internet chuyển vào ổ cứng máy tính của bạn thông qua trình duyệt Web (nếu bạn cho phép). Những cookie này cho phép trang web nhận ra trình duyệt của bạn và nếu bạn có tài khoản đã đăng ký, nó sẽ liên kết với tài khoản đã đăng ký của bạn.
-Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tương lai.
+Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tiếp theo.
Chúng tôi không bán, trao đổi hoặc chuyển nhượng thông tin nhận dạng cá nhân của bạn cho bên thứ ba. Trừ khi bên thứ ba đó đang hỗ trợ chúng tôi điều hành Mastodon, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn nếu việc công bố là để tuân thủ luật pháp, thực thi quy tắc máy chủ của chúng tôi hoặc bảo vệ quyền, tài sản hợp pháp hoặc sự an toàn của chúng tôi hoặc bất kỳ ai.
@@ -1307,15 +1307,15 @@ vi:Nếu bạn cho phép một ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin trang cá nhân, danh sách người theo dõi, danh sách của bạn, tất cả tút và lượt thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn.
Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, theo yêu cầu của GDPR (Quy định bảo vệ dữ liệu chung) thì không được sử dụng trang web này.
-Nếu máy chủ này ở Hoa Kỳ: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người trên 13 tuổi. Nếu bạn dưới 13 tuổi, theo yêu cầu của COPPA (Đạo luật bảo vệ quyền riêng tư trực tuyến của trẻ em) thì không được sử dụng trang web này.
+Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều dành cho những người trên 16 tuổi. Nếu bạn dưới 16 tuổi, xét theo GDPR (Quy định bảo vệ dữ liệu chung) thì không được sử dụng trang web này.
+Nếu máy chủ này ở Hoa Kỳ: Trang web của chúng tôi, các sản phẩm và dịch vụ đều dành cho những người trên 13 tuổi. Nếu bạn dưới 13 tuổi, xét theo COPPA (Đạo luật bảo vệ quyền riêng tư trực tuyến của trẻ em) thì không được sử dụng trang web này.
Quy định pháp luật có thể khác biệt nếu máy chủ này ở khu vực địa lý khác.
Nếu có thay đổi chính sách bảo mật, chúng tôi sẽ đăng những thay đổi đó ở mục này.
Tài liệu này phát hành dưới hình thức CC-BY-SA và được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018.
Chỉnh sửa và hoàn thiện từ Discourse.
- title: "%{instance} Điều khoản dịch vụ và chính sách bảo mật" + title: Quy tắc của %{instance} themes: contrast: Mastodon (Độ tương phản cao) default: Mastodon (Tối) @@ -1378,7 +1378,7 @@ vi: final_action: Viết tút mới final_step: 'Viết tút mới! Ngay cả khi chưa có người theo dõi, người khác vẫn có thể xem tút công khai của bạn trên bảng tin máy chủ và trong hashtag. Hãy giới thiệu bản thân với hashtag #introduction.' full_handle: Tên đầy đủ của bạn - full_handle_hint: Đây cũng là địa chỉ được dùng để tương tác với tất cả mọi người. + full_handle_hint: Đây cũng là địa chỉ được dùng để giao tiếp với tất cả mọi người. review_preferences_action: Tùy chỉnh giao diện review_preferences_step: Tùy chỉnh mọi thứ! Chẳng hạn như chọn loại email nào bạn muốn nhận hoặc trạng thái đăng tút mặc định mà bạn muốn dùng. Hãy tắt tự động phát GIF nếu bạn dễ bị chóng mặt. subject: Chào mừng đến với Mastodon @@ -1398,7 +1398,7 @@ vi: signed_in_as: 'Đăng nhập với tư cách là:' suspicious_sign_in_confirmation: Đây là lần đầu tiên bạn đăng nhập trên thiết bị này. Vì vậy, chúng tôi sẽ gửi một mã an toàn đến email của bạn để xác thực danh tính. verification: - explanation_html: 'Bạn có thể xác minh mình là chủ sở hữu của các trang web ở đầu trang cá nhân của bạn. Để xác minh, trang web phải chèn mãrel="me"
. Nội dung văn bản của liên kết không quan trọng. Đây là một ví dụ:'
+ explanation_html: 'Bạn có thể xác minh mình là chủ sở hữu của các trang web ở đầu trang cá nhân của bạn. Để xác minh, trang web phải chèn mã rel="me"
. Văn bản thay thế cho liên kết không quan trọng. Đây là một ví dụ:'
verification: Xác minh
webauthn_credentials:
add: Thêm khóa bảo mật mới
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index add1b6632..d9730d9f1 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -18,14 +18,14 @@ zh-CN:
contact_unavailable: 未公开
discover_users: 发现用户
documentation: 文档
- federation_hint_html: 在%{instance} 上拥有账号后,你可以关注任何 Mastodon 服务器或其他服务器上的人。
+ federation_hint_html: 在 %{instance} 上拥有账号后,你可以关注任何兼容 Mastodon 服务器上的人。
get_apps: 尝试移动应用
hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例
instance_actor_flash: "这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。 \n"
learn_more: 了解详情
privacy_policy: 隐私政策
rules: 服务器规则
- rules_html: 如果您想要在此Mastodon服务器上拥有一个账户,您必须遵守相应的规则,摘要如下:
+ rules_html: 如果你想要在此 Mastodon 服务器上拥有一个账户,你必须遵守相应的规则,摘要如下:
see_whats_happening: 看一看现在在发生什么
server_stats: 服务器统计数据:
source_code: 源代码
@@ -51,8 +51,8 @@ zh-CN:
what_is_mastodon: Mastodon 是什么?
accounts:
choices_html: "%{name} 的推荐:"
- endorsements_hint: 您可以在web界面上推荐你关注的人,他们会出现在这里。
- featured_tags_hint: 您可以精选一些话题标签展示在这里。
+ endorsements_hint: 你可以在 Web 界面上推荐你关注的人,他们会显示在这里。
+ featured_tags_hint: 你可以精选一些话题标签展示在这里。
follow: 关注
followers:
other: 关注者
@@ -69,7 +69,7 @@ zh-CN:
people_followed_by: "%{name} 关注的人"
people_who_follow: 关注 %{name} 的人
pin_errors:
- following: 您必须关注您要推荐的人
+ following: 你必须关注你要推荐的人
posts:
other: 嘟文
posts_tab_heading: 嘟文
@@ -196,15 +196,15 @@ zh-CN:
statuses: 嘟文
subscribe: 订阅
suspended: 已封禁
- suspension_irreversible: 该帐号的数据已被不可逆转地删除。您可以取消暂停该帐号以使其可用,但它不会恢复以前拥有的任何数据。
- suspension_reversible_hint_html: 帐号已封禁,数据将在 %{date} 完全删除。 在此之前,帐号仍可恢复,并且没有任何不良影响。 如果您想立即移除该帐号的所有数据,可以在下面进行。
+ suspension_irreversible: 该帐号的数据已被不可逆转地删除。你可以取消暂停该帐号以使其可用,但它不会恢复以前拥有的任何数据。
+ suspension_reversible_hint_html: 帐号已封禁,数据将在 %{date} 完全删除。 在此之前,帐号仍可恢复,并且没有任何不良影响。 如果你想立即移除该帐号的所有数据,可以在下面进行。
time_in_queue: 已经等待了 %{time}
title: 用户
unconfirmed_email: 待验证的电子邮件地址
undo_sensitized: 去除敏感内容标记
undo_silenced: 解除隐藏
undo_suspension: 解除封禁
- unsilenced_msg: 成功解除 %{username} 的帐号限制
+ unsilenced_msg: 成功解除对 %{username} 的隐藏
unsubscribe: 取消订阅
unsuspended_msg: 已成功取消封禁 %{username} 的帐号
username: 用户名
@@ -248,7 +248,7 @@ zh-CN:
sensitive_account: 将你帐号中的媒体标记为敏感内容
silence_account: 隐藏用户
suspend_account: 封禁用户
- unassigned_report: 取消举报的报告
+ unassigned_report: 取消报告的指派
unsensitive_account: 去除你帐号中媒体的敏感内容标记
unsilence_account: 解除账号隐藏
unsuspend_account: 解除账号封禁
@@ -343,7 +343,7 @@ zh-CN:
listed: 已显示
new:
title: 添加新的自定义表情
- not_permitted: 您没有权限进行此操作
+ not_permitted: 你没有权限进行此操作
overwrite: 覆盖
shortcode: 短代码
shortcode_hint: 至少 2 个字符,只能使用字母、数字和下划线
@@ -392,15 +392,15 @@ zh-CN:
destroyed_msg: 域名屏蔽已撤销
domain: 域名
edit: 编辑域名屏蔽
- existing_domain_block_html: 您已经对 %{name} 施加了更严格的限制,您需要先 解封。
+ existing_domain_block_html: 你已经对 %{name} 施加了更严格的限制,你需要先 解封。
new:
create: 添加屏蔽
hint: 域名屏蔽不会阻止该域名下的帐户进入本站的数据库,但是会对来自这个域名的帐户自动进行预先设置的管理操作。
severity:
- desc_html: 选择自动隐藏会将该域名下帐户发送的嘟文设置为仅关注者可见;选择自动封禁会将该域名下帐户发送的嘟文、媒体文件以及个人资料数据从本实例上删除;如果你只是想拒绝接收来自该域名的任何媒体文件,请选择无。
+ desc_html: 选择隐藏会将该域名下帐户发送的嘟文设置为仅关注者可见;选择封禁会将该域名下帐户发送的嘟文、媒体文件以及个人资料数据从本实例上删除;如果你只是想拒绝接收来自该域名的任何媒体文件,请选择无。
noop: 无
- silence: 自动隐藏
- suspend: 自动封禁
+ silence: 隐藏
+ suspend: 封禁
title: 新增域名屏蔽
obfuscate: 混淆域名
obfuscate_hint: 如果启用了域名列表公开限制,就部分混淆列表中的域名
@@ -445,7 +445,7 @@ zh-CN:
status: 嘟文
suppress: 禁用推荐关注
suppressed: 已禁用
- title: 推荐关注
+ title: 关注推荐
unsuppress: 恢复推荐关注
instances:
back_to_all: 全部
@@ -565,9 +565,9 @@ zh-CN:
rules:
add_new: 添加规则
delete: 删除
- description_html: 虽然大多数人都声称已经阅读并同意服务条款,但通常人们只有在出现问题后才会阅读。所以写一个简单的要点列表吧,能让大家一目了然。每条规则要尽量简单明了,但也别分出太多条目来。
+ description_html: 虽然大多数人都声称已经阅读并同意服务条款,但通常人们只有在出现问题后才会阅读。所以写一个简单的要点列表吧,能让大家一目了然。试着让每条规则尽量简单明了,但也别分出太多条目来。
edit: 编辑规则
- empty: 尚未定义提供商。
+ empty: 尚未定义服务器规则。
title: 实例规则
settings:
activity_api_enabled:
@@ -682,7 +682,7 @@ zh-CN:
action: 管理服务器规则
message_html: 你没有定义任何服务器规则。
sidekiq_process_check:
- message_html: 没有运行 %{value} 队列的 Sidekiq 进程。请检查您的 Sidekiq 配置
+ message_html: "%{value} 队列未运行任何 Sidekiq 进程。请检查你的 Sidekiq 配置"
tags:
accounts_today: 今日活跃用户
accounts_week: 本周活跃用户
@@ -703,11 +703,11 @@ zh-CN:
add_new: 添加新条目
delete: 删除
edit_preset: 编辑预置警告
- empty: 您还没有添加任何兴趣。
+ empty: 你尚未定义任何警告预设。
title: 管理预设警告
admin_mailer:
new_pending_account:
- body: 新帐户的详细信息如下。您可以批准或拒绝此申请。
+ body: 新帐户的详细信息如下。你可以批准或拒绝此申请。
subject: 在 %{instance} 上有新帐号 ( %{username}) 需要审核
new_report:
body: "%{reporter} 报告了用户 %{target}"
@@ -718,14 +718,14 @@ zh-CN:
subject: 在 %{instance} 有新话题 (#%{name}) 待审核
aliases:
add_new: 创建别名
- created_msg: 成功创建了一个新别名。您现在可以从旧账户开始迁移了。
+ created_msg: 成功创建了一个新别名。你现在可以从旧账户开始迁移了。
deleted_msg: 成功移除别名。已经无法从该帐户移动到此帐户了。
empty: 你没有设置别名
hint_html: 如果你想把另一个帐号迁移到这里,你可以先在这里创建一个别名。如果你想把关注者迁移过来,这一步是必须的。设置别名的操作时无害而且可以恢复的。帐号迁移的操作会从旧帐号开始。
remove: 取消关联别名
appearance:
- advanced_web_interface: 高级 web 界面
- advanced_web_interface_hint: 如果你想使用整个屏幕宽度,高级 web 界面允许您配置多个不同的栏目,可以同时看到更多的信息:主页、通知、跨站时间轴、任意数量的列表和话题标签。
+ advanced_web_interface: 高级 Web 界面
+ advanced_web_interface_hint: 如果你想使用整个屏幕宽度,高级 Web 界面允许你配置多个不同的栏目,可以同时看到更多的信息:主页、通知、跨站时间轴、任意数量的列表和话题标签。
animations_and_accessibility: 动画和访问选项
confirmation_dialogs: 确认对话框
discovery: 发现
@@ -758,15 +758,15 @@ zh-CN:
delete_account: 删除帐户
delete_account_html: 如果你想删除你的帐户,请点击这里继续。你需要确认你的操作。
description:
- prefix_invited_by_user: "@%{name} 邀请您加入这个Mastodon服务器!"
+ prefix_invited_by_user: "@%{name} 邀请你加入这个Mastodon服务器!"
prefix_sign_up: 现在就注册 Mastodon!
suffix: 注册一个帐号,你就可以关注别人、发布嘟文、并和其它任何Mastodon服务器上的用户交流,而且还有其它更多功能!
didnt_get_confirmation: 没有收到确认邮件?
- dont_have_your_security_key: 没有您的安全密钥?
+ dont_have_your_security_key: 没有你的安全密钥?
forgot_password: 忘记密码?
invalid_reset_password_token: 密码重置令牌无效或已过期。请重新发起重置密码请求。
link_to_otp: 输入从手机中获得的两步验证代码或恢复代码
- link_to_webauth: 使用您的安全密钥设备
+ link_to_webauth: 使用你的安全密钥设备
login: 登录
logout: 登出
migrate_account: 迁移到另一个帐户
@@ -788,9 +788,9 @@ zh-CN:
status:
account_status: 帐户状态
confirming: 等待电子邮件确认完成。
- functional: 您的帐号可以正常使用了。
- pending: 工作人员正在审核您的申请。这需要花点时间。在申请被批准后,您将收到一封电子邮件。
- redirecting_to: 您的帐户无效,因为它已被设置为跳转到 %{acct}
+ functional: 你的帐号可以正常使用了。
+ pending: 工作人员正在审核你的申请。这需要花点时间。在申请被批准后,你将收到一封电子邮件。
+ redirecting_to: 你的帐户无效,因为它已被设置为跳转到 %{acct}
too_fast: 表单提交过快,请重试。
trouble_logging_in: 登录有问题?
use_security_key: 使用安全密钥
@@ -808,7 +808,7 @@ zh-CN:
title: 关注 %{acct}
challenge:
confirm: 继续
- hint_html: "注意:接下来一小时内我们不会再次要求您输入密码。"
+ hint_html: "注意:接下来一小时内我们不会再次要求你输入密码。"
invalid_password: 无效密码
prompt: 确认密码以继续
crypto:
@@ -834,22 +834,22 @@ zh-CN:
x_months: "%{count}个月"
x_seconds: "%{count}秒"
deletes:
- challenge_not_passed: 您输入的信息不正确
+ challenge_not_passed: 你输入的信息不正确
confirm_password: 输入你当前的密码来验证身份
- confirm_username: 输入您的用户名以继续
+ confirm_username: 输入你的用户名以继续
proceed: 删除帐户
success_msg: 你的帐户已经成功删除
warning:
before: 在删除前,请仔细阅读下列说明:
caches: 已被其他服务器缓存的内容可能还会保留
- data_removal: 您的嘟文和其他数据将被永久删除
- email_change_html: 您可以 更换邮箱地址 无需删除账号
+ data_removal: 你的嘟文和其他数据将被永久删除
+ email_change_html: 你可以 更换邮箱地址 无需删除账号
email_contact_html: 如果它还没送到,你可以发邮件给 %{email} 寻求帮助。
- email_reconfirmation_html: 如果您没有收到确认邮件,请点击 重新发送 。
- irreversible: 您将无法恢复或重新激活您的帐户
+ email_reconfirmation_html: 如果你没有收到确认邮件,请点击 重新发送 。
+ irreversible: 你将无法恢复或重新激活你的帐户
more_details_html: 更多细节,请查看 隐私政策 。
- username_available: 您的用户名现在又可以使用了
- username_unavailable: 您的用户名仍将无法使用
+ username_available: 你的用户名现在又可以使用了
+ username_unavailable: 你的用户名仍将无法使用
directories:
directory: 用户目录
explanation: 根据兴趣发现用户
@@ -857,7 +857,7 @@ zh-CN:
domain_validator:
invalid_domain: 不是一个有效的域名
errors:
- '400': 您提交的请求无效或格式不正确。
+ '400': 你提交的请求无效或格式不正确。
'403': 你没有访问这个页面的权限。
'404': 无法找到你所要访问的页面。
'406': 页面无法处理请求。
@@ -887,13 +887,13 @@ zh-CN:
csv: CSV
domain_blocks: 域名屏蔽
lists: 列表
- mutes: 隐藏的用户
+ mutes: 你静音的用户
storage: 媒体文件存储
featured_tags:
add_new: 添加新条目
errors:
limit: 你所推荐的话题标签数已达上限
- hint_html: "什么是精选话题标签? 它们被显示在您的公开个人资料中的突出位置,人们可以在这些标签下浏览您的公共嘟文。 它们是跟踪创作或长期项目的进度的重要工具。"
+ hint_html: "什么是精选话题标签? 它们被显示在你的公开个人资料中的突出位置,人们可以在这些标签下浏览你的公共嘟文。 它们是跟踪创作或长期项目的进度的重要工具。"
filters:
contexts:
account: 个人资料
@@ -908,7 +908,7 @@ zh-CN:
invalid_irreversible: 此功能只适用于主页时间轴或通知
index:
delete: 删除
- empty: 您没有过滤器。
+ empty: 你没有过滤器。
title: 过滤器
new:
title: 添加新的过滤器
@@ -999,39 +999,39 @@ zh-CN:
migrations:
acct: 新帐户的 用户名@域名
cancel: 取消跳转
- cancel_explanation: 取消跳转将会重新激活您当前的帐号,但是已经迁移到新账号的关注者不会回来。
+ cancel_explanation: 取消跳转将会重新激活你当前的帐号,但是已经迁移到新账号的关注者不会回来。
cancelled_msg: 成功取消跳转
errors:
- already_moved: 和您已经迁移过的帐号相同
+ already_moved: 和你已经迁移过的帐号相同
missing_also_known_as: 没有引用此帐号
move_to_self: 不能是当前帐户
not_found: 找不到
- on_cooldown: 您正处于冷却状态
+ on_cooldown: 你正处于冷却状态
followers_count: 迁移时的关注者
incoming_migrations: 从其它帐号迁移
- incoming_migrations_html: 要把另一个帐号移动到本帐号,首先您需要 创建一个帐号别名 。
- moved_msg: 您的帐号现在会跳转到%{acct} ,同时关注者也会迁移过去 。
- not_redirecting: 您的帐号当前未跳转到其它帐户。
- on_cooldown: 您最近已经迁移过您的帐号。此功能将在%{count} 天后再次可用。
+ incoming_migrations_html: 要把另一个帐号移动到本帐号,首先你需要 创建一个帐号别名 。
+ moved_msg: 你的帐号现在会跳转到%{acct} ,同时关注者也会迁移过去 。
+ not_redirecting: 你的帐号当前未跳转到其它帐户。
+ on_cooldown: 你最近已经迁移过你的帐号。此功能将在%{count} 天后再次可用。
past_migrations: 迁移记录
proceed_with_move: 移动关注者
- redirected_msg: 您的账号现在会跳转至 %{acct}
- redirecting_to: 您的帐户被跳转到了 %{acct}。
+ redirected_msg: 你的账号现在会跳转至 %{acct}
+ redirecting_to: 你的帐户被跳转到了 %{acct}。
set_redirect: 设置跳转
warning:
backreference_required: 新账号必须先引用现在这个帐号
before: 在继续前,请仔细阅读下列说明:
- cooldown: 移动后会有一个冷却期,在此期间您将无法再次移动
- disabled_account: 此后,您的当前帐户将无法使用。但是,您仍然有权导出数据或者重新激活。
+ cooldown: 移动后会有一个冷却期,在此期间你将无法再次移动
+ disabled_account: 此后,你的当前帐户将无法使用。但是,你仍然有权导出数据或者重新激活。
followers: 这步操作将把所有关注者从当前账户移动到新账户
only_redirect_html: 或者,你可以只在你的帐号资料上设置一个跳转。
other_data: 不会自动移动其它数据
- redirect: 在收到一个跳转通知后,您当前的帐号资料将会更新,并被排除在搜索范围外
+ redirect: 在收到一个跳转通知后,你当前的帐号资料将会更新,并被排除在搜索范围外
moderation:
title: 运营
move_handler:
carry_blocks_over_text: 这个用户迁移自你屏蔽过的 %{acct}
- carry_mutes_over_text: 这个用户迁移自你隐藏过的 %{acct}
+ carry_mutes_over_text: 这个用户迁移自你静音过的 %{acct}
copy_account_note_text: 这个用户迁移自 %{acct},你曾为其添加备注:
notification_mailer:
digest:
@@ -1085,7 +1085,7 @@ zh-CN:
trillion: T
otp_authentication:
code_hint: 输入认证应用生成的代码以确认操作
- description_html: 如果您使用身份验证应用启用了 双重身份验证, 登录将需要用到您的手机,它将生成您需要的令牌。
+ description_html: 如果你使用身份验证应用启用了 双重身份验证, 登录将需要用到你的手机,它将生成你需要的令牌。
enable: 启用
instructions_html: "请使用 Google 身份验证器或其他的TOTP双重认证手机应用扫描此处的二维码。启用双重认证后,在登录时,你需要输入该应用生成的代码。"
manual_instructions: 如果你无法扫描二维码,请手动输入下列文本:
@@ -1139,20 +1139,20 @@ zh-CN:
no_account_html: 还没有帐号?你可以注册一个
proceed: 确认关注
prompt: 你正准备关注:
- reason_html: "为什么需要这个步骤? %{instance}
可能不是您所注册的服务器,所以我们需要先跳转到您所在的服务器。"
+ reason_html: "为什么需要这个步骤? %{instance}
可能不是你所注册的服务器,所以我们需要先跳转到你所在的服务器。"
remote_interaction:
favourite:
proceed: 确认标记为喜欢
- prompt: 您想要标记此嘟文为喜欢:
+ prompt: 你想要标记此嘟文为喜欢:
reblog:
proceed: 确认转嘟
- prompt: 您想要转嘟此条:
+ prompt: 你想要转嘟此条:
reply:
proceed: 确认回复
- prompt: 您想要回复此嘟文:
+ prompt: 你想要回复此嘟文:
scheduled_statuses:
- over_daily_limit: 您已超出每日定时嘟文的上限(%{limit} 条)
- over_total_limit: 您已超出定时嘟文的上限(%{limit} 条)
+ over_daily_limit: 你已超出每日定时嘟文的上限(%{limit} 条)
+ over_total_limit: 你已超出定时嘟文的上限(%{limit} 条)
too_soon: 所定的时间必须在未来
sessions:
activity: 最后一次活跃的时间
@@ -1272,29 +1272,29 @@ zh-CN:
我们向您收集的任何信息均可通过以下方式使用:
+我们向你收集的任何信息均可通过以下方式使用:
当您输入,提交或访问您的个人信息时,我们会实施各种安全措施以维护您的个人信息的安全。 除此之外,您的浏览器会话以及应用程序和API之间的流量都使用SSL进行保护,您的密码使用强大的单向算法进行哈希处理。 您可以启用双因素身份验证,以进一步保护对您帐户的访问。
+当你输入,提交或访问你的个人信息时,我们会实施各种安全措施以维护你的个人信息的安全。 除此之外,你的浏览器会话以及应用程序和API之间的流量都使用SSL进行保护,你的密码使用强大的单向算法进行哈希处理。 你可以启用双因素身份验证,以进一步保护对你帐户的访问。
您可以请求并下载我们内容的存档,包括您的帖子,媒体附件,个人资料图片和标题图片。
+你可以请求并下载我们内容的存档,包括你的帖子,媒体附件,个人资料图片和标题图片。
-您可以随时不可逆转地删除您的帐户。
+你可以随时不可逆转地删除你的帐户。
是。 Cookie是网站或其服务提供商通过Web浏览器传输到计算机硬盘的小文件(如果允许)。 这些cookie使网站能够识别您的浏览器,如果您有注册帐户,则将其与您的注册帐户相关联。
+是。 Cookie是网站或其服务提供商通过Web浏览器传输到计算机硬盘的小文件(如果允许)。 这些cookie使网站能够识别你的浏览器,如果你有注册帐户,则将其与你的注册帐户相关联。
-我们使用Cookie来了解并保存您对未来访问的偏好。
+我们使用Cookie来了解并保存你对未来访问的偏好。
我们不会将您的个人身份信息出售,交易或以其他方式转让给外方。 这不包括协助我们操作我们的网站,开展业务或为您服务的受信任的第三方,只要这些方同意保密这些信息。 当我们认为发布适合遵守法律,执行我们的网站政策或保护我们或他人的权利,财产或安全时,我们也可能会发布您的信息。
+我们不会将你的个人身份信息出售,交易或以其他方式转让给外方。 这不包括协助我们操作我们的网站,开展业务或为你服务的受信任的第三方,只要这些方同意保密这些信息。 当我们认为发布适合遵守法律,执行我们的网站政策或保护我们或他人的权利,财产或安全时,我们也可能会发布你的信息。
-您的公共内容可能会被网络中的其他服务器下载。 您的公开帖子和关注者帖子会发送到关注者所在的服务器,并且直接邮件会传递到收件人的服务器,只要这些关注者或收件人位于与此不同的服务器上。
+你的公共内容可能会被网络中的其他服务器下载。 你的公开帖子和关注者帖子会发送到关注者所在的服务器,并且直接邮件会传递到收件人的服务器,只要这些关注者或收件人位于与此不同的服务器上。
-当您授权应用程序使用您的帐户时,根据您批准的权限范围,它可能会访问您的公开个人资料信息,以下列表,您的关注者,您的列表,所有帖子和您的收藏夹。 应用程序永远不能访问您的电子邮件地址或密码。
+当你授权应用程序使用你的帐户时,根据你批准的权限范围,它可能会访问你的公开个人资料信息,以下列表,你的关注者,你的列表,所有帖子和你的收藏夹。 应用程序永远不能访问你的电子邮件地址或密码。
如果此服务器位于欧盟或欧洲经济区:我们的网站,产品和服务都是针对至少16岁的人。 如果您未满16岁,则符合GDPR的要求(General Data Protection Regulation) 不要使用这个网站。
+如果此服务器位于欧盟或欧洲经济区:我们的网站,产品和服务都是针对至少16岁的人。 如果你未满16岁,则符合GDPR的要求(General Data Protection Regulation) 不要使用这个网站。
-如果此服务器位于美国:我们的网站,产品和服务均面向至少13岁的人。 如果您未满13岁,则符合COPPA的要求 (Children's Online Privacy Protection Act) 不要使用这个网站。
+如果此服务器位于美国:我们的网站,产品和服务均面向至少13岁的人。 如果你未满13岁,则符合COPPA的要求 (Children's Online Privacy Protection Act) 不要使用这个网站。
如果此服务器位于另一个辖区,则法律要求可能不同。
@@ -1385,24 +1385,24 @@ zh-CN: title: 登录请求 warning: explanation: - disable: 虽然您的帐户被冻结,您的帐户数据仍然完整;但是您无法在解锁前执行任何操作。 + disable: 虽然你的帐户被冻结,你的帐户数据仍然完整;但是你无法在解锁前执行任何操作。 sensitive: 你上传的媒体文件和媒体链接将被视作敏感内容。 - silence: 当您的帐户受限时,只有已经关注过你的人才会这台服务器上看到你的嘟文,并且您会被排除在各种公共列表之外。但是,其他人仍然可以手动关注你。 - suspend: 您的帐户已被封禁,所有的嘟文和您上传的媒体文件都已经从该服务器和您的关注者的服务器上删除并且不可恢复。 - get_in_touch: 您可回复该邮件以联系 %{instance} 的工作人员。 + silence: 当你的帐户被隐藏时,只有已经关注你的人才会这台服务器上看到你的嘟文,并且你会被排除在各种公共列表之外。但是,其他人仍然可以手动关注你。 + suspend: 你的帐户已被封禁,所有的嘟文和你上传的媒体文件都已经从该服务器和你的关注者的服务器上删除并且不可恢复。 + get_in_touch: 你可回复该邮件以联系 %{instance} 的工作人员。 review_server_policies: 查看服务器政策 statuses: 具体来说,适用于: subject: - disable: 您的帐户 %{acct} 已被冻结 + disable: 你的帐户 %{acct} 已被冻结 none: 对 %{acct} 的警告 sensitive: 你的帐号 %{acct} 所发布的媒体已被标记为敏感内容 - silence: 您的帐户 %{acct} 已经受限 - suspend: 您的帐户 %{acct} 已被封禁。 + silence: 你的帐户 %{acct} 已被隐藏 + suspend: 你的帐户 %{acct} 已被封禁。 title: disable: 账号已冻结 none: 警示 sensitive: 你的媒体被标记为敏感内容 - silence: 帐户受限 + silence: 帐户被隐藏 suspend: 账号被封禁 welcome: edit_profile_action: 设置个人资料 @@ -1422,7 +1422,7 @@ zh-CN: tips: 小贴士 title: "%{name},欢迎你的加入!" users: - follow_limit_reached: 您不能关注超过 %{limit} 个人 + follow_limit_reached: 你不能关注超过 %{limit} 个人 generic_access_help_html: 登录账号出现问题?你可以向 %{email} 寻求帮助 invalid_otp_token: 输入的双重认证代码无效 invalid_sign_in_token: 无效安全码 @@ -1431,22 +1431,22 @@ zh-CN: signed_in_as: 当前登录的帐户: suspicious_sign_in_confirmation: 你似乎没有在这台设备上登录过,并且你也有很久没有登录过了,所以我们给你的电子邮箱发了封邮件,想确认一下确实是你。 verification: - explanation_html: 您可以 验证自己是个人资料元数据中的某个链接的所有者。 为此,被链接网站必须包含一个到您的 Mastodon 主页的链接。链接中 必须 包括rel="me"
属性。链接的文本内容可以随意填写。例如:
+ explanation_html: 你可以 验证自己是个人资料元数据中的某个链接的所有者。 为此,被链接网站必须包含一个到你的 Mastodon 主页的链接。链接中 必须 包括 rel="me"
属性。链接的文本内容可以随意填写。例如:
verification: 验证
webauthn_credentials:
add: 添加新的安全密钥
create:
- error: 添加您的安全密钥时出错。请重试。
- success: 您的安全密钥已成功添加。
+ error: 添加你的安全密钥时出错。请重试。
+ success: 你的安全密钥已成功添加。
delete: 删除
- delete_confirmation: 您确认要删除这个安全密钥吗?
- description_html: 如果您启用 安全密钥身份验证,登录将需要您使用您的安全密钥。
+ delete_confirmation: 你确认要删除这个安全密钥吗?
+ description_html: 如果你启用 安全密钥身份验证,登录将需要你使用你的安全密钥。
destroy:
- error: 删除您的安全密钥时出错。请重试。
- success: 您的安全密钥已成功删除。
+ error: 删除你的安全密钥时出错。请重试。
+ success: 你的安全密钥已成功删除。
invalid_credential: 无效的安全密钥
- nickname_hint: 输入您新安全密钥的昵称
- not_enabled: 您尚未启用 WebAuthn
+ nickname_hint: 输入你新安全密钥的昵称
+ not_enabled: 你尚未启用 WebAuthn
not_supported: 此浏览器不支持安全密钥
otp_required: 要使用安全密钥,请先启用两步验证。
registered_on: 注册于 %{date}
diff --git a/db/migrate/20180419235016_add_quote_id_to_statuses.rb b/db/migrate/20180419235016_add_quote_id_to_statuses.rb
new file mode 100644
index 000000000..d7550b248
--- /dev/null
+++ b/db/migrate/20180419235016_add_quote_id_to_statuses.rb
@@ -0,0 +1,5 @@
+class AddQuoteIdToStatuses < ActiveRecord::Migration[5.1]
+ def change
+ add_column :statuses, :quote_id, :bigint, null: true, default: nil
+ end
+end
diff --git a/db/migrate/20200301102028_add_index_to_statuses_quote_id.rb b/db/migrate/20200301102028_add_index_to_statuses_quote_id.rb
new file mode 100644
index 000000000..45293db98
--- /dev/null
+++ b/db/migrate/20200301102028_add_index_to_statuses_quote_id.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddIndexToStatusesQuoteId < ActiveRecord::Migration[5.2]
+ disable_ddl_transaction!
+
+ def change
+ add_index :statuses, :quote_id, algorithm: :concurrently
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 583bdf317..fff9e49ef 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -815,11 +815,13 @@ ActiveRecord::Schema.define(version: 2021_05_07_001928) do
t.bigint "in_reply_to_account_id"
t.bigint "poll_id"
t.datetime "deleted_at"
+ t.bigint "quote_id"
t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20190820", order: { id: :desc }, where: "(deleted_at IS NULL)"
t.index ["id", "account_id"], name: "index_statuses_local_20190824", order: { id: :desc }, where: "((local OR (uri IS NULL)) AND (deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))"
t.index ["id", "account_id"], name: "index_statuses_public_20200119", order: { id: :desc }, where: "((deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))"
t.index ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id"
t.index ["in_reply_to_id"], name: "index_statuses_on_in_reply_to_id"
+ t.index ["quote_id"], name: "index_statuses_on_quote_id"
t.index ["reblog_of_id", "account_id"], name: "index_statuses_on_reblog_of_id_and_account_id"
t.index ["uri"], name: "index_statuses_on_uri", unique: true
end
diff --git a/lib/mastodon/maintenance_cli.rb b/lib/mastodon/maintenance_cli.rb
index 9f1eaf263..8e2084e33 100644
--- a/lib/mastodon/maintenance_cli.rb
+++ b/lib/mastodon/maintenance_cli.rb
@@ -14,7 +14,7 @@ module Mastodon
end
MIN_SUPPORTED_VERSION = 2019_10_01_213028
- MAX_SUPPORTED_VERSION = 2021_03_08_133107
+ MAX_SUPPORTED_VERSION = 2021_05_07_001928
# Stubs to enjoy ActiveRecord queries while not depending on a particular
# version of the code/database
@@ -42,6 +42,8 @@ module Mastodon
class CustomEmojiCategory < ApplicationRecord; end
class Bookmark < ApplicationRecord; end
class WebauthnCredential < ApplicationRecord; end
+ class FollowRecommendationSuppression < ApplicationRecord; end
+ class CanonicalEmailBlock < ApplicationRecord; end
class PreviewCard < ApplicationRecord
self.inheritance_column = false
@@ -88,6 +90,7 @@ module Mastodon
]
owned_classes << AccountDeletionRequest if ActiveRecord::Base.connection.table_exists?(:account_deletion_requests)
owned_classes << AccountNote if ActiveRecord::Base.connection.table_exists?(:account_notes)
+ owned_classes << FollowRecommendationSuppression if ActiveRecord::Base.connection.table_exists?(:follow_recommendation_suppressions)
owned_classes.each do |klass|
klass.where(account_id: other_account.id).find_each do |record|
@@ -111,6 +114,12 @@ module Mastodon
end
end
end
+
+ if ActiveRecord::Base.connection.table_exists?(:canonical_email_blocks)
+ CanonicalEmailBlock.where(reference_account_id: other_account.id).find_each do |record|
+ record.update_attribute(:reference_account_id, id)
+ end
+ end
end
end
@@ -466,6 +475,11 @@ module Mastodon
@prompt.say 'Restoring tags indexes…'
ActiveRecord::Base.connection.add_index :tags, 'lower((name)::text)', name: 'index_tags_on_name_lower', unique: true
+
+ if ActiveRecord::Base.connection.indexes(:tags).any? { |i| i.name == 'index_tags_on_name_lower_btree' }
+ @prompt.say 'Reindexing textual indexes on tags…'
+ ActiveRecord::Base.connection.execute('REINDEX INDEX index_tags_on_name_lower_btree;')
+ end
end
def deduplicate_webauthn_credentials!
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index a8d7a8f95..921727cfc 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -17,7 +17,7 @@ module Mastodon
end
def flags
- 'rc2'
+ ''
end
def suffix
diff --git a/lib/paperclip/gif_transcoder.rb b/lib/paperclip/gif_transcoder.rb
index 74aa1a0b2..d14465c01 100644
--- a/lib/paperclip/gif_transcoder.rb
+++ b/lib/paperclip/gif_transcoder.rb
@@ -108,9 +108,11 @@ module Paperclip
final_file = Paperclip::Transcoder.make(file, options, attachment)
- attachment.instance.file_file_name = File.basename(attachment.instance.file_file_name, '.*') + '.mp4'
- attachment.instance.file_content_type = 'video/mp4'
- attachment.instance.type = MediaAttachment.types[:gifv]
+ if options[:style] == :original
+ attachment.instance.file_file_name = File.basename(attachment.instance.file_file_name, '.*') + '.mp4'
+ attachment.instance.file_content_type = 'video/mp4'
+ attachment.instance.type = MediaAttachment.types[:gifv]
+ end
final_file
end
@@ -118,7 +120,7 @@ module Paperclip
private
def needs_convert?
- options[:style] == :original && GifReader.animated?(file.path)
+ GifReader.animated?(file.path)
end
end
end
diff --git a/lib/sanitize_ext/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb
index a2e1d9d01..de6b132ee 100644
--- a/lib/sanitize_ext/sanitize_config.rb
+++ b/lib/sanitize_ext/sanitize_config.rb
@@ -31,6 +31,7 @@ class Sanitize
next true if /^(h|p|u|dt|e)-/.match?(e) # microformats classes
next true if /^(mention|hashtag)$/.match?(e) # semantic classes
next true if /^(ellipsis|invisible)$/.match?(e) # link formatting classes
+ next true if /^quote-inline$/.match?(e) # quote inline classes
end
node['class'] = class_list.join(' ')
diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake
index d1de17b7c..86c358a94 100644
--- a/lib/tasks/repo.rake
+++ b/lib/tasks/repo.rake
@@ -1,27 +1,34 @@
# frozen_string_literal: true
+REPOSITORY_NAME = 'tootsuite/mastodon'
+
namespace :repo do
desc 'Generate the AUTHORS.md file'
task :authors do
file = File.open(Rails.root.join('AUTHORS.md'), 'w')
+
file << <<~HEADER
Authors
=======
- Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
+ Mastodon is available on [GitHub](https://github.com/#{REPOSITORY_NAME})
and provided thanks to the work of the following contributors:
HEADER
- url = 'https://api.github.com/repos/tootsuite/mastodon/contributors?anon=1'
+ url = "https://api.github.com/repos/#{REPOSITORY_NAME}/contributors?anon=1"
+
HttpLog.config.compact_log = true
+
while url.present?
- response = HTTP.get(url)
+ response = HTTP.get(url)
contributors = Oj.load(response.body)
+
contributors.each do |c|
file << "* [#{c['login']}](#{c['html_url']})\n" if c['login']
file << "* [#{c['name']}](mailto:#{c['email']})\n" if c['name']
end
+
url = LinkHeader.parse(response.headers['Link']).find_link(%w(rel next))&.href
end
@@ -47,7 +54,7 @@ namespace :repo do
response = nil
loop do
- response = HTTP.headers('Authorization' => "token #{ENV['GITHUB_API_TOKEN']}").get("https://api.github.com/repos/tootsuite/mastodon/pulls/#{pull_request_number}")
+ response = HTTP.headers('Authorization' => "token #{ENV['GITHUB_API_TOKEN']}").get("https://api.github.com/repos/#{REPOSITORY_NAME}/pulls/#{pull_request_number}")
if response.code == 403
sleep_for = (response.headers['X-RateLimit-Reset'].to_i - Time.now.to_i).abs
@@ -83,12 +90,46 @@ namespace :repo do
missing_yaml_files = I18n.available_locales.reject { |locale| File.exist?(Rails.root.join('config', 'locales', "#{locale}.yml")) }
missing_json_files = I18n.available_locales.reject { |locale| File.exist?(Rails.root.join('app', 'javascript', 'mastodon', 'locales', "#{locale}.json")) }
- if missing_json_files.empty? && missing_yaml_files.empty?
- puts pastel.green('OK')
- else
- puts pastel.red("Missing YAML files: #{pastel.bold(missing_yaml_files.join(', '))}") unless missing_yaml_files.empty?
- puts pastel.red("Missing JSON files: #{pastel.bold(missing_json_files.join(', '))}") unless missing_json_files.empty?
+ locales_in_files = Dir[Rails.root.join('config', 'locales', '*.yml')].map do |path|
+ file_name = File.basename(path)
+ file_name.gsub(/\A(doorkeeper|devise|activerecord|simple_form)\./, '').gsub(/\.yml\z/, '').to_sym
+ end.uniq.compact
+
+ missing_available_locales = locales_in_files - I18n.available_locales
+ missing_locale_names = I18n.available_locales.reject { |locale| SettingsHelper::HUMAN_LOCALES.key?(locale) }
+
+ critical = false
+
+ unless missing_json_files.empty?
+ critical = true
+
+ puts pastel.red("You are missing JSON files for these locales: #{pastel.bold(missing_json_files.join(', '))}")
+ puts pastel.red('This will lead to runtime errors for users who have selected those locales')
+ puts pastel.red("Add the missing files or remove the locales from #{pastel.bold('I18n.available_locales')} in config/application.rb")
+ end
+
+ unless missing_yaml_files.empty?
+ critical = true
+
+ puts pastel.red("You are missing YAML files for these locales: #{pastel.bold(missing_yaml_files.join(', '))}")
+ puts pastel.red('This will lead to runtime errors for users who have selected those locales')
+ puts pastel.red("Add the missing files or remove the locales from #{pastel.bold('I18n.available_locales')} in config/application.rb")
+ end
+
+ unless missing_available_locales.empty?
+ puts pastel.yellow("You have locale files that are not enabled: #{pastel.bold(missing_available_locales.join(', '))}")
+ puts pastel.yellow("Add them to #{pastel.bold('I18n.available_locales')} in config/application.rb or remove them")
+ end
+
+ unless missing_locale_names.empty?
+ puts pastel.yellow("You are missing human-readable names for these locales: #{pastel.bold(missing_locale_names.join(', '))}")
+ puts pastel.yellow("Add them to #{pastel.bold('HUMAN_LOCALES')} in app/helpers/settings_helper.rb or remove the locales from #{pastel.bold('I18n.available_locales')} in config/application.rb")
+ end
+
+ if critical
exit(1)
+ else
+ puts pastel.green('OK')
end
end
end