Compare commits

...

81 commits

Author SHA1 Message Date
dependabot[bot]
c4a429ed47
Bump fog-openstack from 0.3.2 to 0.3.10 (#22597)
Bumps [fog-openstack](https://github.com/fog/fog-openstack) from 0.3.2 to 0.3.10.
- [Release notes](https://github.com/fog/fog-openstack/releases)
- [Changelog](https://github.com/fog/fog-openstack/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fog/fog-openstack/compare/v0.3.2...v0.3.10)

---
updated-dependencies:
- dependency-name: fog-openstack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-21 12:40:50 +09:00
dependabot[bot]
fbe2c95ff1
Bump fog-core from 2.1.0 to 2.3.0 (#22596)
Bumps [fog-core](https://github.com/fog/fog-core) from 2.1.0 to 2.3.0.
- [Release notes](https://github.com/fog/fog-core/releases)
- [Changelog](https://github.com/fog/fog-core/blob/master/changelog.md)
- [Commits](https://github.com/fog/fog-core/compare/v2.1.0...v2.3.0)

---
updated-dependencies:
- dependency-name: fog-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-21 12:06:44 +09:00
dependabot[bot]
a0af356df6
Bump fog-openstack from 0.3.2 to 0.3.10 (#22593)
Bumps [fog-openstack](https://github.com/fog/fog-openstack) from 0.3.2 to 0.3.10.
- [Release notes](https://github.com/fog/fog-openstack/releases)
- [Changelog](https://github.com/fog/fog-openstack/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fog/fog-openstack/compare/v0.3.2...v0.3.10)

---
updated-dependencies:
- dependency-name: fog-openstack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-21 11:58:01 +09:00
dependabot[bot]
dac312a11a
Bump fog-core from 2.1.0 to 2.3.0 (#22544)
Bumps [fog-core](https://github.com/fog/fog-core) from 2.1.0 to 2.3.0.
- [Release notes](https://github.com/fog/fog-core/releases)
- [Changelog](https://github.com/fog/fog-core/blob/master/changelog.md)
- [Commits](https://github.com/fog/fog-core/compare/v2.1.0...v2.3.0)

---
updated-dependencies:
- dependency-name: fog-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-21 11:22:22 +09:00
Eugen Rochko
de21695162
New Crowdin updates (#22354)
* New translations en.json (Hindi)

* New translations en.json (Malay)

* New translations en.json (Telugu)

* New translations en.json (English, United Kingdom)

* New translations en.json (Burmese)

* New translations en.json (Welsh)

* New translations en.json (Faroese)

* New translations en.json (Esperanto)

* New translations en.json (Uyghur)

* New translations en.json (Chinese Traditional, Hong Kong)

* New translations en.json (Tatar)

* New translations en.json (Malayalam)

* New translations en.json (Breton)

* New translations en.json (Latin)

* New translations en.json (Bosnian)

* New translations en.json (French, Quebec)

* New translations en.json (Sinhala)

* New translations en.json (Cornish)

* New translations en.json (Kannada)

* New translations en.json (Scottish Gaelic)

* New translations en.json (Asturian)

* New translations en.json (Aragonese)

* New translations en.json (Occitan)

* New translations en.json (Serbian (Latin))

* New translations en.json (Kurmanji (Kurdish))

* New translations en.json (Sorani (Kurdish))

* New translations en.json (Scots)

* New translations en.json (Igbo)

* New translations en.json (Corsican)

* New translations en.json (Sardinian)

* New translations en.json (Sanskrit)

* New translations en.json (Kabyle)

* New translations en.json (Ido)

* New translations en.json (Taigi)

* New translations en.json (Silesian)

* New translations en.json (Standard Moroccan Tamazight)

* New translations en.yml (Korean)

* New translations en.yml (Galician)

* New translations doorkeeper.en.yml (Korean)

* New translations doorkeeper.en.yml (Galician)

* New translations en.json (Spanish)

* New translations en.json (Belarusian)

* New translations en.yml (Belarusian)

* New translations doorkeeper.en.yml (Belarusian)

* New translations en.json (Bulgarian)

* New translations en.json (Greek)

* New translations activerecord.en.yml (Bulgarian)

* New translations devise.en.yml (Bulgarian)

* New translations doorkeeper.en.yml (Belarusian)

* New translations doorkeeper.en.yml (Bulgarian)

* New translations en.json (German)

* New translations en.json (Italian)

* New translations en.json (Slovenian)

* New translations en.json (Kurmanji (Kurdish))

* New translations en.yml (Bulgarian)

* New translations doorkeeper.en.yml (Bulgarian)

* New translations en.json (Spanish)

* New translations en.json (Swedish)

* New translations en.json (Ukrainian)

* New translations en.json (Estonian)

* New translations en.json (Welsh)

* New translations en.yml (Spanish)

* New translations en.yml (Bulgarian)

* New translations doorkeeper.en.yml (Spanish)

* New translations en.json (Faroese)

* New translations en.json (Latin)

* New translations en.json (Catalan)

* New translations en.json (Vietnamese)

* New translations en.yml (Bulgarian)

* New translations en.yml (Serbian (Latin))

* New translations en.json (Frisian)

* New translations en.json (Hebrew)

* New translations en.json (Latvian)

* New translations en.yml (Bulgarian)

* New translations en.yml (Dutch)

* New translations simple_form.en.yml (Dutch)

* New translations devise.en.yml (Dutch)

* New translations en.json (Catalan)

* New translations en.json (Chinese Traditional)

* New translations en.yml (Bulgarian)

* New translations doorkeeper.en.yml (German)

* New translations en.json (German)

* New translations en.yml (Bulgarian)

* New translations doorkeeper.en.yml (German)

* New translations en.json (Latin)

* New translations simple_form.en.yml (Frisian)

* New translations en.json (French)

* New translations en.json (Hungarian)

* New translations en.json (Polish)

* New translations en.json (Portuguese)

* New translations en.json (Latin)

* New translations en.yml (Portuguese)

* New translations doorkeeper.en.yml (Portuguese)

* New translations en.json (Albanian)

* New translations en.yml (Hebrew)

* New translations en.yml (Albanian)

* New translations doorkeeper.en.yml (Albanian)

* New translations en.json (Norwegian)

* New translations en.json (Russian)

* New translations en.json (Thai)

* New translations en.yml (Bulgarian)

* New translations en.yml (Thai)

* New translations simple_form.en.yml (Bulgarian)

* New translations doorkeeper.en.yml (Thai)

* New translations en.json (Asturian)

* New translations en.yml (Norwegian)

* New translations en.json (Danish)

* New translations en.json (Finnish)

* New translations en.json (Occitan)

* New translations en.yml (Korean)

* New translations doorkeeper.en.yml (Korean)

* New translations en.yml (Thai)

* New translations en.json (Persian)

* New translations doorkeeper.en.yml (Spanish, Argentina)

* New translations en.yml (Bulgarian)

* New translations en.json (Norwegian Nynorsk)

* New translations en.yml (Bulgarian)

* New translations simple_form.en.yml (Bulgarian)

* New translations en.json (Dutch)

* New translations doorkeeper.en.yml (Dutch)

* New translations en.yml (Korean)

* New translations en.json (Japanese)

* New translations en.json (Turkish)

* New translations en.yml (Turkish)

* New translations doorkeeper.en.yml (Turkish)

* New translations en.json (Czech)

* New translations en.yml (Czech)

* New translations en.json (German)

* New translations en.yml (German)

* New translations en.yml (Thai)

* New translations simple_form.en.yml (German)

* New translations doorkeeper.en.yml (German)

* New translations doorkeeper.en.yml (Thai)

* New translations en.json (German)

* New translations en.json (Estonian)

* New translations en.yml (Estonian)

* New translations devise.en.yml (Estonian)

* New translations doorkeeper.en.yml (German)

* New translations doorkeeper.en.yml (Estonian)

* New translations en.json (Indonesian)

* New translations en.json (Estonian)

* New translations en.yml (Indonesian)

* New translations en.yml (Estonian)

* New translations simple_form.en.yml (Estonian)

* New translations devise.en.yml (Estonian)

* New translations en.yml (Russian)

* New translations doorkeeper.en.yml (Russian)

* New translations en.yml (Estonian)

* New translations doorkeeper.en.yml (Estonian)

* New translations en.json (Polish)

* New translations en.yml (Polish)

* New translations doorkeeper.en.yml (Estonian)

* New translations en.json (Basque)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Estonian)

* New translations en.yml (Basque)

* New translations en.yml (Estonian)

* New translations en.json (French)

* New translations en.json (Estonian)

* New translations en.yml (French)

* New translations en.yml (Bulgarian)

* New translations en.yml (Estonian)

* New translations simple_form.en.yml (Estonian)

* New translations activerecord.en.yml (Estonian)

* New translations doorkeeper.en.yml (Estonian)

* New translations en.json (German)

* New translations en.json (Estonian)

* New translations en.yml (Bulgarian)

* New translations doorkeeper.en.yml (Ukrainian)

* New translations en.json (Bengali)

* New translations en.json (Estonian)

* New translations en.yml (Swedish)

* New translations en.yml (Estonian)

* New translations simple_form.en.yml (Ukrainian)

* New translations simple_form.en.yml (Estonian)

* New translations devise.en.yml (Swedish)

* New translations devise.en.yml (Estonian)

* New translations doorkeeper.en.yml (Estonian)

* New translations simple_form.en.yml (Bulgarian)

* New translations en.json (Icelandic)

* New translations en.yml (Icelandic)

* New translations simple_form.en.yml (Bulgarian)

* New translations simple_form.en.yml (Bulgarian)

* New translations en.yml (Icelandic)

* New translations simple_form.en.yml (Bulgarian)

* New translations simple_form.en.yml (Icelandic)

* New translations activerecord.en.yml (Icelandic)

* New translations devise.en.yml (Icelandic)

* New translations doorkeeper.en.yml (Icelandic)

* New translations en.yml (Bulgarian)

* New translations en.yml (Korean)

* New translations simple_form.en.yml (Bulgarian)

* New translations en.json (Chinese Traditional, Hong Kong)

* New translations en.yml (Bulgarian)

* New translations en.yml (Korean)

* New translations en.yml (Chinese Traditional, Hong Kong)

* New translations doorkeeper.en.yml (Icelandic)

* New translations doorkeeper.en.yml (Chinese Traditional, Hong Kong)

* New translations en.yml (Estonian)

* New translations simple_form.en.yml (Estonian)

* New translations en.yml (Japanese)

* New translations en.json (Norwegian Nynorsk)

* New translations en.json (Kurmanji (Kurdish))

* New translations en.yml (Japanese)

* New translations en.yml (Kurmanji (Kurdish))

* New translations simple_form.en.yml (Kurmanji (Kurdish))

* New translations en.json (Norwegian Nynorsk)

* New translations en.yml (Bulgarian)

* New translations en.yml (Thai)

* New translations en.yml (Norwegian Nynorsk)

* New translations doorkeeper.en.yml (French)

* New translations doorkeeper.en.yml (Thai)

* New translations en.yml (Thai)

* New translations en.yml (Norwegian Nynorsk)

* New translations doorkeeper.en.yml (Norwegian Nynorsk)

* New translations en.json (Estonian)

* New translations en.yml (Bulgarian)

* New translations en.yml (Ukrainian)

* New translations simple_form.en.yml (Ukrainian)

* New translations simple_form.en.yml (Estonian)

* New translations doorkeeper.en.yml (Dutch)

* New translations en.json (Serbian (Cyrillic))

* New translations en.json (Estonian)

* New translations en.json (Serbian (Latin))

* New translations en.yml (Polish)

* New translations en.json (Chinese Simplified)

* New translations en.yml (Chinese Simplified)

* New translations doorkeeper.en.yml (Chinese Simplified)

* New translations en.yml (Bulgarian)

* New translations en.json (Estonian)

* New translations en.yml (Bulgarian)

* New translations en.yml (Chinese Simplified)

* New translations doorkeeper.en.yml (Czech)

* New translations en.json (Estonian)

* New translations en.yml (Bulgarian)

* New translations en.yml (Estonian)

* New translations simple_form.en.yml (Frisian)

* New translations simple_form.en.yml (Icelandic)

* New translations en.yml (Bulgarian)

* New translations simple_form.en.yml (Frisian)

* New translations en.yml (Bulgarian)

* Normalize

* New translations en.yml (Serbian (Cyrillic))

* Normalize

* New translations en.yml (Serbian (Cyrillic))

* New translations doorkeeper.en.yml (Serbian (Cyrillic))

* New translations doorkeeper.en.yml (Serbian (Latin))

* New translations en.yml (Bulgarian)

* Normalize

Co-authored-by: Yamagishi Kazutoshi <ykzts@desire.sh>
2022-12-20 23:02:47 +09:00
dependabot[bot]
628b350516
Bump fog-openstack from 0.3.2 to 0.3.10 (#22542)
Bumps [fog-openstack](https://github.com/fog/fog-openstack) from 0.3.2 to 0.3.10.
- [Release notes](https://github.com/fog/fog-openstack/releases)
- [Changelog](https://github.com/fog/fog-openstack/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fog/fog-openstack/compare/v0.3.2...v0.3.10)

---
updated-dependencies:
- dependency-name: fog-openstack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 19:44:56 +09:00
dependabot[bot]
919747322f
Bump scenic from 1.6.0 to 1.7.0 (#22258)
Bumps [scenic](https://github.com/scenic-views/scenic) from 1.6.0 to 1.7.0.
- [Release notes](https://github.com/scenic-views/scenic/releases)
- [Changelog](https://github.com/scenic-views/scenic/blob/main/CHANGELOG.md)
- [Commits](https://github.com/scenic-views/scenic/compare/v1.6.0...v1.7.0)

---
updated-dependencies:
- dependency-name: scenic
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 19:10:09 +09:00
dependabot[bot]
c04b762b9c
Bump http from 5.1.0 to 5.1.1 (#22515)
Bumps [http](https://github.com/httprb/http) from 5.1.0 to 5.1.1.
- [Release notes](https://github.com/httprb/http/releases)
- [Changelog](https://github.com/httprb/http/blob/main/CHANGES.md)
- [Commits](https://github.com/httprb/http/compare/v5.1.0...v5.1.1)

---
updated-dependencies:
- dependency-name: http
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 19:09:14 +09:00
dependabot[bot]
ef09016f35
Bump pundit from 2.2.0 to 2.3.0 (#22516)
Bumps [pundit](https://github.com/varvet/pundit) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/varvet/pundit/releases)
- [Changelog](https://github.com/varvet/pundit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/varvet/pundit/commits)

---
updated-dependencies:
- dependency-name: pundit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 19:08:53 +09:00
dependabot[bot]
fcaeae7761
Bump fog-core from 2.1.0 to 2.3.0 (#22521)
Bumps [fog-core](https://github.com/fog/fog-core) from 2.1.0 to 2.3.0.
- [Release notes](https://github.com/fog/fog-core/releases)
- [Changelog](https://github.com/fog/fog-core/blob/master/changelog.md)
- [Commits](https://github.com/fog/fog-core/compare/v2.1.0...v2.3.0)

---
updated-dependencies:
- dependency-name: fog-core
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 19:08:22 +09:00
dependabot[bot]
6a1d41635b
Bump sass from 1.56.2 to 1.57.0 (#22519)
Bumps [sass](https://github.com/sass/dart-sass) from 1.56.2 to 1.57.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.56.2...1.57.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-20 19:07:56 +09:00
Claire
c1de673060
Fix suspension worker crashing on S3-compatible setups without ACL support (#22487) 2022-12-19 17:55:17 +01:00
Kai
2bad619d17
Change HTTP to HTTPS for links in CODE_OF_CONDUCT (#22465) 2022-12-19 09:46:22 +09:00
Nick Schonning
06b68490d1
Enable eslint:recommended ruleset (#22433)
* Enable ESLint recommended ruleset

* Disable failing ESLint recommended rules

* Remove rules shadowed by eslint:recommended
2022-12-19 00:51:37 +09:00
Eugen Rochko
2889c68610
New Crowdin updates (#22182)
* New translations activerecord.en.yml (Malayalam)

* New translations devise.en.yml (Malayalam)

* New translations doorkeeper.en.yml (Malayalam)

* New translations en.json (Breton)

* New translations simple_form.en.yml (Breton)

* New translations activerecord.en.yml (Breton)

* New translations devise.en.yml (Breton)

* New translations doorkeeper.en.yml (Breton)

* New translations en.json (Bosnian)

* New translations en.json (French, Quebec)

* New translations simple_form.en.yml (French, Quebec)

* New translations activerecord.en.yml (French, Quebec)

* New translations devise.en.yml (French, Quebec)

* New translations doorkeeper.en.yml (French, Quebec)

* New translations en.json (Sinhala)

* New translations simple_form.en.yml (Sinhala)

* New translations activerecord.en.yml (Sinhala)

* New translations devise.en.yml (Sinhala)

* New translations doorkeeper.en.yml (Sinhala)

* New translations en.json (Cornish)

* New translations en.json (Kannada)

* New translations devise.en.yml (Kannada)

* New translations simple_form.en.yml (Scottish Gaelic)

* New translations activerecord.en.yml (Scottish Gaelic)

* New translations devise.en.yml (Scottish Gaelic)

* New translations doorkeeper.en.yml (Scottish Gaelic)

* New translations simple_form.en.yml (Asturian)

* New translations activerecord.en.yml (Asturian)

* New translations devise.en.yml (Asturian)

* New translations simple_form.en.yml (Aragonese)

* New translations activerecord.en.yml (Aragonese)

* New translations devise.en.yml (Aragonese)

* New translations doorkeeper.en.yml (Aragonese)

* New translations simple_form.en.yml (Occitan)

* New translations activerecord.en.yml (Occitan)

* New translations devise.en.yml (Occitan)

* New translations doorkeeper.en.yml (Occitan)

* New translations activerecord.en.yml (Kurmanji (Kurdish))

* New translations doorkeeper.en.yml (Kurmanji (Kurdish))

* New translations simple_form.en.yml (Sorani (Kurdish))

* New translations devise.en.yml (Sorani (Kurdish))

* New translations doorkeeper.en.yml (Sorani (Kurdish))

* New translations en.json (Igbo)

* New translations en.json (Corsican)

* New translations simple_form.en.yml (Corsican)

* New translations activerecord.en.yml (Corsican)

* New translations devise.en.yml (Corsican)

* New translations doorkeeper.en.yml (Corsican)

* New translations en.json (Sardinian)

* New translations simple_form.en.yml (Sardinian)

* New translations activerecord.en.yml (Sardinian)

* New translations devise.en.yml (Sardinian)

* New translations doorkeeper.en.yml (Sardinian)

* New translations en.json (Sanskrit)

* New translations en.json (Kabyle)

* New translations simple_form.en.yml (Kabyle)

* New translations activerecord.en.yml (Kabyle)

* New translations devise.en.yml (Kabyle)

* New translations doorkeeper.en.yml (Kabyle)

* New translations en.json (Ido)

* New translations simple_form.en.yml (Ido)

* New translations activerecord.en.yml (Ido)

* New translations devise.en.yml (Ido)

* New translations doorkeeper.en.yml (Ido)

* New translations en.json (Taigi)

* New translations en.json (Silesian)

* New translations en.json (Standard Moroccan Tamazight)

* New translations simple_form.en.yml (Standard Moroccan Tamazight)

* New translations activerecord.en.yml (Standard Moroccan Tamazight)

* New translations devise.en.yml (Standard Moroccan Tamazight)

* New translations doorkeeper.en.yml (Standard Moroccan Tamazight)

* New translations en.json (Afrikaans)

* New translations en.json (Bulgarian)

* New translations en.json (Catalan)

* New translations en.json (Czech)

* New translations en.json (German)

* New translations en.json (Greek)

* New translations en.json (Frisian)

* New translations en.json (Finnish)

* New translations en.json (Irish)

* New translations en.json (Hungarian)

* New translations en.json (Armenian)

* New translations en.json (Italian)

* New translations en.json (Georgian)

* New translations en.json (Lithuanian)

* New translations en.json (Macedonian)

* New translations en.json (Dutch)

* New translations en.json (Punjabi)

* New translations en.json (Chinese Traditional)

* New translations en.json (Urdu (Pakistan))

* New translations en.json (Vietnamese)

* New translations en.json (Tamil)

* New translations en.json (Bengali)

* New translations en.json (Marathi)

* New translations en.json (Croatian)

* New translations en.json (Kazakh)

* New translations en.json (Latvian)

* New translations en.json (Hindi)

* New translations en.json (Telugu)

* New translations en.json (English, United Kingdom)

* New translations en.json (Burmese)

* New translations en.json (Uyghur)

* New translations en.json (Tatar)

* New translations en.json (Malayalam)

* New translations en.json (Latin)

* New translations en.json (Bosnian)

* New translations en.json (Cornish)

* New translations en.json (Kannada)

* New translations en.json (Asturian)

* New translations en.json (Kurmanji (Kurdish))

* New translations en.json (Sorani (Kurdish))

* New translations en.json (Igbo)

* New translations en.json (Corsican)

* New translations en.json (Sardinian)

* New translations en.json (Sanskrit)

* New translations en.json (Kabyle)

* New translations en.json (Taigi)

* New translations en.json (Silesian)

* New translations en.json (Standard Moroccan Tamazight)

* New translations en.yml (French)

* New translations en.yml (Spanish)

* New translations en.yml (Arabic)

* New translations en.yml (Belarusian)

* New translations en.yml (Catalan)

* New translations en.yml (Czech)

* New translations en.yml (Danish)

* New translations en.yml (German)

* New translations en.yml (Greek)

* New translations en.yml (Frisian)

* New translations en.yml (Basque)

* New translations en.yml (Finnish)

* New translations en.yml (Hungarian)

* New translations en.yml (Italian)

* New translations en.yml (Japanese)

* New translations en.yml (Korean)

* New translations en.yml (Dutch)

* New translations en.yml (Norwegian)

* New translations en.yml (Polish)

* New translations en.yml (Portuguese)

* New translations en.yml (Russian)

* New translations en.yml (Slovak)

* New translations en.yml (Slovenian)

* New translations en.yml (Albanian)

* New translations en.yml (Swedish)

* New translations en.yml (Turkish)

* New translations en.yml (Ukrainian)

* New translations en.yml (Chinese Simplified)

* New translations en.yml (Chinese Traditional)

* New translations en.yml (Vietnamese)

* New translations en.yml (Galician)

* New translations en.yml (Icelandic)

* New translations en.yml (Portuguese, Brazilian)

* New translations en.yml (Indonesian)

* New translations en.yml (Persian)

* New translations en.yml (Spanish, Mexico)

* New translations en.yml (Bengali)

* New translations en.yml (Thai)

* New translations en.yml (Norwegian Nynorsk)

* New translations en.yml (Kazakh)

* New translations en.yml (Estonian)

* New translations en.yml (Latvian)

* New translations en.yml (Malay)

* New translations en.yml (Welsh)

* New translations en.yml (Faroese)

* New translations en.yml (Esperanto)

* New translations en.yml (Chinese Traditional, Hong Kong)

* New translations en.yml (Latin)

* New translations en.yml (French, Quebec)

* New translations en.yml (Sinhala)

* New translations en.yml (Scottish Gaelic)

* New translations en.yml (Aragonese)

* New translations en.yml (Occitan)

* New translations en.yml (Kurmanji (Kurdish))

* New translations en.yml (Sorani (Kurdish))

* New translations en.yml (Scots)

* New translations en.yml (Corsican)

* New translations en.yml (Sardinian)

* New translations en.yml (Ido)

* New translations simple_form.en.yml (Bulgarian)

* New translations simple_form.en.yml (Finnish)

* New translations simple_form.en.yml (Latin)

* New translations simple_form.en.yml (French, Quebec)

* New translations simple_form.en.yml (Kurmanji (Kurdish))

* New translations activerecord.en.yml (Frisian)

* New translations activerecord.en.yml (Latin)

* New translations devise.en.yml (Frisian)

* New translations devise.en.yml (Latin)

* New translations devise.en.yml (Kurmanji (Kurdish))

* New translations doorkeeper.en.yml (Bulgarian)

* New translations doorkeeper.en.yml (Frisian)

* New translations doorkeeper.en.yml (Hungarian)

* New translations doorkeeper.en.yml (Italian)

* New translations doorkeeper.en.yml (Vietnamese)

* New translations doorkeeper.en.yml (Latin)

* New translations en.json (Belarusian)

* New translations en.json (Catalan)

* New translations en.json (Danish)

* New translations en.json (Finnish)

* New translations en.json (Turkish)

* New translations en.yml (Belarusian)

* New translations en.yml (Catalan)

* New translations en.yml (Danish)

* New translations en.yml (Swedish)

* New translations en.yml (Turkish)

* New translations doorkeeper.en.yml (Danish)

* Normalize locale files

* New translations en.json (German)

* New translations en.json (Swedish)

* New translations en.json (Estonian)

* New translations en.json (Latvian)

* New translations en.json (Welsh)

* New translations en.yml (Hungarian)

* New translations en.yml (Polish)

* New translations en.yml (Latvian)

* New translations en.yml (Welsh)

* New translations simple_form.en.yml (Welsh)

* New translations activerecord.en.yml (Welsh)

* New translations devise.en.yml (Welsh)

* New translations doorkeeper.en.yml (Czech)

* New translations doorkeeper.en.yml (Latvian)

* New translations doorkeeper.en.yml (Welsh)

* New translations en.json (Ukrainian)

* New translations en.json (Chinese Traditional)

* New translations en.json (Estonian)

* New translations en.yml (Swedish)

* New translations en.yml (Ukrainian)

* New translations en.yml (Chinese Traditional)

* New translations doorkeeper.en.yml (Italian)

* New translations doorkeeper.en.yml (Swedish)

* New translations doorkeeper.en.yml (Chinese Traditional)

* New translations en.json (Catalan)

* New translations en.json (Slovenian)

* New translations en.json (Faroese)

* New translations en.json (Asturian)

* New translations en.yml (Catalan)

* New translations en.yml (German)

* New translations en.yml (Slovenian)

* New translations en.yml (Faroese)

* New translations doorkeeper.en.yml (German)

* New translations doorkeeper.en.yml (Slovenian)

* New translations doorkeeper.en.yml (Faroese)

* New translations doorkeeper.en.yml (Ukrainian)

* New translations en.json (Greek)

* New translations en.yml (Danish)

* New translations en.json (Danish)

* New translations en.yml (Danish)

* New translations doorkeeper.en.yml (Danish)

* Normalize

Co-authored-by: Yamagishi Kazutoshi <ykzts@desire.sh>
2022-12-16 12:46:39 +09:00
Nick Schonning
3c70f0a9c9
Run Prettier on YML files (#22345) 2022-12-16 11:11:52 +09:00
Yamagishi Kazutoshi
f847f67410
Add Western Frisian support (#18602) 2022-12-15 19:03:44 +01:00
Claire
d13702ac06
Fix status cache hydration discrepancy (#19879) 2022-12-15 18:55:55 +01:00
zunda
10370d316a
Remove packages that are provided by Heroku stacks (#19836) 2022-12-15 18:55:29 +01:00
Douglas Blank
2c7df002fa
Add left and right margin to emojis (#20464) 2022-12-15 18:53:37 +01:00
Claire
70415714f1
Add follow request banner on account header (#20785)
* Add requested_by to relationship maps

* Display whether an account has requested to follow you on their profile
2022-12-15 18:50:11 +01:00
Matt Williams
7a3c6bb888
Dont use reserved foldername (#20582)
Co-authored-by: Effy Elden <effy@effy.space>
2022-12-15 18:49:43 +01:00
Holden Foreman
c761e7a5ef
Fix language surrounding disability in prompts for alt text and other media descriptions (#20923) 2022-12-15 18:46:13 +01:00
Jullan-M
b4fe2d1004
Add Southern Sami, and Lule Sami to language list under the ISO-639-3 standard (#21262)
* Add sme, smj, and sma ISO-639-3 language codes

* Remove sme in ISO-639-3
2022-12-15 18:42:48 +01:00
Christopher Nethercott
c649f4d386
fix: remove SMTP_SERVER (#21342)
Firstly, mailgun.com is now their domain. Secondly they are lots of providers to use; and sysadmins should be able to choose.
2022-12-15 18:42:08 +01:00
Claire
bf1c7e2122
Ensure exact match is the first result in hashtag searches (#21315)
Fixes #17494
2022-12-15 18:41:40 +01:00
Bramus!
7fbc17afa2
Fix media markup (#21420)
This brings the markup of the MediaItem component on par with the Item component from media_gallery.

Co-authored-by: Effy Elden <effy@effy.space>
2022-12-15 18:37:47 +01:00
Shlee
99d2693071
Update circleci (#21880)
* Update config.yml

* Update config.yml
2022-12-15 18:13:13 +01:00
Claire
2644a28cb3
Change remote media files to be downloaded outside of transactions (#21796) 2022-12-15 18:09:48 +01:00
Brian Campbell
2d12948220
Fix idempotency when database writes are slow (#21840)
There is an idempotency key generated by clients when authoring a post,
and stored in Redis, to ensure that if a user or client retries posting
the same status, we don't get a duplicate.

Hachyderm.io has been experiencing some filesystem and database
performance issues, causing database writes to be slow. This can mean
that there are successful posts, but the reverse proxy returns 504
Gateway Timeout before the idempotency status has been updated; users or
clients who retry (such as Tusky which retries automatically, see
tuskyapp/Tusky#2951) can re-try the same post with the same idempotency
key before it has actually been recorded in Redis, leading to duplicate
posts.

To address this issue, move all of the database updates after the
initial transaction that creates the status into the
`postprocess_status!` method, so we can insert the idempotency key
immediately after the status has been created, significantly reducing
the window in which the status could be created but the idempotency key
not yet stored.

Note: this has not yet been tested; I'm submitting this PR for
discussion and to offer to the Hachyderm.io admins to try out to fix the
multiple posting problem.

Co-authored-by: Brian Campbell <brcampbell@beta.team>
2022-12-15 18:08:40 +01:00
Claire
ebf1d74e40
Fix being stuck in edit mode when deleting the edited status (#22126) 2022-12-15 17:47:43 +01:00
Claire
8556a649d5
Fix changing domain block severity not undoing individual account effects (#22135)
* Fix changing domain block severity not undoing individual account effects

Fixes #22133

* Add tests
2022-12-15 17:45:02 +01:00
Effy Elden
1e49be3328
Align everything to Node.js 16 (#22223)
* Update nvmrc to Node.js 16

* Update package.json minimum Node engine to 16

* Update README requirements to Node.js 16

* Update devcontainer Node.js version to 16

* Update devcontainer Dockerfile Node.js choices to LTS versions that are still in support/maintenance

* Pin CircleCI Node image to 16

* Fix YAML type issue

* Update CircleCI Node.js to 16.18 to match #22019
2022-12-15 17:43:26 +01:00
Claire
fb1d9789db
Fix attachment rendering of edited posts in OpenGraph (#22270)
Fixes #22241
2022-12-15 17:41:20 +01:00
Avdi Grimm
8a56587d62
Improve devcontainer for running tests (#22277)
* Improve devcontainer for running tests

- Pull devcontainer post-create out into its own script
- Add asset precompilation
- Add test-mode asset precompilation (needed to run tests without error)

* Document Gemfile.lock re-checkout in devcontainer
2022-12-15 17:40:36 +01:00
Rens Groothuijsen
726c7dea31
Display search popout at fixed screen position (#16463)
* Display search popout at fixed screen position

* Attach search popout to search box
2022-12-15 17:38:50 +01:00
Terence Eden
ff414a5489
Add transparancy to modal background for accessibility (#18081)
Fixes #18080 

This keeps the `ui-base-lighter-color` but adds enough transparency so that text is more easily readable.
Tested in Firefox and Chrome.
2022-12-15 17:38:35 +01:00
Arnout Engelen
9f63c428e1
Don't autofocus the compose form (#16517)
When opening a page such as /web/timelines/home in a desktop browser, the
cursor was automatically placed in the textarea of the compose form.

When using the keyboard for navigation (using a browser plugin like vimium or
vim vixen, or just to hit 'space' to scroll down a page), you have remember to
leave the field before using that.

Since you only visit the page to write a new post some of the time, this PR
attempts to have nothing focused initially (and require the user to click or
e.g. use 'tab' to focus the textarea).

Tested:
* /web/timeslines/home no longer autofocuses the compose box
* pressing the 'n' hotkey still focuses the compose box
* clicking 'reply' for a post still focuses the compose box
* replying to a CW'ed post still focuses the compose box
* introducing the CW field still focuses the CW field
* introducing the CW field for a reply still focuses the CW field
* removing the CW field still focuses the compose box
* /web/statuses/new still autofocuses the compose box

fixes #15862
2022-12-15 17:37:05 +01:00
Jeong Arm
3656a6b9cc
Add "disabled" user filter for admin/accounts UI (#21282) 2022-12-15 17:30:47 +01:00
Mina Her
cedf138313
Fix margin for search field on medium window size (#21606) 2022-12-15 17:24:38 +01:00
David Vega
1b5d207131
Fix single name variables on controller folder (#20092)
Co-authored-by: petrokoriakin1 <116151189+petrokoriakin1@users.noreply.github.com>

Co-authored-by: petrokoriakin1 <116151189+petrokoriakin1@users.noreply.github.com>
Co-authored-by: Effy Elden <effy@effy.space>
2022-12-15 17:11:58 +01:00
Jeong Arm
d412147d02
Save avatar or header correctly even if other one fails (#18465)
* Save avatar or header correctly if other one fails

* Fix test
2022-12-15 17:11:14 +01:00
Luxiaba
8f8c0fe88c
Remove inline-css in logo (#20814) 2022-12-15 17:10:34 +01:00
Yurii Izorkin
7972e5981c
Add brotli compression (#19025) 2022-12-15 17:07:36 +01:00
Matthías Páll Gissurarson
1e95fa3df5
Fix punycoded local domains not being prettified in initial state (#21440) 2022-12-15 17:05:40 +01:00
Meisam
059d64a59e
set activation for tag follow button (#21629)
Co-authored-by: meisam <meisam@noreply.codeberg.org>
2022-12-15 17:04:52 +01:00
Claire
673c54f114
Fix inability to use local LibreTranslate without setting ALLOWED_PRIVATE_ADDRESSES (#21926)
Fixes #20029
2022-12-15 17:04:38 +01:00
Claire
bbc49f15e0
Add explanation text to log-in page (#20946) 2022-12-15 16:44:29 +01:00
Fries
725f21662f
Add Montenegrin (cnr) (#21013) 2022-12-15 16:40:57 +01:00
Claire
38596e49d4
Fix the top action bar appearing in multi-column layout (#20943) 2022-12-15 16:40:45 +01:00
Claire
623d3d2e32
Change CSP directives on API to be tight and concise (#20960) 2022-12-15 16:40:32 +01:00
Kaspar V
19f78ea8fa
linting: RuboCop update, config fixes (#20574)
* fix(rubocop): update gems and add performance and rspec

fix(rubocop): update gems and add performance and rspec

- update present rubocop gems
- add rubocop-rspec and rubocop-performance gems
- move rubocop gems to gem group :development, :test in order to
  make linting in a github action that runs with RAILS_ENV=test possible

* feat(rubocop): disable some annoyance RSpec cops

To mee these prooved to be more annoying than helpful.
If not agreed, they can be enabled any time.

* fix(rubocop): do not ignore spec/**/*

Because rubocop-rspec should lint the specs as well, and they
deserve to be readable in general. It is relevant code, after all.

* fix(rubocop): change ignore db/**/* to db/schema.rb

because rails cops do some lints for migrations.
E.g. reversable migrations linting and more.

* fix(rubocop): tune rules configs

Bunch of commits squashed:

fix(rubocop): enable Layout/LineLength cop

Because this project has code with line lenghts > 500 chars.
This is not good practice at all, so I strongly suggest to
change the practice in the future.

But allow heredoc, URI and comments to still be long lines
and make the default Max: 120 explicit, by repeating it in the
config. To me this max length seems reasonable. Perhaps
a bit more could be ok for some. But > 500 chars in one line
Seems to be way too long IMHO.

fix(rubocop): Metrics/CyclomaticComplexity Max to 12

The default is 7, perhaps quite strict. But 25 is too loose,
the rule becomes pointless like that.

fix(rubocop): AllCops ruby version, cacheing and more info

- fix the target ruby version from 2.5 to 3.0
- have the cop error messages to be more informative and helpful
- enable cacheing in /tmp

fix(rubocop): Metrics/AbcSize to 34 from 115

Rubocops default is 17. If the rule is at 115 is becomes
pointless.

fix(rubocop): Metrics/BlockLength improvements

- instead of ignoring tasks completely, ignore only the
  long blocks that are specific to tasks (task, namespace)
- ignore also concern specific block methods (included, class_methods)

fix(rubocop): Metrics/ClassLength count heredoc array as one line

fix(rubocop): Metrics/MethodLength Max to 25

- the default is 10, but 65 is too loose, so perhaps 25?

fix(rubocop): Metrics/ModuleLength array and heredoc count as one

fix(rubocop): Metrics/PerceivedComplexity to 16 from 25

Rubocops default is 8, so how about only doubling that, instead
of > than tripple it?

fix(rubocop): enable Style/RedundantAssignment

Because I think that this rule would never really hurt,
but improve code quality and readability.

fix(rubocop): enable Style/RescueStandardError

I think everyone that ever had to debug what this can bring
will hopefully agree that this rule totally makes sense.
In the super rare exeptions where this is totally needed,
it can be excluded by disabling comment in that place.

fix(rubocop): Metrics/ParameterLists add explicit defaults and some excludes
2022-12-15 16:39:59 +01:00
Neil Matatall
1f5740e65c
Use Rails tag API to build RSS feed for spoilers and polls (#20163)
* Use Rails tag API to build RSS feed for spoilers and polls

While the previous method did not contain a bug or a potential issue,
the tag API can be very resilient against future problems and reduces the
amount of manual management of the escape status of the content.

I've added tests to ensure that the formatting is broken and still
escapes control characters correctly.

* this seems cleaner and passes

* Incorporate feedback by moving the br to its own line and using the tag helper over the string constant for the br tag itself

* whoops, tag helper doesn't use a self-closing tag
2022-12-15 16:39:41 +01:00
Dan Peterson
3d3429243f
Fix default S3_HOSTNAME used in mastodon:setup (#19932)
s3-us-east-1.amazonaws.com does not exist.

Co-authored-by: Effy Elden <effy@effy.space>
2022-12-15 16:38:51 +01:00
Colin Mitchell
22e36271c5
Add environment variable to configure sidekiq concurrency (#19589)
Co-authored-by: Effy Elden <effy@effy.space>
2022-12-15 16:38:37 +01:00
Nick Schonning
72a8af8088
Fix typo in handler function call name (#21829) 2022-12-15 16:37:17 +01:00
Connor Shea
08c0e43b6f
Increase the width of the unread notification border. (#21692)
The smaller border is difficult to see for some users, especially
when the browser window was thinner, and so the unread border is at the
very left edge of the window.
2022-12-15 16:37:07 +01:00
Francis Murillo
c50e9d078a
Render current day formats in the client timezone (#21878)
* Fix remaining plain %time to %time.formatted

* Add %time.relative-formatted to client format dates on the current day

* Add missing comma dangle to formats

* Use client side message format instead of the server

* Add fallback message to relatve_format.today

* Remove unused translation key and fix js lint issue

Co-authored-by: Effy Elden <effy@effy.space>
2022-12-15 16:35:25 +01:00
trwnh
f0cebaee00
Add localization for new admin scopes (#20979)
* Add localization for new admin scopes

* run bundle exec i18n-tasks normalize
2022-12-15 16:21:13 +01:00
Ikko Ashimine
baecdf2882
Fix typo in application_helper_spec.rb (#20981)
enviroment -> environment
2022-12-15 16:20:55 +01:00
Yamagishi Kazutoshi
58200132d0
FormattedMessage must be used directly (#20982)
* `FormattedMessage` must be used directly

* rollback
2022-12-15 16:20:46 +01:00
Pleclown
3a59ffde8d
Adding 12 hours option for polls (#21131)
* Adding 12 hours option for polls

Adding 12 hours option for polls

* Adding 12 hours option for polls

Missing > on a line
2022-12-15 16:20:34 +01:00
Alex Stine
903e5a3f45
Fix hidden label causing accessibility issue for search inputs (#21275)
* Try unhiding search label.

* Use aria-label. Remove label as empty labels are useless.

* Remove addition of package-lock.json.
2022-12-15 16:20:21 +01:00
Matt Hodges
4114a7088a
Embed js height fix (#22141)
* only begin iframe reheight once document state is complete

* format

* lint fixes

* Update public/embed.js to use readystatechange event listener

Co-authored-by: Claire <claire.github-309c@sitedethib.com>

* Call loaded() if ready, otherwise add listenter

* lint fix

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2022-12-15 16:18:59 +01:00
Jeremy Kescher
04c611daa1
Fix being unable to react with the keycap number sign emoji (#22231)
#⃣

This bug is caused by the emoji consisting of:
U+23 #
U+FE0F
U+20E3  ⃣

Because it starts with a #, it's interpreted as an anchor link, which is not passed to the API. Therefore, the API sees no emoji to react with and answers correctly with a 404.
2022-12-15 16:18:39 +01:00
nametoolong
63b379c2d9
Fix N+1 queries from in NotificationsController (#21202)
Co-authored-by: Nonexistent <nx@example.org>
2022-12-15 16:18:20 +01:00
luzpaz
596923da4a
Fix typos in source documentation (#21046)
Fixed 2 source comment/documentation typos
2022-12-15 15:57:26 +01:00
Moritz Heiber
a0813806d6
Add hadolint as Dockerfile linter (#20993)
* Added hadolint as Dockerfile linter in pipeline and resolved remaining hadolint issues in Dockerfile

* Use more specific version of hadolint Action

* Bumpt hadolint Action version to latest version to avoid deprecation notice

* Being _really_ specific now
2022-12-15 15:57:17 +01:00
Riedler
c3388f4ab1
Fix profile avatar being slightly offset into left border (fixes #20822) (#20994)
* hotfix for #20822

I don't know why it was shifted in the first place or why the width is specified twice, but this fixes the problem, so it looks fine to me.

* realigned pfp with content below

* fixed formatting 

my bad

* added comment to explain the negative margin

before I forget - comments are *important* !

Co-authored-by: Riedler <riedler@gelse.eu>
2022-12-15 15:57:02 +01:00
s0
52540771b0
Fix crash in elasticsearch_check.rb (#21006)
Nil unwrap causes the admin dashboard to crash/500 when the Chewy client info version number value is nil.
This occurs when running another ES-compatible backend such as MeiliSearch.
Obviously it would be good for chewy to recognise upstream but at least avoiding the crash would be fine.
2022-12-15 15:56:48 +01:00
Effy Elden
441cac758f
Allow adding relays while secure mode & limited federation mode are enabled (#22324) 2022-12-15 15:56:05 +01:00
Claire
7b68e6409b
Fix invalid CSS for links in warning and strike cards (#22302) 2022-12-15 15:52:18 +01:00
Jeong Arm
e8cc63105f
Don't delivery a reply to domains which are blocked by author (#22117)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2022-12-15 15:52:06 +01:00
Justin Hutchings
e5d15a5b56
Add CodeQL workflow (#21894) 2022-12-15 15:51:13 +01:00
Claire
bae6ef315e
Fix missing Javascript in domain block import confirmation page (#21471)
Follow-up to #20597
2022-12-15 15:47:23 +01:00
Francis Murillo
5fb1c3e934
Revoke all authorized applications on password reset (#21325)
* Clear sessions on password change

* Rename User::clear_sessions to revoke_access for a clearer meaning

* Add reset paassword controller test

* Use User.find instead of User.find_for_authentication for reset password test

* Use redirect and render for better test meaning in reset password

Co-authored-by: Effy Elden <effy@effy.space>
2022-12-15 15:47:06 +01:00
Claire
fe9eab51d1
Change dropdown menu to contain “Copy link to post” even for non-public posts (#21316)
Fixes #21244
2022-12-15 15:43:16 +01:00
Meisam
6cdbc345f4
Validate nodeinfo response by schema (#21395)
* add json-schema to :test in Gemfile

* Create node_info_2.0_schema.json

* test match_response_schema

* Create match_response_schema.rb

* Update nodeinfo_controller_spec.rb

* Rename spec/support/node_info_2.0_schema.json to spec/support/schema/node_info_2.0_schema.json

* Update match_response_schema.rb

* cleanup

* additionally validate the json schema itself

disable throwing errors

test the schema matcher

* rename nodeinfo schema to nodeinfo_2.0

* use Rails.root.join to construct the path

* prettify json

* sync Gemfile.lock
2022-12-15 15:43:05 +01:00
Claire
f239d31f23
Add --email and --dry-run options to tootctl accounts delete (#22328) 2022-12-15 14:52:50 +01:00
Claire
5917b46c05
Allow admins to refresh remotely-suspended accounts (#22327)
* Change suspension text to mention that a remotely suspended account is not locally-suspended

* Add ability to refresh profile of remotely suspended accounts
2022-12-15 14:15:50 +01:00
Claire
1f762f4271
Fix wasteful request to /api/v1/custom_emojis when not logged in (#22326) 2022-12-15 14:07:34 +01:00
403 changed files with 5864 additions and 1763 deletions

View file

@ -1,8 +1,8 @@
version: 2.1 version: 2.1
orbs: orbs:
ruby: circleci/ruby@1.4.1 ruby: circleci/ruby@2.0.0
node: circleci/node@5.0.1 node: circleci/node@5.0.3
executors: executors:
default: default:
@ -19,11 +19,11 @@ executors:
DB_USER: root DB_USER: root
DISABLE_SIMPLECOV: true DISABLE_SIMPLECOV: true
RAILS_ENV: test RAILS_ENV: test
- image: cimg/postgres:14.0 - image: cimg/postgres:14.5
environment: environment:
POSTGRES_USER: root POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust POSTGRES_HOST_AUTH_METHOD: trust
- image: cimg/redis:6.2 - image: cimg/redis:7.0
commands: commands:
install-system-dependencies: install-system-dependencies:
@ -45,7 +45,7 @@ commands:
bundle config without 'development production' bundle config without 'development production'
name: Set bundler settings name: Set bundler settings
- ruby/install-deps: - ruby/install-deps:
bundler-version: '2.3.8' bundler-version: '2.3.26'
key: ruby<< parameters.ruby-version >>-gems-v1 key: ruby<< parameters.ruby-version >>-gems-v1
wait-db: wait-db:
steps: steps:
@ -221,5 +221,5 @@ workflows:
pkg-manager: yarn pkg-manager: yarn
requires: requires:
- build - build
version: lts version: '16.18'
yarn-run: test:jest yarn-run: test:jest

View file

@ -9,7 +9,7 @@ FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
# The value is a comma-separated list of allowed domains # The value is a comma-separated list of allowed domains
ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev" ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev"
# [Choice] Node.js version: lts/*, 16, 14, 12, 10 # [Choice] Node.js version: lts/*, 18, 16, 14
ARG NODE_VERSION="lts/*" ARG NODE_VERSION="lts/*"
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1" RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"

View file

@ -2,7 +2,7 @@
"name": "Mastodon", "name": "Mastodon",
"dockerComposeFile": "docker-compose.yml", "dockerComposeFile": "docker-compose.yml",
"service": "app", "service": "app",
"workspaceFolder": "/workspaces/mastodon", "workspaceFolder": "/mastodon",
// Set *default* container specific settings.json values on container create. // Set *default* container specific settings.json values on container create.
"settings": {}, "settings": {},
@ -20,7 +20,7 @@
"forwardPorts": [3000, 4000], "forwardPorts": [3000, 4000],
// Use 'postCreateCommand' to run commands after the container is created. // Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": "bundle install --path vendor/bundle && yarn install && git checkout -- Gemfile.lock && ./bin/rails db:setup", "postCreateCommand": ".devcontainer/post-create.sh",
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode" "remoteUser": "vscode"

View file

@ -11,9 +11,9 @@ services:
# Use -bullseye variants on local arm64/Apple Silicon. # Use -bullseye variants on local arm64/Apple Silicon.
VARIANT: '3.0-bullseye' VARIANT: '3.0-bullseye'
# Optional Node.js version to install # Optional Node.js version to install
NODE_VERSION: '14' NODE_VERSION: '16'
volumes: volumes:
- ..:/workspaces/mastodon:cached - ..:/mastodon:cached
environment: environment:
RAILS_ENV: development RAILS_ENV: development
NODE_ENV: development NODE_ENV: development

21
.devcontainer/post-create.sh Executable file
View file

@ -0,0 +1,21 @@
#!/bin/bash
set -e # Fail the whole script on first error
# Fetch Ruby gem dependencies
bundle install --path vendor/bundle --with='development test'
# Fetch Javascript dependencies
yarn install
# Make Gemfile.lock pristine again
git checkout -- Gemfile.lock
# [re]create, migrate, and seed the test database
RAILS_ENV=test ./bin/rails db:setup
# Precompile assets for development
RAILS_ENV=development ./bin/rails assets:precompile
# Precompile assets for test
RAILS_ENV=test NODE_ENV=tests ./bin/rails assets:precompile

View file

@ -54,7 +54,7 @@ VAPID_PUBLIC_KEY=
# Sending mail # Sending mail
# ------------ # ------------
SMTP_SERVER=smtp.mailgun.org SMTP_SERVER=
SMTP_PORT=587 SMTP_PORT=587
SMTP_LOGIN= SMTP_LOGIN=
SMTP_PASSWORD= SMTP_PASSWORD=

View file

@ -1,6 +1,10 @@
module.exports = { module.exports = {
root: true, root: true,
extends: [
'eslint:recommended',
],
env: { env: {
browser: true, browser: true,
node: true, node: true,
@ -64,8 +68,8 @@ module.exports = {
eqeqeq: 'error', eqeqeq: 'error',
indent: ['warn', 2], indent: ['warn', 2],
'jsx-quotes': ['error', 'prefer-single'], 'jsx-quotes': ['error', 'prefer-single'],
'no-case-declarations': 'off',
'no-catch-shadow': 'error', 'no-catch-shadow': 'error',
'no-cond-assign': 'error',
'no-console': [ 'no-console': [
'warn', 'warn',
{ {
@ -75,18 +79,16 @@ module.exports = {
], ],
}, },
], ],
'no-fallthrough': 'error', 'no-empty': 'off',
'no-irregular-whitespace': 'error',
'no-mixed-spaces-and-tabs': 'warn',
'no-nested-ternary': 'warn', 'no-nested-ternary': 'warn',
'no-prototype-builtins': 'off',
'no-restricted-properties': [ 'no-restricted-properties': [
'error', 'error',
{ property: 'substring', message: 'Use .slice instead of .substring.' }, { property: 'substring', message: 'Use .slice instead of .substring.' },
{ property: 'substr', message: 'Use .slice instead of .substr.' }, { property: 'substr', message: 'Use .slice instead of .substr.' },
], ],
'no-self-assign': 'off',
'no-trailing-spaces': 'warn', 'no-trailing-spaces': 'warn',
'no-undef': 'error',
'no-unreachable': 'error',
'no-unused-expressions': 'error', 'no-unused-expressions': 'error',
'no-unused-vars': [ 'no-unused-vars': [
'error', 'error',
@ -96,6 +98,7 @@ module.exports = {
ignoreRestSiblings: true, ignoreRestSiblings: true,
}, },
], ],
'no-useless-escape': 'off',
'object-curly-spacing': ['error', 'always'], 'object-curly-spacing': ['error', 'always'],
'padded-blocks': [ 'padded-blocks': [
'error', 'error',
@ -105,7 +108,6 @@ module.exports = {
], ],
quotes: ['error', 'single'], quotes: ['error', 'single'],
semi: 'error', semi: 'error',
strict: 'off',
'valid-typeof': 'error', 'valid-typeof': 'error',
'react/jsx-boolean-value': 'error', 'react/jsx-boolean-value': 'error',

View file

@ -18,6 +18,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: hadolint/hadolint-action@v3.0.0
- uses: docker/setup-qemu-action@v2 - uses: docker/setup-qemu-action@v2
- uses: docker/setup-buildx-action@v2 - uses: docker/setup-buildx-action@v2
- uses: docker/login-action@v2 - uses: docker/login-action@v2

62
.github/workflows/codeql.yml vendored Normal file
View file

@ -0,0 +1,62 @@
name: 'CodeQL'
on:
push:
branches: ['main']
pull_request:
# The branches below must be a subset of the branches above
branches: ['main']
schedule:
- cron: '22 6 * * 1'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ['javascript', 'ruby']
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: '/language:${{matrix.language}}'

2
.nvmrc
View file

@ -1 +1 @@
14 16

View file

@ -1,12 +1,18 @@
require: require:
- rubocop-rails - rubocop-rails
- rubocop-rspec
- rubocop-performance
AllCops: AllCops:
TargetRubyVersion: 2.7 TargetRubyVersion: 2.7
NewCops: disable DisplayCopNames: true
DisplayStyleGuide: true
ExtraDetails: true
UseCache: true
CacheRootDirectory: tmp
NewCops: enable
Exclude: Exclude:
- 'spec/**/*' - db/schema.rb
- 'db/**/*'
- 'app/views/**/*' - 'app/views/**/*'
- 'config/**/*' - 'config/**/*'
- 'bin/*' - 'bin/*'
@ -67,15 +73,57 @@ Lint/UselessAccessModifier:
- class_methods - class_methods
Metrics/AbcSize: Metrics/AbcSize:
Max: 115 Max: 34 # RuboCop default 17
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - 'lib/**/*cli*.rb'
- db/*migrate/**/*
- lib/paperclip/color_extractor.rb
- app/workers/scheduler/follow_recommendations_scheduler.rb
- app/services/activitypub/fetch*_service.rb
- lib/paperclip/**/*
CountRepeatedAttributes: false
AllowedMethods:
- update_media_attachments!
- account_link_to
- attempt_oembed
- build_crutches
- calculate_scores
- cc
- dump_actor!
- filter_from_home?
- hydrate
- import_bookmarks!
- import_relationships!
- initialize
- link_to_mention
- log_target
- matches_time_window?
- parse_metadata
- perform_statuses_search!
- privatize_media_attachments!
- process_update
- publish_media_attachments!
- remotable_attachment
- render_initial_state
- render_with_cache
- searchable_by
- self.cached_filters_for
- set_fetchable_attributes!
- signed_request_actor
- statuses_to_delete
- update_poll!
Metrics/BlockLength: Metrics/BlockLength:
Max: 55 Max: 55
Exclude: Exclude:
- 'lib/tasks/**/*'
- 'lib/mastodon/*_cli.rb' - 'lib/mastodon/*_cli.rb'
CountComments: false
CountAsOne: [array, heredoc]
AllowedMethods:
- task
- namespace
- class_methods
- included
Metrics/BlockNesting: Metrics/BlockNesting:
Max: 3 Max: 3
@ -85,34 +133,144 @@ Metrics/BlockNesting:
Metrics/ClassLength: Metrics/ClassLength:
CountComments: false CountComments: false
Max: 500 Max: 500
CountAsOne: [array, heredoc]
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - 'lib/mastodon/*_cli.rb'
Metrics/CyclomaticComplexity: Metrics/CyclomaticComplexity:
Max: 25 Max: 12
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - lib/mastodon/*cli*.rb
- db/*migrate/**/*
AllowedMethods:
- attempt_oembed
- blocked?
- build_crutches
- calculate_scores
- cc
- discover_endpoint!
- filter_from_home?
- hydrate
- klass
- link_to_mention
- log_target
- matches_time_window?
- patch_for_forwarding!
- preprocess_attributes!
- process_update
- remotable_attachment
- scan_text!
- self.cached_filters_for
- set_fetchable_attributes!
- setup_redis_env_url
- update_media_attachments!
Layout/LineLength: Layout/LineLength:
Max: 140 # RuboCop default 120
AllowHeredoc: true
AllowURI: true AllowURI: true
Enabled: false IgnoreCopDirectives: true
AllowedPatterns:
# Allow comments to be long lines
- !ruby/regexp / \# .*$/
- !ruby/regexp /^\# .*$/
Exclude:
- lib/**/*cli*.rb
- db/*migrate/**/*
- db/seeds/**/*
Metrics/MethodLength: Metrics/MethodLength:
CountComments: false CountComments: false
Max: 65 CountAsOne: [array, heredoc]
Max: 25 # RuboCop default 10
Exclude: Exclude:
- 'lib/mastodon/*_cli.rb' - 'lib/mastodon/*_cli.rb'
AllowedMethods:
- account_link_to
- attempt_oembed
- body_with_limit
- build_crutches
- cached_filters_for
- calculate_scores
- check_webfinger!
- clean_feeds!
- collection_items
- collection_presenter
- copy_account_notes!
- deduplicate_accounts!
- deduplicate_conversations!
- deduplicate_local_accounts!
- deduplicate_statuses!
- deduplicate_tags!
- deduplicate_users!
- discover_endpoint!
- extract_extra_uris_with_indices
- extract_hashtags_with_indices
- extract_mentions_or_lists_with_indices
- filter_from_home?
- from_elasticsearch
- handle_explicit_update!
- handle_mark_as_sensitive!
- hsl_to_rgb
- import_bookmarks!
- import_domain_blocks!
- import_relationships!
- ldap_options
- matches_time_window?
- outbox_presenter
- pam_get_user
- parallelize_with_progress
- parse_and_transform
- patch_for_forwarding!
- populate_home
- post_process_style
- preload_cache_collection_target_statuses
- privatize_media_attachments!
- provides_callback_for
- publish_media_attachments!
- relevant_account_timestamp
- remotable_attachment
- rgb_to_hsl
- rss_status_content_format
- set_fetchable_attributes!
- setup_redis_env_url
- signed_request_actor
- to_preview_card_attributes
- upgrade_storage_filesystem
- upgrade_storage_s3
- user_settings_params
- hydrate
- cc
- self_destruct
Metrics/ModuleLength: Metrics/ModuleLength:
CountComments: false CountComments: false
Max: 200 Max: 200
CountAsOne: [array, heredoc]
Metrics/ParameterLists: Metrics/ParameterLists:
Max: 5 Max: 5 # RuboCop default 5
CountKeywordArgs: true CountKeywordArgs: true # RuboCop default true
MaxOptionalParameters: 3 # RuboCop default 3
Exclude:
- app/models/concerns/account_interactions.rb
- app/services/activitypub/fetch_remote_account_service.rb
- app/services/activitypub/fetch_remote_actor_service.rb
Metrics/PerceivedComplexity: Metrics/PerceivedComplexity:
Max: 25 Max: 16 # RuboCop default 8
AllowedMethods:
- attempt_oembed
- build_crutches
- calculate_scores
- deduplicate_users!
- discover_endpoint!
- filter_from_home?
- hydrate
- patch_for_forwarding!
- process_update
- remove_orphans
- update_media_attachments!
Naming/MemoizedInstanceVariableName: Naming/MemoizedInstanceVariableName:
Enabled: false Enabled: false
@ -267,9 +425,6 @@ Style/PercentLiteralDelimiters:
Style/PerlBackrefs: Style/PerlBackrefs:
AutoCorrect: false AutoCorrect: false
Style/RedundantAssignment:
Enabled: false
Style/RedundantFetchBlock: Style/RedundantFetchBlock:
Enabled: true Enabled: true
@ -292,7 +447,7 @@ Style/RegexpLiteral:
Enabled: false Enabled: false
Style/RescueStandardError: Style/RescueStandardError:
Enabled: false Enabled: true
Style/SignalException: Style/SignalException:
Enabled: false Enabled: false
@ -311,3 +466,14 @@ Style/TrailingCommaInHashLiteral:
Style/UnpackFirst: Style/UnpackFirst:
Enabled: false Enabled: false
RSpec/ScatteredSetup:
Enabled: false
RSpec/ImplicitExpect:
Enabled: false
RSpec/NamedSubject:
Enabled: false
RSpec/DescribeClass:
Enabled: false
RSpec/LetSetup:
Enabled: false

22
Aptfile
View file

@ -1,26 +1,4 @@
ffmpeg ffmpeg
libicu[0-9][0-9]
libicu-dev
libidn12
libidn-dev
libpq-dev libpq-dev
libxdamage1 libxdamage1
libxfixes3 libxfixes3
zlib1g-dev
libcairo2
libcroco3
libdatrie1
libgdk-pixbuf2.0-0
libgraphite2-3
libharfbuzz0b
libpango-1.0-0
libpangocairo-1.0-0
libpangoft2-1.0-0
libpixman-1-0
librsvg2-2
libthai-data
libthai0
libvpx[5-9]
libxcb-render0
libxcb-shm0
libxrender1

View file

@ -40,7 +40,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
## Attribution ## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org [homepage]: https://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/ [version]: https://contributor-covenant.org/version/1/4/

View file

@ -15,7 +15,8 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
WORKDIR /opt/mastodon WORKDIR /opt/mastodon
COPY Gemfile* package.json yarn.lock /opt/mastodon/ COPY Gemfile* package.json yarn.lock /opt/mastodon/
RUN apt update && \ # hadolint ignore=DL3008
RUN apt-get update && \
apt-get install -y --no-install-recommends build-essential \ apt-get install -y --no-install-recommends build-essential \
ca-certificates \ ca-certificates \
git \ git \
@ -50,10 +51,12 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
ENV DEBIAN_FRONTEND="noninteractive" \ ENV DEBIAN_FRONTEND="noninteractive" \
PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin" PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin"
# Ignoreing these here since we don't want to pin any versions and the Debian image removes apt-get content after use
# hadolint ignore=DL3008,DL3009
RUN apt-get update && \ RUN apt-get update && \
echo "Etc/UTC" > /etc/localtime && \ echo "Etc/UTC" > /etc/localtime && \
groupadd -g "${GID}" mastodon && \ groupadd -g "${GID}" mastodon && \
useradd -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \ useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
apt-get -y --no-install-recommends install whois \ apt-get -y --no-install-recommends install whois \
wget \ wget \
procps \ procps \

17
Gemfile
View file

@ -19,7 +19,7 @@ gem 'pghero', '~> 2.8'
gem 'dotenv-rails', '~> 2.8' gem 'dotenv-rails', '~> 2.8'
gem 'aws-sdk-s3', '~> 1.117', require: false gem 'aws-sdk-s3', '~> 1.117', require: false
gem 'fog-core', '<= 2.1.0' gem 'fog-core', '<= 2.4.0'
gem 'fog-openstack', '~> 0.3', require: false gem 'fog-openstack', '~> 0.3', require: false
gem 'kt-paperclip', '~> 7.1' gem 'kt-paperclip', '~> 7.1'
gem 'blurhash', '~> 0.1' gem 'blurhash', '~> 0.1'
@ -67,7 +67,7 @@ gem 'ox', '~> 2.14'
gem 'parslet' gem 'parslet'
gem 'posix-spawn' gem 'posix-spawn'
gem 'public_suffix', '~> 5.0' gem 'public_suffix', '~> 5.0'
gem 'pundit', '~> 2.2' gem 'pundit', '~> 2.3'
gem 'premailer-rails' gem 'premailer-rails'
gem 'rack-attack', '~> 6.6' gem 'rack-attack', '~> 6.6'
gem 'rack-cors', '~> 1.1', require: 'rack/cors' gem 'rack-cors', '~> 1.1', require: 'rack/cors'
@ -79,7 +79,7 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
gem 'rqrcode', '~> 2.1' gem 'rqrcode', '~> 2.1'
gem 'ruby-progressbar', '~> 1.11' gem 'ruby-progressbar', '~> 1.11'
gem 'sanitize', '~> 6.0' gem 'sanitize', '~> 6.0'
gem 'scenic', '~> 1.6' gem 'scenic', '~> 1.7'
gem 'sidekiq', '~> 6.5' gem 'sidekiq', '~> 6.5'
gem 'sidekiq-scheduler', '~> 4.0' gem 'sidekiq-scheduler', '~> 4.0'
gem 'sidekiq-unique-jobs', '~> 7.1' gem 'sidekiq-unique-jobs', '~> 7.1'
@ -107,6 +107,10 @@ group :development, :test do
gem 'pry-byebug', '~> 3.10' gem 'pry-byebug', '~> 3.10'
gem 'pry-rails', '~> 0.3' gem 'pry-rails', '~> 0.3'
gem 'rspec-rails', '~> 5.1' gem 'rspec-rails', '~> 5.1'
gem 'rubocop-performance', require: false
gem 'rubocop-rails', require: false
gem 'rubocop-rspec', require: false
gem 'rubocop', require: false
end end
group :production, :test do group :production, :test do
@ -117,13 +121,14 @@ group :test do
gem 'capybara', '~> 3.38' gem 'capybara', '~> 3.38'
gem 'climate_control', '~> 0.2' gem 'climate_control', '~> 0.2'
gem 'faker', '~> 3.0' gem 'faker', '~> 3.0'
gem 'json-schema', '~> 3.0'
gem 'microformats', '~> 4.4' gem 'microformats', '~> 4.4'
gem 'rack-test', '~> 2.0'
gem 'rails-controller-testing', '~> 1.0' gem 'rails-controller-testing', '~> 1.0'
gem 'rspec_junit_formatter', '~> 0.6'
gem 'rspec-sidekiq', '~> 3.1' gem 'rspec-sidekiq', '~> 3.1'
gem 'simplecov', '~> 0.21', require: false gem 'simplecov', '~> 0.21', require: false
gem 'webmock', '~> 3.18' gem 'webmock', '~> 3.18'
gem 'rspec_junit_formatter', '~> 0.6'
gem 'rack-test', '~> 2.0'
end end
group :development do group :development do
@ -135,8 +140,6 @@ group :development do
gem 'letter_opener', '~> 1.8' gem 'letter_opener', '~> 1.8'
gem 'letter_opener_web', '~> 2.0' gem 'letter_opener_web', '~> 2.0'
gem 'memory_profiler' gem 'memory_profiler'
gem 'rubocop', '~> 1.30', require: false
gem 'rubocop-rails', '~> 2.15', require: false
gem 'brakeman', '~> 5.4', require: false gem 'brakeman', '~> 5.4', require: false
gem 'bundler-audit', '~> 0.9', require: false gem 'bundler-audit', '~> 0.9', require: false

View file

@ -226,7 +226,7 @@ GEM
erubi (1.11.0) erubi (1.11.0)
et-orbi (1.2.7) et-orbi (1.2.7)
tzinfo tzinfo
excon (0.76.0) excon (0.95.0)
fabrication (2.30.0) fabrication (2.30.0)
faker (3.0.0) faker (3.0.0)
i18n (>= 1.8.11, < 2) i18n (>= 1.8.11, < 2)
@ -271,7 +271,7 @@ GEM
fog-core (>= 1.45, <= 2.1.0) fog-core (>= 1.45, <= 2.1.0)
fog-json (>= 1.0) fog-json (>= 1.0)
ipaddress (>= 0.8) ipaddress (>= 0.8)
formatador (0.2.5) formatador (0.3.0)
fugit (1.7.1) fugit (1.7.1)
et-orbi (~> 1, >= 1.2.7) et-orbi (~> 1, >= 1.2.7)
raabro (~> 1.4) raabro (~> 1.4)
@ -299,7 +299,7 @@ GEM
hiredis (0.6.3) hiredis (0.6.3)
hkdf (0.3.0) hkdf (0.3.0)
htmlentities (4.3.4) htmlentities (4.3.4)
http (5.1.0) http (5.1.1)
addressable (~> 2.8) addressable (~> 2.8)
http-cookie (~> 1.0) http-cookie (~> 1.0)
http-form_data (~> 2.2) http-form_data (~> 2.2)
@ -344,6 +344,8 @@ GEM
json-ld-preloaded (3.2.2) json-ld-preloaded (3.2.2)
json-ld (~> 3.2) json-ld (~> 3.2)
rdf (~> 3.2) rdf (~> 3.2)
json-schema (3.0.0)
addressable (>= 2.8)
jsonapi-renderer (0.2.2) jsonapi-renderer (0.2.2)
jwt (2.4.1) jwt (2.4.1)
kaminari (1.2.2) kaminari (1.2.2)
@ -484,7 +486,7 @@ GEM
public_suffix (5.0.1) public_suffix (5.0.1)
puma (5.6.5) puma (5.6.5)
nio4r (~> 2.0) nio4r (~> 2.0)
pundit (2.2.0) pundit (2.3.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
raabro (1.4.0) raabro (1.4.0)
racc (1.6.1) racc (1.6.1)
@ -585,21 +587,27 @@ GEM
rspec-support (3.11.1) rspec-support (3.11.1)
rspec_junit_formatter (0.6.0) rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0) rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.30.1) rubocop (1.39.0)
json (~> 2.3)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 3.1.0.0) parser (>= 3.1.2.1)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0) regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0) rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.18.0, < 2.0) rubocop-ast (>= 1.23.0, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0) unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.18.0) rubocop-ast (1.23.0)
parser (>= 3.1.1.0) parser (>= 3.1.1.0)
rubocop-rails (2.15.0) rubocop-performance (1.15.1)
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
rubocop-rails (2.17.2)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.33.0, < 2.0)
rubocop-rspec (2.15.0)
rubocop (~> 1.33)
ruby-progressbar (1.11.0) ruby-progressbar (1.11.0)
ruby-saml (1.13.0) ruby-saml (1.13.0)
nokogiri (>= 1.10.5) nokogiri (>= 1.10.5)
@ -612,7 +620,7 @@ GEM
sanitize (6.0.0) sanitize (6.0.0)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.12.0) nokogiri (>= 1.12.0)
scenic (1.6.0) scenic (1.7.0)
activerecord (>= 4.0.0) activerecord (>= 4.0.0)
railties (>= 4.0.0) railties (>= 4.0.0)
semantic_range (3.0.0) semantic_range (3.0.0)
@ -777,7 +785,7 @@ DEPENDENCIES
faker (~> 3.0) faker (~> 3.0)
fast_blank (~> 1.0) fast_blank (~> 1.0)
fastimage fastimage
fog-core (<= 2.1.0) fog-core (<= 2.4.0)
fog-openstack (~> 0.3) fog-openstack (~> 0.3)
fuubar (~> 2.5) fuubar (~> 2.5)
gitlab-omniauth-openid-connect (~> 0.10.0) gitlab-omniauth-openid-connect (~> 0.10.0)
@ -791,6 +799,7 @@ DEPENDENCIES
idn-ruby idn-ruby
json-ld json-ld
json-ld-preloaded (~> 3.2) json-ld-preloaded (~> 3.2)
json-schema (~> 3.0)
kaminari (~> 1.2) kaminari (~> 1.2)
kt-paperclip (~> 7.1) kt-paperclip (~> 7.1)
letter_opener (~> 1.8) letter_opener (~> 1.8)
@ -822,7 +831,7 @@ DEPENDENCIES
pry-rails (~> 0.3) pry-rails (~> 0.3)
public_suffix (~> 5.0) public_suffix (~> 5.0)
puma (~> 5.6) puma (~> 5.6)
pundit (~> 2.2) pundit (~> 2.3)
rack (~> 2.2.4) rack (~> 2.2.4)
rack-attack (~> 6.6) rack-attack (~> 6.6)
rack-cors (~> 1.1) rack-cors (~> 1.1)
@ -840,11 +849,13 @@ DEPENDENCIES
rspec-rails (~> 5.1) rspec-rails (~> 5.1)
rspec-sidekiq (~> 3.1) rspec-sidekiq (~> 3.1)
rspec_junit_formatter (~> 0.6) rspec_junit_formatter (~> 0.6)
rubocop (~> 1.30) rubocop
rubocop-rails (~> 2.15) rubocop-performance
rubocop-rails
rubocop-rspec
ruby-progressbar (~> 1.11) ruby-progressbar (~> 1.11)
sanitize (~> 6.0) sanitize (~> 6.0)
scenic (~> 1.6) scenic (~> 1.7)
sidekiq (~> 6.5) sidekiq (~> 6.5)
sidekiq-bulk (~> 0.2.0) sidekiq-bulk (~> 0.2.0)
sidekiq-scheduler (~> 4.0) sidekiq-scheduler (~> 4.0)
@ -866,3 +877,9 @@ DEPENDENCIES
webpacker (~> 5.4) webpacker (~> 5.4)
webpush! webpush!
xorcist (~> 1.1) xorcist (~> 1.1)
RUBY VERSION
ruby 3.0.4p208
BUNDLED WITH
2.2.33

View file

@ -73,7 +73,7 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
- **PostgreSQL** 9.5+ - **PostgreSQL** 9.5+
- **Redis** 4+ - **Redis** 4+
- **Ruby** 2.7+ - **Ruby** 2.7+
- **Node.js** 14+ - **Node.js** 16+
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation. The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.

View file

@ -55,12 +55,8 @@ module Admin
def update def update
authorize :domain_block, :update? authorize :domain_block, :update?
@domain_block.update(update_params) if @domain_block.update(update_params)
DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
severity_changed = @domain_block.severity_changed?
if @domain_block.save
DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
log_action :update, @domain_block log_action :update, @domain_block
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg') redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
else else

View file

@ -3,7 +3,7 @@
module Admin module Admin
class RelaysController < BaseController class RelaysController < BaseController
before_action :set_relay, except: [:index, :new, :create] before_action :set_relay, except: [:index, :new, :create]
before_action :require_signatures_enabled!, only: [:new, :create, :enable] before_action :warn_signatures_not_enabled!, only: [:new, :create, :enable]
def index def index
authorize :relay, :update? authorize :relay, :update?
@ -56,8 +56,8 @@ module Admin
params.require(:relay).permit(:inbox_url) params.require(:relay).permit(:inbox_url)
end end
def require_signatures_enabled! def warn_signatures_not_enabled!
redirect_to admin_relays_path, alert: I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode? flash.now[:error] = I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
end end
end end
end end

View file

@ -16,6 +16,26 @@ class Api::BaseController < ApplicationController
protect_from_forgery with: :null_session protect_from_forgery with: :null_session
content_security_policy do |p|
# Set every directive that does not have a fallback
p.default_src :none
p.frame_ancestors :none
p.form_action :none
# Disable every directive with a fallback to cut on response size
p.base_uri false
p.font_src false
p.img_src false
p.style_src false
p.media_src false
p.frame_src false
p.manifest_src false
p.connect_src false
p.script_src false
p.child_src false
p.worker_src false
end
rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e| rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
render json: { error: e.to_s }, status: 422 render json: { error: e.to_s }, status: 422
end end

View file

@ -40,10 +40,8 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
def update def update
authorize @domain_block, :update? authorize @domain_block, :update?
@domain_block.update(domain_block_params) @domain_block.update!(domain_block_params)
severity_changed = @domain_block.severity_changed? DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
@domain_block.save!
DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
log_action :update, @domain_block log_action :update, @domain_block
render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
end end

View file

@ -31,7 +31,7 @@ class Api::V1::NotificationsController < Api::BaseController
private private
def load_notifications def load_notifications
notifications = browserable_account_notifications.includes(from_account: :account_stat).to_a_paginated_by_id( notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_paginated_by_id(
limit_param(DEFAULT_NOTIFICATIONS_LIMIT), limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
params_slice(:max_id, :since_id, :min_id) params_slice(:max_id, :since_id, :min_id)
) )

View file

@ -10,6 +10,8 @@ class Auth::PasswordsController < Devise::PasswordsController
super do |resource| super do |resource|
if resource.errors.empty? if resource.errors.empty?
resource.session_activations.destroy_all resource.session_activations.destroy_all
resource.revoke_access!
end end
end end
end end

View file

@ -56,8 +56,8 @@ class Auth::RegistrationsController < Devise::RegistrationsController
end end
def configure_sign_up_params def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up) do |u| devise_parameter_sanitizer.permit(:sign_up) do |user_params|
u.permit({ account_attributes: [:username, :display_name], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement, :website, :confirm_password) user_params.permit({ account_attributes: [:username, :display_name], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement, :website, :confirm_password)
end end
end end

View file

@ -58,7 +58,7 @@ module RateLimitHeaders
end end
def api_throttle_data def api_throttle_data
most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_, v| v[:limit] - v[:count] } most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_key, value| value[:limit] - value[:count] }
request.env['rack.attack.throttle_data'][most_limited_type] request.env['rack.attack.throttle_data'][most_limited_type]
end end

View file

@ -28,8 +28,8 @@ module SignatureVerification
end end
class SignatureParamsTransformer < Parslet::Transform class SignatureParamsTransformer < Parslet::Transform
rule(params: subtree(:p)) do rule(params: subtree(:param)) do
(p.is_a?(Array) ? p : [p]).each_with_object({}) { |(key, val), h| h[key] = val } (param.is_a?(Array) ? param : [param]).each_with_object({}) { |(key, value), hash| hash[key] = value }
end end
rule(param: { key: simple(:key), value: simple(:val) }) do rule(param: { key: simple(:key), value: simple(:val) }) do

View file

@ -63,7 +63,7 @@ class FollowerAccountsController < ApplicationController
id: account_followers_url(@account, page: params.fetch(:page, 1)), id: account_followers_url(@account, page: params.fetch(:page, 1)),
type: :ordered, type: :ordered,
size: @account.followers_count, size: @account.followers_count,
items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.account) }, items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.account) },
part_of: account_followers_url(@account), part_of: account_followers_url(@account),
next: next_page_url, next: next_page_url,
prev: prev_page_url prev: prev_page_url

View file

@ -66,7 +66,7 @@ class FollowingAccountsController < ApplicationController
id: account_following_index_url(@account, page: params.fetch(:page, 1)), id: account_following_index_url(@account, page: params.fetch(:page, 1)),
type: :ordered, type: :ordered,
size: @account.following_count, size: @account.following_count,
items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.target_account) }, items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.target_account) },
part_of: account_following_index_url(@account), part_of: account_following_index_url(@account),
next: next_page_url, next: next_page_url,
prev: prev_page_url prev: prev_page_url

View file

@ -12,8 +12,8 @@ class MediaController < ApplicationController
before_action :check_playable, only: :player before_action :check_playable, only: :player
before_action :allow_iframing, only: :player before_action :allow_iframing, only: :player
content_security_policy only: :player do |p| content_security_policy only: :player do |policy|
p.frame_ancestors(false) policy.frame_ancestors(false)
end end
def show def show

View file

@ -17,8 +17,8 @@ class StatusesController < ApplicationController
skip_around_action :set_locale, if: -> { request.format == :json } skip_around_action :set_locale, if: -> { request.format == :json }
skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode? skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode?
content_security_policy only: :embed do |p| content_security_policy only: :embed do |policy|
p.frame_ancestors(false) policy.frame_ancestors(false)
end end
def show def show

View file

@ -65,7 +65,7 @@ class TagsController < ApplicationController
id: tag_url(@tag), id: tag_url(@tag),
type: :ordered, type: :ordered,
size: @tag.statuses.count, size: @tag.statuses.count,
items: @statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) } items: @statuses.map { |status| ActivityPub::TagManager.instance.uri_for(status) }
) )
end end
end end

View file

@ -23,19 +23,28 @@ module FormattingHelper
before_html = begin before_html = begin
if status.spoiler_text? if status.spoiler_text?
"<p><strong>#{I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)}</strong> #{h(status.spoiler_text)}</p><hr />" tag.p do
else tag.strong do
'' I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)
end
status.spoiler_text
end + tag.hr
end end
end.html_safe # rubocop:disable Rails/OutputSafety end
after_html = begin after_html = begin
if status.preloadable_poll if status.preloadable_poll
"<p>#{status.preloadable_poll.options.map { |o| "<input type=#{status.preloadable_poll.multiple? ? 'checkbox' : 'radio'} disabled /> #{h(o)}" }.join('<br />')}</p>" tag.p do
else safe_join(
'' status.preloadable_poll.options.map do |o|
tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', o, disabled: true)
end,
tag.br
)
end
end end
end.html_safe # rubocop:disable Rails/OutputSafety end
prerender_custom_emojis( prerender_custom_emojis(
safe_join([before_html, html, after_html]), safe_join([before_html, html, after_html]),

View file

@ -190,12 +190,15 @@ module LanguagesHelper
ISO_639_3 = { ISO_639_3 = {
ast: ['Asturian', 'Asturianu'].freeze, ast: ['Asturian', 'Asturianu'].freeze,
ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze, ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze,
cnr: ['Montenegrin', 'crnogorski'].freeze,
jbo: ['Lojban', 'la .lojban.'].freeze, jbo: ['Lojban', 'la .lojban.'].freeze,
kab: ['Kabyle', 'Taqbaylit'].freeze, kab: ['Kabyle', 'Taqbaylit'].freeze,
kmr: ['Kurmanji (Kurdish)', 'Kurmancî'].freeze, kmr: ['Kurmanji (Kurdish)', 'Kurmancî'].freeze,
ldn: ['Láadan', 'Láadan'].freeze, ldn: ['Láadan', 'Láadan'].freeze,
lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze, lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze,
sco: ['Scots', 'Scots'].freeze, sco: ['Scots', 'Scots'].freeze,
sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze,
smj: ['Lule Sami', 'Julevsámegiella'].freeze,
tok: ['Toki Pona', 'toki pona'].freeze, tok: ['Toki Pona', 'toki pona'].freeze,
zba: ['Balaibalan', 'باليبلن'].freeze, zba: ['Balaibalan', 'باليبلن'].freeze,
zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze, zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze,

View file

@ -21,7 +21,7 @@ module StatusesHelper
def media_summary(status) def media_summary(status)
attachments = { image: 0, video: 0, audio: 0 } attachments = { image: 0, video: 0, audio: 0 }
status.media_attachments.each do |media| status.ordered_media_attachments.each do |media|
if media.video? if media.video?
attachments[:video] += 1 attachments[:video] += 1
elsif media.audio? elsif media.audio?

View file

@ -1,2 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="79" viewBox="0 0 79 75"><symbol id="logo-symbol-icon"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></symbol><use xlink:href="#logo-symbol-icon" style="color:#fff" /></svg> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="79" viewBox="0 0 79 75"><symbol id="logo-symbol-icon"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></symbol><use xlink:href="#logo-symbol-icon"/></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -7,5 +7,5 @@
<stop stop-color="#6364FF"/> <stop stop-color="#6364FF"/>
<stop offset="1" stop-color="#563ACC"/> <stop offset="1" stop-color="#563ACC"/>
</linearGradient> </linearGradient>
</defs></symbol><use xlink:href="#logo-symbol-wordmark" style="color:#fff"/> </defs></symbol><use xlink:href="#logo-symbol-wordmark"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -14,24 +14,24 @@ export function submitAccountNote(id, value) {
dispatch(submitAccountNoteSuccess(response.data)); dispatch(submitAccountNoteSuccess(response.data));
}).catch(error => dispatch(submitAccountNoteFail(error))); }).catch(error => dispatch(submitAccountNoteFail(error)));
}; };
}; }
export function submitAccountNoteRequest() { export function submitAccountNoteRequest() {
return { return {
type: ACCOUNT_NOTE_SUBMIT_REQUEST, type: ACCOUNT_NOTE_SUBMIT_REQUEST,
}; };
}; }
export function submitAccountNoteSuccess(relationship) { export function submitAccountNoteSuccess(relationship) {
return { return {
type: ACCOUNT_NOTE_SUBMIT_SUCCESS, type: ACCOUNT_NOTE_SUBMIT_SUCCESS,
relationship, relationship,
}; };
}; }
export function submitAccountNoteFail(error) { export function submitAccountNoteFail(error) {
return { return {
type: ACCOUNT_NOTE_SUBMIT_FAIL, type: ACCOUNT_NOTE_SUBMIT_FAIL,
error, error,
}; };
}; }

View file

@ -91,7 +91,7 @@ export function fetchAccount(id) {
dispatch(fetchAccountFail(id, error)); dispatch(fetchAccountFail(id, error));
}); });
}; };
}; }
export const lookupAccount = acct => (dispatch, getState) => { export const lookupAccount = acct => (dispatch, getState) => {
dispatch(lookupAccountRequest(acct)); dispatch(lookupAccountRequest(acct));
@ -126,13 +126,13 @@ export function fetchAccountRequest(id) {
type: ACCOUNT_FETCH_REQUEST, type: ACCOUNT_FETCH_REQUEST,
id, id,
}; };
}; }
export function fetchAccountSuccess() { export function fetchAccountSuccess() {
return { return {
type: ACCOUNT_FETCH_SUCCESS, type: ACCOUNT_FETCH_SUCCESS,
}; };
}; }
export function fetchAccountFail(id, error) { export function fetchAccountFail(id, error) {
return { return {
@ -141,7 +141,7 @@ export function fetchAccountFail(id, error) {
error, error,
skipAlert: true, skipAlert: true,
}; };
}; }
export function followAccount(id, options = { reblogs: true }) { export function followAccount(id, options = { reblogs: true }) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -156,7 +156,7 @@ export function followAccount(id, options = { reblogs: true }) {
dispatch(followAccountFail(error, locked)); dispatch(followAccountFail(error, locked));
}); });
}; };
}; }
export function unfollowAccount(id) { export function unfollowAccount(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -168,7 +168,7 @@ export function unfollowAccount(id) {
dispatch(unfollowAccountFail(error)); dispatch(unfollowAccountFail(error));
}); });
}; };
}; }
export function followAccountRequest(id, locked) { export function followAccountRequest(id, locked) {
return { return {
@ -177,7 +177,7 @@ export function followAccountRequest(id, locked) {
locked, locked,
skipLoading: true, skipLoading: true,
}; };
}; }
export function followAccountSuccess(relationship, alreadyFollowing) { export function followAccountSuccess(relationship, alreadyFollowing) {
return { return {
@ -186,7 +186,7 @@ export function followAccountSuccess(relationship, alreadyFollowing) {
alreadyFollowing, alreadyFollowing,
skipLoading: true, skipLoading: true,
}; };
}; }
export function followAccountFail(error, locked) { export function followAccountFail(error, locked) {
return { return {
@ -195,7 +195,7 @@ export function followAccountFail(error, locked) {
locked, locked,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unfollowAccountRequest(id) { export function unfollowAccountRequest(id) {
return { return {
@ -203,7 +203,7 @@ export function unfollowAccountRequest(id) {
id, id,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unfollowAccountSuccess(relationship, statuses) { export function unfollowAccountSuccess(relationship, statuses) {
return { return {
@ -212,7 +212,7 @@ export function unfollowAccountSuccess(relationship, statuses) {
statuses, statuses,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unfollowAccountFail(error) { export function unfollowAccountFail(error) {
return { return {
@ -220,7 +220,7 @@ export function unfollowAccountFail(error) {
error, error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function blockAccount(id) { export function blockAccount(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -233,7 +233,7 @@ export function blockAccount(id) {
dispatch(blockAccountFail(id, error)); dispatch(blockAccountFail(id, error));
}); });
}; };
}; }
export function unblockAccount(id) { export function unblockAccount(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -245,14 +245,14 @@ export function unblockAccount(id) {
dispatch(unblockAccountFail(id, error)); dispatch(unblockAccountFail(id, error));
}); });
}; };
}; }
export function blockAccountRequest(id) { export function blockAccountRequest(id) {
return { return {
type: ACCOUNT_BLOCK_REQUEST, type: ACCOUNT_BLOCK_REQUEST,
id, id,
}; };
}; }
export function blockAccountSuccess(relationship, statuses) { export function blockAccountSuccess(relationship, statuses) {
return { return {
@ -260,35 +260,35 @@ export function blockAccountSuccess(relationship, statuses) {
relationship, relationship,
statuses, statuses,
}; };
}; }
export function blockAccountFail(error) { export function blockAccountFail(error) {
return { return {
type: ACCOUNT_BLOCK_FAIL, type: ACCOUNT_BLOCK_FAIL,
error, error,
}; };
}; }
export function unblockAccountRequest(id) { export function unblockAccountRequest(id) {
return { return {
type: ACCOUNT_UNBLOCK_REQUEST, type: ACCOUNT_UNBLOCK_REQUEST,
id, id,
}; };
}; }
export function unblockAccountSuccess(relationship) { export function unblockAccountSuccess(relationship) {
return { return {
type: ACCOUNT_UNBLOCK_SUCCESS, type: ACCOUNT_UNBLOCK_SUCCESS,
relationship, relationship,
}; };
}; }
export function unblockAccountFail(error) { export function unblockAccountFail(error) {
return { return {
type: ACCOUNT_UNBLOCK_FAIL, type: ACCOUNT_UNBLOCK_FAIL,
error, error,
}; };
}; }
export function muteAccount(id, notifications, duration=0) { export function muteAccount(id, notifications, duration=0) {
@ -302,7 +302,7 @@ export function muteAccount(id, notifications, duration=0) {
dispatch(muteAccountFail(id, error)); dispatch(muteAccountFail(id, error));
}); });
}; };
}; }
export function unmuteAccount(id) { export function unmuteAccount(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -314,14 +314,14 @@ export function unmuteAccount(id) {
dispatch(unmuteAccountFail(id, error)); dispatch(unmuteAccountFail(id, error));
}); });
}; };
}; }
export function muteAccountRequest(id) { export function muteAccountRequest(id) {
return { return {
type: ACCOUNT_MUTE_REQUEST, type: ACCOUNT_MUTE_REQUEST,
id, id,
}; };
}; }
export function muteAccountSuccess(relationship, statuses) { export function muteAccountSuccess(relationship, statuses) {
return { return {
@ -329,35 +329,35 @@ export function muteAccountSuccess(relationship, statuses) {
relationship, relationship,
statuses, statuses,
}; };
}; }
export function muteAccountFail(error) { export function muteAccountFail(error) {
return { return {
type: ACCOUNT_MUTE_FAIL, type: ACCOUNT_MUTE_FAIL,
error, error,
}; };
}; }
export function unmuteAccountRequest(id) { export function unmuteAccountRequest(id) {
return { return {
type: ACCOUNT_UNMUTE_REQUEST, type: ACCOUNT_UNMUTE_REQUEST,
id, id,
}; };
}; }
export function unmuteAccountSuccess(relationship) { export function unmuteAccountSuccess(relationship) {
return { return {
type: ACCOUNT_UNMUTE_SUCCESS, type: ACCOUNT_UNMUTE_SUCCESS,
relationship, relationship,
}; };
}; }
export function unmuteAccountFail(error) { export function unmuteAccountFail(error) {
return { return {
type: ACCOUNT_UNMUTE_FAIL, type: ACCOUNT_UNMUTE_FAIL,
error, error,
}; };
}; }
export function fetchFollowers(id) { export function fetchFollowers(id) {
@ -374,14 +374,14 @@ export function fetchFollowers(id) {
dispatch(fetchFollowersFail(id, error)); dispatch(fetchFollowersFail(id, error));
}); });
}; };
}; }
export function fetchFollowersRequest(id) { export function fetchFollowersRequest(id) {
return { return {
type: FOLLOWERS_FETCH_REQUEST, type: FOLLOWERS_FETCH_REQUEST,
id, id,
}; };
}; }
export function fetchFollowersSuccess(id, accounts, next) { export function fetchFollowersSuccess(id, accounts, next) {
return { return {
@ -390,7 +390,7 @@ export function fetchFollowersSuccess(id, accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function fetchFollowersFail(id, error) { export function fetchFollowersFail(id, error) {
return { return {
@ -399,7 +399,7 @@ export function fetchFollowersFail(id, error) {
error, error,
skipNotFound: true, skipNotFound: true,
}; };
}; }
export function expandFollowers(id) { export function expandFollowers(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -421,14 +421,14 @@ export function expandFollowers(id) {
dispatch(expandFollowersFail(id, error)); dispatch(expandFollowersFail(id, error));
}); });
}; };
}; }
export function expandFollowersRequest(id) { export function expandFollowersRequest(id) {
return { return {
type: FOLLOWERS_EXPAND_REQUEST, type: FOLLOWERS_EXPAND_REQUEST,
id, id,
}; };
}; }
export function expandFollowersSuccess(id, accounts, next) { export function expandFollowersSuccess(id, accounts, next) {
return { return {
@ -437,7 +437,7 @@ export function expandFollowersSuccess(id, accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function expandFollowersFail(id, error) { export function expandFollowersFail(id, error) {
return { return {
@ -445,7 +445,7 @@ export function expandFollowersFail(id, error) {
id, id,
error, error,
}; };
}; }
export function fetchFollowing(id) { export function fetchFollowing(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -461,14 +461,14 @@ export function fetchFollowing(id) {
dispatch(fetchFollowingFail(id, error)); dispatch(fetchFollowingFail(id, error));
}); });
}; };
}; }
export function fetchFollowingRequest(id) { export function fetchFollowingRequest(id) {
return { return {
type: FOLLOWING_FETCH_REQUEST, type: FOLLOWING_FETCH_REQUEST,
id, id,
}; };
}; }
export function fetchFollowingSuccess(id, accounts, next) { export function fetchFollowingSuccess(id, accounts, next) {
return { return {
@ -477,7 +477,7 @@ export function fetchFollowingSuccess(id, accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function fetchFollowingFail(id, error) { export function fetchFollowingFail(id, error) {
return { return {
@ -486,7 +486,7 @@ export function fetchFollowingFail(id, error) {
error, error,
skipNotFound: true, skipNotFound: true,
}; };
}; }
export function expandFollowing(id) { export function expandFollowing(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -508,14 +508,14 @@ export function expandFollowing(id) {
dispatch(expandFollowingFail(id, error)); dispatch(expandFollowingFail(id, error));
}); });
}; };
}; }
export function expandFollowingRequest(id) { export function expandFollowingRequest(id) {
return { return {
type: FOLLOWING_EXPAND_REQUEST, type: FOLLOWING_EXPAND_REQUEST,
id, id,
}; };
}; }
export function expandFollowingSuccess(id, accounts, next) { export function expandFollowingSuccess(id, accounts, next) {
return { return {
@ -524,7 +524,7 @@ export function expandFollowingSuccess(id, accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function expandFollowingFail(id, error) { export function expandFollowingFail(id, error) {
return { return {
@ -532,7 +532,7 @@ export function expandFollowingFail(id, error) {
id, id,
error, error,
}; };
}; }
export function fetchRelationships(accountIds) { export function fetchRelationships(accountIds) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -553,7 +553,7 @@ export function fetchRelationships(accountIds) {
dispatch(fetchRelationshipsFail(error)); dispatch(fetchRelationshipsFail(error));
}); });
}; };
}; }
export function fetchRelationshipsRequest(ids) { export function fetchRelationshipsRequest(ids) {
return { return {
@ -561,7 +561,7 @@ export function fetchRelationshipsRequest(ids) {
ids, ids,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchRelationshipsSuccess(relationships) { export function fetchRelationshipsSuccess(relationships) {
return { return {
@ -569,7 +569,7 @@ export function fetchRelationshipsSuccess(relationships) {
relationships, relationships,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchRelationshipsFail(error) { export function fetchRelationshipsFail(error) {
return { return {
@ -578,7 +578,7 @@ export function fetchRelationshipsFail(error) {
skipLoading: true, skipLoading: true,
skipNotFound: true, skipNotFound: true,
}; };
}; }
export function fetchFollowRequests() { export function fetchFollowRequests() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -590,13 +590,13 @@ export function fetchFollowRequests() {
dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null)); dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null));
}).catch(error => dispatch(fetchFollowRequestsFail(error))); }).catch(error => dispatch(fetchFollowRequestsFail(error)));
}; };
}; }
export function fetchFollowRequestsRequest() { export function fetchFollowRequestsRequest() {
return { return {
type: FOLLOW_REQUESTS_FETCH_REQUEST, type: FOLLOW_REQUESTS_FETCH_REQUEST,
}; };
}; }
export function fetchFollowRequestsSuccess(accounts, next) { export function fetchFollowRequestsSuccess(accounts, next) {
return { return {
@ -604,14 +604,14 @@ export function fetchFollowRequestsSuccess(accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function fetchFollowRequestsFail(error) { export function fetchFollowRequestsFail(error) {
return { return {
type: FOLLOW_REQUESTS_FETCH_FAIL, type: FOLLOW_REQUESTS_FETCH_FAIL,
error, error,
}; };
}; }
export function expandFollowRequests() { export function expandFollowRequests() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -629,13 +629,13 @@ export function expandFollowRequests() {
dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null)); dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null));
}).catch(error => dispatch(expandFollowRequestsFail(error))); }).catch(error => dispatch(expandFollowRequestsFail(error)));
}; };
}; }
export function expandFollowRequestsRequest() { export function expandFollowRequestsRequest() {
return { return {
type: FOLLOW_REQUESTS_EXPAND_REQUEST, type: FOLLOW_REQUESTS_EXPAND_REQUEST,
}; };
}; }
export function expandFollowRequestsSuccess(accounts, next) { export function expandFollowRequestsSuccess(accounts, next) {
return { return {
@ -643,14 +643,14 @@ export function expandFollowRequestsSuccess(accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function expandFollowRequestsFail(error) { export function expandFollowRequestsFail(error) {
return { return {
type: FOLLOW_REQUESTS_EXPAND_FAIL, type: FOLLOW_REQUESTS_EXPAND_FAIL,
error, error,
}; };
}; }
export function authorizeFollowRequest(id) { export function authorizeFollowRequest(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -661,21 +661,21 @@ export function authorizeFollowRequest(id) {
.then(() => dispatch(authorizeFollowRequestSuccess(id))) .then(() => dispatch(authorizeFollowRequestSuccess(id)))
.catch(error => dispatch(authorizeFollowRequestFail(id, error))); .catch(error => dispatch(authorizeFollowRequestFail(id, error)));
}; };
}; }
export function authorizeFollowRequestRequest(id) { export function authorizeFollowRequestRequest(id) {
return { return {
type: FOLLOW_REQUEST_AUTHORIZE_REQUEST, type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
id, id,
}; };
}; }
export function authorizeFollowRequestSuccess(id) { export function authorizeFollowRequestSuccess(id) {
return { return {
type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS, type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
id, id,
}; };
}; }
export function authorizeFollowRequestFail(id, error) { export function authorizeFollowRequestFail(id, error) {
return { return {
@ -683,7 +683,7 @@ export function authorizeFollowRequestFail(id, error) {
id, id,
error, error,
}; };
}; }
export function rejectFollowRequest(id) { export function rejectFollowRequest(id) {
@ -695,21 +695,21 @@ export function rejectFollowRequest(id) {
.then(() => dispatch(rejectFollowRequestSuccess(id))) .then(() => dispatch(rejectFollowRequestSuccess(id)))
.catch(error => dispatch(rejectFollowRequestFail(id, error))); .catch(error => dispatch(rejectFollowRequestFail(id, error)));
}; };
}; }
export function rejectFollowRequestRequest(id) { export function rejectFollowRequestRequest(id) {
return { return {
type: FOLLOW_REQUEST_REJECT_REQUEST, type: FOLLOW_REQUEST_REJECT_REQUEST,
id, id,
}; };
}; }
export function rejectFollowRequestSuccess(id) { export function rejectFollowRequestSuccess(id) {
return { return {
type: FOLLOW_REQUEST_REJECT_SUCCESS, type: FOLLOW_REQUEST_REJECT_SUCCESS,
id, id,
}; };
}; }
export function rejectFollowRequestFail(id, error) { export function rejectFollowRequestFail(id, error) {
return { return {
@ -717,7 +717,7 @@ export function rejectFollowRequestFail(id, error) {
id, id,
error, error,
}; };
}; }
export function pinAccount(id) { export function pinAccount(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -729,7 +729,7 @@ export function pinAccount(id) {
dispatch(pinAccountFail(error)); dispatch(pinAccountFail(error));
}); });
}; };
}; }
export function unpinAccount(id) { export function unpinAccount(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -741,49 +741,49 @@ export function unpinAccount(id) {
dispatch(unpinAccountFail(error)); dispatch(unpinAccountFail(error));
}); });
}; };
}; }
export function pinAccountRequest(id) { export function pinAccountRequest(id) {
return { return {
type: ACCOUNT_PIN_REQUEST, type: ACCOUNT_PIN_REQUEST,
id, id,
}; };
}; }
export function pinAccountSuccess(relationship) { export function pinAccountSuccess(relationship) {
return { return {
type: ACCOUNT_PIN_SUCCESS, type: ACCOUNT_PIN_SUCCESS,
relationship, relationship,
}; };
}; }
export function pinAccountFail(error) { export function pinAccountFail(error) {
return { return {
type: ACCOUNT_PIN_FAIL, type: ACCOUNT_PIN_FAIL,
error, error,
}; };
}; }
export function unpinAccountRequest(id) { export function unpinAccountRequest(id) {
return { return {
type: ACCOUNT_UNPIN_REQUEST, type: ACCOUNT_UNPIN_REQUEST,
id, id,
}; };
}; }
export function unpinAccountSuccess(relationship) { export function unpinAccountSuccess(relationship) {
return { return {
type: ACCOUNT_UNPIN_SUCCESS, type: ACCOUNT_UNPIN_SUCCESS,
relationship, relationship,
}; };
}; }
export function unpinAccountFail(error) { export function unpinAccountFail(error) {
return { return {
type: ACCOUNT_UNPIN_FAIL, type: ACCOUNT_UNPIN_FAIL,
error, error,
}; };
}; }
export const revealAccount = id => ({ export const revealAccount = id => ({
type: ACCOUNT_REVEAL, type: ACCOUNT_REVEAL,

View file

@ -17,13 +17,13 @@ export function dismissAlert(alert) {
type: ALERT_DISMISS, type: ALERT_DISMISS,
alert, alert,
}; };
}; }
export function clearAlert() { export function clearAlert() {
return { return {
type: ALERT_CLEAR, type: ALERT_CLEAR,
}; };
}; }
export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage, message_values = undefined) { export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage, message_values = undefined) {
return { return {
@ -32,7 +32,7 @@ export function showAlert(title = messages.unexpectedTitle, message = messages.u
message, message,
message_values, message_values,
}; };
}; }
export function showAlertForError(error, skipNotFound = false) { export function showAlertForError(error, skipNotFound = false) {
if (error.response) { if (error.response) {

View file

@ -102,7 +102,7 @@ export const addReaction = (announcementId, name) => (dispatch, getState) => {
dispatch(addReactionRequest(announcementId, name, alreadyAdded)); dispatch(addReactionRequest(announcementId, name, alreadyAdded));
} }
api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => { api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
dispatch(addReactionSuccess(announcementId, name, alreadyAdded)); dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
}).catch(err => { }).catch(err => {
if (!alreadyAdded) { if (!alreadyAdded) {
@ -136,7 +136,7 @@ export const addReactionFail = (announcementId, name, error) => ({
export const removeReaction = (announcementId, name) => (dispatch, getState) => { export const removeReaction = (announcementId, name) => (dispatch, getState) => {
dispatch(removeReactionRequest(announcementId, name)); dispatch(removeReactionRequest(announcementId, name));
api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => { api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
dispatch(removeReactionSuccess(announcementId, name)); dispatch(removeReactionSuccess(announcementId, name));
}).catch(err => { }).catch(err => {
dispatch(removeReactionFail(announcementId, name, err)); dispatch(removeReactionFail(announcementId, name, err));

View file

@ -24,13 +24,13 @@ export function fetchBlocks() {
dispatch(fetchRelationships(response.data.map(item => item.id))); dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(fetchBlocksFail(error))); }).catch(error => dispatch(fetchBlocksFail(error)));
}; };
}; }
export function fetchBlocksRequest() { export function fetchBlocksRequest() {
return { return {
type: BLOCKS_FETCH_REQUEST, type: BLOCKS_FETCH_REQUEST,
}; };
}; }
export function fetchBlocksSuccess(accounts, next) { export function fetchBlocksSuccess(accounts, next) {
return { return {
@ -38,14 +38,14 @@ export function fetchBlocksSuccess(accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function fetchBlocksFail(error) { export function fetchBlocksFail(error) {
return { return {
type: BLOCKS_FETCH_FAIL, type: BLOCKS_FETCH_FAIL,
error, error,
}; };
}; }
export function expandBlocks() { export function expandBlocks() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -64,13 +64,13 @@ export function expandBlocks() {
dispatch(fetchRelationships(response.data.map(item => item.id))); dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(expandBlocksFail(error))); }).catch(error => dispatch(expandBlocksFail(error)));
}; };
}; }
export function expandBlocksRequest() { export function expandBlocksRequest() {
return { return {
type: BLOCKS_EXPAND_REQUEST, type: BLOCKS_EXPAND_REQUEST,
}; };
}; }
export function expandBlocksSuccess(accounts, next) { export function expandBlocksSuccess(accounts, next) {
return { return {
@ -78,14 +78,14 @@ export function expandBlocksSuccess(accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function expandBlocksFail(error) { export function expandBlocksFail(error) {
return { return {
type: BLOCKS_EXPAND_FAIL, type: BLOCKS_EXPAND_FAIL,
error, error,
}; };
}; }
export function initBlockModal(account) { export function initBlockModal(account) {
return dispatch => { return dispatch => {

View file

@ -25,13 +25,13 @@ export function fetchBookmarkedStatuses() {
dispatch(fetchBookmarkedStatusesFail(error)); dispatch(fetchBookmarkedStatusesFail(error));
}); });
}; };
}; }
export function fetchBookmarkedStatusesRequest() { export function fetchBookmarkedStatusesRequest() {
return { return {
type: BOOKMARKED_STATUSES_FETCH_REQUEST, type: BOOKMARKED_STATUSES_FETCH_REQUEST,
}; };
}; }
export function fetchBookmarkedStatusesSuccess(statuses, next) { export function fetchBookmarkedStatusesSuccess(statuses, next) {
return { return {
@ -39,14 +39,14 @@ export function fetchBookmarkedStatusesSuccess(statuses, next) {
statuses, statuses,
next, next,
}; };
}; }
export function fetchBookmarkedStatusesFail(error) { export function fetchBookmarkedStatusesFail(error) {
return { return {
type: BOOKMARKED_STATUSES_FETCH_FAIL, type: BOOKMARKED_STATUSES_FETCH_FAIL,
error, error,
}; };
}; }
export function expandBookmarkedStatuses() { export function expandBookmarkedStatuses() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -66,13 +66,13 @@ export function expandBookmarkedStatuses() {
dispatch(expandBookmarkedStatusesFail(error)); dispatch(expandBookmarkedStatusesFail(error));
}); });
}; };
}; }
export function expandBookmarkedStatusesRequest() { export function expandBookmarkedStatusesRequest() {
return { return {
type: BOOKMARKED_STATUSES_EXPAND_REQUEST, type: BOOKMARKED_STATUSES_EXPAND_REQUEST,
}; };
}; }
export function expandBookmarkedStatusesSuccess(statuses, next) { export function expandBookmarkedStatusesSuccess(statuses, next) {
return { return {
@ -80,11 +80,11 @@ export function expandBookmarkedStatusesSuccess(statuses, next) {
statuses, statuses,
next, next,
}; };
}; }
export function expandBookmarkedStatusesFail(error) { export function expandBookmarkedStatusesFail(error) {
return { return {
type: BOOKMARKED_STATUSES_EXPAND_FAIL, type: BOOKMARKED_STATUSES_EXPAND_FAIL,
error, error,
}; };
}; }

View file

@ -15,7 +15,7 @@ export function addColumn(id, params) {
dispatch(saveSettings()); dispatch(saveSettings());
}; };
}; }
export function removeColumn(uuid) { export function removeColumn(uuid) {
return dispatch => { return dispatch => {
@ -26,7 +26,7 @@ export function removeColumn(uuid) {
dispatch(saveSettings()); dispatch(saveSettings());
}; };
}; }
export function moveColumn(uuid, direction) { export function moveColumn(uuid, direction) {
return dispatch => { return dispatch => {
@ -38,7 +38,7 @@ export function moveColumn(uuid, direction) {
dispatch(saveSettings()); dispatch(saveSettings());
}; };
}; }
export function changeColumnParams(uuid, path, value) { export function changeColumnParams(uuid, path, value) {
return dispatch => { return dispatch => {

View file

@ -94,14 +94,14 @@ export function setComposeToStatus(status, text, spoiler_text) {
text, text,
spoiler_text, spoiler_text,
}; };
}; }
export function changeCompose(text) { export function changeCompose(text) {
return { return {
type: COMPOSE_CHANGE, type: COMPOSE_CHANGE,
text: text, text: text,
}; };
}; }
export function replyCompose(status, routerHistory) { export function replyCompose(status, routerHistory) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -112,19 +112,19 @@ export function replyCompose(status, routerHistory) {
ensureComposeIsVisible(getState, routerHistory); ensureComposeIsVisible(getState, routerHistory);
}; };
}; }
export function cancelReplyCompose() { export function cancelReplyCompose() {
return { return {
type: COMPOSE_REPLY_CANCEL, type: COMPOSE_REPLY_CANCEL,
}; };
}; }
export function resetCompose() { export function resetCompose() {
return { return {
type: COMPOSE_RESET, type: COMPOSE_RESET,
}; };
}; }
export function mentionCompose(account, routerHistory) { export function mentionCompose(account, routerHistory) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -135,7 +135,7 @@ export function mentionCompose(account, routerHistory) {
ensureComposeIsVisible(getState, routerHistory); ensureComposeIsVisible(getState, routerHistory);
}; };
}; }
export function directCompose(account, routerHistory) { export function directCompose(account, routerHistory) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -146,7 +146,7 @@ export function directCompose(account, routerHistory) {
ensureComposeIsVisible(getState, routerHistory); ensureComposeIsVisible(getState, routerHistory);
}; };
}; }
export function submitCompose(routerHistory) { export function submitCompose(routerHistory) {
return function (dispatch, getState) { return function (dispatch, getState) {
@ -211,27 +211,27 @@ export function submitCompose(routerHistory) {
dispatch(submitComposeFail(error)); dispatch(submitComposeFail(error));
}); });
}; };
}; }
export function submitComposeRequest() { export function submitComposeRequest() {
return { return {
type: COMPOSE_SUBMIT_REQUEST, type: COMPOSE_SUBMIT_REQUEST,
}; };
}; }
export function submitComposeSuccess(status) { export function submitComposeSuccess(status) {
return { return {
type: COMPOSE_SUBMIT_SUCCESS, type: COMPOSE_SUBMIT_SUCCESS,
status: status, status: status,
}; };
}; }
export function submitComposeFail(error) { export function submitComposeFail(error) {
return { return {
type: COMPOSE_SUBMIT_FAIL, type: COMPOSE_SUBMIT_FAIL,
error: error, error: error,
}; };
}; }
export function uploadCompose(files) { export function uploadCompose(files) {
return function (dispatch, getState) { return function (dispatch, getState) {
@ -294,9 +294,9 @@ export function uploadCompose(files) {
} }
}); });
}).catch(error => dispatch(uploadComposeFail(error))); }).catch(error => dispatch(uploadComposeFail(error)));
}; }
}; };
}; }
export const uploadComposeProcessing = () => ({ export const uploadComposeProcessing = () => ({
type: COMPOSE_UPLOAD_PROCESSING, type: COMPOSE_UPLOAD_PROCESSING,
@ -354,14 +354,14 @@ export function initMediaEditModal(id) {
dispatch(openModal('FOCAL_POINT', { id })); dispatch(openModal('FOCAL_POINT', { id }));
}; };
}; }
export function onChangeMediaDescription(description) { export function onChangeMediaDescription(description) {
return { return {
type: COMPOSE_CHANGE_MEDIA_DESCRIPTION, type: COMPOSE_CHANGE_MEDIA_DESCRIPTION,
description, description,
}; };
}; }
export function onChangeMediaFocus(focusX, focusY) { export function onChangeMediaFocus(focusX, focusY) {
return { return {
@ -369,7 +369,7 @@ export function onChangeMediaFocus(focusX, focusY) {
focusX, focusX,
focusY, focusY,
}; };
}; }
export function changeUploadCompose(id, params) { export function changeUploadCompose(id, params) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -381,14 +381,14 @@ export function changeUploadCompose(id, params) {
dispatch(changeUploadComposeFail(id, error)); dispatch(changeUploadComposeFail(id, error));
}); });
}; };
}; }
export function changeUploadComposeRequest() { export function changeUploadComposeRequest() {
return { return {
type: COMPOSE_UPLOAD_CHANGE_REQUEST, type: COMPOSE_UPLOAD_CHANGE_REQUEST,
skipLoading: true, skipLoading: true,
}; };
}; }
export function changeUploadComposeSuccess(media) { export function changeUploadComposeSuccess(media) {
return { return {
@ -396,7 +396,7 @@ export function changeUploadComposeSuccess(media) {
media: media, media: media,
skipLoading: true, skipLoading: true,
}; };
}; }
export function changeUploadComposeFail(error) { export function changeUploadComposeFail(error) {
return { return {
@ -404,14 +404,14 @@ export function changeUploadComposeFail(error) {
error: error, error: error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function uploadComposeRequest() { export function uploadComposeRequest() {
return { return {
type: COMPOSE_UPLOAD_REQUEST, type: COMPOSE_UPLOAD_REQUEST,
skipLoading: true, skipLoading: true,
}; };
}; }
export function uploadComposeProgress(loaded, total) { export function uploadComposeProgress(loaded, total) {
return { return {
@ -419,7 +419,7 @@ export function uploadComposeProgress(loaded, total) {
loaded: loaded, loaded: loaded,
total: total, total: total,
}; };
}; }
export function uploadComposeSuccess(media, file) { export function uploadComposeSuccess(media, file) {
return { return {
@ -428,7 +428,7 @@ export function uploadComposeSuccess(media, file) {
file: file, file: file,
skipLoading: true, skipLoading: true,
}; };
}; }
export function uploadComposeFail(error) { export function uploadComposeFail(error) {
return { return {
@ -436,14 +436,14 @@ export function uploadComposeFail(error) {
error: error, error: error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function undoUploadCompose(media_id) { export function undoUploadCompose(media_id) {
return { return {
type: COMPOSE_UPLOAD_UNDO, type: COMPOSE_UPLOAD_UNDO,
media_id: media_id, media_id: media_id,
}; };
}; }
export function clearComposeSuggestions() { export function clearComposeSuggestions() {
if (fetchComposeSuggestionsAccountsController) { if (fetchComposeSuggestionsAccountsController) {
@ -452,7 +452,7 @@ export function clearComposeSuggestions() {
return { return {
type: COMPOSE_SUGGESTIONS_CLEAR, type: COMPOSE_SUGGESTIONS_CLEAR,
}; };
}; }
const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => { const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => {
if (fetchComposeSuggestionsAccountsController) { if (fetchComposeSuggestionsAccountsController) {
@ -530,7 +530,7 @@ export function fetchComposeSuggestions(token) {
break; break;
} }
}; };
}; }
export function readyComposeSuggestionsEmojis(token, emojis) { export function readyComposeSuggestionsEmojis(token, emojis) {
return { return {
@ -538,7 +538,7 @@ export function readyComposeSuggestionsEmojis(token, emojis) {
token, token,
emojis, emojis,
}; };
}; }
export function readyComposeSuggestionsAccounts(token, accounts) { export function readyComposeSuggestionsAccounts(token, accounts) {
return { return {
@ -546,7 +546,7 @@ export function readyComposeSuggestionsAccounts(token, accounts) {
token, token,
accounts, accounts,
}; };
}; }
export const readyComposeSuggestionsTags = (token, tags) => ({ export const readyComposeSuggestionsTags = (token, tags) => ({
type: COMPOSE_SUGGESTIONS_READY, type: COMPOSE_SUGGESTIONS_READY,
@ -591,7 +591,7 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
}); });
} }
}; };
}; }
export function updateSuggestionTags(token) { export function updateSuggestionTags(token) {
return { return {
@ -652,19 +652,19 @@ export function mountCompose() {
return { return {
type: COMPOSE_MOUNT, type: COMPOSE_MOUNT,
}; };
}; }
export function unmountCompose() { export function unmountCompose() {
return { return {
type: COMPOSE_UNMOUNT, type: COMPOSE_UNMOUNT,
}; };
}; }
export function changeComposeSensitivity() { export function changeComposeSensitivity() {
return { return {
type: COMPOSE_SENSITIVITY_CHANGE, type: COMPOSE_SENSITIVITY_CHANGE,
}; };
}; }
export const changeComposeLanguage = language => ({ export const changeComposeLanguage = language => ({
type: COMPOSE_LANGUAGE_CHANGE, type: COMPOSE_LANGUAGE_CHANGE,
@ -675,21 +675,21 @@ export function changeComposeSpoilerness() {
return { return {
type: COMPOSE_SPOILERNESS_CHANGE, type: COMPOSE_SPOILERNESS_CHANGE,
}; };
}; }
export function changeComposeSpoilerText(text) { export function changeComposeSpoilerText(text) {
return { return {
type: COMPOSE_SPOILER_TEXT_CHANGE, type: COMPOSE_SPOILER_TEXT_CHANGE,
text, text,
}; };
}; }
export function changeComposeVisibility(value) { export function changeComposeVisibility(value) {
return { return {
type: COMPOSE_VISIBILITY_CHANGE, type: COMPOSE_VISIBILITY_CHANGE,
value, value,
}; };
}; }
export function insertEmojiCompose(position, emoji, needsSpace) { export function insertEmojiCompose(position, emoji, needsSpace) {
return { return {
@ -698,33 +698,33 @@ export function insertEmojiCompose(position, emoji, needsSpace) {
emoji, emoji,
needsSpace, needsSpace,
}; };
}; }
export function changeComposing(value) { export function changeComposing(value) {
return { return {
type: COMPOSE_COMPOSING_CHANGE, type: COMPOSE_COMPOSING_CHANGE,
value, value,
}; };
}; }
export function addPoll() { export function addPoll() {
return { return {
type: COMPOSE_POLL_ADD, type: COMPOSE_POLL_ADD,
}; };
}; }
export function removePoll() { export function removePoll() {
return { return {
type: COMPOSE_POLL_REMOVE, type: COMPOSE_POLL_REMOVE,
}; };
}; }
export function addPollOption(title) { export function addPollOption(title) {
return { return {
type: COMPOSE_POLL_OPTION_ADD, type: COMPOSE_POLL_OPTION_ADD,
title, title,
}; };
}; }
export function changePollOption(index, title) { export function changePollOption(index, title) {
return { return {
@ -732,14 +732,14 @@ export function changePollOption(index, title) {
index, index,
title, title,
}; };
}; }
export function removePollOption(index) { export function removePollOption(index) {
return { return {
type: COMPOSE_POLL_OPTION_REMOVE, type: COMPOSE_POLL_OPTION_REMOVE,
index, index,
}; };
}; }
export function changePollSettings(expiresIn, isMultiple) { export function changePollSettings(expiresIn, isMultiple) {
return { return {
@ -747,4 +747,4 @@ export function changePollSettings(expiresIn, isMultiple) {
expiresIn, expiresIn,
isMultiple, isMultiple,
}; };
}; }

View file

@ -14,14 +14,14 @@ export function fetchCustomEmojis() {
dispatch(fetchCustomEmojisFail(error)); dispatch(fetchCustomEmojisFail(error));
}); });
}; };
}; }
export function fetchCustomEmojisRequest() { export function fetchCustomEmojisRequest() {
return { return {
type: CUSTOM_EMOJIS_FETCH_REQUEST, type: CUSTOM_EMOJIS_FETCH_REQUEST,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchCustomEmojisSuccess(custom_emojis) { export function fetchCustomEmojisSuccess(custom_emojis) {
return { return {
@ -29,7 +29,7 @@ export function fetchCustomEmojisSuccess(custom_emojis) {
custom_emojis, custom_emojis,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchCustomEmojisFail(error) { export function fetchCustomEmojisFail(error) {
return { return {
@ -37,4 +37,4 @@ export function fetchCustomEmojisFail(error) {
error, error,
skipLoading: true, skipLoading: true,
}; };
}; }

View file

@ -29,14 +29,14 @@ export function blockDomain(domain) {
dispatch(blockDomainFail(domain, err)); dispatch(blockDomainFail(domain, err));
}); });
}; };
}; }
export function blockDomainRequest(domain) { export function blockDomainRequest(domain) {
return { return {
type: DOMAIN_BLOCK_REQUEST, type: DOMAIN_BLOCK_REQUEST,
domain, domain,
}; };
}; }
export function blockDomainSuccess(domain, accounts) { export function blockDomainSuccess(domain, accounts) {
return { return {
@ -44,7 +44,7 @@ export function blockDomainSuccess(domain, accounts) {
domain, domain,
accounts, accounts,
}; };
}; }
export function blockDomainFail(domain, error) { export function blockDomainFail(domain, error) {
return { return {
@ -52,7 +52,7 @@ export function blockDomainFail(domain, error) {
domain, domain,
error, error,
}; };
}; }
export function unblockDomain(domain) { export function unblockDomain(domain) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -66,14 +66,14 @@ export function unblockDomain(domain) {
dispatch(unblockDomainFail(domain, err)); dispatch(unblockDomainFail(domain, err));
}); });
}; };
}; }
export function unblockDomainRequest(domain) { export function unblockDomainRequest(domain) {
return { return {
type: DOMAIN_UNBLOCK_REQUEST, type: DOMAIN_UNBLOCK_REQUEST,
domain, domain,
}; };
}; }
export function unblockDomainSuccess(domain, accounts) { export function unblockDomainSuccess(domain, accounts) {
return { return {
@ -81,7 +81,7 @@ export function unblockDomainSuccess(domain, accounts) {
domain, domain,
accounts, accounts,
}; };
}; }
export function unblockDomainFail(domain, error) { export function unblockDomainFail(domain, error) {
return { return {
@ -89,7 +89,7 @@ export function unblockDomainFail(domain, error) {
domain, domain,
error, error,
}; };
}; }
export function fetchDomainBlocks() { export function fetchDomainBlocks() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -102,13 +102,13 @@ export function fetchDomainBlocks() {
dispatch(fetchDomainBlocksFail(err)); dispatch(fetchDomainBlocksFail(err));
}); });
}; };
}; }
export function fetchDomainBlocksRequest() { export function fetchDomainBlocksRequest() {
return { return {
type: DOMAIN_BLOCKS_FETCH_REQUEST, type: DOMAIN_BLOCKS_FETCH_REQUEST,
}; };
}; }
export function fetchDomainBlocksSuccess(domains, next) { export function fetchDomainBlocksSuccess(domains, next) {
return { return {
@ -116,14 +116,14 @@ export function fetchDomainBlocksSuccess(domains, next) {
domains, domains,
next, next,
}; };
}; }
export function fetchDomainBlocksFail(error) { export function fetchDomainBlocksFail(error) {
return { return {
type: DOMAIN_BLOCKS_FETCH_FAIL, type: DOMAIN_BLOCKS_FETCH_FAIL,
error, error,
}; };
}; }
export function expandDomainBlocks() { export function expandDomainBlocks() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -142,13 +142,13 @@ export function expandDomainBlocks() {
dispatch(expandDomainBlocksFail(err)); dispatch(expandDomainBlocksFail(err));
}); });
}; };
}; }
export function expandDomainBlocksRequest() { export function expandDomainBlocksRequest() {
return { return {
type: DOMAIN_BLOCKS_EXPAND_REQUEST, type: DOMAIN_BLOCKS_EXPAND_REQUEST,
}; };
}; }
export function expandDomainBlocksSuccess(domains, next) { export function expandDomainBlocksSuccess(domains, next) {
return { return {
@ -156,11 +156,11 @@ export function expandDomainBlocksSuccess(domains, next) {
domains, domains,
next, next,
}; };
}; }
export function expandDomainBlocksFail(error) { export function expandDomainBlocksFail(error) {
return { return {
type: DOMAIN_BLOCKS_EXPAND_FAIL, type: DOMAIN_BLOCKS_EXPAND_FAIL,
error, error,
}; };
}; }

View file

@ -11,4 +11,4 @@ export function useEmoji(emoji) {
dispatch(saveSettings()); dispatch(saveSettings());
}; };
}; }

View file

@ -25,14 +25,14 @@ export function fetchFavouritedStatuses() {
dispatch(fetchFavouritedStatusesFail(error)); dispatch(fetchFavouritedStatusesFail(error));
}); });
}; };
}; }
export function fetchFavouritedStatusesRequest() { export function fetchFavouritedStatusesRequest() {
return { return {
type: FAVOURITED_STATUSES_FETCH_REQUEST, type: FAVOURITED_STATUSES_FETCH_REQUEST,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchFavouritedStatusesSuccess(statuses, next) { export function fetchFavouritedStatusesSuccess(statuses, next) {
return { return {
@ -41,7 +41,7 @@ export function fetchFavouritedStatusesSuccess(statuses, next) {
next, next,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchFavouritedStatusesFail(error) { export function fetchFavouritedStatusesFail(error) {
return { return {
@ -49,7 +49,7 @@ export function fetchFavouritedStatusesFail(error) {
error, error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function expandFavouritedStatuses() { export function expandFavouritedStatuses() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -69,13 +69,13 @@ export function expandFavouritedStatuses() {
dispatch(expandFavouritedStatusesFail(error)); dispatch(expandFavouritedStatusesFail(error));
}); });
}; };
}; }
export function expandFavouritedStatusesRequest() { export function expandFavouritedStatusesRequest() {
return { return {
type: FAVOURITED_STATUSES_EXPAND_REQUEST, type: FAVOURITED_STATUSES_EXPAND_REQUEST,
}; };
}; }
export function expandFavouritedStatusesSuccess(statuses, next) { export function expandFavouritedStatusesSuccess(statuses, next) {
return { return {
@ -83,11 +83,11 @@ export function expandFavouritedStatusesSuccess(statuses, next) {
statuses, statuses,
next, next,
}; };
}; }
export function expandFavouritedStatusesFail(error) { export function expandFavouritedStatusesFail(error) {
return { return {
type: FAVOURITED_STATUSES_EXPAND_FAIL, type: FAVOURITED_STATUSES_EXPAND_FAIL,
error, error,
}; };
}; }

View file

@ -8,10 +8,10 @@ export function setHeight (key, id, height) {
id, id,
height, height,
}; };
}; }
export function clearHeight () { export function clearHeight () {
return { return {
type: HEIGHT_CACHE_CLEAR, type: HEIGHT_CACHE_CLEAR,
}; };
}; }

View file

@ -54,7 +54,7 @@ export function reblog(status, visibility) {
dispatch(reblogFail(status, error)); dispatch(reblogFail(status, error));
}); });
}; };
}; }
export function unreblog(status) { export function unreblog(status) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -67,7 +67,7 @@ export function unreblog(status) {
dispatch(unreblogFail(status, error)); dispatch(unreblogFail(status, error));
}); });
}; };
}; }
export function reblogRequest(status) { export function reblogRequest(status) {
return { return {
@ -75,7 +75,7 @@ export function reblogRequest(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function reblogSuccess(status) { export function reblogSuccess(status) {
return { return {
@ -83,7 +83,7 @@ export function reblogSuccess(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function reblogFail(status, error) { export function reblogFail(status, error) {
return { return {
@ -92,7 +92,7 @@ export function reblogFail(status, error) {
error: error, error: error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unreblogRequest(status) { export function unreblogRequest(status) {
return { return {
@ -100,7 +100,7 @@ export function unreblogRequest(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unreblogSuccess(status) { export function unreblogSuccess(status) {
return { return {
@ -108,7 +108,7 @@ export function unreblogSuccess(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unreblogFail(status, error) { export function unreblogFail(status, error) {
return { return {
@ -117,7 +117,7 @@ export function unreblogFail(status, error) {
error: error, error: error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function favourite(status) { export function favourite(status) {
return function (dispatch, getState) { return function (dispatch, getState) {
@ -130,7 +130,7 @@ export function favourite(status) {
dispatch(favouriteFail(status, error)); dispatch(favouriteFail(status, error));
}); });
}; };
}; }
export function unfavourite(status) { export function unfavourite(status) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -143,7 +143,7 @@ export function unfavourite(status) {
dispatch(unfavouriteFail(status, error)); dispatch(unfavouriteFail(status, error));
}); });
}; };
}; }
export function favouriteRequest(status) { export function favouriteRequest(status) {
return { return {
@ -151,7 +151,7 @@ export function favouriteRequest(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function favouriteSuccess(status) { export function favouriteSuccess(status) {
return { return {
@ -159,7 +159,7 @@ export function favouriteSuccess(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function favouriteFail(status, error) { export function favouriteFail(status, error) {
return { return {
@ -168,7 +168,7 @@ export function favouriteFail(status, error) {
error: error, error: error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unfavouriteRequest(status) { export function unfavouriteRequest(status) {
return { return {
@ -176,7 +176,7 @@ export function unfavouriteRequest(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unfavouriteSuccess(status) { export function unfavouriteSuccess(status) {
return { return {
@ -184,7 +184,7 @@ export function unfavouriteSuccess(status) {
status: status, status: status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unfavouriteFail(status, error) { export function unfavouriteFail(status, error) {
return { return {
@ -193,7 +193,7 @@ export function unfavouriteFail(status, error) {
error: error, error: error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function bookmark(status) { export function bookmark(status) {
return function (dispatch, getState) { return function (dispatch, getState) {
@ -206,7 +206,7 @@ export function bookmark(status) {
dispatch(bookmarkFail(status, error)); dispatch(bookmarkFail(status, error));
}); });
}; };
}; }
export function unbookmark(status) { export function unbookmark(status) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -219,14 +219,14 @@ export function unbookmark(status) {
dispatch(unbookmarkFail(status, error)); dispatch(unbookmarkFail(status, error));
}); });
}; };
}; }
export function bookmarkRequest(status) { export function bookmarkRequest(status) {
return { return {
type: BOOKMARK_REQUEST, type: BOOKMARK_REQUEST,
status: status, status: status,
}; };
}; }
export function bookmarkSuccess(status, response) { export function bookmarkSuccess(status, response) {
return { return {
@ -234,7 +234,7 @@ export function bookmarkSuccess(status, response) {
status: status, status: status,
response: response, response: response,
}; };
}; }
export function bookmarkFail(status, error) { export function bookmarkFail(status, error) {
return { return {
@ -242,14 +242,14 @@ export function bookmarkFail(status, error) {
status: status, status: status,
error: error, error: error,
}; };
}; }
export function unbookmarkRequest(status) { export function unbookmarkRequest(status) {
return { return {
type: UNBOOKMARK_REQUEST, type: UNBOOKMARK_REQUEST,
status: status, status: status,
}; };
}; }
export function unbookmarkSuccess(status, response) { export function unbookmarkSuccess(status, response) {
return { return {
@ -257,7 +257,7 @@ export function unbookmarkSuccess(status, response) {
status: status, status: status,
response: response, response: response,
}; };
}; }
export function unbookmarkFail(status, error) { export function unbookmarkFail(status, error) {
return { return {
@ -265,7 +265,7 @@ export function unbookmarkFail(status, error) {
status: status, status: status,
error: error, error: error,
}; };
}; }
export function fetchReblogs(id) { export function fetchReblogs(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -278,14 +278,14 @@ export function fetchReblogs(id) {
dispatch(fetchReblogsFail(id, error)); dispatch(fetchReblogsFail(id, error));
}); });
}; };
}; }
export function fetchReblogsRequest(id) { export function fetchReblogsRequest(id) {
return { return {
type: REBLOGS_FETCH_REQUEST, type: REBLOGS_FETCH_REQUEST,
id, id,
}; };
}; }
export function fetchReblogsSuccess(id, accounts) { export function fetchReblogsSuccess(id, accounts) {
return { return {
@ -293,14 +293,14 @@ export function fetchReblogsSuccess(id, accounts) {
id, id,
accounts, accounts,
}; };
}; }
export function fetchReblogsFail(id, error) { export function fetchReblogsFail(id, error) {
return { return {
type: REBLOGS_FETCH_FAIL, type: REBLOGS_FETCH_FAIL,
error, error,
}; };
}; }
export function fetchFavourites(id) { export function fetchFavourites(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -313,14 +313,14 @@ export function fetchFavourites(id) {
dispatch(fetchFavouritesFail(id, error)); dispatch(fetchFavouritesFail(id, error));
}); });
}; };
}; }
export function fetchFavouritesRequest(id) { export function fetchFavouritesRequest(id) {
return { return {
type: FAVOURITES_FETCH_REQUEST, type: FAVOURITES_FETCH_REQUEST,
id, id,
}; };
}; }
export function fetchFavouritesSuccess(id, accounts) { export function fetchFavouritesSuccess(id, accounts) {
return { return {
@ -328,14 +328,14 @@ export function fetchFavouritesSuccess(id, accounts) {
id, id,
accounts, accounts,
}; };
}; }
export function fetchFavouritesFail(id, error) { export function fetchFavouritesFail(id, error) {
return { return {
type: FAVOURITES_FETCH_FAIL, type: FAVOURITES_FETCH_FAIL,
error, error,
}; };
}; }
export function pin(status) { export function pin(status) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -348,7 +348,7 @@ export function pin(status) {
dispatch(pinFail(status, error)); dispatch(pinFail(status, error));
}); });
}; };
}; }
export function pinRequest(status) { export function pinRequest(status) {
return { return {
@ -356,7 +356,7 @@ export function pinRequest(status) {
status, status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function pinSuccess(status) { export function pinSuccess(status) {
return { return {
@ -364,7 +364,7 @@ export function pinSuccess(status) {
status, status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function pinFail(status, error) { export function pinFail(status, error) {
return { return {
@ -373,7 +373,7 @@ export function pinFail(status, error) {
error, error,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unpin (status) { export function unpin (status) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -386,7 +386,7 @@ export function unpin (status) {
dispatch(unpinFail(status, error)); dispatch(unpinFail(status, error));
}); });
}; };
}; }
export function unpinRequest(status) { export function unpinRequest(status) {
return { return {
@ -394,7 +394,7 @@ export function unpinRequest(status) {
status, status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unpinSuccess(status) { export function unpinSuccess(status) {
return { return {
@ -402,7 +402,7 @@ export function unpinSuccess(status) {
status, status,
skipLoading: true, skipLoading: true,
}; };
}; }
export function unpinFail(status, error) { export function unpinFail(status, error) {
return { return {
@ -411,4 +411,4 @@ export function unpinFail(status, error) {
error, error,
skipLoading: true, skipLoading: true,
}; };
}; }

View file

@ -101,7 +101,7 @@ export function submitMarkersSuccess({ home, notifications }) {
home: (home || {}).last_read_id, home: (home || {}).last_read_id,
notifications: (notifications || {}).last_read_id, notifications: (notifications || {}).last_read_id,
}; };
}; }
export function submitMarkers(params = {}) { export function submitMarkers(params = {}) {
const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState); const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState);
@ -111,7 +111,7 @@ export function submitMarkers(params = {}) {
} }
return result; return result;
}; }
export const fetchMarkers = () => (dispatch, getState) => { export const fetchMarkers = () => (dispatch, getState) => {
const params = { timeline: ['notifications'] }; const params = { timeline: ['notifications'] };
@ -130,7 +130,7 @@ export function fetchMarkersRequest() {
type: MARKERS_FETCH_REQUEST, type: MARKERS_FETCH_REQUEST,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchMarkersSuccess(markers) { export function fetchMarkersSuccess(markers) {
return { return {
@ -138,7 +138,7 @@ export function fetchMarkersSuccess(markers) {
markers, markers,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchMarkersFail(error) { export function fetchMarkersFail(error) {
return { return {
@ -147,4 +147,4 @@ export function fetchMarkersFail(error) {
skipLoading: true, skipLoading: true,
skipAlert: true, skipAlert: true,
}; };
}; }

View file

@ -7,7 +7,7 @@ export function openModal(type, props) {
modalType: type, modalType: type,
modalProps: props, modalProps: props,
}; };
}; }
export function closeModal(type, options = { ignoreFocus: false }) { export function closeModal(type, options = { ignoreFocus: false }) {
return { return {
@ -15,4 +15,4 @@ export function closeModal(type, options = { ignoreFocus: false }) {
modalType: type, modalType: type,
ignoreFocus: options.ignoreFocus, ignoreFocus: options.ignoreFocus,
}; };
}; }

View file

@ -26,13 +26,13 @@ export function fetchMutes() {
dispatch(fetchRelationships(response.data.map(item => item.id))); dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(fetchMutesFail(error))); }).catch(error => dispatch(fetchMutesFail(error)));
}; };
}; }
export function fetchMutesRequest() { export function fetchMutesRequest() {
return { return {
type: MUTES_FETCH_REQUEST, type: MUTES_FETCH_REQUEST,
}; };
}; }
export function fetchMutesSuccess(accounts, next) { export function fetchMutesSuccess(accounts, next) {
return { return {
@ -40,14 +40,14 @@ export function fetchMutesSuccess(accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function fetchMutesFail(error) { export function fetchMutesFail(error) {
return { return {
type: MUTES_FETCH_FAIL, type: MUTES_FETCH_FAIL,
error, error,
}; };
}; }
export function expandMutes() { export function expandMutes() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -66,13 +66,13 @@ export function expandMutes() {
dispatch(fetchRelationships(response.data.map(item => item.id))); dispatch(fetchRelationships(response.data.map(item => item.id)));
}).catch(error => dispatch(expandMutesFail(error))); }).catch(error => dispatch(expandMutesFail(error)));
}; };
}; }
export function expandMutesRequest() { export function expandMutesRequest() {
return { return {
type: MUTES_EXPAND_REQUEST, type: MUTES_EXPAND_REQUEST,
}; };
}; }
export function expandMutesSuccess(accounts, next) { export function expandMutesSuccess(accounts, next) {
return { return {
@ -80,14 +80,14 @@ export function expandMutesSuccess(accounts, next) {
accounts, accounts,
next, next,
}; };
}; }
export function expandMutesFail(error) { export function expandMutesFail(error) {
return { return {
type: MUTES_EXPAND_FAIL, type: MUTES_EXPAND_FAIL,
error, error,
}; };
}; }
export function initMuteModal(account) { export function initMuteModal(account) {
return dispatch => { return dispatch => {

View file

@ -118,7 +118,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
}); });
} }
}; };
}; }
const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS(); const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
@ -197,14 +197,14 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) {
done(); done();
}); });
}; };
}; }
export function expandNotificationsRequest(isLoadingMore) { export function expandNotificationsRequest(isLoadingMore) {
return { return {
type: NOTIFICATIONS_EXPAND_REQUEST, type: NOTIFICATIONS_EXPAND_REQUEST,
skipLoading: !isLoadingMore, skipLoading: !isLoadingMore,
}; };
}; }
export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) { export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) {
return { return {
@ -215,7 +215,7 @@ export function expandNotificationsSuccess(notifications, next, isLoadingMore, i
usePendingItems, usePendingItems,
skipLoading: !isLoadingMore, skipLoading: !isLoadingMore,
}; };
}; }
export function expandNotificationsFail(error, isLoadingMore) { export function expandNotificationsFail(error, isLoadingMore) {
return { return {
@ -224,7 +224,7 @@ export function expandNotificationsFail(error, isLoadingMore) {
skipLoading: !isLoadingMore, skipLoading: !isLoadingMore,
skipAlert: !isLoadingMore || error.name === 'AbortError', skipAlert: !isLoadingMore || error.name === 'AbortError',
}; };
}; }
export function clearNotifications() { export function clearNotifications() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -234,14 +234,14 @@ export function clearNotifications() {
api(getState).post('/api/v1/notifications/clear'); api(getState).post('/api/v1/notifications/clear');
}; };
}; }
export function scrollTopNotifications(top) { export function scrollTopNotifications(top) {
return { return {
type: NOTIFICATIONS_SCROLL_TOP, type: NOTIFICATIONS_SCROLL_TOP,
top, top,
}; };
}; }
export function setFilter (filterType) { export function setFilter (filterType) {
return dispatch => { return dispatch => {
@ -253,7 +253,7 @@ export function setFilter (filterType) {
dispatch(expandNotifications({ forceLoad: true })); dispatch(expandNotifications({ forceLoad: true }));
dispatch(saveSettings()); dispatch(saveSettings());
}; };
}; }
export const mountNotifications = () => ({ export const mountNotifications = () => ({
type: NOTIFICATIONS_MOUNT, type: NOTIFICATIONS_MOUNT,
@ -291,7 +291,7 @@ export function requestBrowserPermission(callback = noOp) {
callback(permission); callback(permission);
}); });
}; };
}; }
export function setBrowserSupport (value) { export function setBrowserSupport (value) {
return { return {

View file

@ -18,13 +18,13 @@ export function fetchPinnedStatuses() {
dispatch(fetchPinnedStatusesFail(error)); dispatch(fetchPinnedStatusesFail(error));
}); });
}; };
}; }
export function fetchPinnedStatusesRequest() { export function fetchPinnedStatusesRequest() {
return { return {
type: PINNED_STATUSES_FETCH_REQUEST, type: PINNED_STATUSES_FETCH_REQUEST,
}; };
}; }
export function fetchPinnedStatusesSuccess(statuses, next) { export function fetchPinnedStatusesSuccess(statuses, next) {
return { return {
@ -32,11 +32,11 @@ export function fetchPinnedStatusesSuccess(statuses, next) {
statuses, statuses,
next, next,
}; };
}; }
export function fetchPinnedStatusesFail(error) { export function fetchPinnedStatusesFail(error) {
return { return {
type: PINNED_STATUSES_FETCH_FAIL, type: PINNED_STATUSES_FETCH_FAIL,
error, error,
}; };
}; }

View file

@ -19,13 +19,13 @@ export function changeSearch(value) {
type: SEARCH_CHANGE, type: SEARCH_CHANGE,
value, value,
}; };
}; }
export function clearSearch() { export function clearSearch() {
return { return {
type: SEARCH_CLEAR, type: SEARCH_CLEAR,
}; };
}; }
export function submitSearch() { export function submitSearch() {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -60,13 +60,13 @@ export function submitSearch() {
dispatch(fetchSearchFail(error)); dispatch(fetchSearchFail(error));
}); });
}; };
}; }
export function fetchSearchRequest() { export function fetchSearchRequest() {
return { return {
type: SEARCH_FETCH_REQUEST, type: SEARCH_FETCH_REQUEST,
}; };
}; }
export function fetchSearchSuccess(results, searchTerm) { export function fetchSearchSuccess(results, searchTerm) {
return { return {
@ -74,14 +74,14 @@ export function fetchSearchSuccess(results, searchTerm) {
results, results,
searchTerm, searchTerm,
}; };
}; }
export function fetchSearchFail(error) { export function fetchSearchFail(error) {
return { return {
type: SEARCH_FETCH_FAIL, type: SEARCH_FETCH_FAIL,
error, error,
}; };
}; }
export const expandSearch = type => (dispatch, getState) => { export const expandSearch = type => (dispatch, getState) => {
const value = getState().getIn(['search', 'value']); const value = getState().getIn(['search', 'value']);

View file

@ -15,7 +15,7 @@ export function changeSetting(path, value) {
dispatch(saveSettings()); dispatch(saveSettings());
}; };
}; }
const debouncedSave = debounce((dispatch, getState) => { const debouncedSave = debounce((dispatch, getState) => {
if (getState().getIn(['settings', 'saved'])) { if (getState().getIn(['settings', 'saved'])) {
@ -31,4 +31,4 @@ const debouncedSave = debounce((dispatch, getState) => {
export function saveSettings() { export function saveSettings() {
return (dispatch, getState) => debouncedSave(dispatch, getState); return (dispatch, getState) => debouncedSave(dispatch, getState);
}; }

View file

@ -45,7 +45,7 @@ export function fetchStatusRequest(id, skipLoading) {
id, id,
skipLoading, skipLoading,
}; };
}; }
export function fetchStatus(id, forceFetch = false) { export function fetchStatus(id, forceFetch = false) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -66,14 +66,14 @@ export function fetchStatus(id, forceFetch = false) {
dispatch(fetchStatusFail(id, error, skipLoading)); dispatch(fetchStatusFail(id, error, skipLoading));
}); });
}; };
}; }
export function fetchStatusSuccess(skipLoading) { export function fetchStatusSuccess(skipLoading) {
return { return {
type: STATUS_FETCH_SUCCESS, type: STATUS_FETCH_SUCCESS,
skipLoading, skipLoading,
}; };
}; }
export function fetchStatusFail(id, error, skipLoading) { export function fetchStatusFail(id, error, skipLoading) {
return { return {
@ -83,7 +83,7 @@ export function fetchStatusFail(id, error, skipLoading) {
skipLoading, skipLoading,
skipAlert: true, skipAlert: true,
}; };
}; }
export function redraft(status, raw_text) { export function redraft(status, raw_text) {
return { return {
@ -91,7 +91,7 @@ export function redraft(status, raw_text) {
status, status,
raw_text, raw_text,
}; };
}; }
export const editStatus = (id, routerHistory) => (dispatch, getState) => { export const editStatus = (id, routerHistory) => (dispatch, getState) => {
let status = getState().getIn(['statuses', id]); let status = getState().getIn(['statuses', id]);
@ -147,21 +147,21 @@ export function deleteStatus(id, routerHistory, withRedraft = false) {
dispatch(deleteStatusFail(id, error)); dispatch(deleteStatusFail(id, error));
}); });
}; };
}; }
export function deleteStatusRequest(id) { export function deleteStatusRequest(id) {
return { return {
type: STATUS_DELETE_REQUEST, type: STATUS_DELETE_REQUEST,
id: id, id: id,
}; };
}; }
export function deleteStatusSuccess(id) { export function deleteStatusSuccess(id) {
return { return {
type: STATUS_DELETE_SUCCESS, type: STATUS_DELETE_SUCCESS,
id: id, id: id,
}; };
}; }
export function deleteStatusFail(id, error) { export function deleteStatusFail(id, error) {
return { return {
@ -169,7 +169,7 @@ export function deleteStatusFail(id, error) {
id: id, id: id,
error: error, error: error,
}; };
}; }
export const updateStatus = status => dispatch => export const updateStatus = status => dispatch =>
dispatch(importFetchedStatus(status)); dispatch(importFetchedStatus(status));
@ -190,14 +190,14 @@ export function fetchContext(id) {
dispatch(fetchContextFail(id, error)); dispatch(fetchContextFail(id, error));
}); });
}; };
}; }
export function fetchContextRequest(id) { export function fetchContextRequest(id) {
return { return {
type: CONTEXT_FETCH_REQUEST, type: CONTEXT_FETCH_REQUEST,
id, id,
}; };
}; }
export function fetchContextSuccess(id, ancestors, descendants) { export function fetchContextSuccess(id, ancestors, descendants) {
return { return {
@ -207,7 +207,7 @@ export function fetchContextSuccess(id, ancestors, descendants) {
descendants, descendants,
statuses: ancestors.concat(descendants), statuses: ancestors.concat(descendants),
}; };
}; }
export function fetchContextFail(id, error) { export function fetchContextFail(id, error) {
return { return {
@ -216,7 +216,7 @@ export function fetchContextFail(id, error) {
error, error,
skipAlert: true, skipAlert: true,
}; };
}; }
export function muteStatus(id) { export function muteStatus(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -228,21 +228,21 @@ export function muteStatus(id) {
dispatch(muteStatusFail(id, error)); dispatch(muteStatusFail(id, error));
}); });
}; };
}; }
export function muteStatusRequest(id) { export function muteStatusRequest(id) {
return { return {
type: STATUS_MUTE_REQUEST, type: STATUS_MUTE_REQUEST,
id, id,
}; };
}; }
export function muteStatusSuccess(id) { export function muteStatusSuccess(id) {
return { return {
type: STATUS_MUTE_SUCCESS, type: STATUS_MUTE_SUCCESS,
id, id,
}; };
}; }
export function muteStatusFail(id, error) { export function muteStatusFail(id, error) {
return { return {
@ -250,7 +250,7 @@ export function muteStatusFail(id, error) {
id, id,
error, error,
}; };
}; }
export function unmuteStatus(id) { export function unmuteStatus(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -262,21 +262,21 @@ export function unmuteStatus(id) {
dispatch(unmuteStatusFail(id, error)); dispatch(unmuteStatusFail(id, error));
}); });
}; };
}; }
export function unmuteStatusRequest(id) { export function unmuteStatusRequest(id) {
return { return {
type: STATUS_UNMUTE_REQUEST, type: STATUS_UNMUTE_REQUEST,
id, id,
}; };
}; }
export function unmuteStatusSuccess(id) { export function unmuteStatusSuccess(id) {
return { return {
type: STATUS_UNMUTE_SUCCESS, type: STATUS_UNMUTE_SUCCESS,
id, id,
}; };
}; }
export function unmuteStatusFail(id, error) { export function unmuteStatusFail(id, error) {
return { return {
@ -284,7 +284,7 @@ export function unmuteStatusFail(id, error) {
id, id,
error, error,
}; };
}; }
export function hideStatus(ids) { export function hideStatus(ids) {
if (!Array.isArray(ids)) { if (!Array.isArray(ids)) {
@ -295,7 +295,7 @@ export function hideStatus(ids) {
type: STATUS_HIDE, type: STATUS_HIDE,
ids, ids,
}; };
}; }
export function revealStatus(ids) { export function revealStatus(ids) {
if (!Array.isArray(ids)) { if (!Array.isArray(ids)) {
@ -306,7 +306,7 @@ export function revealStatus(ids) {
type: STATUS_REVEAL, type: STATUS_REVEAL,
ids, ids,
}; };
}; }
export function toggleStatusCollapse(id, isCollapsed) { export function toggleStatusCollapse(id, isCollapsed) {
return { return {
@ -314,7 +314,7 @@ export function toggleStatusCollapse(id, isCollapsed) {
id, id,
isCollapsed, isCollapsed,
}; };
}; }
export const translateStatus = id => (dispatch, getState) => { export const translateStatus = id => (dispatch, getState) => {
dispatch(translateStatusRequest(id)); dispatch(translateStatusRequest(id));

View file

@ -21,4 +21,4 @@ export function hydrateStore(rawState) {
dispatch(hydrateCompose()); dispatch(hydrateCompose());
dispatch(importFetchedAccounts(Object.values(rawState.accounts))); dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
}; };
}; }

View file

@ -21,14 +21,14 @@ export function fetchSuggestions(withRelationships = false) {
} }
}).catch(error => dispatch(fetchSuggestionsFail(error))); }).catch(error => dispatch(fetchSuggestionsFail(error)));
}; };
}; }
export function fetchSuggestionsRequest() { export function fetchSuggestionsRequest() {
return { return {
type: SUGGESTIONS_FETCH_REQUEST, type: SUGGESTIONS_FETCH_REQUEST,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchSuggestionsSuccess(suggestions) { export function fetchSuggestionsSuccess(suggestions) {
return { return {
@ -36,7 +36,7 @@ export function fetchSuggestionsSuccess(suggestions) {
suggestions, suggestions,
skipLoading: true, skipLoading: true,
}; };
}; }
export function fetchSuggestionsFail(error) { export function fetchSuggestionsFail(error) {
return { return {
@ -45,7 +45,7 @@ export function fetchSuggestionsFail(error) {
skipLoading: true, skipLoading: true,
skipAlert: true, skipAlert: true,
}; };
}; }
export const dismissSuggestion = accountId => (dispatch, getState) => { export const dismissSuggestion = accountId => (dispatch, getState) => {
dispatch({ dispatch({

View file

@ -51,7 +51,7 @@ export function updateTimeline(timeline, status, accept) {
dispatch(submitMarkers()); dispatch(submitMarkers());
} }
}; };
}; }
export function deleteFromTimelines(id) { export function deleteFromTimelines(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -67,13 +67,13 @@ export function deleteFromTimelines(id) {
reblogOf, reblogOf,
}); });
}; };
}; }
export function clearTimeline(timeline) { export function clearTimeline(timeline) {
return (dispatch) => { return (dispatch) => {
dispatch({ type: TIMELINE_CLEAR, timeline }); dispatch({ type: TIMELINE_CLEAR, timeline });
}; };
}; }
const noOp = () => {}; const noOp = () => {};
@ -122,7 +122,7 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
done(); done();
}); });
}; };
}; }
export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) { export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) {
return (dispatch, getState) => { return (dispatch, getState) => {
@ -168,7 +168,7 @@ export function expandTimelineRequest(timeline, isLoadingMore) {
timeline, timeline,
skipLoading: !isLoadingMore, skipLoading: !isLoadingMore,
}; };
}; }
export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadingRecent, isLoadingMore, usePendingItems) { export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadingRecent, isLoadingMore, usePendingItems) {
return { return {
@ -181,7 +181,7 @@ export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadi
usePendingItems, usePendingItems,
skipLoading: !isLoadingMore, skipLoading: !isLoadingMore,
}; };
}; }
export function expandTimelineFail(timeline, error, isLoadingMore) { export function expandTimelineFail(timeline, error, isLoadingMore) {
return { return {
@ -191,7 +191,7 @@ export function expandTimelineFail(timeline, error, isLoadingMore) {
skipLoading: !isLoadingMore, skipLoading: !isLoadingMore,
skipNotFound: timeline.startsWith('account:'), skipNotFound: timeline.startsWith('account:'),
}; };
}; }
export function scrollTopTimeline(timeline, top) { export function scrollTopTimeline(timeline, top) {
return { return {
@ -199,7 +199,7 @@ export function scrollTopTimeline(timeline, top) {
timeline, timeline,
top, top,
}; };
}; }
export function connectTimeline(timeline) { export function connectTimeline(timeline) {
return { return {
@ -207,7 +207,7 @@ export function connectTimeline(timeline) {
timeline, timeline,
usePendingItems: preferPendingItems, usePendingItems: preferPendingItems,
}; };
}; }
export const disconnectTimeline = timeline => ({ export const disconnectTimeline = timeline => ({
type: TIMELINE_DISCONNECT, type: TIMELINE_DISCONNECT,

View file

@ -9,4 +9,4 @@ export function start() {
} catch (e) { } catch (e) {
// If called twice // If called twice
} }
}; }

View file

@ -8,4 +8,4 @@ export default function compareId (id1, id2) {
} else { } else {
return id1.length > id2.length ? 1 : -1; return id1.length > id2.length ? 1 : -1;
} }
}; }

View file

@ -137,7 +137,7 @@ export default class Retention extends React.PureComponent {
break; break;
default: default:
title = <FormattedMessage id='admin.dashboard.monthly_retention' defaultMessage='User retention rate by month after sign-up' />; title = <FormattedMessage id='admin.dashboard.monthly_retention' defaultMessage='User retention rate by month after sign-up' />;
}; }
return ( return (
<div className='retention'> <div className='retention'>

View file

@ -246,12 +246,13 @@ class StatusActionBar extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen }); menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
if (publicStatus) { if (publicStatus && isRemote) {
if (isRemote) { menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') }); }
}
menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy }); menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
if (publicStatus) {
menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed }); menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
} }

View file

@ -23,7 +23,9 @@ export const store = configureStore();
const hydrateAction = hydrateStore(initialState); const hydrateAction = hydrateStore(initialState);
store.dispatch(hydrateAction); store.dispatch(hydrateAction);
store.dispatch(fetchCustomEmojis()); if (initialState.meta.me) {
store.dispatch(fetchCustomEmojis());
}
const createIdentityContext = state => ({ const createIdentityContext = state => ({
signedIn: !!state.meta.me, signedIn: !!state.meta.me,

View file

@ -0,0 +1,37 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { FormattedMessage } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
import Icon from 'mastodon/components/icon';
export default class FollowRequestNote extends ImmutablePureComponent {
static propTypes = {
account: ImmutablePropTypes.map.isRequired,
};
render () {
const { account, onAuthorize, onReject } = this.props;
return (
<div className='follow-request-banner'>
<div className='follow-request-banner__message'>
<FormattedMessage id='account.requested_follow' defaultMessage='{name} has requested to follow you' values={{ name: <bdi><strong dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi> }} />
</div>
<div className='follow-request-banner__action'>
<button type='button' className='button button-tertiary button--confirmation' onClick={onAuthorize}>
<Icon id='check' fixedWidth />
<FormattedMessage id='follow_request.authorize' defaultMessage='Authorize' />
</button>
<button type='button' className='button button-tertiary button--destructive' onClick={onReject}>
<Icon id='times' fixedWidth />
<FormattedMessage id='follow_request.reject' defaultMessage='Reject' />
</button>
</div>
</div>
);
}
}

View file

@ -14,6 +14,7 @@ import ShortNumber from 'mastodon/components/short_number';
import { NavLink } from 'react-router-dom'; import { NavLink } from 'react-router-dom';
import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
import AccountNoteContainer from '../containers/account_note_container'; import AccountNoteContainer from '../containers/account_note_container';
import FollowRequestNoteContainer from '../containers/follow_request_note_container';
import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions'; import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions';
import { Helmet } from 'react-helmet'; import { Helmet } from 'react-helmet';
@ -311,6 +312,8 @@ class Header extends ImmutablePureComponent {
return ( return (
<div className={classNames('account__header', { inactive: !!account.get('moved') })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> <div className={classNames('account__header', { inactive: !!account.get('moved') })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
{!(suspended || hidden || account.get('moved')) && account.getIn(['relationship', 'requested_by']) && <FollowRequestNoteContainer account={account} />}
<div className='account__header__image'> <div className='account__header__image'>
<div className='account__header__info'> <div className='account__header__info'>
{!suspended && info} {!suspended && info}

View file

@ -0,0 +1,15 @@
import { connect } from 'react-redux';
import FollowRequestNote from '../components/follow_request_note';
import { authorizeFollowRequest, rejectFollowRequest } from 'mastodon/actions/accounts';
const mapDispatchToProps = (dispatch, { account }) => ({
onAuthorize () {
dispatch(authorizeFollowRequest(account.get('id')));
},
onReject () {
dispatch(rejectFollowRequest(account.get('id')));
},
});
export default connect(null, mapDispatchToProps)(FollowRequestNote);

View file

@ -104,6 +104,7 @@ export default class MediaItem extends ImmutablePureComponent {
<video <video
className='media-gallery__item-gifv-thumbnail' className='media-gallery__item-gifv-thumbnail'
aria-label={attachment.get('description')} aria-label={attachment.get('description')}
title={attachment.get('description')}
role='application' role='application'
src={attachment.get('url')} src={attachment.get('url')}
onMouseEnter={this.handleMouseEnter} onMouseEnter={this.handleMouseEnter}

View file

@ -72,4 +72,4 @@ class ClosedRegistrationsModal extends ImmutablePureComponent {
); );
} }
}; }

View file

@ -16,7 +16,6 @@ import PollFormContainer from '../containers/poll_form_container';
import UploadFormContainer from '../containers/upload_form_container'; import UploadFormContainer from '../containers/upload_form_container';
import WarningContainer from '../containers/warning_container'; import WarningContainer from '../containers/warning_container';
import LanguageDropdown from '../containers/language_dropdown_container'; import LanguageDropdown from '../containers/language_dropdown_container';
import { isMobile } from '../../../is_mobile';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import { length } from 'stringz'; import { length } from 'stringz';
import { countableText } from '../util/counter'; import { countableText } from '../util/counter';
@ -61,14 +60,14 @@ class ComposeForm extends ImmutablePureComponent {
onChangeSpoilerText: PropTypes.func.isRequired, onChangeSpoilerText: PropTypes.func.isRequired,
onPaste: PropTypes.func.isRequired, onPaste: PropTypes.func.isRequired,
onPickEmoji: PropTypes.func.isRequired, onPickEmoji: PropTypes.func.isRequired,
showSearch: PropTypes.bool, autoFocus: PropTypes.bool,
anyMedia: PropTypes.bool, anyMedia: PropTypes.bool,
isInReply: PropTypes.bool, isInReply: PropTypes.bool,
singleColumn: PropTypes.bool, singleColumn: PropTypes.bool,
}; };
static defaultProps = { static defaultProps = {
showSearch: false, autoFocus: false,
}; };
handleChange = (e) => { handleChange = (e) => {
@ -154,7 +153,7 @@ class ComposeForm extends ImmutablePureComponent {
// - Replying to zero or one users, places the cursor at the end of the textbox. // - Replying to zero or one users, places the cursor at the end of the textbox.
// - Replying to more than one user, selects any usernames past the first; // - Replying to more than one user, selects any usernames past the first;
// this provides a convenient shortcut to drop everyone else from the conversation. // this provides a convenient shortcut to drop everyone else from the conversation.
if (this.props.focusDate !== prevProps.focusDate) { if (this.props.focusDate && this.props.focusDate !== prevProps.focusDate) {
let selectionEnd, selectionStart; let selectionEnd, selectionStart;
if (this.props.preselectDate !== prevProps.preselectDate && this.props.isInReply) { if (this.props.preselectDate !== prevProps.preselectDate && this.props.isInReply) {
@ -180,7 +179,7 @@ class ComposeForm extends ImmutablePureComponent {
} else if (this.props.spoiler !== prevProps.spoiler) { } else if (this.props.spoiler !== prevProps.spoiler) {
if (this.props.spoiler) { if (this.props.spoiler) {
this.spoilerText.input.focus(); this.spoilerText.input.focus();
} else { } else if (prevProps.spoiler) {
this.autosuggestTextarea.textarea.focus(); this.autosuggestTextarea.textarea.focus();
} }
} }
@ -207,7 +206,7 @@ class ComposeForm extends ImmutablePureComponent {
} }
render () { render () {
const { intl, onPaste, showSearch } = this.props; const { intl, onPaste, autoFocus } = this.props;
const disabled = this.props.isSubmitting; const disabled = this.props.isSubmitting;
let publishText = ''; let publishText = '';
@ -257,7 +256,7 @@ class ComposeForm extends ImmutablePureComponent {
onSuggestionsClearRequested={this.onSuggestionsClearRequested} onSuggestionsClearRequested={this.onSuggestionsClearRequested}
onSuggestionSelected={this.onSuggestionSelected} onSuggestionSelected={this.onSuggestionSelected}
onPaste={onPaste} onPaste={onPaste}
autoFocus={!showSearch && !isMobile(window.innerWidth)} autoFocus={autoFocus}
> >
<EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} /> <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />

View file

@ -165,6 +165,7 @@ class PollForm extends ImmutablePureComponent {
<option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option> <option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option>
<option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option> <option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option>
<option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option> <option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option>
<option value={43200}>{intl.formatMessage(messages.hours, { number: 12 })}</option>
<option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option> <option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option>
<option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option> <option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option>
<option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option> <option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option>

View file

@ -123,27 +123,24 @@ class Search extends React.PureComponent {
return ( return (
<div className='search'> <div className='search'>
<label> <input
<span style={{ display: 'none' }}>{intl.formatMessage(messages.placeholder)}</span> ref={this.setRef}
<input className='search__input'
ref={this.setRef} type='text'
className='search__input' placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
type='text' aria-label={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)} value={value}
value={value} onChange={this.handleChange}
onChange={this.handleChange} onKeyUp={this.handleKeyUp}
onKeyUp={this.handleKeyUp} onFocus={this.handleFocus}
onFocus={this.handleFocus} onBlur={this.handleBlur}
onBlur={this.handleBlur} />
/>
</label>
<div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}> <div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
<Icon id='search' className={hasValue ? '' : 'active'} /> <Icon id='search' className={hasValue ? '' : 'active'} />
<Icon id='times-circle' className={hasValue ? 'active' : ''} aria-label={intl.formatMessage(messages.placeholder)} /> <Icon id='times-circle' className={hasValue ? 'active' : ''} aria-label={intl.formatMessage(messages.placeholder)} />
</div> </div>
<Overlay show={expanded && !hasValue} placement='bottom' target={this} container={this}>
<Overlay show={expanded && !hasValue} placement='bottom' target={this}>
<SearchPopout /> <SearchPopout />
</Overlay> </Overlay>
</div> </div>

View file

@ -24,7 +24,6 @@ const mapStateToProps = state => ({
isEditing: state.getIn(['compose', 'id']) !== null, isEditing: state.getIn(['compose', 'id']) !== null,
isChangingUpload: state.getIn(['compose', 'is_changing_upload']), isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
isUploading: state.getIn(['compose', 'is_uploading']), isUploading: state.getIn(['compose', 'is_uploading']),
showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),
anyMedia: state.getIn(['compose', 'media_attachments']).size > 0, anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
isInReply: state.getIn(['compose', 'in_reply_to']) !== null, isInReply: state.getIn(['compose', 'in_reply_to']) !== null,
}); });

View file

@ -18,6 +18,7 @@ import Icon from 'mastodon/components/icon';
import { logOut } from 'mastodon/utils/log_out'; import { logOut } from 'mastodon/utils/log_out';
import Column from 'mastodon/components/column'; import Column from 'mastodon/components/column';
import { Helmet } from 'react-helmet'; import { Helmet } from 'react-helmet';
import { isMobile } from '../../is_mobile';
const messages = defineMessages({ const messages = defineMessages({
start: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@ -115,7 +116,7 @@ class Compose extends React.PureComponent {
<div className='drawer__inner' onFocus={this.onFocus}> <div className='drawer__inner' onFocus={this.onFocus}>
<NavigationContainer onClose={this.onBlur} /> <NavigationContainer onClose={this.onBlur} />
<ComposeFormContainer /> <ComposeFormContainer autoFocus={!isMobile(window.innerWidth)} />
<div className='drawer__inner__mastodon'> <div className='drawer__inner__mastodon'>
<img alt='' draggable='false' src={mascot || elephantUIPlane} /> <img alt='' draggable='false' src={mascot || elephantUIPlane} />

View file

@ -6,4 +6,4 @@ export function countableText(inputText) {
return inputText return inputText
.replace(urlRegex, urlPlaceholder) .replace(urlRegex, urlPlaceholder)
.replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3'); .replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
}; }

View file

@ -24,16 +24,6 @@ const mapStateToProps = state => ({
isSearching: state.getIn(['search', 'submitted']) || !showTrends, isSearching: state.getIn(['search', 'submitted']) || !showTrends,
}); });
// Fix strange bug on Safari where <span> (rendered by FormattedMessage) disappears
// after clicking around Explore top bar (issue #20885).
// Removing width=100% from <a> also fixes it, as well as replacing <span> with <div>
// We're choosing to wrap span with div to keep the changes local only to this tool bar.
const WrapFormattedMessage = ({ children, ...props }) => <div><FormattedMessage {...props}>{children}</FormattedMessage></div>;
WrapFormattedMessage.propTypes = {
children: PropTypes.any,
};
export default @connect(mapStateToProps) export default @connect(mapStateToProps)
@injectIntl @injectIntl
class Explore extends React.PureComponent { class Explore extends React.PureComponent {
@ -78,12 +68,22 @@ class Explore extends React.PureComponent {
{isSearching ? ( {isSearching ? (
<SearchResults /> <SearchResults />
) : ( ) : (
<React.Fragment> <>
<div className='account__section-headline'> <div className='account__section-headline'>
<NavLink exact to='/explore'><WrapFormattedMessage id='explore.trending_statuses' defaultMessage='Posts' /></NavLink> <NavLink exact to='/explore'>
<NavLink exact to='/explore/tags'><WrapFormattedMessage id='explore.trending_tags' defaultMessage='Hashtags' /></NavLink> <FormattedMessage tagName='div' id='explore.trending_statuses' defaultMessage='Posts' />
<NavLink exact to='/explore/links'><WrapFormattedMessage id='explore.trending_links' defaultMessage='News' /></NavLink> </NavLink>
{signedIn && <NavLink exact to='/explore/suggestions'><WrapFormattedMessage id='explore.suggested_follows' defaultMessage='For you' /></NavLink>} <NavLink exact to='/explore/tags'>
<FormattedMessage tagName='div' id='explore.trending_tags' defaultMessage='Hashtags' />
</NavLink>
<NavLink exact to='/explore/links'>
<FormattedMessage tagName='div' id='explore.trending_links' defaultMessage='News' />
</NavLink>
{signedIn && (
<NavLink exact to='/explore/suggestions'>
<FormattedMessage tagName='div' id='explore.suggested_follows' defaultMessage='For you' />
</NavLink>
)}
</div> </div>
<Switch> <Switch>
@ -97,7 +97,7 @@ class Explore extends React.PureComponent {
<title>{intl.formatMessage(messages.title)}</title> <title>{intl.formatMessage(messages.title)}</title>
<meta name='robots' content={isSearching ? 'noindex' : 'all'} /> <meta name='robots' content={isSearching ? 'noindex' : 'all'} />
</Helmet> </Helmet>
</React.Fragment> </>
)} )}
</div> </div>
</Column> </Column>

View file

@ -38,7 +38,7 @@ class ColumnSettings extends React.PureComponent {
} else { } else {
return tags; return tags;
} }
}; }
onSelect = mode => value => { onSelect = mode => value => {
const oldValue = this.tags(mode); const oldValue = this.tags(mode);
@ -98,7 +98,7 @@ class ColumnSettings extends React.PureComponent {
default: default:
return ''; return '';
} }
}; }
render () { render () {
const { settings, onChange } = this.props; const { settings, onChange } = this.props;

View file

@ -194,7 +194,7 @@ class HashtagTimeline extends React.PureComponent {
const following = tag.get('following'); const following = tag.get('following');
followButton = ( followButton = (
<button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}> <button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} active={following} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
<Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' /> <Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
</button> </button>
); );

View file

@ -126,7 +126,7 @@ class ListTimeline extends React.PureComponent {
onConfirm: () => { onConfirm: () => {
dispatch(deleteList(id)); dispatch(deleteList(id));
if (!!columnId) { if (columnId) {
dispatch(removeColumn(columnId)); dispatch(removeColumn(columnId));
} else { } else {
this.context.router.history.push('/lists'); this.context.router.history.push('/lists');

View file

@ -97,7 +97,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
if (this.mediaQuery.removeEventListener) { if (this.mediaQuery.removeEventListener) {
this.mediaQuery.removeEventListener('change', this.handleLayoutChange); this.mediaQuery.removeEventListener('change', this.handleLayoutChange);
} else { } else {
this.mediaQuery.removeListener(this.handleLayouteChange); this.mediaQuery.removeListener(this.handleLayoutChange);
} }
} }
} }

View file

@ -89,4 +89,4 @@ class DisabledAccountBanner extends React.PureComponent {
); );
} }
}; }

View file

@ -291,11 +291,11 @@ class FocalPointModal extends ImmutablePureComponent {
let descriptionLabel = null; let descriptionLabel = null;
if (media.get('type') === 'audio') { if (media.get('type') === 'audio') {
descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people with hearing loss' />; descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people who are hard of hearing' />;
} else if (media.get('type') === 'video') { } else if (media.get('type') === 'video') {
descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people with hearing loss or visual impairment' />; descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people who are deaf, hard of hearing, blind or have low vision' />;
} else { } else {
descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for the visually impaired' />; descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for people who are blind or have low vision' />;
} }
let ocrMessage = ''; let ocrMessage = '';

View file

@ -91,4 +91,4 @@ class LinkFooter extends React.PureComponent {
); );
} }
}; }

View file

@ -46,7 +46,7 @@ export class WrappedRoute extends React.Component {
return { return {
hasError: true, hasError: true,
}; };
}; }
state = { state = {
hasError: false, hasError: false,

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Plasings en antwoorde", "account.posts_with_replies": "Plasings en antwoorde",
"account.report": "Rapporteer @{name}", "account.report": "Rapporteer @{name}",
"account.requested": "Wag op goedkeuring. Klik om volgversoek te kanselleer", "account.requested": "Wag op goedkeuring. Klik om volgversoek te kanselleer",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Deel @{name} se profiel", "account.share": "Deel @{name} se profiel",
"account.show_reblogs": "Wys aangestuurde plasings van @{name}", "account.show_reblogs": "Wys aangestuurde plasings van @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Plaas} other {{counter} Plasings}}", "account.statuses_counter": "{count, plural, one {{counter} Plaas} other {{counter} Plasings}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue", "errors.unexpected_crash.report_issue": "Report issue",
"explore.search_results": "Soekresultate", "explore.search_results": "Soekresultate",
"explore.suggested_follows": "For you",
"explore.title": "Explore", "explore.title": "Explore",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!", "filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Publicacions y respuestas", "account.posts_with_replies": "Publicacions y respuestas",
"account.report": "Denunciar a @{name}", "account.report": "Denunciar a @{name}",
"account.requested": "Esperando l'aprebación", "account.requested": "Esperando l'aprebación",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Compartir lo perfil de @{name}", "account.share": "Compartir lo perfil de @{name}",
"account.show_reblogs": "Amostrar retutz de @{name}", "account.show_reblogs": "Amostrar retutz de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}", "account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Copiar lo seguimiento de pila en o portafuellas", "errors.unexpected_crash.copy_stacktrace": "Copiar lo seguimiento de pila en o portafuellas",
"errors.unexpected_crash.report_issue": "Informar d'un problema/error", "errors.unexpected_crash.report_issue": "Informar d'un problema/error",
"explore.search_results": "Resultaus de busqueda", "explore.search_results": "Resultaus de busqueda",
"explore.suggested_follows": "For you",
"explore.title": "Explorar", "explore.title": "Explorar",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no s'aplica a lo contexto en o qual ha accediu a esta publlicación. Si quiers que la publicación sía filtrada tamién en este contexto, habrás d'editar lo filtro.", "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no s'aplica a lo contexto en o qual ha accediu a esta publlicación. Si quiers que la publicación sía filtrada tamién en este contexto, habrás d'editar lo filtro.",
"filter_modal.added.context_mismatch_title": "Lo contexto no coincide!", "filter_modal.added.context_mismatch_title": "Lo contexto no coincide!",
"filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducau, amenesterá cambiar la calendata de caducidat pa que s'aplique.", "filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducau, amenesterá cambiar la calendata de caducidat pa que s'aplique.",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "المنشورات والرُدود", "account.posts_with_replies": "المنشورات والرُدود",
"account.report": "الإبلاغ عن @{name}", "account.report": "الإبلاغ عن @{name}",
"account.requested": "في انتظار القبول. اضغط لإلغاء طلب المُتابعة", "account.requested": "في انتظار القبول. اضغط لإلغاء طلب المُتابعة",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "شارِك الملف التعريفي لـ @{name}", "account.share": "شارِك الملف التعريفي لـ @{name}",
"account.show_reblogs": "عرض مشاركات @{name}", "account.show_reblogs": "عرض مشاركات @{name}",
"account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}", "account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة", "errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
"errors.unexpected_crash.report_issue": "الإبلاغ عن خلل", "errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
"explore.search_results": "نتائج البحث", "explore.search_results": "نتائج البحث",
"explore.suggested_follows": "For you",
"explore.title": "استكشف", "explore.title": "استكشف",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.", "filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.",
"filter_modal.added.context_mismatch_title": "عدم تطابق السياق!", "filter_modal.added.context_mismatch_title": "عدم تطابق السياق!",
"filter_modal.added.expired_explanation": "انتهت صلاحية فئة عامل التصفية هذه، سوف تحتاج إلى تغيير تاريخ انتهاء الصلاحية لتطبيقها.", "filter_modal.added.expired_explanation": "انتهت صلاحية فئة عامل التصفية هذه، سوف تحتاج إلى تغيير تاريخ انتهاء الصلاحية لتطبيقها.",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Artículos ya rempuestes", "account.posts_with_replies": "Artículos ya rempuestes",
"account.report": "Report @{name}", "account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request", "account.requested": "Awaiting approval. Click to cancel follow request",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Share @{name}'s profile", "account.share": "Share @{name}'s profile",
"account.show_reblogs": "Amosar los artículos compartíos de @{name}", "account.show_reblogs": "Amosar los artículos compartíos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} artículu} other {{counter} artículos}}", "account.statuses_counter": "{count, plural, one {{counter} artículu} other {{counter} artículos}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue", "errors.unexpected_crash.report_issue": "Report issue",
"explore.search_results": "Resultaos de la busca", "explore.search_results": "Resultaos de la busca",
"explore.suggested_follows": "Pa ti",
"explore.title": "Esploración", "explore.title": "Esploración",
"explore.trending_links": "Noticies",
"explore.trending_statuses": "Artículos",
"explore.trending_tags": "Etiquetes",
"filter_modal.added.context_mismatch_explanation": "Esta categoría de peñera nun s'aplica al contestu nel qu'accediesti a esti artículu. Si tamién quies que se peñere l'artículu nesti contestu, tienes d'editar la peñera.", "filter_modal.added.context_mismatch_explanation": "Esta categoría de peñera nun s'aplica al contestu nel qu'accediesti a esti artículu. Si tamién quies que se peñere l'artículu nesti contestu, tienes d'editar la peñera.",
"filter_modal.added.context_mismatch_title": "¡El contestu nun coincide!", "filter_modal.added.context_mismatch_title": "¡El contestu nun coincide!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@ -257,7 +262,7 @@
"follow_recommendations.lead": "Los artículos de los perfiles que sigas van apaecer n'orde cronolóxicu nel to feed d'aniciu. ¡Nun tengas mieu d'enquivocate, pues dexar de siguilos con facilidá en cualesquier momentu!", "follow_recommendations.lead": "Los artículos de los perfiles que sigas van apaecer n'orde cronolóxicu nel to feed d'aniciu. ¡Nun tengas mieu d'enquivocate, pues dexar de siguilos con facilidá en cualesquier momentu!",
"follow_request.authorize": "Autorizar", "follow_request.authorize": "Autorizar",
"follow_request.reject": "Refugar", "follow_request.reject": "Refugar",
"follow_requests.unlocked_explanation": "Magar que la cuenta nun tea bloquiada, ye posible que'l personal del dominiu {domain} quiera revisar manualmente les solicitúes de siguimientu d'estes cuentes.", "follow_requests.unlocked_explanation": "Magar que la to cuenta nun seya privada, el personal del dominiu «{domain}» pensó qu'a lo meyor quies revisar manualmente les solicitúes de siguimientu d'estes cuentes.",
"footer.about": "Tocante a", "footer.about": "Tocante a",
"footer.directory": "Direutoriu de perfiles", "footer.directory": "Direutoriu de perfiles",
"footer.get_app": "Consiguir l'aplicación", "footer.get_app": "Consiguir l'aplicación",
@ -617,13 +622,13 @@
"upload_button.label": "Add images, a video or an audio file", "upload_button.label": "Add images, a video or an audio file",
"upload_error.limit": "File upload limit exceeded.", "upload_error.limit": "File upload limit exceeded.",
"upload_error.poll": "La xuba de ficheros nun ta permitida coles encuestes.", "upload_error.poll": "La xuba de ficheros nun ta permitida coles encuestes.",
"upload_form.audio_description": "Descripción pa persones con perda auditiva", "upload_form.audio_description": "Describe for people who are hard of hearing",
"upload_form.description": "Descripción pa persones con discapacidá visual", "upload_form.description": "Describe for people who are blind or have low vision",
"upload_form.description_missing": "Nun s'amestó la descripción", "upload_form.description_missing": "Nun s'amestó la descripción",
"upload_form.edit": "Editar", "upload_form.edit": "Editar",
"upload_form.thumbnail": "Change thumbnail", "upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Desaniciar", "upload_form.undo": "Desaniciar",
"upload_form.video_description": "Descripción pa persones con perda auditiva o discapacidá visual", "upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
"upload_modal.analyzing_picture": "Analizando la semeya…", "upload_modal.analyzing_picture": "Analizando la semeya…",
"upload_modal.apply": "Aplicar", "upload_modal.apply": "Aplicar",
"upload_modal.applying": "Aplicando…", "upload_modal.applying": "Aplicando…",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Допісы і адказы", "account.posts_with_replies": "Допісы і адказы",
"account.report": "Паскардзіцца на @{name}", "account.report": "Паскардзіцца на @{name}",
"account.requested": "Чакаецца ўхваленне. Націсніце, каб скасаваць запыт на падпіску", "account.requested": "Чакаецца ўхваленне. Націсніце, каб скасаваць запыт на падпіску",
"account.requested_follow": "{name} адправіў запыт на падпіску",
"account.share": "Абагуліць профіль @{name}", "account.share": "Абагуліць профіль @{name}",
"account.show_reblogs": "Паказаць падштурхоўванні ад @{name}", "account.show_reblogs": "Паказаць падштурхоўванні ад @{name}",
"account.statuses_counter": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}", "account.statuses_counter": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Дадаць дыягнастычны стэк у буфер абмену", "errors.unexpected_crash.copy_stacktrace": "Дадаць дыягнастычны стэк у буфер абмену",
"errors.unexpected_crash.report_issue": "Паведаміць аб праблеме", "errors.unexpected_crash.report_issue": "Паведаміць аб праблеме",
"explore.search_results": "Вынікі пошуку", "explore.search_results": "Вынікі пошуку",
"explore.suggested_follows": "Для вас",
"explore.title": "Агляд", "explore.title": "Агляд",
"explore.trending_links": "Навіны",
"explore.trending_statuses": "Допісы",
"explore.trending_tags": "Хэштэгі",
"filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім вы адкрылі гэты пост. Калі вы хочаце, каб паведамленне таксама было адфільтравана ў гэтым кантэксце, вам трэба будзе адрэдагаваць фільтр", "filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім вы адкрылі гэты пост. Калі вы хочаце, каб паведамленне таксама было адфільтравана ў гэтым кантэксце, вам трэба будзе адрэдагаваць фільтр",
"filter_modal.added.context_mismatch_title": "Неадпаведны кантэкст!", "filter_modal.added.context_mismatch_title": "Неадпаведны кантэкст!",
"filter_modal.added.expired_explanation": "Тэрмін дзеяння гэтай катэгорыі фільтраў скончыўся, вам трэба будзе змяніць дату заканчэння тэрміну дзеяння, каб яна прымянялася", "filter_modal.added.expired_explanation": "Тэрмін дзеяння гэтай катэгорыі фільтраў скончыўся, вам трэба будзе змяніць дату заканчэння тэрміну дзеяння, каб яна прымянялася",

View file

@ -12,7 +12,7 @@
"about.powered_by": "Децентрализирана социална мрежа, захранвана от {mastodon}", "about.powered_by": "Децентрализирана социална мрежа, захранвана от {mastodon}",
"about.rules": "Правила на сървъра", "about.rules": "Правила на сървъра",
"account.account_note_header": "Бележка", "account.account_note_header": "Бележка",
"account.add_or_remove_from_list": "Добави или премахни от списъците", "account.add_or_remove_from_list": "Добавяне или премахване от списъци",
"account.badges.bot": "Бот", "account.badges.bot": "Бот",
"account.badges.group": "Група", "account.badges.group": "Група",
"account.block": "Блокиране на @{name}", "account.block": "Блокиране на @{name}",
@ -40,7 +40,7 @@
"account.go_to_profile": "Към профила", "account.go_to_profile": "Към профила",
"account.hide_reblogs": "Скриване на споделяния от @{name}", "account.hide_reblogs": "Скриване на споделяния от @{name}",
"account.joined_short": "Дата на присъединяване", "account.joined_short": "Дата на присъединяване",
"account.languages": "Смяна на показваните езици", "account.languages": "Смяна на езиците на абонамент",
"account.link_verified_on": "Собствеността върху тази връзка е проверена на {date}", "account.link_verified_on": "Собствеността върху тази връзка е проверена на {date}",
"account.locked_info": "Състоянието за поверителността на акаунта е зададено заключено. Собственикът преглежда ръчно от кого може да се следва.", "account.locked_info": "Състоянието за поверителността на акаунта е зададено заключено. Собственикът преглежда ръчно от кого може да се следва.",
"account.media": "Мултимедия", "account.media": "Мултимедия",
@ -51,17 +51,18 @@
"account.muted": "Заглушено", "account.muted": "Заглушено",
"account.open_original_page": "Отваряне на оригиналната страница", "account.open_original_page": "Отваряне на оригиналната страница",
"account.posts": "Публикации", "account.posts": "Публикации",
"account.posts_with_replies": "С отговори", "account.posts_with_replies": "Публикации и отговори",
"account.report": "Докладване на @{name}", "account.report": "Докладване на @{name}",
"account.requested": "Чака се одобрение. Щракнете за отмяна на заявката за последване", "account.requested": "Чака се одобрение. Щракнете за отмяна на заявката за последване",
"account.share": "Изпращане на профила на @{name}", "account.requested_follow": "{name} поиска да ви последва",
"account.share": "Споделяне на профила на @{name}",
"account.show_reblogs": "Показване на споделяния от @{name}", "account.show_reblogs": "Показване на споделяния от @{name}",
"account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}", "account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
"account.unblock": "Отблокиране на @{name}", "account.unblock": "Отблокиране на @{name}",
"account.unblock_domain": "Отблокиране на домейн {domain}", "account.unblock_domain": "Отблокиране на домейн {domain}",
"account.unblock_short": "Отблокирване", "account.unblock_short": "Отблокирване",
"account.unendorse": "Не включвайте в профила", "account.unendorse": "Не включвайте в профила",
"account.unfollow": "Не следвай", "account.unfollow": "Без следване",
"account.unmute": "Без заглушаване на @{name}", "account.unmute": "Без заглушаване на @{name}",
"account.unmute_notifications": "Без заглушаване на известия от @{name}", "account.unmute_notifications": "Без заглушаване на известия от @{name}",
"account.unmute_short": "Без заглушаване", "account.unmute_short": "Без заглушаване",
@ -142,11 +143,11 @@
"compose_form.publish_loud": "{publish}!", "compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Запазване на промените", "compose_form.save_changes": "Запазване на промените",
"compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}", "compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}",
"compose_form.sensitive.marked": "{count, plural, one {Мултимедията е маркирана като деликатна} other {Мултимедиите са маркирани като деликатни}}", "compose_form.sensitive.marked": "{count, plural, one {мултимедия е означена като деликатна} other {мултимедии са означени като деликатни}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Мултимедията не е маркирана като деликатна} other {Мултимедиите не са маркирани като деликатни}}", "compose_form.sensitive.unmarked": "{count, plural, one {Мултимедията не е маркирана като деликатна} other {Мултимедиите не са маркирани като деликатни}}",
"compose_form.spoiler.marked": "Премахване на предупреждението за съдържание", "compose_form.spoiler.marked": "Премахване на предупреждението за съдържание",
"compose_form.spoiler.unmarked": "Добавяне на предупреждение за съдържание", "compose_form.spoiler.unmarked": "Добавяне на предупреждение за съдържание",
"compose_form.spoiler_placeholder": "Напишете предупреждение", "compose_form.spoiler_placeholder": "Тук напишете предупреждението си",
"confirmation_modal.cancel": "Отказ", "confirmation_modal.cancel": "Отказ",
"confirmations.block.block_and_report": "Блокиране и докладване", "confirmations.block.block_and_report": "Блокиране и докладване",
"confirmations.block.confirm": "Блокиране", "confirmations.block.confirm": "Блокиране",
@ -178,13 +179,13 @@
"conversation.with": "С {names}", "conversation.with": "С {names}",
"copypaste.copied": "Копирано", "copypaste.copied": "Копирано",
"copypaste.copy": "Копиране", "copypaste.copy": "Копиране",
"directory.federated": "От познатата федивселена", "directory.federated": "От позната федивселена",
"directory.local": "Само от {domain}", "directory.local": "Само от {domain}",
"directory.new_arrivals": "Новодошли", "directory.new_arrivals": "Новодошли",
"directory.recently_active": "Наскоро дейни", "directory.recently_active": "Наскоро дейни",
"disabled_account_banner.account_settings": "Настройки на акаунта", "disabled_account_banner.account_settings": "Настройки на акаунта",
"disabled_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен.", "disabled_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен.",
"dismissable_banner.community_timeline": "Ето най-скорошните публични публикации, създадени от акаунти в {domain}.", "dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.",
"dismissable_banner.dismiss": "Отхвърляне", "dismissable_banner.dismiss": "Отхвърляне",
"dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.", "dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.",
"dismissable_banner.explore_statuses": "Тези публикации от този и други сървъри в децентрализираната мрежа набират популярност сега на този сървър.", "dismissable_banner.explore_statuses": "Тези публикации от този и други сървъри в децентрализираната мрежа набират популярност сега на този сървър.",
@ -194,7 +195,7 @@
"embed.preview": "Ето как ще изглежда:", "embed.preview": "Ето как ще изглежда:",
"emoji_button.activity": "Дейност", "emoji_button.activity": "Дейност",
"emoji_button.clear": "Изчистване", "emoji_button.clear": "Изчистване",
"emoji_button.custom": "Персонализирани", "emoji_button.custom": "Персонализирано",
"emoji_button.flags": "Знамена", "emoji_button.flags": "Знамена",
"emoji_button.food": "Храна и напитки", "emoji_button.food": "Храна и напитки",
"emoji_button.label": "Вмъкване на емоджи", "emoji_button.label": "Вмъкване на емоджи",
@ -207,9 +208,9 @@
"emoji_button.search_results": "Резултати от търсене", "emoji_button.search_results": "Резултати от търсене",
"emoji_button.symbols": "Символи", "emoji_button.symbols": "Символи",
"emoji_button.travel": "Пътуване и места", "emoji_button.travel": "Пътуване и места",
"empty_column.account_suspended": "Профилът е спрян", "empty_column.account_suspended": "Спрян акаунт",
"empty_column.account_timeline": "Тук няма публикации!", "empty_column.account_timeline": "Тук няма публикации!",
"empty_column.account_unavailable": "Няма достъп до профила", "empty_column.account_unavailable": "Недостъпен профил",
"empty_column.blocks": "Още не сте блокирали никакви потребители.", "empty_column.blocks": "Още не сте блокирали никакви потребители.",
"empty_column.bookmarked_statuses": "Още не сте отметнали публикации. Отметвайки някоя, то тя ще се покаже тук.", "empty_column.bookmarked_statuses": "Още не сте отметнали публикации. Отметвайки някоя, то тя ще се покаже тук.",
"empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!", "empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!",
@ -221,7 +222,7 @@
"empty_column.follow_recommendations": "Изглежда, че няма генерирани предложения за вас. Можете да опитате да търсите за хора, които знаете или да разгледате популярните тагове.", "empty_column.follow_recommendations": "Изглежда, че няма генерирани предложения за вас. Можете да опитате да търсите за хора, които знаете или да разгледате популярните тагове.",
"empty_column.follow_requests": "Все още нямате заявки за последване. Когато получите такава, тя ще се покаже тук.", "empty_column.follow_requests": "Все още нямате заявки за последване. Когато получите такава, тя ще се покаже тук.",
"empty_column.hashtag": "Още няма нищо в този хаштаг.", "empty_column.hashtag": "Още няма нищо в този хаштаг.",
"empty_column.home": "Вашият личен инфопоток е празен! Последвайте повече хора, за да го запълните. {suggestions}", "empty_column.home": "Вашата начална часова ос е празна! Последвайте повече хора, за да я запълните. {suggestions}",
"empty_column.home.suggestions": "Преглед на някои предложения", "empty_column.home.suggestions": "Преглед на някои предложения",
"empty_column.list": "Още няма нищо в този списък. Когато членовете на списъка публикуват нови публикации, то те ще се появят тук.", "empty_column.list": "Още няма нищо в този списък. Когато членовете на списъка публикуват нови публикации, то те ще се появят тук.",
"empty_column.lists": "Все още нямате списъци. Когато създадете такъв, той ще се покаже тук.", "empty_column.lists": "Все още нямате списъци. Когато създадете такъв, той ще се покаже тук.",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Копиране на stacktrace-а в клипборда", "errors.unexpected_crash.copy_stacktrace": "Копиране на stacktrace-а в клипборда",
"errors.unexpected_crash.report_issue": "Сигнал за проблем", "errors.unexpected_crash.report_issue": "Сигнал за проблем",
"explore.search_results": "Резултати от търсенето", "explore.search_results": "Резултати от търсенето",
"explore.suggested_follows": "За вас",
"explore.title": "Разглеждане", "explore.title": "Разглеждане",
"explore.trending_links": "Новини",
"explore.trending_statuses": "Публикации",
"explore.trending_tags": "Хаштагове",
"filter_modal.added.context_mismatch_explanation": "Тази категория филтър не е приложима към контекста, в който достъпвате тази публикация. Ако желаете да филтрирате публикациите в този контекст, трябва да изберете друг филтър.", "filter_modal.added.context_mismatch_explanation": "Тази категория филтър не е приложима към контекста, в който достъпвате тази публикация. Ако желаете да филтрирате публикациите в този контекст, трябва да изберете друг филтър.",
"filter_modal.added.context_mismatch_title": "Несъвпадащ контекст!", "filter_modal.added.context_mismatch_title": "Несъвпадащ контекст!",
"filter_modal.added.expired_explanation": "Валидността на тази категория филтър е изтекла. Сменете срока на валидност, за да я приложите.", "filter_modal.added.expired_explanation": "Валидността на тази категория филтър е изтекла. Сменете срока на валидност, за да я приложите.",
@ -260,7 +265,7 @@
"follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.", "follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.",
"footer.about": "Относно", "footer.about": "Относно",
"footer.directory": "Директория на профилите", "footer.directory": "Директория на профилите",
"footer.get_app": "Изтегли приложението", "footer.get_app": "Вземане на приложението",
"footer.invite": "Поканване на хора", "footer.invite": "Поканване на хора",
"footer.keyboard_shortcuts": "Клавишни комбинации", "footer.keyboard_shortcuts": "Клавишни комбинации",
"footer.privacy_policy": "Политика за поверителност", "footer.privacy_policy": "Политика за поверителност",
@ -284,7 +289,7 @@
"home.hide_announcements": "Скриване на оповестявания", "home.hide_announcements": "Скриване на оповестявания",
"home.show_announcements": "Показване на оповестявания", "home.show_announcements": "Показване на оповестявания",
"interaction_modal.description.favourite": "Ако имате профил в Mastodon, можете да маркирате публикация като любима, за да уведомите автора, че я оценявате, и да я запазите за по-късно.", "interaction_modal.description.favourite": "Ако имате профил в Mastodon, можете да маркирате публикация като любима, за да уведомите автора, че я оценявате, и да я запазите за по-късно.",
"interaction_modal.description.follow": "Ако имате профил в Mastodon, можете да последвате {name}, за да виждате постовете от този профил в своя основен инфопоток.", "interaction_modal.description.follow": "Ако имате регистрация в Mastodon, то може да последвате {name}, за да виждате публикациите от този профил в началния си инфоканал.",
"interaction_modal.description.reblog": "Ако имате профил в Mastodon, можете да споделите тази публикация със своите последователи.", "interaction_modal.description.reblog": "Ако имате профил в Mastodon, можете да споделите тази публикация със своите последователи.",
"interaction_modal.description.reply": "Ако имате профил в Mastodon, можете да добавите отговор към тази публикация.", "interaction_modal.description.reply": "Ако имате профил в Mastodon, можете да добавите отговор към тази публикация.",
"interaction_modal.on_another_server": "На различен сървър", "interaction_modal.on_another_server": "На различен сървър",
@ -311,10 +316,10 @@
"keyboard_shortcuts.favourites": "Отваряне на списъка с любими", "keyboard_shortcuts.favourites": "Отваряне на списъка с любими",
"keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток", "keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток",
"keyboard_shortcuts.heading": "Клавишни съчетания", "keyboard_shortcuts.heading": "Клавишни съчетания",
"keyboard_shortcuts.home": "Отваряне на личния инфопоток", "keyboard_shortcuts.home": "Отваряне на началната часова ос",
"keyboard_shortcuts.hotkey": "Бърз клавиш", "keyboard_shortcuts.hotkey": "Бърз клавиш",
"keyboard_shortcuts.legend": "Показване на тази легенда", "keyboard_shortcuts.legend": "Показване на тази легенда",
"keyboard_shortcuts.local": "Отваряне на локалния инфопоток", "keyboard_shortcuts.local": "Отваряне на местна часова ос",
"keyboard_shortcuts.mention": "Споменаване на автор", "keyboard_shortcuts.mention": "Споменаване на автор",
"keyboard_shortcuts.muted": "Отваряне на списъка със заглушени потребители", "keyboard_shortcuts.muted": "Отваряне на списъка със заглушени потребители",
"keyboard_shortcuts.my_profile": "Отваряне на профила ви", "keyboard_shortcuts.my_profile": "Отваряне на профила ви",
@ -339,7 +344,7 @@
"lightbox.previous": "Назад", "lightbox.previous": "Назад",
"limited_account_hint.action": "Покажи профила въпреки това", "limited_account_hint.action": "Покажи профила въпреки това",
"limited_account_hint.title": "Този профил е бил скрит от модераторита на {domain}.", "limited_account_hint.title": "Този профил е бил скрит от модераторита на {domain}.",
"lists.account.add": "Добавяне към списък", "lists.account.add": "Добавяне в списък",
"lists.account.remove": "Премахване от списък", "lists.account.remove": "Премахване от списък",
"lists.delete": "Изтриване на списък", "lists.delete": "Изтриване на списък",
"lists.edit": "Промяна на списъка", "lists.edit": "Промяна на списъка",
@ -381,13 +386,13 @@
"navigation_bar.personal": "Лично", "navigation_bar.personal": "Лично",
"navigation_bar.pins": "Закачени публикации", "navigation_bar.pins": "Закачени публикации",
"navigation_bar.preferences": "Предпочитания", "navigation_bar.preferences": "Предпочитания",
"navigation_bar.public_timeline": "Федериран инфопоток", "navigation_bar.public_timeline": "Федеративна хронология",
"navigation_bar.search": "Търсене", "navigation_bar.search": "Търсене",
"navigation_bar.security": "Сигурност", "navigation_bar.security": "Сигурност",
"not_signed_in_indicator.not_signed_in": "Трябва да влезете за достъп до този ресурс.", "not_signed_in_indicator.not_signed_in": "Трябва да влезете за достъп до този ресурс.",
"notification.admin.report": "{name} докладва {target}", "notification.admin.report": "{name} докладва {target}",
"notification.admin.sign_up": "{name} се регистрира", "notification.admin.sign_up": "{name} се регистрира",
"notification.favourite": "{name} хареса ваша публикация", "notification.favourite": "{name} сложи в любими ваша публикация",
"notification.follow": "{name} ви последва", "notification.follow": "{name} ви последва",
"notification.follow_request": "{name} поиска да ви последва", "notification.follow_request": "{name} поиска да ви последва",
"notification.mention": "{name} ви спомена", "notification.mention": "{name} ви спомена",
@ -416,7 +421,7 @@
"notifications.column_settings.status": "Нови публикации:", "notifications.column_settings.status": "Нови публикации:",
"notifications.column_settings.unread_notifications.category": "Непрочетени известия", "notifications.column_settings.unread_notifications.category": "Непрочетени известия",
"notifications.column_settings.unread_notifications.highlight": "Изтъкване на непрочетените известия", "notifications.column_settings.unread_notifications.highlight": "Изтъкване на непрочетените известия",
"notifications.column_settings.update": "Редакции:", "notifications.column_settings.update": "Промени:",
"notifications.filter.all": "Всичко", "notifications.filter.all": "Всичко",
"notifications.filter.boosts": "Споделяния", "notifications.filter.boosts": "Споделяния",
"notifications.filter.favourites": "Любими", "notifications.filter.favourites": "Любими",
@ -436,7 +441,7 @@
"picture_in_picture.restore": "Връщане обратно", "picture_in_picture.restore": "Връщане обратно",
"poll.closed": "Затворено", "poll.closed": "Затворено",
"poll.refresh": "Опресняване", "poll.refresh": "Опресняване",
"poll.total_people": "{count, plural, one {# човек} other {# човека}}", "poll.total_people": "{count, plural, one {# човек} other {# души}}",
"poll.total_votes": "{count, plural, one {# глас} other {# гласа}}", "poll.total_votes": "{count, plural, one {# глас} other {# гласа}}",
"poll.vote": "Гласуване", "poll.vote": "Гласуване",
"poll.voted": "Гласувахте за този отговор", "poll.voted": "Гласувахте за този отговор",
@ -451,21 +456,21 @@
"privacy.public.long": "Видимо за всички", "privacy.public.long": "Видимо за всички",
"privacy.public.short": "Публично", "privacy.public.short": "Публично",
"privacy.unlisted.long": "Видимо за всички, но не чрез възможността за откриване", "privacy.unlisted.long": "Видимо за всички, но не чрез възможността за откриване",
"privacy.unlisted.short": "Скрито", "privacy.unlisted.short": "Несписъчно",
"privacy_policy.last_updated": "Последно осъвременяване на {date}", "privacy_policy.last_updated": "Последно осъвременяване на {date}",
"privacy_policy.title": "Политика за поверителност", "privacy_policy.title": "Политика за поверителност",
"refresh": "Опресняване", "refresh": "Опресняване",
"regeneration_indicator.label": "Зареждане…", "regeneration_indicator.label": "Зареждане…",
"regeneration_indicator.sublabel": "Вашият основен инфопоток се подготвя!", "regeneration_indicator.sublabel": "Подготовка на началния ви инфоканал!",
"relative_time.days": "{number} д.", "relative_time.days": "{number} д.",
"relative_time.full.days": "преди {number, plural, one {# ден} other {# дни}}", "relative_time.full.days": "преди {number, plural, one {# ден} other {# дни}}",
"relative_time.full.hours": "преди {number, plural, one {# час} other {# часа}}", "relative_time.full.hours": "преди {number, plural, one {# час} other {# часа}}",
"relative_time.full.just_now": "току-що", "relative_time.full.just_now": "току-що",
"relative_time.full.minutes": "преди {number, plural, one {# минута} other {# минути}}", "relative_time.full.minutes": "преди {number, plural, one {# минута} other {# минути}}",
"relative_time.full.seconds": "преди {number, plural, one {# секунда} other {# секунди}}", "relative_time.full.seconds": "преди {number, plural, one {# секунда} other {# секунди}}",
"relative_time.hours": "{number} ч.", "relative_time.hours": "{number}ч.",
"relative_time.just_now": "сега", "relative_time.just_now": "сега",
"relative_time.minutes": "{number} мин.", "relative_time.minutes": "{number}м.",
"relative_time.seconds": "{number}с.", "relative_time.seconds": "{number}с.",
"relative_time.today": "днес", "relative_time.today": "днес",
"reply_indicator.cancel": "Отказ", "reply_indicator.cancel": "Отказ",
@ -505,7 +510,7 @@
"report.thanks.title": "Не искате ли да виждате това?", "report.thanks.title": "Не искате ли да виждате това?",
"report.thanks.title_actionable": "Благодарности за докладването, ще го прегледаме.", "report.thanks.title_actionable": "Благодарности за докладването, ще го прегледаме.",
"report.unfollow": "Стоп на следването на @{name}", "report.unfollow": "Стоп на следването на @{name}",
"report.unfollow_explanation": "Последвали сте този акаунт. За да не виждате повече публикациите му в основния си инфопоток, то спрете да го следвате.", "report.unfollow_explanation": "Последвали сте този акаунт. За да не виждате повече публикациите му в началния си инфопоток, то спрете да го следвате.",
"report_notification.attached_statuses": "прикачено {count, plural, one {{count} публикация} other {{count} публикации}}", "report_notification.attached_statuses": "прикачено {count, plural, one {{count} публикация} other {{count} публикации}}",
"report_notification.categories.other": "Друго", "report_notification.categories.other": "Друго",
"report_notification.categories.spam": "Спам", "report_notification.categories.spam": "Спам",
@ -524,7 +529,7 @@
"search_results.hashtags": "Хаштагове", "search_results.hashtags": "Хаштагове",
"search_results.nothing_found": "Не може да се намери каквото и да било за тези термини при търсене", "search_results.nothing_found": "Не може да се намери каквото и да било за тези термини при търсене",
"search_results.statuses": "Публикации", "search_results.statuses": "Публикации",
"search_results.statuses_fts_disabled": "Търсенето на публикации по тяхното съдържание не е активирано за този Mastodon сървър.", "search_results.statuses_fts_disabled": "Търсенето на публикации по съдържанието им не е включено в този сървър на Mastodon.",
"search_results.title": "Търсене за {q}", "search_results.title": "Търсене за {q}",
"search_results.total": "{count, number} {count, plural, one {резултат} other {резултата}}", "search_results.total": "{count, number} {count, plural, one {резултат} other {резултата}}",
"server_banner.about_active_users": "Ползващите сървъра през последните 30 дни (дейните месечно потребители)", "server_banner.about_active_users": "Ползващите сървъра през последните 30 дни (дейните месечно потребители)",
@ -537,7 +542,7 @@
"sign_in_banner.sign_in": "Вход", "sign_in_banner.sign_in": "Вход",
"sign_in_banner.text": "Влезте, за да последвате профили или хаштагове, любимо, споделяне и отговаряне на публикации или взаимодействие от акаунта ви на друг сървър.", "sign_in_banner.text": "Влезте, за да последвате профили или хаштагове, любимо, споделяне и отговаряне на публикации или взаимодействие от акаунта ви на друг сървър.",
"status.admin_account": "Отваряне на интерфейс за модериране за @{name}", "status.admin_account": "Отваряне на интерфейс за модериране за @{name}",
"status.admin_status": "Open this status in the moderation interface", "status.admin_status": "Отваряне на тази публикация в интерфейс на модериране",
"status.block": "Блокиране на @{name}", "status.block": "Блокиране на @{name}",
"status.bookmark": "Отмятане", "status.bookmark": "Отмятане",
"status.cancel_reblog_private": "Отсподеляне", "status.cancel_reblog_private": "Отсподеляне",
@ -587,20 +592,20 @@
"status.translate": "Превод", "status.translate": "Превод",
"status.translated_from_with": "Преведено от {lang}, използвайки {provider}", "status.translated_from_with": "Преведено от {lang}, използвайки {provider}",
"status.uncached_media_warning": "Не е налично", "status.uncached_media_warning": "Не е налично",
"status.unmute_conversation": "Раззаглушаване на разговор", "status.unmute_conversation": "Без заглушаването на разговора",
"status.unpin": "Разкачане от профила", "status.unpin": "Разкачане от профила",
"subscribed_languages.lead": "Публикации само на избрани езици ще се явяват в началото ви и в списъка с часови оси след промяната. Изберете \"нищо\", за да получавате публикации на всички езици.", "subscribed_languages.lead": "Публикации само на избрани езици ще се явяват в началото ви и в списъка с часови оси след промяната. Изберете \"нищо\", за да получавате публикации на всички езици.",
"subscribed_languages.save": "Запазване на промените", "subscribed_languages.save": "Запазване на промените",
"subscribed_languages.target": "Смяна на езика за {target}", "subscribed_languages.target": "Смяна на езика за {target}",
"suggestions.dismiss": "Отхвърляне на предложение", "suggestions.dismiss": "Отхвърляне на предложение",
"suggestions.header": "Може да се интересувате от…", "suggestions.header": "Може да имате интерес от…",
"tabs_bar.federated_timeline": "Федерална", "tabs_bar.federated_timeline": "Федерална",
"tabs_bar.home": "Начало", "tabs_bar.home": "Начало",
"tabs_bar.local_timeline": "Местни", "tabs_bar.local_timeline": "Местни",
"tabs_bar.notifications": "Известия", "tabs_bar.notifications": "Известия",
"time_remaining.days": "{number, plural, one {# ден} other {# дни}} остава", "time_remaining.days": "{number, plural, one {остава # ден} other {остават # дни}}",
"time_remaining.hours": "{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.moments": "Оставащи моменти",
"time_remaining.seconds": "{number, plural, one {# секунда} other {# секунди}} остава", "time_remaining.seconds": "{number, plural, one {# секунда} other {# секунди}} остава",
"timeline_hint.remote_resource_not_displayed": "{resource} от други сървъри не се показват.", "timeline_hint.remote_resource_not_displayed": "{resource} от други сървъри не се показват.",
@ -619,12 +624,12 @@
"upload_error.poll": "Качването на файлове не е позволено с анкети.", "upload_error.poll": "Качването на файлове не е позволено с анкети.",
"upload_form.audio_description": "Опишете за хора със загубен слух", "upload_form.audio_description": "Опишете за хора със загубен слух",
"upload_form.description": "Опишете за хора със зрително увреждане", "upload_form.description": "Опишете за хора със зрително увреждане",
"upload_form.description_missing": "Няма добавено описание", "upload_form.description_missing": "Няма добавен опис",
"upload_form.edit": "Редактиране", "upload_form.edit": "Редактиране",
"upload_form.thumbnail": "Промяна на миниобраза", "upload_form.thumbnail": "Промяна на миниобраза",
"upload_form.undo": "Изтриване", "upload_form.undo": "Изтриване",
"upload_form.video_description": "Опишете за хора със загубен слух или зрително увреждане", "upload_form.video_description": "Опишете за хора със загубен слух или зрително увреждане",
"upload_modal.analyzing_picture": "Анализ на снимка…", "upload_modal.analyzing_picture": "Снимков анализ…",
"upload_modal.apply": "Прилагане", "upload_modal.apply": "Прилагане",
"upload_modal.applying": "Прилагане…", "upload_modal.applying": "Прилагане…",
"upload_modal.choose_image": "Избор на образ", "upload_modal.choose_image": "Избор на образ",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "টুট এবং মতামত", "account.posts_with_replies": "টুট এবং মতামত",
"account.report": "@{name} কে রিপোর্ট করুন", "account.report": "@{name} কে রিপোর্ট করুন",
"account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন", "account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন",
"account.requested_follow": "{name} আপনাকে অনুসরণ করার জন্য অনুরোধ করেছে",
"account.share": "@{name} র প্রোফাইল অন্যদের দেখান", "account.share": "@{name} র প্রোফাইল অন্যদের দেখান",
"account.show_reblogs": "@{name} র সমর্থনগুলো দেখান", "account.show_reblogs": "@{name} র সমর্থনগুলো দেখান",
"account.statuses_counter": "{count, plural,one {{counter} টুট} other {{counter} টুট}}", "account.statuses_counter": "{count, plural,one {{counter} টুট} other {{counter} টুট}}",
@ -70,7 +71,7 @@
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up", "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average", "admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month", "admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "New users", "admin.dashboard.retention.cohort_size": "নতুন ব্যবহারকারী",
"alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।", "alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
"alert.rate_limited.title": "হার সীমিত", "alert.rate_limited.title": "হার সীমিত",
"alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.", "alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
@ -123,7 +124,7 @@
"community.column_settings.local_only": "শুধুমাত্র স্থানীয়", "community.column_settings.local_only": "শুধুমাত্র স্থানীয়",
"community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও", "community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও",
"community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী", "community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
"compose.language.change": "Change language", "compose.language.change": "ভাষা পরিবর্তন করুন",
"compose.language.search": "Search languages...", "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "আরো জানুন", "compose_form.direct_message_warning_learn_more": "আরো জানুন",
"compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
@ -137,7 +138,7 @@
"compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন", "compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন",
"compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন", "compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
"compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন", "compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
"compose_form.publish": "Publish", "compose_form.publish": "প্রকাশ করুন",
"compose_form.publish_form": "Publish", "compose_form.publish_form": "Publish",
"compose_form.publish_loud": "{publish}!", "compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes", "compose_form.save_changes": "Save changes",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন", "errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
"errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন", "errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
"explore.search_results": "Search results", "explore.search_results": "Search results",
"explore.suggested_follows": "For you",
"explore.title": "Explore", "explore.title": "Explore",
"explore.trending_links": "সংবাদ",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!", "filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@ -269,7 +274,7 @@
"getting_started.heading": "শুরু করা", "getting_started.heading": "শুরু করা",
"hashtag.column_header.tag_mode.all": "এবং {additional}", "hashtag.column_header.tag_mode.all": "এবং {additional}",
"hashtag.column_header.tag_mode.any": "অথবা {additional}", "hashtag.column_header.tag_mode.any": "অথবা {additional}",
"hashtag.column_header.tag_mode.none": "বাদ দিয়ে {additional}", "hashtag.column_header.tag_mode.none": "{additional} বাদ দিয়ে",
"hashtag.column_settings.select.no_options_message": "কোনটা পাওয়া যায় নি", "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.all": "এগুলো সব",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Toudoù ha respontoù", "account.posts_with_replies": "Toudoù ha respontoù",
"account.report": "Disklêriañ @{name}", "account.report": "Disklêriañ @{name}",
"account.requested": "O c'hortoz an asant. Klikit evit nullañ ar goulenn heuliañ", "account.requested": "O c'hortoz an asant. Klikit evit nullañ ar goulenn heuliañ",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Skignañ profil @{name}", "account.share": "Skignañ profil @{name}",
"account.show_reblogs": "Diskouez skignadennoù @{name}", "account.show_reblogs": "Diskouez skignadennoù @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Toud} two {{counter} Doud} other {{counter} a Doudoù}}", "account.statuses_counter": "{count, plural, one {{counter} Toud} two {{counter} Doud} other {{counter} a Doudoù}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver", "errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
"errors.unexpected_crash.report_issue": "Danevellañ ur fazi", "errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
"explore.search_results": "Disoc'hoù an enklask", "explore.search_results": "Disoc'hoù an enklask",
"explore.suggested_follows": "For you",
"explore.title": "Furchal", "explore.title": "Furchal",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Kenarroud digenglotus !", "filter_modal.added.context_mismatch_title": "Kenarroud digenglotus !",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Posts and replies", "account.posts_with_replies": "Posts and replies",
"account.report": "Report @{name}", "account.report": "Report @{name}",
"account.requested": "Awaiting approval. Click to cancel follow request", "account.requested": "Awaiting approval. Click to cancel follow request",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Share @{name}'s profile", "account.share": "Share @{name}'s profile",
"account.show_reblogs": "Show boosts from @{name}", "account.show_reblogs": "Show boosts from @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}", "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
"errors.unexpected_crash.report_issue": "Report issue", "errors.unexpected_crash.report_issue": "Report issue",
"explore.search_results": "Search results", "explore.search_results": "Search results",
"explore.suggested_follows": "For you",
"explore.title": "Explore", "explore.title": "Explore",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!", "filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Tuts i respostes", "account.posts_with_replies": "Tuts i respostes",
"account.report": "Informa sobre @{name}", "account.report": "Informa sobre @{name}",
"account.requested": "S'espera l'aprovació. Clica per a cancel·lar la petició de seguiment", "account.requested": "S'espera l'aprovació. Clica per a cancel·lar la petició de seguiment",
"account.requested_follow": "{name} ha demanat de seguir-te",
"account.share": "Comparteix el perfil de @{name}", "account.share": "Comparteix el perfil de @{name}",
"account.show_reblogs": "Mostra els impulsos de @{name}", "account.show_reblogs": "Mostra els impulsos de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Publicació} other {{counter} Publicacions}}", "account.statuses_counter": "{count, plural, one {{counter} Publicació} other {{counter} Publicacions}}",
@ -104,7 +105,7 @@
"column.direct": "Missatges directes", "column.direct": "Missatges directes",
"column.directory": "Navega pels perfils", "column.directory": "Navega pels perfils",
"column.domain_blocks": "Dominis blocats", "column.domain_blocks": "Dominis blocats",
"column.favourites": "Preferits", "column.favourites": "Favorits",
"column.follow_requests": "Peticions de seguir-te", "column.follow_requests": "Peticions de seguir-te",
"column.home": "Inici", "column.home": "Inici",
"column.lists": "Llistes", "column.lists": "Llistes",
@ -126,8 +127,8 @@
"compose.language.change": "Canvia d'idioma", "compose.language.change": "Canvia d'idioma",
"compose.language.search": "Cerca idiomes...", "compose.language.search": "Cerca idiomes...",
"compose_form.direct_message_warning_learn_more": "Més informació", "compose_form.direct_message_warning_learn_more": "Més informació",
"compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació sensible mitjançant Mastodon.", "compose_form.encryption_warning": "Els tuts a Mastodon no estant xifrats punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
"compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta, ja que no està llistada. Només les publicacions públiques es poden cercar per etiqueta.", "compose_form.hashtag_warning": "Aquest tut no es mostrarà en cap etiqueta, ja que no està llistat. Només els tuts públics es poden cercar per etiqueta.",
"compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure les publicacions de només per a seguidors.", "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure les publicacions de només per a seguidors.",
"compose_form.lock_disclaimer.lock": "blocat", "compose_form.lock_disclaimer.lock": "blocat",
"compose_form.placeholder": "Què et passa pel cap?", "compose_form.placeholder": "Què et passa pel cap?",
@ -137,11 +138,11 @@
"compose_form.poll.remove_option": "Elimina aquesta opció", "compose_form.poll.remove_option": "Elimina aquesta opció",
"compose_form.poll.switch_to_multiple": "Canvia lenquesta per a permetre diverses opcions", "compose_form.poll.switch_to_multiple": "Canvia lenquesta per a permetre diverses opcions",
"compose_form.poll.switch_to_single": "Canvia lenquesta per a permetre una única opció", "compose_form.poll.switch_to_single": "Canvia lenquesta per a permetre una única opció",
"compose_form.publish": "Publica", "compose_form.publish": "Tut",
"compose_form.publish_form": "Publica", "compose_form.publish_form": "Publica",
"compose_form.publish_loud": "{publish}!", "compose_form.publish_loud": "Tut!",
"compose_form.save_changes": "Desa els canvis", "compose_form.save_changes": "Desa els canvis",
"compose_form.sensitive.hide": "{count, plural, one {Marca el contingut com a sensible} other {Marca el contingut com a sensible}}", "compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}",
"compose_form.sensitive.marked": "{count, plural, one {Contingut marcat com a sensible} other {Contingut marcat com a sensible}}", "compose_form.sensitive.marked": "{count, plural, one {Contingut marcat com a sensible} other {Contingut marcat com a sensible}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Contingut no marcat com a sensible} other {Contingut no marcat com a sensible}}", "compose_form.sensitive.unmarked": "{count, plural, one {Contingut no marcat com a sensible} other {Contingut no marcat com a sensible}}",
"compose_form.spoiler.marked": "Elimina l'avís de contingut", "compose_form.spoiler.marked": "Elimina l'avís de contingut",
@ -187,10 +188,10 @@
"dismissable_banner.community_timeline": "Aquestes són les publicacions més recents d'usuaris amb el compte a {domain}.", "dismissable_banner.community_timeline": "Aquestes són les publicacions més recents d'usuaris amb el compte a {domain}.",
"dismissable_banner.dismiss": "Ometre", "dismissable_banner.dismiss": "Ometre",
"dismissable_banner.explore_links": "Gent d'aquest i d'altres servidors de la xarxa descentralitzada estan comentant ara mateix aquestes notícies.", "dismissable_banner.explore_links": "Gent d'aquest i d'altres servidors de la xarxa descentralitzada estan comentant ara mateix aquestes notícies.",
"dismissable_banner.explore_statuses": "Aquestes publicacions d'aquest i altres servidors de la xarxa descentralitzada estan guanyant l'atenció ara mateix en aquest servidor.", "dismissable_banner.explore_statuses": "Aquests tuts d'aquest i altres servidors de la xarxa descentralitzada estan guanyant l'atenció ara mateix en aquest servidor.",
"dismissable_banner.explore_tags": "Aquestes etiquetes estan guanyant ara mateix l'atenció dels usuaris d'aquest i altres servidors de la xarxa descentralitzada.", "dismissable_banner.explore_tags": "Aquestes etiquetes estan guanyant ara mateix l'atenció dels usuaris d'aquest i altres servidors de la xarxa descentralitzada.",
"dismissable_banner.public_timeline": "Aquestes són les publicacions públiques més recents de persones en aquest i altres servidors de la xarxa descentralitzada que aquest servidor coneix.", "dismissable_banner.public_timeline": "Aquestes són els tuts públics més recents de persones en aquest i altres servidors de la xarxa descentralitzada que aquest servidor coneix.",
"embed.instructions": "Incrusta aquesta publicació a la teva pàgina web copiant el codi següent.", "embed.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.",
"embed.preview": "Aquest aspecte tindrà:", "embed.preview": "Aquest aspecte tindrà:",
"emoji_button.activity": "Activitat", "emoji_button.activity": "Activitat",
"emoji_button.clear": "Neteja", "emoji_button.clear": "Neteja",
@ -213,17 +214,17 @@
"empty_column.blocks": "Encara no has blocat cap usuari.", "empty_column.blocks": "Encara no has blocat cap usuari.",
"empty_column.bookmarked_statuses": "Encara no has marcat cap publicació com a preferida. Quan en marquis una, apareixerà aquí.", "empty_column.bookmarked_statuses": "Encara no has marcat cap publicació com a preferida. Quan en marquis una, apareixerà aquí.",
"empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!", "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!",
"empty_column.direct": "Encara no teniu missatges directes. Quan n'envieu o en rebeu, sortiran aquí.", "empty_column.direct": "Encara no tens missatges directes. Quan n'enviïs o en rebis un, sortirà aquí.",
"empty_column.domain_blocks": "Encara no hi ha dominis blocats.", "empty_column.domain_blocks": "Encara no hi ha dominis blocats.",
"empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!", "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!",
"empty_column.favourited_statuses": "Encara no has afavorit cap publicació. Quan ho facis, apareixerà aquí.", "empty_column.favourited_statuses": "Encara no has afavorit cap tut. Quan ho facis, apareixerà aquí.",
"empty_column.favourites": "Encara no ha marcat ningú aquesta publicació com a preferida. Quan ho faci algú apareixerà aquí.", "empty_column.favourites": "Encara no ha marcat ningú aquesta publicació com a preferida. Quan ho faci algú apareixerà aquí.",
"empty_column.follow_recommendations": "Sembla que no s'han pogut generar suggeriments per a tu. Pots provar d'usar la cerca per trobar persones que vulguis conèixer o explorar les etiquetes en tendència.", "empty_column.follow_recommendations": "Sembla que no s'han pogut generar suggeriments per a tu. Pots provar d'usar la cerca per trobar persones que vulguis conèixer o explorar les etiquetes en tendència.",
"empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan en rebis una, apareixerà aquí.", "empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan en rebis una, apareixerà aquí.",
"empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.", "empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
"empty_column.home": "La teva línia de temps és buida! Segueix més gent per a emplenar-la. {suggestions}", "empty_column.home": "La teva línia de temps és buida! Segueix més gent per a emplenar-la. {suggestions}",
"empty_column.home.suggestions": "Mostra alguns suggeriments", "empty_column.home.suggestions": "Mostra alguns suggeriments",
"empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin noves publicacions, apareixeran aquí.", "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin nous tuts, apareixeran aquí.",
"empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.", "empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.",
"empty_column.mutes": "Encara no has silenciat cap usuari.", "empty_column.mutes": "Encara no has silenciat cap usuari.",
"empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.", "empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Copia stacktrace al porta-retalls", "errors.unexpected_crash.copy_stacktrace": "Copia stacktrace al porta-retalls",
"errors.unexpected_crash.report_issue": "Informa d'un problema", "errors.unexpected_crash.report_issue": "Informa d'un problema",
"explore.search_results": "Resultats de la cerca", "explore.search_results": "Resultats de la cerca",
"explore.suggested_follows": "Per a tu",
"explore.title": "Explora", "explore.title": "Explora",
"explore.trending_links": "Notícies",
"explore.trending_statuses": "Tuts",
"explore.trending_tags": "Etiquetes",
"filter_modal.added.context_mismatch_explanation": "Aquesta categoria de filtre no s'aplica al context en què has accedit a aquesta publicació. Si també vols que la publicació es filtri en aquest context, hauràs d'editar el filtre.", "filter_modal.added.context_mismatch_explanation": "Aquesta categoria de filtre no s'aplica al context en què has accedit a aquesta publicació. Si també vols que la publicació es filtri en aquest context, hauràs d'editar el filtre.",
"filter_modal.added.context_mismatch_title": "El context no coincideix!", "filter_modal.added.context_mismatch_title": "El context no coincideix!",
"filter_modal.added.expired_explanation": "La categoria d'aquest filtre ha caducat, necessitaràs canviar la seva data de caducitat per a aplicar-la.", "filter_modal.added.expired_explanation": "La categoria d'aquest filtre ha caducat, necessitaràs canviar la seva data de caducitat per a aplicar-la.",
@ -251,7 +256,7 @@
"filter_modal.select_filter.search": "Cerca o crea", "filter_modal.select_filter.search": "Cerca o crea",
"filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova", "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova",
"filter_modal.select_filter.title": "Filtra aquesta publicació", "filter_modal.select_filter.title": "Filtra aquesta publicació",
"filter_modal.title.status": "Filtra una publicació", "filter_modal.title.status": "Filtra un tut",
"follow_recommendations.done": "Fet", "follow_recommendations.done": "Fet",
"follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure els seus tuts! Aquí hi ha algunes recomanacions.", "follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure els seus tuts! Aquí hi ha algunes recomanacions.",
"follow_recommendations.lead": "Les publicacions dels usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps d'Inici. No tinguis por de cometre errors, pots deixar de seguir-los en qualsevol moment!", "follow_recommendations.lead": "Les publicacions dels usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps d'Inici. No tinguis por de cometre errors, pots deixar de seguir-los en qualsevol moment!",
@ -286,12 +291,12 @@
"interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquesta publicació, que l'autor sàpiga que t'ha agradat i desar-la per a més endavant.", "interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquesta publicació, que l'autor sàpiga que t'ha agradat i desar-la per a més endavant.",
"interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre les seves publicacions en la teva línia de temps d'Inici.", "interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre les seves publicacions en la teva línia de temps d'Inici.",
"interaction_modal.description.reblog": "Amb un compte a Mastodon, pots impulsar aquesta publicació per a compartir-la amb els teus seguidors.", "interaction_modal.description.reblog": "Amb un compte a Mastodon, pots impulsar aquesta publicació per a compartir-la amb els teus seguidors.",
"interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquesta publicació.", "interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquest tut.",
"interaction_modal.on_another_server": "En un servidor diferent", "interaction_modal.on_another_server": "En un servidor diferent",
"interaction_modal.on_this_server": "En aquest servidor", "interaction_modal.on_this_server": "En aquest servidor",
"interaction_modal.other_server_instructions": "Copia i enganxa aquesta URL en el camp de cerca de la teva aplicació Mastodon preferida o en l'interfície web del teu servidor Mastodon.", "interaction_modal.other_server_instructions": "Copia i enganxa aquesta URL en el camp de cerca de la teva aplicació Mastodon preferida o en l'interfície web del teu servidor Mastodon.",
"interaction_modal.preamble": "Com que Mastodon és descentralitzat, pots fer servir el teu compte existent en un altre servidor Mastodon o plataforma compatible si no tens compte en aquest.", "interaction_modal.preamble": "Com que Mastodon és descentralitzat, pots fer servir el teu compte existent en un altre servidor Mastodon o plataforma compatible si no tens compte en aquest.",
"interaction_modal.title.favourite": "Marca la publicació de {name}", "interaction_modal.title.favourite": "Marca el tut de {name}",
"interaction_modal.title.follow": "Segueix {name}", "interaction_modal.title.follow": "Segueix {name}",
"interaction_modal.title.reblog": "Impulsa la publicació de {name}", "interaction_modal.title.reblog": "Impulsa la publicació de {name}",
"interaction_modal.title.reply": "Respon a la publicació de {name}", "interaction_modal.title.reply": "Respon a la publicació de {name}",
@ -300,7 +305,7 @@
"intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}", "intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
"keyboard_shortcuts.back": "Vés enrere", "keyboard_shortcuts.back": "Vés enrere",
"keyboard_shortcuts.blocked": "Obre la llista d'usuaris blocats", "keyboard_shortcuts.blocked": "Obre la llista d'usuaris blocats",
"keyboard_shortcuts.boost": "Impulsa la publicació", "keyboard_shortcuts.boost": "Impulsa el tut",
"keyboard_shortcuts.column": "Centra la columna", "keyboard_shortcuts.column": "Centra la columna",
"keyboard_shortcuts.compose": "Centra l'àrea de composició de text", "keyboard_shortcuts.compose": "Centra l'àrea de composició de text",
"keyboard_shortcuts.description": "Descripció", "keyboard_shortcuts.description": "Descripció",
@ -319,10 +324,10 @@
"keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats", "keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats",
"keyboard_shortcuts.my_profile": "Obre el teu perfil", "keyboard_shortcuts.my_profile": "Obre el teu perfil",
"keyboard_shortcuts.notifications": "Obre la columna de notificacions", "keyboard_shortcuts.notifications": "Obre la columna de notificacions",
"keyboard_shortcuts.open_media": "Obre el contingut", "keyboard_shortcuts.open_media": "Obre mèdia",
"keyboard_shortcuts.pinned": "Obre la llista de publicacions fixades", "keyboard_shortcuts.pinned": "Obre la llista de tuts fixats",
"keyboard_shortcuts.profile": "Obre el perfil de l'autor", "keyboard_shortcuts.profile": "Obre el perfil de l'autor",
"keyboard_shortcuts.reply": "Respon a la publicació", "keyboard_shortcuts.reply": "Respon al tut",
"keyboard_shortcuts.requests": "Obre la llista de sol·licituds de seguiment", "keyboard_shortcuts.requests": "Obre la llista de sol·licituds de seguiment",
"keyboard_shortcuts.search": "Centra la barra de cerca", "keyboard_shortcuts.search": "Centra la barra de cerca",
"keyboard_shortcuts.spoilers": "Mostra/amaga el camp CW", "keyboard_shortcuts.spoilers": "Mostra/amaga el camp CW",
@ -401,7 +406,7 @@
"notifications.column_settings.admin.report": "Nous informes:", "notifications.column_settings.admin.report": "Nous informes:",
"notifications.column_settings.admin.sign_up": "Nous registres:", "notifications.column_settings.admin.sign_up": "Nous registres:",
"notifications.column_settings.alert": "Notificacions d'escriptori", "notifications.column_settings.alert": "Notificacions d'escriptori",
"notifications.column_settings.favourite": "Preferits:", "notifications.column_settings.favourite": "Favorits:",
"notifications.column_settings.filter_bar.advanced": "Mostra totes les categories", "notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
"notifications.column_settings.filter_bar.category": "Barra ràpida de filtres", "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
"notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres", "notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
@ -477,7 +482,7 @@
"report.category.subtitle": "Tria la millor coincidència", "report.category.subtitle": "Tria la millor coincidència",
"report.category.title": "Explica'ns què passa amb això ({type})", "report.category.title": "Explica'ns què passa amb això ({type})",
"report.category.title_account": "perfil", "report.category.title_account": "perfil",
"report.category.title_status": "publicació", "report.category.title_status": "tut",
"report.close": "Fet", "report.close": "Fet",
"report.comment.title": "Hi ha res més que creguis que hauríem de saber?", "report.comment.title": "Hi ha res més que creguis que hauríem de saber?",
"report.forward": "Reenvia a {target}", "report.forward": "Reenvia a {target}",
@ -497,7 +502,7 @@
"report.rules.subtitle": "Selecciona totes les aplicables", "report.rules.subtitle": "Selecciona totes les aplicables",
"report.rules.title": "Quines regles s'han violat?", "report.rules.title": "Quines regles s'han violat?",
"report.statuses.subtitle": "Selecciona totes les aplicables", "report.statuses.subtitle": "Selecciona totes les aplicables",
"report.statuses.title": "Hi ha cap publicació que doni suport a aquest informe?", "report.statuses.title": "Hi ha cap tut que doni suport a aquest informe?",
"report.submit": "Envia", "report.submit": "Envia",
"report.target": "Es reporta {target}", "report.target": "Es reporta {target}",
"report.thanks.take_action": "Aquestes són les teves opcions per a controlar el que veus a Mastodon:", "report.thanks.take_action": "Aquestes són les teves opcions per a controlar el que veus a Mastodon:",
@ -506,7 +511,7 @@
"report.thanks.title_actionable": "Gràcies per informar, ho investigarem.", "report.thanks.title_actionable": "Gràcies per informar, ho investigarem.",
"report.unfollow": "Deixa de seguir @{name}", "report.unfollow": "Deixa de seguir @{name}",
"report.unfollow_explanation": "Segueixes aquest compte. Per no veure les seves publicacions a la teva línia de temps d'Inici deixa de seguir-lo.", "report.unfollow_explanation": "Segueixes aquest compte. Per no veure les seves publicacions a la teva línia de temps d'Inici deixa de seguir-lo.",
"report_notification.attached_statuses": "{count, plural, one {{count} publicació adjunta} other {{count} publicacions adjuntes}}", "report_notification.attached_statuses": "{count, plural, one {{count} tut} other {{count} tuts}} adjunts",
"report_notification.categories.other": "Altres", "report_notification.categories.other": "Altres",
"report_notification.categories.spam": "Brossa", "report_notification.categories.spam": "Brossa",
"report_notification.categories.violation": "Violació de norma", "report_notification.categories.violation": "Violació de norma",
@ -514,17 +519,17 @@
"search.placeholder": "Cerca", "search.placeholder": "Cerca",
"search.search_or_paste": "Cerca o escriu l'URL", "search.search_or_paste": "Cerca o escriu l'URL",
"search_popout.search_format": "Format de cerca avançada", "search_popout.search_format": "Format de cerca avançada",
"search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a preferides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.", "search_popout.tips.full_text": "Text simple recupera tuts que has escrit, els marcats com a favorits, els impulsats o en els que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
"search_popout.tips.hashtag": "etiqueta", "search_popout.tips.hashtag": "etiqueta",
"search_popout.tips.status": "publicació", "search_popout.tips.status": "tut",
"search_popout.tips.text": "El text simple recupera coincidències amb els usuaris, els noms d'usuari i les etiquetes", "search_popout.tips.text": "El text simple recupera coincidències amb els usuaris, els noms d'usuari i les etiquetes",
"search_popout.tips.user": "usuari", "search_popout.tips.user": "usuari",
"search_results.accounts": "Gent", "search_results.accounts": "Gent",
"search_results.all": "Tots", "search_results.all": "Tots",
"search_results.hashtags": "Etiquetes", "search_results.hashtags": "Etiquetes",
"search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca", "search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca",
"search_results.statuses": "Publicacions", "search_results.statuses": "Tuts",
"search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.", "search_results.statuses_fts_disabled": "La cerca de tuts pel seu contingut no està habilitada en aquest servidor Mastodon.",
"search_results.title": "Cerca de {q}", "search_results.title": "Cerca de {q}",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}", "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
"server_banner.about_active_users": "Gent que ha fet servir aquest servidor en els darrers 30 dies (Usuaris Actius Mensuals)", "server_banner.about_active_users": "Gent que ha fet servir aquest servidor en els darrers 30 dies (Usuaris Actius Mensuals)",
@ -537,12 +542,12 @@
"sign_in_banner.sign_in": "Inicia sessió", "sign_in_banner.sign_in": "Inicia sessió",
"sign_in_banner.text": "Inicia la sessió per seguir perfils o etiquetes, afavorir, compartir i respondre a publicacions o interactuar des del teu compte en un servidor diferent.", "sign_in_banner.text": "Inicia la sessió per seguir perfils o etiquetes, afavorir, compartir i respondre a publicacions o interactuar des del teu compte en un servidor diferent.",
"status.admin_account": "Obre la interfície de moderació per a @{name}", "status.admin_account": "Obre la interfície de moderació per a @{name}",
"status.admin_status": "Obre aquesta publicació a la interfície de moderació", "status.admin_status": "Obrir aquest tut a la interfície de moderació",
"status.block": "Bloca @{name}", "status.block": "Bloca @{name}",
"status.bookmark": "Marca", "status.bookmark": "Marca",
"status.cancel_reblog_private": "Desfés l'impuls", "status.cancel_reblog_private": "Desfés l'impuls",
"status.cannot_reblog": "No es pot impulsar aquesta publicació", "status.cannot_reblog": "No es pot impulsar aquest tut",
"status.copy": "Copia l'enllaç a la publicació", "status.copy": "Copia l'enllaç al tut",
"status.delete": "Elimina", "status.delete": "Elimina",
"status.detailed_status": "Vista detallada de la conversa", "status.detailed_status": "Vista detallada de la conversa",
"status.direct": "Missatge directe a @{name}", "status.direct": "Missatge directe a @{name}",
@ -550,10 +555,10 @@
"status.edited": "Editat {date}", "status.edited": "Editat {date}",
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}", "status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
"status.embed": "Incrusta", "status.embed": "Incrusta",
"status.favourite": "Preferit", "status.favourite": "Favorit",
"status.filter": "Filtra aquesta publicació", "status.filter": "Filtra aquest tut",
"status.filtered": "Filtrada", "status.filtered": "Filtrada",
"status.hide": "Amaga la publicació", "status.hide": "Amaga el tut",
"status.history.created": "creat per {name} {date}", "status.history.created": "creat per {name} {date}",
"status.history.edited": "editat per {name} {date}", "status.history.edited": "editat per {name} {date}",
"status.load_more": "Carrega'n més", "status.load_more": "Carrega'n més",
@ -562,9 +567,9 @@
"status.more": "Més", "status.more": "Més",
"status.mute": "Silencia @{name}", "status.mute": "Silencia @{name}",
"status.mute_conversation": "Silencia la conversa", "status.mute_conversation": "Silencia la conversa",
"status.open": "Amplia la publicació", "status.open": "Amplia el tut",
"status.pin": "Fixa en el perfil", "status.pin": "Fixa en el perfil",
"status.pinned": "Publicació fixada", "status.pinned": "Tut fixat",
"status.read_more": "Més informació", "status.read_more": "Més informació",
"status.reblog": "Impulsa", "status.reblog": "Impulsa",
"status.reblog_private": "Impulsa amb la visibilitat original", "status.reblog_private": "Impulsa amb la visibilitat original",
@ -589,7 +594,7 @@
"status.uncached_media_warning": "No està disponible", "status.uncached_media_warning": "No està disponible",
"status.unmute_conversation": "Deixa de silenciar la conversa", "status.unmute_conversation": "Deixa de silenciar la conversa",
"status.unpin": "Desfixa del perfil", "status.unpin": "Desfixa del perfil",
"subscribed_languages.lead": "Només les publicacions en les llengües seleccionades apareixeran en les teves línies de temps \"Inici\" i \"Llistes\" després del canvi. No en seleccionis cap per a rebre publicacions en totes les llengües.", "subscribed_languages.lead": "Només els tuts en les llengües seleccionades apareixeran en les teves línies de temps \"Inici\" i \"Llistes\" després del canvi. No en seleccionis cap per a rebre tuts en totes les llengües.",
"subscribed_languages.save": "Desa els canvis", "subscribed_languages.save": "Desa els canvis",
"subscribed_languages.target": "Canvia les llengües subscrites per a {target}", "subscribed_languages.target": "Canvia les llengües subscrites per a {target}",
"suggestions.dismiss": "Ignora el suggeriment", "suggestions.dismiss": "Ignora el suggeriment",
@ -610,27 +615,27 @@
"trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persones}} en {days, plural, one {el passat dia} other {els passats {days} dies}}", "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persones}} en {days, plural, one {el passat dia} other {els passats {days} dies}}",
"trends.trending_now": "És tendència", "trends.trending_now": "És tendència",
"ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.", "ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.",
"units.short.billion": "{count} B", "units.short.billion": "{count}B",
"units.short.million": "{count} M", "units.short.million": "{count}M",
"units.short.thousand": "{count} K", "units.short.thousand": "{count}K",
"upload_area.title": "Arrossega i deixa anar per a carregar", "upload_area.title": "Arrossega i deixa anar per a carregar",
"upload_button.label": "Afegeix imatges, un vídeo o un fitxer d'àudio", "upload_button.label": "Afegeix imatges, un vídeo o un fitxer d'àudio",
"upload_error.limit": "S'ha superat el límit de càrrega d'arxius.", "upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
"upload_error.poll": "No es permet carregar fitxers a les enquestes.", "upload_error.poll": "No es permet carregar fitxers a les enquestes.",
"upload_form.audio_description": "Descripció per a persones amb discapacitat auditiva", "upload_form.audio_description": "Descriu-ho per a persones amb problemes d'audició",
"upload_form.description": "Descripció per a persones amb discapacitat visual", "upload_form.description": "Descriu-ho per a persones amb problemes de visió",
"upload_form.description_missing": "No s'hi ha afegit cap descripció", "upload_form.description_missing": "No s'hi ha afegit cap descripció",
"upload_form.edit": "Edita", "upload_form.edit": "Edita",
"upload_form.thumbnail": "Canvia la miniatura", "upload_form.thumbnail": "Canvia la miniatura",
"upload_form.undo": "Elimina", "upload_form.undo": "Elimina",
"upload_form.video_description": "Descripció per a persones amb discapacitat auditiva o amb discapacitat visual", "upload_form.video_description": "Descriu-ho per a persones amb problemes de visió o audició",
"upload_modal.analyzing_picture": "S'analitza la imatge…", "upload_modal.analyzing_picture": "S'analitza la imatge…",
"upload_modal.apply": "Aplica", "upload_modal.apply": "Aplica",
"upload_modal.applying": "S'aplica…", "upload_modal.applying": "S'aplica…",
"upload_modal.choose_image": "Tria la imatge", "upload_modal.choose_image": "Tria la imatge",
"upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons dhidrogen, coi!", "upload_modal.description_placeholder": "Setze jutges d'un jutjat mengen fetge d'un penjat",
"upload_modal.detect_text": "Detecta el text de la imatge", "upload_modal.detect_text": "Detecta el text de la imatge",
"upload_modal.edit_media": "Edita el contingut", "upload_modal.edit_media": "Edita el Mèdia",
"upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per a triar el punt focal que sempre serà visible en totes les miniatures.", "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per a triar el punt focal que sempre serà visible en totes les miniatures.",
"upload_modal.preparing_ocr": "Es prepara l'OCR…", "upload_modal.preparing_ocr": "Es prepara l'OCR…",
"upload_modal.preview_label": "Previsualitza ({ratio})", "upload_modal.preview_label": "Previsualitza ({ratio})",

View file

@ -6,11 +6,11 @@
"about.domain_blocks.preamble": "ماستۆدۆن بە گشتی ڕێگەت پێدەدات بە پیشاندانی ناوەڕۆکەکان و کارلێک کردن لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی تر بە گشتی. ئەمانە ئەو بەدەرکردنانەن کە کراون لەسەر ئەم ڕاژە تایبەتە.", "about.domain_blocks.preamble": "ماستۆدۆن بە گشتی ڕێگەت پێدەدات بە پیشاندانی ناوەڕۆکەکان و کارلێک کردن لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی تر بە گشتی. ئەمانە ئەو بەدەرکردنانەن کە کراون لەسەر ئەم ڕاژە تایبەتە.",
"about.domain_blocks.silenced.explanation": "بە گشتی ناتوانی زانیاریە تایبەتەکان و ناوەڕۆکی ئەم ڕاژەیە ببینی، مەگەر بە ڕوونی بەدوایدا بگەڕێیت یان هەڵیبژێریت بۆ شوێنکەوتنی.", "about.domain_blocks.silenced.explanation": "بە گشتی ناتوانی زانیاریە تایبەتەکان و ناوەڕۆکی ئەم ڕاژەیە ببینی، مەگەر بە ڕوونی بەدوایدا بگەڕێیت یان هەڵیبژێریت بۆ شوێنکەوتنی.",
"about.domain_blocks.silenced.title": "سنووردار", "about.domain_blocks.silenced.title": "سنووردار",
"about.domain_blocks.suspended.explanation": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.", "about.domain_blocks.suspended.explanation": "هیچ داتایەک لەم سێرڤەرەوە پرۆسێس ناکرێت، هەڵناگیرێت یان ئاڵوگۆڕ ناکرێت، ئەمەش وا دەکات هیچ کارلێکێک یان پەیوەندییەک لەگەڵ بەکارهێنەران لەم سێرڤەرەوە مەحاڵ بێت.",
"about.domain_blocks.suspended.title": "هەڵپەسێردراوە", "about.domain_blocks.suspended.title": "هەڵپەسێردراوە",
"about.not_available": "This information has not been made available on this server.", "about.not_available": "ئەم زانیاریانە لەسەر ئەم سێرڤەرە بەردەست نەکراون.",
"about.powered_by": "Decentralized social media powered by {mastodon}", "about.powered_by": "سۆشیال میدیای لامەرکەزی کە لەلایەن {mastodon} ەوە بەهێز دەکرێت",
"about.rules": "Server rules", "about.rules": "یاساکانی سێرڤەر",
"account.account_note_header": "تێبینی ", "account.account_note_header": "تێبینی ",
"account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان", "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
"account.badges.bot": "بوت", "account.badges.bot": "بوت",
@ -19,16 +19,16 @@
"account.block_domain": "بلۆکی هەموو شتێک لە {domain}", "account.block_domain": "بلۆکی هەموو شتێک لە {domain}",
"account.blocked": "بلۆککرا", "account.blocked": "بلۆککرا",
"account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی", "account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی",
"account.cancel_follow_request": "Withdraw follow request", "account.cancel_follow_request": "داواکاری فۆڵۆو بکشێنەوە",
"account.direct": "پەیامی تایبەت بە @{name}", "account.direct": "پەیامی تایبەت بە @{name}",
"account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت", "account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
"account.domain_blocked": "دۆمەین قەپاتکرا", "account.domain_blocked": "دۆمەین قەپاتکرا",
"account.edit_profile": "دەستکاری پرۆفایل", "account.edit_profile": "دەستکاری پرۆفایل",
"account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان", "account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان",
"account.endorse": "ناساندن لە پرۆفایل", "account.endorse": "ناساندن لە پرۆفایل",
"account.featured_tags.last_status_at": "Last post on {date}", "account.featured_tags.last_status_at": "دوایین پۆست لە {date}",
"account.featured_tags.last_status_never": "No posts", "account.featured_tags.last_status_never": "هیچ پۆستێک نییە",
"account.featured_tags.title": "{name}'s featured hashtags", "account.featured_tags.title": "هاشتاگە تایبەتەکانی {name}",
"account.follow": "شوێنکەوتن", "account.follow": "شوێنکەوتن",
"account.followers": "شوێنکەوتووان", "account.followers": "شوێنکەوتووان",
"account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە", "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
@ -37,23 +37,24 @@
"account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}", "account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
"account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.", "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
"account.follows_you": "شوێنکەوتووەکانت", "account.follows_you": "شوێنکەوتووەکانت",
"account.go_to_profile": "Go to profile", "account.go_to_profile": "بڕۆ بۆ پڕۆفایلی",
"account.hide_reblogs": "داشاردنی بووستەکان لە @{name}", "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
"account.joined_short": "Joined", "account.joined_short": "بەشداری کردووە",
"account.languages": "Change subscribed languages", "account.languages": "گۆڕینی زمانە بەشداربووەکان",
"account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە", "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
"account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.", "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
"account.media": "میدیا", "account.media": "میدیا",
"account.mention": "ئاماژە @{name}", "account.mention": "ئاماژە @{name}",
"account.moved_to": "{name} has indicated that their new account is now:", "account.moved_to": "{name} ئاماژەی بەوە کردووە کە ئەکاونتە نوێیەکەیان ئێستا:",
"account.mute": "بێدەنگکردن @{name}", "account.mute": "بێدەنگکردن @{name}",
"account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}", "account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
"account.muted": "بێ دەنگ", "account.muted": "بێ دەنگ",
"account.open_original_page": "Open original page", "account.open_original_page": "لاپەڕەی ئەسڵی بکەرەوە",
"account.posts": "توتس", "account.posts": "توتس",
"account.posts_with_replies": "توتس و وەڵامەکان", "account.posts_with_replies": "توتس و وەڵامەکان",
"account.report": "گوزارشت @{name}", "account.report": "گوزارشت @{name}",
"account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن", "account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "پرۆفایلی @{name} هاوبەش بکە", "account.share": "پرۆفایلی @{name} هاوبەش بکە",
"account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}", "account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}", "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
@ -77,27 +78,27 @@
"alert.unexpected.title": "تەححح!", "alert.unexpected.title": "تەححح!",
"announcement.announcement": "بانگەواز", "announcement.announcement": "بانگەواز",
"attachments_list.unprocessed": "(unprocessed)", "attachments_list.unprocessed": "(unprocessed)",
"audio.hide": "Hide audio", "audio.hide": "شاردنەوەی دەنگ",
"autosuggest_hashtag.per_week": "{count} هەرهەفتە", "autosuggest_hashtag.per_week": "{count} هەرهەفتە",
"boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو", "boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
"bundle_column_error.copy_stacktrace": "Copy error report", "bundle_column_error.copy_stacktrace": "ڕاپۆرتی هەڵەی کۆپی بکە",
"bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.", "bundle_column_error.error.body": "لاپەڕەی داواکراو نەتوانرا ڕەندەر بکرێت. دەکرێت بەهۆی هەڵەیەکی کۆدەکەمانەوە بێت، یان کێشەی گونجانی وێبگەڕ.",
"bundle_column_error.error.title": "Oh, no!", "bundle_column_error.error.title": "ئای نا!",
"bundle_column_error.network.body": "There was an error when trying to load this page. This could be due to a temporary problem with your internet connection or this server.", "bundle_column_error.network.body": "لە کاتی هەوڵدان بۆ بارکردنی ئەم لاپەڕەیە هەڵەیەک ڕوویدا. ئەمەش دەتوانێت بەهۆی کێشەیەکی کاتی هێڵی ئینتەرنێتەکەت یان ئەم سێرڤەرە بێت.",
"bundle_column_error.network.title": "Network error", "bundle_column_error.network.title": "هەڵەی تۆڕ",
"bundle_column_error.retry": "دووبارە هەوڵبدە", "bundle_column_error.retry": "دووبارە هەوڵبدە",
"bundle_column_error.return": "Go back home", "bundle_column_error.return": "بگەڕێرەوە ماڵەوە",
"bundle_column_error.routing.body": "The requested page could not be found. Are you sure the URL in the address bar is correct?", "bundle_column_error.routing.body": "پەیجی داواکراو ناتوانرێت بدۆزرێتەوە. ئایا دڵنیای کە URL ی ناو ناونیشانەکان ڕاستە?",
"bundle_column_error.routing.title": "404", "bundle_column_error.routing.title": "٤٠٤",
"bundle_modal_error.close": "داخستن", "bundle_modal_error.close": "داخستن",
"bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.", "bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
"bundle_modal_error.retry": "دووبارە تاقی بکەوە", "bundle_modal_error.retry": "دووبارە تاقی بکەوە",
"closed_registrations.other_server_instructions": "Since Mastodon is decentralized, you can create an account on another server and still interact with this one.", "closed_registrations.other_server_instructions": "بەو پێیەی ماستۆدۆن لامەرکەزییە، دەتوانیت ئەکاونتێک لەسەر سێرڤەرێکی تر دروست بکەیت و هێشتا کارلێک لەگەڵ ئەم سێرڤەرەدا بکەیت.",
"closed_registrations_modal.description": "Creating an account on {domain} is currently not possible, but please keep in mind that you do not need an account specifically on {domain} to use Mastodon.", "closed_registrations_modal.description": "دروستکردنی ئەکاونت لەسەر {domain} لە ئێستادا ناتوانرێت، بەڵام تکایە ئەوەت لەبەرچاو بێت کە پێویستت بە ئەکاونتێک نییە بە تایبەتی لەسەر {domain} بۆ بەکارهێنانی ماستۆدۆن.",
"closed_registrations_modal.find_another_server": "Find another server", "closed_registrations_modal.find_another_server": "سێرڤەرێکی تر بدۆزەرەوە",
"closed_registrations_modal.preamble": "Mastodon is decentralized, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!", "closed_registrations_modal.preamble": "ماستۆدۆن لامەرکەزییە، بۆیە گرنگ نییە لە کوێ ئەکاونتەکەت دروست بکەیت، دەتوانیت فۆڵۆوی هەر کەسێک بکەیت و کارلێک لەگەڵیدا بکەیت لەسەر ئەم سێرڤەرە. تەنانەت دەتوانیت خۆت میوانداری بکەیت!",
"closed_registrations_modal.title": "Signing up on Mastodon", "closed_registrations_modal.title": "ناو تۆمارکردن لە ماستۆدۆن",
"column.about": "About", "column.about": "دەربارە",
"column.blocks": "بەکارهێنەرە بلۆککراوەکان", "column.blocks": "بەکارهێنەرە بلۆککراوەکان",
"column.bookmarks": "نیشانەکان", "column.bookmarks": "نیشانەکان",
"column.community": "هێڵی کاتی ناوخۆیی", "column.community": "هێڵی کاتی ناوخۆیی",
@ -123,8 +124,8 @@
"community.column_settings.local_only": "تەنها خۆماڵی", "community.column_settings.local_only": "تەنها خۆماڵی",
"community.column_settings.media_only": "تەنها میدیا", "community.column_settings.media_only": "تەنها میدیا",
"community.column_settings.remote_only": "تەنها بۆ دوور", "community.column_settings.remote_only": "تەنها بۆ دوور",
"compose.language.change": "Change language", "compose.language.change": "گۆڕینی زمان",
"compose.language.search": "Search languages...", "compose.language.search": "گەڕان بە زمانەکان...",
"compose_form.direct_message_warning_learn_more": "زیاتر فێربه", "compose_form.direct_message_warning_learn_more": "زیاتر فێربه",
"compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.", "compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
@ -137,8 +138,8 @@
"compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە", "compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
"compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک", "compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
"compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک", "compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
"compose_form.publish": "Publish", "compose_form.publish": "بڵاوی بکەوە",
"compose_form.publish_form": "Publish", "compose_form.publish_form": "بڵاوی بکەوە",
"compose_form.publish_loud": "{publish}!", "compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان", "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
"compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار", "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
@ -151,8 +152,8 @@
"confirmations.block.block_and_report": "بلۆک & گوزارشت", "confirmations.block.block_and_report": "بلۆک & گوزارشت",
"confirmations.block.confirm": "بلۆک", "confirmations.block.confirm": "بلۆک",
"confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?", "confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?",
"confirmations.cancel_follow_request.confirm": "Withdraw request", "confirmations.cancel_follow_request.confirm": "داواکاری کشانەوە",
"confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?", "confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟",
"confirmations.delete.confirm": "سڕینەوە", "confirmations.delete.confirm": "سڕینەوە",
"confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?", "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
"confirmations.delete_list.confirm": "سڕینەوە", "confirmations.delete_list.confirm": "سڕینەوە",
@ -176,20 +177,20 @@
"conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە", "conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
"conversation.open": "نیشاندان گفتوگۆ", "conversation.open": "نیشاندان گفتوگۆ",
"conversation.with": "لەگەڵ{names}", "conversation.with": "لەگەڵ{names}",
"copypaste.copied": "Copied", "copypaste.copied": "کۆپی کراوە",
"copypaste.copy": "Copy", "copypaste.copy": "ڕوونووس",
"directory.federated": "لە ڕاژەکانی ناسراو", "directory.federated": "لە ڕاژەکانی ناسراو",
"directory.local": "تەنها لە {domain}", "directory.local": "تەنها لە {domain}",
"directory.new_arrivals": "تازە گەیشتنەکان", "directory.new_arrivals": "تازە گەیشتنەکان",
"directory.recently_active": "بەم دواییانە چالاکە", "directory.recently_active": "بەم دواییانە چالاکە",
"disabled_account_banner.account_settings": "Account settings", "disabled_account_banner.account_settings": "ڕێکخستنەکانی هەژمارە",
"disabled_account_banner.text": "Your account {disabledAccount} is currently disabled.", "disabled_account_banner.text": "ئەکاونتەکەت {disabledAccount} لە ئێستادا لەکارخراوە.",
"dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.", "dismissable_banner.community_timeline": "ئەمانە دوایین پۆستی گشتی ئەو کەسانەن کە ئەکاونتەکانیان لەلایەن {domain}ەوە هۆست کراوە.",
"dismissable_banner.dismiss": "Dismiss", "dismissable_banner.dismiss": "بەلاوە نان",
"dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_links": "ئەم هەواڵانە لە ئێستادا لەلایەن کەسانێکەوە لەسەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزی باس دەکرێن.",
"dismissable_banner.explore_statuses": "These posts from this and other servers in the decentralized network are gaining traction on this server right now.", "dismissable_banner.explore_statuses": "ئەم پۆستانەی ئەم سێرڤەرە و سێرڤەرەکانی تری ناو تۆڕی لامەرکەزی لە ئێستادا خەریکە کێشکردن لەسەر ئەم سێرڤەرە بەدەست دەهێنن.",
"dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "ئەم هاشتاگانە لە ئێستادا لە نێو خەڵکی سەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزیدا جێگەی خۆیان دەگرن.",
"dismissable_banner.public_timeline": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.", "dismissable_banner.public_timeline": "ئەمانە دوایین پۆستە گشتیەکانن لە کەسانی سەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزی کە ئەم سێرڤەرە دەزانێت.",
"embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.", "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
"embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:", "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
"emoji_button.activity": "چالاکی", "emoji_button.activity": "چالاکی",
@ -235,12 +236,16 @@
"errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد", "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
"errors.unexpected_crash.report_issue": "کێشەی گوزارشت", "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
"explore.search_results": "ئەنجامەکانی گەڕان", "explore.search_results": "ئەنجامەکانی گەڕان",
"explore.suggested_follows": "For you",
"explore.title": "گەڕان", "explore.title": "گەڕان",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "explore.trending_links": "News",
"filter_modal.added.context_mismatch_title": "Context mismatch!", "explore.trending_statuses": "Posts",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "explore.trending_tags": "Hashtags",
"filter_modal.added.expired_title": "Expired filter!", "filter_modal.added.context_mismatch_explanation": "ئەم پۆلە فلتەرە ئەو چوارچێوەیە ناگرێتەوە کە تۆ تێیدا دەستت بەم پۆستە کردووە. ئەگەر بتەوێت پۆستەکە لەم چوارچێوەیەشدا فلتەر بکرێت، دەبێت دەستکاری فلتەرەکە بکەیت.",
"filter_modal.added.review_and_configure": "To review and further configure this filter category, go to the {settings_link}.", "filter_modal.added.context_mismatch_title": "ناتەبایی دەقی نووسراو!",
"filter_modal.added.expired_explanation": "ئەم پۆلە فلتەرە بەسەرچووە، پێویستە بەرواری بەسەرچوونی بگۆڕیت بۆ ئەوەی جێبەجێی بکات.",
"filter_modal.added.expired_title": "فلتەری بەسەرچووە!",
"filter_modal.added.review_and_configure": "بۆ پێداچوونەوە و ڕێکخستنی زیاتری ئەم پۆلە فلتەرە، بچۆ بۆ {settings_link}.",
"filter_modal.added.review_and_configure_title": "Filter settings", "filter_modal.added.review_and_configure_title": "Filter settings",
"filter_modal.added.settings_link": "settings page", "filter_modal.added.settings_link": "settings page",
"filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.", "filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.",
@ -528,14 +533,14 @@
"search_results.title": "Search for {q}", "search_results.title": "Search for {q}",
"search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}", "search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
"server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)", "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
"server_banner.active_users": "active users", "server_banner.active_users": "بەکارهێنەرانی چالاک",
"server_banner.administered_by": "Administered by:", "server_banner.administered_by": "بەڕێوەبردن لەلایەن:",
"server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.", "server_banner.introduction": "{domain} بەشێکە لەو تۆڕە کۆمەڵایەتییە لامەرکەزییەی کە لەلایەن {mastodon}ەوە بەهێز دەکرێت.",
"server_banner.learn_more": "Learn more", "server_banner.learn_more": "زیاتر فێربه",
"server_banner.server_stats": "Server stats:", "server_banner.server_stats": "دۆخی ڕاژەکار:",
"sign_in_banner.create_account": "Create account", "sign_in_banner.create_account": "هەژمار دروستبکە",
"sign_in_banner.sign_in": "Sign in", "sign_in_banner.sign_in": "بچۆ ژوورەوە",
"sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.", "sign_in_banner.text": "چوونەژوورەوە بۆ فۆڵۆوکردنی پڕۆفایلی یان هاشتاگەکان، دڵخوازکردن، هاوبەشکردن و وەڵامدانەوەی پۆستەکان، یان کارلێککردن لە ئەکاونتەکەتەوە لەسەر سێرڤەرێکی جیاواز.",
"status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}", "status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
"status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر", "status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
"status.block": "@{name} ئاستەنگ بکە", "status.block": "@{name} ئاستەنگ بکە",
@ -551,9 +556,9 @@
"status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}", "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
"status.embed": "نیشتەجێ بکە", "status.embed": "نیشتەجێ بکە",
"status.favourite": "دڵخواز", "status.favourite": "دڵخواز",
"status.filter": "Filter this post", "status.filter": "ئەم پۆستە فلتەر بکە",
"status.filtered": "پاڵاوتن", "status.filtered": "پاڵاوتن",
"status.hide": "Hide toot", "status.hide": "شاردنەوەی توت",
"status.history.created": "{name} دروستکراوە لە{date}", "status.history.created": "{name} دروستکراوە لە{date}",
"status.history.edited": "{name} دروستکاریکراوە لە{date}", "status.history.edited": "{name} دروستکاریکراوە لە{date}",
"status.load_more": "زیاتر بار بکە", "status.load_more": "زیاتر بار بکە",
@ -572,26 +577,26 @@
"status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.", "status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
"status.redraft": "سڕینەوەی و دووبارە ڕەشنووس", "status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
"status.remove_bookmark": "لابردنی نیشانه", "status.remove_bookmark": "لابردنی نیشانه",
"status.replied_to": "Replied to {name}", "status.replied_to": "لە وەڵامدا بۆ {name}",
"status.reply": "وەڵام", "status.reply": "وەڵام",
"status.replyAll": "بە نووسراوە وەڵام بدەوە", "status.replyAll": "بە نووسراوە وەڵام بدەوە",
"status.report": "گوزارشت @{name}", "status.report": "گوزارشت @{name}",
"status.sensitive_warning": "ناوەڕۆکی هەستیار", "status.sensitive_warning": "ناوەڕۆکی هەستیار",
"status.share": "هاوبەشی بکە", "status.share": "هاوبەشی بکە",
"status.show_filter_reason": "Show anyway", "status.show_filter_reason": "بە هەر حاڵ نیشان بدە",
"status.show_less": "کەمتر نیشان بدە", "status.show_less": "کەمتر نیشان بدە",
"status.show_less_all": "هەمووی بچووک بکەوە", "status.show_less_all": "هەمووی بچووک بکەوە",
"status.show_more": "زیاتر نیشان بدە", "status.show_more": "زیاتر نیشان بدە",
"status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی", "status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی",
"status.show_original": "Show original", "status.show_original": "پیشاندانی شێوه‌ی ڕاسته‌قینه‌",
"status.translate": "Translate", "status.translate": "وەریبگێرە",
"status.translated_from_with": "Translated from {lang} using {provider}", "status.translated_from_with": "لە {lang} وەرگێڕدراوە بە بەکارهێنانی {provider}",
"status.uncached_media_warning": "بەردەست نیە", "status.uncached_media_warning": "بەردەست نیە",
"status.unmute_conversation": "گفتوگۆی بێدەنگ", "status.unmute_conversation": "گفتوگۆی بێدەنگ",
"status.unpin": "لە سەرەوە لایبە", "status.unpin": "لە سەرەوە لایبە",
"subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.", "subscribed_languages.lead": "تەنها پۆستەکان بە زمانە هەڵبژێردراوەکان لە ماڵەکەتدا دەردەکەون و هێڵەکانی کاتی لیستەکەت دوای گۆڕانکارییەکە. هیچیان هەڵبژێرە بۆ وەرگرتنی پۆست بە هەموو زمانەکان.",
"subscribed_languages.save": "Save changes", "subscribed_languages.save": "پاشکەوتی گۆڕانکاریەکان",
"subscribed_languages.target": "Change subscribed languages for {target}", "subscribed_languages.target": "گۆڕینی زمانە بەشداربووەکان بۆ {target}",
"suggestions.dismiss": "ڕەتکردنەوەی پێشنیار", "suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
"suggestions.header": "لەوانەیە حەزت لەمەش بێت…", "suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
"tabs_bar.federated_timeline": "گشتی", "tabs_bar.federated_timeline": "گشتی",
@ -635,7 +640,7 @@
"upload_modal.preparing_ocr": "نووسینەکە دەستنیشان دەکرێت…", "upload_modal.preparing_ocr": "نووسینەکە دەستنیشان دەکرێت…",
"upload_modal.preview_label": "پێشبینین ({ratio})", "upload_modal.preview_label": "پێشبینین ({ratio})",
"upload_progress.label": "بار دەکرێت...", "upload_progress.label": "بار دەکرێت...",
"upload_progress.processing": "Processing…", "upload_progress.processing": "جێبەجێکردن...",
"video.close": "داخستنی ڤیدیۆ", "video.close": "داخستنی ڤیدیۆ",
"video.download": "داگرتنی فایل", "video.download": "داگرتنی فایل",
"video.exit_fullscreen": "دەرچوون لە پڕ شاشە", "video.exit_fullscreen": "دەرچوون لە پڕ شاشە",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Statuti è risposte", "account.posts_with_replies": "Statuti è risposte",
"account.report": "Palisà @{name}", "account.report": "Palisà @{name}",
"account.requested": "In attesa d'apprubazione. Cliccate per annullà a dumanda", "account.requested": "In attesa d'apprubazione. Cliccate per annullà a dumanda",
"account.requested_follow": "{name} has requested to follow you",
"account.share": "Sparte u prufile di @{name}", "account.share": "Sparte u prufile di @{name}",
"account.show_reblogs": "Vede spartere da @{name}", "account.show_reblogs": "Vede spartere da @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Statutu} other {{counter} Statuti}}", "account.statuses_counter": "{count, plural, one {{counter} Statutu} other {{counter} Statuti}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta", "errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta",
"errors.unexpected_crash.report_issue": "Palisà prublemu", "errors.unexpected_crash.report_issue": "Palisà prublemu",
"explore.search_results": "Search results", "explore.search_results": "Search results",
"explore.suggested_follows": "For you",
"explore.title": "Explore", "explore.title": "Explore",
"explore.trending_links": "News",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
"filter_modal.added.context_mismatch_title": "Context mismatch!", "filter_modal.added.context_mismatch_title": "Context mismatch!",
"filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Příspěvky a odpovědi", "account.posts_with_replies": "Příspěvky a odpovědi",
"account.report": "Nahlásit @{name}", "account.report": "Nahlásit @{name}",
"account.requested": "Čeká na schválení. Kliknutím žádost o sledování zrušíte", "account.requested": "Čeká na schválení. Kliknutím žádost o sledování zrušíte",
"account.requested_follow": "{name} tě požádal o sledování",
"account.share": "Sdílet profil @{name}", "account.share": "Sdílet profil @{name}",
"account.show_reblogs": "Zobrazit boosty od @{name}", "account.show_reblogs": "Zobrazit boosty od @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Příspěvek} few {{counter} Příspěvky} many {{counter} Příspěvků} other {{counter} Příspěvků}}", "account.statuses_counter": "{count, plural, one {{counter} Příspěvek} few {{counter} Příspěvky} many {{counter} Příspěvků} other {{counter} Příspěvků}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky", "errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
"errors.unexpected_crash.report_issue": "Nahlásit problém", "errors.unexpected_crash.report_issue": "Nahlásit problém",
"explore.search_results": "Výsledky hledání", "explore.search_results": "Výsledky hledání",
"explore.suggested_follows": "Pro vás",
"explore.title": "Objevit", "explore.title": "Objevit",
"explore.trending_links": "Zprávy",
"explore.trending_statuses": "Příspěvky",
"explore.trending_tags": "Hashtagy",
"filter_modal.added.context_mismatch_explanation": "Tato kategorie filtrů se nevztahuje na kontext, ve kterém jste tento příspěvek otevřeli. Pokud chcete, aby byl příspěvek filtrován i v tomto kontextu, budete muset filtr upravit.", "filter_modal.added.context_mismatch_explanation": "Tato kategorie filtrů se nevztahuje na kontext, ve kterém jste tento příspěvek otevřeli. Pokud chcete, aby byl příspěvek filtrován i v tomto kontextu, budete muset filtr upravit.",
"filter_modal.added.context_mismatch_title": "Kontext se neshoduje!", "filter_modal.added.context_mismatch_title": "Kontext se neshoduje!",
"filter_modal.added.expired_explanation": "Tato kategorie filtrů vypršela, budete muset změnit datum vypršení platnosti, aby mohla být použita.", "filter_modal.added.expired_explanation": "Tato kategorie filtrů vypršela, budete muset změnit datum vypršení platnosti, aby mohla být použita.",

View file

@ -54,6 +54,7 @@
"account.posts_with_replies": "Postiadau ac atebion", "account.posts_with_replies": "Postiadau ac atebion",
"account.report": "Adrodd @{name}", "account.report": "Adrodd @{name}",
"account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn", "account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
"account.requested_follow": "Mae {name} wedi gwneud cais i'ch dilyn",
"account.share": "Rhannwch broffil @{name}", "account.share": "Rhannwch broffil @{name}",
"account.show_reblogs": "Dangos hybiau gan @{name}", "account.show_reblogs": "Dangos hybiau gan @{name}",
"account.statuses_counter": "{count, plural, one {Postiad: {counter}} other {Postiad: {counter}}}", "account.statuses_counter": "{count, plural, one {Postiad: {counter}} other {Postiad: {counter}}}",
@ -235,7 +236,11 @@
"errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd", "errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
"errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem", "errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem",
"explore.search_results": "Canlyniadau chwilio", "explore.search_results": "Canlyniadau chwilio",
"explore.suggested_follows": "I chi",
"explore.title": "Archwilio", "explore.title": "Archwilio",
"explore.trending_links": "Newyddion",
"explore.trending_statuses": "Postiadau",
"explore.trending_tags": "Hashnodau",
"filter_modal.added.context_mismatch_explanation": "Nid yw'r categori hidlo hwn yn berthnasol i'r cyd-destun yr ydych wedi cyrchu'r postiad hwn ynddo. Os ydych chi am i'r postiad gael ei hidlo yn y cyd-destun hwn hefyd, bydd yn rhaid i chi olygu'r hidlydd.", "filter_modal.added.context_mismatch_explanation": "Nid yw'r categori hidlo hwn yn berthnasol i'r cyd-destun yr ydych wedi cyrchu'r postiad hwn ynddo. Os ydych chi am i'r postiad gael ei hidlo yn y cyd-destun hwn hefyd, bydd yn rhaid i chi olygu'r hidlydd.",
"filter_modal.added.context_mismatch_title": "Diffyg cyfatebiaeth cyd-destun!", "filter_modal.added.context_mismatch_title": "Diffyg cyfatebiaeth cyd-destun!",
"filter_modal.added.expired_explanation": "Mae'r categori hidlydd hwn wedi dod i ben, bydd angen i chi newid y dyddiad dod i ben er mwyn iddo fod yn berthnasol.", "filter_modal.added.expired_explanation": "Mae'r categori hidlydd hwn wedi dod i ben, bydd angen i chi newid y dyddiad dod i ben er mwyn iddo fod yn berthnasol.",

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