New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not hide NSFW media/CW'd text in OpenGraph tags #6479

Merged
merged 1 commit into from Feb 16, 2018

Conversation

Projects
None yet
@Gargron
Member

Gargron commented Feb 15, 2018

Reasoning: HTML title tag affects everyone. But OpenGraph only affects
when somebody is deliberately sharing the content, usually in an
environment where such content is expected. Hiding the content in
OpenGraph tags results in deceitful previews which inhibit the
shareability of the post.

Example: Somebody writes a clever post about politics but kindly
puts a "uspol" content warning on it. Mastodon users are thankful,
but sharing this post on another platform results in non-Mastodon
users believing the entire contents of the post is "uspol" and not
clicking through/reading and re-sharing.

@Aldarone

This comment has been minimized.

Contributor

Aldarone commented Feb 15, 2018

Perhaps prepend Content Warning in the content tag?

If I boost (share something on my Timeline) I would not expect the CW and nsfw tags to be removed, sharing a link elsewhere is similar IMO.

I think non mastodon users should not be more exposed to triggering or nsfw content than mastodon users are.

Do not hide NSFW media/CW'd text in OpenGraph tags
Reasoning: HTML title tag affects everyone. But OpenGraph only affects
when somebody is deliberately sharing the content, usually in an
environment where such content is expected. Hiding the content in
OpenGraph tags results in deceitful previews which inhibit the
shareability of the post.

Example: Somebody writes a clever post about politics but kindly
puts a "uspol" content warning on it. Mastodon users are thankful,
but sharing this post on another platform results in non-Mastodon
users believing the entire contents of the post is "uspol" and not
clicking through/reading and re-sharing.

@Gargron Gargron force-pushed the fix-opengraph-nsfw-cw branch from e5ac73a to 082f8d4 Feb 15, 2018

@Gargron

This comment has been minimized.

Member

Gargron commented Feb 15, 2018

Perhaps prepend Content Warning in the content tag?

Okay, CW will be prepended to the description with an empty line between.

@nightpool

This comment has been minimized.

Collaborator

nightpool commented Feb 15, 2018

I'm on board with this for CW'd text, but I'm not sure if it makes sense for NSFW media. Why provide a NSFW preview, and then send someone to a blacked-out page that requires they click to see the NSFW media? Seems like it should either be one or the other.

@Gargron

This comment has been minimized.

Member

Gargron commented Feb 16, 2018

I checked behaviours of OpenGraph previews of some other platforms with semi-support for NSFW images:

  • Twitter: Even if account is marked as sensitive, tweets with images still show the images in preview
  • Tumblr: Even if post is tagged #nsfw the preview shows the image
  • Danbooru (software) image boards: even if rating:explicit, the preview shows the image

On the other hand:

  • Pixiv prepends [R-18] to og:title and shows no image in the preview (But we can't use this strategy because on our platform hidden media is not always pornography, which R-18 is heavily associated with. It could be innocent stuff like food, or it could be gore in the extreme case)
  • deviantArt shows an image of a grey stop sign as the image in the preview

Most importantly I believe that:

  1. We want to capture migrating users from Tumblr and Twitter, rather than Pixiv or deviantArt, so the UX expectations that they bring from those platforms matter more, even if those platforms are not known for good native support for NSFW controls
  2. My reasoning in the opening post about sharing contexts and the implicit opt-in to the content when sharing it outside of Mastodon still makes sense to me
  3. The behaviour of OpenGraph tags does not diminish the support for CW/NSFW in Mastodon, since OpenGraph is for outside of Mastodon
= opengraph 'og:description', activity.spoiler_text
- else
= opengraph 'og:description', activity.content
= opengraph 'og:description', [activity.spoiler_text, activity.text].reject(&:blank?).join("\n\n")

This comment has been minimized.

@nightpool

nightpool Feb 16, 2018

Collaborator

should maybe be "CW: " + activity.spoiler_text?

This comment has been minimized.

@Gargron

Gargron Feb 16, 2018

Member

I know we have "CW" on a button in the UI but adding it inside of a user's post could be problematic because it's an English string.

This comment has been minimized.

@Sixthhokage1

Sixthhokage1 Mar 10, 2018

(late comment I know, but...)
I tried this just now, and in addition to being a hardcoded English string it also ends up prepending a "CW: " line on top of non-CWed toots as well. But it would be a good idea to try and add this so that, say if I'm linking toots in Discord with people who don't use masto, they have the context that this line up top is a content warning without me having to say so or having to click through.

@nightpool

This comment has been minimized.

Collaborator

nightpool commented Feb 16, 2018

I'm okay with it if it feels like there's consensus. I think my concern about the uncensored image -> censored image -> uncensored image flow is less important then having good previews and making the static page consistent with the timeline.

im still worried that people will expect the image to be hidden and then be (potentially badly) surprised when it isn't

@nightpool

This comment has been minimized.

Collaborator

nightpool commented Feb 16, 2018

(alternative that came up but seemed potentially too confusing: a "don't hide sensitive media on permalink pages" option that affects both the static page and link preview behavior per-account. this fixes the issues gargron describes and takes active steps to court people disenfranchised by corporate social media platforms, but it might be too confusing/obscure for someone just browsing accounts)

@clarcharr

This comment has been minimized.

clarcharr commented Feb 16, 2018

Thought: perhaps Mastodon could emit custom meta tags that could be parsed in a similar way to OpenGraph to check for content warnings? This would mean that sites which specifically integrate with Mastodon's tags could show the content warnings on their own UIs before even showing the page title.

Essentially, cw:subject would be the text for the content warning and cw:body would be the remaining body of the toot. og:description and description could include the text with the CW at the top for systems which don't support this.

@Gargron

This comment has been minimized.

Member

Gargron commented Feb 16, 2018

@clarcharr I like this idea a lot!

@Gargron Gargron merged commit 1122579 into master Feb 16, 2018

2 checks passed

codeclimate All good!
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details

@Gargron Gargron deleted the fix-opengraph-nsfw-cw branch Feb 16, 2018

kaniini added a commit to kaniini/mastodon that referenced this pull request Mar 9, 2018

Do not hide NSFW media/CW'd text in OpenGraph tags (tootsuite#6479)
Reasoning: HTML title tag affects everyone. But OpenGraph only affects
when somebody is deliberately sharing the content, usually in an
environment where such content is expected. Hiding the content in
OpenGraph tags results in deceitful previews which inhibit the
shareability of the post.

Example: Somebody writes a clever post about politics but kindly
puts a "uspol" content warning on it. Mastodon users are thankful,
but sharing this post on another platform results in non-Mastodon
users believing the entire contents of the post is "uspol" and not
clicking through/reading and re-sharing.

GenbuHase added a commit to GenbuHase/Yzu-don that referenced this pull request Mar 11, 2018

[Update] ME6をv2.3.0に追従 (#13)
* fix ruby 2.5 rvm install in vagrant (#6396)

RVM has a known issue with installing Ruby 2.5 on the version of Ubuntu
the Vagrant box is using: https://github.com/rvm/rvm/issues/4291

This bug was preventing any gem installs in the vagrant box

* Russian language updated (#6397)

* Fix button hiding when header title is too long (#6406)

* Upgrade Paperclip > 5.2.1 (#6404)

Mitigation for CVE-2017-0889.

https://www.cvedetails.com/cve/CVE-2017-0889/
https://medium.com/in-the-weeds/all-about-paperclips-cve-2017-0889-server-side-request-forgery-ssrf-vulnerability-8cb2b1c96fe8

* Fix mistake in cache deletion (#6408)

* pam authentication (#5303)

* add pam support, without extra column

* bugfixes for pam login

* document options

* fix code style

* fix codestyle

* fix tests

* don't call remember_me without password

* fix codestyle

* improve checks for pam usage (should fix tests)

* fix remember_me part 1

* add remember_token column because :rememberable requires either a password or this column.

* migrate db for remember_token

* move pam_authentication to the right place, fix logic bug in edit.html.haml

* fix tests

* fix pam authentication, improve username lookup, add comment

* valid? is sometimes not honored, return nil instead trying to authenticate with pam

* update devise_pam_authenticatable2 and adjust code. Fixes sideeffects observed in tests

* update devise_pam_authenticatable gem, fixes for codeconventions, fix finding user

* codeconvention fixes

* code convention fixes

* fix idention

* update dependency, explicit conflict check

* fix disabled password updates if in pam mode

* fix check password if password is present, fix templates

* block registration if account is maintained by pam

* Revert "block registration if account is maintained by pam"

This reverts commit 8e7a083d650240b6fac414926744b4b90b435f20.

* fix identation error introduced by rebase

* block usernames maintained by pam

* document pam settings better

* fix code style

* Allow retrieval of private statuses (single or in outbox) using HTTP signatures (#6225)

* Accept ActivityPub announce from the author of the original note (#6236)

* Unify links container implementation in about pages (#6382)

They were redundant, and also had a inconsistency; the button for
"other instances" had an icon for the external link in "more" page, but
it didn't in the other pages.

This unifies the implementation, and the external link icon is now shown
in all the about pages.

* Remove wave from list drawer (#6381)

* moved save button (#3792)

* moved save button

* added save back to the bottom

* Update show.html.haml

* Allow HTTP caching of atom-rendered public toots (OStatus compatibility) (#6207)

* Set minimum height for mastodon on drawer (#6142)

* Fix saving of oEmbed image (#6409)

* Fix column header button (#6411)

* Require environment for generate_static_pages (#6420)

It is required for ApplicationController.

* fix ColumnBackButtonSlim should extended from ColumnBackButton (#6417)

* Isolate internal services from external networks in Docker configuration (#6369)

The database and Redis do not need external connections, so isolate them
and prevent unauthorized access.

* CAS + SAML authentication feature (#6425)

* Cas authentication feature

* Config

* Remove class_eval + Omniauth initializer

* Codeclimate review

* Codeclimate review 2

* Codeclimate review 3

* Remove uid/email reconciliation

* SAML authentication

* Clean up code

* Improve login form

* Fix code style issues

* Add locales

* Add option to show only local toots in timeline preview (#6292)

* Add option to show only local toots in timeline preview
Right know, toots from all the known fediverse are shown in the main
page of an instance. That however doesn't reflect the instance itself.
With this option the admin may choose to display only local toots so
that users checking the instance get a better idea of internal
conversations.

* Fix issues pointed by codeclimate and eslint

* Add default message for community timeline

* Update pl.yml

* Upgrade Vagrant box to Xenial (#6421)

* upgrade vagrant box to xenial

this allows the redis version to be upgraded to support the new redis
features used in the activity tracker

* add libpam0g package to vagrant box

this is required for native extensions of gems to build after the
addition of PAM support was added in #5303

* Make sure status is not nil (#6428)

* Exclude nil from relationships array (#6427)

* Validation of count works even when text of status is nil (#6429)

* Make PAM gem optional, allow configuration over environment (#6415)

* match hashtag regex in js client with server (#6431)

the slight mismatch in hashtag regex between js and ruby was causing
hashtag warning to be displayed for unlisted tweets when an invalid
hashtag was entered

exact version of ruby regex not possible in js as POSIX bracket
expressions are not supported, this version approximates and doesn't
give same unicode support

* Change user_id column non-nullable (#6435)

* Added #link_header spec (#6439)

* Fix response of signature_verification_failure_reason (#6441)

* Clear account cache of notification target_status (#6442)

* Perform request spec (#6446)

* Added #link_header spec

* Added #perform_request spec

* Add preference to always display sensitive media (#6448)

* Change web UI "posts" to "toots" on profile for consistency (#6447)

* fix-indent (#6453)

* Full-text search for authorized statuses (#6423)

* Add full-text search for authorized statuses

- Search API will return statuses that match the query
- Only for logged in users
- Only if you are author of the status,
- Or you were mentioned in it
- Or you favourited or reblogged it
- Configuration over `ES_ENABLED`, `ES_HOST`, `ES_PORT`, `ES_PREFIX`
- Run `rails chewy:deploy` to create & populate index

Fix #5880
Fix #4293
Fix #1152

* Add commented out docker-compose configuration for ES container

* Optimize index import, filter search results

* Add basic normalization to the index

* Add better stemming and normalization to the index

* Skip webfinger request if search query includes both @ and a space

* Fix code style

* Visually separate search result sections

* Fix code style issues

* Added #call spec (#6455)

* Added #link_header spec

* Added #call spec

* Delete spec of private methods

* Fix password recovery (#6459)

* Fix password recovery

* Use “resource” instead of “current_user”

* Added FetchRemoteAccountService spec (#6456)

* Added #link_header spec

* Added #call spec

* Delete spec of private methods

* Added #call spec

* Interactive `rake mastodon:setup` task (#6451)

* Add better CLI prompt

* Add rake mastodon:setup interactive wizard

* Test db/redis/smtp configurations and add admin user at the end

* Test database connection even when database does not exist yet

* Fix Chewy trying to update index with the wrong strategy (#6464)

* Fix URLs incorrectly having trailing hyphen removed (#6465)

In cases where a URL has a trailing hyphen the FetchLinkCardService incorrectly removes the hyphen when it is parsed

The hyphen is not a reserved character in the URI spec https://tools.ietf.org/html/rfc3986#section-2.2

* i18n: Update Polish translation (#6470)

Signed-off-by: Marcin Mikołajczak <me@m4sk.in>

* Fix media button type (#6478)

* Fix #5173: Click card to embed external content (#6471)

* After click to embed video, autoplay it (#6480)

* Do not hide NSFW media/CW'd text in OpenGraph tags (#6479)

Reasoning: HTML title tag affects everyone. But OpenGraph only affects
when somebody is deliberately sharing the content, usually in an
environment where such content is expected. Hiding the content in
OpenGraph tags results in deceitful previews which inhibit the
shareability of the post.

Example: Somebody writes a clever post about politics but kindly
puts a "uspol" content warning on it. Mastodon users are thankful,
but sharing this post on another platform results in non-Mastodon
users believing the entire contents of the post is "uspol" and not
clicking through/reading and re-sharing.

* Save video metadata and improve video OpenGraph tags (#6481)

* Save metadata from video attachments, put correct dimensions into OG tags

* Add twitter:player for videos

* Fix code style and test

* [Nanobox] Fix backups for file storage (#6483)

* Fix Catalan translation of remote_follow acct (#6476)

* Fix Spanish translation of remote_follow acct (#6475)

* Limit the languages used for notification mailer test (#6487)

Some available languages lack translations for notification mails. Now it
tests for two languages which is certain to have required translations:
German and English.

German is the language the current project owner, Eugen Rochko speaks, and
providing English translations for new messages is de facto mandatory.

* Push discovered status through streaming API within a time window (#6484)

Time window of 6 hours

* Isolate each specs for cache store (#6450)

The cache store is explicitly used by some specs, but they were not
isolated and therefore not reliable. This fixes the issue by clearing
the cache after each specs.

* Cache relationships in API (#6482)

* Cache relationships in API

* Fetch relationships for search results in UI

* Only save one account's maps in each cache item

* Remove unnecessary g++ configuration (#6499)

* Remove outline from body window (Fixes #6501) (#6502)

* Added fetch_remote_status_service call spec case actibitypub (#6500)

* Added #link_header spec

* Added #call spec

* Delete spec of private methods

* Added call test case activitypub

* add parameter locked to /api/v1/update_credentials (#6506)

* Fix media spoiler design (#6507)

- 4px rounded corners on media attachments
- Better colors/contrast for CW/media spoiler on public pages
- Fix vertical alignment of "Show more" button
- Fix layout jump when unhiding standalone media

* Don't resize avatars/headers if their dimensions are already right (#6508)

Also don't apply "-quality 80" option which is probably the reason
for slight color differences between original and remote image
(because it would apply it twice, once on original instance, and
again on the receiving instance)

* Improve performance of feed_manager_spec (#6517)

* Set Docker permissions during the build process (#6514)

* Set Docker permissions during the build process

* Remove docker_entrypoint.sh and use COPY with chown

* Fix #6509: Use pull queue for chewy jobs (#6513)

* Fix build error for missing variable interpolation in chown instruction (#6519)

* Fix avatar and header issues by using custom geometry detector (#6515)

* Fix avatar and header issues by using custom geometry detector

Revert a part of #6508. The file passed to dynamic styles method
was not actually a file, but an instance of Paperclip::Attachment,
which broke all styles by always returning {} from the method.

One problem with GIF avatars was that Paperclip::GeometryDetector
reported wrong dimensions for them, e.g. 120x120 GIF avatar would
for some reason be detected as 120x53. By writing our own geometry
parser, we can use FastImage, which also happens to be faster than
ImageMagick, to detect image dimensions, which are also correct.

Unfortunately, this PR does not implement skipping a `convert`
entirely if the dimensions are already correct, as I found no easy
way to write that behaviour into Paperclip without rewriting the
Paperclip::Thumbnail class.

* Only invoke convert if dimension or format needs to be changed

* fix purge_removed_accounts task should suspend account before delete it (#6521)

* fix #6523 (#6524)

* Account archive download (#6460)

* Fix #201: Account archive download

* Export actor and private key in the archive

* Optimize BackupService

- Add conversation to cached associations of status, because
  somehow it was forgotten and is source of N+1 queries
- Explicitly call GC between batches of records being fetched
  (Model class allocations are the worst offender)
- Stream media files into the tar in 1MB chunks
  (Do not allocate media file (up to 8MB) as string into memory)
- Use #bytesize instead of #size to calculate file size for JSON
  (Fix FileOverflow error)
- Segment media into subfolders by status ID because apparently
  GIF-to-MP4 media are all named "media.mp4" for some reason

* Keep uniquely generated filename in Paperclip::GifTranscoder

* Ensure dumped files do not overwrite each other by maintaing directory partitions

* Give tar archives a good name

* Add scheduler to remove week-old backups

* Fix code style issue

* Fix bug in relationships API introduced by #6482 (#6527)

It was merge when it needed to be deep_merge. And added some tests

* Fix #6525: Make sure file is opened in LazyThumbnail processor (#6529)

* Focal points (#6520)

* Add focus param to media API, center thumbnails on focus point

* Add UI for setting a focal point

* Improve focal point icon on upload item

* Use focal point in upload preview

* Add focalPoint property to ActivityPub

* Don't show focal point button for non-image attachments

* Fix #6526: Only store redirect location if not in JSON format (#6528)

* Redesign landing page (again) (#6486)

* Redesign landing page (again)

* Move login form in small version to the right column

* Display closed registrations message

* Add site setting for the hero image

* Fix test

* Increase spacing, maximum width, change call to action section

* fix typo in image serializer (#6530)

respond to!

* Fix container regression (#6531)

* Update public.html.haml

* Update auth.html.haml

* Update modal.html.haml

* Fix nil error in focal_point? (#6537)

* New env variable: SAML_SECURITY_ASSUME_EMAIL_IS_VERIFIED + fixes #6533 (#6538)

* i18n: Update Polish translation (#6539)

Signed-off-by: Marcin Mikołajczak <me@m4sk.in>

* Update pam documentation (#6518)

* document pam email extraction

* remove superfluous newline

* New variable OAUTH_REDIRECT_AT_SIGN_IN + Ref #6538 (not only SAML strategies) (#6540)

* Do not push status to feed if its reblog is already inserted (#6488)

A complemental change for precompute_feed_service_spec.rb also fixes its
random failure which is caused by the Snowlake randomization of the order
of an original status and its reblog.

* i18n: Update Japanese translations (#6550)

* Update Japanese translations.

* Add quotation marks.

* Do not use function name to track components (#6542)

UglifyJS2 is allowed to mangle function names, and function names can also
be duplicate if they are from different scopes. Therefore function names
are not reliable as identifiers.

Functions as keys for Map object is a cheaper and more reliable
alternative.

* Raise Mastodon::HostValidationError when host for HTTP request is private (#6410)

* Fix #6536 (#6558)

* Ensure the app does not even start if OTP_SECRET is not set (#6557)

* Ensure the app does not even start if OTP_SECRET is not set

* Remove PAPERCLIP_SECRET (it's not used by anything, actually)

Imports are for internal consumption and the url option isn't even
used correctly, so we can remove the hash stuff from them

* Fix prev/next links on public profile page (#6497)

* Fix prev/next links on public profile page

* Don't make pagination urls if no available statuses

* Fix empty check method

* Put left chevron before prev page link

* Add scope for pagination "starting at" a given id

* Status pagination try 2:

s/prev/older and s/next/newer
"older" on left, "newer" on right
Use new scope for "newer" link
Extract magic 20 page size to constant
Remove max_id from feed pagination as it's not respected

* Reinstate max_id for accounts atom stream

* normalize

* Improve public account cards (#6559)

- Add follow/unfollow/remote follow buttons
- Format the bio properly
- Always show username@domain, even for local accounts

* Better grid layout for the landing page (#6543)

* Use grid layout for the landing page

* Fix column settings

Set the ratio explicitly

* Improve information board

* remove-uglifier (#6561)

* Add Liberapay link to README.md (#6563)

Signed-off-by: Marcin Mikołajczak <me@m4sk.in>

* Grid layout for tag pages (#6545)

* Use grid layout for the landing page

* Use grid layout for tag pages

* Set 2 columns width as explicit percentage for tag pages

* Some images can cause `convert` to fail, which crashes this whole task (#6565)

* Some images can cause `convert` to fail, which crashes this whole task

* Add more specific exception

* Specify AGPLv3+ (#6546)

* Specify AGPLv3+

Since the documentation doesn't specify you can use Mastodon as AGPLv3 or any later version.

* Use newest version of SPDX AGPLv3+ identifier

* remove Uglifier call from production.rb (#6568)

* Federated reports (#6570)

* Fix #2176: Federated reports

* UI for federated reports

* Add spec for ActivityPub Flag handler

* Add spec for ReportService

* Fix #5708: Reject->Follow will remove the follow if it exists (#6571)

* Fix #942: Seamless LDAP login (#6556)

* Ensure that boolean params in the API are parsed for truthiness (#6575)

Use Rails smart boolean cast to account for values such as "f",
"0", "false", etc. Previously, if a param was present in the request,
it would count as true.

* Fix margin on top action button, fix width of counters on frontpage (#6573)

* Add "Toots/Toots with replies/Media" tab below profile header (#6572)

* Add "Toots/Toots with replies/Media" tab below profile header

* Add focal point display to account gallery timeline

* Fix visual glitch of standalone GIFV

* Add only_media param to public and hashtag timelines API (#6576)

* i18n: Update Polish translation (#6578)

Signed-off-by: Marcin Mikołajczak <me@m4sk.in>

* Add contact_account and languages to instance API (#6574)

* Bump version to 2.3.0rc1

* Fixes #6584 (#6585)

* i18n: Update Japanese translations (#6581)

* yarn manage:translations

* Update Japanese translations.

* Update omniauth-saml to 1.10 (#6587)

Fixes CVE-2017-11428

* Improve style of web UI account tabs (#6589)

* Fix #6586: Add close modal icon to report dialog (#6591)

* Weblate translations (2018-03-02) (#6588)

* Translated using Weblate (Galician)

Currently translated at 100.0% (57 of 57 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (57 of 57 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (57 of 57 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sv/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (57 of 57 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ca/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (57 of 57 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (75 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (56 of 56 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (559 of 559 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/hu/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/hu/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (75 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ar/

* Translated using Weblate (Arabic)

Currently translated at 98.2% (55 of 56 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

* Translated using Weblate (Slovak)

Currently translated at 61.1% (342 of 559 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sv/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sv/

* Translated using Weblate (Portuguese)

Currently translated at 96.4% (54 of 56 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt/

* Translated using Weblate (Portuguese)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/pt/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (558 of 559 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ca/

* Translated using Weblate (Catalan)

Currently translated at 99.8% (558 of 559 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/ca/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Arabic)

Currently translated at 98.2% (55 of 56 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

* Translated using Weblate (Arabic)

Currently translated at 79.0% (49 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/ar/

* Translated using Weblate (Arabic)

Currently translated at 52.9% (296 of 559 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/

* Translated using Weblate (Slovak)

Currently translated at 61.1% (342 of 559 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (57 of 57 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (Galician)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/

* Translated using Weblate (Galician)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/

* Translated using Weblate (Galician)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/

* Translated using Weblate (Japanese)

Currently translated at 99.2% (561 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/

* Translated using Weblate (Slovak)

Currently translated at 60.5% (342 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Polish)

Currently translated at 99.1% (560 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pl/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 62.4% (353 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sv/

* Translated using Weblate (Japanese)

Currently translated at 99.2% (561 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Catalan)

Currently translated at 99.1% (560 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Finnish)

Currently translated at 99.6% (263 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (Slovak)

Currently translated at 62.6% (354 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (French)

Currently translated at 99.1% (560 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (Japanese)

Currently translated at 93.1% (54 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/

* Translated using Weblate (Galician)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/

* Translated using Weblate (Polish)

Currently translated at 99.2% (561 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pl/

* Translated using Weblate (Polish)

Currently translated at 99.8% (564 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pl/

* Translated using Weblate (Polish)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pl/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 72.5% (45 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/

* Translated using Weblate (Finnish)

Currently translated at 99.6% (263 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ca/

* Translated using Weblate (Catalan)

Currently translated at 99.8% (564 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ca/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/

* Translated using Weblate (Slovak)

Currently translated at 62.8% (355 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Arabic)

Currently translated at 99.6% (263 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (Polish)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pl/

* Translated using Weblate (Arabic)

Currently translated at 96.0% (72 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ar/

* Translated using Weblate (Slovak)

Currently translated at 93.5% (58 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/

* Translated using Weblate (Arabic)

Currently translated at 98.2% (57 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

* Translated using Weblate (German)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/

* Translated using Weblate (Catalan)

Currently translated at 99.8% (564 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (German)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/de/

* Translated using Weblate (French)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/

* Translated using Weblate (Slovak)

Currently translated at 63.7% (360 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

* Translated using Weblate (Slovak)

Currently translated at 64.9% (367 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (2 of 2 strings)

Translation: Mastodon/Activerecord
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/ar/

* Translated using Weblate (Arabic)

Currently translated at 98.6% (74 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ar/

* Translated using Weblate (Catalan)

Currently translated at 99.8% (564 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ca/

* Translated using Weblate (Slovak)

Currently translated at 69.5% (393 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Japanese)

Currently translated at 99.2% (561 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/

* Translated using Weblate (Arabic)

Currently translated at 88.7% (55 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/ar/

* Translated using Weblate (Arabic)

Currently translated at 92.0% (69 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/ar/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

* Translated using Weblate (Slovak)

Currently translated at 70.6% (399 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Slovak)

Currently translated at 74.1% (419 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Arabic)

Currently translated at 67.6% (382 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/

* Translated using Weblate (French)

Currently translated at 99.4% (562 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (Portuguese)

Currently translated at 95.3% (539 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt/

* Translated using Weblate (Slovak)

Currently translated at 75.3% (426 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Croatian)

Currently translated at 58.0% (36 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/hr/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/hu/

* Translated using Weblate (Esperanto)

Currently translated at 58.6% (34 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Occitan)

Currently translated at 96.8% (547 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/oc/

* Translated using Weblate (Slovak)

Currently translated at 76.2% (431 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (French)

Currently translated at 99.6% (263 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Arabic)

Currently translated at 93.5% (58 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/ar/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 77.8% (440 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (75 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (75 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (565 of 565 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (264 of 264 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eo/

* When search enabled, display hint in search popout (#6593)

* When advanced search is enabled, show different hint in search popout

* Change "getting started" icon in tabs bar from asterisk to hamburger

* Responsively enforce 16:9 ratio on all media thumbnails in web UI (#6590)

* Responsively enforce 16:9 ratio on all media thumbnails in web UI

Also change video player behaviour to "contain" rather than
"cover" videos that don't fit the ratio, unlike images and GIFs,
it's expected that a video is shown fully.

* Fix spacing issues and remove floor

* Remove floor

* Move "compose" on mobile to floating action button (#6594)

* Move "compose" on mobile to floating action button

* Fix contrast on floating action button

* Add LDAP options to .env.production.sample (#6592)

* fix logic for pam_controlled_service (#6599)

* Change "or" translatable (#6597)

* Translate Korean (#6608)

* Fix 500 while searching after deleting a post (#6604)

Fixes #6602

* Fix missing focalPoint in ActivityPub JSON (#6609)

* Finalize location on scrollable notifications when unmounting (#6614)

The top of the scrollable notifications will be invisible after unmounting.
The Redux state should be updated accordingly in such a case so that the
unread notification counter will be updated later.

* Federate pinned statuses over ActivityPub (#6610)

* Federate pinned statuses over ActivityPub

* Display pinned toots in web UI

Fix #6117

* Fix migration

* Fix tests

* Update outbox_serializer.rb

* Update remove_serializer.rb

* Update add_serializer.rb

* Update fetch_featured_collection_service.rb

* Set the default locale in config (#6580)

Previously the default locale was set by Localized concern for controllers,
but it was not enforced for mailers.

config is enforced throughout the application and an appropriate place to
set the default locale.

* Fix #6611: Typo in change password template (#6616)

* Do not fetch environment variables to determine default locale (#6618)

The default locale is now set by config.

* Implement tag auto-completion by history (#6621)

This is a functionality similar to one implemented in Pawoo:
https://github.com/pixiv/mastodon/commit/21a3c70f8083b1347d2b8420ed7001b78c2c9620

* Do not require images in about.js and share.js (#6622)

They are already required by common.js.

* Provide default OTP_SECRET value for development environment (#6617)

* Show media on report UI (#6619)

* Do not default site_title with site_hostname in InstanceHelper (#6624)

site_title is "Mastodon" by default configuration, and there is no need to
default site_title with site_hostname in InstanceHelper.

* [RFC] Improved media modal (#5956)

* Improved media modal

ImageLoader: Impliment pinch zoom by CSS `transform: scale(X)`
ImageLoader: Impliment panning by CSS `overflow: scroll`
ImageLoader: Larger image
MediaModal: Larger close button
MediaModal: Close the modal by swiping vertically
MediaModal: Show/hide close button and right/left navigation on tapping image
MediaModal: Change the `pointer-event` CSS prpp to get more blank space to close the modal
ImageLoader: Zoom/reset zoom on double tap
MediaModal: disable vertical swiping while horizontally swiped
ImageLoader: prevent propagating touchmove event to MediaModal
MediaModal: Adjust size and potision of buttons
ImageLoader: Adjust scroll potision on pinch zoom

* Remove "swipe to close" and "double tap to zoom" features

* remove unused prop and functions

removed `onScroll` prop and `handleScroll` func in ImageLoader

* separate zoom functionary to ZoomableImage component

adjust styling of ImageLoader
add styling for ZoomableImage

* adjust size and potision of close button of media modal

* Fix for gif video

add `onClick` prop to ExtendedVideoPlayer
specify `onClick` prop to video tag for switching nav of `MediaModal`
add `.video-modal` class to scss to separate styling for `VideoModal`

* fix styling for centering

specify height of `ZoomableImage` by pixel
clean styling for `ImageLoader`

* fix lint errors

* small fix

* fixed designated parts

* Make more apparent that an account is blocked or muted (fixes #6544) (#6627)

* Add button to unblock blocked accounts from their profile

* Add “Blocked” badge in place of “Follows you” when the user is blocked

* Add “Muted” badge (below “follows you” badge)

* i18n: Update Polish translation (#6632)

Signed-off-by: Marcin Mikołajczak <me@m4sk.in>

* Normalize translations (#6638)

Ran i18n-tasks normalize && yarn manage:translations, so that the
translation changes appear on weblate

* Weblate translations (05-03-2018) (#6640)

* Translated using Weblate (French)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Japanese)

Currently translated at 98.9% (572 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/

* Translated using Weblate (Catalan)

Currently translated at 98.4% (569 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (578 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (579 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (577 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/pt_BR/

* Translated using Weblate (French)

Currently translated at 99.8% (577 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Esperanto)

Currently translated at 99.6% (576 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eo/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/ar/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 74.5% (431 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (578 of 578 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (579 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/

* Translated using Weblate (Arabic)

Currently translated at 99.6% (271 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/

* Translated using Weblate (Japanese)

Currently translated at 98.9% (573 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/

* Translated using Weblate (Japanese)

Currently translated at 99.8% (578 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/

* Translated using Weblate (Arabic)

Currently translated at 66.6% (386 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/

* Translated using Weblate (Galician)

Currently translated at 100.0% (579 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ca/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (58 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (75 of 75 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (62 of 62 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/

* Translated using Weblate (Slovak)

Currently translated at 75.4% (437 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Polish)

Currently translated at 99.8% (578 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pl/

* Translated using Weblate (Slovak)

Currently translated at 83.5% (484 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (272 of 272 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Normalize translations
Ran i18n-tasks normalize && yarn manage:translations

* Fix permissions for volumes (#6637)

When volumes are declared, but the corresponding directories don't exist, permissions for those directories will be root:root instead of mastodon:mastodon..
This changes makes sure the permissions of the volume directories are as expected.

* Add “Domain hidden” badge (#6636)

* Place dropdown menu top if it is closer to the bottom of the viewport (#6641)

* Redirect from Web tag timeline to public tag timeline if not signed in (#6633)

This is also implemented in Pawoo:
https://github.com/pixiv/mastodon/commit/ceafdbd1bbf30fe20a2a814df0f8cae429a4e9db

* Replace onScrollToBottom with onLoadMore (#6615)

onScrollToBottom was a function to run instead of onScrollToTop and
onScroll when scrolling to the bottom. The behavior to prevent
onScrollToTop was inconvenient because the viewport can be at the bottom
and at the top at the same time if the viewport is larger than the
container.

onScrollToBottom was also called when the button to load more is clicked
on contray to the name suggests, which led notifications and
status_list_container components to mark the scrolled location is not at
the top mistakenly.

onLoadMore is a replacement for onScrollToBottom. It will be called
independently from onScrollToTop and onScroll.

* Fix accounts' display name/bio not being set from initial state (#6644)

* Upgrade chewy to version 5.0.0 (#6649)

* Fix #3807: Increase avatars to 400x400 max (#6651)

But do not upscale when they are smaller

* Use withRouter for TabsBar (#6652)

TabsBar refers to router, which is a private context property of
react-router. withRouter is a recommended alternative. It also allows to
track location changes even if React.PureComponent is used.

* Use React.PureComponent instead of React.Component (#6653)

* Extract columns area from UI component (#6650)

UI component used to toggle isComposing state by directly manipulating the
DOM element to avoid the expensive rendering.

However, it is hacky, and is not effective for other states. Instead,
this change makes the rendering cheaper by extracting the huge columns
area.

* Do not use npm (#6656)

Both of yarn and npm are used in Mastodon, but the combined usage requires
a redundant dependency and may lead to data inconsistency.

Considering that yarn has autoclean feature which npm does not have,
this change replaces all npm usage with yarn.

This change requires documentation update. Most notably, the following
command must be executed before assets precompilation if any system
dependency of node-sass has changed:

yarn install --force --pure-lockfile

* [Nanobox] Tuning Update (#6660)

Various preformance and stability enhancements for instances deployed via Nanobox.

* Add headings to the security settings page (#6661)

* Changes the headings' rank of the security settings section

This commit changes the existing headings' rank of the security settings section from level 6 to level 4.

* Renames the auth.change_password string into auth.security

The "Security" preferences' section used to be called "Change password". When it was renamed, the string name wasn't changed.
This commits changes auth.change_password to auth.security.

* Adds a heading to the password change form

There was previously no heading for the part of the "Security" page that contain the password change form.
This commit adds a rank 4 heading to this section and reintroduces an "auth.change_password" string to be used inside it.

* Removes useless HR elements

The various sections of the "Security" settings page were previously separated by HR elements.
Now that there is proper headings, they're not required anymore.

* Updates CSS

This commit updates CSS in such a way that the same style is applied to all the H4 elements of the settings.

* Correct a mistake

A character went missing on one of the previous commits, broking the CSS.
This new commit fixes it.

* Separate chown command in Dockerfile. Use tootsuite/mastodon image (#6662)

Fix #6605

* Always install LDAP, CAS and SAML gems, because they don't require deps (#6663)

Fix #6534

PAM requires a system dependency so...

* Remove pointer events on the entire UI when a dropdown menu is open (#6648)

* Remove pointer events on the entire UI when a dropdown menu is open

This prevents operations to change the location of the menu such as
scrolling.

* Fix mistake from merge

* Fix #6657 - Use target instead of origin in Remove activity (#6664)

* Fix wrong target URIs in ActivityPub Add/Remove (#6668)

* Add additional first_name and last_name SAML attribute statement options, and modify Omniauthable concern to use full_name or first_name + last_name if not available (#6669)

* Don't escape statuses while truncating (#6671)

* Remove text requirement when media attached from statuses (#6672)

* In wide layout, columnize Mastodon features on landing page (#6674)

* Fix focal point modals broken by #5956 (#6676)

* Fix cover behaviour of thumbnails that are wider than taller (#6678)

* Bump version to 2.3.0rc2

* fix validation error (media only status) (#6684)

* fix validation error (media only status)

* Incorporating review suggestions

* Reflect similar fix to OStatus side

* Fix not to include media in transaction

* Restore the limit of the number of media

* Fix not to return nil

* Rescue when there's no extension in the remotable (#6358)

* Rescue when there's no extension in the remotable
Sometimes the remotable is pointing to a directory with no file
extension. Maybe it should not be expecting to identify based on
extensions to begin with, but since it's the case, it should be ready
for it.

* Fix codeclimate issue

* Check if filename is nil instead of rescueing exception
Suggestion made in the PR

* Avoid concatenation issue if filename is nil
If filename is nil, extname was undefined

* Invert condition
Address PR comments

* Run tests with npm-run-all (#6688)

* Display AttachmentList in timelines in compact style when media missing (#6680)

* Weblate translations (2018-03-08) (#6690)

* Translated using Weblate (French)

Currently translated at 99.8% (578 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (French)

Currently translated at 99.8% (578 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (French)

Currently translated at 99.8% (578 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (275 of 275 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Slovak)

Currently translated at 85.3% (494 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (275 of 275 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (275 of 275 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (275 of 275 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (578 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (275 of 275 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Arabic)

Currently translated at 99.2% (273 of 275 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (275 of 275 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Arabic)

Currently translated at 66.8% (387 of 579 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/

* Translated using Weblate (Arabic)

Currently translated at 93.1% (54 of 58 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

* Translated using Weblate (French)

Currently translate…
@deli73

This comment has been minimized.

deli73 commented Mar 13, 2018

alternate fix proposal: change the preview to make it clear that the content warning is a content warning and not the entire content of the post
e.g. prepending "content warning: " and appending "(click link to see full post)" or something like that.
fixes the confusion while retaining the usefulness of CWs between sites

@Sixthhokage1

This comment has been minimized.

Sixthhokage1 commented Mar 13, 2018

Personally, I reverted the change on my instance and modified app/views/stream_entries/_og_description.html.haml to read

- if activity.is_a?(Status) && activity.spoiler_text?
 = opengraph 'og:description', "CW: " + activity.spoiler_text + "\n\nOpen link to view"
- else
= opengraph 'og:description', activity.content

In my own use-case, a Discord server I'm on has an NSFW channel that requires any explicit content to not have an explicit preview and be given a content warning. It's much easier for me to have that automated with the opengraph tags than to duplicate effort suppressing the preview with angle brackets and copying the content warning to Discord, especially on mobile.


Edit: Also to address something brought up in the earlier discussion, on the point of how other sites address NSFW flags and OpenGraph.

Tumblr: Even if post is tagged #nsfw the preview shows the image

This much is true, though Tumblr's flagging isn't tag-based, it has a separate option for marking a post as sensitive to filter it from users with safe mode enabled. This still ends up with OG tags when linked. However when the entire blog is flagged NSFW, as most porn or otherwise heavily sexual blogs will be, links are redirected to https://www.tumblr.com/safe-mode?url= which contains no OG metadata. So this point is only half correct

@Gargron

This comment has been minimized.

Member

Gargron commented Mar 13, 2018

Would everyone be appeased if I add a URL param to disable OG tags? So by default it would work like right now but if you have special requirements you can append something like ?no_preview to the URL to avoid an opengraph preview?

@Fidgetcetera

This comment has been minimized.

Fidgetcetera commented Mar 13, 2018

No, because what people are asking for is a preview which still shows the content warning, not no preview at all.

Ideally that'd be default, since when using mastodon, we expect posts to be hidden behind their warnings, and when sharing them, we don't expect to suddenly need to take extra steps to hide things.

Putting "content warning: " before the warning is plenty enough for people to figure out they should click the link to get the whole post.

@nightpool

This comment has been minimized.

Collaborator

nightpool commented Mar 13, 2018

@Sixthhokage1 i tested both tumblr content marked sensitive and tumblr blogs marked sensitive when me and @Gargron were discussing this pull request. tumblr blogs marked sensitive are completely invisible unless you have an account which is why we only really considered posts marked sensitive for comparison

Re: discord, what do people do when they share non-mastodon lewd posts in that channel?

@Sixthhokage1

This comment has been minimized.

Sixthhokage1 commented Mar 13, 2018

Anything considered explicit under e621 rating standards or that the user thinks would be particularly sensitive has embeds manually disabled by enclosing the link in angle brackets and a content warning given. Which is a pain in the ass on mobile

@Xkeeper0

This comment has been minimized.

Xkeeper0 commented Mar 18, 2018

Hey I'm gonna drop in here and be blunt for a while because I super disagree with this.

CWs are important. The ability to do useful CWs and tagging is one of the main features of Mastodon over other services, as it allows for people to make informed decisions of what they see. Ignoring these by default is absurd.

Take this scenario:

  1. User A posts some sensitive media and tags it appropriately. Everyone on Mastodon sees "sensitive [see more]. This is good.
  2. User B wants to share this, so they copy the link to the status from their timeline or the URL bar or whatever. (Nobody on the planet is going to manually add ?respect_content_warnings to the URL.)
  3. User B pastes their link into Discord, Telegram, or some other OpenGraph-supporting medium.
  4. Anybody who is a party to this now gets a nice big preview of whatever it was User B decided to share, without any ability to choose whether or not to see it, completely and utterly defeating the purpose of CWing the content in the first place.

We want to capture migrating users from Tumblr and Twitter, rather than Pixiv or deviantArt, so the UX expectations that they bring from those platforms matter more, even if those platforms are not known for good native support for NSFW controls

"Well, other services are bad" is no excuse to do what they do.


To give an example of how "well, having the CW in the text fixes it" is wrong:

Imagine that the CW is just "pet death" and the text is "XXX died last night :(" and the picture was of said pet. NONE of this is hidden now because it fits within the preview and image size.

image

Now replace that sad smiley face with something a lot worse and imagine how well that would go.

Revert this.

rtucker added a commit to vulpineclub/mastodon that referenced this pull request Mar 18, 2018

@KScl

This comment has been minimized.

Contributor

KScl commented Mar 18, 2018

Why are we caring about following other services' failures?

I just got linked something NSFW while I was at work, by my gf who thought that the CW/sensitive flags would stop it from being shown until I was somewhere with some privacy, as those flags would normally provide... except due to this change, that no longer happens.

This is as far as I can tell the opposite of what users expect when they share content.

@lordminx

This comment has been minimized.

lordminx commented Mar 18, 2018

This is a terrible, terrible change.

CWs are there for a reason and one of the reasons why Mastodon took off so well. One of the core features of mastodon should not be thrown out by default since it's obviously not what users would expect.

"Ignore CWs when sharing links" is an Opt-In feature if I've ever seen one.

@Cassolotl

This comment has been minimized.

Cassolotl commented Mar 18, 2018

it is very frustrating to hear such things 31 days after it's been proposed and discussed, and especially after 8 days of release candidate testing, and after the final release was made?

I can understand this frustration, but the list of pull requests isn't frequented by the vast majority of users, because 95% of pull requests are complete gibberish to non-coders. Most average users find out about features after they are merged and their instance gets updated.

Most people who read pull requests pre-merge are opinionated, technically-minded, developery people who are also very established users of Mastodon. They're people who are used to using features that might not be totally perfect because they understand how and why they were made that way, and people who are likely to tolerate or not even notice that something is kinda UI-broken.

Most features that get added are great and make life better for everyone, because the people designing and developing are also users and they know what's needed. But that informal, accidental system doesn't always work.

If you want to avoid this happening in future, maybe some work needs to be done to make feature proposals and design proposals accessible to average users who are used to using software better than this - and not just accessible, but their views perhaps need to be actively sought. Most people are just not opinionated enough to go looking for a way to give feedback and then join and learn to use a whole new platform just to object to potential features. Something something focus groups, maybe?

It's either that or you've got to be prepared to roll back changes that haven't been properly reviewed by a diverse group who approximately represent the wide userbase of Mastodon, you know?

@Gargron

This comment has been minimized.

Member

Gargron commented Mar 18, 2018

Alos this shouldn't need to be said but our top priority here should be making the site safe, not attracting more users.

These two things are absolutely not mutually exclusive, the only reason why you are here in the first place is that at some point some part of the software attracted you as a new user. Let me quote the project's description from the README:

The social focus of the project is a viable decentralized alternative to commercial social media silos

I put emphasis on viable. Viable as in "you can actually use it instead", i.e. it's competetive with the alternatives. Clearly we have network effects to fight too, but if the software itself inhibits your success, then people won't choose it. I understand if you think I made the wrong choice in this particular case, but if you think the reason I did it, the whole idea of making the platform more inclusive to more groups so it can become more widespread, is wrong, then we're not on the same page, and never were.

If you want to make a version of Mastodon that repels new users, you can, because it's free software. However I see no way that you can make me do it with my version of Mastodon.

One of my favourite stories is about one Mastodon user at a gamedev conference who was asked how they could be found online. The user said they were on Mastodon, and instead of stares, they got understanding nods. That's the utility of widespread use for Mastodon users.


As for the actual issue, here are the various ways forward:

Way Caveats
Make it the poster's user setting You don't know what to expect when sharing the link
Make it the viewer's user setting Impossible because Discord/Telegram/etc don't use your session to fetch preview
Make it an admin setting instance-wide Well, you still don't know what to expect when sharing the link unless you start remembering the behaviours of different servers
Add URL param to control this URL param not discoverable, so mostly the default will be used anyway
Add URL param with sharing screen Sharing screen not super discoverable if people just copypaste the URL from permalink or address bar; Public pages don't even have a UI precedent for sharing controls
Change default to hide images NSFW artists, sex workers and other adult content creators as well as people who just CW food pics or jokes are disadvantaged compared to if they chose Twitter or Tumblr to post
Leave as is Accidentally show porn to SO in Discord/Telegram/etc while they are at work

Pick your poison.

@Cassolotl

This comment has been minimized.

Cassolotl commented Mar 18, 2018

I don't understand the URL param ones, so even your meta isn't accessible to average users. But I think I understand most of them, so it's cool.

It sounds like it's possible to change the URL manually so that CWs are respected, but it's manual and not the default so it doesn't get used. Can some automation be added? We have a UI that asks for user preferences as a result of a bunch of people objecting to a change (mute: mute in replies y/n?) so maybe something like that could work?

Embed > If toot has content warning, do pop-up: Ignore content warning y/n? > If yes, give non-default link so that embedded toot has visible toot text and images, despite CW. If no, give default link that says "content warning: [content warning]" when posted elsewhere.

Edit: But I do think that literally just adding the words "content warning: " to the start of an embed thingy so that people understand that USpol isn't the entirety of the post would solve 99% of problems.

@Gargron

This comment has been minimized.

Member

Gargron commented Mar 18, 2018

Edit: But I do think that literally just adding the words "content warning: " to the start of an embed thingy so that people understand that USpol isn't the entirety of the post would solve 99% of problems.

I'm pretty sure most people's issue here is not with the text changes but with images. That being said, putting English words inside what's supposed to be the toot text is a bit anglocentric. A lot of people who don't speak English use Mastodon. That is why I avoided that solution.

@deli73

This comment has been minimized.

deli73 commented Mar 18, 2018

putting English words inside what's supposed to be the toot text is a bit Anglocentric

then make that text localizable based on the instance it's posted on????????

"Add URL param with sharing screen" + default being not showing the image is perfectly fine. I don't agree with considering people to be "disadvantaged" for having to take a bit of extra action to not hide content that they chose to hide on the site, Really not appreciating your prioritizing of easy exposure over people's fucking safety.
-L

@Gargron

This comment has been minimized.

Member

Gargron commented Mar 18, 2018

people's fucking safety.

Please explain how any of these changes affect people's safety. We're still talking about Discord previews in controlled environments with people who know each other, right? I want to follow your arguments and come to an agreement, but this sounds like you're raising emotional stakes just for the sake of it.

@Cassolotl

This comment has been minimized.

Cassolotl commented Mar 18, 2018

I'm pretty sure most people's issue here is not with the text changes but with images.

Ohhh fair point.

That being said, putting English words inside what's supposed to be the toot text is a bit anglocentric. A lot of people who don't speak English use Mastodon. That is why I avoided that solution.

I think even a triangle with an exclamation mark in it ⚠ (like, "⚠ USpol") would be better than just posting the sensitive content in full. That's an emoji, and they're intended to be clear and recognisable in any language, right?

Edit: But yeah that doesn't solve the image problem, harrumph.

@Cassolotl

This comment has been minimized.

Cassolotl commented Mar 18, 2018

then make that text localizable based on the instance it's posted on

Or the detected language of the toot, since we have language detection per toot for the public timelines now!

Please explain how any of these changes affect people's safety. We're still talking about Discord previews in controlled environments with people who know each other, right?

Content warnings exist for people's safety, no? People say stuff like "let me know if you want me to CW for something unusual" all the time, and people use CWs to protect their followers and the people close to them.

@deli73

This comment has been minimized.

deli73 commented Mar 18, 2018

Please explain how any of these changes affect people's safety

If people share a toot in an environment where people could be hurt by the content, and they expect it to hide it, and it doesn't, it can and will cause harm.

multiple people here have mentioned this exact thing happening to them, including people who already knew about the change. It's not intuitive, many people will forget if they haven't directly witnessed harm caused by it yet.
-L

@Cassolotl

This comment has been minimized.

Cassolotl commented Mar 18, 2018

many people will forget if they haven't directly witnessed harm caused by it yet.

It's that privilege thing. It's like when men make profiles on OKcupid pretending to be women and they are like "wow women around me told me it was bad but I seriously had no idea." If you don't need CWs, it is very easy to dismiss how helpful they are for reducing harm, without even being aware that you're dismissing it.

@ekiru

This comment has been minimized.

Contributor

ekiru commented Mar 18, 2018

I'm pretty sure most people's issue here is not with the text changes but with images.

fwiw, I am more bothered by the text changes than the image change (mostly because of the patterns of what I am likely to share). It's also the case that other people have brought up their concerns specifically with the text changes earlier in this thread and proposed the same thing and you appear to have ignored those concerns (in the sense of not responding to them at all). This discourages other people from echoing their similar concerns because other people have already visibly expressed the concern without any effect and is why I had not posted about it before.

@cosmicchipsocket

This comment has been minimized.

cosmicchipsocket commented Mar 18, 2018

This is only about the billionth time I've seen an open source project implement user-hostile changes, and then its developers get angry at the backlash. It's almost like there are flaws when your software development process is entirely tech-oriented. You say you want an ethical alternative to existing social media. With this kind of process you won't have an ethical alternative, or really any alternative at all. When you anger the users, they begin to look elsewhere. People are going to start finding alternatives to your alternative. Don't take your userbase for granted.

Actually listen to your users.

I'm thinking that a lot of open source projects, including this one, need to adopt a system whereby user-affecting changes have to actually be approved by the users first.

@deli73

This comment has been minimized.

deli73 commented Mar 18, 2018

^
thank you

Gargron added a commit that referenced this pull request Mar 18, 2018

Revert #6479, hide sensitive text/images from OpenGraph previews
Display summary of attachments in description, and mark up content
warning if present, e.g.:

    Attached: 3 images · Content warning: Dota 2

When text is not supposed to be hidden, it looks more like:

    Attached: 3 images

    Here is the text of the toot

With #6817, multilinguagility should be assured...

Gargron added a commit that referenced this pull request Mar 18, 2018

Revert #6479, hide sensitive text/images from OpenGraph previews
Display summary of attachments in description, and mark up content
warning if present, e.g.:

    Attached: 3 images · Content warning: Dota 2

When text is not supposed to be hidden, it looks more like:

    Attached: 3 images

    Here is the text of the toot

With #6817, multilinguagility should be assured...

Gargron added a commit that referenced this pull request Mar 18, 2018

Revert #6479, hide sensitive text/images from OpenGraph previews
Display summary of attachments in description, and mark up content
warning if present, e.g.:

    Attached: 3 images · Content warning: Dota 2

When text is not supposed to be hidden, it looks more like:

    Attached: 3 images

    Here is the text of the toot

With #6817, multilinguagility should be assured...
@Gargron

This comment has been minimized.

Member

Gargron commented Mar 18, 2018

It's almost like there are flaws when your software development process is entirely tech-oriented.

This change was initiated in the first place from talking to people not represented on GitHub.

When you anger the users, they begin to look elsewhere. People are going to start finding alternatives to your alternative.

It's called a fork. There are many, because I'm releasing my work as free, open source software. Please reflect on the entitlement seeping through your comment.

@cbondurant

This comment has been minimized.

cbondurant commented Mar 18, 2018

On the topic of the ?respect_content_warnings idea. That could work if toots had a dedicated share button, kinda like how youtube has a dedicated share button that has a built-in for sharing the current timestamp, and either sharing or not sharing the current playlist. Which adds ?s=N to the share link.

The share toot button could contain the option to disable content warnings (because its better to have disabling be the choice made with intent) as well as other options that might come up in the future. It could even go so far as "only disable text content warning" or "only image" if those features turn out to improve the user experience.

Even if this isn't the solution that is gone with, I do agree that fully disabling them completely causes just as many problems with the open graph display as there were before. It just moved the problem to something else.

@cosmicchipsocket

This comment has been minimized.

cosmicchipsocket commented Mar 18, 2018

This change was initiated in the first place from talking to people not represented on GitHub.

You need to consider not only the people who want the change, but also the people who might be impacted by it. Knowing the implications will lead to better decisions in the future.

It's called a fork.

Forks are technologically oriented, which most users are not. Forks run the risk of fragmentation, and they can lead to confusion over behavior when different instances employ different behaviors, a point you had brought up yourself.

@Cassolotl

This comment has been minimized.

Cassolotl commented Mar 18, 2018

I agree, most people who are impacted by this change would not be able to just set up their own instance, let alone make modifications to suit their needs.

@deutrino

This comment has been minimized.

deutrino commented Mar 18, 2018

I feel like for CW'd posts, hiding the images and adding (perhaps with localized words based on instance or toot language) "⚠️ content warning: cw text here" is a workable enough compromise that could be implemented quickly.

The question then becomes how to do away with the behavior for users who want their CW'd posts to display a full preview outside the network. A couple observations:

  • a setting applicable to the user's entire profile is problematic because it breaks the expectations of other users who might be sharing from the permalink
  • a setting that any user sharing the link can set (whether by button or modifying the url, etc) could be problematic because it may break the expectations of the OP
  • it would seem from these opposing concerns that perhaps the OP should be the only person able to disable the CW in the share preview when sharing a CW'd toot, which then leads to thorny implementation questions, not only about how to implement the UI in mastodon itself, but how could eg mobile clients do this; all of which is worth considering but would likely take more thought and more work than the initial compromise.

I'm fully on board with Mastodon being as rich a multimedia experience as possible and as interoperable as possible with things like previews, etc. I think it's good for the network. And I'm a heavy tumblr user who'd like to see lots of cool art, videos, even music shared via Mastodon. A fair number of the comments I post on github for Masto and my preferred mobile client Mastalab reflect this. I could absolutely see myself being frustrated with in-Masto CW vs out-of-Masto preview CW when trying to share a cool image post from my aesthetic alt.

All that being said, it seems like having CWs propagate by default, and working to allow at least the OP to disable that behavior when they themselves share a toot, may be the best compromise.

@deutrino

This comment has been minimized.

deutrino commented Mar 18, 2018

BTW @Gargron, it's clear to me that you've put a good deal of thought into this both before and after it blew up - I mean, it does take effort to stick a formatted table in a github comment! - and so I wanted to make clear that most people really do appreciate your blood sweat & tears spent on this project. You've built a network that's home to literally hundreds of thousands of people and groups, many with disparate interests. It will be tough to balance things. Thanks for sticking with it.

@cbondurant

This comment has been minimized.

cbondurant commented Mar 18, 2018

a setting that any user sharing the link can set (whether by button or modifying the url, etc) could be problematic because it may break the expectations of the OP

I feel like in the case of sharing content, the expectations of the OP in posting isn't the consideration that needs to be made. In most cases specific instance of linking a toot does not directly affect the OP and the OP would not know the context in which that toot was shared, meaning if you gave them the only one with power to decide, the decision would mostly end up being done arbitrarily, or more likely always left at the default.

In the case of an option that the sharer can choose, but defaulting to the safe option of hidden, the onus is on the sharer to not make a bad decision and directly share CW'd content in a place it should stay CW'd. This would be no different than any other case of having to think through linking dangerous content, e.g. not being dumb enough to link porn in a sfw context.

The important part of this way of doing it is it requires a direct and affirmative action to disable the CW, meaning there is very little chance of a dangerous accident. While it still technically allows for someone to intentionally link a CW'd message in a poor context without the CW, that's something they can already do using any other source on the internet.

Gargron added a commit that referenced this pull request Mar 18, 2018

Revert #6479, hide sensitive text/images from OpenGraph previews (#6818)
Display summary of attachments in description, and mark up content
warning if present, e.g.:

    Attached: 3 images · Content warning: Dota 2

When text is not supposed to be hidden, it looks more like:

    Attached: 3 images

    Here is the text of the toot

With #6817, multilinguagility should be assured...

rtucker added a commit to vulpineclub/mastodon that referenced this pull request Mar 18, 2018

rtucker added a commit to vulpineclub/mastodon that referenced this pull request Mar 18, 2018

Revert tootsuite#6479, hide sensitive text/images from OpenGraph prev…
…iews (tootsuite#6818)

Display summary of attachments in description, and mark up content
warning if present, e.g.:

    Attached: 3 images · Content warning: Dota 2

When text is not supposed to be hidden, it looks more like:

    Attached: 3 images

    Here is the text of the toot

With tootsuite#6817, multilinguagility should be assured...

imbsky pushed a commit to kibousoft/mastodon that referenced this pull request Apr 26, 2018

Do not hide NSFW media/CW'd text in OpenGraph tags (tootsuite#6479)
Reasoning: HTML title tag affects everyone. But OpenGraph only affects
when somebody is deliberately sharing the content, usually in an
environment where such content is expected. Hiding the content in
OpenGraph tags results in deceitful previews which inhibit the
shareability of the post.

Example: Somebody writes a clever post about politics but kindly
puts a "uspol" content warning on it. Mastodon users are thankful,
but sharing this post on another platform results in non-Mastodon
users believing the entire contents of the post is "uspol" and not
clicking through/reading and re-sharing.

imbsky pushed a commit to kibousoft/mastodon that referenced this pull request Apr 26, 2018

Revert tootsuite#6479, hide sensitive text/images from OpenGraph prev…
…iews (tootsuite#6818)

Display summary of attachments in description, and mark up content
warning if present, e.g.:

    Attached: 3 images · Content warning: Dota 2

When text is not supposed to be hidden, it looks more like:

    Attached: 3 images

    Here is the text of the toot

With tootsuite#6817, multilinguagility should be assured...

@nightpool nightpool referenced this pull request May 6, 2018

Open

Option to turn on image links again in toots #6899

1 of 2 tasks complete
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment