diff --git a/app/javascript/images/mailer-new/heading/LICENSE b/app/javascript/images/mailer-new/heading/LICENSE new file mode 100644 index 0000000000..974db1ac4b --- /dev/null +++ b/app/javascript/images/mailer-new/heading/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2024 Paweł Kuna + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/javascript/images/mailer-new/heading/README.md b/app/javascript/images/mailer-new/heading/README.md new file mode 100644 index 0000000000..ecd4b949e7 --- /dev/null +++ b/app/javascript/images/mailer-new/heading/README.md @@ -0,0 +1 @@ +Images in this folder are based on [Tabler.io icons](https://tabler.io/icons). diff --git a/app/javascript/images/mailer-new/store-icons/btn-app-store.png b/app/javascript/images/mailer-new/store-icons/btn-app-store.png new file mode 100644 index 0000000000..ee3bd9385c Binary files /dev/null and b/app/javascript/images/mailer-new/store-icons/btn-app-store.png differ diff --git a/app/javascript/images/mailer-new/store-icons/btn-google-play.png b/app/javascript/images/mailer-new/store-icons/btn-google-play.png new file mode 100644 index 0000000000..ed43ff29aa Binary files /dev/null and b/app/javascript/images/mailer-new/store-icons/btn-google-play.png differ diff --git a/app/javascript/images/mailer-new/welcome-icons/LICENSE b/app/javascript/images/mailer-new/welcome-icons/LICENSE new file mode 100644 index 0000000000..974db1ac4b --- /dev/null +++ b/app/javascript/images/mailer-new/welcome-icons/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2024 Paweł Kuna + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/app/javascript/images/mailer-new/welcome-icons/README.md b/app/javascript/images/mailer-new/welcome-icons/README.md new file mode 100644 index 0000000000..ecd4b949e7 --- /dev/null +++ b/app/javascript/images/mailer-new/welcome-icons/README.md @@ -0,0 +1 @@ +Images in this folder are based on [Tabler.io icons](https://tabler.io/icons). diff --git a/app/javascript/images/mailer-new/welcome/step5-off.png b/app/javascript/images/mailer-new/welcome-icons/apps_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step5-off.png rename to app/javascript/images/mailer-new/welcome-icons/apps_step-off.png diff --git a/app/javascript/images/mailer-new/welcome-icons/apps_step-on.png b/app/javascript/images/mailer-new/welcome-icons/apps_step-on.png new file mode 100644 index 0000000000..fd631bf97e Binary files /dev/null and b/app/javascript/images/mailer-new/welcome-icons/apps_step-on.png differ diff --git a/app/javascript/images/mailer-new/welcome-icons/edit_profile_step-off.png b/app/javascript/images/mailer-new/welcome-icons/edit_profile_step-off.png new file mode 100644 index 0000000000..dfcdd04e16 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome-icons/edit_profile_step-off.png differ diff --git a/app/javascript/images/mailer-new/welcome/step1-on.png b/app/javascript/images/mailer-new/welcome-icons/edit_profile_step-on.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step1-on.png rename to app/javascript/images/mailer-new/welcome-icons/edit_profile_step-on.png diff --git a/app/javascript/images/mailer-new/welcome/step2-off.png b/app/javascript/images/mailer-new/welcome-icons/follow_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step2-off.png rename to app/javascript/images/mailer-new/welcome-icons/follow_step-off.png diff --git a/app/javascript/images/mailer-new/welcome-icons/follow_step-on.png b/app/javascript/images/mailer-new/welcome-icons/follow_step-on.png new file mode 100644 index 0000000000..3ac011539b Binary files /dev/null and b/app/javascript/images/mailer-new/welcome-icons/follow_step-on.png differ diff --git a/app/javascript/images/mailer-new/welcome/step3-off.png b/app/javascript/images/mailer-new/welcome-icons/post_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step3-off.png rename to app/javascript/images/mailer-new/welcome-icons/post_step-off.png diff --git a/app/javascript/images/mailer-new/welcome-icons/post_step-on.png b/app/javascript/images/mailer-new/welcome-icons/post_step-on.png new file mode 100644 index 0000000000..aa318e66c8 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome-icons/post_step-on.png differ diff --git a/app/javascript/images/mailer-new/welcome/step4-off.png b/app/javascript/images/mailer-new/welcome-icons/share_step-off.png similarity index 100% rename from app/javascript/images/mailer-new/welcome/step4-off.png rename to app/javascript/images/mailer-new/welcome-icons/share_step-off.png diff --git a/app/javascript/images/mailer-new/welcome-icons/share_step-on.png b/app/javascript/images/mailer-new/welcome-icons/share_step-on.png new file mode 100644 index 0000000000..98782d9317 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome-icons/share_step-on.png differ diff --git a/app/javascript/images/mailer-new/welcome/feature_audience.png b/app/javascript/images/mailer-new/welcome/feature_audience.png new file mode 100644 index 0000000000..902de133b4 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome/feature_audience.png differ diff --git a/app/javascript/images/mailer-new/welcome/feature_control.png b/app/javascript/images/mailer-new/welcome/feature_control.png new file mode 100644 index 0000000000..1afb6c238c Binary files /dev/null and b/app/javascript/images/mailer-new/welcome/feature_control.png differ diff --git a/app/javascript/images/mailer-new/welcome/feature_creativity.png b/app/javascript/images/mailer-new/welcome/feature_creativity.png new file mode 100644 index 0000000000..3365856699 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome/feature_creativity.png differ diff --git a/app/javascript/images/mailer-new/welcome/feature_moderation.png b/app/javascript/images/mailer-new/welcome/feature_moderation.png new file mode 100644 index 0000000000..7cee9b29b8 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome/feature_moderation.png differ diff --git a/app/javascript/images/mailer-new/welcome/purple-extra-soft-spacer.png b/app/javascript/images/mailer-new/welcome/purple-extra-soft-spacer.png new file mode 100644 index 0000000000..ec1ad5c957 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome/purple-extra-soft-spacer.png differ diff --git a/app/javascript/images/mailer-new/welcome/purple-extra-soft-wave.png b/app/javascript/images/mailer-new/welcome/purple-extra-soft-wave.png new file mode 100644 index 0000000000..ba8f6dd3d9 Binary files /dev/null and b/app/javascript/images/mailer-new/welcome/purple-extra-soft-wave.png differ diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss index a2cbb494b4..e5d0c05f81 100644 --- a/app/javascript/styles/mailer.scss +++ b/app/javascript/styles/mailer.scss @@ -192,6 +192,18 @@ table + p { } } +.email-dir-rtl { + direction: rtl; + + [dir='rtl'] & { + direction: ltr; + } +} + +.email-dir-ltr { + direction: ltr; +} + .email-padding-24 { padding: 24px; } @@ -216,6 +228,30 @@ table + p { border-bottom: 1px solid #dfdee3; } +.email-desktop-flex { + font-size: 0; + max-width: 740px; + margin-left: auto; + margin-right: auto; + + &.email-dir-rtl > .email-desktop-column { + direction: ltr; + + [dir='rtl'] & { + direction: rtl; + } + } +} + +.email-desktop-column { + display: inline-block; + width: 100%; + max-width: none; + text-align: start; + vertical-align: top; + font-size: 16px; +} + // Header .email-header-td { padding: 16px 32px; @@ -312,6 +348,66 @@ table + p { } } +.email-header-card-table { + width: 100%; + border-collapse: separate; + overflow: hidden; + border-radius: 12px; + background-color: #fff; + border: 2px solid #fff; + box-shadow: 0 4px 16px 0 rgba(23, 6, 59, 8%); +} + +.email-header-card { + position: relative; + max-height: 100px; +} + +.email-header-card-banner-td { + border-radius: 12px 12px 0 0; + height: 80px; + background-color: #f3f2f5 !important; + background-position: center !important; + background-size: cover !important; +} + +.email-header-card-body-td { + padding: 12px; + + .email-btn-table { + width: 100%; + max-width: 212px; + } +} + +.email-header-card-instance { + margin-bottom: 4px; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + color: #17063b; + font-size: 14px; + line-height: 20px; + font-weight: 600; + + &:only-of-type { + margin-bottom: 12px; + } +} + +.email-header-card-description { + margin-bottom: 12px; + color: #746a89; + font-size: 12px; + line-height: 16px; + max-height: 32px; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + // To make the design work with images off // we create an empty div that overlaps with // the rest of the content with a dark background. @@ -336,6 +432,16 @@ table + p { mso-padding-alt: 32px; } +.email-body-columns-td { + border-top: 1px solid #dfdee3; + padding: 32px 24px 8px; +} + +.email-body-huge-padding-td { + padding: 110px 32px 32px; + mso-padding-alt: 32px; +} + .email-body-padding-td { & > p { font-size: 14px; @@ -353,6 +459,30 @@ table + p { } } +// Texts +.email-h2 { + margin-bottom: 4px; + color: #17063b; + font-size: 18px; + font-weight: 600; + line-height: 28px; +} + +.email-h-sub { + margin-bottom: 16px; + color: #746a89; + font-size: 14px; + line-height: 16px; +} + +.email-p { + margin-bottom: 16px; + color: #746a89; + font-size: 14px; + font-weight: 400; + line-height: 20px; +} + // Footer .email-footer-td { padding: 28px 32px 32px; @@ -539,8 +669,13 @@ table + p { background-color: #fff; } +.email-checklist-checked { + border-color: #c4e6d7; + background-color: #eaf6f1; +} + .email-checklist-td { - padding: 16px; + padding: 16px 16px 6px; } .email-checklist-icons-td { @@ -576,10 +711,15 @@ table + p { font-size: 14px; font-weight: 600; line-height: 16.8px; + + .email-checklist-checked & { + color: #746a89; + text-decoration: line-through; + } } p { - margin: 0 0 2px; + margin: 0 0 12px; color: #746a89; font-size: 14px; line-height: 16.8px; @@ -597,6 +737,194 @@ table + p { padding-left: 10px; padding-right: 10px; } + + div + div { + margin-inline-start: auto; + margin-bottom: 12px; + } +} + +// Welcome email +.email-welcome-apps-btns { + font-size: 12px; + line-height: 44px; +} + +.email-column-td { + padding: 0 8px; + vertical-align: top; +} + +.email-link-with-arrow { + color: #6364ff; + font-size: 14px; + font-weight: 600; + line-height: 16.8px; + + &:hover { + color: #563acc !important; + } + + span { + font-size: 12px; + font-weight: 400; + } +} + +.email-column-action-td { + padding: 24px 0; + color: #6364ff; + font-size: 14px; + font-weight: 600; + line-height: 16.8px; + text-align: center; +} + +// Follow and hashtags +.email-mini-wrapper-td { + padding: 4px 0; + + table { + table-layout: fixed; + } +} + +.email-mini-td { + border-radius: 12px; + border: 1px solid #e8e6eb; + background-color: #fff; + padding: 15px 16px; +} + +.email-mini-follow-img-td { + width: 40px; + vertical-align: top; + + img { + border-radius: 8px; + } +} + +.email-mini-follow-text-td { + padding-left: 8px; + padding-right: 16px; + vertical-align: top; + + h3 { + color: #17063b; + font-size: 14px; + font-weight: 600; + line-height: 20px; + } + + p { + color: #746a89; + font-size: 12px; + font-weight: 400; + line-height: 16px; + } +} + +.email-mini-follow-btn-td { + width: 68px; + vertical-align: top; + + .email-btn-table { + width: 100%; + } + + .email-btn-td { + mso-padding-alt: 10px; + } + + .email-btn-a { + padding-left: 10px; + padding-right: 10px; + } +} + +.email-mini-hashtag-td { + height: 40px; + + td { + vertical-align: middle; + } + + h3 { + color: #17063b; + font-size: 14px; + font-weight: 600; + line-height: 20px; + } + + p { + color: #746a89; + font-size: 12px; + font-weight: 400; + line-height: 16px; + word-break: break-all; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +.email-mini-hashtag-img-td { + width: 40px; + height: 20px; + white-space: nowrap; + text-indent: -2px; + font-size: 0; + + & + td { + padding-left: 8px; + } +} + +.email-mini-hashtag-img-span { + display: inline-block; + max-width: 12px; + font-size: 12px; + + img { + width: 16px; + height: 16px; + border-radius: 50%; + max-width: none; + border: 2px solid #fff; + vertical-align: middle; + } +} + +// Extra content on light purple background +.email-extra-wave { + height: 42px; + background-image: url('../images/mailer-new/welcome/purple-extra-soft-wave.png'); + background-position: bottom center; + background-repeat: no-repeat; +} + +.email-extra-td { + padding: 32px 32px 24px; + background-color: #f0f0ff; + background-image: url('../images/mailer-new/welcome/purple-extra-soft-spacer.png'); // Using an image to maintain the color even in forced dark modes + + .email-column-td { + padding-top: 8px; + padding-bottom: 8px; + } +} + +// Feature card +.email-feature-wrapper-td { + padding: 8px 0; +} + +.email-feature-td { + padding: 24px; + background-color: #fff; + border: 1px solid #e8e6eb; + border-radius: 12px; } // Responsive @@ -617,4 +945,21 @@ table + p { .email-desktop-flex { display: flex; } + + .email-header-left { + padding-right: 32px; + } + + .email-header-right { + width: 240px; + margin-inline-start: auto; + } + + .email-desktop-column { + max-width: 346px !important; + } + + .email-desktop-text-right { + text-align: right; + } } diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 3b1a085cb8..96fcd51efa 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -135,6 +135,12 @@ class UserMailer < Devise::Mailer return unless @resource.active_for_authentication? + @suggestions = AccountSuggestions.new(@resource.account).get(5) + @tags = Trends.tags.query.allowed.limit(5) + @has_account_fields = @resource.account.display_name.present? || @resource.account.note.present? || @resource.account.avatar.present? + @has_active_relationships = @resource.account.active_relationships.exists? + @has_statuses = @resource.account.statuses.exists? + I18n.with_locale(locale) do mail subject: default_i18n_subject end diff --git a/app/models/user.rb b/app/models/user.rb index d2863b1e4a..fecb19c037 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -490,7 +490,7 @@ class User < ApplicationRecord BootstrapTimelineWorker.perform_async(account_id) ActivityTracker.increment('activity:accounts:local') ActivityTracker.record('activity:logins', id) - UserMailer.welcome(self).deliver_later + UserMailer.welcome(self).deliver_later(wait: 1.hour) TriggerWebhookWorker.perform_async('account.approved', 'Account', account_id) end diff --git a/app/views/application/mailer/_button.html.haml b/app/views/application/mailer/_button.html.haml index 61430732eb..0bf80b505a 100644 --- a/app/views/application/mailer/_button.html.haml +++ b/app/views/application/mailer/_button.html.haml @@ -1,4 +1,7 @@ %table.email-btn-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-btn-td - = link_to "#{text} ➜", url, class: 'email-btn-a email-btn-hover' + - if defined?(has_arrow) && !has_arrow + = link_to text, url, class: 'email-btn-a email-btn-hover' + - else + = link_to "#{text} ➜", url, class: 'email-btn-a email-btn-hover' diff --git a/app/views/application/mailer/_checklist.html.haml b/app/views/application/mailer/_checklist.html.haml index 83072bd36b..324fd7e6f8 100644 --- a/app/views/application/mailer/_checklist.html.haml +++ b/app/views/application/mailer/_checklist.html.haml @@ -1,7 +1,7 @@ %table.email-w-full.email-checklist-wrapper-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-checklist-wrapper-td - %table.email-w-full.email-checklist-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %table.email-w-full.email-checklist-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation', class: ('email-checklist-checked' if defined?(checked) && checked) } %tr %td.email-checklist-td %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } @@ -15,15 +15,25 @@ - else = image_tag frontend_asset_url('images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20 %td.email-checklist-icons-step-td - - if defined?(step_image_url) - = image_tag step_image_url, alt: '', width: 40, height: 40 + - if defined?(key) + = image_tag frontend_asset_url("images/mailer-new/welcome-icons/#{key}-#{checked ? 'on' : 'off'}.png"), alt: '', width: 40, height: 40 %td.email-checklist-text-td .email-desktop-flex + /[if mso] +
%div - if defined?(title) %h3= title - if defined?(text) %p= text + /[if mso] + %div - - if defined?(button_text) && defined?(button_url) && defined?(checked) && !checked - = render 'application/mailer/button', text: button_text, url: button_url + - if defined?(show_apps_buttons) && show_apps_buttons + .email-welcome-apps-btns + = link_to image_tag(frontend_asset_url('images/mailer-new/store-icons/btn-app-store.png'), alt: t('user_mailer.welcome.apps_ios_action'), width: 120, height: 40), 'https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974' + = link_to image_tag(frontend_asset_url('images/mailer-new/store-icons/btn-google-play.png'), alt: t('user_mailer.welcome.apps_android_action'), width: 120, height: 40), 'https://play.google.com/store/apps/details?id=org.joinmastodon.android' + - elsif defined?(button_text) && defined?(button_url) && defined?(checked) && !checked + = render 'application/mailer/button', text: button_text, url: button_url, has_arrow: false + /[if mso] +
diff --git a/app/views/application/mailer/_feature.html.haml b/app/views/application/mailer/_feature.html.haml new file mode 100644 index 0000000000..d051338a9c --- /dev/null +++ b/app/views/application/mailer/_feature.html.haml @@ -0,0 +1,32 @@ +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-feature-wrapper-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-feature-td + .email-desktop-flex{ class: ('email-dir-rtl' if defined?(text_first_on_desktop) && !text_first_on_desktop) } + /[if mso] +
+ .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + - if defined?(feature_title) + %h2.email-h2= feature_title + - if defined?(feature_text) + %p.email-p= feature_text + - if defined?(feature_btn_url) + = link_to '', href: feature_btn_url, class: 'email-link-with-arrow' do + #{t('user_mailer.welcome.feature_action')}  + %span= '❯' + /[if mso] + + .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + - if defined?(key) + %p{ class: ('email-desktop-text-right' if defined?(text_first_on_desktop) && text_first_on_desktop) } + = image_tag frontend_asset_url("images/mailer-new/welcome/#{key}.png"), alt: '', width: 240, height: 230 + /[if mso] +
diff --git a/app/views/application/mailer/_follow.html.haml b/app/views/application/mailer/_follow.html.haml new file mode 100644 index 0000000000..382151a234 --- /dev/null +++ b/app/views/application/mailer/_follow.html.haml @@ -0,0 +1,15 @@ +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-wrapper-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-follow-img-td + = image_tag full_asset_url(follow.account.avatar.url), alt: '', width: 40, height: 40 + %td.email-mini-follow-text-td + %h3= follow.account.display_name.presence || follow.account.username + %p @#{follow.account.pretty_acct} + %td.email-mini-follow-btn-td + = render 'application/mailer/button', text: t('user_mailer.welcome.follow_action'), url: web_url("@#{follow.account.acct}"), has_arrow: false diff --git a/app/views/application/mailer/_hashtag.html.haml b/app/views/application/mailer/_hashtag.html.haml new file mode 100644 index 0000000000..524fd7e274 --- /dev/null +++ b/app/views/application/mailer/_hashtag.html.haml @@ -0,0 +1,20 @@ +- accounts = hashtag.statuses.with_public_visibility.joins(:account).merge(Account.without_suspended.without_silenced).includes(:account).limit(3).map(&:account) + +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-wrapper-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-hashtag-td{ height: 40 } + %h3 ##{hashtag.display_name} + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-mini-hashtag-img-td + - accounts.each do |account| + %span.email-mini-hashtag-img-span + = image_tag full_asset_url(account.avatar.url), alt: '', width: 16, height: 16 + %td + %p= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(hashtag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2) diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml index b77d40fb05..e7f9c47e3b 100644 --- a/app/views/user_mailer/welcome.html.haml +++ b/app/views/user_mailer/welcome.html.haml @@ -1,25 +1,76 @@ +- instance_presenter = InstancePresenter.new + = content_for :heading do - = render 'application/mailer/heading', heading_title: t('user_mailer.welcome.title', name: @resource.account.username), heading_subtitle: t('user_mailer.welcome.explanation') + .email-desktop-flex + .email-header-left + = render 'application/mailer/heading', heading_title: t('user_mailer.welcome.title', name: @resource.account.username), heading_subtitle: t('user_mailer.welcome.explanation') + .email-header-right + .email-header-card + %table.email-header-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-header-card-banner-td{ height: 140, background: full_asset_url(instance_presenter.thumbnail&.file&.url(:'@1x') || frontend_asset_path('images/preview.png')) } + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-header-card-body-td + %p.email-header-card-instance= @instance + - if instance_presenter.description.present? + %p.email-header-card-description= instance_presenter.description + = render 'application/mailer/button', text: t('user_mailer.welcome.sign_in_action'), url: new_user_session_url, has_arrow: false + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.email-body-padding-td - %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-inner-card-td-without-padding - %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-prose.email-padding-24 - %p - %b= t 'user_mailer.welcome.full_handle' - = render 'application/mailer/frame', text: "#{@resource.account.username}@#{@instance}" - %p= t 'user_mailer.welcome.full_handle_hint', instance: @instance - %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-border-top.email-prose.email-padding-24 - %p= t 'user_mailer.welcome.edit_profile_step' - = render 'application/mailer/button', text: t('user_mailer.welcome.edit_profile_action'), url: settings_profile_url - %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } - %tr - %td.email-border-top.email-prose.email-padding-24 - %p= t 'user_mailer.welcome.edit_profile_step' - = render 'application/mailer/button', text: t('user_mailer.welcome.final_action'), url: web_url + %td.email-body-huge-padding-td + %h2.email-h2= t('user_mailer.welcome.checklist_title') + %p.email-h-sub= t('user_mailer.welcome.checklist_subtitle') + = render 'application/mailer/checklist', key: 'edit_profile_step', title: t('user_mailer.welcome.edit_profile_title'), text: t('user_mailer.welcome.edit_profile_step'), checked: @has_account_fields, button_text: t('user_mailer.welcome.edit_profile_action'), button_url: web_url('start/profile') + = render 'application/mailer/checklist', key: 'follow_step', title: t('user_mailer.welcome.follow_title'), text: t('user_mailer.welcome.follow_step'), checked: @has_active_relationships, button_text: t('user_mailer.welcome.follow_action'), button_url: web_url('start/follows') + = render 'application/mailer/checklist', key: 'post_step', title: t('user_mailer.welcome.post_title'), text: t('user_mailer.welcome.post_step'), checked: @has_statuses, button_text: t('user_mailer.welcome.post_action'), button_url: web_url + = render 'application/mailer/checklist', key: 'share_step', title: t('user_mailer.welcome.share_title'), text: t('user_mailer.welcome.share_step'), checked: false, button_text: t('user_mailer.welcome.share_action'), button_url: web_url('start/share') + = render 'application/mailer/checklist', key: 'apps_step', title: t('user_mailer.welcome.apps_title'), text: t('user_mailer.welcome.apps_step'), checked: false, show_apps_buttons: true +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-columns-td + .email-desktop-flex + /[if mso] +
+ .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + %h2.email-h2= t('user_mailer.welcome.follows_title') + %p.email-h-sub= t('user_mailer.welcome.follows_subtitle') + = render partial: 'application/mailer/follow', collection: @suggestions + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-action-td + = link_to '', href: web_url('explore/suggestions'), class: 'email-link-with-arrow' do + = t('user_mailer.welcome.follows_view_more') + %span= '❯' + /[if mso] + + .email-desktop-column + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-td + %h2.email-h2= t('user_mailer.welcome.hashtags_title') + %p.email-h-sub= t('user_mailer.welcome.hashtags_subtitle') + = render partial: 'application/mailer/hashtag', collection: @tags + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-column-action-td + = link_to '', href: web_url('explore/tags'), class: 'email-link-with-arrow' do + = t('user_mailer.welcome.hashtags_view_more') + %span= '❯' + /[if mso] +
+.email-extra-wave +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-extra-td + = render 'application/mailer/feature', key: 'feature_control', feature_title: t('user_mailer.welcome.feature_control_title'), feature_text: t('user_mailer.welcome.feature_control'), text_first_on_desktop: true + = render 'application/mailer/feature', key: 'feature_audience', feature_title: t('user_mailer.welcome.feature_audience_title'), feature_text: t('user_mailer.welcome.feature_audience'), text_first_on_desktop: false + = render 'application/mailer/feature', key: 'feature_moderation', feature_title: t('user_mailer.welcome.feature_moderation_title'), feature_text: t('user_mailer.welcome.feature_moderation'), text_first_on_desktop: true + = render 'application/mailer/feature', key: 'feature_creativity', feature_title: t('user_mailer.welcome.feature_creativity_title'), feature_text: t('user_mailer.welcome.feature_creativity'), text_first_on_desktop: false diff --git a/app/views/user_mailer/welcome.text.erb b/app/views/user_mailer/welcome.text.erb index d78cdb938a..150944605f 100644 --- a/app/views/user_mailer/welcome.text.erb +++ b/app/views/user_mailer/welcome.text.erb @@ -1,16 +1,78 @@ <%= t 'user_mailer.welcome.title', name: @resource.account.username %> <%= t 'user_mailer.welcome.explanation' %> -=== - -<%= t 'user_mailer.welcome.full_handle' %> (<%= "@#{@resource.account.local_username_and_domain}" %>) -<%= t 'user_mailer.welcome.full_handle_hint', instance: @instance %> - --- -<%= t 'user_mailer.welcome.edit_profile_step' %> +<%= t('user_mailer.welcome.sign_in_action') %> +=== +<%= new_user_session_url %> -=> <%= settings_profile_url %> +--- -<%= t 'user_mailer.welcome.final_step' %> +<%= t('user_mailer.welcome.checklist_title') %> +=== +<%= t('user_mailer.welcome.checklist_subtitle') %> -=> <%= web_url %> +1. <%= t('user_mailer.welcome.edit_profile_title') %> + <%= t('user_mailer.welcome.edit_profile_step') %> + * <%= web_url('start/profile') %> + +2. <%= t('user_mailer.welcome.follow_title') %> + <%= t('user_mailer.welcome.follow_step') %> + * <%= web_url('start/follows') %> + +3. <%= t('user_mailer.welcome.post_title') %> + <%= t('user_mailer.welcome.post_step') %> + * <%= web_url %> + +4. <%= t('user_mailer.welcome.share_title') %> + <%= t('user_mailer.welcome.share_step') %> + * <%= web_url('start/share') %> + +5. <%= t('user_mailer.welcome.apps_title') %> + <%= t('user_mailer.welcome.apps_step') %> + * iOS: https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974 + * Android: https://play.google.com/store/apps/details?id=org.joinmastodon.android + +--- + +<%= t('user_mailer.welcome.follows_title') %> +=== +<%= t('user_mailer.welcome.follows_subtitle') %> + +<%- @suggestions.each do |suggestion| %> +* <%= suggestion.account.display_name.presence || suggestion.account.username %> · @<%= suggestion.account.pretty_acct %> + <%= web_url("@#{suggestion.account.acct}") %> +<%- end %> + +<%= web_url('explore/suggestions') %> + +--- + +<%= t('user_mailer.welcome.hashtags_title') %> +=== +<%= t('user_mailer.welcome.hashtags_subtitle') %> + +<%- @tags.each do |tag| %> +* #<%= tag.display_name %> · <%= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(tag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2) %> + <%= tag_url(tag) %> +<%- end %> + +<%= web_url('explore/tags') %> + +--- + +<%= t('user_mailer.welcome.feature_control_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_control') %> + +<%= t('user_mailer.welcome.feature_audience_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_audience') %> + +<%= t('user_mailer.welcome.feature_moderation_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_moderation') %> + +<%= t('user_mailer.welcome.feature_creativity_title') %> +=== +<%= word_wrap t('user_mailer.welcome.feature_creativity') %> diff --git a/config/locales/an.yml b/config/locales/an.yml index 17077041da..edfdb44b35 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1600,10 +1600,6 @@ an: edit_profile_action: Configurar lo perfil edit_profile_step: Puetz personalizar lo tuyo perfil puyando una foto de perfil, cambiando lo tuyo nombre d'usuario y muito mas. Puetz optar per revisar a los nuevos seguidores antes que puedan seguir-te. explanation: Aquí i hai qualques consellos pa empecipiar - final_action: Empecipiar a publicar - final_step: 'Empecipia a publicar! Mesmo sin seguidores, las tuyas publicacions publicas pueden estar vistas per atros, per eixemplo en a linia de tiempo local u en etiquetas. Tal vegada quieras presentar-te con a etiqueta de #presentacions.' - full_handle: Lo suyo sobrenombre completo - full_handle_hint: Esto ye lo que le dirías a los tuyos amigos pa que ells puedan ninviar-te mensaches u seguir-te dende unatra instancia. subject: Bienveniu a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 0927fba0af..2b2052172e 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1969,10 +1969,6 @@ ar: edit_profile_action: تهيئة الملف التعريفي edit_profile_step: يمكنك تخصيص ملفك الشخصي عن طريق رفع صورة ملفك الشخصي, تغيير اسم العرض الخاص بك والمزيد. يمكنك اختيار مراجعة المتابعين الجدد قبل السماح لهم بمتابعتك. explanation: ها هي بعض النصائح قبل بداية الاستخدام - final_action: اشرَع في النشر - final_step: 'ابدأ في النشر! حتى بدون متابعين، منشوراتك العامة قد يشاهدها آخرون، على سبيل المثال في التوقيت المحلي أو في الوسوم. قد ترغب في تقديم نفسك على وسم #introductions.' - full_handle: عنوانك الكامل - full_handle_hint: هذا هو ما يجب تقديمه لأصدقائك قصد أن يكون بإمكانهم متابَعتك أو مُراسَلتك حتى و إن كانت حساباتهم على خوادم أخرى. subject: أهلًا بك على ماستدون title: أهلاً بك، %{name}! users: diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 7e5a4c8876..da7e99c2fa 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -903,7 +903,6 @@ ast: edit_profile_action: Configurar el perfil edit_profile_step: Pues personalizar el perfil pente la xuba d'una semeya, el cambéu del nome visible ya muncho más. Tamién, si lo prefieres, pues revisar los perfiles nuevos enantes de que puedan siguite. explanation: Equí tienes dalgunos conseyos pa que comiences - final_action: Comenzar a espublizar subject: Afáyate en Mastodon title: "¡Afáyate, %{name}!" users: diff --git a/config/locales/be.yml b/config/locales/be.yml index 13cbcd8ffc..34e0722ba9 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1910,10 +1910,6 @@ be: edit_profile_action: Наладзіць профіль edit_profile_step: Вы можаце наладзіць свой профіль, запампаваўшы выяву профілю, змяніўшы адлюстраванае імя і іншае. Вы можаце праглядаць новых падпісчыкаў, перш чым ім будзе дазволена падпісацца на вас. explanation: Вось некаторыя парады каб пачаць - final_action: Пачаць пісаць - final_step: 'Пачынайце пісаць! Нават, калі ў вас няма падпісчыкаў, іншыя людзі змогуць пабачыць вашыя допісы, напрыклад, у лакальнай стужцы, або праз хэштэгі. Калі хочаце, вы можаце прадставіцца праз хэштэг #introductions.' - full_handle: Ваш поўны маркер - full_handle_hint: Гэта тое, што вы дасце сваім сябрам, каб яны маглі адпраўляць паведамленні або падпісацца на вас з іншага сервера. subject: Вітаем у Mastodon title: Рады вітаць вас, %{name}! users: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index b1229ac906..15c671d539 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1841,10 +1841,6 @@ bg: edit_profile_action: Настройване на профила edit_profile_step: Може да настроите профила си, качвайки снимката на профила, променяйки показваното си име и други неща. Може да се включите за преглед на нови последователи преди да бъдат позволени да ви последват. explanation: Ето няколко стъпки за начало - final_action: Начало на публикуване - final_step: 'Публикувайте! Дори без да имате последователи, вашите публични публикации ще бъдат видени от други, например в местната хронология или под хаштагове. Не забравяйте да се представите с хаштаг #introductions.' - full_handle: Пълното ви име - full_handle_hint: Ето какво бихте казали на приятелите си, за да могат да ви изпращат съобщения или да ви последват от друг сървър. subject: Добре дошли в Mastodon title: Добре дошли на борда, %{name}! users: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 4b5ec815ca..d80fb598e3 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1846,10 +1846,6 @@ ca: edit_profile_action: Configura el perfil edit_profile_step: Pots personalitzar el teu perfil pujant-hi un avatar, canviant el teu nom de visualització i molt més. Si ho prefereixes, pots revisar els seguidors nous abans que et puguin seguir. explanation: Aquests són alguns consells per a començar - final_action: Comença a publicar - final_step: 'Comença a publicar! Fins i tot sense seguidors, els altres poden veure els teus missatges públics, per exemple, a la línia de temps local i a les etiquetes. És possible que vulguis presentar-te amb l''etiqueta #introductions.' - full_handle: El teu nom d'usuari sencer - full_handle_hint: Això és el que has de dir als teus amics perquè puguin enviar-te missatges o seguir-te des d'un altre servidor. subject: Et donem la benvinguda a Mastodon title: Benvingut a bord, %{name}! users: diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 72a3c08d4d..fec8f73323 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -1035,9 +1035,6 @@ ckb: welcome: edit_profile_action: پرۆفایلی جێگیرکردن explanation: ئەمە چەند ئامۆژگارییەکن بۆ دەست پێکردنت - final_action: دەست بکە بە بڵاوکردنەوە - full_handle: ناوی بەکارهێنەری تەواوی ئێوە - full_handle_hint: ئەمە ئەو شتەیە کە بە هاوڕێکانت دەلێی بۆ ئەوەی پەیام یان لە ڕاژەیەکی دیکەی ترەوە بەدوات بکەون. subject: بەخێربیت بۆ ماستۆدۆن title: بەخێربێیت، بەکارهێنەر %{name}! users: diff --git a/config/locales/co.yml b/config/locales/co.yml index f5b6b46d92..c3c185c2f5 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -1050,9 +1050,6 @@ co: welcome: edit_profile_action: Cunfigurazione di u prufile explanation: Eccu alcune idee per principià - final_action: Principià à pustà - full_handle: U vostru identificatore cumplettu - full_handle_hint: Quessu ghjè cio chì direte à i vostri amichi per circavi, abbunassi à u vostru contu da altrò, o mandà missaghji. subject: Benvenutu·a nant’à Mastodon title: Benvenutu·a, %{name}! users: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index e43f671590..69640a261f 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1910,10 +1910,6 @@ cs: edit_profile_action: Nastavit profil edit_profile_step: Váš profil si můžete přizpůsobit nahráním profilového obrázku, změnou zobrazovaného jména a dalším. Můžete se přihlásit k přezkoumání nových následovatelů, než vás budou moci následovat. explanation: Zde je pár tipů do začátku - final_action: Začít psát - final_step: 'Začněte psát příspěvky! I bez sledujících mohou vaše veřejné příspěvky vidět ostatní, například na místní časové ose nebo v hashtagu. Možná se budete chtít představit na hashtagu #představení.' - full_handle: Vaše celá adresa profilu - full_handle_hint: Tohle je, co byste řekli svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru. subject: Vítejte na Mastodonu title: Vítejte na palubě, %{name}! users: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 1fbcbb2255..19343146f3 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1974,10 +1974,6 @@ cy: edit_profile_action: Sefydlu proffil edit_profile_step: Gallwch addasu'ch proffil trwy lwytho llun proffil, newid eich enw dangos a mwy. Gallwch ddewis i adolygu dilynwyr newydd cyn iddyn nhw gael caniatâd i'ch dilyn. explanation: Dyma ambell nodyn i'ch helpu i ddechrau - final_action: Dechrau postio - final_step: 'Dechreuwch bostio! Hyd yn oed heb ddilynwyr, efallai y bydd eraill yn gweld eich postiadau cyhoeddus, er enghraifft ar y ffrwd leol neu mewn hashnodau. Efallai y byddwch am gyflwyno eich hun ar yr hashnod #cyflwyniadau neu/a #introductions.' - full_handle: Eich enw llawn - full_handle_hint: Dyma beth fyddech chi'n ei ddweud wrth eich ffrindiau fel y gallant anfon neges neu eich dilyn o weinydd arall. subject: Croeso i Mastodon title: Croeso, %{name}! users: diff --git a/config/locales/da.yml b/config/locales/da.yml index 5ceaad9705..62e28cef16 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1846,10 +1846,6 @@ da: edit_profile_action: Opsæt profil edit_profile_step: Man kan tilpasse sin profil ved at uploade profilfoto, overskrift, ændre visningsnavn mv. Ønskes nye følgere vurderet, før de må følge dig, kan kontoen låses. explanation: Her er nogle råd for at få dig i gang - final_action: Begynd at poste - final_step: 'Begynd at poste! Selv uden følgere vil offentlige indlæg kunne ses af andre f.eks. på den lokale tidslinje og i hashtags. Man kan introducere sig selv via hastagget #introductions.' - full_handle: Dit fulde brugernavn - full_handle_hint: Dette er, hvad du oplyser til dine venner, så de kan sende dig beskeder eller følge dig fra andre servere. subject: Velkommen til Mastodon title: Velkommen ombord, %{name}! users: diff --git a/config/locales/de.yml b/config/locales/de.yml index ae1af7b308..123942672e 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1846,10 +1846,6 @@ de: edit_profile_action: Profil einrichten edit_profile_step: Du kannst dein Profil anpassen, indem du ein Profilbild hochlädst, deinen Anzeigenamen änderst und vieles mehr. Du kannst dich dafür entscheiden, neue Follower zu überprüfen, bevor sie dir folgen dürfen. explanation: Hier sind ein paar Tipps, um loszulegen - final_action: Mit erstem Beitrag starten - final_step: 'Fang jetzt an zu posten! Selbst ohne Follower werden deine öffentlichen Beiträge von anderen gesehen, zum Beispiel in der lokalen Timeline oder über die Hashtags. Möglicherweise möchtest du dich allen mit dem Hashtag #neuhier vorstellen.' - full_handle: Dein vollständiger Profilname - full_handle_hint: Deinen vollständigen Profilnamen kannst du deinen Freund*innen mitteilen, damit sie dich anschreiben oder dir von einem anderen Server folgen können. subject: Willkommen bei Mastodon! title: Willkommen an Bord, %{name}! users: diff --git a/config/locales/el.yml b/config/locales/el.yml index 16c042f185..c641d4dca9 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1707,10 +1707,6 @@ el: edit_profile_action: Στήσιμο προφίλ edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα προφίλ, αλλάζοντας το εμφνιζόμενο όνομα και άλλα. Μπορείς να επιλέξεις να αξιολογείς νέους ακόλουθους πριν τους επιτραπεί να σε ακολουθήσουν. explanation: Μερικές συμβουλές για να ξεκινήσεις - final_action: Ξεκίνα να αναρτάς - final_step: 'Ξεκίνα να δημοσιεύεις! Ακόμα και χωρίς ακόλουθους τις δημόσιες δημοσιεύσεις σου μπορεί να τις δουν άλλοι, για παράδειγμα στην τοπική ροή ή στις ετικέτες. Ίσως να θέλεις να μας γνωρίσεις τον εαυτό σου με την ετικέτα #introductions.' - full_handle: Το πλήρες όνομά σου - full_handle_hint: Αυτό θα εδώ θα πεις στους φίλους σου για να σου μιλήσουν ή να σε ακολουθήσουν από άλλο διακομιστή. subject: Καλώς ήρθες στο Mastodon title: Καλώς όρισες, %{name}! users: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index d4840c84e9..6b2554fe15 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1841,10 +1841,6 @@ en-GB: edit_profile_action: Setup profile edit_profile_step: You can customise your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before they’re allowed to follow you. explanation: Here are some tips to get you started - final_action: Start posting - final_step: 'Start posting! Even without followers, your public posts may be seen by others, for example on the local timeline or in hashtags. You may want to introduce yourself on the #introductions hashtag.' - full_handle: Your full handle - full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. subject: Welcome to Mastodon title: Welcome aboard, %{name}! users: diff --git a/config/locales/en.yml b/config/locales/en.yml index efd603740a..cff244a4b9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1844,13 +1844,42 @@ en: silence: Account limited suspend: Account suspended welcome: - edit_profile_action: Setup profile - edit_profile_step: You can customize your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before they’re allowed to follow you. + apps_android_action: Get it on Google Play + apps_ios_action: Download on the App Store + apps_step: Download our official apps. + apps_title: Mastodon apps + checklist_subtitle: 'Let''s get you started on this new social frontier:' + checklist_title: Welcome Checklist + edit_profile_action: Personalize + edit_profile_step: Boost your interactions by having a comprehensive profile. + edit_profile_title: Personalize your profile explanation: Here are some tips to get you started - final_action: Start posting - final_step: 'Start posting! Even without followers, your public posts may be seen by others, for example on the local timeline or in hashtags. You may want to introduce yourself on the #introductions hashtag.' - full_handle: Your full handle - full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. + feature_action: Learn more + feature_audience: Mastodon provides you with a unique possibility of managing your audience without middlemen. Mastodon deployed on your own infrastructure allows you to follow and be followed from any other Mastodon server online and is under no one's control but yours. + feature_audience_title: Build your audience in confidence + feature_control: You know best what you want to see on your home feed. No algorithms or ads to waste your time. Follow anyone across any Mastodon server from a single account and receive their posts in chronological order, and make your corner of the internet a little more like you. + feature_control_title: Stay in control of your own timeline + feature_creativity: Mastodon supports audio, video and picture posts, accessibility descriptions, polls, content warnings, animated avatars, custom emojis, thumbnail crop control, and more, to help you express yourself online. Whether you're publishing your art, your music, or your podcast, Mastodon is there for you. + feature_creativity_title: Unparalleled creativity + feature_moderation: Mastodon puts decision making back in your hands. Each server creates their own rules and regulations, which are enforced locally and not top-down like corporate social media, making it the most flexible in responding to the needs of different groups of people. Join a server with the rules you agree with, or host your own. + feature_moderation_title: Moderating the way it should be + follow_action: Follow + follow_step: Following interesting people is what Mastodon is all about. + follow_title: Personalize your home feed + follows_subtitle: Follow well-known accounts + follows_title: Who to follow + follows_view_more: View more people to follow + hashtags_recent_count: "%{people} people in the past %{days} days" + hashtags_subtitle: Explore what’s trending since past 2 days + hashtags_title: Trending hashtags + hashtags_view_more: View more trending hashtags + post_action: Compose + post_step: Say hello to the world with text, photos, videos, or polls. + post_title: Make your first post + share_action: Share + share_step: Let your friends know how to find you on Mastodon. + share_title: Share your Mastodon profile + sign_in_action: Sign in subject: Welcome to Mastodon title: Welcome aboard, %{name}! users: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index beb6aa6d9f..bc694578b7 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1763,10 +1763,6 @@ eo: edit_profile_action: Agordi profilon edit_profile_step: Vi povas personecigi vian profilon per alŝuti profilbildon, ŝangi vian montronomo kaj pli. explanation: Jen kelkaj konsiloj por helpi vin komenci - final_action: Ekmesaĝi - final_step: 'Ekmesaĝu! Eĉ sen sekvantoj, viaj publikaj mesaĝoj povas esti vidataj de aliaj, ekzemple en la loka templinio aŭ per kradvortoj. Eble vi ŝatus prezenti vin per la kradvorto #introductions / #konigo.' - full_handle: Via kompleta uzantnomo - full_handle_hint: Jen kion vi dirus al viaj amikoj, por ke ili mesaĝu aŭ sekvu vin de alia servilo. subject: Bonvenon en Mastodon title: Bonvenon, %{name}! users: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 1db8e6ecf8..37fcc11d78 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1846,10 +1846,6 @@ es-AR: edit_profile_action: Configurar perfil edit_profile_step: Podés personalizar tu perfil subiendo un avatar (imagen de perfil), cambiando tu nombre a mostrar y más. Podés optar por revisar a los nuevos seguidores antes de que puedan seguirte. explanation: Aquí hay algunos consejos para empezar - final_action: Empezá a enviar mensajes - final_step: "¡Empezá a enviar mensajes! Incluso sin seguidores, tus mensajes públicos pueden ser vistos por otros, por ejemplo en la linea temporal local o al usar etiquetas. Capaz que quieras presentarte al mundo con la etiqueta «#presentación»." - full_handle: Tu nombre de usuario completo - full_handle_hint: Esto es lo que le dirás a tus contactos para que ellos puedan enviarte mensajes o seguirte desde otro servidor. subject: Bienvenido a Mastodon title: "¡Bienvenido a bordo, %{name}!" users: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index db5c05322b..26dbc2dfb8 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1846,10 +1846,6 @@ es-MX: edit_profile_action: Configurar el perfil edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. explanation: Aquí hay algunos consejos para empezar - final_action: Empezar a publicar - final_step: "¡Empieza a publicar! Incluso sin seguidores, tus publicaciones públicas pueden ser vistas por otros, por ejemplo en la línea de tiempo local o en etiquetas. Tal vez quieras presentarte con la etiqueta de #introducciones." - full_handle: Su sobrenombre completo - full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia. subject: Bienvenido a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/es.yml b/config/locales/es.yml index e5ccee5ee3..7956580138 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1846,10 +1846,6 @@ es: edit_profile_action: Configurar el perfil edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. explanation: Aquí hay algunos consejos para empezar - final_action: Empezar a publicar - final_step: "¡Empieza a publicar! Incluso sin seguidores, tus publicaciones públicas pueden ser vistas por otros, por ejemplo en la línea de tiempo local o en etiquetas. Tal vez quieras presentarte con la etiqueta de #presentación." - full_handle: Su sobrenombre completo - full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia. subject: Bienvenido a Mastodon title: Te damos la bienvenida a bordo, %{name}! users: diff --git a/config/locales/et.yml b/config/locales/et.yml index c21ea0b971..ed25488ce4 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1846,10 +1846,6 @@ et: Kui mõni asi arusaamatuks jääb, siis võib vaadata juhendvideot: https://youtu.be/J4ItbTOAw7Q explanation: Siin on mõned nõuanded, mis aitavad alustada - final_action: Alusta postitamist - final_step: 'Nüüd tee oma esimene postitus. Hea tava on uues kohas ennast tutvustada ning kindlasti kasuta selles postituses ka silti #tutvustus. Isegi kui sul ei ole veel jälgijaid, siis su postitusi näevad kohalikul ajajoonel ka kõik teised serveri kasutajad.' - full_handle: Kasutajanimi Mastodon võrgustikus - full_handle_hint: Kui jagad kasutajanime väljaspool serverit, siis kasuta kindlasti pikka nime. Erinevates serverites võib olla sama kasutajanimega liikmeid. subject: Tere tulemast Mastodoni title: Tere tulemast, %{name}! users: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 6c625d08bd..fb3013e008 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1847,10 +1847,6 @@ eu: edit_profile_action: Ezarri profila edit_profile_step: Pertsonalizatu profila abatar bat igoz, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik berrikusi nahi badituzu, kontuari giltzarrapoa jarri diezaiokezu. explanation: Hona hasteko aholku batzuk - final_action: Hasi bidalketak argitaratzen - final_step: 'Hasi argitaratzen! Jarraitzailerik ez baduzu ere zure bidalketa publikoak besteek ikusi ditzakete, esaterako denbora-lerro lokalean eta traoletan. Zure burua aurkeztu nahi baduzu #aurkezpenak traola erabili zenezake.' - full_handle: Helbide osoa - full_handle_hint: Hau da lagunei esango zeniekeena beste zerbitzari batetik zu jarraitzeko edo zuri mezuak bidaltzeko. subject: Ongi etorri Mastodon-era title: Ongi etorri, %{name}! users: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index f6ff379745..4339e06c34 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1579,10 +1579,6 @@ fa: edit_profile_action: تنظیم نمایه edit_profile_step: می‌توانید نمایه‌تان را با بارگذاری تصویر نمایه، تغییر نام نمایشی و بیش از این‌‌ها سفارشی کنید. می‌توانید تعیین کنید که پی‌گیران جدید را پیش‌از این که بتوانند دنبالتان کنند بازبینی کنید. explanation: نکته‌هایی که برای آغاز کار به شما کمک می‌کنند - final_action: چیزی منتشر کنید - final_step: 'چیزی بنویسید! حتا بدون پی‌گیر ممکن است فرسته‌های عمومیتان دیده شود. برای مثال روی خط زمانی محلی یا در برچسب‌ها. شاید بخواهید با برچسب #معرفی خودتان را معرّفی کنید.' - full_handle: نام کاربری کامل شما - full_handle_hint: این چیزی است که باید به دوستانتان بگویید تا بتوانند از کارسازی دیگر به شما پیام داده یا پی‌گیرتان شوند. subject: به ماستودون خوش آمدید title: خوش آمدید، کاربر %{name}! users: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index ad6d6e9c07..dc303991bc 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1846,10 +1846,6 @@ fi: edit_profile_action: Määritä profiili edit_profile_step: Voit mukauttaa profiiliasi muun muassa profiilikuvalla ja uudella näyttönimellä. Voit myös valita, haluatko tarkastaa ja hyväksyä uudet seuraajat itse. explanation: Näillä vinkeillä pääset alkuun - final_action: Ala julkaista - final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, voivat muut nähdä julkisia julkaisujasi esimerkiksi paikallisella aikajanalla tai aihetunnisteissa. Kannattaa myös esitellä itsensä aihetunnisteella #esittely.' - full_handle: Koko käyttäjätunnuksesi - full_handle_hint: Kerro tämä kavereillesi, niin he voivat lähettää sinulle viestejä tai seurata sinua toiselta palvelimelta. subject: Tervetuloa Mastodoniin title: Tervetuloa mukaan, %{name}! users: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 555b82a79d..6a8dd9b2ee 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1846,10 +1846,6 @@ fo: edit_profile_action: Set upp vanga edit_profile_step: Tú kanst tillaga vanga tín við at leggja eina vangamynd inn, broyta vísta navnið hjá tær og meira. Tú kanst velja at eftirkanna nýggjar fylgjarar, áðrenn teir sleppa at fylgja tær. explanation: Her eru nøkur ráð so tú kann koma gott ígongd - final_action: Byrja at posta - final_step: 'Byrja at posta! Sjálvt uttan fylgjarar, so kunnu tínir almennu postar vera sæddir av øðrum, til dømis á lokalu tíðarlinjuni ella í frámerkjum. Kanska vilt tú greiða frá um teg sjálva/n við frámerkinum #introductions.' - full_handle: Fulla brúkaranavn títt - full_handle_hint: Hetta er tað, sum tú fortelur vinum tínum, soleiðis at tey kunnu senda tær boð ella fylgja tær frá einum øðrum ambætara. subject: Vælkomin til Mastodon title: Vælkomin umborð, %{name}! users: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 3676d0b7b5..97cb08c918 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1841,10 +1841,6 @@ fr-CA: edit_profile_action: Configuration du profil edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. explanation: Voici quelques conseils pour vous aider à démarrer - final_action: Commencez à publier - final_step: 'Commencez à publier ! Même si vous n''avez pas encore d''abonnés, vos publications sont publiques et sont accessibles par les autres, par exemple grâce à la zone horaire locale ou par les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.' - full_handle: Votre identifiant complet - full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir d’un autre serveur. subject: Bienvenue sur Mastodon title: Bienvenue à bord, %{name} ! users: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index a3aaf7a26e..b085937c76 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1841,10 +1841,6 @@ fr: edit_profile_action: Configuration du profil edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. explanation: Voici quelques conseils pour vous aider à démarrer - final_action: Commencez à publier - final_step: 'Commencez à publier ! Même si vous n''avez pas encore d''abonnés, vos publications sont publiques et sont accessibles par les autres, par exemple grâce à la zone horaire locale ou par les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.' - full_handle: Votre identifiant complet - full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir d’un autre serveur. subject: Bienvenue sur Mastodon title: Bienvenue à bord, %{name} ! users: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 2cbb69010d..caa88dcfe4 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1841,10 +1841,6 @@ fy: edit_profile_action: Profyl ynstelle edit_profile_step: Jo kinne jo profyl oanpasse troch in profylfoto op te laden, jo werjeftenamme oan te passen en mear. Jo kinne it hânmjittich goedkarren fan folgers ynstelle. explanation: Hjir binne inkelde tips om jo op wei te helpen - final_action: Begjin mei berjochten te pleatsen - final_step: 'Begjin berjochten te pleatsen! Sels sûnder folgers kinne jo iepenbiere berjochten troch oaren besjoen wurde, bygelyks op de lokale tiidline en ûnder hashtags. Jo kinne josels foarstelle mei it gebrûk fan de hashtag #introductions.' - full_handle: Jo folsleine Mastodon-adres - full_handle_hint: Dit jouwe jo oan jo freonen, sadat se jo berjochten stjoere kinne of (fan in oare Mastodon-server ôf) folgje kinne. subject: Wolkom op Mastodon title: Wolkom oan board %{name}! users: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index d3dab8273d..e2a43564c0 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1880,10 +1880,6 @@ gd: edit_profile_action: Suidhich a’ phròifil agad edit_profile_step: "’S urrainn dhut a’ phròifil agad a ghnàthachadh is tu a’ luchdadh suas dealbh pròifil, ag atharrachadh d’ ainm-taisbeanaidh is a bharrachd. ’S urrainn dhut lèirmheas a dhèanamh air daoine mus fhaod iad ’gad leantainn ma thogras tu." explanation: Seo gliocas no dhà gus tòiseachadh - final_action: Tòisich air postadh - final_step: 'Tòisich air postadh! Fiù ’s mur eil duine sam bith ’gad leantainn, chì cuid mhath na postaichean poblach agad, can air an loidhne-ama ionadail no le tagaichean hais. Saoil an innis thu beagan mu d’ dhèidhinn air an taga hais #fàilte?' - full_handle: D’ ainm-cleachdaiche slàn - full_handle_hint: Seo na bheir thu dha na caraidean agad ach an urrainn dhaibh teachdaireachd a chur thugad no ’gad leantainn o fhrithealaiche eile. subject: Fàilte gu Mastodon title: Fàilte air bòrd, %{name}! users: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 705f0ef4e9..8520b90ead 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1846,10 +1846,6 @@ gl: edit_profile_action: Configurar perfil edit_profile_step: Podes personalizar o teu perfil subindo unha imaxe de perfil, cambiar o nome público e moito máis. Podes elexir revisar as solicitudes de seguimento recibidas antes de permitirlles que te sigan. explanation: Aquí tes algunhas endereitas para ir aprendendo - final_action: Comeza a publicar - final_step: 'Publica! Incluso sen seguidoras, as túas mensaxes públicas serán vistas por outras persoas, por exemplo na cronoloxía local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.' - full_handle: O teu alcume completo - full_handle_hint: Compárteo coas túas amizades para que poidan seguirte ou enviarche mensaxes desde outros servidores. subject: Benvida a Mastodon title: Benvida, %{name}! users: diff --git a/config/locales/he.yml b/config/locales/he.yml index b5a98dd24d..55ab576142 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1910,10 +1910,6 @@ he: edit_profile_action: הגדרת פרופיל edit_profile_step: תוכל.י להתאים אישית את הפרופיל באמצעות העלאת יצגן (אוואטר), כותרת, שינוי כינוי ועוד. אם תרצה.י לסקור את עוקביך/ייך החדשים לפני שתרשה.י להם לעקוב אחריך/ייך. explanation: הנה כמה טיפים לעזור לך להתחיל - final_action: התחל/ילי לחצרץ - final_step: 'התחל/ילי לחצצר! אפילו ללא עוקבים ייתכן שהחצרוצים הפומביים שלך יראו ע"י אחרים, למשל בציר הזמן המקומי או בתגיות הקבצה (האשתגים). כדאי להציג את עצמך תחת התגית #introductions או #היכרות' - full_handle: שם המשתמש המלא שלך - full_handle_hint: זה מה שתאמר.י לחברייך כדי שיוכלו לשלוח לך הודעה או לעקוב אחרייך ממופע אחר. subject: ברוכים הבאים למסטודון title: ברוך/ה הבא/ה, %{name} ! users: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 456636d4c5..733d883da0 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1846,10 +1846,6 @@ hu: edit_profile_action: Készítsd el profilod edit_profile_step: Testreszabhatod a profilod egy profilkép feltöltésével, a megjelenített neved megváltoztatásával és így tovább. Bekapcsolhatod az új követőid jóváhagyását, mielőtt követhetnek. explanation: Néhány tipp a kezdeti lépésekhez - final_action: Kezdj bejegyzéseket írni - final_step: 'Kezdj tülkölni! A nyilvános bejegyzéseid még követők híján is megjelennek másoknak, például a helyi idővonalon vagy a hashtageknél. Kezdd azzal, hogy bemutatkozol a #bemutatkozas vagy az #introductions hashtag használatával.' - full_handle: Teljes felhasználóneved - full_handle_hint: Ez az, amit megadhatsz másoknak, hogy üzenhessenek neked vagy követhessenek téged más szerverekről. subject: Üdvözöl a Mastodon title: Üdv a fedélzeten, %{name}! users: diff --git a/config/locales/hy.yml b/config/locales/hy.yml index f3a6392ff0..b0d8f00864 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -875,7 +875,6 @@ hy: suspend: Հաշիւը արգելափակուած է welcome: edit_profile_action: Կարգաւորել հաշիւը - final_action: Սկսել գրել subject: Բարի գալուստ Մաստոդոն title: Բարի գալուստ նաւամատոյց, %{name} users: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index a85af012f3..52cf861b48 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -256,7 +256,6 @@ ia: disable: Disactivar 2FA user_mailer: welcome: - final_step: 'Comencia a publicar! Mesmo sin sequitores, tu messages public poterea esser reguardate per alteres, per exemplo in le chronologia local o in hashtags. Tu poterea voler introducer te con le hashtag #introductiones.' subject: Benvenite in Mastodon webauthn_credentials: delete: Deler diff --git a/config/locales/id.yml b/config/locales/id.yml index ec8cf9e031..e7f42e115b 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1560,10 +1560,6 @@ id: edit_profile_action: Siapkan profil edit_profile_step: Anda dapat mengubah profil Anda dengan mengunggah sebuah foto profil, mengubah nama tampilan Anda dan lain-lain. Anda dapat memilih untuk meninjau pengikut baru sebelum mereka diperbolehkan untuk mengikuti Anda. explanation: Beberapa tips sebelum Anda memulai - final_action: Mulai mengirim - final_step: 'Mulai mengirim! Bahkan tanpa pengikut, kiriman publik Anda dapat dilihat oleh orang lain, misalkan di linimasa lokal atau dalam tagar. Anda dapat memperkenalkan diri Anda dalam tagar #introductions.' - full_handle: Penanganan penuh Anda - full_handle_hint: Ini yang dapat Anda sampaikan kepada teman agar mereka dapat mengirim pesan atau mengikuti Anda dari server lain. subject: Selamat datang di Mastodon title: Selamat datang, %{name}! users: diff --git a/config/locales/ie.yml b/config/locales/ie.yml index 4b84d53bd5..eec8569bb2 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1846,10 +1846,6 @@ ie: edit_profile_action: Configuration de profil edit_profile_step: Tu posse personalisar tui profil por cargar un profil-image, changear tui monstrat nómine e plu. Tu posse optar tractar nov sequitores ante que ili es permisset sequer te. explanation: Vi quelc suggestiones por que tu mey comensar - final_action: Comensar postar - final_step: 'Comensa a postar! Mem sin sequitores, tui public postas posse esser videt de altres, per exemple in li local témpor-linea o in hashtags. Tu fórsan vole introducter te per li hashtag #introductions.' - full_handle: Tui plen usator-nómine - full_handle_hint: Ti-ci es ti quel tu vell dir a tui amics por que ili mey inviar missages a te o sequer te de un altri servitor. subject: Benevenit a Mastodon title: Benevenit, %{name}! users: diff --git a/config/locales/io.yml b/config/locales/io.yml index 341477852f..189f616a4e 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1799,10 +1799,6 @@ io: edit_profile_action: Facez profilo edit_profile_step: Vu povas kustumizar vua profilo per adchargar profilimajo, chanjesar vua montronomo e plue. Vu povas selektas kontrolar nova sequanti ante oli permisesas sequar vu. explanation: Subo esas guidilo por helpar vu komencar - final_action: Komencez postigar - final_step: 'Jus postigez! Mem sen sequanti, vua publika posti povas videsar da altra personi, exemplo es en lokala tempolineo e en hashtagi. Vu povas anke introduktar su en #introductions hashtagi.' - full_handle: Vua kompleta profilnomo - full_handle_hint: Co esas quon vu dicos a amiki por ke oli povas mesajigar o sequar vu de altra servilo. subject: Bonveno a Mastodon title: Bonveno, %{name}! users: diff --git a/config/locales/is.yml b/config/locales/is.yml index 56d71bd9ad..da6eee9e20 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1850,10 +1850,6 @@ is: edit_profile_action: Setja upp notandasnið edit_profile_step: Þú getur sérsniðið notandasniðið þitt með því að setja inn auðkennismynd þína, breyta birtingarnafninu þínu og ýmislegt fleira. Þú getur valið að yfirfara nýja fylgjendur áður en þú leyfir þeim að fylgjast með þér. explanation: Hér eru nokkrar ábendingar til að koma þér í gang - final_action: Byrjaðu að skrifa - final_step: 'Byrjaðu að tjá þig! Jafnvel án fylgjenda geta aðrir séð opinberar færslur frá þér, til dæmis á staðværu tímalínunni eða í myllumerkjum. Þú gætir jafnvel viljað kynna þig á myllumerkinu #introductions.' - full_handle: Fullt auðkenni þitt - full_handle_hint: Þetta er það sem þú myndir gefa upp við vini þína svo þeir geti sent þér skilaboð eða fylgst með þér af öðrum netþjóni. subject: Velkomin í Mastodon title: Velkomin/n um borð, %{name}! users: diff --git a/config/locales/it.yml b/config/locales/it.yml index a0f1ab7697..3adb4f6c65 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1848,10 +1848,6 @@ it: edit_profile_action: Configura profilo edit_profile_step: Puoi personalizzare il tuo profilo caricando un'immagine del profilo, cambiare il tuo nome e altro ancora. Puoi scegliere di esaminare i nuovi seguaci prima che loro siano autorizzati a seguirti. explanation: Ecco alcuni suggerimenti per iniziare - final_action: Inizia a pubblicare - final_step: 'Inizia a pubblicare! Anche senza seguaci, i tuoi post pubblici possono essere visti da altri, ad esempio sulla timeline locale o negli hashtag. Potresti presentarti con l''hashtag #presentazione.' - full_handle: Il tuo nome utente completo - full_handle_hint: Questo è ciò che diresti ai tuoi amici in modo che possano seguirti o contattarti da un altro server. subject: Benvenuto/a su Mastodon title: Benvenuto a bordo, %{name}! users: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 1bbda050bb..460f02d0a5 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1816,10 +1816,6 @@ ja: プロフィール画像をアップロードしたり、表示名を変更したりして、プロフィールをカスタマイズできます。 新しいフォロワーからフォローリクエストを承認する前に、オプトインで確認できます。 explanation: 始めるにあたってのアドバイスです - final_action: 始めましょう - final_step: 'さあ、始めましょう! たとえフォロワーがまだいなくても、あなたの公開した投稿はローカルタイムラインやハッシュタグなどを通じて誰かの目にとまるはずです。自己紹介をしたいときには #introductions ハッシュタグが便利かもしれません。' - full_handle: あなたの正式なユーザーID - full_handle_hint: 別のサーバーの友達とフォローやメッセージをやり取りする際には、これを伝えることになります。 subject: Mastodonへようこそ title: ようこそ、%{name}さん! users: diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 926922154f..1b3d48810e 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -472,9 +472,6 @@ ka: welcome: edit_profile_action: პროფილის მოწყობა explanation: აქ რამდენიმე რჩევაა დასაწყისისთვის - final_action: დაიწყე პოსტვა - full_handle: თქვენი სრული სახელური - full_handle_hint: ეს არის ის რასაც ეტყვით თქვენს მეგობრებს, რათა მოგწერონ ან გამოგყვნენ სხვა ინსტანციიდან. subject: კეთილი იყოს თქვენი მობრძანება მასტოდონში title: კეთილი იყოს თქვენი მობრძანება, %{name}! users: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index a24d8994fd..d424810926 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -794,8 +794,6 @@ kab: silence: Amiḍan yesɛa talast suspend: Amiḍan yettwaḥbas welcome: - final_action: Bdu asuffeɣ - full_handle: Tansa umiḍan-ik takemmalit subject: Ansuf ɣer Maṣṭudun title: Ansuf yessek·em, %{name}! users: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 27c76b4378..2cd894befb 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -721,9 +721,6 @@ kk: welcome: edit_profile_action: Профиль өңдеу explanation: Мына кеңестерді шолып өтіңіз - final_action: Жазба жазу - full_handle: Желі тұтқасы - full_handle_hint: This is what you would tell your friends so they can message or follow you frоm another server. subject: Mastodon Желісіне қош келдіңіз title: Ортаға қош келдің, %{name}! users: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 851c3c74b8..45a95139f0 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1816,10 +1816,6 @@ ko: edit_profile_action: 프로필 설정 edit_profile_step: 프로필 사진을 업로드하거나 사람들에게 표시할 이름을 바꾸는 것 등으로 자신의 프로필을 커스텀 할 수 있습니다. 새로운 팔로워를 검토 후에 허용하도록 할 수도 있습니다. explanation: 시작하기 전에 몇가지 팁들을 준비했습니다 - final_action: 포스팅 시작하기 - final_step: '게시물을 올리세요! 팔로워가 없더라도, 공개 게시물들은 다른 사람에게 보여질 수 있습니다, 예를 들자면 로컬이나 연합 타임라인 등이 있습니다. 사람들에게 자신을 소개하고 싶다면 #툿친소 해시태그를 이용해보세요.' - full_handle: 당신의 풀 핸들은 다음과 같습니다 - full_handle_hint: 이것을 당신의 친구들에게 알려주면 다른 서버에서 팔로우 하거나 메시지를 보낼 수 있습니다. subject: 마스토돈에 오신 것을 환영합니다 title: 환영합니다 %{name} 님! users: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index e78e7ecfbb..d744aaa903 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1594,10 +1594,6 @@ ku: edit_profile_action: Profîlê saz bike edit_profile_step: Tu dikarî bi barkirina wêneyek profîlê, guhertina navê xwe ya xuyangê û bêtir profîla xwe kesane bikî. Berî ku mafê bidî ku te şopînerên nû te bişopînin, tu dikarî binirxînî. explanation: Li vir çend serişte hene ku tu dest pê bike - final_action: Dest bi weşandinê bike - final_step: 'Dest bi weşandinê bike! Bêyî şopîneran jî dibe ku şandiyên te yên gelemperî ji hêla kesên din ve werin dîtin, mînakî li ser demjimêra herêmî û di hashtagan de. Dibe ku tu bixwazî xwe li ser hashtagê #nasname bidî nasandin.' - full_handle: Hemî destikê te - full_handle_hint: Ji hevalên xwe re, ji bona ji rajekarekê din peyam bişîne an jî ji bona ku te bikaribe bişopîne tişta ku tu bibêjî ev e. subject: Tu bi xêr hatî Mastodon title: Bi xêr hatî, %{name}! users: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index d75d0d44c9..13e29f927e 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1846,10 +1846,6 @@ lad: edit_profile_action: Konfigurasyon de profil edit_profile_step: Puedes personalizar tu profil kargando una foto de profil, trokando tu nombre de utilizador i muncho mas. Puedes optar por revizar a los muevos suivantes antes de ke puedan segirte. explanation: Aki ay algunos konsejos para ampesar - final_action: Ampesa a publikar - final_step: 'Ampesa a publikar! Inkluzo sin suivantes, tus publikasyones publikas pueden ser vistas por otros, por enshemplo en la linya de tiempo lokal o en etiketas. Tal vez keras aprezentarte kon la etiketa de #introduksiones.' - full_handle: Tu sovrenombre kompleto - full_handle_hint: Esto es lo ke le dirias a tus haverim para ke eyos puedan embiarte mesajes o segirte dizde otra instansya. subject: Bienvenido a Mastodon title: Bienvenido, %{name}! users: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 6ca6f3b62f..7ffce1a516 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -608,10 +608,6 @@ lt: welcome: edit_profile_action: Nustatyti profilį explanation: Štai keletas patarimų, kaip pradėti - final_action: Pradėti kelti įrašus - final_step: 'Pradėk skelbti! Net jei ir neturi sekėjų, tavo viešus įrašus gali matyti kiti, pavyzdžiui, vietinėje laiko skalėje arba saitažodžiuose. Galbūt norėsi prisistatyti saitažodyje #introductions.' - full_handle: Tavo pilnas slapyvardis - full_handle_hint: Štai ką pasakytum savo draugams, kad jie galėtų parašyti arba sekti tave iš kito serverio. subject: Sveiki atvykę į Mastodon title: Sveiki atvykę, %{name}! users: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index fcf478cf93..89bdf5f05f 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1855,10 +1855,6 @@ lv: edit_profile_action: Iestatīt profilu edit_profile_step: Tu vari pielāgot savu profilu, augšupielādējot profila attēlu, mainot parādāmo vārdu un citas lietas. Vari izvēlēties pārskatīt jaunus sekotājus, pirms atļauj viņiem tev sekot. explanation: Šeit ir daži padomi, kā sākt darbu - final_action: Sāc publicēt - final_step: 'Sāc publicēt! Pat bez sekotājiem tavas publiskās ziņas var redzēt citi, piemēram, vietējā ziņu lentā vai atsaucēs. Iespējams, tu vēlēsies iepazīstināt ar sevi, izmantojot tēmturi #introductions.' - full_handle: Tavs pilnais lietotājvārds - full_handle_hint: Šis ir tas, ko tu pasaki saviem draugiem, lai viņi varētu tev ziņot vai sekot tev no cita servera. subject: Laipni lūgts Mastodon title: Laipni lūgts uz borta, %{name}! users: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 6625a13b3b..81f1851b1e 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1772,10 +1772,6 @@ ms: edit_profile_action: Sediakan profil edit_profile_step: Anda boleh menyesuaikan profil anda dengan memuat naik gambar profil, menukar nama paparan anda dan banyak lagi. Anda boleh ikut serta untuk menyemak pengikut baharu sebelum mereka dibenarkan mengikuti anda. explanation: Berikut ialah beberapa petua untuk anda bermula - final_action: Mula menyiarkan - final_step: 'Mula menyiarkan! Walaupun tanpa pengikut, pos awam anda mungkin dilihat oleh orang lain, contohnya pada garis masa tempatan atau dalam hashtag. Anda mungkin ingin memperkenalkan diri anda pada hashtag #introductions.' - full_handle: Pemegang penuh anda - full_handle_hint: Inilah yang anda akan beritahu rakan anda supaya mereka boleh menghantar mesej atau mengikuti anda dari server lain. subject: Selamat datang kepada Mastodon title: Selamat datang, %{name}! users: diff --git a/config/locales/my.yml b/config/locales/my.yml index 094f581eb9..18f5c6a2d0 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1771,10 +1771,6 @@ my: edit_profile_action: ပရိုဖိုင်ထည့်သွင်းရန် edit_profile_step: ပရိုဖိုင်ဓာတ်ပုံတစ်ပုံ တင်ခြင်း၊ ဖော်ပြမည့်အမည် ပြောင်းလဲခြင်းနှင့် အခြားအရာများပြုလုပ်ခြင်းတို့ဖြင့် သင့်ပရိုဖိုင်ကို စိတ်ကြိုက်ပြင်ဆင်နိုင်ပါသည်။ စောင့်ကြည့်သူအသစ်များ သင့်ကိုစောင့်ကြည့်ခွင့်မပြုမီ ပြန်လည်သုံးသပ်ရန်အတွက် ဆုံးဖြတ်နိုင်ပါသည်။ explanation: ဤသည်မှာ သင် စတင်အသုံးပြုနိုင်ရန်အတွက် အကြံပြုချက်အချို့ဖြစ်ပါသည် - final_action: ပို့စ် တင်ရန် - final_step: 'ပို့စ်စပြီး တင်နိုင်ပါပြီ။ စောင့်ကြည့်သူများမရှိသေးသော်လည်း သင့်အများမြင်ပို့စ်များကို ဒေသတွင်းစာမျက်နှာ သို့မဟုတ် ဟက်ရှ်တက်စာမျက်နှာတို့တွင် အခြားသူများက မြင်နိုင်ပါသည်။ #introductions ဟက်ရှ်တက်ဖြင့် သင့်ကိုယ်သင် မိတ်ဆက်နိုင်ပါသည်။' - full_handle: ကိုယ်တိုင်ထိန်းချုပ်နိုင်သည် - full_handle_hint: ဤသည်မှာ သင့်သူငယ်ချင်းများကို အခြားဆာဗာတစ်ခုမှ မက်ဆေ့ချ်ပို့နိုင်ကြောင်း သို့မဟုတ် စောင့်ကြည့်နိုင်ကြောင်း အသိပေးပါမည်။ subject: Mastodon မှ လှိုက်လှဲစွာကြိုဆိုပါသည်။ title: "%{name} က ကြိုဆိုပါတယ်။" users: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 4392c2366e..c935e9f4aa 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1846,10 +1846,6 @@ nl: edit_profile_action: Profiel instellen edit_profile_step: Je kunt jouw profiel aanpassen door een profielfoto te uploaden, jouw weergavenaam aan te passen en meer. Je kunt het handmatig goedkeuren van volgers instellen. explanation: Hier zijn enkele tips om je op weg te helpen - final_action: Begin berichten te plaatsen - final_step: 'Begin berichten te plaatsen! Zelfs zonder volgers kunnen jouw openbare berichten door anderen bekeken worden, bijvoorbeeld op de lokale tijdlijn en onder hashtags. Je kunt jezelf voorstellen met het gebruik van de hashtag #introductions.' - full_handle: Jouw volledige Mastodon-adres - full_handle_hint: Dit geef je aan jouw vrienden, zodat ze jou berichten kunnen sturen of (vanaf een andere Mastodonserver) kunnen volgen. subject: Welkom op Mastodon title: Welkom aan boord %{name}! users: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 1524b6f7c1..aecd148e28 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1846,10 +1846,6 @@ nn: edit_profile_action: Lag til profil edit_profile_step: Du kan tilpasse profilen din ved å laste opp et profilbilde, endre visningsnavnet ditt og mer. Du kan velge at nye følgere må godkjennes av deg før de får lov til å følge deg. explanation: Her er nokre tips for å koma i gang - final_action: Kom i gang med å leggja ut - final_step: 'Skriv innlegg! Selv uten følgere kan dine offentlige innlegg bli sett av andre, for eksempel på den lokale tidslinjen og i emneknagger. Du kan introdusere deg selv ved å bruke emneknaggen #introduksjon.' - full_handle: Det fulle brukarnamnet ditt - full_handle_hint: Dette er det du fortel venene dine for at dei skal kunna senda deg meldingar eller fylgja deg frå ein annan tenar. subject: Velkomen til Mastodon title: Velkomen om bord, %{name}! users: diff --git a/config/locales/no.yml b/config/locales/no.yml index d26b20379e..481e28e863 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1841,10 +1841,6 @@ edit_profile_action: Sett opp profil edit_profile_step: Du kan tilpasse profilen din ved å laste opp et profilbilde, endre visningsnavnet ditt og mer. Du kan velge at nye følgere må godkjennes av deg før de får lov til å følge deg. explanation: Her er noen tips for å komme i gang - final_action: Start postingen - final_step: 'Skriv innlegg! Selv uten følgere kan dine offentlige innlegg bli sett av andre, for eksempel på den lokale tidslinjen og i emneknagger. Du kan introdusere deg selv ved å bruke emneknaggen #introduksjon.' - full_handle: Ditt fullstendige brukernavn - full_handle_hint: Dette er hva du forteller venner slik at de kan sende melding eller følge deg fra en annen instanse. subject: Velkommen til Mastodon title: Velkommen ombord, %{name}! users: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 2887fc98b3..b8330992c9 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -968,9 +968,6 @@ oc: welcome: edit_profile_action: Configuracion del perfil explanation: Vaquí qualques astúcias per vos preparar - final_action: Començar de publicar - full_handle: Vòstre escais-nom complèt - full_handle_hint: Es aquò que vos cal donar a vòstres amics per que pòscan vos escriure o sègre a partir d’un autre servidor. subject: Benvengut a Mastodon title: Vos desirem la benvenguda a bòrd %{name} ! users: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index f0e6a1f60b..f7c5d60f65 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1910,10 +1910,6 @@ pl: edit_profile_action: Skonfiguruj profil edit_profile_step: Możesz dostosować profil wysyłając awatar, zmieniając wyświetlaną nazwę i o wiele więcej. Jeżeli chcesz, możesz również włączyć przeglądanie i ręczne akceptowanie nowych próśb o możliwość obserwacji Twojego profilu. explanation: Kilka wskazówek, które pomogą Ci rozpocząć - final_action: Zacznij pisać - final_step: 'Zacznij tworzyć! Nawet jeżeli nikt Cię nie obserwuje, Twoje publiczne wiadomości będą widziane przez innych, na przykład na lokalnej osi czasu i w hashtagach. Możesz też utworzyć wpis wprowadzający używając hashtagu #introductions.' - full_handle: Twój pełny adres - full_handle_hint: Ten adres możesz podać znajomym, aby mogli skontaktować się z Tobą lub zacząć obserwować z innego serwera. subject: Witaj w Mastodonie title: Witaj na pokładzie, %{name}! users: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index ea91fd7dfe..86972f9ef1 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1841,10 +1841,6 @@ pt-BR: edit_profile_action: Configurar perfil edit_profile_step: Você pode personalizar seu perfil enviando uma foto de perfil, mudando seu nome de exibição e mais. Você pode optar por revisar novos seguidores antes que eles possam te seguir. explanation: Aqui estão algumas dicas para você começar - final_action: Comece a publicar - final_step: 'Comece a postar! Mesmo sem seguidores, suas postagens públicas podem ser vistas pelos outros, por exemplo, na linha do tempo local ou nas hashtags. Você pode querer fazer uma introdução usando a hashtag #introduções.' - full_handle: Seu nome de usuário completo - full_handle_hint: Isso é o que você compartilha com seus amigos para que eles possam te mandar mensagens ou te seguir a partir de outro servidor. subject: Boas-vindas ao Mastodon title: Boas vindas, %{name}! users: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 3007fd2df1..0786ba2ed4 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1846,10 +1846,6 @@ pt-PT: edit_profile_action: Configurar o perfil edit_profile_step: Pode personalizar o seu perfil carregando uma imagem de perfil, alterando o nome a exibir, entre outras opções. Pode optar por rever os novos seguidores antes de estes o poderem seguir. explanation: Aqui estão algumas dicas para começar - final_action: Começar a publicar - final_step: 'Comece a publicar! Mesmo sem seguidores, as suas mensagens públicas podem ser vistas por outros, como por exemplo na cronologia local e em etiquetas. Pense em apresentar-se usando a etiqueta #apresentações.' - full_handle: O seu nome completo - full_handle_hint: Isto é o que tem de facultar aos seus amigos para que eles lhe possam enviar mensagens ou segui-lo a partir de outra instância. subject: Bem-vindo ao Mastodon title: Bem-vindo a bordo, %{name}! users: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 1bdc4e8ca5..8e4f9e7913 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -709,9 +709,6 @@ ro: welcome: edit_profile_action: Configurare profil explanation: Iată câteva sfaturi pentru a începe - final_action: Începe să postezi - full_handle: Numele tău complet - full_handle_hint: Asta este ceea ce vei putea spune prietenilor pentru a te putea contacta sau pentru a te urmării de pe un alt server. subject: Bine ai venit title: Bine ai venit la bord, %{name}! users: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 04e49e0427..3f15b064f0 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1905,10 +1905,6 @@ ru: edit_profile_action: Настроить профиль edit_profile_step: Вы можете настроить свой профиль добавляя аватарку, изменяя отображаемое имя и так далее. Вы можете вручную подтверждать подписчиков, перед тем как им будет разрешено подписаться на вас. explanation: Вот несколько советов для новичков - final_action: Начать постить - final_step: 'Начинайте постить! Даже без подписчиков, ваши публичные посты могут быть увиденными другими, например в локальной ленте или в хештегах. Вы можете представиться с хэштегом #introductions.' - full_handle: Ваше обращение - full_handle_hint: То, что Вы хотите сообщить своим друзьям, чтобы они могли написать Вам или подписаться с другого узла. subject: Добро пожаловать в Mastodon title: Добро пожаловать на борт, %{name}! users: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 273ef9d2d9..533764606b 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -1094,9 +1094,6 @@ sc: welcome: edit_profile_action: Cunfigura su profilu explanation: Inoghe ddoe at una paja de impòsitos pro cumintzare - final_action: Cumintza a publicare - full_handle: Su nòmine utente intreu tuo - full_handle_hint: Custu est su chi dias nàrrere a is amistades tuas pro chi ti potzant imbiare messàgios o sighire dae un'àteru serbidore. subject: Ti donamus su benebènnidu a Mastodon title: Ti donamus su benebènnidu, %{name}! users: diff --git a/config/locales/sco.yml b/config/locales/sco.yml index a1071197f1..dc273d2d83 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1584,10 +1584,6 @@ sco: edit_profile_action: Setup profile edit_profile_step: Ye kin customize yer profile bi uploadin a profile picture, chyngin yer display nemm an mair. Ye kin opt-in fir tae luik ower new follaers afore they’re allooed tae follae ye. explanation: Here some tips fir tae get ye stertit - final_action: Stert postin - final_step: 'Stert postin! Even athout follaers, yer public posts kin stull be seen bi ithers, fir example on the local timeline or in hashtags. Ye mibbie want tae introduce yersel on the #introductions hashtag.' - full_handle: Yer ful haunnle - full_handle_hint: This is whit ye wad tell yer pals sae thit they kin message or follae ye fae anither server. subject: Welcome tae Mastodon, 'mon in title: Welcome aboord, %{name}! users: diff --git a/config/locales/si.yml b/config/locales/si.yml index 660fd3ba31..ac292d6cf8 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1436,9 +1436,6 @@ si: welcome: edit_profile_action: පැතිකඩ පිහිටුවන්න explanation: ඔබ ආරම්භ කිරීමට උපදෙස් කිහිපයක් මෙන්න - final_action: ලිපි පළ කරන්න - full_handle: ඔබේ සම්පූර්ණ හසුරුව - full_handle_hint: මෙය ඔබ ඔබේ මිතුරන්ට පවසනු ඇත, එවිට ඔවුන්ට වෙනත් සේවාදායකයකින් ඔබට පණිවිඩ යැවීමට හෝ අනුගමනය කිරීමට හැකිය. subject: මාස්ටඩන් වෙත පිළිගනිමු title: නැවට සාදරයෙන් පිළිගනිමු, %{name}! users: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 66022b10ae..d97cfac0ea 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1290,9 +1290,6 @@ sk: welcome: edit_profile_action: Nastav profil explanation: Tu nájdeš nejaké tipy do začiatku - final_action: Začni prispievať - full_handle: Adresa tvojho profilu v celom formáte - full_handle_hint: Toto je čo musíš dať vedieť svojím priateľom aby ti mohli posielať správy, alebo ťa následovať z iného serveru. subject: Vitaj na Mastodone title: Vitaj na palube, %{name}! users: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 915970f805..c9b2343b69 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1910,10 +1910,6 @@ sl: edit_profile_action: Nastavitve profila edit_profile_step: Profil lahko prilagodite tako, da naložite sliko profila, spremenite pojavno ime in drugo. Lahko izberete, da želite pregledati nove sledilce, preden jim dovolite sledenje. explanation: Tu je nekaj nasvetov za začetek - final_action: Začnite objavljati - final_step: 'Začnite objavljati! Tudi brez sledilcev bodo vaše javne objave videli drugi, npr. na krajevni časovnici ali v ključnikih. Morda se želite predstaviti s ključnikom #introductions.' - full_handle: Vaša polna ročica - full_handle_hint: To bi povedali svojim prijateljem, da vam lahko pošljejo sporočila ali vam sledijo iz drugega strežnika. subject: Dobrodošli na Mastodon title: Dobrodošli, %{name}! users: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 3ad76e2429..4293271bb2 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1842,10 +1842,6 @@ sq: edit_profile_action: Ujdisje profili edit_profile_step: Profilin tuaj mund ta përshtatni duke ngarkuar një figurë, duke ndryshuar emrin tuaj në ekran, etj. Mund të zgjidhni të shqyrtoni ndjekës të rinj, para se të jenë lejuar t’ju ndjekin. explanation: Ja disa ndihmëza, sa për t’ia filluar - final_action: Filloni të postoni - final_step: 'Filloni të postoni! Edhe pa ndjekës, postimet tuaja publike mund të shihen nga të tjerët, për shembull, në rrjedhën kohore vendore, ose në hashtag-ë. Mund të doni të prezantoni veten përmes hashtag-ut #introductions.' - full_handle: Identifikuesi juaj i plotë - full_handle_hint: Kjo është ajo çka do të duhej t’u tregonit shokëve tuaj, që të mund t’ju dërgojnë mesazhe ose t’ju ndjekin nga një shërbyes tjetër. subject: Mirë se vini te Mastodon-i title: Mirë se vini, %{name}! users: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index b55b6e0d19..a1f6df067f 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1873,10 +1873,6 @@ sr-Latn: edit_profile_action: Podesi nalog edit_profile_step: Možete prilagoditi svoj profil tako što ćete postaviti profilnu sliku, promeniti ime za prikaz i tako dalje. Možete dati saglasnost da pregledate nove pratioce pre nego što im dozvolite da Vas zaprate. explanation: Evo nekoliko saveta za početak - final_action: Počnite objavljivati - final_step: 'Počnite da objavljujete! Čak i bez pratilaca, Vaše javne objave su vidljive drugim ljudima, na primer na lokalnoj vremenskoj liniji ili u heš oznakama. Možda želite da se predstavite sa heš oznakom #introductions ili #predstavljanja.' - full_handle: Vaš pun nadimak - full_handle_hint: Ovo biste rekli svojim prijateljima kako bi vam oni poslali poruku, ili zapratili sa druge instance. subject: Dobro došli na Mastodon title: Dobro došli, %{name}! users: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 9e67e9692d..494b41a754 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1873,10 +1873,6 @@ sr: edit_profile_action: Подеси налог edit_profile_step: Можете прилагодити свој профил тако што ћете поставити профилну слику, променити име за приказ и тако даље. Можете дати сагласност да прегледате нове пратиоце пре него што им дозволите да Вас запрате. explanation: Ево неколико савета за почетак - final_action: Почните објављивати - final_step: 'Почните да објављујете! Чак и без пратилаца, Ваше јавне објаве су видљиве другим људима, на пример на локалној временској линији или у хеш ознакама. Можда желите да се представите са хеш ознаком #introductions или #представљања.' - full_handle: Ваш пун надимак - full_handle_hint: Ово бисте рекли својим пријатељима како би вам они послали поруку, или запратили са друге инстанце. subject: Добро дошли на Mastodon title: Добро дошли, %{name}! users: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index deac7cc638..d0f3994b4e 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1837,10 +1837,6 @@ sv: edit_profile_action: Profilinställning edit_profile_step: Du kan anpassa din profil genom att ladda upp en profilbild, ändra ditt visningsnamn med mera. Du kan välja att granska nya följare innan de får följa dig. explanation: Här är några tips för att komma igång - final_action: Börja göra inlägg - final_step: 'Börja skriv inlägg! Även utan följare kan dina offentliga inlägg ses av andra, exempelvis på den lokala tidslinjen eller i hashtaggar. Du kanske vill introducera dig själv under hashtaggen #introduktion eller #introductions.' - full_handle: Ditt fullständiga användarnamn/mastodonadress - full_handle_hint: Det här är vad du skulle berätta för dina vänner så att de kan meddela eller följa dig från en annan instans. subject: Välkommen till Mastodon title: Välkommen ombord, %{name}! users: diff --git a/config/locales/th.yml b/config/locales/th.yml index e117c29b4a..5253dd6b78 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1814,10 +1814,6 @@ th: edit_profile_action: ตั้งค่าโปรไฟล์ edit_profile_step: คุณสามารถปรับแต่งโปรไฟล์ของคุณได้โดยอัปโหลดรูปภาพโปรไฟล์ เปลี่ยนชื่อที่แสดงของคุณ และอื่น ๆ คุณสามารถเลือกรับการตรวจทานผู้ติดตามใหม่ก่อนที่จะอนุญาตให้เขาติดตามคุณ explanation: นี่คือเคล็ดลับบางส่วนที่จะช่วยให้คุณเริ่มต้นใช้งาน - final_action: เริ่มโพสต์ - final_step: 'เริ่มโพสต์! แม้ว่าไม่มีผู้ติดตาม โพสต์สาธารณะของคุณอาจเห็นโดยผู้อื่น ตัวอย่างเช่น ในเส้นเวลาในเซิร์ฟเวอร์หรือในแฮชแท็ก คุณอาจต้องการแนะนำตัวเองในแฮชแท็ก #introductions' - full_handle: นามเต็มของคุณ - full_handle_hint: นี่คือสิ่งที่คุณจะบอกเพื่อน ๆ ของคุณเพื่อให้เขาสามารถส่งข้อความหรือติดตามคุณจากเซิร์ฟเวอร์อื่น subject: ยินดีต้อนรับสู่ Mastodon title: ยินดีต้อนรับ %{name}! users: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 4ba9d42758..7dbec9abbd 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1846,10 +1846,6 @@ tr: edit_profile_action: Profil kurulumu edit_profile_step: Bir profil resmi yükleyerek, ekran adınızı değiştirerek ve daha fazlasını yaparak profilinizi kişiselleştirebilirsiniz. Sizi takip etmelerine izin verilmeden önce yeni takipçileri incelemeyi tercih edebilirsiniz. explanation: İşte sana başlangıç için birkaç ipucu - final_action: Gönderi yazmaya başlayın - final_step: 'Gönderi yazmaya başlayın! Takipçiler olmadan bile, herkese açık gönderileriniz başkaları tarafından görülebilir, örneğin yerel zaman tünelinde veya etiketlerde. Kendinizi #introductions etiketinde tanıtmak isteyebilirsiniz.' - full_handle: Tanıtıcınız - full_handle_hint: Arkadaşlarınıza, size başka bir sunucudan mesaj atabilmeleri veya sizi takip edebilmeleri için söyleyeceğiniz şey budur. subject: Mastodon'a hoş geldiniz title: Gemiye hoşgeldin, %{name}! users: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 4d4097d658..7273a0ff2b 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1910,10 +1910,6 @@ uk: edit_profile_action: Налаштувати профіль edit_profile_step: Ви можете налаштувати свій профіль, завантаживши зображення профілю, змінивши відображуване ім'я та інше. Ви можете включити для перегляду нових підписників до того, як вони матимуть змогу підписатися на вас. explanation: Ось кілька порад для початку - final_action: Почати писати - final_step: 'Почніть дописувати! Навіть не підписавшись на вас, інші зможуть побачити ваші дописи, наприклад, у локальній стрічці та у хештеґах. Якщо ви хочете представитися, можете скористатися хештеґом #introductions.' - full_handle: Ваше звернення - full_handle_hint: Те, що ви хочете сказати друзям, щоб вони могли написати вам або підписатися з інших сайтів. subject: Ласкаво просимо до Mastodon title: Ласкаво просимо, %{name}! users: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 99434c3544..e362c97a41 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1812,10 +1812,6 @@ vi: edit_profile_action: Cài đặt trang hồ sơ edit_profile_step: Bạn có thể chỉnh sửa trang hồ sơ của mình bằng cách tải lên ảnh đại diện, ảnh bìa, đổi biệt danh và hơn thế nữa. Bạn cũng có thể tự phê duyệt những người theo dõi mới. explanation: Dưới đây là một số mẹo để giúp bạn bắt đầu - final_action: Soạn tút mới - final_step: 'Viết tút mới! Ngay cả khi chưa có người theo dõi, người khác vẫn có thể xem tút công khai của bạn trên bảng tin máy chủ và qua hashtag. Hãy giới thiệu bản thân với hashtag #introductions.' - full_handle: Tên đầy đủ của bạn - full_handle_hint: Đây cũng là địa chỉ được dùng để giao tiếp với tất cả mọi người. subject: Chào mừng đến với Mastodon title: Xin chào %{name}! users: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index cf56a2d227..46a0e40152 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1814,10 +1814,6 @@ zh-CN: edit_profile_action: 设置个人资料 edit_profile_step: 您可以通过上传个人资料图片、更改您的昵称等来自定义您的个人资料。 您可以选择在新关注者关注您之前对其进行审核。 explanation: 下面是几个小贴士,希望它们能帮到你 - final_action: 开始嘟嘟 - final_step: '开始发布嘟文! 即使没有关注者,您的公开嘟文也可能会被其他人看到,例如在本地时间轴或话题标签中。 您可能想在 #introductions 话题标签上介绍自己。' - full_handle: 你的完整用户地址 - full_handle_hint: 你需要把这个告诉你的朋友们,这样他们就能从另一台服务器向你发送信息或者关注你。 subject: 欢迎来到 Mastodon title: "%{name},欢迎你的加入!" users: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index b010a75c04..e666e4965d 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1809,10 +1809,6 @@ zh-HK: edit_profile_action: 設定個人資料 edit_profile_step: 你可以透過上傳頭像、更改顯示名稱等來自訂個人檔案。你可以選擇讓新使用者追蹤你之前先審查他們。 explanation: 下面是幾個小貼士,希望它們能幫到你 - final_action: 開始發文 - final_step: '開始發文吧!即使你沒有追蹤者,其他人仍然能在本站時間軸或標籤等地方,看到你的公開帖文。試着用 #introductions 標籤來介紹自己吧。' - full_handle: 你的完整 Mastodon 地址 - full_handle_hint: 這訊息將顯示給你朋友們,讓他們能從另一個服務站發信息給你,或者關注你的。 subject: 歡迎來到 Mastodon (萬象) title: 歡迎 %{name} 加入! users: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index bc8454884c..3cd3583830 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1816,10 +1816,6 @@ zh-TW: edit_profile_action: 設定個人檔案 edit_profile_step: 您可以設定您的個人檔案,包括上傳大頭貼、變更顯示名稱等等。您也可以選擇於新的跟隨者跟隨前,先對他們進行審核。 explanation: 以下是幾個小技巧,希望它們能幫到您 - final_action: 開始嘟嘟 - final_step: '開始嘟嘟吧!即使您現在沒有跟隨者,其他人仍然能於本站時間軸、主題標籤等地方,看到您的公開嘟文。試著用 #introductions 這個主題標籤介紹一下自己吧。' - full_handle: 您的完整帳號名稱 - full_handle_hint: 您需要將這告訴您的朋友們,這樣他們就能從另一個伺服器向您發送訊息或跟隨您。 subject: 歡迎來到 Mastodon title: "%{name} 誠摯歡迎您的加入!" users: diff --git a/spec/models/ip_block_spec.rb b/spec/models/ip_block_spec.rb index ed58826672..290b99b288 100644 --- a/spec/models/ip_block_spec.rb +++ b/spec/models/ip_block_spec.rb @@ -3,7 +3,32 @@ require 'rails_helper' describe IpBlock do - describe 'to_log_human_identifier' do + describe 'validations' do + it 'validates ip presence', :aggregate_failures do + ip_block = described_class.new(ip: nil, severity: :no_access) + + expect(ip_block).to_not be_valid + expect(ip_block).to model_have_error_on_field(:ip) + end + + it 'validates severity presence', :aggregate_failures do + ip_block = described_class.new(ip: '127.0.0.1', severity: nil) + + expect(ip_block).to_not be_valid + expect(ip_block).to model_have_error_on_field(:severity) + end + + it 'validates ip uniqueness', :aggregate_failures do + described_class.create!(ip: '127.0.0.1', severity: :no_access) + + ip_block = described_class.new(ip: '127.0.0.1', severity: :no_access) + + expect(ip_block).to_not be_valid + expect(ip_block).to model_have_error_on_field(:ip) + end + end + + describe '#to_log_human_identifier' do let(:ip_block) { described_class.new(ip: '192.168.0.1') } it 'combines the IP and prefix into a string' do @@ -12,4 +37,30 @@ describe IpBlock do expect(result).to eq('192.168.0.1/32') end end + + describe '.blocked?' do + context 'when the IP is blocked' do + it 'returns true' do + described_class.create!(ip: '127.0.0.1', severity: :no_access) + + expect(described_class.blocked?('127.0.0.1')).to be true + end + end + + context 'when the IP is not blocked' do + it 'returns false' do + expect(described_class.blocked?('127.0.0.1')).to be false + end + end + end + + describe 'after_commit' do + it 'resets the cache' do + allow(Rails.cache).to receive(:delete) + + described_class.create!(ip: '127.0.0.1', severity: :no_access) + + expect(Rails.cache).to have_received(:delete).with(described_class::CACHE_KEY) + end + end end diff --git a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb b/spec/requests/api/v1/accounts/statuses_spec.rb similarity index 71% rename from spec/controllers/api/v1/accounts/statuses_controller_spec.rb rename to spec/requests/api/v1/accounts/statuses_spec.rb index 102e3b8e91..371867b215 100644 --- a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb +++ b/spec/requests/api/v1/accounts/statuses_spec.rb @@ -2,20 +2,16 @@ require 'rails_helper' -describe Api::V1::Accounts::StatusesController do - render_views +describe 'API V1 Accounts Statuses' do + let(:user) { Fabricate(:user) } + let(:scopes) { 'read:statuses' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses') } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/accounts/:account_id/statuses' do it 'returns expected headers', :aggregate_failures do Fabricate(:status, account: user.account) - get :index, params: { account_id: user.account.id, limit: 1 } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { limit: 1 }, headers: headers expect(response).to have_http_status(200) expect(links_from_header.size) @@ -24,7 +20,7 @@ describe Api::V1::Accounts::StatusesController do context 'with only media' do it 'returns http success' do - get :index, params: { account_id: user.account.id, only_media: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { only_media: true }, headers: headers expect(response).to have_http_status(200) end @@ -36,7 +32,7 @@ describe Api::V1::Accounts::StatusesController do before do Fabricate(:status, account: user.account, thread: Fabricate(:status)) # Reply to another user - get :index, params: { account_id: user.account.id, exclude_replies: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { exclude_replies: true }, headers: headers end it 'returns posts along with self replies', :aggregate_failures do @@ -57,7 +53,7 @@ describe Api::V1::Accounts::StatusesController do end it 'returns http success and includes a header link' do - get :index, params: { account_id: user.account.id, pinned: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { pinned: true }, headers: headers expect(response).to have_http_status(200) expect(links_from_header.size) @@ -79,7 +75,7 @@ describe Api::V1::Accounts::StatusesController do end it 'returns http success and header pagination links to prev and next' do - get :index, params: { account_id: user.account.id, pinned: true } + get "/api/v1/accounts/#{user.account.id}/statuses", params: { pinned: true }, headers: headers expect(response).to have_http_status(200) expect(links_from_header.size) @@ -109,15 +105,19 @@ describe Api::V1::Accounts::StatusesController do end it 'returns http success' do - get :index, params: { account_id: account.id, pinned: true } + get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers + expect(response).to have_http_status(200) end context 'when user does not follow account' do it 'lists the public status only' do - get :index, params: { account_id: account.id, pinned: true } - json = body_as_json - expect(json.map { |item| item[:id].to_i }).to eq [status.id] + get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers + + expect(body_as_json) + .to contain_exactly( + a_hash_including(id: status.id.to_s) + ) end end @@ -127,9 +127,13 @@ describe Api::V1::Accounts::StatusesController do end it 'lists both the public and the private statuses' do - get :index, params: { account_id: account.id, pinned: true } - json = body_as_json - expect(json.map { |item| item[:id].to_i }).to contain_exactly(status.id, private_status.id) + get "/api/v1/accounts/#{account.id}/statuses", params: { pinned: true }, headers: headers + + expect(body_as_json) + .to contain_exactly( + a_hash_including(id: status.id.to_s), + a_hash_including(id: private_status.id.to_s) + ) end end end diff --git a/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb b/spec/requests/api/v1/admin/trends/statuses_spec.rb similarity index 63% rename from spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb rename to spec/requests/api/v1/admin/trends/statuses_spec.rb index 4d80055ac0..04aa0465f2 100644 --- a/spec/controllers/api/v1/admin/trends/statuses_controller_spec.rb +++ b/spec/requests/api/v1/admin/trends/statuses_spec.rb @@ -2,31 +2,26 @@ require 'rails_helper' -describe Api::V1::Admin::Trends::StatusesController do - render_views - +describe 'API V1 Admin Trends Statuses' do let(:role) { UserRole.find_by(name: 'Admin') } let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:account) { Fabricate(:account) } let(:status) { Fabricate(:status) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/admin/trends/statuses' do it 'returns http success' do - get :index, params: { account_id: account.id, limit: 2 } + get '/api/v1/admin/trends/statuses', params: { account_id: account.id, limit: 2 }, headers: headers expect(response).to have_http_status(200) end end - describe 'POST #approve' do + describe 'POST /api/v1/admin/trends/statuses/:id/approve' do before do - post :approve, params: { id: status.id } + post "/api/v1/admin/trends/statuses/#{status.id}/approve", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' @@ -37,9 +32,9 @@ describe Api::V1::Admin::Trends::StatusesController do end end - describe 'POST #reject' do + describe 'POST /api/v1/admin/trends/statuses/:id/unapprove' do before do - post :reject, params: { id: status.id } + post "/api/v1/admin/trends/statuses/#{status.id}/reject", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' diff --git a/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb b/spec/requests/api/v1/admin/trends/tags_spec.rb similarity index 64% rename from spec/controllers/api/v1/admin/trends/tags_controller_spec.rb rename to spec/requests/api/v1/admin/trends/tags_spec.rb index 0b8eb8c3b8..b1437dad8d 100644 --- a/spec/controllers/api/v1/admin/trends/tags_controller_spec.rb +++ b/spec/requests/api/v1/admin/trends/tags_spec.rb @@ -2,31 +2,26 @@ require 'rails_helper' -describe Api::V1::Admin::Trends::TagsController do - render_views - +describe 'API V1 Admin Trends Tags' do let(:role) { UserRole.find_by(name: 'Admin') } let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } let(:account) { Fabricate(:account) } let(:tag) { Fabricate(:tag) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/admin/trends/tags' do it 'returns http success' do - get :index, params: { account_id: account.id, limit: 2 } + get '/api/v1/admin/trends/tags', params: { account_id: account.id, limit: 2 }, headers: headers expect(response).to have_http_status(200) end end - describe 'POST #approve' do + describe 'POST /api/v1/admin/trends/tags/:id/approve' do before do - post :approve, params: { id: tag.id } + post "/api/v1/admin/trends/tags/#{tag.id}/approve", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' @@ -37,9 +32,9 @@ describe Api::V1::Admin::Trends::TagsController do end end - describe 'POST #reject' do + describe 'POST /api/v1/admin/trends/tags/:id/reject' do before do - post :reject, params: { id: tag.id } + post "/api/v1/admin/trends/tags/#{tag.id}/reject", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' diff --git a/spec/controllers/api/v1/announcements/reactions_controller_spec.rb b/spec/requests/api/v1/announcements/reactions_spec.rb similarity index 64% rename from spec/controllers/api/v1/announcements/reactions_controller_spec.rb rename to spec/requests/api/v1/announcements/reactions_spec.rb index c1debc33fe..ffacb2b0af 100644 --- a/spec/controllers/api/v1/announcements/reactions_controller_spec.rb +++ b/spec/requests/api/v1/announcements/reactions_spec.rb @@ -2,27 +2,26 @@ require 'rails_helper' -RSpec.describe Api::V1::Announcements::ReactionsController do - render_views - +RSpec.describe 'API V1 Announcements Reactions' do let(:user) { Fabricate(:user) } let(:scopes) { 'write:favourites' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let!(:announcement) { Fabricate(:announcement) } - describe 'PUT #update' do + describe 'PUT /api/v1/announcements/:announcement_id/reactions/:id' do context 'without token' do it 'returns http unauthorized' do - put :update, params: { announcement_id: announcement.id, id: '😂' } + put "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}" + expect(response).to have_http_status 401 end end context 'with token' do before do - allow(controller).to receive(:doorkeeper_token) { token } - put :update, params: { announcement_id: announcement.id, id: '😂' } + put "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}", headers: headers end it 'creates reaction', :aggregate_failures do @@ -32,22 +31,21 @@ RSpec.describe Api::V1::Announcements::ReactionsController do end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v1/announcements/:announcement_id/reactions/:id' do before do announcement.announcement_reactions.create!(account: user.account, name: '😂') end context 'without token' do it 'returns http unauthorized' do - delete :destroy, params: { announcement_id: announcement.id, id: '😂' } + delete "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}" expect(response).to have_http_status 401 end end context 'with token' do before do - allow(controller).to receive(:doorkeeper_token) { token } - delete :destroy, params: { announcement_id: announcement.id, id: '😂' } + delete "/api/v1/announcements/#{announcement.id}/reactions/#{escaped_emoji}", headers: headers end it 'creates reaction', :aggregate_failures do @@ -56,4 +54,8 @@ RSpec.describe Api::V1::Announcements::ReactionsController do end end end + + def escaped_emoji + CGI.escape('😂') + end end diff --git a/spec/controllers/api/v1/announcements_controller_spec.rb b/spec/requests/api/v1/announcements_spec.rb similarity index 59% rename from spec/controllers/api/v1/announcements_controller_spec.rb rename to spec/requests/api/v1/announcements_spec.rb index 95ce8fd9fc..1624b76012 100644 --- a/spec/controllers/api/v1/announcements_controller_spec.rb +++ b/spec/requests/api/v1/announcements_spec.rb @@ -2,27 +2,26 @@ require 'rails_helper' -RSpec.describe Api::V1::AnnouncementsController do - render_views - - let(:user) { Fabricate(:user) } - let(:scopes) { 'read' } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } +RSpec.describe 'API V1 Announcements' do + let(:user) { Fabricate(:user) } + let(:scopes) { 'read' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let!(:announcement) { Fabricate(:announcement) } - describe 'GET #index' do + describe 'GET /api/v1/announcements' do context 'without token' do it 'returns http unprocessable entity' do - get :index + get '/api/v1/announcements' + expect(response).to have_http_status 422 end end context 'with token' do before do - allow(controller).to receive(:doorkeeper_token) { token } - get :index + get '/api/v1/announcements', headers: headers end it 'returns http success' do @@ -31,10 +30,11 @@ RSpec.describe Api::V1::AnnouncementsController do end end - describe 'POST #dismiss' do + describe 'POST /api/v1/announcements/:id/dismiss' do context 'without token' do it 'returns http unauthorized' do - post :dismiss, params: { id: announcement.id } + post "/api/v1/announcements/#{announcement.id}/dismiss" + expect(response).to have_http_status 401 end end @@ -43,8 +43,7 @@ RSpec.describe Api::V1::AnnouncementsController do let(:scopes) { 'write:accounts' } before do - allow(controller).to receive(:doorkeeper_token) { token } - post :dismiss, params: { id: announcement.id } + post "/api/v1/announcements/#{announcement.id}/dismiss", headers: headers end it 'dismisses announcement', :aggregate_failures do diff --git a/spec/controllers/api/v1/conversations_controller_spec.rb b/spec/requests/api/v1/conversations_spec.rb similarity index 50% rename from spec/controllers/api/v1/conversations_controller_spec.rb rename to spec/requests/api/v1/conversations_spec.rb index 2734e4a07b..e2327d9a93 100644 --- a/spec/controllers/api/v1/conversations_controller_spec.rb +++ b/spec/requests/api/v1/conversations_spec.rb @@ -2,53 +2,48 @@ require 'rails_helper' -RSpec.describe Api::V1::ConversationsController do - render_views - +RSpec.describe 'API V1 Conversations' do let!(:user) { Fabricate(:user, account_attributes: { username: 'alice' }) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:statuses' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + let(:other) { Fabricate(:user) } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index', :sidekiq_inline do - let(:scopes) { 'read:statuses' } - + describe 'GET /api/v1/conversations', :sidekiq_inline do before do PostStatusService.new.call(other.account, text: 'Hey @alice', visibility: 'direct') PostStatusService.new.call(user.account, text: 'Hey, nobody here', visibility: 'direct') end it 'returns pagination headers', :aggregate_failures do - get :index, params: { limit: 1 } + get '/api/v1/conversations', params: { limit: 1 }, headers: headers expect(response).to have_http_status(200) expect(response.headers['Link'].links.size).to eq(2) end it 'returns conversations', :aggregate_failures do - get :index - json = body_as_json - expect(json.size).to eq 2 - expect(json[0][:accounts].size).to eq 1 + get '/api/v1/conversations', headers: headers + + expect(body_as_json.size).to eq 2 + expect(body_as_json[0][:accounts].size).to eq 1 end context 'with since_id' do context 'when requesting old posts' do it 'returns conversations' do - get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) } - json = body_as_json - expect(json.size).to eq 2 + get '/api/v1/conversations', params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) }, headers: headers + + expect(body_as_json.size).to eq 2 end end context 'when requesting posts in the future' do it 'returns no conversation' do - get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.from_now, with_random: false) } - json = body_as_json - expect(json.size).to eq 0 + get '/api/v1/conversations', params: { since_id: Mastodon::Snowflake.id_at(1.hour.from_now, with_random: false) }, headers: headers + + expect(body_as_json.size).to eq 0 end end end diff --git a/spec/controllers/api/v1/filters_controller_spec.rb b/spec/requests/api/v1/filters_spec.rb similarity index 75% rename from spec/controllers/api/v1/filters_controller_spec.rb rename to spec/requests/api/v1/filters_spec.rb index b0f64ccf41..deb6e74217 100644 --- a/spec/controllers/api/v1/filters_controller_spec.rb +++ b/spec/requests/api/v1/filters_spec.rb @@ -2,23 +2,18 @@ require 'rails_helper' -RSpec.describe Api::V1::FiltersController do - render_views +RSpec.describe 'API V1 Filters' do + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - let(:user) { Fabricate(:user) } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } - - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/filters' do let(:scopes) { 'read:filters' } let!(:filter) { Fabricate(:custom_filter, account: user.account) } let!(:custom_filter_keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } it 'returns http success' do - get :index + get '/api/v1/filters', headers: headers expect(response).to have_http_status(200) expect(body_as_json) .to contain_exactly( @@ -27,13 +22,13 @@ RSpec.describe Api::V1::FiltersController do end end - describe 'POST #create' do + describe 'POST /api/v1/filters' do let(:scopes) { 'write:filters' } let(:irreversible) { true } let(:whole_word) { false } before do - post :create, params: { phrase: 'magic', context: %w(home), irreversible: irreversible, whole_word: whole_word } + post '/api/v1/filters', params: { phrase: 'magic', context: %w(home), irreversible: irreversible, whole_word: whole_word }, headers: headers end it 'creates a filter', :aggregate_failures do @@ -64,24 +59,25 @@ RSpec.describe Api::V1::FiltersController do end end - describe 'GET #show' do + describe 'GET /api/v1/filters/:id' do let(:scopes) { 'read:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } it 'returns http success' do - get :show, params: { id: keyword.id } + get "/api/v1/filters/#{keyword.id}", headers: headers + expect(response).to have_http_status(200) end end - describe 'PUT #update' do + describe 'PUT /api/v1/filters/:id' do let(:scopes) { 'write:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - put :update, params: { id: keyword.id, phrase: 'updated' } + put "/api/v1/filters/#{keyword.id}", headers: headers, params: { phrase: 'updated' } end it 'updates the filter', :aggregate_failures do @@ -90,13 +86,13 @@ RSpec.describe Api::V1::FiltersController do end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v1/filters/:id' do let(:scopes) { 'write:filters' } let(:filter) { Fabricate(:custom_filter, account: user.account) } let(:keyword) { Fabricate(:custom_filter_keyword, custom_filter: filter) } before do - delete :destroy, params: { id: keyword.id } + delete "/api/v1/filters/#{keyword.id}", headers: headers end it 'removes the filter', :aggregate_failures do diff --git a/spec/controllers/api/v1/polls/votes_controller_spec.rb b/spec/requests/api/v1/polls/votes_spec.rb similarity index 61% rename from spec/controllers/api/v1/polls/votes_controller_spec.rb rename to spec/requests/api/v1/polls/votes_spec.rb index 5de225a487..e2b22708be 100644 --- a/spec/controllers/api/v1/polls/votes_controller_spec.rb +++ b/spec/requests/api/v1/polls/votes_spec.rb @@ -2,30 +2,32 @@ require 'rails_helper' -RSpec.describe Api::V1::Polls::VotesController do - render_views - +RSpec.describe 'API V1 Polls Votes' do let(:user) { Fabricate(:user) } let(:scopes) { 'write:statuses' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before { allow(controller).to receive(:doorkeeper_token) { token } } - - describe 'POST #create' do + describe 'POST /api/v1/polls/:poll_id/votes' do let(:poll) { Fabricate(:poll) } before do - post :create, params: { poll_id: poll.id, choices: %w(1) } + post "/api/v1/polls/#{poll.id}/votes", params: { choices: %w(1) }, headers: headers end it 'creates a vote', :aggregate_failures do expect(response).to have_http_status(200) - vote = poll.votes.where(account: user.account).first expect(vote).to_not be_nil expect(vote.choice).to eq 1 expect(poll.reload.cached_tallies).to eq [0, 1] end + + private + + def vote + poll.votes.where(account: user.account).first + end end end diff --git a/spec/controllers/api/v1/push/subscriptions_controller_spec.rb b/spec/requests/api/v1/push/subscriptions_spec.rb similarity index 67% rename from spec/controllers/api/v1/push/subscriptions_controller_spec.rb rename to spec/requests/api/v1/push/subscriptions_spec.rb index 1681914680..d699fd1e08 100644 --- a/spec/controllers/api/v1/push/subscriptions_controller_spec.rb +++ b/spec/requests/api/v1/push/subscriptions_spec.rb @@ -2,9 +2,7 @@ require 'rails_helper' -describe Api::V1::Push::SubscriptionsController do - render_views - +describe 'API V1 Push Subscriptions' do let(:user) { Fabricate(:user) } let(:create_payload) do { @@ -34,15 +32,13 @@ describe Api::V1::Push::SubscriptionsController do }, }.with_indifferent_access end - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'push') } + let(:scopes) { 'push' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'POST #create' do + describe 'POST /api/v1/push/subscription' do before do - post :create, params: create_payload + post '/api/v1/push/subscription', params: create_payload, headers: headers end it 'saves push subscriptions' do @@ -56,19 +52,23 @@ describe Api::V1::Push::SubscriptionsController do end it 'replaces old subscription on repeat calls' do - post :create, params: create_payload + post '/api/v1/push/subscription', params: create_payload, headers: headers + expect(Web::PushSubscription.where(endpoint: create_payload[:subscription][:endpoint]).count).to eq 1 end it 'returns the expected JSON' do - expect(body_as_json.with_indifferent_access).to include({ endpoint: create_payload[:subscription][:endpoint], alerts: {}, policy: 'all' }) + expect(body_as_json.with_indifferent_access) + .to include( + { endpoint: create_payload[:subscription][:endpoint], alerts: {}, policy: 'all' } + ) end end - describe 'PUT #update' do + describe 'PUT /api/v1/push/subscription' do before do - post :create, params: create_payload - put :update, params: alerts_payload + post '/api/v1/push/subscription', params: create_payload, headers: headers + put '/api/v1/push/subscription', params: alerts_payload, headers: headers end it 'changes alert settings' do @@ -82,14 +82,17 @@ describe Api::V1::Push::SubscriptionsController do end it 'returns the expected JSON' do - expect(body_as_json.with_indifferent_access).to include({ endpoint: create_payload[:subscription][:endpoint], alerts: alerts_payload[:data][:alerts], policy: alerts_payload[:data][:policy] }) + expect(body_as_json.with_indifferent_access) + .to include( + { endpoint: create_payload[:subscription][:endpoint], alerts: alerts_payload[:data][:alerts], policy: alerts_payload[:data][:policy] } + ) end end - describe 'DELETE #destroy' do + describe 'DELETE /api/v1/push/subscription' do before do - post :create, params: create_payload - delete :destroy + post '/api/v1/push/subscription', params: create_payload, headers: headers + delete '/api/v1/push/subscription', headers: headers end it 'removes the subscription' do diff --git a/spec/controllers/api/v1/streaming_controller_spec.rb b/spec/requests/api/v1/streaming_spec.rb similarity index 51% rename from spec/controllers/api/v1/streaming_controller_spec.rb rename to spec/requests/api/v1/streaming_spec.rb index 099f68a74e..6b550dfa60 100644 --- a/spec/controllers/api/v1/streaming_controller_spec.rb +++ b/spec/requests/api/v1/streaming_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' -describe Api::V1::StreamingController do +describe 'API V1 Streaming' do around do |example| before = Rails.configuration.x.streaming_api_base_url Rails.configuration.x.streaming_api_base_url = "wss://#{Rails.configuration.x.web_domain}" @@ -10,14 +10,13 @@ describe Api::V1::StreamingController do Rails.configuration.x.streaming_api_base_url = before end - before do - request.headers.merge! Host: Rails.configuration.x.web_domain - end + let(:headers) { { 'Host' => Rails.configuration.x.web_domain } } context 'with streaming api on same host' do - describe 'GET #index' do + describe 'GET /api/v1/streaming' do it 'raises ActiveRecord::RecordNotFound' do - get :index + get '/api/v1/streaming', headers: headers + expect(response).to have_http_status(404) end end @@ -28,20 +27,33 @@ describe Api::V1::StreamingController do Rails.configuration.x.streaming_api_base_url = "wss://streaming-#{Rails.configuration.x.web_domain}" end - describe 'GET #index' do + describe 'GET /api/v1/streaming' do it 'redirects to streaming host' do - get :index, params: { access_token: 'deadbeef', stream: 'public' } - expect(response).to have_http_status(301) - request_uri = URI.parse(request.url) - redirect_to_uri = URI.parse(response.location) - [:scheme, :path, :query, :fragment].each do |part| - expect(redirect_to_uri.send(part)).to eq(request_uri.send(part)), "redirect target #{part}" - end - expect(redirect_to_uri.host).to eq(streaming_host), 'redirect target host' + get '/api/v1/streaming', headers: headers, params: { access_token: 'deadbeef', stream: 'public' } + + expect(response) + .to have_http_status(301) + + expect(redirect_to_uri) + .to have_attributes( + fragment: request_uri.fragment, + host: eq(streaming_host), + path: request_uri.path, + query: request_uri.query, + scheme: request_uri.scheme + ) end private + def request_uri + URI.parse(request.url) + end + + def redirect_to_uri + URI.parse(response.location) + end + def streaming_host URI.parse(Rails.configuration.x.streaming_api_base_url).host end