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

Conflicts:
- `config/webpack/configuration.js`:
  Upstream updated the `js-yaml` dependency, which changed how to call it.
  Those changes conflicted because that code is pretty different in glitch-soc
  which has to deal with its more complex theming system.
  Proceeded to the same compatibility changes in glitch-soc's code.
- `package.json` and `yarn.lock`:
  Not really a conflict, just glitch-soc-specific dependencies textually too
  close to some dependencies updated upstream.
master
Claire 3 years ago
commit 90528f43bc
  1. 2
      .codeclimate.yml
  2. 552
      AUTHORS.md
  3. 16
      CHANGELOG.md
  4. 30
      Gemfile
  5. 167
      Gemfile.lock
  6. 2
      app/controllers/api/v1/accounts/featured_tags_controller.rb
  7. 8
      app/controllers/settings/pictures_controller.rb
  8. 49
      app/javascript/mastodon/components/__tests__/__snapshots__/button-test.js.snap
  9. 14
      app/javascript/mastodon/components/button.js
  10. 17
      app/javascript/mastodon/containers/media_container.js
  11. 12
      app/javascript/mastodon/features/account/components/header.js
  12. 2
      app/javascript/mastodon/features/list_timeline/index.js
  13. 10
      app/javascript/mastodon/features/ui/components/media_modal.js
  14. 4
      app/javascript/mastodon/features/video/index.js
  15. 206
      app/javascript/mastodon/locales/hy.json
  16. 32
      app/javascript/mastodon/locales/ml.json
  17. 8
      app/javascript/mastodon/locales/vi.json
  18. 21
      app/javascript/styles/mastodon/components.scss
  19. 4
      app/javascript/styles/mastodon/containers.scss
  20. 5
      app/javascript/styles/mastodon/rtl.scss
  21. 15
      app/javascript/styles/mastodon/statuses.scss
  22. 8
      app/models/concerns/account_interactions.rb
  23. 17
      app/models/concerns/follow_limitable.rb
  24. 2
      app/models/follow.rb
  25. 2
      app/models/follow_request.rb
  26. 15
      app/serializers/rest/account_featured_tag_serializer.rb
  27. 8
      app/serializers/rest/featured_tag_serializer.rb
  28. 2
      app/services/batched_remove_status_service.rb
  29. 9
      app/services/delete_account_service.rb
  30. 7
      app/services/follow_service.rb
  31. 8
      app/services/suspend_account_service.rb
  32. 8
      app/services/unsuspend_account_service.rb
  33. 2
      app/views/admin/reports/_status.html.haml
  34. 2
      app/views/media/player.html.haml
  35. 2
      app/views/statuses/_detailed_status.html.haml
  36. 2
      app/views/statuses/_simple_status.html.haml
  37. 2
      app/workers/authorize_follow_worker.rb
  38. 6
      app/workers/import/relationship_worker.rb
  39. 2
      app/workers/refollow_worker.rb
  40. 2
      app/workers/unfollow_follow_worker.rb
  41. 17
      config/locales/devise.hy.yml
  42. 89
      config/locales/hy.yml
  43. 10
      config/locales/ja.yml
  44. 4
      config/locales/ko.yml
  45. 11
      config/locales/oc.yml
  46. 10
      config/locales/simple_form.hy.yml
  47. 1
      config/locales/simple_form.ja.yml
  48. 36
      config/locales/vi.yml
  49. 2
      config/locales/zh-CN.yml
  50. 5
      config/locales/zh-HK.yml
  51. 8
      config/webpack/configuration.js
  52. 4
      dist/nginx.conf
  53. 2
      lib/mastodon/accounts_cli.rb
  54. 7
      lib/mastodon/emoji_cli.rb
  55. 2
      lib/mastodon/version.rb
  56. 54
      package.json
  57. 4
      spec/workers/refollow_worker_spec.rb
  58. 758
      yarn.lock

@ -30,7 +30,7 @@ plugins:
channel: eslint-7
rubocop:
enabled: true
channel: rubocop-0-92
channel: rubocop-1-70
sass-lint:
enabled: true
exclude_patterns:

@ -48,12 +48,12 @@ and provided thanks to the work of the following contributors:
* [takayamaki](https://github.com/takayamaki)
* [masarakki](https://github.com/masarakki)
* [ticky](https://github.com/ticky)
* [trwnh](https://github.com/trwnh)
* [ThisIsMissEm](https://github.com/ThisIsMissEm)
* [hinaloe](https://github.com/hinaloe)
* [hcmiya](https://github.com/hcmiya)
* [stephenburgess8](https://github.com/stephenburgess8)
* [Wonderfall](mailto:wonderfall@targaryen.house)
* [trwnh](https://github.com/trwnh)
* [matteoaquila](https://github.com/matteoaquila)
* [yukimochi](https://github.com/yukimochi)
* [palindromordnilap](https://github.com/palindromordnilap)
@ -705,308 +705,414 @@ This document is provided for informational purposes only. Since it is only upda
Following people have contributed to translation of Mastodon:
- ᏦᏁᎢᎵᏫ 😷 (*Spanish, Argentina*)
- Sveinn í Felli (*Icelandic*)
- ᏦᏁᎢᎵᏫ 😷 (KNTRO) (*Spanish, Argentina*)
- Sveinn í Felli (sveinki) (*Icelandic*)
- qezwan (*Persian, Sorani (Kurdish)*)
- Hồ Nhất Duy (kantcer) (*Vietnamese*)
- taicv (*Vietnamese*)
- ButterflyOfFire (*Arabic; French; Kabyle*)
- Duy (*Vietnamese*)
- Evert Prants (*Estonian*)
- Zoltán Gera (*Hungarian*)
- Daniele Lira Mereb (*Portuguese, Brazilian*)
- Kristijan Tkalec (*Slovenian*)
- stan ionut (*Romanian*)
- Ramdziana F Y (*Indonesian*)
- Michal Stanke (*Czech*)
- Xosé M. (*Galician; Spanish*)
- 奈卜拉 (*Chinese Simplified*)
- borys_sh (*Ukrainian*)
- Miguel Mayol (*Spanish; Catalan*)
- Zoltán Gera (gerazo) (*Hungarian*)
- ButterflyOfFire (BoFFire) (*French, Arabic, Kabyle*)
- adrmzz (*Sardinian*)
- Ramdziana F Y (rafeyu) (*Indonesian*)
- Evert Prants (IcyDiamond) (*Estonian*)
- Daniele Lira Mereb (danilmereb) (*Portuguese, Brazilian*)
- Xosé M. (XoseM) (*Spanish, Galician*)
- Kristijan Tkalec (lapor) (*Slovenian*)
- stan ionut (stanionut12) (*Romanian*)
- Besnik_b (*Albanian*)
- Thai Localization (*Thai*)
- Emanuel Pina (*Portuguese*)
- Jeong Arm (*Korean; Esperanto; Japanese*)
- Imre Kristoffer Eilertsen (*Norwegian*)
- Danial Behzadi (*Persian*)
- Osoitz (*Basque*)
- Peterandre (*Norwegian Nynorsk; Norwegian*)
- Jeroen (*Dutch*)
- spla (*Catalan; Spanish*)
- Iváns (*Galician*)
- 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*)
- spla (*Spanish, Catalan*)
- Imre Kristoffer Eilertsen (DandelionSprout) (*Norwegian*)
- Jeroen (jeroenpraat) (*Dutch*)
- borys_sh (*Ukrainian*)
- Miguel Mayol (mitcoes) (*Spanish, Catalan*)
- Danial Behzadi (danialbehzadi) (*Persian*)
- yeft (*Chinese Traditional, Chinese Traditional, Hong Kong*)
- koyu (*German*)
- Sasha Sorokin (*Russian; Vietnamese; Swedish; Catalan; Greek; Hungarian; Armenian; Albanian; Galician; French; Danish; German; Korean; Ukrainian*)
- Koala Yeung (yookoala) (*Chinese Traditional, Hong Kong*)
- Osoitz (*Basque*)
- Peterandre (*Norwegian, Norwegian Nynorsk*)
- tzium (*Sardinian*)
- 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*)
- tolstoevsky (*Russian*)
- enolp (*Asturian*)
- Masoud Abkenar (*Persian*)
- FédiQuébec (manuelviens) (*French*)
- lamnatos (*Greek*)
- Alix Rossi (*Corsican; French*)
- Maya Minatsuki (mayaeh) (*Japanese*)
- Masoud Abkenar (mabkenar) (*Persian*)
- Alessandro Levati (Oct326) (*Italian*)
- arshat (*Kazakh*)
- FédiQuébec (*French*)
- Marek Ľach (*Slovak; Polish*)
- Muha Aliss (*Turkish*)
- tolstoevsky (*Russian*)
- Emyn-Russell Nt Nefydd (*Welsh*)
- Aditoo17 (*Czech*)
- Maya Minatsuki (*Japanese*)
- ariasuni (*French; Esperanto*)
- Roboron (*Spanish*)
- Alessandro Levati (*Italian*)
- 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*)
- Marek Ľach (mareklach) (*Polish, Slovak*)
- Muha Aliss (muhaaliss) (*Turkish*)
- Jurica (ahjk) (*Croatian*)
- Aditoo17 (*Czech*)
- Diluns (*Occitan*)
- regulartranslator (*Portuguese, Brazilian*)
- gagik_ (*Armenian*)
- vishnuvaratharajan (*Tamil*)
- Marcin Mikołajczak (*Polish*)
- Yi-Jyun Pan (*Chinese Traditional*)
- adrmzz (*Sardinian*)
- Marcin Mikołajczak (mkljczkk) (*Czech, Polish, Russian*)
- regulartranslator (*Portuguese, Brazilian*)
- Akarshan Biswas (biswasab) (*Bengali, Sanskrit*)
- Yi-Jyun Pan (pan93412) (*Chinese Traditional*)
- 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*)
- Akarshan Biswas (*Bengali*)
- ThibG (*French, Icelandic*)
- xatier (*Chinese Traditional*)
- otrapersona (*Spanish, Spanish, Mexico*)
- atarashiako (*Chinese Simplified*)
- 101010 (*Polish*)
- 101010 (101010pl) (*Polish*)
- silkevicious (*Italian*)
- Bertil Hedkvist (*Swedish*)
- cybergene (*Japanese*)
- Floxu (fredrikdim1) (*Norwegian Nynorsk*)
- Bertil Hedkvist (Berrahed) (*Swedish*)
- William(ѕ)ⁿ (wmlgr) (*Spanish*)
- norayr (*Armenian*)
- William(ѕ)ⁿ (*Spanish*)
- Tiago Epifânio (*Portuguese*)
- Mentor Gashi (*Albanian*)
- Jaz-Michael King (*Welsh*)
- Tiago Epifânio (tfve) (*Portuguese*)
- Ryo (DrRyo) (*Korean*)
- Mentor Gashi (mentorgashi.com) (*Albanian*)
- Jaz-Michael King (jazmichaelking) (*Welsh*)
- carolinagiorno (*Portuguese, Brazilian*)
- Roby Thomas (*Malayalam*)
- Bharat Kumar (*Hindi*)
- Roby Thomas (roby.thomas) (*Malayalam*)
- Bharat Kumar (Marwari) (*Hindi*)
- ThonyVezbe (*Breton*)
- dkdarshan760 (*Sanskrit*)
- Tagomago (tagomago) (*French, Spanish*)
- tykayn (*French*)
- axi (*Finnish*)
- Selyan Slimane AMIRI (*Kabyle*)
- Selyan Slimane AMIRI (slimane_AMIRI) (*Kabyle*)
- Balázs Meskó (mesko.balazs) (*Hungarian*)
- taoxvx (*Danish*)
- Hrach Mkrtchyan (*Armenian*)
- sabri (*Spanish; Spanish, Argentina*)
- Dewi (*Breton; French*)
- Hrach Mkrtchyan (mhrach87) (*Armenian*)
- sabri (thetomatoisavegetable) (*Spanish, Spanish, Argentina*)
- Dewi (Unkorneg) (*French, Breton*)
- Coelacanthus (*Chinese Simplified*)
- syncopams (*Chinese Simplified, Chinese Traditional, Chinese Traditional, Hong Kong*)
- SteinarK (*Norwegian Nynorsk*)
- Mathias B. Vagnes (*Norwegian*)
- dashersyed (*Urdu*)
- ThonyVezbe (*Breton*)
- Acolyte (*Ukrainian*)
- Conight Wang (*Chinese Simplified*)
- Damjan Dimitrioski (*Macedonian*)
- Sokratis Alichanidis (alichani) (*Greek*)
- Mathias B. Vagnes (vagnes) (*Norwegian*)
- dashersyed (*Urdu (Pakistan)*)
- Acolyte (666noob404) (*Ukrainian*)
- Conight Wang (xfddwhh) (*Chinese Simplified*)
- liffon (*Swedish*)
- Damjan Dimitrioski (gnud) (*Macedonian*)
- PPNplus (*Thai*)
- Tagomago (*Spanish; French*)
- shioko (*Chinese Simplified*)
- Balázs Meskó (*Hungarian*)
- Evgeny Petrov (*Russian*)
- Gwenn (*Breton*)
- Ryo (*Korean*)
- Rafael H L Moretti (*Portuguese, Brazilian*)
- v4vachan (*Malayalam*)
- Hakim Oubouali (zenata1) (*Standard Moroccan Tamazight*)
- Evgeny Petrov (kondra007) (*Russian*)
- Gwenn (Belvar) (*Breton*)
- StanleyFrew (*French*)
- Hayk Khachatryan (brutusromanus123) (*Armenian*)
- jaranta (*Finnish*)
- gagik_ (*Armenian*)
- Felicia (*Swedish*)
- Jess Rafn (*Danish*)
- Stasiek Michalski (*Polish*)
- liffon (*Swedish*)
- dxwc (*Bengali*)
- Saederup92 (*Danish*)
- Felicia (midsommar) (*Swedish*)
- Denys (dector) (*Ukrainian*)
- Pukima (pukimaaa) (*German*)
- Vanege (*Esperanto*)
- Jess Rafn (therealyez) (*Danish*)
- strubbl (*German*)
- Stasiek Michalski (hellcp) (*Polish*)
- dxwc (*Bengali*)
- jmontane (*Catalan*)
- Johan Schiff (*Swedish*)
- Arunmozhi (*Tamil*)
- kat (*Ukrainian; Russian*)
- Laura (*Polish*)
- oti4500 (*Hungarian; Ukrainian*)
- diazepan (*Spanish; Spanish, Argentina*)
- Sokratis Alichanidis (*Greek*)
- Rikard Linde (*Swedish*)
- Juan José Salvador Piedra (*Spanish*)
- Liboide (*Spanish*)
- Johan Schiff (schyffel) (*Swedish*)
- Arunmozhi (tecoholic) (*Tamil*)
- kat (katktv) (*Russian, Ukrainian*)
- Rikard Linde (rikardlinde) (*Swedish*)
- oti4500 (*Hungarian, Ukrainian*)
- Laura (selfisekai) (*Polish*)
- Rachida S. (ZiriSut) (*Kabyle*)
- diazepan (*Spanish, Spanish, Argentina*)
- marzuquccen (*Kabyle*)
- BurekzFinezt (*Serbian*)
- Juan José Salvador Piedra (JuanjoSalvador) (*Spanish*)
- Tigran (tigransimonyan) (*Armenian*)
- BurekzFinezt (*Serbian (Cyrillic)*)
- SHeija (*Finnish*)
- Jack R (*Spanish*)
- andruhov (*Ukrainian; Russian*)
- 森の子リスのミーコの大冒険 (*Japanese*)
- るいーね (*Japanese*)
- Sam Tux (*Bengali*)
- atriix (*Swedish*)
- Jack R (isaac.97_WT) (*Spanish*)
- antonyho (*Chinese Traditional, Hong Kong*)
- andruhov (*Russian, Ukrainian*)
- Aryamik Sharma (Aryamik) (*Swedish, Hindi*)
- phena109 (*Chinese Traditional, Hong Kong*)
- 森の子リスのミーコの大冒険 (Phroneris) (*Japanese*)
- るいーね (ruine) (*Japanese*)
- ahangarha (*Persian*)
- Sam Tux (imahbub) (*Bengali*)
- igordrozniak (*Polish*)
- Unmual (*Spanish*)
- AW Unad (*Indonesian*)
- Cutls (*Japanese*)
- Ray (*Spanish*)
- Falling Snowdin (*Vietnamese*)
- Andrea Lo Iacono (*Italian*)
- EPEMA (*German*)
- Kinshuk Sunil (*Hindi*)
- Ullas Joseph (*Malayalam*)
- Yu-Pai Liu (*Chinese Traditional*)
- Amarin Cemthong (*Thai*)
- juanda097 (*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*)
- Rasmus Lindroth (RasmusLindroth) (*Swedish*)
- Andrea Lo Iacono (niels0n) (*Italian*)
- Kinshuk Sunil (kinshuksunil) (*Hindi*)
- Ullas Joseph (ullasjoseph) (*Malayalam*)
- Goudarz Jafari (Goudarz) (*Persian*)
- Yu-Pai Liu (tedliou) (*Chinese Traditional*)
- Amarin Cemthong (acitmaster) (*Thai*)
- juanda097 (juanda-097) (*Spanish*)
- Anunnakey (*Macedonian*)
- StanleyFrew (*French*)
- fragola (*Italian*)
- erikstl (*Esperanto*)
- twpenguin (*Chinese Traditional*)
- bobchao (*Chinese Traditional*)
- Esther (esthermations) (*Portuguese*)
- MadeInSteak (*Finnish*)
- Heimen Stoffels (*Dutch*)
- Rajarshi Guha (*Bengali*)
- Andrew (*Romanian*)
- Goudarz Jafari (*Persian*)
- Heimen Stoffels (vistausss) (*Dutch*)
- Rajarshi Guha (rajarshiguha) (*Bengali*)
- Andrew (iAndrew3) (*Romanian*)
- Gopal Sharma (gopalvirat) (*Hindi*)
- arethsu (*Swedish*)
- Carlos Solís (*Esperanto*)
- Parthan S Ramanujam (*Tamil*)
- Ali Demirtaş (*Turkish*)
- Kasper Nymand (*Danish*)
- TS (*Finnish*)
- Tofiq Abdula (Xwla) (*Sorani (Kurdish)*)
- Carlos Solís (csolisr) (*Esperanto*)
- Parthan S Ramanujam (parthan) (*Tamil*)
- Kasper Nymand (KasperNymand) (*Danish*)
- TS (morte) (*Finnish*)
- subram (*Turkish*)
- SensDeViata (*Ukrainian*)
- Ptrcmd (ptrcmd) (*Chinese Traditional*)
- SergioFMiranda (*Portuguese, Brazilian*)
- OctolinGamer (*Portuguese, Brazilian*)
- Scvoet (scvoet) (*Chinese Simplified*)
- hiroTS (*Chinese Traditional*)
- johne32rus23 (*Russian*)
- AzureNya (*Chinese Simplified*)
- Ram varma (*Tamil*)
- 北䑓如法 (*Japanese*)
- OctolinGamer (octolingamer) (*Portuguese, Brazilian*)
- Ram varma (ram4varma) (*Tamil*)
- Hexandcube (hexandcube) (*Polish*)
- 北䑓如法 (Nyoho) (*Japanese*)
- frumble (*German*)
- kekkepikkuni (*Tamil*)
- Neo_Chen (NeoChen1024) (*Chinese Traditional*)
- oorsutri (*Tamil*)
- Nithin V (*Tamil*)
- Miro Rauhala (*Finnish*)
- Rhys Harrison (rhedders) (*Esperanto*)
- Nithin V (Nithin896) (*Tamil*)
- Miro Rauhala (mirorauhala) (*Finnish*)
- diorama (*Italian*)
- Rhys Harrison (*Esperanto*)
- Guillaume Turchini (*French*)
- Ganesh D (*Marathi*)
- AlexKoala (alexkoala) (*Korean*)
- Aswin C (officialcjunior) (*Malayalam*)
- Guillaume Turchini (orion78fr) (*French*)
- Ganesh D (auntgd) (*Marathi*)
- dragnucs2 (*Arabic*)
- Pedro Henrique (*Portuguese, Brazilian*)
- Tejas Harad (*Marathi*)
- Vasanthan (*Tamil*)
- 硫酸鶏 (*Japanese*)
- Ryan Ho (koungho) (*Chinese Traditional*)
- Pedro Henrique (exploronauta) (*Portuguese, Brazilian*)
- Tejas Harad (h_tejas) (*Marathi*)
- Vasanthan (vasanthan) (*Tamil*)
- 硫酸鶏 (acid_chicken) (*Japanese*)
- clarmin b8 (clarminb8) (*Sorani (Kurdish)*)
- manukp (*Malayalam*)
- psymyn (*Hebrew*)
- earth dweller (*Marathi*)
- meijerivoi (*Finnish*)
- earth dweller (sanethoughtyt) (*Marathi*)
- meijerivoi (toilet) (*Finnish*)
- essaar (*Tamil*)
- serubeena (*Swedish*)
- Karol Kosek (krkkPL) (*Polish*)
- Rintan (*Japanese*)
- Karol Kosek (*Polish*)
- valarivan (*Tamil*)
- Sebastián Andil (*Slovak*)
- v4vachan (*Malayalam*)
- KEINOS (*Japanese*)
- Ivan T. (*Chinese Traditional, Hong Kong*)
- Hernik (hernik27) (*Czech*)
- Sebastián Andil (Selrond) (*Slovak*)
- Hinaloe (hinaloe) (*Japanese*)
- filippodb (*Italian*)
- Balázs Meskó (*Hungarian*)
- KEINOS (*Japanese*)
- Balázs Meskó (meskobalazs) (*Hungarian*)
- Bottle (suryasalem2010) (*Tamil*)
- JzshAC (*Chinese Simplified*)
- Bottle (*Tamil*)
- Khóo (*Chinese Traditional*)
- Steven Tappert (*German*)
- Antillion (*Spanish*)
- ZiriSut (*Kabyle*)
- gowthamanb (*Tamil*)
- Wrya ali (John12) (*Sorani (Kurdish)*)
- Khóo (khootiatling) (*Chinese Traditional*)
- Steven Tappert (sammy8806) (*German*)
- Antillion (antillion99) (*Spanish*)
- Pukima (Pukimaa) (*German*)
- Reg3xp (*Persian*)
- hiphipvargas (*Portuguese*)
- Arttu Ylhävuori (*Finnish*)
- Ch. (*Korean*)
- gowthamanb (*Tamil*)
- Ch. (sftblw) (*Korean*)
- Jeff Huang (s8321414) (*Chinese Traditional*)
- Arttu Ylhävuori (arttu.ylhavuori) (*Finnish*)
- tctovsli (*Norwegian Nynorsk*)
- Hinaloe (*Japanese*)
- strubbl (*German*)
- Timo Tijhof (Krinkle) (*Dutch*)
- Yamagishi Kazutoshi (ykzts) (*Japanese, Icelandic, Sorani (Kurdish)*)
- vjasiegd (*Polish*)
- SamitiMed (*Thai*)
- Reg3xp (*Persian*)
- AlexKoala (*Korean*)
- SamitiMed (samiti3d) (*Thai*)
- Rekan Adl (rekan-adl1) (*Sorani (Kurdish)*)
- umelard (*Hebrew*)
- Antara2Cinta (Se7enTime) (*Indonesian*)
- VSx86 (*Russian*)
- Daniel Dimitrov (*Bulgarian*)
- mynameismonkey (*Welsh*)
- Daniel Dimitrov (danny-dimitrov) (*Bulgarian*)
- parnikkapore (*Thai*)
- Mo_der Steven (*Chinese Simplified*)
- mynameismonkey (*Welsh*)
- Sherwan Othman (sherwanothman11) (*Sorani (Kurdish)*)
- Yassine Aït-El-Mouden (yaitelmouden) (*Standard Moroccan Tamazight*)
- SKELET (*Danish*)
- Renato "Lond" Cerqueira (*Portuguese, Brazilian*)
- Mo_der Steven (SakuraPuare) (*Chinese Simplified*)
- Fei Yang (Fei1Yang) (*Chinese Traditional*)
- ALEM FARID (faridatcemlulaqbayli) (*Kabyle*)
- enipra (*Armenian*)
- musix (*Persian*)
- ギャラ (*Chinese Simplified; Japanese*)
- ALEM FARID (*Kabyle*)
- Renato "Lond" Cerqueira (renatolond) (*Portuguese, Brazilian*)
- ギャラ (gyara) (*Japanese, Chinese Simplified*)
- Hougo (hougo) (*French*)
- ybardapurkar (*Marathi*)
- Adrián Lattes (*Spanish*)
- Adrián Lattes (haztecaso) (*Spanish*)
- TracyJacks (*Chinese Simplified*)
- rasheedgm (*Kannada*)
- GatoOscuro (*Spanish*)
- mecqor labi (mecqorlabi) (*Persian*)
- Belkacem Mohammed (belkacem77) (*Kabyle*)
- Navjot Singh (nspeaks) (*Hindi*)
- omquylzu (*Latvian*)
- Belkacem Mohammed (*Kabyle*)
- Navjot Singh (*Hindi*)
- Ozai (*German*)
- Sahak Petrosyan (*Armenian*)
- siamano (*Thai; Esperanto*)
- se7entime (*Indonesian*)
- Viorel-Cătălin Răpițeanu (*Romanian*)
- Siddhartha Sarathi Basu (*Bengali*)
- Pachara Chantawong (*Thai*)
- Skew (*French*)
- Zijian Zhao (*Chinese Simplified*)
- Guru Prasath Anandapadmanaban (*Tamil*)
- Sahak Petrosyan (petrosyan) (*Armenian*)
- siamano (*Thai, Esperanto*)
- Viorel-Cătălin Răpițeanu (rapiteanu) (*Romanian*)
- Siddhartha Sarathi Basu (quinoa_biryani) (*Bengali*)
- Pachara Chantawong (pachara2202) (*Thai*)
- mkljczk (*Polish*)
- Skew (noan.perrot) (*French*)
- Zijian Zhao (jobs2512821228) (*Chinese Simplified*)
- turtle836 (*German*)
- GatoOscuro (*Spanish*)
- Lamin (*Japanese*)
- Marcepanek_ (*Polish*)
- Yann Aguettaz (*French*)
- Feruz Oripov (*Russian*)
- Mick Onio (*Asturian*)
- hg6 (*Hindi*)
- Malik Mann (*German*)
- padulafacundo (*Spanish*)
- Guru Prasath Anandapadmanaban (guruprasath) (*Tamil*)
- Lamin (laminne) (*Japanese*)
- Marcepanek_ (thekingmarcepan) (*Polish*)
- Feruz Oripov (FeruzOripov) (*Russian*)
- Yann Aguettaz (yann-a) (*French*)
- Mick Onio (xgc.redes) (*Asturian*)
- Tianqi Zhang (tina.zhang040609) (*Chinese Simplified*)
- Malik Mann (dermalikmann) (*German*)
- dadosch (*German*)
- r3dsp1 (*Chinese Traditional, Hong Kong*)
- Tianqi Zhang (*Chinese Simplified*)
- Padraic Calpin (*Slovenian*)
- cenegd (*Chinese Simplified*)
- padulafacundo (*Spanish*)
- hg6 (*Hindi*)
- Orlando Murcio (Atos20) (*Spanish, Mexico*)
- piupiupiudiu (*Chinese Simplified*)
- Hugh Liu (*Chinese Simplified*)
- Rakino (*Chinese Simplified*)
- Jothipazhani Nagarajan (*Tamil*)
- Miquel Sabaté Solà (*Catalan*)
- 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*)
- Rakino (rakino) (*Chinese Simplified*)
- Miquel Sabaté Solà (mssola) (*Catalan*)
- AmazighNM (*Kabyle*)
- Solid Rhino (*Dutch*)
- Jothipazhani Nagarajan (jothipazhani.n) (*Tamil*)
- Clash Clans (KURD12345) (*Sorani (Kurdish)*)
- hallomaurits (*Dutch*)
- alnd hezh (alndhezh) (*Sorani (Kurdish)*)
- Solid Rhino (SolidRhino) (*Dutch*)
- k_taka (peaceroad) (*Japanese*)
- Hallo Abdullah (hallo_hamza12) (*Sorani (Kurdish)*)
- hussama (*Portuguese, Brazilian*)
- shafouz (*Portuguese, Brazilian*)
- Tagada (*French*)
- Tom_ (*Czech*)
- SnDer (*Dutch*)
- Sébastien Feugère (smonff) (*French*)
- 林水溶 (shuiRong) (*Chinese Simplified*)
- eichkat3r (*German*)
- PifyZ (*French*)
- OminousCry (*Russian*)
- Shrinivasan T (*Tamil*)
- Nathaël Noguès (*French*)
- Daniel M. (*Catalan*)
- Swati Sani (*Urdu*)
- Kk (*Kannada*)
- SnDer (*Dutch*)
- PifyZ (*French*)
- Tom_ (*Czech*)
- Tagada (Tagadda) (*French*)
- shafouz (*Portuguese, Brazilian*)
- 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*)
- Daniel M. (daniconil) (*Catalan*)
- Vikatakavi (*Kannada*)
- SusVersiva (*Catalan*)
- Robin van der Vliet (*Esperanto*)
- Tradjincal (tradjincal) (*French*)
- pullopen (*Chinese Simplified*)
- Robin van der Vliet (RobinvanderVliet) (*Esperanto*)
- Zinkokooo (*Basque*)
- Tradjincal (*French*)
- Vikatakavi (*Kannada*)
- prabhjot (*Hindi*)
- twpenguin (*Chinese Traditional*)
- mmokhi (*Persian*)
- Livingston Samuel (livingston) (*Tamil*)
- prabhjot (*Hindi*)
- sergioaraujo1 (*Portuguese, Brazilian*)
- Livingston Samuel (*Tamil*)
- CyberAmoeba (pseudoobscura) (*Chinese Simplified*)
- tsundoker (*Malayalam*)
- skaaarrr (*German*)
- 夜楓Yoka (*Chinese Simplified*)
- kiwi0 (*Italian*)
- Ricardo Colin (rysard) (*Spanish*)
- mkljczk (mykylyjczyk) (*Polish*)
- Philipp Fischbeck (PFischbeck) (*German*)
- fedot (*Russian*)
- mkljczk (*Polish*)
- igordrozniak (*Polish*)
- Ricardo Colin (*Spanish*)
- Esther (*Portuguese*)
- Paz Galindo (*Spanish*)
- Philipp Fischbeck (*German*)
- Paz Galindo (paz.almendra.g) (*Spanish*)
- GaggiX (*Italian*)
- ralozkolya (*Georgian*)
- JackXu (*Chinese Simplified*)
- Allen Zhong (*Chinese Simplified*)
- Zoé Bőle (*German*)
- Lukas Fülling (*German*)
- Albatroz Jeremias (*Portuguese*)
- Samir Tighzert (*Kabyle*)
- Nocta (*French*)
- Anoop (*Malayalam*)
- Zoé Bőle (zoe1337) (*German*)
- Lukas Fülling (lfuelling) (*German*)
- JackXu (Merman-Jack) (*Chinese Simplified*)
- Aymeric (AymBroussier) (*French*)
- Anoop (anoopp) (*Malayalam*)
- pezcurrel (*Italian*)
- Dremski (*Bulgarian*)
- Aymeric (*French*)
- tamaina (*Japanese*)
- Doug (*Portuguese, Brazilian*)
- Matias Lavik (*Norwegian Nynorsk*)
- Fleva (*Sardinian*)
- Xurxo Guerra (xguerrap) (*Galician*)
- mashirozx (*Chinese Simplified*)
- Albatroz Jeremias (albjeremias) (*Portuguese*)
- Samir Tighzert (samir_t7) (*Kabyle*)
- Apple (blackteaovo) (*Chinese Simplified*)
- Nocta (*French*)
- OpenAlgeria (*Arabic*)
- koppe-pan (*Japanese*)
- Amith Raj Shetty (*Kannada*)
- tamaina (*Japanese*)
- abidin toumi (Zet24) (*Arabic*)
- xpac1985 (xpac) (*German*)
- Kaede (kaedech) (*Japanese*)
- ÀŘǾŚ PÀŚĦÀÍ (arospashai) (*Sorani (Kurdish)*)
- Matias Lavik (matiaslavik) (*Norwegian Nynorsk*)
- smedvedev (*Russian*)
- Trond Boksasp (*Norwegian*)
- 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*)
- random_person (*Spanish*)
- Sais Lakshmanan (*Tamil*)
- mikel (*Spanish*)
- Mohammad Adnan Mahmood (*Arabic*)
- 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*)
- 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*)
- NeverMine17 (*Russian*)
- Nithya Mary (nithyamary25) (*Tamil*)
- t_aus_m (*German*)
- dobrado (*Portuguese, Brazilian*)
- Hannah (Aniqueper1) (*Chinese Simplified*)
- Jiniux (*Italian*)
- 于晚霞 (xissshawww) (*Chinese Simplified*)

@ -3,7 +3,7 @@ Changelog
All notable changes to this project will be documented in this file.
## Unreleased
## [3.3.0] - 2020-12-27
### Added
- **Add hotkeys for audio/video control in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15158), [Gargron](https://github.com/tootsuite/mastodon/pull/15198))
@ -81,11 +81,11 @@ All notable changes to this project will be documented in this file.
### Changed
- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221), [Gargron](https://github.com/tootsuite/mastodon/pull/15284), [Gargron](https://github.com/tootsuite/mastodon/pull/15283), [Kjwon15](https://github.com/tootsuite/mastodon/pull/15308), [noellabo](https://github.com/tootsuite/mastodon/pull/15305))
- **Change media modals look in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/15217), [Gargron](https://github.com/tootsuite/mastodon/pull/15221), [Gargron](https://github.com/tootsuite/mastodon/pull/15284), [Gargron](https://github.com/tootsuite/mastodon/pull/15283), [Kjwon15](https://github.com/tootsuite/mastodon/pull/15308), [noellabo](https://github.com/tootsuite/mastodon/pull/15305), [ThibG](https://github.com/tootsuite/mastodon/pull/15417))
- Background of the overlay matches the color of the image
- Action bar to interact with or open the toot from the modal
- Change order of announcements in admin UI to be newest-first ([ThibG](https://github.com/tootsuite/mastodon/pull/15091))
- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855), [ThibG](https://github.com/tootsuite/mastodon/pull/15380))
- **Change account suspensions to be reversible by default** ([Gargron](https://github.com/tootsuite/mastodon/pull/14726), [ThibG](https://github.com/tootsuite/mastodon/pull/15152), [ThibG](https://github.com/tootsuite/mastodon/pull/15106), [ThibG](https://github.com/tootsuite/mastodon/pull/15100), [ThibG](https://github.com/tootsuite/mastodon/pull/15099), [noellabo](https://github.com/tootsuite/mastodon/pull/14855), [ThibG](https://github.com/tootsuite/mastodon/pull/15380), [Gargron](https://github.com/tootsuite/mastodon/pull/15420), [Gargron](https://github.com/tootsuite/mastodon/pull/15414))
- Suspensions no longer equal deletions
- A suspended account can be unsuspended with minimal consequences for 30 days
- Immediate deletion of data is still available as an explicit option
@ -123,7 +123,7 @@ All notable changes to this project will be documented in this file.
### Fixed
- Fix layout on about page when contact account has a long username ([ThibG](https://github.com/tootsuite/mastodon/pull/15357))
- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/tootsuite/mastodon/pull/14207))
- Fix follow limit preventing re-following of a moved account ([Gargron](https://github.com/tootsuite/mastodon/pull/14207), [ThibG](https://github.com/tootsuite/mastodon/pull/15384))
- **Fix deletes not reaching every server that interacted with toot** ([Gargron](https://github.com/tootsuite/mastodon/pull/15200))
- Previously, delete of a toot would be primarily sent to the followers of its author, people mentioned in the toot, and people who reblogged the toot
- Now, additionally, it is ensured that it is sent to people who replied to it, favourited it, and to the person it replies to even if that person is not mentioned
@ -163,7 +163,7 @@ All notable changes to this project will be documented in this file.
- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14674))
- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14673))
- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/tootsuite/mastodon/pull/14675))
- Fix inefficieny when deleting accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/15387), [ThibG](https://github.com/tootsuite/mastodon/pull/15409), [ThibG](https://github.com/tootsuite/mastodon/pull/15407), [ThibG](https://github.com/tootsuite/mastodon/pull/15408), [ThibG](https://github.com/tootsuite/mastodon/pull/15402))
- Fix inefficieny when deleting accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/15387), [ThibG](https://github.com/tootsuite/mastodon/pull/15409), [ThibG](https://github.com/tootsuite/mastodon/pull/15407), [ThibG](https://github.com/tootsuite/mastodon/pull/15408), [ThibG](https://github.com/tootsuite/mastodon/pull/15402), [ThibG](https://github.com/tootsuite/mastodon/pull/15416), [Gargron](https://github.com/tootsuite/mastodon/pull/15421))
- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/tootsuite/mastodon/pull/14534))
- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/tootsuite/mastodon/pull/15287))
- Fix performance on instances list in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/15282))
@ -387,14 +387,14 @@ All notable changes to this project will be documented in this file.
- Only then proceed to start removing their data (slow)
- Clear out media attachments in a separate worker (slow)
## [v3.1.5] - 2020-07-07
## [3.1.5] - 2020-07-07
### Security
- Fix media attachment enumeration ([ThibG](https://github.com/tootsuite/mastodon/pull/14254))
- Change rate limits for various paths ([Gargron](https://github.com/tootsuite/mastodon/pull/14253))
- Fix other sessions not being logged out on password change ([Gargron](https://github.com/tootsuite/mastodon/pull/14252))
## [v3.1.4] - 2020-05-14
## [3.1.4] - 2020-05-14
### Added
- Add `vi` to available locales ([taicv](https://github.com/tootsuite/mastodon/pull/13542))
@ -461,7 +461,7 @@ All notable changes to this project will be documented in this file.
- For apps that self-register on behalf of every individual user (such as most mobile apps), this is a non-issue
- The issue only affects developers of apps who are shared between multiple users, such as server-side apps like cross-posters
## [v3.1.3] - 2020-04-05
## [3.1.3] - 2020-04-05
### Added
- Add ability to filter audit log in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/13381))

@ -5,7 +5,7 @@ ruby '>= 2.5.0', '< 3.0.0'
gem 'pkg-config', '~> 1.4'
gem 'puma', '~> 5.0'
gem 'puma', '~> 5.1'
gem 'rails', '~> 5.2.4.4'
gem 'sprockets', '~> 3.7.2'
gem 'thor', '~> 1.0'
@ -17,7 +17,7 @@ gem 'makara', '~> 0.4'
gem 'pghero', '~> 2.7'
gem 'dotenv-rails', '~> 2.7'
gem 'aws-sdk-s3', '~> 1.85', require: false
gem 'aws-sdk-s3', '~> 1.87', require: false
gem 'fog-core', '<= 2.1.0'
gem 'fog-openstack', '~> 0.3', require: false
gem 'paperclip', '~> 6.0'
@ -32,7 +32,7 @@ gem 'browser'
gem 'charlock_holmes', '~> 0.7.7'
gem 'iso-639'
gem 'chewy', '~> 5.1'
gem 'cld3', '~> 3.3.0'
gem 'cld3', '~> 3.4.1'
gem 'devise', '~> 4.7'
gem 'devise-two-factor', '~> 3.1'
@ -40,7 +40,7 @@ group :pam_authentication, optional: true do
gem 'devise_pam_authenticatable2', '~> 9.2'
end
gem 'net-ldap', '~> 0.16'
gem 'net-ldap', '~> 0.17'
gem 'omniauth-cas', '~> 2.0'
gem 'omniauth-saml', '~> 1.10'
gem 'omniauth', '~> 1.9'
@ -64,10 +64,10 @@ gem 'kaminari', '~> 1.2'
gem 'link_header', '~> 0.0'
gem 'mime-types', '~> 3.3.1', require: 'mime/types/columnar'
gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b176939f851338d0a4971a532'
gem 'nokogiri', '~> 1.10'
gem 'nokogiri', '~> 1.11'
gem 'nsa', '~> 0.2'
gem 'oj', '~> 3.10'
gem 'ox', '~> 2.13'
gem 'ox', '~> 2.14'
gem 'parslet'
gem 'parallel', '~> 1.20'
gem 'posix-spawn'
@ -79,8 +79,8 @@ gem 'rails-i18n', '~> 5.1'
gem 'rails-settings-cached', '~> 0.6'
gem 'redis', '~> 4.2', require: ['redis', 'redis/connection/hiredis']
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 1.1'
gem 'ruby-progressbar', '~> 1.10'
gem 'rqrcode', '~> 1.2'
gem 'ruby-progressbar', '~> 1.11'
gem 'sanitize', '~> 5.2'
gem 'scenic', '~> 1.5'
gem 'sidekiq', '~> 6.1'
@ -92,7 +92,7 @@ gem 'simple_form', '~> 5.0'
gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
gem 'stoplight', '~> 2.2.1'
gem 'strong_migrations', '~> 0.7'
gem 'tty-prompt', '~> 0.22', require: false
gem 'tty-prompt', '~> 0.23', require: false
gem 'twitter-text', '~> 1.14'
gem 'tzinfo-data', '~> 1.2020'
gem 'webpacker', '~> 5.2'
@ -119,14 +119,14 @@ group :production, :test do
end
group :test do
gem 'capybara', '~> 3.33'
gem 'capybara', '~> 3.34'
gem 'climate_control', '~> 0.2'
gem 'faker', '~> 2.14'
gem 'faker', '~> 2.15'
gem 'microformats', '~> 4.2'
gem 'rails-controller-testing', '~> 1.0'
gem 'rspec-sidekiq', '~> 3.1'
gem 'simplecov', '~> 0.19', require: false
gem 'webmock', '~> 3.10'
gem 'simplecov', '~> 0.21', require: false
gem 'webmock', '~> 3.11'
gem 'parallel_tests', '~> 3.4'
gem 'rspec_junit_formatter', '~> 0.4'
end
@ -140,8 +140,8 @@ group :development do
gem 'letter_opener', '~> 1.7'
gem 'letter_opener_web', '~> 1.4'
gem 'memory_profiler'
gem 'rubocop', '~> 1.3', require: false
gem 'rubocop-rails', '~> 2.8', require: false
gem 'rubocop', '~> 1.7', require: false
gem 'rubocop-rails', '~> 2.9', require: false
gem 'brakeman', '~> 4.10', require: false
gem 'bundler-audit', '~> 0.7', require: false

@ -39,9 +39,9 @@ GEM
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
active_model_serializers (0.10.10)
actionpack (>= 4.1, < 6.1)
activemodel (>= 4.1, < 6.1)
active_model_serializers (0.10.12)
actionpack (>= 4.1, < 6.2)
activemodel (>= 4.1, < 6.2)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
active_record_query_trace (1.8)
@ -79,16 +79,16 @@ GEM
cocaine (~> 0.5.3)
awrence (1.1.1)
aws-eventstream (1.1.0)
aws-partitions (1.397.0)
aws-sdk-core (3.109.3)
aws-partitions (1.413.0)
aws-sdk-core (3.110.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
aws-sdk-kms (1.39.0)
aws-sdk-kms (1.40.0)
aws-sdk-core (~> 3, >= 3.109.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.85.0)
aws-sdk-s3 (1.87.0)
aws-sdk-core (~> 3, >= 3.109.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.1)
@ -106,10 +106,10 @@ GEM
ffi (~> 1.10.0)
bootsnap (1.5.1)
msgpack (~> 1.0)
brakeman (4.10.0)
brakeman (4.10.1)
browser (4.2.0)
builder (3.2.4)
bullet (6.1.0)
bullet (6.1.2)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.11)
bundler-audit (0.7.0.1)
@ -131,7 +131,7 @@ GEM
sshkit (~> 1.3)
capistrano-yarn (2.0.2)
capistrano (~> 3.0)
capybara (3.33.0)
capybara (3.34.0)
addressable
mini_mime (>= 0.1.3)
nokogiri (~> 1.8)
@ -147,9 +147,9 @@ GEM
activesupport (>= 4.0)
elasticsearch (>= 2.0.0)
elasticsearch-dsl
chunky_png (1.3.12)
cld3 (3.3.0)
ffi (>= 1.1.0, < 1.12.0)
chunky_png (1.3.15)
cld3 (3.4.1)
ffi (>= 1.1.0, < 1.15.0)
climate_control (0.2.0)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
@ -160,7 +160,8 @@ GEM
cose (1.0.0)
cbor (~> 0.5.9)
openssl-signature_algorithm (~> 0.4.0)
crack (0.4.4)
crack (0.4.5)
rexml
crass (1.0.6)
css_parser (1.7.1)
addressable
@ -183,7 +184,7 @@ GEM
diff-lcs (1.4.4)
discard (1.2.0)
activerecord (>= 4.2, < 7)
docile (1.3.2)
docile (1.3.4)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
doorkeeper (5.4.0)
@ -204,17 +205,17 @@ GEM
faraday (~> 1)
multi_json
encryptor (3.0.0)
erubi (1.9.0)
erubi (1.10.0)
et-orbi (1.2.4)
tzinfo
excon (0.76.0)
fabrication (2.21.1)
faker (2.14.0)
faker (2.15.1)
i18n (>= 1.6, < 2)
faraday (1.0.1)
multipart-post (>= 1.2, < 3)
fast_blank (1.0.0)
fastimage (2.2.0)
fastimage (2.2.1)
ffi (1.10.0)
ffi-compiler (1.0.1)
ffi (>= 1.0.0)
@ -235,7 +236,7 @@ GEM
fugit (1.3.9)
et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.3)
fuubar (2.5.0)
fuubar (2.5.1)
rspec-core (~> 3.0)
ruby-progressbar (~> 1.4)
globalid (0.4.2)
@ -273,7 +274,7 @@ GEM
rainbow (>= 2.0.0)
i18n (1.8.5)
concurrent-ruby (~> 1.0)
i18n-tasks (0.9.31)
i18n-tasks (0.9.33)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
erubi
@ -289,14 +290,14 @@ GEM
jmespath (1.4.0)
json (2.3.1)
json-canonicalization (0.2.0)
json-ld (3.1.5)
json-ld (3.1.7)
htmlentities (~> 4.3)
json-canonicalization (~> 0.2)
link_header (~> 0.0, >= 0.0.8)
multi_json (~> 1.14)
rack (~> 2.0)
rdf (~> 3.1)
json-ld-preloaded (3.1.3)
json-ld-preloaded (3.1.4)
json-ld (~> 3.1)
rdf (~> 3.1)
jsonapi-renderer (0.2.2)
@ -327,7 +328,7 @@ GEM
activesupport (>= 4)
railties (>= 4)
request_store (~> 1.0)
loofah (2.7.0)
loofah (2.8.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
@ -338,7 +339,7 @@ GEM
mimemagic (~> 0.3.2)
mario-redis-lock (1.2.1)
redis (>= 3.0.5)
memory_profiler (0.9.14)
memory_profiler (1.0.0)
method_source (1.0.0)
microformats (4.2.1)
json (~> 2.2)
@ -348,18 +349,19 @@ GEM
mime-types-data (3.2020.0512)
mimemagic (0.3.5)
mini_mime (1.0.2)
mini_portile2 (2.4.0)
mini_portile2 (2.5.0)
minitest (5.14.2)
msgpack (1.3.3)
multi_json (1.15.0)
multipart-post (2.1.1)
net-ldap (0.16.3)
net-ldap (0.17.0)
net-scp (3.0.0)
net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.1.0)
nio4r (2.5.4)
nokogiri (1.10.10)
mini_portile2 (~> 2.4.0)
nokogiri (1.11.0)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
nokogumbo (2.0.2)
nokogiri (~> 1.8, >= 1.8.4)
nsa (0.2.7)
@ -367,7 +369,7 @@ GEM
concurrent-ruby (~> 1.0, >= 1.0.2)
sidekiq (>= 3.5)
statsd-ruby (~> 1.4, >= 1.4.0)
oj (3.10.16)
oj (3.10.18)
omniauth (1.9.1)
hashie (>= 3.4.6)
rack (>= 1.6.2, < 3)
@ -384,7 +386,7 @@ GEM
openssl (2.2.0)
openssl-signature_algorithm (0.4.0)
orm_adapter (0.5.0)
ox (2.13.4)
ox (2.14.0)
paperclip (6.0.0)
activemodel (>= 4.2.0)
activesupport (>= 4.2.0)
@ -397,13 +399,13 @@ GEM
parallel (1.20.1)
parallel_tests (3.4.0)
parallel
parser (2.7.2.0)
parser (3.0.0.0)
ast (~> 2.4.1)
parslet (2.0.0)
pastel (0.8.0)
tty-color (~> 0.5)
pg (1.2.3)
pghero (2.7.2)
pghero (2.7.3)
activerecord (>= 5)
pkg-config (1.4.4)
pluck_each (0.1.3)
@ -427,11 +429,12 @@ GEM
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (4.0.6)
puma (5.0.4)
puma (5.1.1)
nio4r (~> 2.0)
pundit (2.1.0)
activesupport (>= 3.0.0)
raabro (1.3.3)
racc (1.5.2)
rack (2.2.3)
rack-attack (6.3.1)
rack (>= 1.0, < 3)
@ -475,8 +478,8 @@ GEM
rake (>= 0.8.7)
thor (>= 0.19.0, < 2.0)
rainbow (3.0.0)
rake (13.0.1)
rdf (3.1.7)
rake (13.0.3)
rdf (3.1.8)
hamster (~> 3.0)
link_header (~> 0.0, >= 0.0.8)
rdf-normalize (0.4.0)
@ -510,48 +513,48 @@ GEM
rexml (3.2.4)
rotp (2.1.2)
rpam2 (4.0.2)
rqrcode (1.1.2)
rqrcode (1.2.0)
chunky_png (~> 1.0)
rqrcode_core (~> 0.1)
rqrcode_core (0.1.2)
rspec-core (3.9.3)
rspec-support (~> 3.9.3)
rspec-expectations (3.9.2)
rqrcode_core (~> 0.2)
rqrcode_core (0.2.0)
rspec-core (3.10.1)
rspec-support (~> 3.10.0)
rspec-expectations (3.10.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.9.0)
rspec-mocks (3.9.1)
rspec-support (~> 3.10.0)
rspec-mocks (3.10.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.9.0)
rspec-rails (4.0.1)
rspec-support (~> 3.10.0)
rspec-rails (4.0.2)
actionpack (>= 4.2)
activesupport (>= 4.2)
railties (>= 4.2)
rspec-core (~> 3.9)
rspec-expectations (~> 3.9)
rspec-mocks (~> 3.9)
rspec-support (~> 3.9)
rspec-core (~> 3.10)
rspec-expectations (~> 3.10)
rspec-mocks (~> 3.10)
rspec-support (~> 3.10)
rspec-sidekiq (3.1.0)
rspec-core (~> 3.0, >= 3.0.0)
sidekiq (>= 2.4.0)
rspec-support (3.9.3)
rspec-support (3.10.1)
rspec_junit_formatter (0.4.1)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.3.1)
rubocop (1.7.0)
parallel (~> 1.10)
parser (>= 2.7.1.5)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8)
regexp_parser (>= 1.8, < 3.0)
rexml
rubocop-ast (>= 1.1.1)
rubocop-ast (>= 1.2.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 2.0)
rubocop-ast (1.1.1)
rubocop-ast (1.3.0)
parser (>= 2.7.1.5)
rubocop-rails (2.8.1)
rubocop-rails (2.9.1)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 0.87.0)
ruby-progressbar (1.10.1)
rubocop (>= 0.90.0, < 2.0)
ruby-progressbar (1.11.0)
ruby-saml (1.11.0)
nokogiri (>= 1.5.10)
rufus-scheduler (3.6.0)
@ -589,10 +592,12 @@ GEM
simple_form (5.0.3)
actionpack (>= 5.0)
activemodel (>= 5.0)
simplecov (0.19.1)
simplecov (0.21.0)
docile (~> 1.1)
simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1)
simplecov-html (0.12.3)
simplecov_json_formatter (0.1.2)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
@ -608,10 +613,10 @@ GEM
stoplight (2.2.1)
streamio-ffmpeg (3.0.2)
multi_json (~> 1.8)
strong_migrations (0.7.2)
strong_migrations (0.7.4)
activerecord (>= 5)
temple (0.8.2)
terminal-table (1.8.0)
terminal-table (2.0.0)
unicode-display_width (~> 1.1, >= 1.1.1)
terrapin (0.6.0)
climate_control (>= 0.0.3, < 1.0)
@ -623,21 +628,21 @@ GEM
tpm-key_attestation (0.9.0)
bindata (~> 2.4)
openssl-signature_algorithm (~> 0.4.0)
tty-color (0.5.2)
tty-color (0.6.0)
tty-cursor (0.7.1)
tty-prompt (0.22.0)
tty-prompt (0.23.0)
pastel (~> 0.8)
tty-reader (~> 0.8)
tty-reader (0.8.0)
tty-reader (0.9.0)
tty-cursor (~> 0.7)
tty-screen (~> 0.8)
wisper (~> 2.0)
tty-screen (0.8.1)
twitter-text (1.14.7)
unf (~> 0.1.0)
tzinfo (1.2.7)
tzinfo (1.2.9)
thread_safe (~> 0.1)
tzinfo-data (1.2020.4)
tzinfo-data (1.2020.6)
tzinfo (>= 1.0.0)
unf (0.1.4)
unf_ext
@ -656,7 +661,7 @@ GEM
safety_net_attestation (~> 0.4.0)
securecompare (~> 1.0)
tpm-key_attestation (~> 0.9.0)
webmock (3.10.0)
webmock (3.11.0)
addressable (>= 2.3.6)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
@ -684,7 +689,7 @@ DEPENDENCIES
active_record_query_trace (~> 1.8)
addressable (~> 2.7)
annotate (~> 3.1)
aws-sdk-s3 (~> 1.85)
aws-sdk-s3 (~> 1.87)
better_errors (~> 2.9)
binding_of_caller (~> 0.7)
blurhash (~> 0.1)
@ -697,10 +702,10 @@ DEPENDENCIES
capistrano-rails (~> 1.6)
capistrano-rbenv (~> 2.2)
capistrano-yarn (~> 2.0)
capybara (~> 3.33)
capybara (~> 3.34)
charlock_holmes (~> 0.7.7)
chewy (~> 5.1)
cld3 (~> 3.3.0)
cld3 (~> 3.4.1)
climate_control (~> 0.2)
color_diff (~> 0.1)
concurrent-ruby
@ -713,7 +718,7 @@ DEPENDENCIES
dotenv-rails (~> 2.7)
ed25519 (~> 1.2)
fabrication (~> 2.21)
faker (~> 2.14)
faker (~> 2.15)
fast_blank (~> 1.0)
fastimage
fog-core (<= 2.1.0)
@ -741,16 +746,16 @@ DEPENDENCIES
memory_profiler
microformats (~> 4.2)
mime-types (~> 3.3.1)
net-ldap (~> 0.16)
net-ldap (~> 0.17)
nilsimsa!
nokogiri (~> 1.10)
nokogiri (~> 1.11)
nsa (~> 0.2)
oj (~> 3.10)
omniauth (~> 1.9)
omniauth-cas (~> 2.0)
omniauth-rails_csrf_protection (~> 0.1)
omniauth-saml (~> 1.10)
ox (~> 2.13)
ox (~> 2.14)
paperclip (~> 6.0)
paperclip-av-transcoder (~> 0.6)
parallel (~> 1.20)
@ -765,7 +770,7 @@ DEPENDENCIES
private_address_check (~> 0.5)
pry-byebug (~> 3.9)
pry-rails (~> 0.3)
puma (~> 5.0)
puma (~> 5.1)
pundit (~> 2.1)
rack (~> 2.2.3)
rack-attack (~> 6.3)
@ -779,13 +784,13 @@ DEPENDENCIES
redis (~> 4.2)
redis-namespace (~> 1.8)
redis-rails (~> 5.0)
rqrcode (~> 1.1)
rqrcode (~> 1.2)
rspec-rails (~> 4.0)
rspec-sidekiq (~> 3.1)
rspec_junit_formatter (~> 0.4)
rubocop (~> 1.3)
rubocop-rails (~> 2.8)
ruby-progressbar (~> 1.10)
rubocop (~> 1.7)
rubocop-rails (~> 2.9)
ruby-progressbar (~> 1.11)
sanitize (~> 5.2)
scenic (~> 1.5)
sidekiq (~> 6.1)
@ -794,7 +799,7 @@ DEPENDENCIES
sidekiq-unique-jobs (~> 6.0)
simple-navigation (~> 4.1)
simple_form (~> 5.0)
simplecov (~> 0.19)
simplecov (~> 0.21)
sprockets (~> 3.7.2)
sprockets-rails (~> 3.2)
stackprof
@ -802,11 +807,11 @@ DEPENDENCIES
streamio-ffmpeg (~> 3.0)
strong_migrations (~> 0.7)
thor (~> 1.0)
tty-prompt (~> 0.22)
tty-prompt (~> 0.23)
twitter-text (~> 1.14)
tzinfo-data (~> 1.2020)
webauthn (~> 3.0.0.alpha1)
webmock (~> 3.10)
webmock (~> 3.11)
webpacker (~> 5.2)
webpush
xorcist (~> 1.1)

@ -7,7 +7,7 @@ class Api::V1::Accounts::FeaturedTagsController < Api::BaseController
respond_to :json
def index
render json: @featured_tags, each_serializer: REST::AccountFeaturedTagSerializer
render json: @featured_tags, each_serializer: REST::FeaturedTagSerializer
end
private

@ -7,8 +7,12 @@ module Settings
def destroy
if valid_picture?
msg = I18n.t('generic.changes_saved_msg') if UpdateAccountService.new.call(@account, { @picture => nil, "#{@picture}_remote_url" => '' })
redirect_to settings_profile_path, notice: msg, status: 303
if UpdateAccountService.new.call(@account, { @picture => nil, "#{@picture}_remote_url" => '' })
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
redirect_to settings_profile_path, notice: I18n.t('generic.changes_saved_msg'), status: 303
else
redirect_to settings_profile_path
end
else
bad_request
end

@ -4,13 +4,6 @@ exports[`<Button /> adds class "button-secondary" if props.secondary given 1`] =
<button
className="button button-secondary"
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
/>
`;
@ -18,13 +11,6 @@ exports[`<Button /> renders a button element 1`] = `
<button
className="button"
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
/>
`;
@ -33,13 +19,6 @@ exports[`<Button /> renders a disabled attribute if props.disabled given 1`] = `
className="button"
disabled={true}
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
/>
`;
@ -47,13 +26,6 @@ exports[`<Button /> renders class="button--block" if props.block given 1`] = `
<button
className="button button--block"
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
/>
`;
@ -61,13 +33,6 @@ exports[`<Button /> renders the children 1`] = `
<button
className="button"
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
>
<p>
children
@ -79,13 +44,6 @@ exports[`<Button /> renders the given text 1`] = `
<button
className="button"
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
>
foo
</button>
@ -95,13 +53,6 @@ exports[`<Button /> renders the props.text instead of children 1`] = `
<button
className="button"
onClick={[Function]}
style={
Object {
"height": "36px",
"lineHeight": "36px",
"padding": "0 16px",
}
}
>
foo
</button>

@ -10,17 +10,11 @@ export default class Button extends React.PureComponent {
disabled: PropTypes.bool,
block: PropTypes.bool,
secondary: PropTypes.bool,
size: PropTypes.number,
className: PropTypes.string,
title: PropTypes.string,
style: PropTypes.object,
children: PropTypes.node,
};
static defaultProps = {
size: 36,
};
handleClick = (e) => {
if (!this.props.disabled) {
this.props.onClick(e);
@ -36,13 +30,6 @@ export default class Button extends React.PureComponent {
}
render () {
const style = {
padding: `0 ${this.props.size / 2.25}px`,
height: `${this.props.size}px`,
lineHeight: `${this.props.size}px`,
...this.props.style,
};
const className = classNames('button', this.props.className, {
'button-secondary': this.props.secondary,
'button--block': this.props.block,
@ -54,7 +41,6 @@ export default class Button extends React.PureComponent {
disabled={this.props.disabled}
onClick={this.handleClick}
ref={this.setRef}
style={style}
title={this.props.title}
>
{this.props.text || this.props.children}

@ -2,7 +2,7 @@ import React, { PureComponent, Fragment } from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import { IntlProvider, addLocaleData } from 'react-intl';
import { List as ImmutableList, fromJS } from 'immutable';
import { fromJS } from 'immutable';
import { getLocale } from 'mastodon/locales';
import { getScrollbarWidth } from 'mastodon/utils/scrollbar';
import MediaGallery from 'mastodon/components/media_gallery';
@ -31,6 +31,7 @@ export default class MediaContainer extends PureComponent {
index: null,
time: null,
backgroundColor: null,
options: null,
};
handleOpenMedia = (media, index) => {
@ -40,13 +41,15 @@ export default class MediaContainer extends PureComponent {
this.setState({ media, index });
}
handleOpenVideo = (video, time) => {
const media = ImmutableList([video]);
handleOpenVideo = (options) => {
const { components } = this.props;
const { media } = JSON.parse(components[options.componetIndex].getAttribute('data-props'));
const mediaList = fromJS(media);
document.body.classList.add('with-modals--active');
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
this.setState({ media, time });
this.setState({ media: mediaList, options });
}
handleCloseMedia = () => {
@ -58,6 +61,7 @@ export default class MediaContainer extends PureComponent {
index: null,
time: null,
backgroundColor: null,
options: null,
});
}
@ -83,6 +87,7 @@ export default class MediaContainer extends PureComponent {
...(hashtag ? { hashtag: fromJS(hashtag) } : {}),
...(componentName === 'Video' ? {
componetIndex: i,
onOpenVideo: this.handleOpenVideo,
} : {
onOpenMedia: this.handleOpenMedia,
@ -100,7 +105,9 @@ export default class MediaContainer extends PureComponent {
<MediaModal
media={this.state.media}
index={this.state.index || 0}
time={this.state.time}
currentTime={this.state.options?.startTime}
autoPlay={this.state.options?.autoPlay}
volume={this.state.options?.defaultVolume}
onClose={this.handleCloseMedia}
onChangeBackgroundColor={this.setBackgroundColor}
/>

@ -164,13 +164,17 @@ class Header extends ImmutablePureComponent {
info.push(<span key='domain_blocked' className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain blocked' /></span>);
}
if (account.getIn(['relationship', 'requested']) || account.getIn(['relationship', 'following'])) {
bellBtn = <IconButton icon='bell-o' size={24} active={account.getIn(['relationship', 'notifying'])} title={intl.formatMessage(account.getIn(['relationship', 'notifying']) ? messages.disableNotifications : messages.enableNotifications, { name: account.get('username') })} onClick={this.props.onNotifyToggle} />;
}
if (me !== account.get('id')) {
if (!account.get('relationship')) { // Wait until the relationship is loaded
actionBtn = '';
} else if (account.getIn(['relationship', 'requested'])) {
actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.cancel_follow_request)} title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
actionBtn = <Button className={classNames('logo-button', { 'button--with-bell': bellBtn !== '' })} text={intl.formatMessage(messages.cancel_follow_request)} title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
} else if (!account.getIn(['relationship', 'blocking'])) {
actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']), 'button--with-bell': bellBtn !== '' })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
} else if (account.getIn(['relationship', 'blocking'])) {
actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
}
@ -178,10 +182,6 @@ class Header extends ImmutablePureComponent {
actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} />;
}
if (account.getIn(['relationship', 'requested']) || account.getIn(['relationship', 'following'])) {
bellBtn = <IconButton icon='bell-o' size={24} active={account.getIn(['relationship', 'notifying'])} title={intl.formatMessage(account.getIn(['relationship', 'notifying']) ? messages.disableNotifications : messages.enableNotifications, { name: account.get('username') })} onClick={this.props.onNotifyToggle} />;
}
if (account.get('moved') && !account.getIn(['relationship', 'following'])) {
actionBtn = '';
}

@ -194,7 +194,7 @@ class ListTimeline extends React.PureComponent {
</span>
<div className='column-settings__row'>
{ ['none', 'list', 'followed'].map(policy => (
<RadioButton name='order' value={policy} label={intl.formatMessage(messages[policy])} checked={replies_policy === policy} onChange={this.handleRepliesPolicyChange} />
<RadioButton name='order' key={policy} value={policy} label={intl.formatMessage(messages[policy])} checked={replies_policy === policy} onChange={this.handleRepliesPolicyChange} />
))}
</div>
</div>

@ -32,6 +32,9 @@ class MediaModal extends ImmutablePureComponent {
onClose: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
onChangeBackgroundColor: PropTypes.func.isRequired,
currentTime: PropTypes.number,
autoPlay: PropTypes.bool,
volume: PropTypes.number,
};
static contextTypes = {
@ -183,7 +186,7 @@ class MediaModal extends ImmutablePureComponent {
/>
);
} else if (image.get('type') === 'video') {
const { time } = this.props;
const { currentTime, autoPlay, volume } = this.props;
return (
<Video
@ -192,7 +195,10 @@ class MediaModal extends ImmutablePureComponent {
src={image.get('url')}
width={image.get('width')}
height={image.get('height')}
currentTime={time || 0}
frameRate={image.getIn(['meta', 'original', 'frame_rate'])}
currentTime={currentTime || 0}
autoPlay={autoPlay || false}
volume={volume || 1}
onCloseVideo={onClose}
detailed
alt={image.get('description')}

@ -121,10 +121,11 @@ class Video extends React.PureComponent {
autoPlay: PropTypes.bool,
volume: PropTypes.number,
muted: PropTypes.bool,
componetIndex: PropTypes.number,
};
static defaultProps = {
frameRate: 25,
frameRate: '25',
};
state = {
@ -501,6 +502,7 @@ class Video extends React.PureComponent {
startTime: this.video.currentTime,
autoPlay: !this.state.paused,
defaultVolume: this.state.volume,
componetIndex: this.props.componetIndex,
});
}

@ -17,8 +17,8 @@
"account.follow": "Հետեւել",
"account.followers": "Հետեւողներ",
"account.followers.empty": "Այս օգտատիրոջը դեռ ոչ մէկ չի հետեւում։",
"account.followers_counter": "{count, plural, one {{counter} Հետևորդ} other {{counter} Հետևորդներ}}",
"account.following_counter": "{count, plural, other {{counter} Հետևում են}}",
"account.followers_counter": "{count, plural, one {{counter} Հետեւորդ} other {{counter} Հետեւորդներ}}",
"account.following_counter": "{count, plural, other {{counter} Հետեւում են}}",
"account.follows.empty": "Այս օգտատէրը դեռ ոչ մէկի չի հետեւում։",
"account.follows_you": "Հետեւում է քեզ",
"account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները",
@ -45,7 +45,7 @@
"account.unfollow": "Ապահետեւել",
"account.unmute": "Ապալռեցնել @{name}֊ին",
"account.unmute_notifications": "Միացնել ծանուցումները @{name}֊ից",
"account_note.placeholder": "Սեղմեք գրառելու համար",
"account_note.placeholder": "Սեղմէ՛ք գրառելու համար\n",
"alert.rate_limited.message": "Փորձէք որոշ ժամանակ անց՝ {retry_time, time, medium}։",
"alert.rate_limited.title": "Գործողութիւնների յաճախութիւնը գերազանցում է թոյլատրելին",
"alert.unexpected.message": "Անսպասելի սխալ տեղի ունեցաւ։",
@ -57,9 +57,9 @@
"bundle_column_error.retry": "Կրկին փորձել",
"bundle_column_error.title": "Ցանցային սխալ",
"bundle_modal_error.close": "Փակել",
"bundle_modal_error.message": "Այս բաղադրիչը բեռնելու ընթացքում ինչ֊որ բան խափանվեց։",
"bundle_modal_error.message": "Այս բաղադրիչը բեռնելու ընթացքում ինչ֊որ բան խափանուեց։",
"bundle_modal_error.retry": "Կրկին փորձել",
"column.blocks": "Արգելափակված օգտատերեր",
"column.blocks": "Արգելափակուած օգտատէրեր",
"column.bookmarks": "Էջանիշեր",
"column.community": "Տեղական հոսք",
"column.direct": "Հասցէագրուած հաղորդագրութիւններ",
@ -69,27 +69,27 @@
"column.follow_requests": "Հետեւելու հայցեր",
"column.home": "Հիմնական",
"column.lists": "Ցանկեր",
"column.mutes": "Լռեցրած օգտատերեր",
"column.mutes": "Լռեցրած օգտատէրեր",
"column.notifications": "Ծանուցումներ",
"column.pins": "Ամրացված թթեր",
"column.pins": "Ամրացուած թթեր",
"column.public": "Դաշնային հոսք",
"column_back_button.label": "Ետ",
"column_header.hide_settings": "Թաքցնել կարգավորումները",
"column_header.hide_settings": "Թաքցնել կարգաւորումները",
"column_header.moveLeft_settings": "Տեղաշարժել սիւնը ձախ",
"column_header.moveRight_settings": "Տեղաշարժել սիւնը աջ",
"column_header.pin": "Ամրացնել",
"column_header.show_settings": "Ցուցադրել կարգավորումները",
"column_header.show_settings": "Ցուցադրել կարգաւորումները",
"column_header.unpin": "Հանել",
"column_subheading.settings": "Կարգավորումներ",
"community.column_settings.local_only": "Միայն ներքին",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Միայն հեռակա",
"compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
"column_subheading.settings": "Կարգաւորումներ",
"community.column_settings.local_only": "Միայն տեղական",
"community.column_settings.media_only": "Միայն մեդիա",
"community.column_settings.remote_only": "Միայն հեռակայ",
"compose_form.direct_message_warning": "Այս թութը տեսանելի կը լինի միայն նշուած օգտատէրերին։",
"compose_form.direct_message_warning_learn_more": "Իմանալ աւելին",
"compose_form.hashtag_warning": "Այս թութը չի հաշվառվի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարավոր է որոնել պիտակներով։",
"compose_form.hashtag_warning": "Այս թութը չի հաշուառուի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարաւոր է որոնել պիտակներով։",
"compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
"compose_form.lock_disclaimer.lock": "փակ",
"compose_form.placeholder": "Ի՞նչ կա մտքիդ",
"compose_form.placeholder": "Ի՞նչ կայ մտքիդ",
"compose_form.poll.add_option": "Աւելացնել տարբերակ",
"compose_form.poll.duration": "Հարցման տեւողութիւնը",
"compose_form.poll.option_placeholder": "Տարբերակ {number}",
@ -111,16 +111,16 @@
"confirmations.delete.confirm": "Ջնջել",
"confirmations.delete.message": "Վստա՞հ ես, որ ուզում ես ջնջել այս թութը։",
"confirmations.delete_list.confirm": "Ջնջել",
"confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապես ջնջել այս ցանկը։",
"confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապէս ջնջել այս ցանկը։",
"confirmations.domain_block.confirm": "Թաքցնել ամբողջ տիրույթը",
"confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրույթը։ Սովորաբար մի երկու թիրախավորված արգելափակում կամ լռեցում բավական է ու նախընտրելի։",
"confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրոյթը։ Սովորաբար մի երկու թիրախաւորուած արգելափակում կամ լռեցում բաւական է ու նախընտրելի։",
"confirmations.logout.confirm": "Ելք",
"confirmations.logout.message": "Համոզո՞ւած ես, որ ուզում ես դուրս գալ",
"confirmations.mute.confirm": "Լռեցնել",
"confirmations.mute.explanation": "Սա թաքցնելու ա իրենց գրառումներն, ինչպէս նաեւ իրենց նշող գրառումներն, բայց իրենք միեւնոյն է կը կարողանան հետեւել ձեզ եւ տեսնել ձեր գրառումները։",
"confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։",
"confirmations.redraft.confirm": "Ջնջել եւ խմբագրել նորից",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.redraft.message": "Վստահ ե՞ս, որ ցանկանում ես ջնջել եւ վերախմբագրել այս թութը։ Դու կը կորցնես այս գրառման բոլոր պատասխանները, տարածումները եւ հաւանումները։",
"confirmations.reply.confirm": "Պատասխանել",
"confirmations.reply.message": "Այս պահին պատասխանելը կը չեղարկի ձեր՝ այս պահին անաւարտ հաղորդագրութիւնը։ Համոզուա՞ծ էք։",
"confirmations.unfollow.confirm": "Ապահետեւել",
@ -134,67 +134,67 @@
"directory.new_arrivals": "Նորեկներ",
"directory.recently_active": "Վերջերս ակտիւ",
"embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճէնել ներքինանալ կոդը։",
"embed.preview": "Ահա, թե ինչ տեսք կունենա այն՝",
"embed.preview": "Ահայ, թէ ինչ տեսք կը ունենայ այն՝",
"emoji_button.activity": "Զբաղմունքներ",
"emoji_button.custom": "Հատուկ",
"emoji_button.flags": "Դրոշներ",
"emoji_button.custom": "Յատուկ",
"emoji_button.flags": "Դրօշներ",
"emoji_button.food": "Կերուխում",
"emoji_button.label": "Էմոջի ավելացնել",
"emoji_button.label": "Էմոջի աւելացնել",
"emoji_button.nature": "Բնութիւն",
"emoji_button.not_found": "Նման էմոջիներ դեռ չեն հայտնաբերվել։ (╯°□°)╯︵ ┻━┻",
"emoji_button.not_found": "Նման էմոջիներ դեռ չեն յայտնաբերուել։ (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Առարկաներ",
"emoji_button.people": "Մարդիկ",
"emoji_button.recent": "Հաճախ օգտագործվող",
"emoji_button.recent": "Յաճախ օգտագործուող",
"emoji_button.search": "Որոնել…",
"emoji_button.search_results": "Որոնման արդիւնքներ",
"emoji_button.symbols": "Նշաններ",
"emoji_button.travel": "Ուղեւորութիւն եւ տեղանքներ",
"empty_column.account_suspended": "Account suspended",
"empty_column.account_suspended": "Հաշիւը արգելափակուած է",
"empty_column.account_timeline": "Այստեղ թթեր չկա՛ն։",
"empty_column.account_unavailable": "Անձնական էջը հասանելի չի",
"empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։",
"empty_column.bookmarked_statuses": "Դու դեռ չունես որեւէ էջանշւած թութ։ Երբ էջանշես, դրանք կերեւան այստեղ։",
"empty_column.community": "Տեղական հոսքը դատա՛րկ է։ Հրապարակային մի բան գրիր շարժիչը խոդ տալու համար։",
"empty_column.bookmarked_statuses": "Դու դեռ չունես որեւէ էջանշւած թութ։ Երբ էջանշես, դրանք կը երեւան այստեղ։",
"empty_column.community": "Տեղական հոսքը դատարկ է։ Հրապարակային մի բան գրի՛ր շարժիչը գործարկելու համար։",
"empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն այստեղ կերեւայ։",
"empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։",
"empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած թութ։ Երբ հաւանես, դրանք կերեւան այստեղ։",
"empty_column.favourites": "Այս թութը ոչ մէկ դեռ չի հաւանել։ Հաւանողները կերեւան այստեղ, երբ նշեն թութը հաւանած։",
"empty_column.follow_requests": "Դու դեռ չունես որեւէ հետեւելու յայտ։ Բոլոր նման յայտերը կը յայտնուեն այստեղ։",
"empty_column.hashtag": "Այս պիտակով դեռ ոչինչ չկա։",
"empty_column.home": "Քո հիմնական հոսքը դատա՛րկ է։ Այցելի՛ր {public}ը կամ օգտվիր որոնումից՝ այլ մարդկանց հանդիպելու համար։",
"empty_column.hashtag": "Այս պիտակով դեռ ոչինչ չկայ։",
"empty_column.home": "Քո հիմնական հոսքը դատարկ է։ Այցելի՛ր {public}ը կամ օգտուիր որոնումից՝ այլ մարդկանց հանդիպելու համար։",
"empty_column.home.public_timeline": "հրապարակային հոսք",
"empty_column.list": "Այս ցանկում դեռ ոչինչ չկա։ Երբ ցանկի անդամներից որեւէ մեկը նոր թութ գրի, այն կհայտնվի այստեղ։",
"empty_column.lists": "Դուք դեռ չունեք ստեղծած ցանկ։ Ցանկ ստեղծելուն պես այն կհայտնվի այստեղ։",
"empty_column.mutes": "Առայժմ ոչ ոքի չեք լռեցրել։",
"empty_column.list": "Այս ցանկում դեռ ոչինչ չկայ։ Երբ ցանկի անդամներից որեւէ մեկը նոր թութ գրի, այն կը յայտնուի այստեղ։",
"empty_column.lists": "Դուք դեռ չունէք ստեղծած ցանկ։ Ցանկ ստեղծելուն պէս այն կը յայտնուի այստեղ։",
"empty_column.mutes": "Առայժմ ոչ ոքի չէք լռեցրել։",
"empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր միւսներին՝ խօսակցութիւնը սկսելու համար։",
"empty_column.public": "Այստեղ բան չկա՛յ։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգոյցներից էակների՝ այն լցնելու համար։",
"error.unexpected_crash.explanation": "Մեր ծրագրակազմում վրիպակի կամ դիտարկչի անհամատեղելիութեան պատճառով այս էջը չի կարող լիարժէք պատկերուել։",
"error.unexpected_crash.explanation_addons": "Այս էջի ճիշտ պատկերումը չի ստացում։ Խափանումը հաւանաբար առաջացել է դիտարկիչի յավելվածից կամ առցանց թարգմանիչից։",
"error.unexpected_crash.next_steps": "Փորձիր թարմացնել էջը։ Եթե դա չօգնի ապա կարող ես օգտվել Մաստադոնից ուրիշ դիտարկիչով կամ հավելվածով։",
"error.unexpected_crash.next_steps": "Փորձիր թարմացնել էջը։ Եթէ դա չօգնի ապա կարող ես օգտուել Մաստադոնից ուրիշ դիտարկիչով կամ յաւելուածով։",
"error.unexpected_crash.next_steps_addons": "Փորձիր անջատել յաւելուածները եւ թարմացնել էջը։ Եթե դա չօգնի, կարող ես օգտուել Մաստադոնից այլ դիտարկիչով կամ յաւելուածով։",
"errors.unexpected_crash.copy_stacktrace": "Պատճենել սթաքթրեյսը սեղմատախտակին",
"errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին",
"follow_request.authorize": "Վավերացնել",
"follow_request.authorize": "Վաւերացնել",
"follow_request.reject": "Մերժել",
"follow_requests.unlocked_explanation": "Այս հարցումը ուղարկված է հաշվից, որի համար {domain}-ի անձնակազմը միացրել է ձեռքով ստուգում։",
"generic.saved": "Պահպանված է",
"follow_requests.unlocked_explanation": "Այս հարցումը ուղարկուած է հաշուից, որի համար {domain}-ի անձնակազմը միացրել է ձեռքով ստուգում։",
"generic.saved": "Պահպանուած է",
"getting_started.developers": "Մշակողներ",
"getting_started.directory": "Օգտատէրերի շտեմարան",
"getting_started.documentation": "Փաստաթղթեր",
"getting_started.heading": "Ինչպես սկսել",
"getting_started.heading": "Ինչպէս սկսել",
"getting_started.invite": "Հրաւիրել մարդկանց",
"getting_started.open_source_notice": "Մաստոդոնը բաց ելատեքստով ծրագրակազմ է։ Կարող ես ներդրում անել կամ վրեպներ զեկուցել ԳիթՀաբում՝ {github}։",
"getting_started.open_source_notice": "Մաստոդոնը բաց ելատեքստով ծրագրակազմ է։ Կարող ես ներդրում անել կամ վրէպներ զեկուցել ԳիթՀաբում՝ {github}։",
"getting_started.security": "Հաշուի կարգաւորումներ",
"getting_started.terms": "Ծառայութեան պայմանները",
"hashtag.column_header.tag_mode.all": "եւ {additional}",
"hashtag.column_header.tag_mode.any": "կամ {additional}",
"hashtag.column_header.tag_mode.none": "առանց {additional}",
"hashtag.column_settings.select.no_options_message": "Առաջարկներ չկան",
"hashtag.column_settings.select.placeholder": վելացրու հեշթեգեր…",
"hashtag.column_settings.select.placeholder": ւելացրու պիտկներ…",
"hashtag.column_settings.tag_mode.all": "Բոլորը",
"hashtag.column_settings.tag_mode.any": "Ցանկացածը",
"hashtag.column_settings.tag_mode.none": "Ոչ մեկը",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"hashtag.column_settings.tag_toggle": "Ներառել լրացուցիչ պիտակները այս սիւնակում ",
"home.column_settings.basic": "Հիմնական",
"home.column_settings.show_reblogs": "Ցուցադրել տարածածները",
"home.column_settings.show_replies": "Ցուցադրել պատասխանները",
@ -202,17 +202,17 @@
"home.show_announcements": "Ցուցադրել յայտարարութիւնները",
"intervals.full.days": "{number, plural, one {# օր} other {# օր}}",
"intervals.full.hours": "{number, plural, one {# ժամ} other {# ժամ}}",
"intervals.full.minutes": "{number, plural, one {# րոպե} other {# րոպե}}",
"introduction.federation.action": "Հաջորդ",
"intervals.full.minutes": "{number, plural, one {# րոպէ} other {# րոպէ}}",
"introduction.federation.action": "Յաջորդ",
"introduction.federation.federated.headline": "Դաշնային",
"introduction.federation.federated.text": "Դաշնեզերքի հարեւան հանգոյցների հանրային գրառումները կը յայտնուեն դաշնային հոսքում։",
"introduction.federation.home.headline": "Հիմնական",
"introduction.federation.home.text": "Այն անձանց թթերը ում հետևում ես, կը յայտնուեն հիմնական հոսքում։ Դու կարող ես հետեւել ցանկացած անձի ցանկացած հանգոյցից։",
"introduction.federation.local.headline": "Տեղային",
"introduction.federation.local.text": "Տեղական հոսքում կարող ես տեսնել քո հանգոյցի բոլոր հանրային գրառումները։",
"introduction.interactions.action": "Finish toot-orial!",
"introduction.interactions.action": "Աւարտել թթի դասընթացը",
"introduction.interactions.favourite.headline": "Նախընտրելի",
"introduction.interactions.favourite.text": "Փոխանցիր հեղինակին որ քեզ դուր է եկել իր թութը հավանելով այն։",
"introduction.interactions.favourite.text": "Փոխանցիր հեղինակին որ քեզ դուր է եկել իր թութը հաւանելով այն։",
"introduction.interactions.reblog.headline": "Տարածել",
"introduction.interactions.reblog.text": "Կիսիր այլ օգտատէրերի թութերը քո հետեւողների հետ տարածելով դրանք քո անձնական էջում։",
"introduction.interactions.reply.headline": "Պատասխանել",
@ -220,25 +220,25 @@
"introduction.welcome.action": "Գնացի՜նք։",
"introduction.welcome.headline": "Առաջին քայլեր",
"introduction.welcome.text": "Դաշնեզերքը ողջունում է ձեզ։ Շուտով կը կարողանաս ուղարկել նամակներ ու շփուել տարբեր հանգոյցների ընկերներիդ հետ։ Բայց մտապահիր {domain} հանգոյցը, այն իւրայատուկ է, այստեղ է պահւում քո հաշիւը։",
"keyboard_shortcuts.back": "ետ նավարկելու համար",
"keyboard_shortcuts.blocked": "արգելափակված օգտատերերի ցանկը բացելու համար",
"keyboard_shortcuts.back": "ետ նաւարկելու համար",
"keyboard_shortcuts.blocked": "արգելափակուած օգտատէրերի ցանկը բացելու համար",
"keyboard_shortcuts.boost": "տարածելու համար",
"keyboard_shortcuts.column": "սիւներից մէկի վրայ սեւեռուելու համար",
"keyboard_shortcuts.compose": "շարադրման տիրույթին սեւեռվելու համար",
"keyboard_shortcuts.compose": "շարադրման տիրոյթին սեւեռուելու համար",
"keyboard_shortcuts.description": "Նկարագրութիւն",
"keyboard_shortcuts.direct": "հասցեագրված գրվածքների հոսքը բացելու համար",
"keyboard_shortcuts.down": "ցանկով ներքեւ շարժվելու համար",
"keyboard_shortcuts.direct": "հասցէագրուած գրուածքների հոսքը բացելու համար",
"keyboard_shortcuts.down": "ցանկով ներքեւ շարժուելու համար",
"keyboard_shortcuts.enter": "թութը բացելու համար",
"keyboard_shortcuts.favourite": "հավանելու համար",
"keyboard_shortcuts.favourite": "հաւանելու համար",
"keyboard_shortcuts.favourites": "էջանիշերի ցուցակը բացելու համար",
"keyboard_shortcuts.federated": "դաշնային հոսքին անցնելու համար",
"keyboard_shortcuts.heading": "Ստեղնաշարի կարճատներ",
"keyboard_shortcuts.home": "անձնական հոսքին անցնելու համար",
"keyboard_shortcuts.hotkey": "Հատուկ ստեղն",
"keyboard_shortcuts.hotkey": "Յատուկ ստեղն",
"keyboard_shortcuts.legend": "այս ձեռնարկը ցուցադրելու համար",
"keyboard_shortcuts.local": "տեղական հոսքին անցնելու համար",
"keyboard_shortcuts.mention": "հեղինակին նշելու համար",
"keyboard_shortcuts.muted": "լռեցված օգտատերերի ցանկը բացելու համար",
"keyboard_shortcuts.muted": "լռեցուած օգտատէրերի ցանկը բացելու համար",
"keyboard_shortcuts.my_profile": "սեփական էջին անցնելու համար",
"keyboard_shortcuts.notifications": "ծանուցումների սիւնակը բացելու համար",
"keyboard_shortcuts.open_media": "ցուցադրել մեդիան",
@ -247,41 +247,41 @@
"keyboard_shortcuts.reply": "պատասխանելու համար",
"keyboard_shortcuts.requests": "հետեւելու հայցերի ցանկը դիտելու համար",
"keyboard_shortcuts.search": "որոնման դաշտին սեւեռվելու համար",
"keyboard_shortcuts.spoilers": "որպեսզի ցուցադրվի/թաքցվի CW դաշտը",
"keyboard_shortcuts.spoilers": "որպէսզի ցուցադրուի/թաքցուի CW դաշտը",
"keyboard_shortcuts.start": "«սկսել» սիւնակը բացելու համար",
"keyboard_shortcuts.toggle_hidden": "CW֊ի ետեւի տեքստը ցուցադրել֊թաքցնելու համար",
"keyboard_shortcuts.toggle_sensitivity": "մեդիան ցուցադրել֊թաքցնելու համար",
"keyboard_shortcuts.toot": "թարմ թութ սկսելու համար",
"keyboard_shortcuts.unfocus": "տեքստի/որոնման տիրույթից ապասեւեռվելու համար",
"keyboard_shortcuts.up": "ցանկով վերեւ շարժվելու համար",
"keyboard_shortcuts.unfocus": "տեքստի/որոնման տիրոյթից ապասեւեռուելու համար",
"keyboard_shortcuts.up": "ցանկով վերեւ շարժուելու համար",
"lightbox.close": "Փակել",
"lightbox.compress": "Compress image view box",
"lightbox.expand": "Expand image view box",
"lightbox.next": "Հաջորդ",
"lightbox.compress": "Փակել պատկերի դիտման պատուհանը",
"lightbox.expand": "Բացել պատկերի դիտման պատուհանը",
"lightbox.next": "Յաջորդ",
"lightbox.previous": "Նախորդ",
"lists.account.add": վելացնել ցանկին",
"lists.account.add": ւելացնել ցանկին",
"lists.account.remove": "Հանել ցանկից",
"lists.delete": "Ջնջել ցանկը",
"lists.edit": "Փոփոխել ցանկը",
"lists.edit.submit": "Փոխել վերնագիրը",
"lists.new.create": վելացնել ցանկ",
"lists.new.create": ւելացնել ցանկ",
"lists.new.title_placeholder": "Նոր ցանկի վերնագիր",
"lists.replies_policy.followed": "Any followed user",
"lists.replies_policy.list": "Members of the list",
"lists.replies_policy.followed": "Ցանկացած հետեւող օգտատէր",
"lists.replies_policy.list": "Ցանկի անդամներ",
"lists.replies_policy.none": "Ոչ ոք",
"lists.replies_policy.title": "Show replies to:",
"lists.search": "Փնտրել քո հետեւած մարդկանց մեջ",
"lists.replies_policy.title": "Ցուցադրել պատասխանները՝",
"lists.search": "Փնտրել քո հետեւած մարդկանց մէջ",
"lists.subheading": "Քո ցանկերը",
"load_pending": "{count, plural, one {# նոր նիւթ} other {# նոր նիւթ}}",
"loading_indicator.label": "Բեռնվում է…",
"loading_indicator.label": "Բեռնւում է…",
"media_gallery.toggle_visible": "Ցուցադրել/թաքցնել",
"missing_indicator.label": "Չգտնվեց",
"missing_indicator.label": "Չգտնուեց",
"missing_indicator.sublabel": "Պաշարը չի գտնւում",
"mute_modal.duration": ևողություն",
"mute_modal.duration": եւողութիւն",
"mute_modal.hide_notifications": "Թաքցնե՞լ ցանուցումներն այս օգտատիրոջից։",
"mute_modal.indefinite": "Անժամկետ",
"mute_modal.indefinite": "Անժամկէտ",
"navigation_bar.apps": "Դիւրակիր յաւելուածներ",
"navigation_bar.blocks": "Արգելափակված օգտատերեր",
"navigation_bar.blocks": "Արգելափակուած օգտատէրեր",
"navigation_bar.bookmarks": "Էջանիշեր",
"navigation_bar.community_timeline": "Տեղական հոսք",
"navigation_bar.compose": "Գրել նոր թութ",
@ -297,13 +297,13 @@
"navigation_bar.keyboard_shortcuts": "Ստեղնաշարի կարճատներ",
"navigation_bar.lists": "Ցանկեր",
"navigation_bar.logout": "Դուրս գալ",
"navigation_bar.mutes": "Լռեցրած օգտատերեր",
"navigation_bar.mutes": "Լռեցրած օգտատէրեր",
"navigation_bar.personal": "Անձնական",
"navigation_bar.pins": "Ամրացված թթեր",
"navigation_bar.pins": "Ամրացուած թթեր",
"navigation_bar.preferences": "Նախապատուութիւններ",
"navigation_bar.public_timeline": "Դաշնային հոսք",
"navigation_bar.security": "Անվտանգութիւն",
"notification.favourite": "{name} հավանեց թութդ",
"notification.favourite": "{name} հաւանեց թութդ",
"notification.follow": "{name} սկսեց հետեւել քեզ",
"notification.follow_request": "{name} քեզ հետեւելու հայց է ուղարկել",
"notification.mention": "{name} նշեց քեզ",
@ -333,17 +333,17 @@
"notifications.filter.follows": "Հետեւածները",
"notifications.filter.mentions": "Նշումները",
"notifications.filter.polls": "Հարցման արդիւնքները",
"notifications.filter.statuses": "Updates from people you follow",
"notifications.filter.statuses": "Թարմացումներ հետեւորդներից",
"notifications.grant_permission": "Թոյլատրել։",
"notifications.group": "{count} ծանուցում",
"notifications.mark_as_read": "Համարել բոլոր ծանուցումները ընթերցած",
"notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
"notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
"notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
"notifications.permission_denied": "Աշխատատիրոյթի ծանուցումներն անհասանելի են՝ դիտարկչի նախկինում մերժուած թոյլտուութիւնների հայցման հետեւանքով",
"notifications.permission_denied_alert": "Աշխատատիրոյթի ծանուցումները չեն կարող միացուել, քանի որ դիտարկչի թոյլտուութիւնները նախկինում մերժուել են",
"notifications.permission_required": "Աշխատատիրոյթի ծանուցումներն անհասանելի են, քանի որ անհրաժեշտ թոյլտուութիւնները բացակայում են։",
"notifications_permission_banner.enable": "Միացնել դիտարկչից ծանուցումները",
"notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
"notifications_permission_banner.title": "Never miss a thing",
"picture_in_picture.restore": "Հետ բերել",
"notifications_permission_banner.how_to_control": "Ծանուցումներ ստանալու համար, երբ Մաստոդոնը բաց չէ՝ ակտիւացրու աշխատատիրոյթի ծանուցումները։ Դու կարող ես ճշգրտօրէն վերահսկել թէ ինչպիսի փոխգործակցութիւններ առաջանան աշխատատիրոյթի ծանուցումներից՝ {icon}ի կոճակով՝ այն ակտիւացնելուց յետոյ։",
"notifications_permission_banner.title": "Ոչինչ բաց մի թող",
"picture_in_picture.restore": "Յետ բերել",
"poll.closed": "Փակ",
"poll.refresh": "Թարմացնել",
"poll.total_people": "{count, plural, one {# հոգի} other {# հոգի}}",
@ -353,8 +353,8 @@
"poll_button.add_poll": "Աւելացնել հարցում",
"poll_button.remove_poll": "Հեռացնել հարցումը",
"privacy.change": "Կարգաւորել թթի գաղտնիութիւնը",
"privacy.direct.long": "Թթել միայն նշված օգտատերերի համար",
"privacy.direct.short": "Հասցեագրված",
"privacy.direct.long": "Թթել միայն նշուած օգտատէրերի համար",
"privacy.direct.short": "Հասցէագրուած",
"privacy.private.long": "Թթել միայն հետեւողների համար",
"privacy.private.short": "Միայն հետեւողներին",
"privacy.public.long": "Թթել հրապարակային հոսքերում",
@ -378,12 +378,12 @@
"report.submit": "Ուղարկել",
"report.target": "Բողոքել {target}֊ի մասին",
"search.placeholder": "Փնտրել",
"search_popout.search_format": "Փնտրելու առաջադեմ ձեւ",
"search_popout.search_format": "Փնտրելու առաջադէմ ձեւ",
"search_popout.tips.full_text": "Պարզ տեքստը վերադարձնում է գրառումներդ, հաւանածներդ, տարածածներդ, որտեղ ես նշուած եղել, ինչպէս նաեւ նման օգտանուններ, անուններ եւ պիտակներ։",
"search_popout.tips.hashtag": "պիտակ",
"search_popout.tips.status": "թութ",
"search_popout.tips.text": "Հասարակ տեքստը կվերադարձնի համընկնող անուններ, օգտանուններ ու պիտակներ",
"search_popout.tips.user": "օգտատեր",
"search_popout.tips.text": "Հասարակ տեքստը կը վերադարձնի համընկնող անուններ, օգտանուններ ու պիտակներ",
"search_popout.tips.user": "օգտատէր",
"search_results.accounts": "Մարդիկ",
"search_results.hashtags": "Պիտակներ",
"search_results.statuses": "Թթեր",
@ -394,14 +394,14 @@
"status.block": "Արգելափակել @{name}֊ին",
"status.bookmark": "Էջանիշ",
"status.cancel_reblog_private": "Ապատարածել",
"status.cannot_reblog": "Այս թութը չի կարող տարածվել",
"status.copy": "Պատճենել գրառման հղումը",
"status.cannot_reblog": "Այս թութը չի կարող տարածուել",
"status.copy": "Պատճէնել գրառման յղումը",
"status.delete": "Ջնջել",
"status.detailed_status": "Շղթայի ընդլայնված դիտում",
"status.detailed_status": "Շղթայի ընդլայնուած դիտում",
"status.direct": "Նամակ գրել {name} -ին",
"status.embed": "Ներդնել",
"status.favourite": "Հավանել",
"status.filtered": "Զտված",
"status.favourite": "Հաւանել",
"status.filtered": "Զտուած",
"status.load_more": "Բեռնել աւելին",
"status.media_hidden": "մեդիաբովանդակութիւնը թաքցուած է",
"status.mention": "Նշել @{name}֊ին",
@ -410,7 +410,7 @@
"status.mute_conversation": "Լռեցնել խօսակցութիւնը",
"status.open": "Ընդարձակել այս թութը",
"status.pin": "Ամրացնել անձնական էջում",
"status.pinned": "Ամրացված թութ",
"status.pinned": "Ամրացուած թութ",
"status.read_more": "Կարդալ աւելին",
"status.reblog": "Տարածել",
"status.reblog_private": "Տարածել սեփական լսարանին",
@ -419,10 +419,10 @@
"status.redraft": "Ջնջել եւ վերակազմել",
"status.remove_bookmark": "Հեռացնել էջանիշերից",
"status.reply": "Պատասխանել",
"status.replyAll": "Պատասխանել թելին",
"status.replyAll": "Պատասխանել շղթային",
"status.report": "Բողոքել @{name}֊ից",
"status.sensitive_warning": "Կասկածելի բովանդակութիւն",
"status.share": "Կիսվել",
"status.share": "Կիսուել",
"status.show_less": "Պակաս",
"status.show_less_all": "Թաքցնել բոլոր նախազգուշացնումները",
"status.show_more": "Աւելին",
@ -432,7 +432,7 @@
"status.unmute_conversation": "Ապալռեցնել խօսակցութիւնը",
"status.unpin": "Հանել անձնական էջից",
"suggestions.dismiss": "Անտեսել առաջարկը",
"suggestions.header": "Միգուցե քեզ հետաքրքրի…",
"suggestions.header": "Միգուցէ քեզ հետաքրքրի…",
"tabs_bar.federated_timeline": "Դաշնային",
"tabs_bar.home": "Հիմնական",
"tabs_bar.local_timeline": "Տեղական",
@ -440,41 +440,41 @@
"tabs_bar.search": "Փնտրել",
"time_remaining.days": "{number, plural, one {մնաց # օր} other {մնաց # օր}}",
"time_remaining.hours": "{number, plural, one {# ժամ} other {# ժամ}} անց",
"time_remaining.minutes": "{number, plural, one {# րոպե} other {# րոպե}} անց",
"time_remaining.minutes": "{number, plural, one {# րոպէ} other {# րոպէ}} անց",
"time_remaining.moments": "Մնացել է մի քանի վարկեան",
"time_remaining.seconds": "{number, plural, one {# վարկեան} other {# վարկեան}} անց",
"timeline_hint.remote_resource_not_displayed": "{resource} այլ սպասարկիչներից չեն ցուցադրվել:",
"timeline_hint.resources.followers": "Հետևորդներ",
"timeline_hint.resources.follows": "Հետևել",
"timeline_hint.resources.follows": "Հետեւել",
"timeline_hint.resources.statuses": "Հին թութեր",
"trends.counter_by_accounts": "{count, plural, one {{counter} մարդ} other {{counter} մարդիկ}} խօսում են",
"trends.trending_now": "Այժմ արդիական",
"ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։",
"ui.beforeunload": "Քո սեւագիրը կը կորի, եթէ լքես Մաստոդոնը։",
"units.short.billion": "{count}մլրդ",
"units.short.million": "{count}մլն",
"units.short.thousand": "{count}Հազ.",
"upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար",
"upload_button.label": վելացնել մեդիա",
"upload_error.limit": "Ֆայլի վերբեռնման սահմանաչափը գերազանցված է։",
"upload_button.label": ւելացնել մեդիա",
"upload_error.limit": "Նիշքի վերբեռնման սահմանաչափը գերազանցուած է։",
"upload_error.poll": "Հարցումների հետ նիշք կցել հնարաւոր չէ։",
"upload_form.audio_description": "Նկարագրիր ձայնագրութեան բովանդակութիւնը լսողական խնդիրներով անձանց համար",
"upload_form.description": "Նկարագիր՝ տեսողական խնդիրներ ունեցողների համար",
"upload_form.edit": "Խմբագրել",
"upload_form.thumbnail": "Փոխել պատկերակը",
"upload_form.undo": "Հետարկել",
"upload_form.undo": "Յետարկել",
"upload_form.video_description": "Նկարագրիր տեսանիւթը լսողական կամ տեսողական խնդիրներով անձանց համար",
"upload_modal.analyzing_picture": "Լուսանկարի վերլուծում…",
"upload_modal.apply": "Կիրառել",
"upload_modal.choose_image": "Ընտրել նկար",
"upload_modal.description_placeholder": "Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։",
"upload_modal.detect_text": "Հայտնբերել տեքստը նկարից",
"upload_modal.description_placeholder": "Բել դղեակի ձախ ժամն օֆ ազգութեանը ցպահանջ չճշտած վնաս էր եւ փառք։",
"upload_modal.detect_text": "Յայտնաբերել տեքստը նկարից",
"upload_modal.edit_media": "Խմբագրել մեդիան",
"upload_modal.hint": "Սեղմէք եւ տեղաշարժէք նախադիտման շրջանակը՝ որ ընտրէք մանրապատկերում միշտ տեսանելի կէտը։",
"upload_modal.preparing_ocr": "Գրաճանաչման նախապատրաստում…",
"upload_modal.preview_label": "Նախադիտում ({ratio})",
"upload_progress.label": "Վերբեռնվում է…",
"video.close": "Փակել տեսագրութիւնը",
"video.download": "Ներբեռնել ֆայլը",
"video.download": "Ներբեռնել նիշքը",
"video.exit_fullscreen": "Անջատել լիաէկրան դիտումը",
"video.expand": "Ընդարձակել տեսագրութիւնը",
"video.fullscreen": "Լիաէկրան",

@ -38,7 +38,7 @@
"account.requested": "അനദതിിിി. പിടരള അപഷ റദൻ ഞക",
"account.share": "@{name} നൽ പങക",
"account.show_reblogs": "@{name} ൽ നിള ബകൾ കിക",
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.statuses_counter": "{count, plural, one {{counter} } other {{counter} ടകൾ}}",
"account.unblock": "ബക @{name}",
"account.unblock_domain": "{domain} വിക",
"account.unendorse": "പിൽ പരകടമിിക",
@ -250,8 +250,8 @@
"keyboard_shortcuts.spoilers": "to show/hide CW field",
"keyboard_shortcuts.start": "to open \"get started\" column",
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
"keyboard_shortcuts.toot": "to start a brand new toot",
"keyboard_shortcuts.toggle_sensitivity": "ിയ കിനതി/മറയനതി",
"keyboard_shortcuts.toot": "ഒരിയ ട ആരി",
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
"keyboard_shortcuts.up": "to move up in the list",
"lightbox.close": "അടയക",
@ -269,7 +269,7 @@
"lists.replies_policy.followed": "Any followed user",
"lists.replies_policy.list": "Members of the list",
"lists.replies_policy.none": "ആരില",
"lists.replies_policy.title": "Show replies to:",
"lists.replies_policy.title": "ഇതിള മറപടികൾ കി:",
"lists.search": "Search among people you follow",
"lists.subheading": "എന പടികകൾ",
"load_pending": "{count, plural, one {# new item} other {# new items}}",
@ -305,14 +305,14 @@
"navigation_bar.security": "സരകഷ",
"notification.favourite": "{name} favourited your status",
"notification.follow": "{name} നിങളിടർന",
"notification.follow_request": "{name} has requested to follow you",
"notification.follow_request": "{name} ിങളിടരൻ അഭയർതി",
"notification.mention": "{name} mentioned you",
"notification.own_poll": "നിങളൾ അവസി",
"notification.poll": "A poll you have voted in has ended",
"notification.reblog": "{name} നിങള",
"notification.status": "{name} ഇപൾ പ",
"notifications.clear": "അറിിക",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
"notifications.clear_confirmation": "ിങള എല അറിികളവതമികണമിങൾക ഉറപ?",
"notifications.column_settings.alert": "ഡ അറിികൾ",
"notifications.column_settings.favourite": "പിയപടവ:",
"notifications.column_settings.filter_bar.advanced": "എലിഗങങളരദർശിിക",
@ -349,14 +349,14 @@
"poll.total_people": "{count, plural, one {# person} other {# people}}",
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
"poll.vote": "വക",
"poll.voted": "You voted for this answer",
"poll.voted": "ഈ ഉതതരതിിിങൾ വ",
"poll_button.add_poll": "ഒരൾ ചർകക",
"poll_button.remove_poll": "പൾ നക",
"privacy.change": "Adjust status privacy",
"privacy.change": "വകയത കരമകരി",
"privacy.direct.long": "Post to mentioned users only",
"privacy.direct.short": "നി",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
"privacy.private.short": "ിടരനവർക",
"privacy.public.long": "Post to public timelines",
"privacy.public.short": "Public",
"privacy.unlisted.long": "Do not show in public timelines",
@ -372,7 +372,7 @@
"relative_time.today": "ഇന",
"reply_indicator.cancel": "റദക",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
"report.forward_hint": "ഈ അക മറർവറിൽ നി. റിർടി അജത പകർപ അവി അയയകണ?",
"report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
"report.placeholder": "കതൽ അഭിയങങൾ",
"report.submit": "സമർപിക",
@ -420,14 +420,14 @@
"status.remove_bookmark": "ബർകക",
"status.reply": "മറപടി",
"status.replyAll": "Reply to thread",
"status.report": "Report @{name}",
"status.report": "@{name}--നിർട",
"status.sensitive_warning": "Sensitive content",
"status.share": "പങിക",
"status.show_less": "കറചിക",
"status.show_less_all": "Show less for all",
"status.show_more": "കതകൽ കിക",
"status.show_more_all": "എലവർകിതൽ കിക",
"status.show_thread": "Show thread",
"status.show_thread": "ി",
"status.uncached_media_warning": "ലഭയമലല",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
@ -463,24 +463,24 @@
"upload_form.thumbnail": "ലഘിക",
"upload_form.undo": "ഇലക",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.analyzing_picture": "Analyzing picture…",
"upload_modal.analyzing_picture": "ിിശകലന…",
"upload_modal.apply": "പരയിക",
"upload_modal.choose_image": "ചിിരഞക",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
"upload_modal.detect_text": "Detect text from picture",
"upload_modal.edit_media": "മിയ തിക",
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
"upload_modal.preparing_ocr": "Preparing OCR…",
"upload_modal.preparing_ocr": "OCR തയ…",
"upload_modal.preview_label": "Preview ({ratio})",
"upload_progress.label": "Uploading…",
"video.close": "വി അടയക",
"video.download": "ഫയൽ ഡൺലക",
"video.exit_fullscreen": "Exit full screen",
"video.exit_fullscreen": "ർണണ സിൽ നിറതകടക",
"video.expand": "Expand video",
"video.fullscreen": "പർണണ സൻ",
"video.hide": "വി മറയക",
"video.mute": "Mute sound",
"video.pause": "Pause",
"video.play": "Play",
"video.play": "",
"video.unmute": "Unmute sound"
}

@ -1,5 +1,5 @@
{
"account.account_note_header": "Viết nhận xét",
"account.account_note_header": "Ghi chú",
"account.add_or_remove_from_list": "Thêm hoặc Xóa khỏi danh sách",
"account.badges.bot": "Bot",
"account.badges.group": "Nhóm",
@ -425,10 +425,10 @@
"status.share": "Chia sẻ",
"status.show_less": "Thu gọn",
"status.show_less_all": "Thu gọn toàn bộ",
"status.show_more": "Mở rộng",
"status.show_more": "Xem thêm",
"status.show_more_all": "Hiển thị tất cả",
"status.show_thread": "Liên quan",
"status.uncached_media_warning": "Giới hạn",
"status.show_thread": "Toàn bộ chủ đề",
"status.uncached_media_warning": "Uncached",
"status.unmute_conversation": "Quan tâm",
"status.unpin": "Bỏ ghim trên trang cá nhân",
"suggestions.dismiss": "Tắt đề xuất",

@ -154,6 +154,11 @@
display: block;
width: 100%;
}
.layout-multiple-columns &.button--with-bell {
font-size: 12px;
padding: 0 8px;
}
}
.column__wrapper {
@ -2879,6 +2884,7 @@ a.account__display-name {
flex: 0 0 auto;
padding: 10px;
padding-top: 20px;
z-index: 1;
ul {
margin-bottom: 10px;
@ -7194,21 +7200,6 @@ noscript {
.audio-player {
border-radius: 0;
}
@media screen and (max-width: 415px) {
width: 210px;
bottom: 10px;
right: 10px;
&__footer {
display: none;
}
.video-player,
.audio-player {
border-radius: 0 0 4px 4px;
}
}
}
.picture-in-picture-placeholder {

@ -444,6 +444,10 @@
}
}
.logo-button {
padding: 3px 15px;
}
&__image {
border-radius: 4px 4px 0 0;
overflow: hidden;

@ -170,6 +170,11 @@ body.rtl {
right: 42px;
}
.account__header__tabs__buttons > .icon-button {
margin-right: 0;
margin-left: 8px;
}
.account__avatar-overlay-overlay {
right: auto;
left: 0;

@ -83,9 +83,14 @@
background: $ui-highlight-color;
color: $primary-text-color;
text-transform: none;
line-height: 36px;
line-height: 1.2;
height: auto;
padding: 3px 15px;
min-height: 36px;
min-width: 88px;
white-space: normal;
overflow-wrap: break-word;
hyphens: auto;
padding: 0 15px;
border: 0;
svg {
@ -126,6 +131,12 @@
}
}
a.button.logo-button {
display: inline-flex;
align-items: center;
justify-content: center;
}
.embed,
.public-layout {
.status__content[data-spoiler=folded] {

@ -97,8 +97,8 @@ module AccountInteractions
has_many :announcement_mutes, dependent: :destroy
end
def follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false)
rel = active_relationships.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit)
def follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false, bypass_limit: false)
rel = active_relationships.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit, bypass_follow_limit: bypass_limit)
.find_or_create_by!(target_account: other_account)
rel.show_reblogs = reblogs unless reblogs.nil?
@ -111,8 +111,8 @@ module AccountInteractions
rel
end
def request_follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false)
rel = follow_requests.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit)
def request_follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false, bypass_limit: false)
rel = follow_requests.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit, bypass_follow_limit: bypass_limit)
.find_or_create_by!(target_account: other_account)
rel.show_reblogs = reblogs unless reblogs.nil?

@ -0,0 +1,17 @@
# frozen_string_literal: true
module FollowLimitable
extend ActiveSupport::Concern
included do
validates_with FollowLimitValidator, on: :create, unless: :bypass_follow_limit?
end
def bypass_follow_limit=(value)
@bypass_follow_limit = value
end
def bypass_follow_limit?
@bypass_follow_limit
end
end

@ -17,6 +17,7 @@ class Follow < ApplicationRecord
include Paginable
include RelationshipCacheable
include RateLimitable
include FollowLimitable
rate_limit by: :account, family: :follows
@ -26,7 +27,6 @@ class Follow < ApplicationRecord
has_one :notification, as: :activity, dependent: :destroy
validates :account_id, uniqueness: { scope: :target_account_id }
validates_with FollowLimitValidator, on: :create, if: :rate_limit?
scope :recent, -> { reorder(id: :desc) }

@ -17,6 +17,7 @@ class FollowRequest < ApplicationRecord
include Paginable
include RelationshipCacheable
include RateLimitable
include FollowLimitable
rate_limit by: :account, family: :follows
@ -26,7 +27,6 @@ class FollowRequest < ApplicationRecord
has_one :notification, as: :activity, dependent: :destroy
validates :account_id, uniqueness: { scope: :target_account_id }
validates_with FollowLimitValidator, on: :create, if: :rate_limit?
def authorize!
account.follow!(target_account, reblogs: show_reblogs, notify: notify, uri: uri)

@ -1,15 +0,0 @@
# frozen_string_literal: true
class REST::AccountFeaturedTagSerializer < ActiveModel::Serializer
include RoutingHelper
attributes :id, :name, :url
def id
object.tag.id.to_s
end
def url
short_account_tag_url(object.account, object.tag)
end
end

@ -1,9 +1,15 @@
# frozen_string_literal: true
class REST::FeaturedTagSerializer < ActiveModel::Serializer
attributes :id, :name, :statuses_count, :last_status_at
include RoutingHelper
attributes :id, :name, :url, :statuses_count, :last_status_at
def id
object.id.to_s
end
def url
short_account_tag_url(object.account, object.tag)
end
end

@ -32,7 +32,7 @@ class BatchedRemoveStatusService < BaseService
# Since we skipped all callbacks, we also need to manually
# deindex the statuses
Chewy.strategy.current.update(StatusesIndex, statuses_and_reblogs) if Chewy.enabled?
Chewy.strategy.current.update(StatusesIndex::Status, statuses_and_reblogs) if Chewy.enabled?
return if options[:skip_side_effects]

@ -142,6 +142,7 @@ class DeleteAccountService < BaseService
purge_user!
purge_profile!
purge_statuses!
purge_mentions!
purge_media_attachments!
purge_polls!
purge_generated_notifications!
@ -159,6 +160,10 @@ class DeleteAccountService < BaseService
end
end
def purge_mentions!
@account.mentions.reorder(nil).where.not(status_id: reported_status_ids).in_batches.delete_all
end
def purge_media_attachments!
@account.media_attachments.reorder(nil).find_each do |media_attachment|
next if keep_account_record? && reported_status_ids.include?(media_attachment.status_id)
@ -182,7 +187,7 @@ class DeleteAccountService < BaseService
@account.favourites.in_batches do |favourites|
ids = favourites.pluck(:status_id)
StatusStat.where(status_id: ids).update_all('favourites_count = GREATEST(0, favourites_count - 1)')
Chewy.strategy.current.update(StatusesIndex, ids) if Chewy.enabled?
Chewy.strategy.current.update(StatusesIndex::Status, ids) if Chewy.enabled?
# Rails.cache.delete_multi would be better, but we don't have it yet
ids.each { |id| Rails.cache.delete("statuses/#{id}") }
favourites.delete_all
@ -191,7 +196,7 @@ class DeleteAccountService < BaseService
def purge_bookmarks!
@account.bookmarks.in_batches do |bookmarks|
Chewy.strategy.current.update(StatusesIndex, bookmarks.pluck(:status_id)) if Chewy.enabled?
Chewy.strategy.current.update(StatusesIndex::Status, bookmarks.pluck(:status_id)) if Chewy.enabled?
bookmarks.delete_all
end
end

@ -11,11 +11,12 @@ class FollowService < BaseService
# @option [Boolean] :reblogs Whether or not to show reblogs, defaults to true
# @option [Boolean] :notify Whether to create notifications about new posts, defaults to false
# @option [Boolean] :bypass_locked
# @option [Boolean] :bypass_limit Allow following past the total follow number
# @option [Boolean] :with_rate_limit
def call(source_account, target_account, options = {})
@source_account = source_account
@target_account = ResolveAccountService.new.call(target_account, skip_webfinger: true)
@options = { bypass_locked: false, with_rate_limit: false }.merge(options)
@options = { bypass_locked: false, bypass_limit: false, with_rate_limit: false }.merge(options)
raise ActiveRecord::RecordNotFound if following_not_possible?
raise Mastodon::NotPermittedError if following_not_allowed?
@ -54,7 +55,7 @@ class FollowService < BaseService
end
def request_follow!
follow_request = @source_account.request_follow!(@target_account, reblogs: @options[:reblogs], notify: @options[:notify], rate_limit: @options[:with_rate_limit])
follow_request = @source_account.request_follow!(@target_account, reblogs: @options[:reblogs], notify: @options[:notify], rate_limit: @options[:with_rate_limit], bypass_limit: @options[:bypass_limit])
if @target_account.local?
LocalNotificationWorker.perform_async(@target_account.id, follow_request.id, follow_request.class.name, :follow_request)
@ -66,7 +67,7 @@ class FollowService < BaseService
end
def direct_follow!
follow = @source_account.follow!(@target_account, reblogs: @options[:reblogs], notify: @options[:notify], rate_limit: @options[:with_rate_limit])
follow = @source_account.follow!(@target_account, reblogs: @options[:reblogs], notify: @options[:notify], rate_limit: @options[:with_rate_limit], bypass_limit: @options[:bypass_limit])
LocalNotificationWorker.perform_async(@target_account.id, follow.id, follow.class.name, :follow)
MergeWorker.perform_async(@target_account.id, @source_account.id)

@ -65,10 +65,16 @@ class SuspendAccountService < BaseService
attachment = media_attachment.public_send(attachment_name)
styles = [:original] | attachment.styles.keys
next if attachment.blank?
styles.each do |style|
case Paperclip::Attachment.default_options[:storage]
when :s3
attachment.s3_object(style).acl.put(acl: 'private')
begin
attachment.s3_object(style).acl.put(acl: 'private')
rescue Aws::S3::Errors::NoSuchKey
Rails.logger.warn "Tried to change acl on non-existent key #{attachment.s3_object(style).key}"
end
when :fog
# Not supported
when :filesystem

@ -56,10 +56,16 @@ class UnsuspendAccountService < BaseService
attachment = media_attachment.public_send(attachment_name)
styles = [:original] | attachment.styles.keys
next if attachment.blank?
styles.each do |style|
case Paperclip::Attachment.default_options[:storage]
when :s3
attachment.s3_object(style).acl.put(acl: Paperclip::Attachment.default_options[:s3_permissions])
begin
attachment.s3_object(style).acl.put(acl: Paperclip::Attachment.default_options[:s3_permissions])
rescue Aws::S3::Errors::NoSuchKey
Rails.logger.warn "Tried to change acl on non-existent key #{attachment.s3_object(style).key}"
end
when :fog
# Not supported
when :filesystem

@ -14,7 +14,7 @@
- unless status.proper.media_attachments.empty?
- if status.proper.media_attachments.first.video?
- video = status.proper.media_attachments.first
= react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: status.proper.sensitive?, visible: false, width: 610, height: 343, inline: true, alt: video.description
= 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: status.proper.sensitive?, visible: false, width: 610, height: 343, inline: true, alt: video.description, media: [ActiveModelSerializers::SerializableResource.new(video, serializer: REST::MediaAttachmentSerializer)].as_json
- elsif status.proper.media_attachments.first.audio?
- audio = status.proper.media_attachments.first
= react_component :audio, src: audio.file.url(:original), height: 110, alt: audio.description, duration: audio.file.meta.dig(:original, :duration)

@ -10,7 +10,7 @@
= render partial: 'layouts/theme', object: @theme
- if @media_attachment.video?
= react_component :video, src: @media_attachment.file.url(:original), preview: @media_attachment.thumbnail.present? ? @media_attachment.thumbnail.url : @media_attachment.file.url(:small), blurhash: @media_attachment.blurhash, width: 670, height: 380, editable: true, detailed: true, inline: true, alt: @media_attachment.description do
= react_component :video, src: @media_attachment.file.url(:original), preview: @media_attachment.thumbnail.present? ? @media_attachment.thumbnail.url : @media_attachment.file.url(:small), frameRate: @media_attachment.file.meta.dig('original', 'frame_rate'), blurhash: @media_attachment.blurhash, width: 670, height: 380, editable: true, detailed: true, inline: true, alt: @media_attachment.description, media: [ActiveModelSerializers::SerializableResource.new(@media_attachment, serializer: REST::MediaAttachmentSerializer)].as_json do
%video{ controls: 'controls' }
%source{ src: @media_attachment.file.url(:original) }
- elsif @media_attachment.gifv?

@ -29,7 +29,7 @@
- if !status.media_attachments.empty?
- if status.media_attachments.first.video?
- video = status.media_attachments.first
= react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), blurhash: video.blurhash, sensitive: sensitized?(status, current_account), width: 670, height: 380, detailed: true, inline: true, alt: video.description do
= react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), frameRate: video.file.meta.dig('original', 'frame_rate'), blurhash: video.blurhash, sensitive: sensitized?(status, current_account), width: 670, height: 380, detailed: true, inline: true, alt: video.description, media: [ActiveModelSerializers::SerializableResource.new(video, serializer: REST::MediaAttachmentSerializer)].as_json do
= render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
- elsif status.media_attachments.first.audio?
- audio = status.media_attachments.first

@ -38,7 +38,7 @@
- if !status.media_attachments.empty?
- if status.media_attachments.first.video?
- video = status.media_attachments.first
= react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), blurhash: video.blurhash, sensitive: sensitized?(status, current_account), width: 610, height: 343, inline: true, alt: video.description do
= react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), frameRate: video.file.meta.dig('original', 'frame_rate'), blurhash: video.blurhash, sensitive: sensitized?(status, current_account), width: 610, height: 343, inline: true, alt: video.description, media: [ActiveModelSerializers::SerializableResource.new(video, serializer: REST::MediaAttachmentSerializer)].as_json do
= render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
- elsif status.media_attachments.first.audio?
- audio = status.media_attachments.first

@ -7,7 +7,7 @@ class AuthorizeFollowWorker
source_account = Account.find(source_account_id)
target_account = Account.find(target_account_id)
AuthorizeFollowService.new.call(source_account, target_account)
AuthorizeFollowService.new.call(source_account, target_account, bypass_limit: true)
rescue ActiveRecord::RecordNotFound
true
end

@ -15,7 +15,11 @@ class Import::RelationshipWorker
case relationship
when 'follow'
FollowService.new.call(from_account, target_account, options)
begin
FollowService.new.call(from_account, target_account, options)
rescue ActiveRecord::RecordInvalid
raise if FollowLimitValidator.limit_for_account(from_account) < from_account.following_count
end
when 'unfollow'
UnfollowService.new.call(from_account, target_account)
when 'block'

@ -19,7 +19,7 @@ class RefollowWorker
# Schedule re-follow
begin
FollowService.new.call(follower, target_account, reblogs: reblogs, notify: notify)
FollowService.new.call(follower, target_account, reblogs: reblogs, notify: notify, bypass_limit: true)
rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, HTTP::Error, OpenSSL::SSL::SSLError
next
end

@ -14,7 +14,7 @@ class UnfollowFollowWorker
reblogs = follow&.show_reblogs?
notify = follow&.notify?
FollowService.new.call(follower_account, new_target_account, reblogs: reblogs, notify: notify, bypass_locked: bypass_locked)
FollowService.new.call(follower_account, new_target_account, reblogs: reblogs, notify: notify, bypass_locked: bypass_locked, bypass_limit: true)
UnfollowService.new.call(follower_account, old_target_account, skip_unmerge: true)
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
true

@ -60,6 +60,23 @@ hy:
title: 2FA վերականգնման կոդերը փոփոխուել են
unlock_instructions:
subject: Մաստոդոն․ Ապակողպելու նկարագրութիւնները
webauthn_credential:
added:
explanation: Հետեւեալ անվտանգութեան բանալին է աւելացուել հաշուիդ
subject: Մաստոդոն․ Նոր անվտանգութեան բանալի
title: Նոր անվտանգութեան բանալի է աւելացուել
deleted:
explanation: Հետեւեալ անվտանգութեան բանալին քո հաշուից ջնջուել է
subject: Մաստոդոն․ Անվտանգութեան բանալին ջնջուել է
title: Անվտանգութեան բանալիներիցդ մեկը ջնջուել է
webauthn_disabled:
explanation: Անվտանգութեան բանալիներով նոյնականացումը քո հաշուից կասեցուել է։ Մուտք գործելն այժմ հնարաւոր է՝ օգտագործելով միայն զուգաւորուած TOTP յաւելուածից գեներացուած կտրօնը։
subject: Մաստոդոն․ Նոյնականացումն անվտանգութեան բանալիներով կասեցուած է
title: Անվտանգութեան բանալիները կասեցուել են
webauthn_enabled:
explanation: Անվտանգութեան բանալիով նոյնականացումը քո հաշուի համար միացուած է։ Քո անվտանգութեան բանալին այժմ կարող է օգտագործուել մուտք գործելու համար։
subject: Մաստոդոն․ Անվտանգութեան բանալիով նոյնականացումը միացուած է
title: Անվտանգութեան բանալիները միացուել են
omniauth_callbacks:
failure: Նոյնականացնել հնարաւոր չեղաւ %{kind}ից քանի որ %{reason}։
success: Յաջողութեամբ նոյնականացուեց %{kind} հաշուից։

@ -45,6 +45,7 @@ hy:
silenced_title: Լռեցուած սպասարկիչներ
suspended: Ոչ մի տուեալ այս սպասարկիչներից չի գործարկուում, պահուում կամ փոխանակուում, կատարել որեւէ գործողութիւն կամ հաղորդակցութիւն այս սպասարկիչի օգտատէրերի հետ անհնար է․
suspended_title: Կասեցուած սպասարկիչներ
unavailable_content_html: Մաստոդոնն ընդհանրապէս թոյլատրում է տեսնել բովանդակութիւնը եւ շփուել այլ դաշնեզերքի այլ հանգոյցների հետ։ Սրանք բացառութիւններն են, որոնք կիրառուել են հէնց այս հանգոյցի համար։
user_count_after:
one: օգտատեր
other: օգտատերեր
@ -52,11 +53,14 @@ hy:
what_is_mastodon: Ի՞նչ է Մաստոդոնը
accounts:
choices_html: "%{name}-ի ընտրանի՝"
endorsements_hint: Վէբ ինտերֆէյսից կարող ես ցուցադրել մարդկանց, որոնց հետեւում ես, եւ նրանք կը ցուցադրուեն այստեղ։
featured_tags_hint: Դու կարող ես ցուցադրել յատուկ պիտակներ, որոնք կը ցուցադրուեն այստեղ։
follow: Հետևել
followers:
one: Հետևորդ
other: Հետևորդներ
following: Հետևում եք
instance_actor_flash: Այս հաշիւը վիրտուալ դերասան է, որը ներկայացնում է հանգոյցը, եւ ոչ որեւէ անհատ օգտատիրոջ։ Այն օգտագործուում է ֆեդերացիայի նպատակներով եւ չպէտք է կասեցուի։
joined: Միացել են %{date}
last_active: վերջին թութը
link_verified_on: Սոյն յղման տիրապետումը ստուգուած է՝ %{date}֊ին
@ -67,6 +71,8 @@ hy:
nothing_here: Այստեղ բան չկայ
people_followed_by: Մարդիկ, որոնց %{name}ը հետեւում է
people_who_follow: Մարդիկ, որոնք հետեւում են %{name}ին
pin_errors:
following: Դու պէտք է հետեւես մարդուն, որին ցանկանում ես խրախուսել
posts:
one: Թութ
other: Թութերից
@ -83,6 +89,7 @@ hy:
admin:
account_actions:
action: Կատարել գործողութիւն
title: Իրականացնել մոդերատորական գործողութիւններ %{acct}-ի վրայ
account_moderation_notes:
create: Թողնել նշում
created_msg: Մոդերացիոն նոթը բարեյաջող ստեղծուեց
@ -92,6 +99,7 @@ hy:
add_email_domain_block: Արգելափակել էլ․ փոստի տիրոյթը
approve: Ընդունել
approve_all: Ընդունել բոլորը
approved_msg: Յաջողութեամբ հաստատուեց %{username}֊ի գրանցման յայտը
are_you_sure: Վստա՞հ ես
avatar: Աւատար
by_domain: Դոմէն
@ -108,6 +116,7 @@ hy:
delete: Ջնջել տվյալները
deleted: Ջնջված է
demote: Աստիճանազրկել
destroyed_msg: "%{username}֊ի տուեալները հերթագրուել է անյապաղ ջնջուողների շարքում"
disable: Անջատել
disable_two_factor_authentication: Անջատել 2FA
disabled: Անջատված է
@ -118,10 +127,12 @@ hy:
email_status: Էլ․ փոստի կարգավիճակ
enable: Միացնել
enabled: Միացված է
enabled_msg: "%{username}֊ի հաշիւը բարեյաջող ապասառեցուեց"
followers: Հետևորդներ
follows: Հետևողներ
header: Վերնագիր
inbox_url: Մուտքային URL
invite_request_text: Միանալու պատճառները
invited_by: Հրաւիրուել է
ip: IP
joined: Միացած է
@ -133,6 +144,8 @@ hy:
login_status: Մուտքի կարգավիճակ
media_attachments: Մեդիա կցորդներ
memorialize: Դարձնել հիշատակարան
memorialized: Յիշեցուած
memorialized_msg: Բարեյաջող %{username}֊ը փոխուեց յիշատակի հաշուի
moderation:
active: Ակտիվ
all: Բոլորը
@ -143,6 +156,7 @@ hy:
moderation_notes: Մոդերացիայի նշումներ
most_recent_activity: Վերջին ակտիւութիւնը
most_recent_ip: Վերջին IP
no_account_selected: Ոչ մի հաշիւ չի փոխուել, ինչպէս նաեւ, ոչ մեկը չի ընտրուել
no_limits_imposed: Սահմանափակումներ չկան
not_subscribed: Բաժանորդագրուած չէ
pending: Սպասում է վերանայման
@ -150,11 +164,16 @@ hy:
promote: Աջակցել
protocol: Հաղորդակարգ
public: Հրապարակային
push_subscription_expires: PuSH բաժանորդագրութիւնը սպառուում է
redownload: Թարմացնել հաշիւը
redownloaded_msg: "%{username}֊ի հաշիւը սկզբնաղբիւրից բարեյաջող թարմացուեց"
reject: Մերժել
reject_all: Մերժել բոլորը
rejected_msg: Յաջողութեամբ մերժուեց %{username}֊ի գրանցման յայտը
remove_avatar: Հեռացնել աւատարը
remove_header: Հեռացնել գլխագիրը
removed_avatar_msg: Յաջողութեամբ հեռացուեց %{username}֊ի աւատարը
removed_header_msg: Յաջողութեամբ հեռացուեց %{username}֊ի գլխանկարը
resend_confirmation:
already_confirmed: Օգտատէրն արդէն հաստատուած է
send: Հաստատման իմակն ուղարկել կրկին
@ -172,6 +191,8 @@ hy:
search_same_email_domain: Այլ օգտատէրեր նոյն էլ․ փոստի դոմէյնով
search_same_ip: Այլ օգտատէրեր նոյն IP֊ով
sensitive: Զգայուն
sensitized: նշուեց որպէս դիւրազգաց
shared_inbox_url: Ընդհանուր մուտքային URL
show:
created_reports: Կազմել բողոքներ
targeted_reports: Այլոց կողմից բողոքարկուած
@ -180,15 +201,22 @@ hy:
statuses: Գրառումներ
subscribe: Բաժանորդագրուել
suspended: Կասեցուած
suspension_irreversible: Հաշուի տուեալները անդարձ ջնջուեցին։ Դու կարող ես ապակասեցնել հաշիւը՝ դարձնելով այն կիրառելի, բայց այն չի վերականգնի նախկին տուեալները։
suspension_reversible_hint_html: Հաշիւը կասեցուեց, եւ տուեալներն ամբողջապէս կը վերացուի %{date}ին։ Մինչեւ այդ, հաշիւը կարող է վերականգնուել՝ առանց կողմնակի ազդեցութիւնների։ Եթէ ցանկանում ես վերացնել հաշուի տուեալները միանգամից, կարող ես դա անել ներքեւում։
time_in_queue: Հերթում է %{time}
title: Հաշիւներ
unconfirmed_email: Չհաստատուած էլ․ հասցէ
undo_sensitized: Ետարկել դիւրազգացութիւնը
undo_silenced: Ետարկել լռեցումը
undo_suspension: Ետարկել կասեցումը
unsilenced_msg: "%{username}֊ի հաշիւը բարեյաջող դարձաւ անսահմանափակ"
unsubscribe: Ապաբաժանորդագրուել
unsuspended_msg: "%{username}֊ի հաշիւ բարեյաջող ապակասեցուեց։"
username: Մուտքանուն
view_domain: Տեսնել տիրոյթի ամփոփումը
warn: Նախազգուշացում
web: Վեբ
whitelisted: Թոյլատրել ֆեդերացիայի համար
action_logs:
action_types:
assigned_to_self_report: Բողոքել
@ -197,9 +225,13 @@ hy:
create_account_warning: Ստեղծել զգուշացում
create_announcement: Ստեղծել յայտարարութիւն
create_custom_emoji: Ստեղծել սեփական էմոջիները
create_domain_allow: Ստեղծել տիրոյթի թոյլտուութիւն
create_domain_block: Ստեղծել տիրոյթի արգելափակում
create_email_domain_block: Ստեղծել էլ․ հասցէի դոմէյնի արգելափակում
create_ip_block: Ստեղծել IP կանոն
demote_user: Աստիճանազրկել օգտատիրոջը
destroy_announcement: Ջնջել յայտարարութիւնը
destroy_custom_emoji: Ջնջել էմոջին
destroy_domain_allow: Ջնջել դոմէնի թոյլտուութիւնը
destroy_domain_block: Ապաարգելափակել դոմէնը
destroy_email_domain_block: Ապաարգելափակել էլ․ հասցէի դոմէնը
@ -216,13 +248,16 @@ hy:
reopen_report: Վերաբացել բողոքը
reset_password_user: Վերականգնել գաղտանաբառը
resolve_report: Լուծարել զեկոյցը
sensitive_account: Հաշուի մեդիան նշել որպէս դիւրազգաց
silence_account: Լռեցնել հաշիւը
suspend_account: Կասեցնել հաշիւը
unassigned_report: Հանել բողոքը
unsensitive_account: Հաշուի մեդիան չնշել որպէս դիւրազգաց
unsilence_account: Լսել հաշուին
unsuspend_account: Ապակասեցնել հաշիւը
update_announcement: Թարմացնել յայտարարութիւնը
update_custom_emoji: Թարմացնել սեփական էմոջիները
update_domain_block: Թարմացնել տիրոյթի արգելափակումը
update_status: Թարմացնել գրառումը
actions:
assigned_to_self_report: "%{name} բողոքել է %{target} իրենց համար"
@ -230,13 +265,23 @@ hy:
confirm_user: "%{name} հաստատել է %{target} օգտատիրոջ էլ․ հասցէն"
create_account_warning: "%{name} զգուշացրել է %{target}ին"
create_announcement: "%{name} ստեղծեց նոր յայտարարութիւն %{target}"
create_custom_emoji: "%{name} վերբեռնել է նոր էմոջի՝ %{target}"
create_domain_allow: "%{name} թոյլատրել ֆեդերացիան %{target} տիրոյթի հետ"
create_domain_block: "%{name} արգելափակեց %{target} տիրոյթը"
create_email_domain_block: "%{name} արգելափակեց էլ․ փոստի տիրոյթ %{target}"
create_ip_block: "%{name} ստեղծեց կանոն %{target} IP֊ի համար"
demote_user: "%{name} աստիճանազրկեց օգտատիրոջ %{target}"
destroy_announcement: "%{name} ջնջեց յայտարարութիւն %{target}"
destroy_custom_emoji: "%{name} ջնջել է %{target} էմոջին"
destroy_domain_allow: "%{name} չթոյլատրեց ֆեդերացիան %{target} տիրոյթի հետ"
destroy_domain_block: "%{name} ապաարգելափակեց տիրոյթ %{target}"
destroy_email_domain_block: "%{name} ապաարգելափակեց էլ․ փոստի տիրոյթ %{target}"
destroy_ip_block: "%{name} ջնջեց կանոնը %{target} IP֊ի համար"
destroy_status: "%{name} ջնջեց %{target}ի գրառում"
disable_2fa_user: "%{name}ը կասեցրեց 2F պահանջը %{target} օգտատիրոջ համար"
disable_custom_emoji: "%{name} ապակտիւացրել է %{target} էմոջին"
disable_user: "%{name} անջատել է մուտքը %{target} օգտատիրոջ համար"
enable_custom_emoji: "%{name} ակտիվացրել է %{target} էմոջին"
enable_user: "%{name} թոյլատրեց մուտք %{target} օգտատիրոջ համար"
memorialize_account: "%{name} դարձրեց %{target}ի հաշիւը յիշատակի էջ"
promote_user: "%{name} աջակցեց օգտատիրոջը %{target}"
@ -244,9 +289,17 @@ hy:
reopen_report: "%{name} վերաբացեց բողոք %{target}"
reset_password_user: "%{name} վերականգնեց օգտատիրոջ գաղտնաբառը %{target}"
resolve_report: "%{name} լուծարեց բողոքը %{target}"
sensitive_account: "%{name}ը նշեց %{target}ի մեդիան որպէս զգայուն"
silence_account: "%{name} լռեցրեց %{target}ի հաշիւը"
suspend_account: "%{name} լռեցրեց %{target}ի հաշիւը"
unassigned_report: "%{name} չսահմանուած բողոք %{target}"
unsensitive_account: "%{name}ը հեռացրեց %{target}֊ի մեդիայի զգայուն նշումը"
unsilence_account: "%{name}֊ը հանեց լռեցումը %{target}֊ի հաշուից"
unsuspend_account: "%{name}ը ապակասեցրեց %{target}ի հաշիւը"
update_announcement: "%{name}ը թարմացրեց %{target}ի յայտարարութիւնը"
update_custom_emoji: "%{name} թարմացրել է %{target} էմոջին"
update_domain_block: "%{name}ը թարմացրեց %{target}ի տիրոյթի արգելափակումը"
update_status: "%{name}ը թարմացրեց %{target}ի կարգավիճակը"
deleted_status: "(ջնջուած գրառում)"
empty: Ոչ մի գրառում չկայ։
filter_by_action: Զտել ըստ գործողութեան
@ -270,35 +323,48 @@ hy:
custom_emojis:
assign_category: Կցել կատեգորիա
by_domain: Տիրոյթ
copied_msg: Էմոջիի տեղական օրինակը հաջողութեամբ ստեղծուած է
copy: Պատճենել
copy_failed_msg: Չյաջողւեց ստեղծել էմոջիի տեղական օրինակ
create_new_category: Ստեղծել նոր կատեգորիա
created_msg: Էմոջին յաջողութեամբ ստեղծուեց
delete: Ջնջել
destroyed_msg: Էմոջին յաջողութեամբ ջնջուեց
disable: Անջատել
disabled: Անջատուած
disabled_msg: Յաջողութեամբ կասեցուեց էմոջին
emoji: Զմայլիկ
enable: Միացնել
enabled: Միացուած
enabled_msg: Յաջողութեամբ միացուեց էմոջին
image_hint: PNG մինչեւ 50KB
list: Ցանկ
listed: Ցուցակագրուած
new:
title: Աւելացնել նոր էմոջի
not_permitted: Տուեալ գործողութիւնն անելու թոյլտուութիւն չունես
overwrite: Վերագրել
shortcode: Հապավում
shortcode_hint: Ամենաքիչը 2 նիշ, միայն այբբենական նիշեր, թուեր եւ ընդգծիկներ
title: Սեփական էմօջիներ
uncategorized: Չդասակարգուած
unlist: Ապացուցակագրում
unlisted: Ծածուկ
update_failed_msg: Էմոջին չի կարող թարմացուել
updated_msg: Էմոջին թարմացուեց
upload: Վերբեռնել
dashboard:
authorized_fetch_mode: Անվտանգ եղանակ
config: Կարգաւորում
feature_deletions: Հաշուի հեռացումներ
feature_invites: Հրաւէրի յղումներ
feature_profile_directory: Օգտատիրոջ մատեան
feature_registrations: Գրանցումներ
feature_relay: Ֆեդերացիայի շերտ
feature_spam_check: Հակա-սպամ
feature_timeline_preview: Հոսքի նախադիտում
features: Յատկանիշներ
hidden_service: Ֆեդերացիա թաքնուած ծառայութիւնների հետ
open_reports: բաց բողոքներ
pending_tags: պիտակներն սպասում են վերանայման
pending_users: օգտատէրերն սպասում են վերանայման
@ -316,7 +382,12 @@ hy:
whitelist_mode: Սահմանափակ ֆեդերացիայի ռեժիմ
domain_allows:
add_new: Թոյլատրել ֆեդերացիա տիրոյթի հետ
created_msg: Տիրոյթը յաջողութեամբ թոյլատրուեց ֆեդերացուելու
undo: Չթոյլատրել ֆեդերացիան տիրոյթի հետ
domain_blocks:
add_new: Աւելացնել նոր տիրոյթի արգելափակում
created_msg: Տիրոյթի արգելափակումն ընթացաւ
destroyed_msg: Տիրոյթի արգելափակումը ետարկուեց
domain: Տիրոյթ
edit: Խմբագրել տիրոյթի արգելափակումը
new:
@ -336,6 +407,7 @@ hy:
silence: լռեցուած
suspend: կասեցուած
show:
title: Ետարկել տիրոյթի արգելափակումը %{domain}ի համար
undo: Ետարկել
undo: Ետարկել տիրոյթի արգելափակումը
view: Տեսնել տիրոյթի արգելափակումը
@ -379,6 +451,7 @@ hy:
title: Հրաւէրներ
ip_blocks:
add_new: Ստեղծել կանոն
created_msg: Բարեյաջող աւելացուեց նոր IP կանոն
delete: Ջնջել
expires_in:
'1209600': 2 շաբաթ
@ -409,6 +482,9 @@ hy:
notes:
one: "%{count} նոթ"
other: "%{count} նոթեր"
reports:
one: "%{count} զեկոյց"
other: "%{count} զեկոյց"
action_taken_by: Գործողութիւնը կատարել է
are_you_sure: Վստա՞հ ես
assign_to_self: Ինձ յանձնարարուած
@ -441,6 +517,8 @@ hy:
all: Բոլորին
disabled: Ոչ մէկին
title: Ցուցադրել տիրոյթը արգելափակումները
hero:
title: Հերոսի պատկեր
profile_directory:
desc_html: Թոյլատրել օգտատէրերին բացայայտուել
title: Միացնել հաշուի մատեանը
@ -513,6 +591,7 @@ hy:
advanced_web_interface: Սյունակավոր ինտերֆեյս
advanced_web_interface_hint: Եթէ ցանկանում ես օգտագործել էկրանիդ ամբողջ լայնքը, ապա ընդլայնուած վեբ ինտերֆեյսով հնարաւոր է էկրանը բաժանել սիւնակների՝ զուգահեռ տեսնելու տարբեր տիպի ինֆորմացիա՝ տեղական հոսքը, ծանուցումները, ֆեդերացված հոսքը, և ցանկացած թվի ցուցակ ու հեշթեգ։
animations_and_accessibility: Անիմացիաներ եւ հասանելիութիւն
confirmation_dialogs: Հաստատման պատուհաններ
discovery: Բացայայտում
localization:
body: Մաստոդոնը թարգմանուում է կամաւորների կողմից։
@ -533,6 +612,8 @@ hy:
checkbox_agreement_html: Ես համաձայն եմ <a href="%{rules_path}" target="_blank">սպասարկչի կայանքներին</a> և <a href="%{terms_path}" target="_blank">ծառայությունների պայմաններին</a>
checkbox_agreement_without_rules_html: Ես համաձայն եմ <a href="%{terms_path}" target="_blank">ծառայությունների պայմաններին</a>
delete_account: Ջնջել հաշիվը
description:
prefix_sign_up: Գրանցուի՛ր Մաստոդոնում հենց այսօր
forgot_password: Մոռացե՞լ ես գաղտնաբառդ
login: Մտնել
logout: Դուրս գալ
@ -664,6 +745,8 @@ hy:
status: Հաստատման կարգավիճակ
view_proof: Նայել ապացոյցը
imports:
errors:
over_rows_processing_limit: տողերի քանակը աւելին է քան %{count}-ը
modes:
merge: Միաւորել
overwrite: Վերագրել
@ -786,6 +869,7 @@ hy:
safari: Safari
uc_browser: UCBrowser
weibo: Weibo
description: "%{browser}, %{platform}"
ip: IP
platforms:
adobe_air: Adobe Air
@ -830,6 +914,9 @@ hy:
image:
one: "%{count} նկար"
other: "%{count} նկար"
video:
one: "%{count} վիդեո"
other: "%{count} վիդեո"
language_detection: Ինքնուրոյն ճանաչել լեզուն
open_in_web: Բացել վէբում
over_character_limit: "%{max} նիշի սահմանը գերազանցուած է"
@ -976,6 +1063,7 @@ hy:
welcome:
edit_profile_action: Կարգաւորել հաշիւը
final_action: Սկսել թթել
final_step: 'Սկսիր թթե՛լ։ Անգամ առանց հետեւորդների քո հանրային գրառումներ կարող են երևալ ուրիշների մօտ, օրինակ՝ տեղական հոսում կամ հեշթեգերում։ Թէ ցանկանաս, կարող ես յայտնել քո մասին օգտագործելով #եսնորեկեմ հեշթեգը։'
review_preferences_action: Փոփոխել կարգաւորումները
subject: Բարի գալուստ Մաստոդոն
tip_federated_timeline: Դաշնային հոսքում երևում է ամբողջ Մաստոդոնի ցանցը։ Բայց այն ներառում է միայն այն օգտատերերին որոնց բաժանորդագրուած են ձեր հարևաններ, այդ պատճառով այն կարող է լինել ոչ ամբողջական։
@ -994,4 +1082,5 @@ hy:
verification: Ստուգում
webauthn_credentials:
delete: Ջնջել
not_enabled: WebAuthn-ը դեռ միացուած չէ
registered_on: Գրանցուել է %{date}

@ -128,7 +128,7 @@ ja:
follows: フォロー数
header: ヘッダー
inbox_url: Inbox URL
invite_request_text: 登録理由
invite_request_text: 意気込み
invited_by: 招待した人
ip: IP
joined: 登録日
@ -398,6 +398,8 @@ ja:
silence: サイレンス
suspend: 停止
title: 新規ドメインブロック
obfuscate: ドメイン名を伏せ字にする
obfuscate_hint: ドメインブロックのリストを公開している場合、ドメイン名の一部を伏せ字にします
private_comment: コメント (非公開)
private_comment_hint: このコメントは同じサーバーのモデレーターも閲覧できます。
public_comment: コメント (公開)
@ -556,6 +558,7 @@ ja:
domain_blocks_rationale:
title: コメントを表示
enable_bootstrap_timeline_accounts:
desc_html: 新規ユーザーが設定したアカウントを自動的にフォローして、ホームフィードが空にならないようにする
title: 新規ユーザーの自動フォローを有効にする
hero:
desc_html: フロントページに表示されます。サイズは600x100px以上推奨です。未設定の場合、標準のサムネイルが使用されます
@ -582,6 +585,9 @@ ja:
min_invite_role:
disabled: 誰にも許可しない
title: 招待の作成を許可
require_invite_text:
desc_html: アカウント登録が承認制の場合、「意気込みをお聞かせください」のテキストを必須入力にする
title: 新規ユーザー登録時の理由を必須入力にする
registrations_mode:
modes:
approved: 登録には承認が必要
@ -909,6 +915,8 @@ ja:
status: 認証状態
view_proof: 証明を表示
imports:
errors:
over_rows_processing_limit: "%{count} 行以上"
modes:
merge: 統合
merge_long: 現在のレコードを保持したまま新しいものを追加します

@ -172,7 +172,7 @@ ko:
removed_header_msg: 성공적으로 %{username}의 헤더 이미지를 삭제하였습니다
resend_confirmation:
already_confirmed: 이 사용자는 이미 확인되었습니다
send: 다시 확인 메일
send: 확인 메일 다시 보내기
success: 확인 이메일이 전송되었습니다!
reset: 초기화
reset_password: 암호 초기화
@ -917,6 +917,8 @@ ko:
status: 인증 상태
view_proof: 증명 보기
imports:
errors:
over_rows_processing_limit: "%{count}개 이상의 열을 포함합니다"
modes:
merge: 병합
merge_long: 기존 것을 그대로 둔 채 새로 추가

@ -47,6 +47,7 @@ oc:
what_is_mastodon: Qu’es Mastodon?
accounts:
choices_html: 'Recomandacions de %{name} :'
endorsements_hint: Podètz recomandar personas que seguètz a partir de l’interfàcia web, apreissaràn aquí.
featured_tags_hint: Podètz indicar d’etiquetas que mostrarem aquí.
follow: Sègre
followers:
@ -710,8 +711,8 @@ oc:
prompt: Confirmatz lo senhal per dire de contunhar
date:
formats:
default: "%e %B de %Y"
with_month_name: "%e %B de %Y"
default: "%-d %B de %Y"
with_month_name: "%-d %B de %Y"
datetime:
distance_in_words:
about_x_hours: "%{count} h"
@ -986,13 +987,13 @@ oc:
activity: Activitat del compte
dormant: Inactiu
followers: Seguidors
following: Aboanements
following: Abonaments
invited: Convidat
last_active: Darrièra activitat
most_recent: Mai recenta
moved: Mudat
mutual: Mutuala
primary: Pirmària
primary: Primària
relationship: Relacion
remove_selected_domains: Levar totes los seguidors dels domenis seleccionats
remove_selected_followers: Levar los seguidors seleccionats
@ -1225,7 +1226,7 @@ oc:
mastodon-light: Mastodon (Clar)
time:
formats:
default: Lo %e %B de %Y a %Ho%M
default: Lo %-d %B de %Y a %Ho%M
month: "%B de %Y"
two_factor_authentication:
add: Ajustar

@ -66,10 +66,16 @@ hy:
invite_request:
text: Սա կօգնի մեզ ստուգել քո յաւելուածը
ip_block:
comment: Պայմանական․ Յիշիր ինչու ես աւելացրել այս կանոնը։
expires_in: IP հասցէները սահմանափակ են, դրանք երբեմն օգտագործուում են ընդհանուր կամ անցնում ձեռքից ձեռք։ Այդ պատճառով խորհուրդ չի տրւում IP-ների անժամկետ արգելափակումը։
ip: Ներմուծէք IPv4 կամ IPv6 հասցէն։ Նաև կարող ես արգելափակել հասցէների միջակայքեր օգտագործելով CIDR սինտաքսը։ Զգոյշ եղիր՝ ինքդ քեզ չարգելափակես։
severities:
no_access: Արգելափակիր հասանելիութիւնը բոլոր պաշարներին։
sign_up_requires_approval: Նոր գրանցումները կը պահանջեն քո հաստատումը
severity: Ընտրիր, թէ ինչ կարող է պատահել այս IP֊ից եկող յայտերի հետ
sessions:
otp: Մուտքագրիր երկքայլ նոյնականացման կոդը, որը գեներացուես ես քո բջջային յաւելուածի օգնութեամբ կամ օգտագործիր այս կոդերից կէկը՝
webauthn: Եթէ սա USB է՝ վստահ եղիր տեղադրել այն եւ եթէ անհրաժեշտ է՝ թափահարել։
tag:
name: Կարող ես միայն փոխել տառերի ձեւը, օրինակ, այն աւելի ընթեռնելի դարձնելու համար
user:
@ -140,6 +146,7 @@ hy:
setting_default_privacy: Հրապարակման գաղտնիութիւն
setting_default_sensitive: Միշտ նշել մեդիան որպէս դիւրազգաց
setting_delete_modal: Ցուցադրել հաստատման պատուհանը ջնջելուց առաջ
setting_disable_swiping: Կասեցնել սահող շարժումները
setting_display_media: Ցուցադրել մեդիա
setting_display_media_default: Լռելեայն
setting_display_media_hide_all: Թաքցնել բոլորը
@ -200,4 +207,7 @@ hy:
required:
mark: "*"
text: պարտադիր
title:
sessions:
webauthn: Օգտագործիր անվտանգութեան բանալիները գրանցուելու համար
'yes': Այո

@ -126,6 +126,7 @@ ja:
expires_in: 有効期限
fields: プロフィール補足情報
header: ヘッダー
honeypot: "%{label} (入力しない)"
inbox_url: リレーサーバーの inbox URL
irreversible: 隠すのではなく除外する
locale: 言語

@ -204,7 +204,7 @@ vi:
unconfirmed_email: Email chưa được xác thực
undo_sensitized: Đánh dấu bình thường
undo_silenced: Bỏ ẩn
undo_suspension: Ngừng vô hiệu hóa
undo_suspension: Bỏ vô hiệu hóa
unsilenced_msg: Bỏ ẩn %{username} thành công
unsubscribe: Hủy đăng ký
unsuspended_msg: Đã kích hoạt lại %{username} thành công
@ -215,8 +215,8 @@ vi:
whitelisted: Danh sách trắng
action_logs:
action_types:
assigned_to_self_report: Xử lý báo cáo được giao
change_email_user: Đổi email cho người dùng
assigned_to_self_report: Tự xử lý báo cáo
change_email_user: Đổi email
confirm_user: Xác nhận người dùng
create_account_warning: Gửi cảnh cáo
create_announcement: Tạo thông báo
@ -228,16 +228,16 @@ vi:
demote_user: Xóa chức vụ
destroy_announcement: Xóa thông báo
destroy_custom_emoji: Xóa Emoji
destroy_domain_allow: Gỡ máy chủ cho phép
destroy_domain_block: Gỡ máy chủ chặn
destroy_email_domain_block: Gỡ email đã chặn
destroy_domain_allow: Bỏ máy chủ cho phép
destroy_domain_block: Bỏ chặn máy chủ
destroy_email_domain_block: Bỏ chặn email
destroy_ip_block: Bỏ chặn IP
destroy_status: Xóa tút
disable_2fa_user: Vô hiệu hóa xác thực hai bước
disable_2fa_user: Xóa xác thực hai bước
disable_custom_emoji: Vô hiệu hóa Emoji
disable_user: Tạm khóa người dùng
enable_custom_emoji: Cho phép Emoji
enable_user: Mở khóa người dùng
enable_user: Mở khóa
memorialize_account: Tài khoản tưởng niệm
promote_user: Chỉ định chức vụ
remove_avatar_user: Xóa ảnh đại diện
@ -245,18 +245,18 @@ vi:
reset_password_user: Đặt lại mật khẩu
resolve_report: Xử lý báo cáo
sensitive_account: Đánh dấu nhạy cảm cho tài khoản
silence_account: Tài khoản bị ẩn
suspend_account: Vô hiệu hóa người dùng
silence_account: n
suspend_account: Vô hiệu hóa
unassigned_report: Báo cáo chưa xử lý
unsensitive_account: Đánh dấu tài khoản là bình thường
unsilence_account: Tài khoản bỏ ẩn
unsuspend_account: Ngừng vô hiệu hóa
unsensitive_account: Đánh dấu bình thường
unsilence_account: Bỏ ẩn
unsuspend_account: Bỏ vô hiệu hóa
update_announcement: Cập nhật thông báo
update_custom_emoji: Cập nhật Emoji mới
update_domain_block: Cập nhật máy chủ chặn
update_status: Cập nhật tút
actions:
assigned_to_self_report: "%{name} đã xử lý báo cáo được giao %{target}"
assigned_to_self_report: "%{name} tự xử lý báo cáo %{target}"
change_email_user: "%{name} đã thay đổi địa chỉ email cho %{target}"
confirm_user: "%{name} xác nhận địa chỉ email của người dùng %{target}"
create_account_warning: "%{name} đã gửi cảnh cáo %{target}"
@ -274,9 +274,9 @@ vi:
destroy_email_domain_block: "%{name} bỏ chặn tên miền email %{target}"
destroy_ip_block: "%{name} bỏ chặn IP %{target}"
destroy_status: "%{name} đã xóa tút của %{target}"
disable_2fa_user: "%{name} đã vô hiệu hóa xác thực hai yếu tố của %{target}"
disable_2fa_user: "%{name} đã vô hiệu hóa xác thực hai bước của %{target}"
disable_custom_emoji: "%{name} đã ẩn emoji %{target}"
disable_user: "%{name} tạm khóa %{target}"
disable_user: "%{name} vô hiệu hóa đăng nhập %{target}"
enable_custom_emoji: "%{name} cho phép Emoji %{target}"
enable_user: "%{name} mở khóa cho người dùng %{target}"
memorialize_account: "%{name} đã biến tài khoản %{target} thành một trang tưởng niệm"
@ -605,7 +605,7 @@ vi:
title: Mô tả máy chủ
site_description_extended:
desc_html: Bạn có thể tạo thêm các mục như quy định chung, hướng dẫn và những thứ khác liên quan tới máy chủ của bạn. Dùng thẻ HTML
title: Thông tin mở rộng tùy chỉnh
title: Thông tin bổ sung
site_short_description:
desc_html: Hiển thị trong thanh bên và thẻ meta. Mô tả Mastodon là gì và điều gì làm cho máy chủ này trở nên đặc biệt trong một đoạn văn duy nhất.
title: Mô tả máy chủ ngắn
@ -1212,7 +1212,7 @@ vi:
show_more: Đọc thêm
show_newer: Mới hơn
show_older: Cũ hơn
show_thread: Xem thêm
show_thread: Toàn bộ chủ đề
sign_in_to_participate: Đăng nhập để trả lời chủ đề này
title: '%{name}: "%{quote}"'
visibilities:

@ -148,7 +148,7 @@ zh-CN:
pending: 待审核
silenced: 已隐藏
suspended: 已封禁
title: 帐户状态
title: 管理
moderation_notes: 管理员备注
most_recent_activity: 最后一次活跃的时间
most_recent_ip: 最后一次活跃的 IP 地址

@ -398,6 +398,8 @@ zh-HK:
silence: 自動靜音
suspend: 自動刪除
title: 新增域名阻隔
obfuscate: 混淆域名名稱
obfuscate_hint: 如果已經啟用了網域廣告列表限制,在列表部份混淆網域名稱
private_comment: 私人留言
private_comment_hint: 請提供更多有關此域名限制的資訊以供管理員作內部參考。
public_comment: 公開留言
@ -556,6 +558,7 @@ zh-HK:
domain_blocks_rationale:
title: 顯示原因予
enable_bootstrap_timeline_accounts:
desc_html: 自動為新用戶追隨預設的帳號,為他們的首頁動態增加一點色彩
title: 啟用「新使用者預設關注」功能
hero:
desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會默認為服務站縮圖
@ -912,6 +915,8 @@ zh-HK:
status: 確認狀態
view_proof: 查看證明
imports:
errors:
over_rows_processing_limit: 包含超過 %{count} 行
modes:
merge: 合併
merge_long: 留下舊有記錄並添加新的資訊

@ -2,19 +2,19 @@
const { basename, dirname, extname, join, resolve } = require('path');
const { env } = require('process');
const { safeLoad } = require('js-yaml');
const { load } = require('js-yaml');
const { lstatSync, readFileSync } = require('fs');
const glob = require('glob');
const configPath = resolve('config', 'webpacker.yml');
const settings = safeLoad(readFileSync(configPath), 'utf8')[env.RAILS_ENV || env.NODE_ENV];
const settings = load(readFileSync(configPath), 'utf8')[env.RAILS_ENV || env.NODE_ENV];
const flavourFiles = glob.sync('app/javascript/flavours/*/theme.yml');
const skinFiles = glob.sync('app/javascript/skins/*/*');
const flavours = {};
const core = function () {
const coreFile = resolve('app', 'javascript', 'core', 'theme.yml');
const data = safeLoad(readFileSync(coreFile), 'utf8');
const data = load(readFileSync(coreFile), 'utf8');
if (!data.pack_directory) {
data.pack_directory = dirname(coreFile);
}
@ -23,7 +23,7 @@ const core = function () {
for (let i = 0; i < flavourFiles.length; i++) {
const flavourFile = flavourFiles[i];
const data = safeLoad(readFileSync(flavourFile), 'utf8');
const data = load(readFileSync(flavourFile), 'utf8');
data.name = basename(dirname(flavourFile));
data.skin = {};
if (!data.pack_directory) {

4
dist/nginx.conf vendored

@ -73,7 +73,7 @@ server {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Proxy "";
proxy_pass_header Server;
@ -98,7 +98,7 @@ server {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Proxy "";
proxy_pass http://streaming;

@ -384,7 +384,7 @@ module Mastodon
end
processed, = parallelize_with_progress(Account.local.without_suspended) do |account|
FollowService.new.call(account, target_account)
FollowService.new.call(account, target_account, bypass_limit: true)
end
say("OK, followed target from #{processed} accounts", :green)

@ -43,7 +43,12 @@ module Mastodon
tar.each do |entry|
next unless entry.file? && entry.full_name.end_with?('.png')
shortcode = [options[:prefix], File.basename(entry.full_name, '.*'), options[:suffix]].compact.join
filename = File.basename(entry.full_name, '.*')
# Skip macOS shadow files
next if filename.start_with?('._')
shortcode = [options[:prefix], filename, options[:suffix]].compact.join
custom_emoji = CustomEmoji.local.find_by(shortcode: shortcode)
if custom_emoji && !options[:overwrite]

@ -17,7 +17,7 @@ module Mastodon
end
def flags
'rc3'
''
end
def suffix

@ -60,24 +60,24 @@
},
"private": true,
"dependencies": {
"@babel/core": "^7.12.7",
"@babel/core": "^7.12.10",
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/plugin-proposal-decorators": "^7.12.1",
"@babel/plugin-proposal-decorators": "^7.12.12",
"@babel/plugin-transform-react-inline-elements": "^7.12.1",
"@babel/plugin-transform-runtime": "^7.12.1",
"@babel/preset-env": "^7.12.7",
"@babel/preset-react": "^7.12.7",
"@babel/plugin-transform-runtime": "^7.12.10",
"@babel/preset-env": "^7.12.11",
"@babel/preset-react": "^7.12.10",
"@babel/runtime": "^7.12.5",
"@clusterws/cws": "^3.0.0",
"@gamestdio/websocket": "^0.3.2",
"@github/webauthn-json": "^0.5.7",
"@rails/ujs": "^6.0.3",
"array-includes": "^3.1.1",
"@rails/ujs": "^6.1.0",
"array-includes": "^3.1.2",
"atrament": "0.2.4",
"arrow-key-navigation": "^1.2.0",
"autoprefixer": "^9.8.6",
"axios": "^0.21.0",
"babel-loader": "^8.2.1",
"axios": "^0.21.1",
"babel-loader": "^8.2.2",
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-preval": "^5.0.0",
"babel-plugin-react-intl": "^6.2.0",
@ -85,12 +85,12 @@
"babel-runtime": "^6.26.0",
"blurhash": "^1.1.3",
"classnames": "^2.2.5",
"color-blend": "^3.0.0",
"color-blend": "^3.0.1",
"compression-webpack-plugin": "^6.1.1",
"cross-env": "^7.0.2",
"cross-env": "^7.0.3",
"css-loader": "^5.0.1",
"cssnano": "^4.1.10",
"detect-passive-events": "^2.0.1",
"detect-passive-events": "^2.0.2",
"dotenv": "^8.2.0",
"emoji-mart": "Gargron/emoji-mart#build",
"es6-symbol": "^3.1.3",
@ -105,21 +105,21 @@
"http-link-header": "^1.0.3",
"immutable": "^3.8.2",
"imports-loader": "^1.2.0",
"intersection-observer": "^0.11.0",
"intersection-observer": "^0.12.0",
"intl": "^1.2.5",
"intl-messageformat": "^2.2.0",
"intl-relativeformat": "^6.4.3",
"is-nan": "^1.3.0",
"js-yaml": "^3.13.1",
"is-nan": "^1.3.2",
"js-yaml": "^4.0.0",
"lodash": "^4.17.19",
"mark-loader": "^0.1.6",
"marky": "^1.2.1",
"mini-css-extract-plugin": "^1.3.1",
"mini-css-extract-plugin": "^1.3.3",
"mkdirp": "^1.0.4",
"npmlog": "^4.1.2",
"object-assign": "^4.1.1",
"object-fit-images": "^3.2.3",
"object.values": "^1.1.1",
"object.values": "^1.1.2",
"offline-plugin": "^5.0.7",
"path-complete-extname": "^1.0.0",
"pg": "^6.4.0",
@ -137,12 +137,12 @@
"react-masonry-infinite": "^1.2.2",
"react-motion": "^0.5.2",
"react-notification": "^6.8.5",
"react-overlays": "^0.9.2",
"react-overlays": "^0.9.3",
"react-redux": "^7.2.2",
"react-redux-loading-bar": "^4.0.8",
"react-router-dom": "^4.1.1",
"react-router-scroll-4": "^1.0.0-beta.1",
"react-select": "^3.1.0",
"react-select": "^3.1.1",
"react-sparklines": "^1.7.0",
"react-swipeable-views": "^0.13.9",
"react-textarea-autosize": "^8.3.0",
@ -156,7 +156,7 @@
"requestidlecallback": "^0.3.0",
"reselect": "^4.0.0",
"rimraf": "^3.0.2",
"sass": "^1.29.0",
"sass": "^1.32.0",
"sass-loader": "^10.1.0",
"stacktrace-js": "^2.0.2",
"stringz": "^2.1.0",
@ -168,28 +168,28 @@
"uuid": "^8.3.1",
"webpack": "^4.44.2",
"webpack-assets-manifest": "^3.1.1",
"webpack-bundle-analyzer": "^4.1.0",
"webpack-bundle-analyzer": "^4.3.0",
"webpack-cli": "^3.3.12",
"webpack-merge": "^5.4.0",
"webpack-merge": "^5.7.3",
"wicg-inert": "^3.1.0"
},
"devDependencies": {
"@testing-library/jest-dom": "^5.11.6",
"@testing-library/jest-dom": "^5.11.8",
"@testing-library/react": "^11.2.2",
"babel-eslint": "^10.1.0",
"babel-jest": "^26.6.3",
"eslint": "^7.14.0",
"eslint": "^7.17.0",
"eslint-plugin-import": "~2.22.1",
"eslint-plugin-jsx-a11y": "~6.4.1",
"eslint-plugin-promise": "~4.2.1",
"eslint-plugin-react": "~7.21.5",
"eslint-plugin-react": "~7.22.0",
"jest": "^26.6.3",
"raf": "^3.4.1",
"react-intl-translations-manager": "^5.0.3",
"react-test-renderer": "^16.14.0",
"sass-lint": "^1.13.1",
"webpack-dev-server": "^3.11.0",
"yargs": "^16.1.1"
"webpack-dev-server": "^3.11.1",
"yargs": "^16.2.0"
},
"resolutions": {
"kind-of": "^6.0.3"

@ -23,8 +23,8 @@ describe RefollowWorker do
result = subject.perform(account.id)
expect(result).to be_nil
expect(service).to have_received(:call).with(alice, account, reblogs: true, notify: false)
expect(service).to have_received(:call).with(bob, account, reblogs: false, notify: false)
expect(service).to have_received(:call).with(alice, account, reblogs: true, notify: false, bypass_limit: true)
expect(service).to have_received(:call).with(bob, account, reblogs: false, notify: false, bypass_limit: true)
end
end
end

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save