From d799921c75e7bfb83504bb79dcc1c269c91d168c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 18 Jan 2018 19:17:25 +0100 Subject: [PATCH 01/18] Replace tutorial modal with welcome e-mail (#6273) * Remove onboarding modal * Welcome e-mail * Send welcome e-mail after confirmation * Remove obsolete translations --- app/javascript/images/icon_done.svg | 4 + app/javascript/mastodon/actions/onboarding.js | 14 - .../mastodon/containers/mastodon.js | 3 - .../features/ui/components/modal_root.js | 2 - .../ui/components/onboarding_modal.js | 318 ------------------ .../features/ui/util/async-components.js | 4 - app/javascript/styles/mailer.scss | 44 +++ .../styles/mastodon/components.scss | 254 -------------- app/mailers/user_mailer.rb | 11 + app/models/user.rb | 1 + app/views/layouts/mailer.text.erb | 2 +- app/views/user_mailer/welcome.html.haml | 146 ++++++++ app/views/user_mailer/welcome.text.erb | 30 ++ config/locales/ar.yml | 1 - config/locales/bg.yml | 1 - config/locales/ca.yml | 1 - config/locales/de.yml | 1 - config/locales/en.yml | 20 +- config/locales/eo.yml | 1 - config/locales/es.yml | 1 - config/locales/fa.yml | 1 - config/locales/fi.yml | 1 - config/locales/fr.yml | 1 - config/locales/gl.yml | 1 - config/locales/he.yml | 1 - config/locales/hr.yml | 1 - config/locales/hu.yml | 2 - config/locales/id.yml | 1 - config/locales/io.yml | 1 - config/locales/it.yml | 1 - config/locales/ja.yml | 1 - config/locales/ko.yml | 1 - config/locales/nl.yml | 1 - config/locales/no.yml | 1 - config/locales/oc.yml | 1 - config/locales/pl.yml | 1 - config/locales/pt-BR.yml | 1 - config/locales/pt.yml | 1 - config/locales/ru.yml | 1 - config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 1 - config/locales/sv.yml | 1 - config/locales/th.yml | 1 - config/locales/tr.yml | 1 - config/locales/uk.yml | 1 - config/locales/zh-CN.yml | 1 - config/locales/zh-HK.yml | 1 - config/locales/zh-TW.yml | 1 - spec/mailers/previews/user_mailer_preview.rb | 5 + 49 files changed, 261 insertions(+), 632 deletions(-) create mode 100644 app/javascript/images/icon_done.svg delete mode 100644 app/javascript/mastodon/actions/onboarding.js delete mode 100644 app/javascript/mastodon/features/ui/components/onboarding_modal.js create mode 100644 app/views/user_mailer/welcome.html.haml create mode 100644 app/views/user_mailer/welcome.text.erb diff --git a/app/javascript/images/icon_done.svg b/app/javascript/images/icon_done.svg new file mode 100644 index 000000000..446af14d9 --- /dev/null +++ b/app/javascript/images/icon_done.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/javascript/mastodon/actions/onboarding.js b/app/javascript/mastodon/actions/onboarding.js deleted file mode 100644 index a161c50ef..000000000 --- a/app/javascript/mastodon/actions/onboarding.js +++ /dev/null @@ -1,14 +0,0 @@ -import { openModal } from './modal'; -import { changeSetting, saveSettings } from './settings'; - -export function showOnboardingOnce() { - return (dispatch, getState) => { - const alreadySeen = getState().getIn(['settings', 'onboarded']); - - if (!alreadySeen) { - dispatch(openModal('ONBOARDING')); - dispatch(changeSetting(['onboarded'], true)); - dispatch(saveSettings()); - } - }; -}; diff --git a/app/javascript/mastodon/containers/mastodon.js b/app/javascript/mastodon/containers/mastodon.js index d1710445b..8ae3b727a 100644 --- a/app/javascript/mastodon/containers/mastodon.js +++ b/app/javascript/mastodon/containers/mastodon.js @@ -2,7 +2,6 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; import configureStore from '../store/configureStore'; -import { showOnboardingOnce } from '../actions/onboarding'; import { BrowserRouter, Route } from 'react-router-dom'; import { ScrollContext } from 'react-router-scroll-4'; import UI from '../features/ui'; @@ -40,8 +39,6 @@ export default class Mastodon extends React.PureComponent { const handlerUrl = window.location.protocol + '//' + window.location.host + '/intent?uri=%s'; window.setTimeout(() => navigator.registerProtocolHandler('web+mastodon', handlerUrl, 'Mastodon'), 5 * 60 * 1000); } - - store.dispatch(showOnboardingOnce()); } componentWillUnmount () { diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js index 5839ba40a..dbfb46ee7 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.js +++ b/app/javascript/mastodon/features/ui/components/modal_root.js @@ -9,7 +9,6 @@ import VideoModal from './video_modal'; import BoostModal from './boost_modal'; import ConfirmationModal from './confirmation_modal'; import { - OnboardingModal, MuteModal, ReportModal, EmbedModal, @@ -18,7 +17,6 @@ import { const MODAL_COMPONENTS = { 'MEDIA': () => Promise.resolve({ default: MediaModal }), - 'ONBOARDING': OnboardingModal, 'VIDEO': () => Promise.resolve({ default: VideoModal }), 'BOOST': () => Promise.resolve({ default: BoostModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), diff --git a/app/javascript/mastodon/features/ui/components/onboarding_modal.js b/app/javascript/mastodon/features/ui/components/onboarding_modal.js deleted file mode 100644 index 54673e223..000000000 --- a/app/javascript/mastodon/features/ui/components/onboarding_modal.js +++ /dev/null @@ -1,318 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import ReactSwipeableViews from 'react-swipeable-views'; -import classNames from 'classnames'; -import Permalink from '../../../components/permalink'; -import ComposeForm from '../../compose/components/compose_form'; -import Search from '../../compose/components/search'; -import NavigationBar from '../../compose/components/navigation_bar'; -import ColumnHeader from './column_header'; -import { List as ImmutableList } from 'immutable'; -import { me } from '../../../initial_state'; - -const noop = () => { }; - -const messages = defineMessages({ - home_title: { id: 'column.home', defaultMessage: 'Home' }, - notifications_title: { id: 'column.notifications', defaultMessage: 'Notifications' }, - local_title: { id: 'column.community', defaultMessage: 'Local timeline' }, - federated_title: { id: 'column.public', defaultMessage: 'Federated timeline' }, -}); - -const PageOne = ({ acct, domain }) => ( -
-
-
-
- -
-

-

-

@{acct}@{domain} }} />

-
-
-); - -PageOne.propTypes = { - acct: PropTypes.string.isRequired, - domain: PropTypes.string.isRequired, -}; - -const PageTwo = ({ myAccount }) => ( -
-
-
- -
- -
- -

-
-); - -PageTwo.propTypes = { - myAccount: ImmutablePropTypes.map.isRequired, -}; - -const PageThree = ({ myAccount }) => ( -
-
- - -
- -
-
- -

#illustration, introductions: #introductions }} />

-

-
-); - -PageThree.propTypes = { - myAccount: ImmutablePropTypes.map.isRequired, -}; - -const PageFour = ({ domain, intl }) => ( -
-
-
-
-
-

-
- -
-
-

-
-
- -
-
-
-
- -
-
-
-
- -

-
-
-); - -PageFour.propTypes = { - domain: PropTypes.string.isRequired, - intl: PropTypes.object.isRequired, -}; - -const PageSix = ({ admin, domain }) => { - let adminSection = ''; - - if (admin) { - adminSection = ( -

- @{admin.get('acct')} }} /> -
- }} /> -

- ); - } - - return ( -
-

- {adminSection} -

GitHub }} />

-

}} />

-

-
- ); -}; - -PageSix.propTypes = { - admin: ImmutablePropTypes.map, - domain: PropTypes.string.isRequired, -}; - -const mapStateToProps = state => ({ - myAccount: state.getIn(['accounts', me]), - admin: state.getIn(['accounts', state.getIn(['meta', 'admin'])]), - domain: state.getIn(['meta', 'domain']), -}); - -@connect(mapStateToProps) -@injectIntl -export default class OnboardingModal extends React.PureComponent { - - static propTypes = { - onClose: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - myAccount: ImmutablePropTypes.map.isRequired, - domain: PropTypes.string.isRequired, - admin: ImmutablePropTypes.map, - }; - - state = { - currentIndex: 0, - }; - - componentWillMount() { - const { myAccount, admin, domain, intl } = this.props; - this.pages = [ - , - , - , - , - , - ]; - }; - - componentDidMount() { - window.addEventListener('keyup', this.handleKeyUp); - } - - componentWillUnmount() { - window.addEventListener('keyup', this.handleKeyUp); - } - - handleSkip = (e) => { - e.preventDefault(); - this.props.onClose(); - } - - handleDot = (e) => { - const i = Number(e.currentTarget.getAttribute('data-index')); - e.preventDefault(); - this.setState({ currentIndex: i }); - } - - handlePrev = () => { - this.setState(({ currentIndex }) => ({ - currentIndex: Math.max(0, currentIndex - 1), - })); - } - - handleNext = () => { - const { pages } = this; - this.setState(({ currentIndex }) => ({ - currentIndex: Math.min(currentIndex + 1, pages.length - 1), - })); - } - - handleSwipe = (index) => { - this.setState({ currentIndex: index }); - } - - handleKeyUp = ({ key }) => { - switch (key) { - case 'ArrowLeft': - this.handlePrev(); - break; - case 'ArrowRight': - this.handleNext(); - break; - } - } - - handleClose = () => { - this.props.onClose(); - } - - render () { - const { pages } = this; - const { currentIndex } = this.state; - const hasMore = currentIndex < pages.length - 1; - - const nextOrDoneBtn = hasMore ? ( - - ) : ( - - ); - - return ( -
- - {pages.map((page, i) => { - const className = classNames('onboarding-modal__page__wrapper', { - 'onboarding-modal__page__wrapper--active': i === currentIndex, - }); - return ( -
{page}
- ); - })} -
- -
-
- -
- -
- {pages.map((_, i) => { - const className = classNames('onboarding-modal__dot', { - active: i === currentIndex, - }); - return ( -
- ); - })} -
- -
- {nextOrDoneBtn} -
-
-
- ); - } - -} diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index d6586680b..a03c4cefd 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -94,10 +94,6 @@ export function Mutes () { return import(/* webpackChunkName: "features/mutes" */'../../mutes'); } -export function OnboardingModal () { - return import(/* webpackChunkName: "modals/onboarding_modal" */'../components/onboarding_modal'); -} - export function MuteModal () { return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal'); } diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss index e6422b2ea..b3bcc9209 100644 --- a/app/javascript/styles/mailer.scss +++ b/app/javascript/styles/mailer.scss @@ -228,6 +228,13 @@ h3 { line-height: 25px; } +h5 { + font-size: 16px; + line-height: 21px; + font-weight: 700; + color: lighten($ui-base-color, 34%); +} + .input { td { background: darken($ui-base-color, 8%); @@ -356,6 +363,19 @@ h3 { font-weight: 500 !important; } } + + &.button-small { + td { + border-radius: 4px; + font-size: 14px; + padding: 8px 16px; + + a { + padding: 5px 16px !important; + line-height: 26px !important; + } + } + } } .button-default { @@ -379,6 +399,14 @@ h3 { padding-right: 16px; } +.padded-bottom { + padding-bottom: 32px; +} + +.margin-bottom { + margin-bottom: 20px; +} + .hero-icon { width: 64px; @@ -463,6 +491,22 @@ h3 { border-top: 1px solid lighten($ui-base-color, 8%); } +ul { + padding-left: 15px; + margin-top: 0; + margin-bottom: 0; + padding-top: 16px; + + li { + margin-bottom: 16px; + color: lighten($ui-base-color, 26%); + + span { + color: $ui-primary-color; + } + } +} + @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: landscape) { body { min-height: 1024px !important; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 6fbecee7c..63ee06d8e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3303,7 +3303,6 @@ z-index: 100; } -.onboarding-modal, .error-modal, .embed-modal { background: $ui-secondary-color; @@ -3314,26 +3313,6 @@ flex-direction: column; } -.onboarding-modal__pager { - height: 80vh; - width: 80vw; - max-width: 520px; - max-height: 420px; - - .react-swipeable-view-container > div { - width: 100%; - height: 100%; - box-sizing: border-box; - padding: 25px; - display: none; - flex-direction: column; - align-items: center; - justify-content: center; - display: flex; - user-select: text; - } -} - .error-modal__body { height: 80vh; width: 80vw; @@ -3367,23 +3346,6 @@ text-align: center; } -@media screen and (max-width: 550px) { - .onboarding-modal { - width: 100%; - height: 100%; - border-radius: 0; - } - - .onboarding-modal__pager { - width: 100%; - height: auto; - max-width: none; - max-height: none; - flex: 1 1 auto; - } -} - -.onboarding-modal__paginator, .error-modal__footer { flex: 0 0 auto; background: darken($ui-secondary-color, 8%); @@ -3394,7 +3356,6 @@ min-width: 33px; } - .onboarding-modal__nav, .error-modal__nav { color: darken($ui-secondary-color, 34%); background-color: transparent; @@ -3410,11 +3371,6 @@ &:active { color: darken($ui-secondary-color, 38%); } - - &.onboarding-modal__done, - &.onboarding-modal__next { - color: $ui-highlight-color; - } } } @@ -3422,216 +3378,6 @@ justify-content: center; } -.onboarding-modal__dots { - flex: 1 1 auto; - display: flex; - align-items: center; - justify-content: center; -} - -.onboarding-modal__dot { - width: 14px; - height: 14px; - border-radius: 14px; - background: darken($ui-secondary-color, 16%); - margin: 0 3px; - cursor: pointer; - - &:hover { - background: darken($ui-secondary-color, 18%); - } - - &.active { - cursor: default; - background: darken($ui-secondary-color, 24%); - } -} - -.onboarding-modal__page__wrapper { - pointer-events: none; - - &.onboarding-modal__page__wrapper--active { - pointer-events: auto; - } -} - -.onboarding-modal__page { - cursor: default; - line-height: 21px; - - h1 { - font-size: 18px; - font-weight: 500; - color: $ui-base-color; - margin-bottom: 20px; - } - - a { - color: $ui-highlight-color; - - &:hover, - &:focus, - &:active { - color: lighten($ui-highlight-color, 4%); - } - } - - p { - font-size: 16px; - color: lighten($ui-base-color, 8%); - margin-top: 10px; - margin-bottom: 10px; - - &:last-child { - margin-bottom: 0; - } - - strong { - font-weight: 500; - background: $ui-base-color; - color: $ui-secondary-color; - border-radius: 4px; - font-size: 14px; - padding: 3px 6px; - - @each $lang in $cjk-langs { - &:lang(#{$lang}) { - font-weight: 700; - } - } - } - } -} - -.onboarding-modal__page-one { - display: flex; - align-items: center; -} - -.onboarding-modal__page-one__elephant-friend { - background: url('../images/elephant-friend-1.png') no-repeat center center / contain; - width: 155px; - height: 193px; - margin-right: 15px; -} - -@media screen and (max-width: 400px) { - .onboarding-modal__page-one { - flex-direction: column; - align-items: normal; - } - - .onboarding-modal__page-one__elephant-friend { - width: 100%; - height: 30vh; - max-height: 160px; - margin-bottom: 5vh; - } -} - -.onboarding-modal__page-two, -.onboarding-modal__page-three, -.onboarding-modal__page-four, -.onboarding-modal__page-five { - p { - text-align: left; - } - - .figure { - background: darken($ui-base-color, 8%); - color: $ui-secondary-color; - margin-bottom: 20px; - border-radius: 4px; - padding: 10px; - text-align: center; - font-size: 14px; - box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3); - - .onboarding-modal__image { - border-radius: 4px; - margin-bottom: 10px; - } - - &.non-interactive { - pointer-events: none; - text-align: left; - } - } -} - -.onboarding-modal__page-four__columns { - .row { - display: flex; - margin-bottom: 20px; - - & > div { - flex: 1 1 0; - margin: 0 10px; - - &:first-child { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } - - p { - text-align: center; - } - } - - &:last-child { - margin-bottom: 0; - } - } - - .column-header { - color: $primary-text-color; - } -} - -@media screen and (max-width: 320px) and (max-height: 600px) { - .onboarding-modal__page p { - font-size: 14px; - line-height: 20px; - } - - .onboarding-modal__page-two .figure, - .onboarding-modal__page-three .figure, - .onboarding-modal__page-four .figure, - .onboarding-modal__page-five .figure { - font-size: 12px; - margin-bottom: 10px; - } - - .onboarding-modal__page-four__columns .row { - margin-bottom: 10px; - } - - .onboarding-modal__page-four__columns .column-header { - padding: 5px; - font-size: 12px; - } -} - -.onboarding-modal__image { - border-radius: 8px; - width: 70vw; - max-width: 450px; - max-height: auto; - display: block; - margin: auto; - margin-bottom: 20px; -} - -.onboard-sliders { - display: inline-block; - max-width: 30px; - max-height: auto; - margin-left: 10px; -} - .boost-modal, .confirmation-modal, .report-modal, diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index a7efa73c1..4104f6cd2 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -54,4 +54,15 @@ class UserMailer < Devise::Mailer mail to: @resource.email, subject: I18n.t('devise.mailer.email_changed.subject') end end + + def welcome(user) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('user_mailer.welcome.subject') + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index 892a07bba..8cad3221b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -223,5 +223,6 @@ class User < ApplicationRecord def update_statistics! BootstrapTimelineWorker.perform_async(account_id) ActivityTracker.increment('activity:accounts:local') + UserMailer.welcome(self).deliver_later end end diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb index cdb284de8..87b0b2929 100644 --- a/app/views/layouts/mailer.text.erb +++ b/app/views/layouts/mailer.text.erb @@ -1,5 +1,5 @@ <%= yield %> --- -<%= t('application_mailer.signature', instance: site_hostname) %> +<%= t 'about.hosted_on', domain: site_hostname %> <%= t('application_mailer.settings', link: settings_preferences_url) %> diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml new file mode 100644 index 000000000..0823efa1a --- /dev/null +++ b/app/views/user_mailer/welcome.html.haml @@ -0,0 +1,146 @@ +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.hero + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.text-center.padded + %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td + = image_tag full_pack_url('icon_done.svg'), alt: '' + + %h1= t 'user_mailer.welcome.title', name: @resource.account.username + %p.lead= t 'user_mailer.welcome.explanation' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell + .email-row + .col-3 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.input-cell.text-center.padded-bottom + %h5= t 'user_mailer.welcome.full_handle' + %table.input{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td= "@#{@resource.account.username}@#{@instance}" + .col-3 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.content-start + %p= t 'user_mailer.welcome.full_handle_hint', instance: @instance + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.content-start.border-top + .email-row + .col-4 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.padded + = t 'user_mailer.welcome.edit_profile_step' + .col-2 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell + %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to settings_profile_url do + %span= t 'user_mailer.welcome.edit_profile_action' + %tr + %td.content-cell + .email-row + .col-4 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.padded + = t 'user_mailer.welcome.review_preferences_step' + .col-2 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell + %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to settings_preferences_url do + %span= t 'user_mailer.welcome.review_preferences_action' + %tr + %td.content-cell.padded-bottom + .email-row + .col-4 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.padded + = t 'user_mailer.welcome.final_step' + .col-2 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell + %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to web_url do + %span= t 'user_mailer.welcome.final_action' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.border-top + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.padded + %h5= t 'user_mailer.welcome.tips' + %ul + %li + %span= t 'user_mailer.welcome.tip_mobile_webapp' + %li + %span= t 'user_mailer.welcome.tip_bridge_html', bridge_url: 'https://bridge.joinmastodon.org' + %li + %span= t 'user_mailer.welcome.tip_following' + %li + %span= t 'user_mailer.welcome.tip_local_timeline', instance: @instance + %li + %span= t 'user_mailer.welcome.tip_federated_timeline' diff --git a/app/views/user_mailer/welcome.text.erb b/app/views/user_mailer/welcome.text.erb new file mode 100644 index 000000000..5bd0cab2a --- /dev/null +++ b/app/views/user_mailer/welcome.text.erb @@ -0,0 +1,30 @@ +<%= t 'user_mailer.welcome.title', name: @resource.account.username %> <%= t 'user_mailer.welcome.explanation' %> + +=== + +<%= t 'user_mailer.welcome.full_handle' %> (<%= "@#{@resource.account.username}@#{@instance}" %>) +<%= t 'user_mailer.welcome.full_handle_hint', instance: @instance %> + +--- + +<%= t 'user_mailer.welcome.edit_profile_step' %> + +=> <%= settings_profile_url %> + +<%= t 'user_mailer.welcome.review_preferences_step' %> + +=> <%= settings_preferences_url %> + +<%= t 'user_mailer.welcome.final_step' %> + +=> <%= web_url %> + +--- + +<%= t 'user_mailer.welcome.tips' %> + +* <%= t 'user_mailer.welcome.tip_mobile_webapp' %> +* <%= strip_tags(t('user_mailer.welcome.tip_bridge_html')) %> (https://bridge.joinmastodon.org) +* <%= t 'user_mailer.welcome.tip_following' %> +* <%= t 'user_mailer.welcome.tip_local_timeline', instance: @instance %> +* <%= t 'user_mailer.welcome.tip_federated_timeline' %> diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 82e8e998a..eadeaef3e 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -140,7 +140,6 @@ ar: application_mailer: salutation: "%{name}،" settings: 'تغيير تفضيلات البريد الإلكتروني : %{link}' - signature: إشعارات ماستدون من %{instance} view: 'View:' applications: created: تم إنشاء التطبيق بنجاح diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 13d0394a3..56a904895 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -26,7 +26,6 @@ bg: unfollow: Не следвай application_mailer: settings: 'Промяна на предпочитанията за e-mail: %{link}' - signature: Mastodon известия от %{instance} view: 'Преглед:' applications: invalid_url: Предоставеният URL е невалиден diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 57e07cbd8..47b9ba995 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -340,7 +340,6 @@ ca: application_mailer: salutation: "%{name}," settings: 'Canvia les preferències de correu: %{link}' - signature: Notificacions de Mastodon des de %{instance} view: 'Vista:' applications: created: L'aplicació s'ha creat correctament diff --git a/config/locales/de.yml b/config/locales/de.yml index 39867e373..7d0cf6349 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -321,7 +321,6 @@ de: application_mailer: salutation: "%{name}," settings: 'E-Mail-Einstellungen ändern: %{link}' - signature: Mastodon-Benachrichtigungen von %{instance} view: 'Ansehen:' applications: created: Anwendung erstellt diff --git a/config/locales/en.yml b/config/locales/en.yml index f23f35a89..cd6138ff2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -341,7 +341,6 @@ en: notification_preferences: Change e-mail preferences salutation: "%{name}," settings: 'Change e-mail preferences: %{link}' - signature: Mastodon notifications from %{instance} view: 'View:' view_profile: View Profile view_status: View status @@ -725,6 +724,25 @@ en: recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe. For example, you may print them and store them with other important documents. setup: Set up wrong_code: The entered code was invalid! Are server time and device time correct? + user_mailer: + welcome: + edit_profile_action: Setup profile + edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account. + explanation: Here are some tips to get you started + final_action: Start posting + final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.' + 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 instance. + review_preferences_action: Change preferences + review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay. + subject: Welcome to Mastodon + tip_bridge_html: If you are coming from Twitter, you can find your friends on Mastodon by using the bridge app. It only works if they also used the bridge app though! + tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete. + tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines. + tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours! + tip_mobile_webapp: If your mobile browser offers you to add Mastodon to your homescreen, you can receive push notifications. It acts like a native app in many ways! + tips: Tips + title: Welcome aboard, %{name}! users: invalid_email: The e-mail address is invalid invalid_otp_token: Invalid two-factor code diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 847299ac7..bc259957d 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -237,7 +237,6 @@ eo: subject: Nova raporto por %{instance} (#%{id}) application_mailer: settings: 'Ŝanĝi la retpoŝt-mesaĝajn preferojn: %{link}' - signature: Sciigoj de Mastodon el %{instance} view: 'Vidi:' applications: created: Aplikaĵo sukcesa kreis diff --git a/config/locales/es.yml b/config/locales/es.yml index 18b93b08e..2b4b3c19a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -332,7 +332,6 @@ es: application_mailer: salutation: "%{name}," settings: 'Cambiar preferencias de correo: %{link}' - signature: Notificaciones de Mastodon desde %{instance} view: 'Vista:' applications: created: Aplicación creada exitosamente diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 94d4e7594..c498c592c 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -334,7 +334,6 @@ fa: application_mailer: salutation: "%{name}،" settings: 'تغییر تنظیمات ایمیل: %{link}' - signature: اعلان‌های ماستدون از %{instance} view: 'نمایش:' applications: created: برنامه با موفقیت ساخته شد diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 2da8427b8..f2ee28ba0 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -25,7 +25,6 @@ fi: unfollow: Lopeta seuraaminen application_mailer: settings: 'Muokkaa sähköpostiasetuksia: %{link}' - signature: Mastodon-ilmoituksia palvelimelta %{instance} view: 'Katso:' applications: invalid_url: Annettu URL on väärä diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 33a307d74..c7afd5f4b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -334,7 +334,6 @@ fr: application_mailer: salutation: "%{name}," settings: 'Changer les préférences courriel : %{link}' - signature: Notifications de Mastodon depuis %{instance} view: 'Voir :' applications: created: Application créée avec succès diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 55f717249..100e2954c 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -340,7 +340,6 @@ gl: application_mailer: salutation: "%{name}," settings: 'Mudar as preferencias de e-mail: %{link}' - signature: Notificacións Mastodon de %{instance} view: 'Vista:' applications: created: Creouse con éxito este aplicativo diff --git a/config/locales/he.yml b/config/locales/he.yml index 4b977ce1b..1f27dda7a 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -229,7 +229,6 @@ he: title: ניהול application_mailer: settings: 'שינוי הגדרות דוא"ל: %{link}' - signature: התראות מסטודון מקהילת %{instance} view: 'תצוגה:' applications: invalid_url: כתובת הקישורית אינה חוקית diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 581912420..a3c9aa436 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -26,7 +26,6 @@ hr: unfollow: Prestani slijediti application_mailer: settings: 'Promijeni e-mail postavke: %{link}' - signature: Mastodon notifikacije sa %{instance} view: 'Vidi:' applications: invalid_url: Uneseni link nije valjan diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 77551223f..586503a35 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -12,8 +12,6 @@ hu: people_who_follow: "%{name} követői" posts: Bejegyzések unfollow: Követés abbahagyása - application_mailer: - signature: "%{instance} Mastodon értesítései" auth: change_password: Jelszó változtatása didnt_get_confirmation: Nem kaptad meg a megerősítési lépéseket? diff --git a/config/locales/id.yml b/config/locales/id.yml index f3a6649d1..6e4d60fd8 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -151,7 +151,6 @@ id: title: Administrasi application_mailer: settings: 'Ubah pilihan email: %{link}' - signature: Notifikasi Mastodon dari %{instance} view: 'Tampilan:' applications: invalid_url: URL tidak sesuai diff --git a/config/locales/io.yml b/config/locales/io.yml index 4114e5231..db8214768 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -149,7 +149,6 @@ io: title: Administration application_mailer: settings: 'Chanjar la retpost-mesajala preferi: %{link}' - signature: Savigi di Mastodon de %{instance} view: 'Vidar:' applications: invalid_url: La URL donita ne esas valida diff --git a/config/locales/it.yml b/config/locales/it.yml index ec0209bc1..6ab57d2fc 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -26,7 +26,6 @@ it: unfollow: Non seguire più application_mailer: settings: 'Cambia le impostazioni per le e-mail: %{link}' - signature: Notifiche Mastodon da %{instance} view: 'Guarda:' applications: invalid_url: L'URL fornito non è valido diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 75c133292..4ff089f6e 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -341,7 +341,6 @@ ja: notification_preferences: メール設定の変更 salutation: "%{name} さん" settings: 'メール設定の変更: %{link}' - signature: Mastodon %{instance} インスタンスからの通知 view: 'リンク:' view_profile: プロフィールを表示 view_status: トゥートを表示 diff --git a/config/locales/ko.yml b/config/locales/ko.yml index b0bac4c1d..901d6202e 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -340,7 +340,6 @@ ko: application_mailer: notification_preferences: 메일 설정 변경 settings: '메일 설정을 변경: %{link}' - signature: Mastodon %{instance} 인스턴스로에서 알림 view: 'View:' view_profile: 프로필 보기 view_status: 게시물 보기 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 4c2829f98..cac9a10ec 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -340,7 +340,6 @@ nl: application_mailer: salutation: "%{name}," settings: 'E-mailvoorkeuren wijzigen: %{link}' - signature: Mastodon-meldingen van %{instance} view: 'Bekijk:' applications: created: Aanmaken toepassing geslaagd diff --git a/config/locales/no.yml b/config/locales/no.yml index 57f8547fc..3b212932e 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -163,7 +163,6 @@ title: Administrasjon application_mailer: settings: 'Endre foretrukne e-postinnstillinger: %{link}' - signature: Mastodon-notiser fra %{instance} view: 'Se:' applications: invalid_url: Den oppgitte URLen er ugyldig diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 40387de70..beb5d1f87 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -340,7 +340,6 @@ oc: application_mailer: salutation: "%{name}," settings: 'Cambiar las preferéncias de corrièl : %{link}' - signature: Notificacion de Mastodon sus %{instance} view: 'Veire :' applications: created: Aplicacion ben creada diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 5d77e0fda..24ae94209 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -342,7 +342,6 @@ pl: notification_preferences: Zmień ustawienia e-maili salutation: "%{name}," settings: 'Zmień ustawienia powiadamiania: %{link}' - signature: Powiadomienie Mastodona z instancji %{instance} view: 'Zobacz:' view_status: Wyświetl wpis applications: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index fc4db6758..6b6fcd97c 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -340,7 +340,6 @@ pt-BR: application_mailer: salutation: "%{name}," settings: 'Mudar e-mail de preferência: %{link}' - signature: Notificações do Mastodon de %{instance} view: 'Visualizar:' applications: created: Aplicação criada com sucesso diff --git a/config/locales/pt.yml b/config/locales/pt.yml index c0056af4f..618373b91 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -328,7 +328,6 @@ pt: application_mailer: salutation: "%{name}," settings: 'Alterar preferências de email: %{link}' - signature: notificações Mastodon do %{instance} view: 'Ver:' applications: created: Aplicação criada com sucesso diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 6e63aadda..842fd7d54 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -342,7 +342,6 @@ ru: notification_preferences: Изменить настройки e-mail salutation: "%{name}," settings: 'Изменить настройки e-mail: %{link}' - signature: Уведомления Mastodon от %{instance} view: 'Просмотр:' view_status: Просмотреть статус applications: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 964a82d64..ac80e81ec 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -336,7 +336,6 @@ sr-Latn: application_mailer: salutation: "%{name}," settings: 'Promeni podešavanja e-pošte: %{link}' - signature: Mastodont obaveštenje sa instance %{instance} view: 'Pogledaj:' applications: created: Aplikacija uspešno napravljena diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 57ccf2008..755396828 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -336,7 +336,6 @@ sr: application_mailer: salutation: "%{name}," settings: 'Промени подешавања е-поште: %{link}' - signature: Мастодонт обавештење са инстанце %{instance} view: 'Погледај:' applications: created: Апликација успешно направљена diff --git a/config/locales/sv.yml b/config/locales/sv.yml index ebb6d6595..b6595cb0d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -272,7 +272,6 @@ sv: application_mailer: salutation: "%{name}," settings: 'Change e-mail preferences: %{link}' - signature: Mastodon meddelande från %{instance} view: 'Granska:' applications: created: Ansökan är framgångsrikt skapad diff --git a/config/locales/th.yml b/config/locales/th.yml index 2db3aee8a..737b3aa95 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -153,7 +153,6 @@ th: title: แอดมิน application_mailer: settings: 'เปลี่ยนอีเมล์ preferences: %{link}' - signature: ฟอร์มการแจ้งเตือนแมสโทดอน %{instance} view: 'วิว:' applications: invalid_url: URL ที่ระบุไม่ถูกตั้ง diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 6aff78fa1..23b4d7a24 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -152,7 +152,6 @@ tr: title: Yönetim application_mailer: settings: 'E-mail tercihlerini değiştir: %{link}' - signature: "%{instance} sunucusundan Mastodon bildirimleri" view: 'Görüntüle:' applications: invalid_url: Verilen URL geçerli değil diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 995a682a7..0ddfa9190 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -143,7 +143,6 @@ uk: title: Адміністрування application_mailer: settings: 'Змінити налаштування email: %{link}' - signature: Сповіщення Mastodon від %{instance} view: 'Перегляд:' applications: invalid_url: Введена URL неправильна diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 14382331b..25cfe5a8a 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -339,7 +339,6 @@ zh-CN: notification_preferences: 更改电子邮件首选项 salutation: "%{name}:" settings: 使用此链接更改你的电子邮件首选项:%{link} - signature: 这是一封来自 %{instance} 的 Mastodon 电子邮件通知。 view: 点此链接查看详情: view_profile: 查看个人资料页 view_status: 查看嘟文 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 8ff6d1bf8..ed73b7244 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -152,7 +152,6 @@ zh-HK: title: 管理 application_mailer: settings: 修改電郵設定︰%{link} - signature: 來自 %{instance} 的 Mastodon 通知 view: 進入瀏覽︰ applications: invalid_url: 所提供的網址不正確 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index e73dbf9cc..bd9f85840 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -123,7 +123,6 @@ zh-TW: title: 管理介面 application_mailer: settings: 修改信箱設定︰ %{link} - signature: 來自 %{instance} 的 Mastodon 通知 view: 進入瀏覽︰ applications: invalid_url: 網址不正確 diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb index 6ed0090f4..8d2a9368d 100644 --- a/spec/mailers/previews/user_mailer_preview.rb +++ b/spec/mailers/previews/user_mailer_preview.rb @@ -29,4 +29,9 @@ class UserMailerPreview < ActionMailer::Preview def reset_password_instructions UserMailer.reset_password_instructions(User.first, 'spec') end + + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/welcome + def welcome + UserMailer.welcome(User.first) + end end From 9b3b40df660d90fddb7563def4fab9b5cee701e9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 18 Jan 2018 20:29:56 +0100 Subject: [PATCH 02/18] Fix regeneration marker not expiring (#6290) * Fix regeneration key not getting expired * Add rake task to remove old regeneration markers --- app/controllers/concerns/user_tracking_concern.rb | 2 +- lib/tasks/mastodon.rake | 9 +++++++++ spec/controllers/concerns/user_tracking_concern_spec.rb | 6 ++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/controllers/concerns/user_tracking_concern.rb b/app/controllers/concerns/user_tracking_concern.rb index 1e3132941..a2510e55f 100644 --- a/app/controllers/concerns/user_tracking_concern.rb +++ b/app/controllers/concerns/user_tracking_concern.rb @@ -32,7 +32,7 @@ module UserTrackingConcern end def regenerate_feed! - Redis.current.setnx("account:#{current_user.account_id}:regeneration", true) == 1 && Redis.current.expire("account:#{current_user.account_id}:regeneration", 3_600 * 24) + Redis.current.setnx("account:#{current_user.account_id}:regeneration", true) && Redis.current.expire("account:#{current_user.account_id}:regeneration", 1.day.seconds) RegenerationWorker.perform_async(current_user.account_id) end end diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 38dbed982..486c035de 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -341,6 +341,15 @@ namespace :mastodon do LinkCrawlWorker.push_bulk status_ids end + desc 'Remove all home feed regeneration markers' + task remove_regeneration_markers: :environment do + keys = Redis.current.keys('account:*:regeneration') + + Redis.current.pipelined do + keys.each { |key| Redis.current.del(key) } + end + end + desc 'Check every known remote account and delete those that no longer exist in origin' task purge_removed_accounts: :environment do prepare_for_options! diff --git a/spec/controllers/concerns/user_tracking_concern_spec.rb b/spec/controllers/concerns/user_tracking_concern_spec.rb index d08095ef8..1e5620221 100644 --- a/spec/controllers/concerns/user_tracking_concern_spec.rb +++ b/spec/controllers/concerns/user_tracking_concern_spec.rb @@ -69,6 +69,12 @@ describe ApplicationController, type: :controller do expect(RegenerationWorker).to have_received(:perform_async) end + it 'sets the regeneration marker to expire' do + allow(RegenerationWorker).to receive(:perform_async) + get :show + expect(Redis.current.ttl("account:#{user.account_id}:regeneration")).to be >= 0 + end + it 'regenerates feed when sign in is older than two weeks' do get :show From 852b48295f1792066d3bc913f05630f809eb2bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczak?= Date: Fri, 19 Jan 2018 13:49:25 +0100 Subject: [PATCH 03/18] i18n: Update Polish translation (#6297) --- config/locales/pl.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 24ae94209..7b1065d04 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -730,6 +730,25 @@ pl: recovery_instructions_html: Jeżeli kiedykolwiek utracisz dostęp do telefonu, możesz wykorzystać jeden z kodów zapasowych, aby odzyskać dostęp do konta. Trzymaj je w bezpiecznym miejscu. Na przykład, wydrukuj je i przechowuj z ważnymi dokumentami. setup: Skonfiguruj wrong_code: Wprowadzony kod jest niepoprawny! Czy czas serwera i urządzenia jest poprawny? + user_mailer: + welcome: + edit_profile_action: Skonfiguruj profil + edit_profile_step: Możesz dostować profil wysyłając awatar, obraz nagłówka, zmieniając wyświetlaną nazwę i wiele więcej. Jeżeli chcesz, możesz zablokować konto, aby kontrolować, kto może Cię śledzić. + explanation: Kilka wskazówek, które pomogą Ci rozpocząć + final_action: Zacznij pisać + final_step: 'Zacznij tworzyć! Nawet jeżeli nikt Cię nie śledzi, 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ąć śledzić z innej instancji. + review_preferences_action: Zmień ustawienia + review_preferences_step: Upewnij się, że zmieniłeś ustawienia, takie jak maile, które chciałbyś otrzymywać lub domyślne opcje prywatności. Jeżeli nie masz choroby lokomocyjnej, możesz włączyć automatyczne odtwarzanie animacji GIF. + subject: Witaj w Mastodonie + tip_bridge_html: Jeżeli przybywasz z Twittera, możesz znaleźć znajomych na Mastodonie używając aplikacji mostku. Działa to tylko, jeżeli oni również z niej korzystali! + tip_federated_timeline: Oś czasu federacji przedstawia całą sieć Mastodona. Wyświetla tylko wpisy osób, które śledzą użytkownicy Twojej instancji, więc nie jest kompletna. + tip_following: Domyślnie śledzisz administratora/ów swojej instancji. Aby znaleźć więcej ciekawych ludzi, zajrzyj na lokalną i federalną oś czasu. + tip_local_timeline: Lokalna oś czasu przedstawia osoby z %{instance}. To Twoi najbliżsi sąsiedzi! + tip_mobile_webapp: Jeżeli Twoja przeglądarka pozwala na dodanie Mastodona na ekran główny, będziesz otrzymywać natychmiastowe powiadomienia. Działa to prawie jak natywna aplikacja! + tips: Wskazówki + title: Witaj na pokładzie, %{name}! users: invalid_email: Adres e-mail jest niepoprawny invalid_otp_token: Kod uwierzytelniający jest niepoprawny From 540b3f37ae904c135809ef2a65f2700ca361de77 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 19 Jan 2018 15:25:27 +0100 Subject: [PATCH 04/18] Replace drawer elephant graphic with a vector image (#6286) * Replace drawer elephant graphic with a vector image * Replace wave graphic with SVG * Remove unused elephant graphic --- app/javascript/images/elephant-friend-1.png | Bin 144967 -> 0 bytes app/javascript/images/elephant_ui_plane.svg | 1 + app/javascript/images/mastodon-ui.png | Bin 32449 -> 0 bytes .../images/wave-compose-standalone.png | Bin 5921 -> 0 bytes app/javascript/images/wave-drawer.png | Bin 3269 -> 0 bytes app/javascript/images/wave-modal.png | Bin 5200 -> 0 bytes app/javascript/styles/application.scss | 3 ++- app/javascript/styles/mastodon/components.scss | 7 ++----- app/javascript/styles/mastodon/modal.scss | 4 ++-- 9 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 app/javascript/images/elephant-friend-1.png create mode 100644 app/javascript/images/elephant_ui_plane.svg delete mode 100644 app/javascript/images/mastodon-ui.png delete mode 100644 app/javascript/images/wave-compose-standalone.png delete mode 100644 app/javascript/images/wave-drawer.png delete mode 100644 app/javascript/images/wave-modal.png diff --git a/app/javascript/images/elephant-friend-1.png b/app/javascript/images/elephant-friend-1.png deleted file mode 100644 index 2b238333092fc07fd2da91032dfe9ca98b5a12cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144967 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≀J-J5cEk% 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%0Awg#k;;tG=R#sL{?LAzYRbRLh zC8%p?qORXUe|ISKu^G=K!T!CzV(MY~!Itw(#0t#6`GUfd+T6^{O#7Yy0e=4W6yN!L z_7Dbk{8Dd*((j?6p&NMYfCRcvL`z)O^7BhWqx+AV_r!bT+~sAz$%@lkji0_F_X+jn z;{{q@+79waMNgc;lsC#k)bVRxu|~W=VobL!YG6mh$!i`T@<2z0s1V_JMHg%HN7v*Ke6mv(8_fBiRkj!bdgcoMWei-#7aRu8}+o2G0V4 ztA<_S{G50AERkZGO1iOCTxW8MQll{%@u`Mlad%aW)OVx)bsUcj@O7TE6*MRAX8j7G zKU=;OqapOz0?{d`y0Njb$o9bhH;-D_x6#p`PQ()I7#@31UqeGf$;rvdQ$nkY{N}Ko;7^=*3*Tlp`J*K0hLl1s#)@T29 zl~7_C-EDh(Jun3P@R?EkPaKi?wq44jmX`VX`O#$nUL#8A-I2-6va&~=t%?V~{W?24 z!!~RF9O#*vCQ(?xhfhcy4p^2UK^8}qUX9lGoo0&kqdQ7UO;}K`8S>(2)twarXFBuQ zU<<7j>EF$r!i{@puj3H^wTVFa;pBPAW~GM^l?xbun4~VNiE#n(`g2pgz9oSKSih~M z;zcs~{XHg*!QtWRsd9+#W{O<`7Oo6PDAjjyqJ2!_D;Hi}PBR7`h&JxcPyC6P{G&VYjo|zc+=H%Fm>@v!;6V ztNHDh&>{A0kw-66AvmEw_AxxYY~im?UtUU-e)Qu)45vwh|DWURQqCN;AXv^bIwnSE z7njnd#Y?_uoi}gZaOCIbj}Uu%KiKVU|4z=)Oe~Mh-T;<8il-p_7IVRV_+bHBD^2b( z@mG87glig+RPT3nb9v$csjn}(%~~w_%a<=c*Ha_22j=XJjM#dHGq`VM^=Zm+_NbP3 zc67u58A8F(p%@q#is5@59aUhMDlb%F%K?o@AI7Ij&~s)mh5pY+NP>zW5NY2(pZKVh zLvbV`S{38V=iu7wdzWJ8RtQJAH7Ud1S-$zlj0P^d0dscv{r@kI;{Uvci+pH2b`)N^ zOCh+Yf#5ca&_}+YrrgMJ;H=yH<}?6A{y9*jATSGaz0lB^OVbX4ti(pScZpPDQPSUFc8X~ zIrZxEc#Ief48TSP*tWY}aPIj)IJtYXRQ>;SJ|Nj4Td4m|5K1U*S204CkMZ&1G2 z7Xi_Q%0<-rUnneXlBV@3IK%j(r6>VoCDA+?kM&a^6a&EYFZaP3M(vu>1`?TPbqy#u z8phkmgC_&IZe6-Cx9L<`FS+P_9$|j^Hvy5}2%fRj#nJJ)u3p4MB|LM6WzY zgsQVQx37572Dbj}kUx4icVMJrZLi^F9SZ@@516Fg5!4#EbFX;l+3g($Z@vvD|K`&Fd%?$U8MljCJj8rSu^uF|UnS4WQa!<^a&0mcJj=jrc^42Dsk1Iwf zEq*+->b2tYxSq-dH0n;_d}rA`Xk*9NNV(x{VxmbDih6QR!VBS=0t$A?VB^^^1?>IX zhFsPrUip3Yn9t5sAEZ)xt@4VBiuO`w{zSg4X(S+VIS7)A5VJ@rkMJjLx5y$B-(3g+RMJp1N13C&2=eBJ zgDO03l3xFSX6Wh-vYW)4IZK?|vZ_KzBah0jwDtGvVg3C4{u{rn%o{ci&A7Hf`IU|K zRM4kS>2wF#j;hd zhJ)2F>yWa?KrOP>4P9z>BgzFDr7HZ&o*_7dkIK8E!@|O5YR8wHc-+4C&3OFcMIb~1 z4F(Gfz8MTAFX1YP3&qJMQeJFZGTB1j_=DD z7Kf>xl3{^5^W)x3YBA)F2}SFzTmtMqm-n7fkNM?w%)$?Y!8rN)UjOWTq*w8P8X04G VBwQ*MN}do1wOiWCB{v^F{Xh7q7McJ6 diff --git a/app/javascript/images/elephant_ui_plane.svg b/app/javascript/images/elephant_ui_plane.svg new file mode 100644 index 000000000..a2624d170 --- /dev/null +++ b/app/javascript/images/elephant_ui_plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/images/mastodon-ui.png b/app/javascript/images/mastodon-ui.png deleted file mode 100644 index a1fb642a003b2e2b652b1e6022a84f08dc76105f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32449 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%0Arc|r&DC@j0pAQE7yV9T$8x=q-T1FG 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 Cr$1f* diff --git a/app/javascript/images/wave-compose-standalone.png b/app/javascript/images/wave-compose-standalone.png deleted file mode 100644 index 287ee639b3426947ff629f9b8d183d38d0f767cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5921 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 diff --git a/app/javascript/images/wave-drawer.png b/app/javascript/images/wave-drawer.png deleted file mode 100644 index ca9f9e1d85d222e7bf80649c55783db928cc79d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3269 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 KMNUMnLSTZg*XzIl diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss index fd6665f65..300040173 100644 --- a/app/javascript/styles/application.scss +++ b/app/javascript/styles/application.scss @@ -6,7 +6,6 @@ @import 'mastodon/reset'; @import 'mastodon/basics'; -@import 'mastodon/modal'; @import 'mastodon/containers'; @import 'mastodon/lists'; @import 'mastodon/footer'; @@ -15,7 +14,9 @@ @import 'mastodon/forms'; @import 'mastodon/accounts'; @import 'mastodon/stream_entries'; +@import 'mastodon/boost'; @import 'mastodon/components'; +@import 'mastodon/modal'; @import 'mastodon/emoji_picker'; @import 'mastodon/about'; @import 'mastodon/tables'; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 63ee06d8e..c0a32ed05 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1762,7 +1762,7 @@ position: absolute; top: 0; left: 0; - background: lighten($ui-base-color, 13%) url('../images/wave-drawer.png') no-repeat bottom / 100% auto; + background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; box-sizing: border-box; padding: 0; display: flex; @@ -1777,7 +1777,7 @@ } > .mastodon { - background: url('../images/mastodon-ui.png') no-repeat left bottom / contain; + background: url('../images/elephant_ui_plane.svg') no-repeat left bottom / contain; flex: 1; } } @@ -2154,10 +2154,7 @@ } } -@import 'boost'; - .no-reduce-motion button.icon-button i.fa-retweet { - background-position: 0 0; height: 19px; transition: background-position 0.9s steps(10); diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss index 310dcb924..f9fad732e 100644 --- a/app/javascript/styles/mastodon/modal.scss +++ b/app/javascript/styles/mastodon/modal.scss @@ -1,5 +1,5 @@ .modal-layout { - background: $ui-base-color url('../images/wave-modal.png') repeat-x bottom fixed; + background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed; display: flex; flex-direction: column; height: 100vh; @@ -15,6 +15,6 @@ > * { flex: 1; max-height: 235px; - background: url('../images/mastodon-ui.png') no-repeat left bottom / contain; + background: url('../images/elephant_ui_plane.svg') no-repeat left bottom / contain; } } From a0de3222dd38f446483c1a215b0264faa5ab4800 Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 19 Jan 2018 15:49:48 +0100 Subject: [PATCH 05/18] Retry delivering toots over ActivityPub for about 2 days (#6298) Currently, Mastodon will retry delivering toots for a bit over 1 hour. This is a very short timespan when considering private and direct toots, which cannot be seen by the recipient at all after the delivery attempts have failed. Ideally, private and direct toots should have a different number of retries, but I do not know how to do that. --- app/workers/activitypub/delivery_worker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb index ae86e3dd2..4763856ac 100644 --- a/app/workers/activitypub/delivery_worker.rb +++ b/app/workers/activitypub/delivery_worker.rb @@ -3,7 +3,7 @@ class ActivityPub::DeliveryWorker include Sidekiq::Worker - sidekiq_options queue: 'push', retry: 8, dead: false + sidekiq_options queue: 'push', retry: 16, dead: false HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze From 7be53a10b0df3f3cfaaa82e7ab2ba16f85343546 Mon Sep 17 00:00:00 2001 From: Pierre Ozoux Date: Fri, 19 Jan 2018 19:11:19 +0100 Subject: [PATCH 06/18] Fix "tzinfo-data is not present" docker error (#6300) when starting the container. --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 7cca02ecf..52ebc84e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,7 @@ RUN apk -U upgrade \ protobuf \ su-exec \ tini \ + tzdata \ && update-ca-certificates \ && mkdir -p /tmp/src /opt \ && wget -O yarn.tar.gz "https://github.com/yarnpkg/yarn/releases/download/v$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ From b1e03197fa933f290979865d78381a3b22c05c69 Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 19 Jan 2018 19:11:35 +0100 Subject: [PATCH 07/18] Process mentions and reblogs even from resolved threads (#6299) This may lead to out-of-order notifications, but this is better than not having notifications at all. --- app/lib/activitypub/activity.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 820189d29..0f9e4f263 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -69,12 +69,13 @@ class ActivityPub::Activity def distribute(status) crawl_links(status) + notify_about_reblog(status) if reblog_of_local_account?(status) + notify_about_mentions(status) + # Only continue if the status is supposed to have # arrived in real-time return unless @options[:override_timestamps] - notify_about_reblog(status) if reblog_of_local_account?(status) - notify_about_mentions(status) distribute_to_followers(status) end From 7233ac07d2f182969def963bf25aa2fc705f434c Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 20 Jan 2018 04:53:30 +0900 Subject: [PATCH 08/18] Add support Ruby v2.5.0 (#6097) --- .ruby-version | 2 +- .travis.yml | 6 +++--- Dockerfile | 2 +- Gemfile | 4 ++-- Gemfile.lock | 8 ++++---- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.ruby-version b/.ruby-version index 8e8299dcc..437459cd9 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.4.2 +2.5.0 diff --git a/.travis.yml b/.travis.yml index 59d495c43..496315558 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,20 +40,20 @@ addons: - yarn rvm: - - 2.3.4 - 2.4.2 + - 2.5.0 services: - redis-server install: + - gem update --system - nvm install - bundle install --path=vendor/bundle --without development production --retry=3 --jobs=16 - yarn install before_script: - - bundle exec rake parallel:create parallel:load_schema parallel:prepare - - bundle exec rails assets:precompile + - ./bin/rails parallel:create parallel:load_schema parallel:prepare assets:precompile - ln -s /usr/bin/x86_64-linux-gnu-g++-6 "$HOME/g++" script: diff --git a/Dockerfile b/Dockerfile index 52ebc84e5..765df58c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.4.2-alpine3.6 +FROM ruby:2.5.0-alpine3.7 LABEL maintainer="https://github.com/tootsuite/mastodon" \ description="A GNU Social-compatible microblogging server" diff --git a/Gemfile b/Gemfile index 84578fc36..15cd72f24 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ # frozen_string_literal: true source 'https://rubygems.org' -ruby '>= 2.3.0', '< 2.5.0' +ruby '>= 2.3.0', '< 2.6.0' gem 'pkg-config', '~> 1.2' @@ -28,7 +28,7 @@ gem 'browser' gem 'charlock_holmes', '~> 0.7.5' gem 'iso-639' gem 'cld3', '~> 3.2.0' -gem 'devise', '~> 4.3' +gem 'devise', '~> 4.4' gem 'devise-two-factor', '~> 3.0' gem 'doorkeeper', '~> 4.2' gem 'fast_blank', '~> 1.0' diff --git a/Gemfile.lock b/Gemfile.lock index 12c6d0e47..788da17fe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -110,7 +110,7 @@ GEM activesupport charlock_holmes (0.7.5) chunky_png (1.3.8) - cld3 (3.2.1) + cld3 (3.2.2) ffi (>= 1.1.0, < 1.10.0) climate_control (0.2.0) cocaine (0.5.8) @@ -125,7 +125,7 @@ GEM css_parser (1.6.0) addressable debug_inspector (0.0.3) - devise (4.3.0) + devise (4.4.0) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0, < 5.2) @@ -568,7 +568,7 @@ DEPENDENCIES charlock_holmes (~> 0.7.5) cld3 (~> 3.2.0) climate_control (~> 0.2) - devise (~> 4.3) + devise (~> 4.4) devise-two-factor (~> 3.0) doorkeeper (~> 4.2) dotenv-rails (~> 2.2) @@ -649,7 +649,7 @@ DEPENDENCIES webpush RUBY VERSION - ruby 2.4.2p198 + ruby 2.5.0p0 BUNDLED WITH 1.16.1 From 238de58e652c99c331d0bdf8e4791abace02fb0e Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 20 Jan 2018 04:56:47 +0900 Subject: [PATCH 09/18] Change belongs_to_required_by_default to true (#5888) --- app/models/account.rb | 2 +- app/models/account_domain_block.rb | 2 +- app/models/admin/action_log.rb | 4 ++-- app/models/block.rb | 4 ++-- app/models/conversation_mute.rb | 4 ++-- app/models/favourite.rb | 4 ++-- app/models/follow.rb | 5 ++--- app/models/follow_request.rb | 4 ++-- app/models/import.rb | 2 +- app/models/invite.rb | 2 +- app/models/list.rb | 2 +- app/models/list_account.rb | 6 +++--- app/models/media_attachment.rb | 4 ++-- app/models/mention.rb | 4 ++-- app/models/mute.rb | 4 ++-- app/models/notification.rb | 16 ++++++++-------- app/models/report.rb | 2 +- app/models/session_activation.rb | 6 +++--- app/models/status.rb | 12 ++++++------ app/models/status_pin.rb | 4 ++-- app/models/subscription.rb | 2 +- app/models/user.rb | 4 ++-- config/application.rb | 3 +++ 23 files changed, 52 insertions(+), 50 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index 686e74044..5900fee4a 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -102,7 +102,7 @@ class Account < ApplicationRecord has_many :lists, through: :list_accounts # Account migrations - belongs_to :moved_to_account, class_name: 'Account' + belongs_to :moved_to_account, class_name: 'Account', optional: true scope :remote, -> { where.not(domain: nil) } scope :local, -> { where(domain: nil) } diff --git a/app/models/account_domain_block.rb b/app/models/account_domain_block.rb index 35810b6c2..abcc923b3 100644 --- a/app/models/account_domain_block.rb +++ b/app/models/account_domain_block.rb @@ -13,7 +13,7 @@ class AccountDomainBlock < ApplicationRecord include Paginable - belongs_to :account, required: true + belongs_to :account validates :domain, presence: true, uniqueness: { scope: :account_id } after_create :remove_blocking_cache diff --git a/app/models/admin/action_log.rb b/app/models/admin/action_log.rb index 4e950fbf7..c437c8ee8 100644 --- a/app/models/admin/action_log.rb +++ b/app/models/admin/action_log.rb @@ -16,8 +16,8 @@ class Admin::ActionLog < ApplicationRecord serialize :recorded_changes - belongs_to :account, required: true - belongs_to :target, required: true, polymorphic: true + belongs_to :account + belongs_to :target, polymorphic: true default_scope -> { order('id desc') } diff --git a/app/models/block.rb b/app/models/block.rb index 284abfe4c..441e6bca3 100644 --- a/app/models/block.rb +++ b/app/models/block.rb @@ -13,8 +13,8 @@ class Block < ApplicationRecord include Paginable - belongs_to :account, required: true - belongs_to :target_account, class_name: 'Account', required: true + belongs_to :account + belongs_to :target_account, class_name: 'Account' validates :account_id, uniqueness: { scope: :target_account_id } diff --git a/app/models/conversation_mute.rb b/app/models/conversation_mute.rb index 248cdfe6e..272eb81af 100644 --- a/app/models/conversation_mute.rb +++ b/app/models/conversation_mute.rb @@ -9,6 +9,6 @@ # class ConversationMute < ApplicationRecord - belongs_to :account, required: true - belongs_to :conversation, required: true + belongs_to :account + belongs_to :conversation end diff --git a/app/models/favourite.rb b/app/models/favourite.rb index c38838f2a..2b1271f31 100644 --- a/app/models/favourite.rb +++ b/app/models/favourite.rb @@ -13,8 +13,8 @@ class Favourite < ApplicationRecord include Paginable - belongs_to :account, inverse_of: :favourites, required: true - belongs_to :status, inverse_of: :favourites, counter_cache: true, required: true + belongs_to :account, inverse_of: :favourites + belongs_to :status, inverse_of: :favourites, counter_cache: true has_one :notification, as: :activity, dependent: :destroy diff --git a/app/models/follow.rb b/app/models/follow.rb index 3fb665afc..f953b8e3e 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -14,12 +14,11 @@ class Follow < ApplicationRecord include Paginable - belongs_to :account, counter_cache: :following_count, required: true + belongs_to :account, counter_cache: :following_count belongs_to :target_account, class_name: 'Account', - counter_cache: :followers_count, - required: true + counter_cache: :followers_count has_one :notification, as: :activity, dependent: :destroy diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb index ebf6959ce..bd6c4a0b9 100644 --- a/app/models/follow_request.rb +++ b/app/models/follow_request.rb @@ -14,8 +14,8 @@ class FollowRequest < ApplicationRecord include Paginable - belongs_to :account, required: true - belongs_to :target_account, class_name: 'Account', required: true + belongs_to :account + belongs_to :target_account, class_name: 'Account' has_one :notification, as: :activity, dependent: :destroy diff --git a/app/models/import.rb b/app/models/import.rb index 091fb3044..ba88435bf 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -20,7 +20,7 @@ class Import < ApplicationRecord self.inheritance_column = false - belongs_to :account, required: true + belongs_to :account enum type: [:following, :blocking, :muting] diff --git a/app/models/invite.rb b/app/models/invite.rb index 6907c1f1d..b87a3b722 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -14,7 +14,7 @@ # class Invite < ApplicationRecord - belongs_to :user, required: true + belongs_to :user has_many :users, inverse_of: :invite scope :available, -> { where(expires_at: nil).or(where('expires_at >= ?', Time.now.utc)) } diff --git a/app/models/list.rb b/app/models/list.rb index be85c3b87..a2ec7e84a 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -15,7 +15,7 @@ class List < ApplicationRecord PER_ACCOUNT_LIMIT = 50 - belongs_to :account + belongs_to :account, optional: true has_many :list_accounts, inverse_of: :list, dependent: :destroy has_many :accounts, through: :list_accounts diff --git a/app/models/list_account.rb b/app/models/list_account.rb index 253932590..da46cf032 100644 --- a/app/models/list_account.rb +++ b/app/models/list_account.rb @@ -10,9 +10,9 @@ # class ListAccount < ApplicationRecord - belongs_to :list, required: true - belongs_to :account, required: true - belongs_to :follow, required: true + belongs_to :list + belongs_to :account + belongs_to :follow validates :account_id, uniqueness: { scope: :list_id } diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index abc5ab854..4b84b95fa 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -45,8 +45,8 @@ class MediaAttachment < ApplicationRecord }, }.freeze - belongs_to :account, inverse_of: :media_attachments - belongs_to :status, inverse_of: :media_attachments + belongs_to :account, inverse_of: :media_attachments, optional: true + belongs_to :status, inverse_of: :media_attachments, optional: true has_attached_file :file, styles: ->(f) { file_styles f }, diff --git a/app/models/mention.rb b/app/models/mention.rb index 14533e6a9..f864bf8e1 100644 --- a/app/models/mention.rb +++ b/app/models/mention.rb @@ -11,8 +11,8 @@ # class Mention < ApplicationRecord - belongs_to :account, inverse_of: :mentions, required: true - belongs_to :status, required: true + belongs_to :account, inverse_of: :mentions + belongs_to :status has_one :notification, as: :activity, dependent: :destroy diff --git a/app/models/mute.rb b/app/models/mute.rb index 105696da6..948f22444 100644 --- a/app/models/mute.rb +++ b/app/models/mute.rb @@ -14,8 +14,8 @@ class Mute < ApplicationRecord include Paginable - belongs_to :account, required: true - belongs_to :target_account, class_name: 'Account', required: true + belongs_to :account + belongs_to :target_account, class_name: 'Account' validates :account_id, uniqueness: { scope: :target_account_id } diff --git a/app/models/notification.rb b/app/models/notification.rb index 976963528..733f89cf7 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -26,15 +26,15 @@ class Notification < ApplicationRecord STATUS_INCLUDES = [:account, :application, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :application, :media_attachments, :tags, mentions: :account]].freeze - belongs_to :account - belongs_to :from_account, class_name: 'Account' - belongs_to :activity, polymorphic: true + belongs_to :account, optional: true + belongs_to :from_account, class_name: 'Account', optional: true + belongs_to :activity, polymorphic: true, optional: true - belongs_to :mention, foreign_type: 'Mention', foreign_key: 'activity_id' - belongs_to :status, foreign_type: 'Status', foreign_key: 'activity_id' - belongs_to :follow, foreign_type: 'Follow', foreign_key: 'activity_id' - belongs_to :follow_request, foreign_type: 'FollowRequest', foreign_key: 'activity_id' - belongs_to :favourite, foreign_type: 'Favourite', foreign_key: 'activity_id' + belongs_to :mention, foreign_type: 'Mention', foreign_key: 'activity_id', optional: true + belongs_to :status, foreign_type: 'Status', foreign_key: 'activity_id', optional: true + belongs_to :follow, foreign_type: 'Follow', foreign_key: 'activity_id', optional: true + belongs_to :follow_request, foreign_type: 'FollowRequest', foreign_key: 'activity_id', optional: true + belongs_to :favourite, foreign_type: 'Favourite', foreign_key: 'activity_id', optional: true validates :account_id, uniqueness: { scope: [:activity_type, :activity_id] } validates :activity_type, inclusion: { in: TYPE_CLASS_MAP.values } diff --git a/app/models/report.rb b/app/models/report.rb index c36f8db0a..f55fb6d3e 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -17,7 +17,7 @@ class Report < ApplicationRecord belongs_to :account belongs_to :target_account, class_name: 'Account' - belongs_to :action_taken_by_account, class_name: 'Account' + belongs_to :action_taken_by_account, class_name: 'Account', optional: true scope :unresolved, -> { where(action_taken: false) } scope :resolved, -> { where(action_taken: true) } diff --git a/app/models/session_activation.rb b/app/models/session_activation.rb index 1d4ebca02..d364f03df 100644 --- a/app/models/session_activation.rb +++ b/app/models/session_activation.rb @@ -15,9 +15,9 @@ # class SessionActivation < ApplicationRecord - belongs_to :user, inverse_of: :session_activations, required: true - belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', dependent: :destroy - belongs_to :web_push_subscription, class_name: 'Web::PushSubscription', dependent: :destroy + belongs_to :user, inverse_of: :session_activations + belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', dependent: :destroy, optional: true + belongs_to :web_push_subscription, class_name: 'Web::PushSubscription', dependent: :destroy, optional: true delegate :token, to: :access_token, diff --git a/app/models/status.rb b/app/models/status.rb index 00dcec624..26ff40bf7 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -33,14 +33,14 @@ class Status < ApplicationRecord enum visibility: [:public, :unlisted, :private, :direct], _suffix: :visibility - belongs_to :application, class_name: 'Doorkeeper::Application' + belongs_to :application, class_name: 'Doorkeeper::Application', optional: true - belongs_to :account, inverse_of: :statuses, counter_cache: true, required: true - belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account' - belongs_to :conversation + belongs_to :account, inverse_of: :statuses, counter_cache: true + belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account', optional: true + belongs_to :conversation, optional: true - belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies - belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, counter_cache: :reblogs_count + belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true + belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, counter_cache: :reblogs_count, optional: true has_many :favourites, inverse_of: :status, dependent: :destroy has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy diff --git a/app/models/status_pin.rb b/app/models/status_pin.rb index a72c19750..d3a98d8bd 100644 --- a/app/models/status_pin.rb +++ b/app/models/status_pin.rb @@ -11,8 +11,8 @@ # class StatusPin < ApplicationRecord - belongs_to :account, required: true - belongs_to :status, required: true + belongs_to :account + belongs_to :status validates_with StatusPinValidator end diff --git a/app/models/subscription.rb b/app/models/subscription.rb index 7f2eeab91..ea1173160 100644 --- a/app/models/subscription.rb +++ b/app/models/subscription.rb @@ -19,7 +19,7 @@ class Subscription < ApplicationRecord MIN_EXPIRATION = 1.day.to_i MAX_EXPIRATION = 30.days.to_i - belongs_to :account, required: true + belongs_to :account validates :callback_url, presence: true validates :callback_url, uniqueness: { scope: :account_id } diff --git a/app/models/user.rb b/app/models/user.rb index 8cad3221b..f6a533f84 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -50,8 +50,8 @@ class User < ApplicationRecord devise :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable - belongs_to :account, inverse_of: :user, required: true - belongs_to :invite, counter_cache: :uses + belongs_to :account, inverse_of: :user + belongs_to :invite, counter_cache: :uses, optional: true accepts_nested_attributes_for :account has_many :applications, class_name: 'Doorkeeper::Application', as: :owner diff --git a/config/application.rb b/config/application.rb index dc488ea8a..453000aba 100644 --- a/config/application.rb +++ b/config/application.rb @@ -18,6 +18,9 @@ require_relative '../lib/mastodon/redis_config' module Mastodon class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.1 + # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. From 0b888acfd4ffddd29f25c878373e9b9f5ec6c0ab Mon Sep 17 00:00:00 2001 From: ThibG Date: Fri, 19 Jan 2018 21:48:00 +0100 Subject: [PATCH 10/18] Do not throw away statuses obtained via websocket when API request finishes (#6302) --- app/javascript/mastodon/reducers/timelines.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index 7b7b5470f..9a10bcc59 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -40,7 +40,7 @@ const normalizeTimeline = (state, timeline, statuses, next, isPartial) => { mMap.set('loaded', true); mMap.set('isLoading', false); if (!hadNext) mMap.set('next', next); - mMap.set('items', wasLoaded ? ids.concat(oldIds) : ids); + mMap.set('items', wasLoaded ? ids.concat(oldIds) : oldIds.concat(ids)); mMap.set('isPartial', isPartial); })); }; From 01421999aeee60c1bb24a8509a9d1b9ebe34b4d9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 20 Jan 2018 01:32:05 +0100 Subject: [PATCH 11/18] Make text e-mails consistent with HTML ones in UserMailer (#6291) * Make text e-mails consistent with HTML ones in UserMailer * Fix UserMailer specs --- .../confirmation_instructions.ar.text.erb | 12 ------------ .../confirmation_instructions.ca.text.erb | 12 ------------ .../confirmation_instructions.en.text.erb | 12 ------------ .../confirmation_instructions.es.text.erb | 12 ------------ .../confirmation_instructions.fa.text.erb | 12 ------------ .../confirmation_instructions.fi.text.erb | 5 ----- .../confirmation_instructions.fr.text.erb | 14 -------------- .../confirmation_instructions.he.text.erb | 12 ------------ .../confirmation_instructions.id.text.erb | 12 ------------ .../confirmation_instructions.it.text.erb | 12 ------------ .../confirmation_instructions.ja.text.erb | 11 ----------- .../confirmation_instructions.ko.text.erb | 10 ---------- .../confirmation_instructions.nl.text.erb | 12 ------------ .../confirmation_instructions.no.text.erb | 12 ------------ .../confirmation_instructions.oc.text.erb | 14 -------------- .../confirmation_instructions.pl.text.erb | 12 ------------ .../confirmation_instructions.pt-BR.text.erb | 12 ------------ .../confirmation_instructions.ru.text.erb | 12 ------------ .../confirmation_instructions.sr-Latn.text.erb | 12 ------------ .../confirmation_instructions.sr.text.erb | 12 ------------ .../confirmation_instructions.sv.text.erb | 12 ------------ .../user_mailer/confirmation_instructions.text.erb | 12 ++++++++++++ .../confirmation_instructions.tr.text.erb | 13 ------------- .../confirmation_instructions.zh-cn.text.erb | 10 ---------- app/views/user_mailer/email_changed.en.text.erb | 13 ------------- app/views/user_mailer/email_changed.ja.text.erb | 11 ----------- app/views/user_mailer/email_changed.oc.text.erb | 13 ------------- app/views/user_mailer/email_changed.pl.text.erb | 13 ------------- app/views/user_mailer/email_changed.text.erb | 9 +++++++++ app/views/user_mailer/email_changed.zh-cn.text.erb | 11 ----------- app/views/user_mailer/password_change.ar.text.erb | 3 --- app/views/user_mailer/password_change.ca.text.erb | 3 --- app/views/user_mailer/password_change.en.text.erb | 3 --- app/views/user_mailer/password_change.es.text.erb | 3 --- app/views/user_mailer/password_change.fa.text.erb | 3 --- app/views/user_mailer/password_change.fi.text.erb | 3 --- app/views/user_mailer/password_change.fr.text.erb | 3 --- app/views/user_mailer/password_change.he.text.erb | 3 --- app/views/user_mailer/password_change.id.text.erb | 3 --- app/views/user_mailer/password_change.it.text.erb | 3 --- app/views/user_mailer/password_change.ja.text.erb | 3 --- app/views/user_mailer/password_change.nl.text.erb | 3 --- app/views/user_mailer/password_change.no.text.erb | 3 --- app/views/user_mailer/password_change.oc.text.erb | 3 --- app/views/user_mailer/password_change.pl.text.erb | 3 --- .../user_mailer/password_change.pt-BR.text.erb | 3 --- app/views/user_mailer/password_change.ru.text.erb | 3 --- .../user_mailer/password_change.sr-Latn.text.erb | 3 --- app/views/user_mailer/password_change.sr.text.erb | 3 --- app/views/user_mailer/password_change.sv.text.erb | 3 --- app/views/user_mailer/password_change.text.erb | 7 +++++++ app/views/user_mailer/password_change.th.text.erb | 3 --- app/views/user_mailer/password_change.tr.text.erb | 8 -------- .../user_mailer/password_change.zh-cn.text.erb | 3 --- .../reconfirmation_instructions.en.text.erb | 12 ------------ .../reconfirmation_instructions.ja.text.erb | 10 ---------- .../reconfirmation_instructions.oc.text.erb | 12 ------------ .../reconfirmation_instructions.pl.text.erb | 12 ------------ .../reconfirmation_instructions.text.erb | 9 +++++++++ .../reconfirmation_instructions.zh-cn.text.erb | 10 ---------- .../reset_password_instructions.ar.text.erb | 8 -------- .../reset_password_instructions.ca.text.erb | 8 -------- .../reset_password_instructions.en.text.erb | 8 -------- .../reset_password_instructions.es.text.erb | 8 -------- .../reset_password_instructions.fa.text.erb | 8 -------- .../reset_password_instructions.fi.text.erb | 8 -------- .../reset_password_instructions.fr.text.erb | 8 -------- .../reset_password_instructions.he.text.erb | 8 -------- .../reset_password_instructions.id.text.erb | 8 -------- .../reset_password_instructions.it.text.erb | 8 -------- .../reset_password_instructions.ja.text.erb | 8 -------- .../reset_password_instructions.nl.text.erb | 9 --------- .../reset_password_instructions.no.text.erb | 9 --------- .../reset_password_instructions.oc.text.erb | 8 -------- .../reset_password_instructions.pl.text.erb | 9 --------- .../reset_password_instructions.pt-BR.text.erb | 8 -------- .../reset_password_instructions.ru.text.erb | 8 -------- .../reset_password_instructions.sr-Latn.text.erb | 8 -------- .../reset_password_instructions.sr.text.erb | 8 -------- .../reset_password_instructions.sv.text.erb | 8 -------- .../reset_password_instructions.text.erb | 9 +++++++++ .../reset_password_instructions.th.text.erb | 8 -------- .../reset_password_instructions.tr.text.erb | 13 ------------- .../reset_password_instructions.zh-cn.text.erb | 8 -------- spec/mailers/user_mailer_spec.rb | 10 +++++----- 85 files changed, 51 insertions(+), 657 deletions(-) delete mode 100644 app/views/user_mailer/confirmation_instructions.ar.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.ca.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.en.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.es.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.fa.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.fi.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.fr.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.he.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.id.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.it.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.ja.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.ko.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.nl.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.no.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.oc.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.pl.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.pt-BR.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.ru.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.sr.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.sv.text.erb create mode 100644 app/views/user_mailer/confirmation_instructions.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.tr.text.erb delete mode 100644 app/views/user_mailer/confirmation_instructions.zh-cn.text.erb delete mode 100644 app/views/user_mailer/email_changed.en.text.erb delete mode 100644 app/views/user_mailer/email_changed.ja.text.erb delete mode 100644 app/views/user_mailer/email_changed.oc.text.erb delete mode 100644 app/views/user_mailer/email_changed.pl.text.erb create mode 100644 app/views/user_mailer/email_changed.text.erb delete mode 100644 app/views/user_mailer/email_changed.zh-cn.text.erb delete mode 100644 app/views/user_mailer/password_change.ar.text.erb delete mode 100644 app/views/user_mailer/password_change.ca.text.erb delete mode 100644 app/views/user_mailer/password_change.en.text.erb delete mode 100644 app/views/user_mailer/password_change.es.text.erb delete mode 100644 app/views/user_mailer/password_change.fa.text.erb delete mode 100644 app/views/user_mailer/password_change.fi.text.erb delete mode 100644 app/views/user_mailer/password_change.fr.text.erb delete mode 100644 app/views/user_mailer/password_change.he.text.erb delete mode 100644 app/views/user_mailer/password_change.id.text.erb delete mode 100644 app/views/user_mailer/password_change.it.text.erb delete mode 100644 app/views/user_mailer/password_change.ja.text.erb delete mode 100644 app/views/user_mailer/password_change.nl.text.erb delete mode 100644 app/views/user_mailer/password_change.no.text.erb delete mode 100644 app/views/user_mailer/password_change.oc.text.erb delete mode 100644 app/views/user_mailer/password_change.pl.text.erb delete mode 100644 app/views/user_mailer/password_change.pt-BR.text.erb delete mode 100644 app/views/user_mailer/password_change.ru.text.erb delete mode 100644 app/views/user_mailer/password_change.sr-Latn.text.erb delete mode 100644 app/views/user_mailer/password_change.sr.text.erb delete mode 100644 app/views/user_mailer/password_change.sv.text.erb create mode 100644 app/views/user_mailer/password_change.text.erb delete mode 100644 app/views/user_mailer/password_change.th.text.erb delete mode 100644 app/views/user_mailer/password_change.tr.text.erb delete mode 100644 app/views/user_mailer/password_change.zh-cn.text.erb delete mode 100644 app/views/user_mailer/reconfirmation_instructions.en.text.erb delete mode 100644 app/views/user_mailer/reconfirmation_instructions.ja.text.erb delete mode 100644 app/views/user_mailer/reconfirmation_instructions.oc.text.erb delete mode 100644 app/views/user_mailer/reconfirmation_instructions.pl.text.erb create mode 100644 app/views/user_mailer/reconfirmation_instructions.text.erb delete mode 100644 app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.ar.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.ca.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.en.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.es.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.fa.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.fi.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.fr.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.he.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.id.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.it.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.ja.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.nl.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.no.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.oc.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.pl.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.pt-BR.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.ru.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.sr.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.sv.text.erb create mode 100644 app/views/user_mailer/reset_password_instructions.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.th.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.tr.text.erb delete mode 100644 app/views/user_mailer/reset_password_instructions.zh-cn.text.erb diff --git a/app/views/user_mailer/confirmation_instructions.ar.text.erb b/app/views/user_mailer/confirmation_instructions.ar.text.erb deleted file mode 100644 index 087c6a9ae..000000000 --- a/app/views/user_mailer/confirmation_instructions.ar.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -مرحبا <%= @resource.email %> ! - -لقد قمت بإنشاء حساب على <%= @instance %>. - -لتأكيد التسجيل يرجى النقر على الرابط التالي : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -يرجى الإطلاع على شروط الإستخدام <%= terms_url %> - -مع أجمل التحيات، - -فريق <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.ca.text.erb b/app/views/user_mailer/confirmation_instructions.ca.text.erb deleted file mode 100644 index 77cc589e6..000000000 --- a/app/views/user_mailer/confirmation_instructions.ca.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Benvingut <%= @resource.email %> ! - -Acabes de crear un compte a <%= @instance %>. - -Per confirmar la subscripció, si us plua fes clic en el següent vincle : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Si us plau també fes un cop d'ull als nostres termes i condicions <%= terms_url %> - -Sincerament, - -L'equip <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.en.text.erb b/app/views/user_mailer/confirmation_instructions.en.text.erb deleted file mode 100644 index 0419adef0..000000000 --- a/app/views/user_mailer/confirmation_instructions.en.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Welcome <%= @resource.email %> ! - -You just created an account on <%= @instance %>. - -To confirm your inscription, please click on the following link : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Please also check out our terms and conditions <%= terms_url %> - -Sincerely, - -The <%= @instance %> team \ No newline at end of file diff --git a/app/views/user_mailer/confirmation_instructions.es.text.erb b/app/views/user_mailer/confirmation_instructions.es.text.erb deleted file mode 100644 index e9d83b3f8..000000000 --- a/app/views/user_mailer/confirmation_instructions.es.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -¡Bienvenido, <%= @resource.email %>! - -Acabas de crear una cuenta en <%= @instance %>. - -Para confirmar tu registro, por favor ingresa al siguiente enlace: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Por favor, también revisa nuestros términos y condiciones <%= terms_url %> - -Sinceramente, - -El equipo de <%= @instance %> \ No newline at end of file diff --git a/app/views/user_mailer/confirmation_instructions.fa.text.erb b/app/views/user_mailer/confirmation_instructions.fa.text.erb deleted file mode 100644 index 76727b3be..000000000 --- a/app/views/user_mailer/confirmation_instructions.fa.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -خوش آمدید <%= @resource.email %> ! - -شما الان در <%= @instance %> حساب باز کردید. - -برای تأیید عضویت، لطفاً روی پیوند زیر کلیک کنید: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -لطفاً همچنین شرایط و مقررات استفادهٔ ما را هم بخوانید <%= terms_url %> - -با احترام، - -گردانندگان سرور <%= @instance %> \ No newline at end of file diff --git a/app/views/user_mailer/confirmation_instructions.fi.text.erb b/app/views/user_mailer/confirmation_instructions.fi.text.erb deleted file mode 100644 index 796913abb..000000000 --- a/app/views/user_mailer/confirmation_instructions.fi.text.erb +++ /dev/null @@ -1,5 +0,0 @@ -Tervetuloa <%= @resource.email %>! - -Voit vahvistaa Mastodon tilisi klikkaamalla alla olevaa linkkiä: - -<%= confirmation_url(@resource, confirmation_token: @token) %> diff --git a/app/views/user_mailer/confirmation_instructions.fr.text.erb b/app/views/user_mailer/confirmation_instructions.fr.text.erb deleted file mode 100644 index 7730715f8..000000000 --- a/app/views/user_mailer/confirmation_instructions.fr.text.erb +++ /dev/null @@ -1,14 +0,0 @@ -Bonjour <%= @resource.email %> ! - -Vous venez de vous créer un compte sur <%= @instance %> et nous vous en remercions. - -Pour confirmer votre inscription, merci de cliquer sur le lien suivant : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Après votre première connexion, vous pourrez accéder à la documentation de l’outil. - -Pour rappel, nos conditions d’utilisation sont indiquées ici <%= terms_url %> - -Amicalement, - -L’équipe <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.he.text.erb b/app/views/user_mailer/confirmation_instructions.he.text.erb deleted file mode 100644 index 8e37fc641..000000000 --- a/app/views/user_mailer/confirmation_instructions.he.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -שלום <%= @resource.email %> ! - -הרגע יצרת חשבון בקהילה <%= @instance %>. - -כדי לוודא את הרשמתך, יש ללחוץ על הקישורית הבאה : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -יש לעבור גם על תנאי השימוש <%= terms_url %> - -בתודה מראש, - -צוות ניהול <%= @instance %> \ No newline at end of file diff --git a/app/views/user_mailer/confirmation_instructions.id.text.erb b/app/views/user_mailer/confirmation_instructions.id.text.erb deleted file mode 100644 index 0486c3c5c..000000000 --- a/app/views/user_mailer/confirmation_instructions.id.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Selamat datang <%= @resource.email %> ! - -Anda baru saja membuat akun di <%= @instance %>. - -Untuk mengkonfirmasi, silakan klik link berikut ini : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Silakan cek <%= terms_url %> kami - -Hormat kami, - -Tim <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.it.text.erb b/app/views/user_mailer/confirmation_instructions.it.text.erb deleted file mode 100644 index ce9411173..000000000 --- a/app/views/user_mailer/confirmation_instructions.it.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Benvenuto <%= @resource.email %> ! - -Hai appena creato un account su <%= @instance %>. - -er confermare la tua iscrizione, fai clic sul seguente link : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Per piacere leggi anche i nostri termini e condizioni <%= terms_url %> - -Sinceramente, - -Il team <%= @instance %> \ No newline at end of file diff --git a/app/views/user_mailer/confirmation_instructions.ja.text.erb b/app/views/user_mailer/confirmation_instructions.ja.text.erb deleted file mode 100644 index 99868ba8a..000000000 --- a/app/views/user_mailer/confirmation_instructions.ja.text.erb +++ /dev/null @@ -1,11 +0,0 @@ -ようこそ<%= @resource.email %>さん - -<%= @instance %>にアカウントが作成されました。 - -以下のリンクをクリックしてMastodonアカウントのメールアドレスを確認してください。 - -<%= confirmation_url(@resource, confirmation_token: @token) %> - -また、インスタンスの<%= link_to '利用規約', terms_url %>についてもご確認ください。 - -<%= @instance %> チーム diff --git a/app/views/user_mailer/confirmation_instructions.ko.text.erb b/app/views/user_mailer/confirmation_instructions.ko.text.erb deleted file mode 100644 index c46400f07..000000000 --- a/app/views/user_mailer/confirmation_instructions.ko.text.erb +++ /dev/null @@ -1,10 +0,0 @@ -안녕하세요 <%= @resource.email %> 님! - -<%= @instance %>에 새로 계정을 만들었습니다. - -아래 링크를 눌러 회원가입을 완료 하세요. -<%= confirmation_url(@resource, confirmation_token: @token) %> - -약관도 확인 바랍니다. <%= terms_url %> - -<%= @instance %> 드림 diff --git a/app/views/user_mailer/confirmation_instructions.nl.text.erb b/app/views/user_mailer/confirmation_instructions.nl.text.erb deleted file mode 100644 index 3c14896b3..000000000 --- a/app/views/user_mailer/confirmation_instructions.nl.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Welkom <%= @resource.email %> ! - -Je hebt zojuist een account aangemaakt op <%= @instance %>. - -Klik op de volgende link om jouw registratie te bevestigen : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Lees ook onze gebruikersvoorwaarden op <%= terms_url %> - -Vriendelijke groet, - -De beheerder(s) van <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.no.text.erb b/app/views/user_mailer/confirmation_instructions.no.text.erb deleted file mode 100644 index 3739c99d4..000000000 --- a/app/views/user_mailer/confirmation_instructions.no.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Velkommen <%= @resource.email %> ! - -Du har akkurat opprettet en konto på <%= @instance %>. - -For å bekrefte innskriving i manntallet vennligst trykk på følgende lenke : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Vennligst også les våre brukervilkår <%= terms_url %> - -Med vennlig hilsen, - -Gjengen bak <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.oc.text.erb b/app/views/user_mailer/confirmation_instructions.oc.text.erb deleted file mode 100644 index fe04fe3d0..000000000 --- a/app/views/user_mailer/confirmation_instructions.oc.text.erb +++ /dev/null @@ -1,14 +0,0 @@ -Bonjorn <%= @resource.email %> ! - -Venètz de vos crear un compte sus <%= @instance %> e vos mercegem :) - -er confirmar vòstra inscripcion, mercés de clicar sul ligam seguent :  -<%= link_to 'Confirmar mon compte', confirmation_url(@resource, confirmation_token: @token) %> - -Aprèp vòstra primièra connexion, poiretz accedir a la documentacion de l’aisina. - -Pensatz tanben de gaitar nòstres <%= link_to 'tèrmes e condicions d\'utilizacion', terms_url %>. - -Amistosament, - -La còla <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.pl.text.erb b/app/views/user_mailer/confirmation_instructions.pl.text.erb deleted file mode 100644 index f20082e16..000000000 --- a/app/views/user_mailer/confirmation_instructions.pl.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Witaj, <%= @resource.email %>! - -Właśnie utworzyłeś konto na instancji <%= @instance %>. - -Aby aktywować konto, odwiedź poniższy link: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Pamiętaj przeczytać nasz regulamin i zasady użytkowania: <%= terms_url %> - -Z pozdrowieniami, - -Zespół <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb b/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb deleted file mode 100644 index 578f7acb5..000000000 --- a/app/views/user_mailer/confirmation_instructions.pt-BR.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Boas vindas, <%= @resource.email %>! - -Você acabou de criar uma conta na instância <%= @instance %>. - -Para confirmar o seu cadastro, por favor clique no link a seguir: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Por favor, leia também os nossos termos e condições de uso <%= terms_url %> - -Atenciosamente, - -A equipe da instância <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.ru.text.erb b/app/views/user_mailer/confirmation_instructions.ru.text.erb deleted file mode 100644 index 884f75401..000000000 --- a/app/views/user_mailer/confirmation_instructions.ru.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Добро пожаловать, <%= @resource.email %> ! - -Вы только что завели аккаунт на <%= @instance %>. - -Чтобы подтвердить создание аккаунта, пожалуйста, перейдите по этой ссылке: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Также просим Вас прочитать об условиях использования аккаунта здесь: <%= terms_url %> - -Искренне Ваши, - -Команда <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb b/app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb deleted file mode 100644 index 60fe9db0d..000000000 --- a/app/views/user_mailer/confirmation_instructions.sr-Latn.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Dobrodošao <%= @resource.email %> ! - -Upravo ste napravili nalog na instanci <%= @instance %>. - -Da potvrdite Vašu registraciju, molimo Vas kliknite na sledeći link: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Takođe pogledajte i pravila i uslove korišćenja <%= terms_url %> - -S poštovanjem, - -<%= @instance %> tim diff --git a/app/views/user_mailer/confirmation_instructions.sr.text.erb b/app/views/user_mailer/confirmation_instructions.sr.text.erb deleted file mode 100644 index e7cb7e188..000000000 --- a/app/views/user_mailer/confirmation_instructions.sr.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Добродошао <%= @resource.email %> ! - -Управо сте направили налог на инстанци <%= @instance %>. - -Да потврдите Вашу регистрацију, молимо Вас кликните на следећи линк: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Такође погледајте и правила и услове коришћења <%= terms_url %> - -С поштовањем, - -<%= @instance %> тим diff --git a/app/views/user_mailer/confirmation_instructions.sv.text.erb b/app/views/user_mailer/confirmation_instructions.sv.text.erb deleted file mode 100644 index 64ffb9799..000000000 --- a/app/views/user_mailer/confirmation_instructions.sv.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Välkommen <%= @resource.email %> ! - -Du har precis skapat ett konto på <%= @instance %>. - -För att bekräfta din inskrift, vänligen klicka på följande länk : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Vänligen läs även våra användarvillkor <%= terms_url %> - -Vänliga hälsningar, - -Teamet på <%= @instance %> diff --git a/app/views/user_mailer/confirmation_instructions.text.erb b/app/views/user_mailer/confirmation_instructions.text.erb new file mode 100644 index 000000000..e01eecb27 --- /dev/null +++ b/app/views/user_mailer/confirmation_instructions.text.erb @@ -0,0 +1,12 @@ +<%= t 'devise.mailer.confirmation_instructions.title' %> + +=== + +<%= t 'devise.mailer.confirmation_instructions.explanation', host: site_hostname %> + +=> <%= confirmation_url(@resource, confirmation_token: @token) %> + +<%= strip_tags(t('devise.mailer.confirmation_instructions.extra_html', terms_path: about_more_url, policy_path: terms_url)) %> + +=> <%= about_more_url %> +=> <%= terms_url %> diff --git a/app/views/user_mailer/confirmation_instructions.tr.text.erb b/app/views/user_mailer/confirmation_instructions.tr.text.erb deleted file mode 100644 index 01b1c69e2..000000000 --- a/app/views/user_mailer/confirmation_instructions.tr.text.erb +++ /dev/null @@ -1,13 +0,0 @@ -Aramıza hoşgeldin <%= @resource.email %> - -Bu sunucumuzda yeni bir hesap oluşturduğunu görüyoruz: <%= @instance %>. - -Siz olduğunuzu teyit edebilmemiz için lütfen aşağıdaki linke tıklayınız: - -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Ayrıca kullanım şartları ve koşulları sayfamızı inceleyebilirsin <%= terms_url %> - -En içten dileklerimizle, - -<%= @instance %> ekibi diff --git a/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb b/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb deleted file mode 100644 index 25d901f16..000000000 --- a/app/views/user_mailer/confirmation_instructions.zh-cn.text.erb +++ /dev/null @@ -1,10 +0,0 @@ -<%= @resource.email %>,你好呀! - -你刚刚在 <%= @instance %> 创建了一个帐户呢。 - -点击下面的链接来完成注册啦: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -记得读一读我们的使用条款哦:<%= terms_url %> - -来自 <%= @instance %> 管理团队 \ No newline at end of file diff --git a/app/views/user_mailer/email_changed.en.text.erb b/app/views/user_mailer/email_changed.en.text.erb deleted file mode 100644 index 971972461..000000000 --- a/app/views/user_mailer/email_changed.en.text.erb +++ /dev/null @@ -1,13 +0,0 @@ -Hello <%= @resource.email %>! - -<% if @resource&.unconfirmed_email? %> -We're contacting you to notify you that the email you use on <%= @instance %> is being changed to <%= @resource.unconfirmed_email %>. -<% else %> -We're contacting you to notify you that the email you use on <%= @instance %> has been changed to <%= @resource.email %>. -<% end %> - -If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account. - -Sincerely, - -The <%= @instance %> team diff --git a/app/views/user_mailer/email_changed.ja.text.erb b/app/views/user_mailer/email_changed.ja.text.erb deleted file mode 100644 index 33ee6d10b..000000000 --- a/app/views/user_mailer/email_changed.ja.text.erb +++ /dev/null @@ -1,11 +0,0 @@ -Hello <%= @resource.email %>! - -<% if @resource&.unconfirmed_email? %> -<%= @instance %>で使っているメールアドレスが<%= @resource.unconfirmed_email %>に変更されようとしています。 -<% else %> -<%= @instance %>で使っているメールアドレスが<%= @resource.email %>に変更されました。 -<% end %> - -メールアドレスを変更した覚えがない場合、誰かがあなたのアカウントにアクセスしたおそれがあります。すぐにパスワードを変更するか、アカウントにアクセスできない場合はインスタンスの管理者に連絡してください。 - -<%= @instance %>チームより diff --git a/app/views/user_mailer/email_changed.oc.text.erb b/app/views/user_mailer/email_changed.oc.text.erb deleted file mode 100644 index 2305ef834..000000000 --- a/app/views/user_mailer/email_changed.oc.text.erb +++ /dev/null @@ -1,13 +0,0 @@ -Bonjorn <%= @resource.email %> ! - -<% if @resource&.unconfirmed_email? %> -Vos contactem per vos senhalar que l’adreça qu’utilizatz per <%= @instance %> es cambiada per aquesta d’aquí <%= @resource.unconfirmed_email %>. -<% else %> -Vos contactem per vos senhalar que l’adreça qu’utilizatz per <%= @instance %> es cambiada per aquesta d’aquí <%= @resource.email %>. -<% end %> - -S’avètz pas demandat aqueste cambiament d’adreça, poiriá arribar que qualqu’un mai aguèsse agut accès a vòstre compte. Mercés de cambiar sulpic vòstre senhal o de contactar vòstre administrator d’instància se l’accès a vòstre compte vos es barrat. - -Amistosament, - -La còla <%= @instance %> diff --git a/app/views/user_mailer/email_changed.pl.text.erb b/app/views/user_mailer/email_changed.pl.text.erb deleted file mode 100644 index 134a79e95..000000000 --- a/app/views/user_mailer/email_changed.pl.text.erb +++ /dev/null @@ -1,13 +0,0 @@ -Witaj, <%= @resource.email %>! - -<% if @resource&.unconfirmed_email? %> -Informujemy, że e-mail używany przez Ciebie na <%= @instance %> został zmieniony na <%= @resource.unconfirmed_email %>. -<% else %> -Informujemy, że e-mail używany przez Ciebie na <%= @instance %> został zmieniony na <%= @resource.email %>. -<% end %> - -Jeżeli to nie Ty, prawdopodobnie ktoś uzyskał dostęp do Twojego konta. Zalecana jest natychmiastowa zmiana hasła lub skontaktowanie się z administratorem, jeżeli nie masz dostępu do swojego konta. - -Z pozdrowieniami, - -Zespół <%= @instance %> diff --git a/app/views/user_mailer/email_changed.text.erb b/app/views/user_mailer/email_changed.text.erb new file mode 100644 index 000000000..2b58415f5 --- /dev/null +++ b/app/views/user_mailer/email_changed.text.erb @@ -0,0 +1,9 @@ +<%= t 'devise.mailer.email_changed.title' %> + +=== + +<%= t 'devise.mailer.email_changed.explanation' %> + +<%= @resource.unconfirmed_email %> + +<%= t 'devise.mailer.email_changed.extra' %> diff --git a/app/views/user_mailer/email_changed.zh-cn.text.erb b/app/views/user_mailer/email_changed.zh-cn.text.erb deleted file mode 100644 index d59ac58c4..000000000 --- a/app/views/user_mailer/email_changed.zh-cn.text.erb +++ /dev/null @@ -1,11 +0,0 @@ -<%= @resource.email %>,你好呀! - -<% if @resource&.unconfirmed_email? %> -我们发送这封邮件是为了提醒你,你在 <%= @instance %> 上使用的电子邮件地址即将变更为 <%= @resource.unconfirmed_email %>。 -<% else %> -我们发送这封邮件是为了提醒你,你在 <%= @instance %> 上使用的电子邮件地址已经变更为 <%= @resource.unconfirmed_email %>。 -<% end %> - -如果你并没有请求更改你的电子邮件地址,则他人很有可能已经入侵你的帐户。请立即更改你的密码;如果你已经无法访问你的帐户,请联系实例的管理员请求协助。 - -来自 <%= @instance %> 管理团队 diff --git a/app/views/user_mailer/password_change.ar.text.erb b/app/views/user_mailer/password_change.ar.text.erb deleted file mode 100644 index ae0161f31..000000000 --- a/app/views/user_mailer/password_change.ar.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -صباح الخير <%= @resource.email %> ! - -نود أن نخبرك أنه قد تم تعديل كلمة مرور ماستدون الخاصة بك بنجاح. diff --git a/app/views/user_mailer/password_change.ca.text.erb b/app/views/user_mailer/password_change.ca.text.erb deleted file mode 100644 index c2fdfc82c..000000000 --- a/app/views/user_mailer/password_change.ca.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hola <%= @resource.email %>! - -Aquest correu es per a notificar-te que la teva contrasenya a mastodont.cat ha canviat. diff --git a/app/views/user_mailer/password_change.en.text.erb b/app/views/user_mailer/password_change.en.text.erb deleted file mode 100644 index 3ae461c97..000000000 --- a/app/views/user_mailer/password_change.en.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hello <%= @resource.email %>! - -We're contacting you to notify you that your password on <%= @instance %> has been changed. diff --git a/app/views/user_mailer/password_change.es.text.erb b/app/views/user_mailer/password_change.es.text.erb deleted file mode 100644 index 192faf9ad..000000000 --- a/app/views/user_mailer/password_change.es.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -¡Hola, <%= @resource.email %>! - -Te contactamos para notificarte que tu contraseña en <%= @instance %> ha sido modificada. \ No newline at end of file diff --git a/app/views/user_mailer/password_change.fa.text.erb b/app/views/user_mailer/password_change.fa.text.erb deleted file mode 100644 index 0c2995958..000000000 --- a/app/views/user_mailer/password_change.fa.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -سلام <%= @resource.email %>! - -این پیغام برای این است که به شما بگوییم رمز شما در ماستدون تغییر کرده است. diff --git a/app/views/user_mailer/password_change.fi.text.erb b/app/views/user_mailer/password_change.fi.text.erb deleted file mode 100644 index d90c3fdeb..000000000 --- a/app/views/user_mailer/password_change.fi.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hei <%= @resource.email %>! - -Lähetämme tämän viestin ilmoittaaksemme että salasanasi on vaihdettu. diff --git a/app/views/user_mailer/password_change.fr.text.erb b/app/views/user_mailer/password_change.fr.text.erb deleted file mode 100644 index f068f1cd6..000000000 --- a/app/views/user_mailer/password_change.fr.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Bonjour <%= @resource.email %> ! - -Nous vous contactons pour vous informer que votre mot de passe sur Mastodon a bien été modifié. diff --git a/app/views/user_mailer/password_change.he.text.erb b/app/views/user_mailer/password_change.he.text.erb deleted file mode 100644 index 1f601c6b2..000000000 --- a/app/views/user_mailer/password_change.he.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -שלום <%= @resource.email %>! - -רצינו להודיע לך שסיסמתך במסטודון אצלנו הוחלפה. diff --git a/app/views/user_mailer/password_change.id.text.erb b/app/views/user_mailer/password_change.id.text.erb deleted file mode 100644 index 1a67fd407..000000000 --- a/app/views/user_mailer/password_change.id.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hai <%= @resource.email %>! - -Kami menghubungi anda untuk memberitahu bahwa kata sandi anda di Mastodon telah diubah. diff --git a/app/views/user_mailer/password_change.it.text.erb b/app/views/user_mailer/password_change.it.text.erb deleted file mode 100644 index ea187670e..000000000 --- a/app/views/user_mailer/password_change.it.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Ciao <%= @resource.email %>! - -Ti stiamo contattando per avvisarti che la tua password su Mastodon è stata cambiata. diff --git a/app/views/user_mailer/password_change.ja.text.erb b/app/views/user_mailer/password_change.ja.text.erb deleted file mode 100644 index aa29b9b2b..000000000 --- a/app/views/user_mailer/password_change.ja.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -こんにちは<%= @resource.email %>さん - -Mastodonアカウントのパスワードが変更されました。 diff --git a/app/views/user_mailer/password_change.nl.text.erb b/app/views/user_mailer/password_change.nl.text.erb deleted file mode 100644 index 33accd99c..000000000 --- a/app/views/user_mailer/password_change.nl.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hallo <%= @resource.email %>! - -Hierbij laten we jou weten dat jouw wachtwoord op Mastodon is veranderd. diff --git a/app/views/user_mailer/password_change.no.text.erb b/app/views/user_mailer/password_change.no.text.erb deleted file mode 100644 index 1707976c1..000000000 --- a/app/views/user_mailer/password_change.no.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hei <%= @resource.email %>! - -Ditt Mastodon-passord har blitt endret. diff --git a/app/views/user_mailer/password_change.oc.text.erb b/app/views/user_mailer/password_change.oc.text.erb deleted file mode 100644 index 9fe9116d9..000000000 --- a/app/views/user_mailer/password_change.oc.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Bonjorn <%= @resource.email %> ! - -Vos contactem per vos avisar qu’avèm ben cambiat vòstre senhal Mastodon. diff --git a/app/views/user_mailer/password_change.pl.text.erb b/app/views/user_mailer/password_change.pl.text.erb deleted file mode 100644 index bd2efee0f..000000000 --- a/app/views/user_mailer/password_change.pl.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Witaj, <%= @resource.email %>! - -Informujemy, że ostatnio zmieniono Twoje hasło na <%= @instance %>. diff --git a/app/views/user_mailer/password_change.pt-BR.text.erb b/app/views/user_mailer/password_change.pt-BR.text.erb deleted file mode 100644 index eb7368ba9..000000000 --- a/app/views/user_mailer/password_change.pt-BR.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Olá, <%= @resource.email %>! - -Estamos te contatando para te notificar que a sua senha na instância <%= @instance %> foi modificada. diff --git a/app/views/user_mailer/password_change.ru.text.erb b/app/views/user_mailer/password_change.ru.text.erb deleted file mode 100644 index 6a3556dae..000000000 --- a/app/views/user_mailer/password_change.ru.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Здравствуйте, <%= @resource.email %>! - -Мы пишем, чтобы оповестить Вас о смене пароля на Вашем аккаунте Mastodon. diff --git a/app/views/user_mailer/password_change.sr-Latn.text.erb b/app/views/user_mailer/password_change.sr-Latn.text.erb deleted file mode 100644 index 6e0666d8d..000000000 --- a/app/views/user_mailer/password_change.sr-Latn.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Zdravo <%= @resource.email %>! - -Želimo samo da Vas obavestimo da je Vaša lozinka na Mastodont instanci <%= @instance %> promenjena. diff --git a/app/views/user_mailer/password_change.sr.text.erb b/app/views/user_mailer/password_change.sr.text.erb deleted file mode 100644 index 9082201c0..000000000 --- a/app/views/user_mailer/password_change.sr.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Здраво <%= @resource.email %>! - -Желимо само да Вас обавестимо да је Ваша лозинка на Мастодонт инстанци <%= @instance %> промењена. diff --git a/app/views/user_mailer/password_change.sv.text.erb b/app/views/user_mailer/password_change.sv.text.erb deleted file mode 100644 index b6df73226..000000000 --- a/app/views/user_mailer/password_change.sv.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hej <%= @resource.email %>! - -Vi kontaktar dig för att meddela dig att ditt lösenord på <%= @instance %> har blivit ändrat. diff --git a/app/views/user_mailer/password_change.text.erb b/app/views/user_mailer/password_change.text.erb new file mode 100644 index 000000000..77a37894e --- /dev/null +++ b/app/views/user_mailer/password_change.text.erb @@ -0,0 +1,7 @@ +<%= t 'devise.mailer.password_change.title' %> + +=== + +<%= t 'devise.mailer.password_change.explanation' %> + +<%= t 'devise.mailer.password_change.extra' %> diff --git a/app/views/user_mailer/password_change.th.text.erb b/app/views/user_mailer/password_change.th.text.erb deleted file mode 100644 index 0d28a207c..000000000 --- a/app/views/user_mailer/password_change.th.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -สวัสดี <%= @resource.email %>! - -เราติดต่อมาเพื่อแจ้งให้คุณทราบว่า พาสเวิร์ดของคุณถูกเปลี่ยนแล้ว diff --git a/app/views/user_mailer/password_change.tr.text.erb b/app/views/user_mailer/password_change.tr.text.erb deleted file mode 100644 index 873c5f962..000000000 --- a/app/views/user_mailer/password_change.tr.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Merhaba <%= @resource.email %>! - -<%= @instance %>'deki parolanızın değiştirildiğini hatırlatmak isteriz. - -En içten dileklerimizle, - -<%= @instance %> ekibi - diff --git a/app/views/user_mailer/password_change.zh-cn.text.erb b/app/views/user_mailer/password_change.zh-cn.text.erb deleted file mode 100644 index dbc065173..000000000 --- a/app/views/user_mailer/password_change.zh-cn.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%= @resource.email %>,你好呀! - -提醒一下,你在 <%= @instance %> 上的密码被更改了哦。 diff --git a/app/views/user_mailer/reconfirmation_instructions.en.text.erb b/app/views/user_mailer/reconfirmation_instructions.en.text.erb deleted file mode 100644 index c1c735b3a..000000000 --- a/app/views/user_mailer/reconfirmation_instructions.en.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Hello <%= @resource.unconfirmed_email %>! - -You requested a change to the email address you use on <%= @instance %>. - -To confirm your new email, please click on the following link: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Please also check out our terms and conditions <%= terms_url %> - -Sincerely, - -The <%= @instance %> team diff --git a/app/views/user_mailer/reconfirmation_instructions.ja.text.erb b/app/views/user_mailer/reconfirmation_instructions.ja.text.erb deleted file mode 100644 index 5326e4512..000000000 --- a/app/views/user_mailer/reconfirmation_instructions.ja.text.erb +++ /dev/null @@ -1,10 +0,0 @@ -こんにちは<%= @resource.unconfirmed_email %>さん - -<%= @instance %>で使っているメールアドレスの変更をあなたがリクエストしました。 - -新しいメールアドレスを確認するには次のリンクをクリックしてください: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -また利用規約もご確認ください <%= terms_url %> - -<%= @instance %>チームより diff --git a/app/views/user_mailer/reconfirmation_instructions.oc.text.erb b/app/views/user_mailer/reconfirmation_instructions.oc.text.erb deleted file mode 100644 index 6f174bb3e..000000000 --- a/app/views/user_mailer/reconfirmation_instructions.oc.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Bonjorn <%= @resource.unconfirmed_email %> ! - -Avètz demandat a cambiar vòstra adreça de corrièl qu’utilizatz per <%= @instance %>. - -Per confirmar vòstra novèla adreça, mercés de clicar lo ligam seguent : -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Mercés tanben de gaitar nòstres <%= link_to 'terms and conditions', terms_url %>. - -Amistosament, - -La còla <%= @instance %> diff --git a/app/views/user_mailer/reconfirmation_instructions.pl.text.erb b/app/views/user_mailer/reconfirmation_instructions.pl.text.erb deleted file mode 100644 index 032718f81..000000000 --- a/app/views/user_mailer/reconfirmation_instructions.pl.text.erb +++ /dev/null @@ -1,12 +0,0 @@ -Witaj, <%= @resource.unconfirmed_email %>! - -Dokonano próby zmiany adresu e-mail, którego używasz na <%= @instance %>. - -Aby potwierdzić posiadanie tego adresu e-mail, kliknij na poniższy odnośnik: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -Pamiętaj o przeczytaniu naszych zasad użytkowania: <%= terms_url %> - -Z pozdrowieniami, - -Zespół <%= @instance %> diff --git a/app/views/user_mailer/reconfirmation_instructions.text.erb b/app/views/user_mailer/reconfirmation_instructions.text.erb new file mode 100644 index 000000000..b5e530251 --- /dev/null +++ b/app/views/user_mailer/reconfirmation_instructions.text.erb @@ -0,0 +1,9 @@ +<%= t 'devise.mailer.reconfirmation_instructions.title' %> + +=== + +<%= t 'devise.mailer.reconfirmation_instructions.explanation' %> + +=> <%= confirmation_url(@resource, confirmation_token: @token) %> + +<%= t 'devise.mailer.reconfirmation_instructions.extra' %> diff --git a/app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb b/app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb deleted file mode 100644 index 977d78137..000000000 --- a/app/views/user_mailer/reconfirmation_instructions.zh-cn.text.erb +++ /dev/null @@ -1,10 +0,0 @@ -<%= @resource.email %>,你好呀! - -你正在更改你在 <%= @instance %> 使用的电子邮件地址。 - -点击下面的链接以确认操作: -<%= confirmation_url(@resource, confirmation_token: @token) %> - -记得读一读我们的使用条款哦:<%= terms_url %> - -来自 <%= @instance %> 管理团队 diff --git a/app/views/user_mailer/reset_password_instructions.ar.text.erb b/app/views/user_mailer/reset_password_instructions.ar.text.erb deleted file mode 100644 index 0dfc85a36..000000000 --- a/app/views/user_mailer/reset_password_instructions.ar.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -صباح الخير <%= @resource.email %>! - -لقد طلب أحدهم رابط تعديل كلمة مرور ماستدون الخاصة بك. يمكنك المتابعة و مواصلة التعديل على الرابط التالي. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -يمكنك تجاهل هذه الرسالة إن لم تكن من طلب ذلك. -لن يتم تعديل كلمة المرور الخاصة بك و ستبقى نفسها إلا إذا قمت بالضغط على الرابط أعلاه. diff --git a/app/views/user_mailer/reset_password_instructions.ca.text.erb b/app/views/user_mailer/reset_password_instructions.ca.text.erb deleted file mode 100644 index ca4c494c3..000000000 --- a/app/views/user_mailer/reset_password_instructions.ca.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Hola <%= @resource.email %>! - -Algú ha sol·licitat un enllaç per canviar la contrasenya a mastodont.cat. Això es pot fer a través del següent enllaç. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Si no has sol·licitat aquest canvi, si us plau, ignora aquest correu. -La teva contrasenya no canviarà fins que accedeix a l'enllaç de dalt per crear-ne una de nova. diff --git a/app/views/user_mailer/reset_password_instructions.en.text.erb b/app/views/user_mailer/reset_password_instructions.en.text.erb deleted file mode 100644 index 7ed22dc2c..000000000 --- a/app/views/user_mailer/reset_password_instructions.en.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Hello <%= @resource.email %>! - -Someone has requested a link to change your password on <%= @instance %>. You can do this through the link below. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -If you didn't request this, please ignore this email. -Your password won't change until you access the link above and create a new one. diff --git a/app/views/user_mailer/reset_password_instructions.es.text.erb b/app/views/user_mailer/reset_password_instructions.es.text.erb deleted file mode 100644 index 8abafcc99..000000000 --- a/app/views/user_mailer/reset_password_instructions.es.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -¡Hola, <%= @resource.email %>! - -Alguien pidió un enlace para cambiar tu contraseña en <%= @instance %>. Puedes hacer esto con el siguiente enlace. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Si no fuiste tú, por favor ignora este mensaje. -Tu contraseña no cambiará hasta que ingreses al enlace y crees una nueva. diff --git a/app/views/user_mailer/reset_password_instructions.fa.text.erb b/app/views/user_mailer/reset_password_instructions.fa.text.erb deleted file mode 100644 index 0b01ba906..000000000 --- a/app/views/user_mailer/reset_password_instructions.fa.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -سلام <%= @resource.email %>! - -یک نفر درخواست کرده تا رمز شما در ماستدون عوض شود. برای این کار روی پیوند زیر کلیک کنید. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -اگر شما چنین درخواستی نداده‌اید، لطفاً این ایمیل را نادیده بگیرید. -تا وقتی که شما پیوند بالا را نبینید و رمز تازه‌ای نسازید، رمز شما عوض نخواهد شد. diff --git a/app/views/user_mailer/reset_password_instructions.fi.text.erb b/app/views/user_mailer/reset_password_instructions.fi.text.erb deleted file mode 100644 index c826d5fc8..000000000 --- a/app/views/user_mailer/reset_password_instructions.fi.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Hei <%= @resource.email %>! - -Joku on pyytänyt salasanvaihto Mastodonissa. Voit tehdä sen allaolevassa linkissä. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Jos et pyytänyt vaihtoa, poista tämä viesti. -Salasanaasi ei vaihdeta ennen kuin menet ylläolevaan linkkiin ja luot uuden. diff --git a/app/views/user_mailer/reset_password_instructions.fr.text.erb b/app/views/user_mailer/reset_password_instructions.fr.text.erb deleted file mode 100644 index 07fa3644a..000000000 --- a/app/views/user_mailer/reset_password_instructions.fr.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Bonjour <%= @resource.email %> ! - -Quelqu’un a demandé à réinitialiser votre mot de passe sur Mastodon. Vous pouvez effectuer la réinitialisation en cliquant sur le lien ci-dessous. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Si vous n’êtes pas à l’origine de cette demande, vous pouvez ignorer ce message. -Votre mot de passe ne sera pas modifié tant que vous n’accéderez pas au lien ci-dessus et n’en choisirez pas un nouveau. diff --git a/app/views/user_mailer/reset_password_instructions.he.text.erb b/app/views/user_mailer/reset_password_instructions.he.text.erb deleted file mode 100644 index 63c96c06b..000000000 --- a/app/views/user_mailer/reset_password_instructions.he.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -שלום <%= @resource.email %>! - -מישהו ביקש לינק להחלפת סיסמתך במסטודון. באפשרותך לעשות זאת ע"י בלחיצה על הקישורית שבהמשך. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -אם בקשה זו לא הגיעה ממך, אפשר להתעלם מההודעה. -סיסמתך לא תוחלף לפני שהקישורית תיפתח בדפדפן וסיסמא חדשה תוכנס. diff --git a/app/views/user_mailer/reset_password_instructions.id.text.erb b/app/views/user_mailer/reset_password_instructions.id.text.erb deleted file mode 100644 index cd7cfc373..000000000 --- a/app/views/user_mailer/reset_password_instructions.id.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Hai <%= @resource.email %>! - -Seseorang telah melakukan permintaan link untuk merubah kata sandi anda di Mastodon. Anda bisa melakukan ini melalui link dibawah ini. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Jika anda tidak memintanya, mohon abaikan email ini. -Password anda tidak akan diubah kecuali anda mengakses link di atas dan menggantinya. diff --git a/app/views/user_mailer/reset_password_instructions.it.text.erb b/app/views/user_mailer/reset_password_instructions.it.text.erb deleted file mode 100644 index 1de485c2e..000000000 --- a/app/views/user_mailer/reset_password_instructions.it.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Ciao <%= @resource.email %>! - -Qualcuno ha richiesto un link per cambiare la tua password su Mastodon. Lo puoi fare tramite il link qui sotto. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Se non l'hai richiesto tu, ignora questa email. -La tua password non verrà cambiata finché non accedi al link qui sopra e ne crei una nuova. diff --git a/app/views/user_mailer/reset_password_instructions.ja.text.erb b/app/views/user_mailer/reset_password_instructions.ja.text.erb deleted file mode 100644 index 9ed607b58..000000000 --- a/app/views/user_mailer/reset_password_instructions.ja.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -こんにちは<%= @resource.email %>さん - -Mastodonアカウントのパスワードの変更がリクエストされました。以下のリンクをクリックして操作を完了できます。 - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -このメールに身に覚えのない場合は無視してください。 -上記のリンクにアクセスし、変更をしない限りパスワードは変更されません。 diff --git a/app/views/user_mailer/reset_password_instructions.nl.text.erb b/app/views/user_mailer/reset_password_instructions.nl.text.erb deleted file mode 100644 index eda133db2..000000000 --- a/app/views/user_mailer/reset_password_instructions.nl.text.erb +++ /dev/null @@ -1,9 +0,0 @@ -Hallo <%= @resource.email %>! - -Er heeft iemand een nieuw wachtwoord aangevraagd voor Mastodon. Je kan op de link hieronder klikken om jouw wachtwo -ord te veranderen. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Je kan deze e-mail negeren wanneer jij dit niet hebt aangevraagd. -Jouw wachtwoord blijft onveranderd wanneer je niet op bovenstaande link klikt. diff --git a/app/views/user_mailer/reset_password_instructions.no.text.erb b/app/views/user_mailer/reset_password_instructions.no.text.erb deleted file mode 100644 index 387dc7c3e..000000000 --- a/app/views/user_mailer/reset_password_instructions.no.text.erb +++ /dev/null @@ -1,9 +0,0 @@ - -Hei <%= @resource.email %>! - -Noen har forespurt en lenke til å bytte passord på din Mastodon-bruker. Du kan gjøre det ved å følge lenken under. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Hvis du ikke vil endre ditt passord kan du ignorere denne epost. -Passordet ditt blir ikke endret før du følger lenken over og endrer det. diff --git a/app/views/user_mailer/reset_password_instructions.oc.text.erb b/app/views/user_mailer/reset_password_instructions.oc.text.erb deleted file mode 100644 index 5a5219589..000000000 --- a/app/views/user_mailer/reset_password_instructions.oc.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Bonjorn <%= @resource.email %> ! - -Qualqu’un a demandat la reïnicializacion de vòstre senhal per Mastodon. Podètz realizar la reïnicializacion en clicant sul ligam çai-jos.

- -<%= link_to 'Modificar mon senhal', edit_password_url(@resource, reset_password_token: @token) %> - -S’avètz pas res demandat, fasquètz pas cas a aqueste corrièl. -Vòstre senhal cambiarà pas se clicatz pas sul ligam e que ne causissètz pas un novèl. diff --git a/app/views/user_mailer/reset_password_instructions.pl.text.erb b/app/views/user_mailer/reset_password_instructions.pl.text.erb deleted file mode 100644 index 2b34afc48..000000000 --- a/app/views/user_mailer/reset_password_instructions.pl.text.erb +++ /dev/null @@ -1,9 +0,0 @@ -Witaj, <%= @resource.email %>! - -Ktoś próbował zmienić Twoje hasło na <%= @instance %>. Możesz zrobić to klikając w -poniższy link. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Jeżeli to nie Ty, zignoruj ten e-mail. -Twoje hasło nie zostanie zmienione, dopóki nie użyjesz linku z podobnej wiadomości. diff --git a/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb b/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb deleted file mode 100644 index 2abff0c0d..000000000 --- a/app/views/user_mailer/reset_password_instructions.pt-BR.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Olá, <%= @resource.email %>! - -Alguém solicitou um link para mudar a sua senha na instância <%= @instance %>. Você pode fazer isso através do link abaixo: - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Se você não solicitou isso, por favor ignore este e-mail. -A senha não será modificada até que você acesse o link acima e crie uma nova. diff --git a/app/views/user_mailer/reset_password_instructions.ru.text.erb b/app/views/user_mailer/reset_password_instructions.ru.text.erb deleted file mode 100644 index 4ede067ab..000000000 --- a/app/views/user_mailer/reset_password_instructions.ru.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Здравствуйте, <%= @resource.email %>! - -Кто-то отправил запрос о сбросе пароля для Вашего аккаунта Mastodon. Вы можете использовать для этого следующую ссылку: - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Если Вы не запрашивали сброс пароля, пожалуйста, проигнорируйте это сообщение. -Ваш пароль не будет изменен, пока вы не проследуете по вышеприведенной ссылке и не создадите новый. diff --git a/app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb b/app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb deleted file mode 100644 index 31707dee1..000000000 --- a/app/views/user_mailer/reset_password_instructions.sr-Latn.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Zdravo <%= @resource.email %>! - -Neko je zatražio link za promenu lozinke na instanci <%= @instance %>. Ovo možete uraditi preko linka ispod. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Ignorišite ovu poruku, ako niste Vi bili ti koji ste zatražili promenu lozinke. -Lozinka se neće promeniti sve dok ne kliknete link iznad i ne napravite novu lozinku. diff --git a/app/views/user_mailer/reset_password_instructions.sr.text.erb b/app/views/user_mailer/reset_password_instructions.sr.text.erb deleted file mode 100644 index 86ea32b05..000000000 --- a/app/views/user_mailer/reset_password_instructions.sr.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Здраво <%= @resource.email %>! - -Неко је затражио линк за промену лозинке на инстанци <%= @instance %>. Ово можете урадити преко линка испод. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Игноришите ову поруку, ако нисте Ви били ти који сте затражили промену лозинке. -Лозинка се неће променити све док не кликнете линк изнад и не направите нову лозинку. diff --git a/app/views/user_mailer/reset_password_instructions.sv.text.erb b/app/views/user_mailer/reset_password_instructions.sv.text.erb deleted file mode 100644 index 946426119..000000000 --- a/app/views/user_mailer/reset_password_instructions.sv.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Hej <%= @resource.email %>! - -Någon har begärt en länk för att ändra ditt lösenord på <%= @instance %>. Du kan göra det genom länken nedan. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Om du inte begärt detta, ignorerar du det här e-postmeddelandet. -Ditt lösenord ändras inte förrän du öppnar länken ovan och skapar ett nytt. diff --git a/app/views/user_mailer/reset_password_instructions.text.erb b/app/views/user_mailer/reset_password_instructions.text.erb new file mode 100644 index 000000000..4fbef16ee --- /dev/null +++ b/app/views/user_mailer/reset_password_instructions.text.erb @@ -0,0 +1,9 @@ +<%= t 'devise.mailer.reset_password_instructions.title' %> + +=== + +<%= t 'devise.mailer.reset_password_instructions.explanation' %> + +=> <%= edit_password_url(@resource, reset_password_token: @token) %> + +<%= t 'devise.mailer.reset_password_instructions.extra' %> diff --git a/app/views/user_mailer/reset_password_instructions.th.text.erb b/app/views/user_mailer/reset_password_instructions.th.text.erb deleted file mode 100644 index fe73b0165..000000000 --- a/app/views/user_mailer/reset_password_instructions.th.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Hello <%= @resource.email %>! - -Someone has requested a link to change your password on Mastodon. You can do this through the link below. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -If you didn't request this, please ignore this email. -Your password won't change until you access the link above and create a new one. diff --git a/app/views/user_mailer/reset_password_instructions.tr.text.erb b/app/views/user_mailer/reset_password_instructions.tr.text.erb deleted file mode 100644 index a0b84b9a4..000000000 --- a/app/views/user_mailer/reset_password_instructions.tr.text.erb +++ /dev/null @@ -1,13 +0,0 @@ -Merhaba <%= @resource.email %> - -Biri <%= @instance %> üzerinden sizin hesabınız için parola değişim isteği gönderdi. Aşağıdaki linke tıklayarak bunu gerçekleştirebilirsiniz. - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -Eğer bu isteği siz göndermediyseniz, lütfen bu e-postayı görmezden geliniz. -Siz bu linke tıklayıp yeni bir parola girene kadar parolanız değişmeyecektir. - -En içten dileklerimizle, - -<%= @instance %> ekibi - diff --git a/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb b/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb deleted file mode 100644 index f7cd88847..000000000 --- a/app/views/user_mailer/reset_password_instructions.zh-cn.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -<%= @resource.email %>,你好呀! - -有人想修改你在 <%= @instance %> 上的密码呢。如果你确实想修改密码的话,点击下面的链接吧: - -<%= edit_password_url(@resource, reset_password_token: @token) %> - -如果你不想修改密码的话,还请忽略这封邮件哦。 -在你点击上面的链接并修改密码前,你的密码是不会改变的。 diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 9f17993e0..6b430b505 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -23,7 +23,7 @@ describe UserMailer, type: :mailer do it 'renders confirmation instructions' do receiver.update!(locale: nil) - expect(mail.body.encoded).to include receiver.email + expect(mail.body.encoded).to include I18n.t('devise.mailer.confirmation_instructions.title') expect(mail.body.encoded).to include 'spec' expect(mail.body.encoded).to include Rails.configuration.x.local_domain end @@ -38,7 +38,7 @@ describe UserMailer, type: :mailer do it 'renders reconfirmation instructions' do receiver.update!(email: 'new-email@example.com', locale: nil) - expect(mail.body.encoded).to include 'new-email@example.com' + expect(mail.body.encoded).to include I18n.t('devise.mailer.reconfirmation_instructions.title') expect(mail.body.encoded).to include 'spec' expect(mail.body.encoded).to include Rails.configuration.x.local_domain expect(mail.subject).to eq I18n.t('devise.mailer.reconfirmation_instructions.subject', @@ -52,7 +52,7 @@ describe UserMailer, type: :mailer do it 'renders reset password instructions' do receiver.update!(locale: nil) - expect(mail.body.encoded).to include receiver.email + expect(mail.body.encoded).to include I18n.t('devise.mailer.reset_password_instructions.title') expect(mail.body.encoded).to include 'spec' end @@ -65,7 +65,7 @@ describe UserMailer, type: :mailer do it 'renders password change notification' do receiver.update!(locale: nil) - expect(mail.body.encoded).to include receiver.email + expect(mail.body.encoded).to include I18n.t('devise.mailer.password_change.title') end include_examples 'localized subject', @@ -77,7 +77,7 @@ describe UserMailer, type: :mailer do it 'renders email change notification' do receiver.update!(locale: nil) - expect(mail.body.encoded).to include receiver.email + expect(mail.body.encoded).to include I18n.t('devise.mailer.email_changed.title') end include_examples 'localized subject', From 872a0d5bd801c998d911f7da582a60d2f714a710 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 20 Jan 2018 01:32:21 +0100 Subject: [PATCH 12/18] Improve HTML e-mails based on Litmus tests (#6301) * Use PNG images in HTML e-mails * Make webpack use URLs with host so fonts load inside HTML e-mails Convert this back to a relative URL in the premailer CSS loader since local requests are quicker * Improve responsive design * Add missing PNG icon --- app/javascript/images/mailer/icon_cached.png | Bin 0 -> 754 bytes app/javascript/images/mailer/icon_done.png | Bin 0 -> 279 bytes app/javascript/images/mailer/icon_email.png | Bin 0 -> 520 bytes app/javascript/images/mailer/icon_grade.png | Bin 0 -> 541 bytes .../images/mailer/icon_lock_open.png | Bin 0 -> 550 bytes .../images/mailer/icon_person_add.png | Bin 0 -> 512 bytes app/javascript/images/mailer/icon_reply.png | Bin 0 -> 391 bytes app/javascript/images/mailer/logo_full.png | Bin 0 -> 3052 bytes .../images/mailer/logo_transparent.png | Bin 0 -> 627 bytes app/javascript/styles/mailer.scss | 34 +++++++++++++++++- app/views/layouts/mailer.html.haml | 9 ++--- .../notification_mailer/favourite.html.haml | 2 +- .../notification_mailer/follow.html.haml | 2 +- .../follow_request.html.haml | 2 +- .../notification_mailer/mention.html.haml | 2 +- .../notification_mailer/reblog.html.haml | 2 +- .../confirmation_instructions.html.haml | 2 +- app/views/user_mailer/email_changed.html.haml | 2 +- .../user_mailer/password_change.html.haml | 2 +- .../reconfirmation_instructions.html.haml | 2 +- .../reset_password_instructions.html.haml | 2 +- app/views/user_mailer/welcome.html.haml | 12 +++---- config/webpack/configuration.js | 2 +- lib/mastodon/premailer_webpack_strategy.rb | 3 ++ 24 files changed, 56 insertions(+), 24 deletions(-) create mode 100644 app/javascript/images/mailer/icon_cached.png create mode 100644 app/javascript/images/mailer/icon_done.png create mode 100644 app/javascript/images/mailer/icon_email.png create mode 100644 app/javascript/images/mailer/icon_grade.png create mode 100644 app/javascript/images/mailer/icon_lock_open.png create mode 100644 app/javascript/images/mailer/icon_person_add.png create mode 100644 app/javascript/images/mailer/icon_reply.png create mode 100644 app/javascript/images/mailer/logo_full.png create mode 100644 app/javascript/images/mailer/logo_transparent.png diff --git a/app/javascript/images/mailer/icon_cached.png b/app/javascript/images/mailer/icon_cached.png new file mode 100644 index 0000000000000000000000000000000000000000..e62c064c837a38e059c578c3702259d80f389385 GIT binary patch literal 754 zcmV}Bt(6Kk5o{C- z1q)jd(G-H#>BLG1Scr`X7J?v%AtG2=szHc}2tg1@{39YU9*cEBhS}Yjoz2dE-OhXW zyZ7uH?l5;CgVb^LlX_nrNLk;bF4{RwWvROn&{)Foo*Icg+d2%jPz30h`a8w+TFTy| z>T*{@S-qvc)G_^|o=l0k*tJmVCUvHX@sfHlCHB^;Bjtrs`_##d=JV=sf%sOH8)_nF zf){Fk!eg_|Pr8U2LM6M{1>i=mf1#>75pg!*wFcPQf>%u=z*L>J#faG0)ImLBvF>%H z06XtWN@ibz+YL^NDNAz?+EpU9>QD2k@@W za>JJ13lI@+>lm*z$oncHW;0jWK~>5wU^UcRb^&THuovh{EDfh@uc=2pkaB$~BBo1) zQhR`>z@eO>gTTu=o;SOL`(yx zfJTpxEcynFM#SgRp#UP{F>tkj#R_mbB3?tWmOi2u2!&3*Xg+()9VpkoqBG{PSddH$bW0Ny)ok{m~?DPTi6V zsDn_dms4_|usR}0(|22a!|otd>U=}Jo^@|GLaBaJM-utN>IaGcHP$lFKhvoWLM^I$ kQfe4bA6T91k7ud-FFp|C^Xe=vvH$=807*qoM6N<$f?mi~w*UYD literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer/icon_done.png b/app/javascript/images/mailer/icon_done.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2ef0cb87e34633a142ceda4651308421315514 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq zgi1h|@m`vI1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWIY$o-U3d z5v^}8Y~*S-5OI6>#%USHz9#SG=W6q=Tb1~?*|lu`{c_Tyr5;@Z`3v@@Py7A%nC0nB z{}dOnuhad=vgW{AR=JzAwtQ6i!2W>O{Ev@K*x^QQ17>IL8kT7_I!p^ctPXR>4C*VHtv1`8$tDHL# zu^thonrCO|LN+Kz>biO(+kdS7>S4(KsB>A~b@iQkm}!>k3?z2dRW&M2TYahS7qkcJ zTlHF2^O?F+(DrN~v8B#r+S}^JIrcAXAf52F+Rk#8)#WU1SDJ>15kkHA#sR@3@Z{ zIbmR|yHF2I1D~yi)N06pFTmaN7Hic@iUhC%JgMUUe_}&0km$Q{;;cX6$mnMV8Ut6? zz`qgp-6{pvN#6HL}phZhA&$H0000< KMNUMnLSTZd&)@O@ literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer/icon_grade.png b/app/javascript/images/mailer/icon_grade.png new file mode 100644 index 0000000000000000000000000000000000000000..895b57d0a479cd084589866a6d48d346b8a23a95 GIT binary patch literal 541 zcmV+&0^O$%V7+Tm&7(E`W;Z9ZPUhj3m}z4crtY1Y%L zJOK&doUgh7YO4V-9ui*ASh;>BiGhTqw4~PHY7g!+5q`@+r=+Z;o8X?6bZd-x4Qnt~ zU`o=uq#i5Sgf)4H0*Is&Npr@Shp$!81)N5VIIhls?r2nK2KIj-{18aH%`5+t*{Wdp zE>Qn{@@EJGtN?E@!`A@+vjj{7PaeT9z=C&h5yY?uz_5$A>nhH9a6eWOV8{c&smB#y z&;!7!=iAdsekI>YYAO@pUQ$b`67V8=2%0D2;7yMaBce!CI?S3m}s!f~SkBfuqa9XGrKShdGpMsF(U f?T7{OuRpJMtFr%gO(CSK00000NkvXXu0mjfD1+c9 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer/icon_lock_open.png b/app/javascript/images/mailer/icon_lock_open.png new file mode 100644 index 0000000000000000000000000000000000000000..9f62eadc2fa86656f7279d67ba79aebdac9531e5 GIT binary patch literal 550 zcmV+>0@?kEP)JUr%(1;OZ`qp&}jt9Z`x`p%PKh zD1{f`cK$^oQBt6%aQzf!WiC6+u3cOBlFgo(IeWfu=FHBXl`4kic?cMjG$U!mbzMu^ zH?ymvgoTLvfF0nKuXqKvf!;F7&pwgfyUWLEDI(m=6C42J-q-|i=#6g`O+Mx=`vK6N z;?oWsdFdD}Qoy=5yYX-QYM$R(OzgHu4MXn!U}l#gCo?;j^yr$yk+F*faN|~BH^x79 z1xiClXaMMtG%cw=W6Umh9|UG4-AOtzvzO=yKo8JJIc)Oc1n5rV3Z-C0Qa#JGf54Qa z<+OoN3TmD`_e=6*Gfrj^@Ub#xw)Y!$AThrjUM)mbp>hGi*YGC*HAxGuxnX7(ew2SwU1yY zK7rPvkiyPdD-jec5g$No)I<}A5dxn@b|u8@&m_Cp9q5+cBu zq-{yF-q5|IGc$WjLO;rU6R7c*PhdT5^Ch6w!`!C@ET&~{z*C61&m-Wr)xaK52Ff8d zr5NTu(?L4ffbls=QTsO;{VTsrNqXotG2$T7&4)v6HE3dx0JoCrG3siP?t&(>QhU$U zUUr{(|E0SR%xuGZegTJ)_9Frum{~Kl!fUu#bbXfrPD9F1fJ{Wd{sVa58n6Rg0d?A! z(j~Bk>+$Oqs4oEr25G`X2)YNH07fN^ODcLp&yrrutddFqATMc6(z2ulNriyAS4r2B zE+n0s*?T{Joq`jFGn+mYvYCZ!r5-|5^03|8@DcF^i zb6m7Aa-L@F0Qm&XeF`oCQX}p$yh*`34b34#-1z}{sb_xetc)c90000x(${t6;t)+@QcPhWt^P)DJlK??Mzlyb;TCzopr0MCGt!2kdN literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer/logo_full.png b/app/javascript/images/mailer/logo_full.png new file mode 100644 index 0000000000000000000000000000000000000000..1c4f332872011decb9658a01e0d4d9e26500485d GIT binary patch literal 3052 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 N002ovPDHLkV1nMp2l4;_ literal 0 HcmV?d00001 diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss index b3bcc9209..dbe070f9a 100644 --- a/app/javascript/styles/mailer.scss +++ b/app/javascript/styles/mailer.scss @@ -17,7 +17,7 @@ body { -ms-text-size-adjust: 100%; } -.email_body { +.email-body { td, div, a, @@ -235,6 +235,12 @@ h5 { color: lighten($ui-base-color, 34%); } +.input-cell { + h5 { + margin-top: 4px; + } +} + .input { td { background: darken($ui-base-color, 8%); @@ -512,3 +518,29 @@ ul { min-height: 1024px !important; } } + +@media (max-width: 697px) { + .email-container, + .col-1, + .col-2, + .col-3, + .col-4, + .col-5, + .col-6 { + width: 100% !important; + max-width: none !important; + } + + .email-start { + padding-top: 16px !important; + } + + .email-end { + padding-bottom: 16px !important; + } + + .padded { + padding-left: 0 !important; + padding-right: 0 !important; + } +} diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index e41b91069..6687546fb 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -24,7 +24,7 @@ %tr %td.column-cell = link_to root_url do - = image_tag full_pack_url('logo_full.svg'), alt: 'Mastodon', height: 34, class: 'logo' + = image_tag full_pack_url('logo_full.png'), alt: 'Mastodon', height: 34, class: 'logo' = yield @@ -41,15 +41,12 @@ %tr %td.blank-cell.footer .email-row - .col-4 + .col-6 %table.column{ cellspacing: 0, cellpadding: 0 } %tbody %td.column-cell %p= t 'about.hosted_on', domain: site_hostname %p= link_to t('application_mailer.notification_preferences'), settings_notifications_url - .col-2 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody %td.column-cell.text-right = link_to root_url do - = image_tag full_pack_url('logo_transparent.svg'), alt: 'Mastodon', height: 24 + = image_tag full_pack_url('logo_transparent.png'), alt: 'Mastodon', height: 24 diff --git a/app/views/notification_mailer/favourite.html.haml b/app/views/notification_mailer/favourite.html.haml index f26b08b18..7d1b494d0 100644 --- a/app/views/notification_mailer/favourite.html.haml +++ b/app/views/notification_mailer/favourite.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_grade.svg'), alt:'' + = image_tag full_pack_url('icon_grade.png'), alt:'' %h1= t 'notification_mailer.favourite.title' %p.lead= t('notification_mailer.favourite.body', name: @account.acct) diff --git a/app/views/notification_mailer/follow.html.haml b/app/views/notification_mailer/follow.html.haml index 1290e2bc4..31a2b7445 100644 --- a/app/views/notification_mailer/follow.html.haml +++ b/app/views/notification_mailer/follow.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_person_add.svg'), alt: '' + = image_tag full_pack_url('icon_person_add.png'), alt: '' %h1= t 'notification_mailer.follow.title' %p.lead= t('notification_mailer.follow.body', name: @account.acct) diff --git a/app/views/notification_mailer/follow_request.html.haml b/app/views/notification_mailer/follow_request.html.haml index 41efeafaf..44f1911c4 100644 --- a/app/views/notification_mailer/follow_request.html.haml +++ b/app/views/notification_mailer/follow_request.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_person_add.svg'), alt: '' + = image_tag full_pack_url('icon_person_add.png'), alt: '' %h1= t 'notification_mailer.follow_request.title' %p.lead= t('notification_mailer.follow_request.body', name: @account.acct) diff --git a/app/views/notification_mailer/mention.html.haml b/app/views/notification_mailer/mention.html.haml index 619c580ce..479fed41c 100644 --- a/app/views/notification_mailer/mention.html.haml +++ b/app/views/notification_mailer/mention.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_reply.svg'), alt: '' + = image_tag full_pack_url('icon_reply.png'), alt: '' %h1= t 'notification_mailer.mention.title' %p.lead= t('notification_mailer.mention.body', name: @status.account.acct) diff --git a/app/views/notification_mailer/reblog.html.haml b/app/views/notification_mailer/reblog.html.haml index 61c6ee6be..85b202cf9 100644 --- a/app/views/notification_mailer/reblog.html.haml +++ b/app/views/notification_mailer/reblog.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_cached.svg'), alt: '' + = image_tag full_pack_url('icon_cached.png'), alt: '' %h1= t 'notification_mailer.reblog.title' %p.lead= t('notification_mailer.reblog.body', name: @account.acct) diff --git a/app/views/user_mailer/confirmation_instructions.html.haml b/app/views/user_mailer/confirmation_instructions.html.haml index 0f999bcbc..1f088a16f 100644 --- a/app/views/user_mailer/confirmation_instructions.html.haml +++ b/app/views/user_mailer/confirmation_instructions.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_email.svg'), alt: '' + = image_tag full_pack_url('icon_email.png'), alt: '' %h1= t 'devise.mailer.confirmation_instructions.title' diff --git a/app/views/user_mailer/email_changed.html.haml b/app/views/user_mailer/email_changed.html.haml index 45dc06650..7e82f23e4 100644 --- a/app/views/user_mailer/email_changed.html.haml +++ b/app/views/user_mailer/email_changed.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_email.svg'), alt: '' + = image_tag full_pack_url('icon_email.png'), alt: '' %h1= t 'devise.mailer.email_changed.title' %p.lead= t 'devise.mailer.email_changed.explanation' diff --git a/app/views/user_mailer/password_change.html.haml b/app/views/user_mailer/password_change.html.haml index 2e9377dff..26314a217 100644 --- a/app/views/user_mailer/password_change.html.haml +++ b/app/views/user_mailer/password_change.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_lock_open.svg'), alt: '' + = image_tag full_pack_url('icon_lock_open.png'), alt: '' %h1= t 'devise.mailer.password_change.title' %p.lead= t 'devise.mailer.password_change.explanation' diff --git a/app/views/user_mailer/reconfirmation_instructions.html.haml b/app/views/user_mailer/reconfirmation_instructions.html.haml index 3ae226093..e3be8e295 100644 --- a/app/views/user_mailer/reconfirmation_instructions.html.haml +++ b/app/views/user_mailer/reconfirmation_instructions.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_email.svg'), alt: '' + = image_tag full_pack_url('icon_email.png'), alt: '' %h1= t 'devise.mailer.reconfirmation_instructions.title' %p.lead= t 'devise.mailer.reconfirmation_instructions.explanation' diff --git a/app/views/user_mailer/reset_password_instructions.html.haml b/app/views/user_mailer/reset_password_instructions.html.haml index c0e6775d4..5d9ce6a75 100644 --- a/app/views/user_mailer/reset_password_instructions.html.haml +++ b/app/views/user_mailer/reset_password_instructions.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_lock_open.svg'), alt: '' + = image_tag full_pack_url('icon_lock_open.png'), alt: '' %h1= t 'devise.mailer.reset_password_instructions.title' %p.lead= t 'devise.mailer.reset_password_instructions.explanation' diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml index 0823efa1a..d734da67d 100644 --- a/app/views/user_mailer/welcome.html.haml +++ b/app/views/user_mailer/welcome.html.haml @@ -17,7 +17,7 @@ %tbody %tr %td - = image_tag full_pack_url('icon_done.svg'), alt: '' + = image_tag full_pack_url('icon_done.png'), alt: '' %h1= t 'user_mailer.welcome.title', name: @resource.account.username %p.lead= t 'user_mailer.welcome.explanation' @@ -30,7 +30,7 @@ %table.content-section{ cellspacing: 0, cellpadding: 0 } %tbody %tr - %td.content-cell + %td.content-cell.content-start .email-row .col-3 %table.column{ cellspacing: 0, cellpadding: 0 } @@ -46,7 +46,7 @@ %table.column{ cellspacing: 0, cellpadding: 0 } %tbody %tr - %td.column-cell.content-start + %td.column-cell %p= t 'user_mailer.welcome.full_handle_hint', instance: @instance %table.email-table{ cellspacing: 0, cellpadding: 0 } @@ -69,7 +69,7 @@ %table.column{ cellspacing: 0, cellpadding: 0 } %tbody %tr - %td.column-cell + %td.column-cell.padded %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } %tbody %tr @@ -89,7 +89,7 @@ %table.column{ cellspacing: 0, cellpadding: 0 } %tbody %tr - %td.column-cell + %td.column-cell.padded %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } %tbody %tr @@ -109,7 +109,7 @@ %table.column{ cellspacing: 0, cellpadding: 0 } %tbody %tr - %td.column-cell + %td.column-cell.padded %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } %tbody %tr diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 822329490..26747e76b 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -27,7 +27,7 @@ function formatPublicPath(host = '', path = '') { const output = { path: resolve('public', settings.public_output_path), - publicPath: formatPublicPath(env.ASSET_HOST, settings.public_output_path), + publicPath: formatPublicPath(env.ASSET_HOST || env.LOCAL_DOMAIN, settings.public_output_path), }; module.exports = { diff --git a/lib/mastodon/premailer_webpack_strategy.rb b/lib/mastodon/premailer_webpack_strategy.rb index 4ea3ce80c..84d83cc66 100644 --- a/lib/mastodon/premailer_webpack_strategy.rb +++ b/lib/mastodon/premailer_webpack_strategy.rb @@ -2,6 +2,9 @@ module PremailerWebpackStrategy def load(url) + public_path_host = ENV['ASSET_HOST'] || ENV['LOCAL_DOMAIN'] + url = url.gsub(/\A\/\/#{public_path_host}/, '') + if Webpacker.dev_server.running? url = File.join("#{Webpacker.dev_server.protocol}://#{Webpacker.dev_server.host_with_port}", url) HTTP.get(url).to_s From 79b34a0fa2e993967f22892b857dcf601c07bd88 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 20 Jan 2018 01:32:37 +0100 Subject: [PATCH 13/18] Restore onboarding modal (#6303) * Restore onboarding modal Revert 5ba8b3a396895ecec083c5258aaf9084d584a7c4 * Change greeting elephant graphic, fix up some design issues * Fix wrong link color in onboarding modal --- .../images/elephant_ui_greeting.svg | 1 + app/javascript/mastodon/actions/onboarding.js | 14 + .../mastodon/containers/mastodon.js | 3 + .../features/ui/components/modal_root.js | 2 + .../ui/components/onboarding_modal.js | 324 +++++++++++++++++ .../features/ui/util/async-components.js | 4 + app/javascript/mastodon/locales/en.json | 2 +- .../styles/mastodon/components.scss | 333 +++++++++++++++++- 8 files changed, 679 insertions(+), 4 deletions(-) create mode 100644 app/javascript/images/elephant_ui_greeting.svg create mode 100644 app/javascript/mastodon/actions/onboarding.js create mode 100644 app/javascript/mastodon/features/ui/components/onboarding_modal.js diff --git a/app/javascript/images/elephant_ui_greeting.svg b/app/javascript/images/elephant_ui_greeting.svg new file mode 100644 index 000000000..f3eb4b142 --- /dev/null +++ b/app/javascript/images/elephant_ui_greeting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/mastodon/actions/onboarding.js b/app/javascript/mastodon/actions/onboarding.js new file mode 100644 index 000000000..a161c50ef --- /dev/null +++ b/app/javascript/mastodon/actions/onboarding.js @@ -0,0 +1,14 @@ +import { openModal } from './modal'; +import { changeSetting, saveSettings } from './settings'; + +export function showOnboardingOnce() { + return (dispatch, getState) => { + const alreadySeen = getState().getIn(['settings', 'onboarded']); + + if (!alreadySeen) { + dispatch(openModal('ONBOARDING')); + dispatch(changeSetting(['onboarded'], true)); + dispatch(saveSettings()); + } + }; +}; diff --git a/app/javascript/mastodon/containers/mastodon.js b/app/javascript/mastodon/containers/mastodon.js index 8ae3b727a..d1710445b 100644 --- a/app/javascript/mastodon/containers/mastodon.js +++ b/app/javascript/mastodon/containers/mastodon.js @@ -2,6 +2,7 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; import configureStore from '../store/configureStore'; +import { showOnboardingOnce } from '../actions/onboarding'; import { BrowserRouter, Route } from 'react-router-dom'; import { ScrollContext } from 'react-router-scroll-4'; import UI from '../features/ui'; @@ -39,6 +40,8 @@ export default class Mastodon extends React.PureComponent { const handlerUrl = window.location.protocol + '//' + window.location.host + '/intent?uri=%s'; window.setTimeout(() => navigator.registerProtocolHandler('web+mastodon', handlerUrl, 'Mastodon'), 5 * 60 * 1000); } + + store.dispatch(showOnboardingOnce()); } componentWillUnmount () { diff --git a/app/javascript/mastodon/features/ui/components/modal_root.js b/app/javascript/mastodon/features/ui/components/modal_root.js index dbfb46ee7..5839ba40a 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.js +++ b/app/javascript/mastodon/features/ui/components/modal_root.js @@ -9,6 +9,7 @@ import VideoModal from './video_modal'; import BoostModal from './boost_modal'; import ConfirmationModal from './confirmation_modal'; import { + OnboardingModal, MuteModal, ReportModal, EmbedModal, @@ -17,6 +18,7 @@ import { const MODAL_COMPONENTS = { 'MEDIA': () => Promise.resolve({ default: MediaModal }), + 'ONBOARDING': OnboardingModal, 'VIDEO': () => Promise.resolve({ default: VideoModal }), 'BOOST': () => Promise.resolve({ default: BoostModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), diff --git a/app/javascript/mastodon/features/ui/components/onboarding_modal.js b/app/javascript/mastodon/features/ui/components/onboarding_modal.js new file mode 100644 index 000000000..9b713cf9e --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/onboarding_modal.js @@ -0,0 +1,324 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import ReactSwipeableViews from 'react-swipeable-views'; +import classNames from 'classnames'; +import Permalink from '../../../components/permalink'; +import ComposeForm from '../../compose/components/compose_form'; +import Search from '../../compose/components/search'; +import NavigationBar from '../../compose/components/navigation_bar'; +import ColumnHeader from './column_header'; +import { List as ImmutableList } from 'immutable'; +import { me } from '../../../initial_state'; + +const noop = () => { }; + +const messages = defineMessages({ + home_title: { id: 'column.home', defaultMessage: 'Home' }, + notifications_title: { id: 'column.notifications', defaultMessage: 'Notifications' }, + local_title: { id: 'column.community', defaultMessage: 'Local timeline' }, + federated_title: { id: 'column.public', defaultMessage: 'Federated timeline' }, +}); + +const PageOne = ({ acct, domain }) => ( +
+
+

+

+
+ +
+
+
+ +
+ +
+ @{acct}@{domain} +
+
+ +

+
+
+); + +PageOne.propTypes = { + acct: PropTypes.string.isRequired, + domain: PropTypes.string.isRequired, +}; + +const PageTwo = ({ myAccount }) => ( +
+
+
+ + + +
+
+ +

+
+); + +PageTwo.propTypes = { + myAccount: ImmutablePropTypes.map.isRequired, +}; + +const PageThree = ({ myAccount }) => ( +
+
+ + +
+ +
+
+ +

#illustration, introductions: #introductions }} />

+

+
+); + +PageThree.propTypes = { + myAccount: ImmutablePropTypes.map.isRequired, +}; + +const PageFour = ({ domain, intl }) => ( +
+
+
+
+
+

+
+ +
+
+

+
+
+ +
+
+
+
+ +
+
+
+
+ +

+
+
+); + +PageFour.propTypes = { + domain: PropTypes.string.isRequired, + intl: PropTypes.object.isRequired, +}; + +const PageSix = ({ admin, domain }) => { + let adminSection = ''; + + if (admin) { + adminSection = ( +
+ ); + } + + return ( +
+

+ {adminSection} +

GitHub }} />

+

}} />

+

+
+ ); +}; + +PageSix.propTypes = { + admin: ImmutablePropTypes.map, + domain: PropTypes.string.isRequired, +}; + +const mapStateToProps = state => ({ + myAccount: state.getIn(['accounts', me]), + admin: state.getIn(['accounts', state.getIn(['meta', 'admin'])]), + domain: state.getIn(['meta', 'domain']), +}); + +@connect(mapStateToProps) +@injectIntl +export default class OnboardingModal extends React.PureComponent { + + static propTypes = { + onClose: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, + myAccount: ImmutablePropTypes.map.isRequired, + domain: PropTypes.string.isRequired, + admin: ImmutablePropTypes.map, + }; + + state = { + currentIndex: 0, + }; + + componentWillMount() { + const { myAccount, admin, domain, intl } = this.props; + this.pages = [ + , + , + , + , + , + ]; + }; + + componentDidMount() { + window.addEventListener('keyup', this.handleKeyUp); + } + + componentWillUnmount() { + window.addEventListener('keyup', this.handleKeyUp); + } + + handleSkip = (e) => { + e.preventDefault(); + this.props.onClose(); + } + + handleDot = (e) => { + const i = Number(e.currentTarget.getAttribute('data-index')); + e.preventDefault(); + this.setState({ currentIndex: i }); + } + + handlePrev = () => { + this.setState(({ currentIndex }) => ({ + currentIndex: Math.max(0, currentIndex - 1), + })); + } + + handleNext = () => { + const { pages } = this; + this.setState(({ currentIndex }) => ({ + currentIndex: Math.min(currentIndex + 1, pages.length - 1), + })); + } + + handleSwipe = (index) => { + this.setState({ currentIndex: index }); + } + + handleKeyUp = ({ key }) => { + switch (key) { + case 'ArrowLeft': + this.handlePrev(); + break; + case 'ArrowRight': + this.handleNext(); + break; + } + } + + handleClose = () => { + this.props.onClose(); + } + + render () { + const { pages } = this; + const { currentIndex } = this.state; + const hasMore = currentIndex < pages.length - 1; + + const nextOrDoneBtn = hasMore ? ( + + ) : ( + + ); + + return ( +
+ + {pages.map((page, i) => { + const className = classNames('onboarding-modal__page__wrapper', `onboarding-modal__page__wrapper-${i}`, { + 'onboarding-modal__page__wrapper--active': i === currentIndex, + }); + + return ( +
{page}
+ ); + })} +
+ +
+
+ +
+ +
+ {pages.map((_, i) => { + const className = classNames('onboarding-modal__dot', { + active: i === currentIndex, + }); + + return ( +
+ ); + })} +
+ +
+ {nextOrDoneBtn} +
+
+
+ ); + } + +} diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index a03c4cefd..d6586680b 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -94,6 +94,10 @@ export function Mutes () { return import(/* webpackChunkName: "features/mutes" */'../../mutes'); } +export function OnboardingModal () { + return import(/* webpackChunkName: "modals/onboarding_modal" */'../components/onboarding_modal'); +} + export function MuteModal () { return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal'); } diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index d214fe85f..8315763bf 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -174,7 +174,7 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.handle": "Your full handle is {handle}. This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index c0a32ed05..4a9a379a8 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1419,6 +1419,10 @@ color: $primary-text-color; } + a { + color: inherit; + } + .permalink { text-decoration: none; } @@ -2760,6 +2764,7 @@ flex: 1 1 auto; align-items: center; justify-content: center; + @supports(display: grid) { // hack to fix Chrome <57 contain: strict; } @@ -2805,11 +2810,48 @@ } } -.pulse-loading { +.no-reduce-motion .pulse-loading { transform-origin: center center; animation: heartbeat 1.5s ease-in-out infinite both; } +@keyframes shake-bottom { + 0%, + 100% { + transform: rotate(0deg); + transform-origin: 50% 100%; + } + + 10% { + transform: rotate(2deg); + } + + 20%, + 40%, + 60% { + transform: rotate(-4deg); + } + + 30%, + 50%, + 70% { + transform: rotate(4deg); + } + + 80% { + transform: rotate(-2deg); + } + + 90% { + transform: rotate(2deg); + } +} + +.no-reduce-motion .shake-bottom { + transform-origin: 50% 100%; + animation: shake-bottom 0.8s cubic-bezier(0.455, 0.030, 0.515, 0.955) 2s 2 both; +} + .emoji-picker-dropdown__menu { background: $simple-background-color; position: absolute; @@ -3300,6 +3342,7 @@ z-index: 100; } +.onboarding-modal, .error-modal, .embed-modal { background: $ui-secondary-color; @@ -3310,6 +3353,25 @@ flex-direction: column; } +.onboarding-modal__pager { + height: 80vh; + width: 80vw; + max-width: 520px; + max-height: 470px; + + .react-swipeable-view-container > div { + width: 100%; + height: 100%; + box-sizing: border-box; + display: none; + flex-direction: column; + align-items: center; + justify-content: center; + display: flex; + user-select: text; + } +} + .error-modal__body { height: 80vh; width: 80vw; @@ -3343,6 +3405,23 @@ text-align: center; } +@media screen and (max-width: 550px) { + .onboarding-modal { + width: 100%; + height: 100%; + border-radius: 0; + } + + .onboarding-modal__pager { + width: 100%; + height: auto; + max-width: none; + max-height: none; + flex: 1 1 auto; + } +} + +.onboarding-modal__paginator, .error-modal__footer { flex: 0 0 auto; background: darken($ui-secondary-color, 8%); @@ -3353,20 +3432,35 @@ min-width: 33px; } + .onboarding-modal__nav, .error-modal__nav { color: darken($ui-secondary-color, 34%); - background-color: transparent; border: 0; font-size: 14px; font-weight: 500; - padding: 0; + padding: 10px 25px; line-height: inherit; height: auto; + margin: -10px; + border-radius: 4px; + background-color: transparent; &:hover, &:focus, &:active { color: darken($ui-secondary-color, 38%); + background-color: darken($ui-secondary-color, 16%); + } + + &.onboarding-modal__done, + &.onboarding-modal__next { + color: $ui-base-color; + + &:hover, + &:focus, + &:active { + color: darken($ui-base-color, 4%); + } } } } @@ -3375,6 +3469,239 @@ justify-content: center; } +.onboarding-modal__dots { + flex: 1 1 auto; + display: flex; + align-items: center; + justify-content: center; +} + +.onboarding-modal__dot { + width: 14px; + height: 14px; + border-radius: 14px; + background: darken($ui-secondary-color, 16%); + margin: 0 3px; + cursor: pointer; + + &:hover { + background: darken($ui-secondary-color, 18%); + } + + &.active { + cursor: default; + background: darken($ui-secondary-color, 24%); + } +} + +.onboarding-modal__page__wrapper { + pointer-events: none; + padding: 25px; + padding-bottom: 0; + + &.onboarding-modal__page__wrapper--active { + pointer-events: auto; + } +} + +.onboarding-modal__page { + cursor: default; + line-height: 21px; + + h1 { + font-size: 18px; + font-weight: 500; + color: $ui-base-color; + margin-bottom: 20px; + } + + a { + color: $ui-highlight-color; + + &:hover, + &:focus, + &:active { + color: lighten($ui-highlight-color, 4%); + } + } + + .navigation-bar a { + color: inherit; + } + + p { + font-size: 16px; + color: lighten($ui-base-color, 8%); + margin-top: 10px; + margin-bottom: 10px; + + &:last-child { + margin-bottom: 0; + } + + strong { + font-weight: 500; + background: $ui-base-color; + color: $ui-secondary-color; + border-radius: 4px; + font-size: 14px; + padding: 3px 6px; + + @each $lang in $cjk-langs { + &:lang(#{$lang}) { + font-weight: 700; + } + } + } + } +} + +.onboarding-modal__page__wrapper-0 { + background: url('../images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px; + height: 100%; + padding: 0; +} + +.onboarding-modal__page-one { + &__lead { + padding: 65px; + padding-top: 45px; + padding-bottom: 0; + margin-bottom: 10px; + + h1 { + font-size: 26px; + line-height: 36px; + margin-bottom: 8px; + } + + p { + margin-bottom: 0; + } + } + + &__extra { + padding-right: 65px; + padding-left: 185px; + text-align: center; + } +} + +.display-case { + text-align: center; + font-size: 15px; + margin-bottom: 15px; + + &__label { + font-weight: 500; + color: $ui-base-color; + margin-bottom: 5px; + text-transform: uppercase; + font-size: 12px; + } + + &__case { + background: $ui-base-color; + color: $ui-secondary-color; + font-weight: 500; + padding: 10px; + border-radius: 4px; + } +} + +.onboarding-modal__page-two, +.onboarding-modal__page-three, +.onboarding-modal__page-four, +.onboarding-modal__page-five { + p { + text-align: left; + } + + .figure { + background: darken($ui-base-color, 8%); + color: $ui-secondary-color; + margin-bottom: 20px; + border-radius: 4px; + padding: 10px; + text-align: center; + font-size: 14px; + box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3); + + .onboarding-modal__image { + border-radius: 4px; + margin-bottom: 10px; + } + + &.non-interactive { + pointer-events: none; + text-align: left; + } + } +} + +.onboarding-modal__page-four__columns { + .row { + display: flex; + margin-bottom: 20px; + + & > div { + flex: 1 1 0; + margin: 0 10px; + + &:first-child { + margin-left: 0; + } + + &:last-child { + margin-right: 0; + } + + p { + text-align: center; + } + } + + &:last-child { + margin-bottom: 0; + } + } + + .column-header { + color: $primary-text-color; + } +} + +@media screen and (max-width: 320px) and (max-height: 600px) { + .onboarding-modal__page p { + font-size: 14px; + line-height: 20px; + } + + .onboarding-modal__page-two .figure, + .onboarding-modal__page-three .figure, + .onboarding-modal__page-four .figure, + .onboarding-modal__page-five .figure { + font-size: 12px; + margin-bottom: 10px; + } + + .onboarding-modal__page-four__columns .row { + margin-bottom: 10px; + } + + .onboarding-modal__page-four__columns .column-header { + padding: 5px; + font-size: 12px; + } +} + +.onboard-sliders { + display: inline-block; + max-width: 30px; + max-height: auto; + margin-left: 10px; +} + .boost-modal, .confirmation-modal, .report-modal, From 45afdf1781dcd8d9e51fe23fa210dc53bbc72f71 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 20 Jan 2018 03:49:06 +0100 Subject: [PATCH 14/18] Fix #6269 - Render LOCAL_DOMAIN as unicode in presentational views (#6305) --- app/helpers/instance_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/instance_helper.rb b/app/helpers/instance_helper.rb index 70027cca9..22a19c52b 100644 --- a/app/helpers/instance_helper.rb +++ b/app/helpers/instance_helper.rb @@ -6,6 +6,6 @@ module InstanceHelper end def site_hostname - Rails.configuration.x.local_domain + @site_hostname ||= Addressable::URI.parse("//#{Rails.configuration.x.local_domain}").display_uri.host end end From 80b3ca0f6f2d0c545487d36b88ccbb792761a0e5 Mon Sep 17 00:00:00 2001 From: SerCom_KC Date: Sat, 20 Jan 2018 23:11:21 +0800 Subject: [PATCH 15/18] Update Simplified Chinese translations (#6306) * i18n: (zh-CN) Add translations of #6251 * i18n: (zh-CN) Improve translations for #6291 * Fix en.json * i18n: (zh-CN) Update translations for #6303 * i18n: (zh-CN) Add translations of #6273 with minor adjustment * Minor fix * Minor fix --- app/javascript/mastodon/locales/en.json | 3 ++- app/javascript/mastodon/locales/zh-CN.json | 6 +++++- config/locales/devise.zh-CN.yml | 6 +++--- config/locales/zh-CN.yml | 21 ++++++++++++++++++++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 8315763bf..02d12677a 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -174,7 +174,8 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "Your full handle is {handle}. This is what you would tell your friends to search for.", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index b6435a260..a02211b8a 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -139,6 +139,7 @@ "loading_indicator.label": "加载中……", "media_gallery.toggle_visible": "切换显示/隐藏", "missing_indicator.label": "找不到内容", + "missing_indicator.sublabel": "无法找到此资源", "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知", "navigation_bar.blocks": "被屏蔽的用户", "navigation_bar.community_timeline": "本站时间轴", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "你的“主页”时间轴上显示的是你的关注对象所发布的嘟文。", "onboarding.page_four.notifications": "如果有人与你互动了,他们就会出现在“通知”栏中哦~", "onboarding.page_one.federation": "Mastodon 是由一系列独立的服务器共同打造的强大的社交网络,我们将这些各自独立而又相互连接的服务器叫做“实例”。", - "onboarding.page_one.handle": "你是在 {domain} 上注册的,所以你的完整用户地址是 {handle}。", + "onboarding.page_one.full_handle": "你的完整用户地址", + "onboarding.page_one.handle_hint": "你的朋友们需要这个才能通过搜索功能找到你。", "onboarding.page_one.welcome": "欢迎来到 Mastodon!", "onboarding.page_six.admin": "{admin} 是你所在服务器实例的管理员。", "onboarding.page_six.almost_done": "差不多了……", @@ -197,6 +199,8 @@ "privacy.public.short": "公开", "privacy.unlisted.long": "所有人可见,但不会出现在公共时间轴上", "privacy.unlisted.short": "不公开", + "regeneration_indicator.label": "加载中……", + "regeneration_indicator.sublabel": "你的主页时间轴正在准备中!", "relative_time.days": "{number}天", "relative_time.hours": "{number}时", "relative_time.just_now": "刚刚", diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml index dd6b48795..4ee021fcc 100644 --- a/config/locales/devise.zh-CN.yml +++ b/config/locales/devise.zh-CN.yml @@ -18,7 +18,7 @@ zh-CN: mailer: confirmation_instructions: action: 验证电子邮件地址 - explanation: 你在 %{host} 上使用这个电子邮件地址创建了一个帐户。只需点击下面的按钮,即可完成激活。如果你并没有创建过帐户,请忽略此邮件。 + explanation: 你在 %{host} 上使用这个电子邮件地址创建了一个帐户。只需点击下面的链接,即可完成激活。如果你并没有创建过帐户,请忽略此邮件。 extra_html: 请记得阅读本实例的相关规定我们的使用条款。 subject: Mastodon:确认 %{instance} 帐户信息 title: 验证电子邮件地址 @@ -33,13 +33,13 @@ zh-CN: subject: Mastodon:密码已被更改 title: 密码已被重置 reconfirmation_instructions: - explanation: 请确认你的新电子邮件地址以完成更改。 + explanation: 点击下面的链接来确认你的新电子邮件地址。 extra: 如果你并没有请求本次变更,请忽略此邮件。Mastodon 帐户的电子邮件地址只有在你点击上面的链接后才会更改。 subject: Mastodon:确认 %{instance} 电子邮件地址 title: 验证电子邮件地址 reset_password_instructions: action: 更改密码 - explanation: 你正在请求更改帐户的密码。 + explanation: 点击下面的链接来更改帐户的密码。 extra: 如果你并没有请求本次变更,请忽略此邮件。你的密码只有在你点击上面的链接并输入新密码后才会更改。 subject: Mastodon:重置密码信息 title: 重置密码 diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 25cfe5a8a..7deb241a1 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -591,7 +591,7 @@ zh-CN: back: 回到 Mastodon delete: 删除帐户 development: 开发 - edit_profile: 更改个人信息 + edit_profile: 更改个人资料 export: 导出 followers: 已授权的关注者 import: 导入 @@ -712,6 +712,25 @@ zh-CN: recovery_instructions_html: 如果你的手机无法使用,你可以使用下列任意一个恢复代码来重新获得对帐户的访问权。请妥善保管好你的恢复代码(例如,你可以将它们打印出来,然后和其他重要的文件放在一起)。 setup: 设置 wrong_code: 输入的认证码无效!请核对一下你的设备显示的时间,如果正确,你可能需要联系一下实例的管理员,让他们校准服务器的时间。 + user_mailer: + welcome: + edit_profile_action: 设置个人资料 + edit_profile_step: 你可以自定义你的个人资料,包括上传头像、横幅图片、更改昵称等等。如果你想在新的关注者关注你之前对他们进行审核,你也可以选择为你的帐户开启保护。 + explanation: 下面是几个小贴士,希望它们能帮到你 + final_action: 开始嘟嘟 + final_step: '开始嘟嘟吧!即便你现在没有关注者,其他人仍然能在本站时间轴或者话题标签等地方看到你的公开嘟文。试着用 #introductions 这个话题标签介绍一下自己吧。' + full_handle: 你的完整用户地址 + full_handle_hint: 你需要把这个告诉你的朋友们,这样他们就能从另一个实例向你发送信息或者关注你。 + review_preferences_action: 更改首选项 + review_preferences_step: 记得调整你的偏好设置,比如你想接收什么类型的邮件,或者你想把你的嘟文可见范围默认设置为什么级别。如果你没有晕动病的话,考虑一下启用“自动播放 GIF 动画”这个选项吧。 + subject: 欢迎来到 Mastodon + tip_bridge_html: 如果你刚从 Twitter 来到这里,你可以在桥梁站(bridge app)上寻找你的朋友。当然,前提是他们也登录了桥梁站! + tip_federated_timeline: 跨站公共时间轴可以让你一窥更广阔的 Mastodon 网络。不过,由于它只显示你的邻居们所订阅的内容,所以并不是全部。 + tip_following: 默认情况下,你会自动关注你所在实例的管理员。想结交更多有趣的人的话,记得多逛逛本站时间轴和跨站公共时间轴哦。 + tip_local_timeline: 本站时间轴可以让你一窥 %{instance} 上的用户。他们就是离你最近的邻居! + tip_mobile_webapp: 如果你的移动设备浏览器允许你将 Mastodon 添加到主屏幕,你就能够接收推送消息。它就像本地应用一样好使! + tips: 小贴士 + title: "%{name},欢迎你的加入!" users: invalid_email: 输入的电子邮件地址无效 invalid_otp_token: 输入的双重认证代码无效 From 0b7a0d15c7e7e23ca0c8bdb738b4a4911bf42eb2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 20 Jan 2018 16:27:19 +0100 Subject: [PATCH 16/18] Bump version to 2.2.0rc1 --- lib/mastodon/version.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 5936b5fcf..098ab46ac 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -9,11 +9,11 @@ module Mastodon end def minor - 1 + 2 end def patch - 3 + 0 end def pre @@ -21,7 +21,7 @@ module Mastodon end def flags - '' + 'rc1' end def to_a From 38f6d8130df7ba74d963e42d00209b444dd1bfbb Mon Sep 17 00:00:00 2001 From: David Yip Date: Sat, 20 Jan 2018 10:46:43 -0600 Subject: [PATCH 17/18] Eliminate stray conflict markers. --- .../styles/mastodon/components.scss | 215 +----------------- 1 file changed, 1 insertion(+), 214 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 9e858e9ca..75e37237b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3557,7 +3557,7 @@ } .onboarding-modal__page__wrapper-0 { - background: url('../images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px; + background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px; height: 100%; padding: 0; } @@ -3702,219 +3702,6 @@ margin-left: 10px; } -<<<<<<< HEAD -.onboarding-modal__dots { - flex: 1 1 auto; - display: flex; - align-items: center; - justify-content: center; -} - -.onboarding-modal__dot { - width: 14px; - height: 14px; - border-radius: 14px; - background: darken($ui-secondary-color, 16%); - margin: 0 3px; - cursor: pointer; - - &:hover { - background: darken($ui-secondary-color, 18%); - } - - &.active { - cursor: default; - background: darken($ui-secondary-color, 24%); - } -} - -.onboarding-modal__page__wrapper { - pointer-events: none; - - &.onboarding-modal__page__wrapper--active { - pointer-events: auto; - } -} - -.onboarding-modal__page { - cursor: default; - line-height: 21px; - - h1 { - font-size: 18px; - font-weight: 500; - color: $ui-base-color; - margin-bottom: 20px; - } - - a { - color: $ui-highlight-color; - - &:hover, - &:focus, - &:active { - color: lighten($ui-highlight-color, 4%); - } - } - - p { - font-size: 16px; - color: lighten($ui-base-color, 8%); - margin-top: 10px; - margin-bottom: 10px; - - &:last-child { - margin-bottom: 0; - } - - strong { - font-weight: 500; - background: $ui-base-color; - color: $ui-secondary-color; - border-radius: 4px; - font-size: 14px; - padding: 3px 6px; - - @each $lang in $cjk-langs { - &:lang(#{$lang}) { - font-weight: 700; - } - } - } - } -} - -.onboarding-modal__page-one { - display: flex; - align-items: center; -} - -.onboarding-modal__page-one__elephant-friend { - background: url('~images/elephant-friend-1.png') no-repeat center center / contain; - width: 155px; - height: 193px; - margin-right: 15px; -} - -@media screen and (max-width: 400px) { - .onboarding-modal__page-one { - flex-direction: column; - align-items: normal; - } - - .onboarding-modal__page-one__elephant-friend { - width: 100%; - height: 30vh; - max-height: 160px; - margin-bottom: 5vh; - } -} - -.onboarding-modal__page-two, -.onboarding-modal__page-three, -.onboarding-modal__page-four, -.onboarding-modal__page-five { - p { - text-align: left; - } - - .figure { - background: darken($ui-base-color, 8%); - color: $ui-secondary-color; - margin-bottom: 20px; - border-radius: 4px; - padding: 10px; - text-align: center; - font-size: 14px; - box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3); - - .onboarding-modal__image { - border-radius: 4px; - margin-bottom: 10px; - } - - &.non-interactive { - pointer-events: none; - text-align: left; - } - } -} - -.onboarding-modal__page-four__columns { - .row { - display: flex; - margin-bottom: 20px; - - & > div { - flex: 1 1 0; - margin: 0 10px; - - &:first-child { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } - - p { - text-align: center; - } - } - - &:last-child { - margin-bottom: 0; - } - } - - .column-header { - color: $primary-text-color; - } -} - -@media screen and (max-width: 320px) and (max-height: 600px) { - .onboarding-modal__page p { - font-size: 14px; - line-height: 20px; - } - - .onboarding-modal__page-two .figure, - .onboarding-modal__page-three .figure, - .onboarding-modal__page-four .figure, - .onboarding-modal__page-five .figure { - font-size: 12px; - margin-bottom: 10px; - } - - .onboarding-modal__page-four__columns .row { - margin-bottom: 10px; - } - - .onboarding-modal__page-four__columns .column-header { - padding: 5px; - font-size: 12px; - } -} - -.onboarding-modal__image { - border-radius: 8px; - width: 70vw; - max-width: 450px; - max-height: auto; - display: block; - margin: auto; - margin-bottom: 20px; -} - -.onboard-sliders { - display: inline-block; - max-width: 30px; - max-height: auto; - margin-left: 10px; -} - -======= ->>>>>>> origin/master .boost-modal, .confirmation-modal, .report-modal, From 3cae3622146d80aef8e43e5790d25f5e2fc9931e Mon Sep 17 00:00:00 2001 From: David Yip Date: Sat, 20 Jan 2018 11:23:06 -0600 Subject: [PATCH 18/18] Merge new onboarding styles; delete refs to PNGs. --- .../glitch/styles/components/drawer.scss | 4 +- .../glitch/styles/components/modal.scss | 97 ++++++++++++------- .../flavours/glitch/styles/modal.scss | 4 +- 3 files changed, 68 insertions(+), 37 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss index 11ac0a37f..0ed8c392a 100644 --- a/app/javascript/flavours/glitch/styles/components/drawer.scss +++ b/app/javascript/flavours/glitch/styles/components/drawer.scss @@ -296,7 +296,7 @@ position: absolute; top: 0; left: 0; - background: lighten($ui-base-color, 13%) url('~images/wave-drawer.png') no-repeat bottom / 100% auto; + background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,') no-repeat bottom / 100% auto; box-sizing: border-box; padding: 0; display: flex; @@ -311,7 +311,7 @@ } > .mastodon { - background: url('~images/mastodon-ui.png') no-repeat left bottom / contain; + background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain; flex: 1; } } diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss index c12f56828..1ac399fa1 100644 --- a/app/javascript/flavours/glitch/styles/components/modal.scss +++ b/app/javascript/flavours/glitch/styles/components/modal.scss @@ -77,13 +77,12 @@ height: 80vh; width: 80vw; max-width: 520px; - max-height: 420px; + max-height: 470px; .react-swipeable-view-container > div { width: 100%; height: 100%; box-sizing: border-box; - padding: 25px; display: none; flex-direction: column; align-items: center; @@ -156,23 +155,32 @@ .onboarding-modal__nav, .error-modal__nav { color: darken($ui-secondary-color, 34%); - background-color: transparent; border: 0; font-size: 14px; font-weight: 500; - padding: 0; + padding: 10px 25px; line-height: inherit; height: auto; + margin: -10px; + border-radius: 4px; + background-color: transparent; &:hover, &:focus, &:active { color: darken($ui-secondary-color, 38%); + background-color: darken($ui-secondary-color, 16%); } &.onboarding-modal__done, &.onboarding-modal__next { - color: $ui-highlight-color; + color: $ui-base-color; + + &:hover, + &:focus, + &:active { + color: darken($ui-base-color, 4%); + } } } } @@ -208,6 +216,8 @@ .onboarding-modal__page__wrapper { pointer-events: none; + padding: 25px; + padding-bottom: 0; &.onboarding-modal__page__wrapper--active { pointer-events: auto; @@ -235,6 +245,10 @@ } } + .navigation-bar a { + color: inherit; + } + p { font-size: 16px; color: lighten($ui-base-color, 8%); @@ -262,29 +276,56 @@ } } +.onboarding-modal__page__wrapper-0 { + background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px; + height: 100%; + padding: 0; +} + .onboarding-modal__page-one { - display: flex; - align-items: center; -} + &__lead { + padding: 65px; + padding-top: 45px; + padding-bottom: 0; + margin-bottom: 10px; -.onboarding-modal__page-one__elephant-friend { - background: url('~images/elephant-friend-1.png') no-repeat center center / contain; - width: 155px; - height: 193px; - margin-right: 15px; -} + h1 { + font-size: 26px; + line-height: 36px; + margin-bottom: 8px; + } -@media screen and (max-width: 400px) { - .onboarding-modal__page-one { - flex-direction: column; - align-items: normal; + p { + margin-bottom: 0; + } } - .onboarding-modal__page-one__elephant-friend { - width: 100%; - height: 30vh; - max-height: 160px; - margin-bottom: 5vh; + &__extra { + padding-right: 65px; + padding-left: 185px; + text-align: center; + } +} + +.display-case { + text-align: center; + font-size: 15px; + margin-bottom: 15px; + + &__label { + font-weight: 500; + color: $ui-base-color; + margin-bottom: 5px; + text-transform: uppercase; + font-size: 12px; + } + + &__case { + background: $ui-base-color; + color: $ui-secondary-color; + font-weight: 500; + padding: 10px; + border-radius: 4px; } } @@ -374,16 +415,6 @@ } } -.onboarding-modal__image { - border-radius: 8px; - width: 70vw; - max-width: 450px; - max-height: auto; - display: block; - margin: auto; - margin-bottom: 20px; -} - .onboard-sliders { display: inline-block; max-width: 30px; diff --git a/app/javascript/flavours/glitch/styles/modal.scss b/app/javascript/flavours/glitch/styles/modal.scss index a17476ccb..ceb79bbb9 100644 --- a/app/javascript/flavours/glitch/styles/modal.scss +++ b/app/javascript/flavours/glitch/styles/modal.scss @@ -1,5 +1,5 @@ .modal-layout { - background: $ui-base-color url('~images/wave-modal.png') repeat-x bottom fixed; + background: $ui-base-color url('data:image/svg+xml;utf8,') repeat-x bottom fixed; display: flex; flex-direction: column; height: 100vh; @@ -15,6 +15,6 @@ > * { flex: 1; max-height: 235px; - background: url('~images/mastodon-ui.png') no-repeat left bottom / contain; + background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain; } }

+ @{admin.get('acct')} }} /> +
+
}} /> +