Merge remote-tracking branch 'origin/master' into merge-upstream

Conflicts:
	app/javascript/styles/mastodon/components.scss
signup-info-prompt
David Yip 2018-01-20 10:45:43 -06:00
commit 071c2c9c85
No known key found for this signature in database
GPG Key ID: 7DA0036508FCC0CC
122 changed files with 819 additions and 694 deletions

View File

@ -6,6 +6,6 @@ module InstanceHelper
end end
def site_hostname def site_hostname
Rails.configuration.x.local_domain @site_hostname ||= Addressable::URI.parse("//#{Rails.configuration.x.local_domain}").display_uri.host
end end
end end

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

View File

@ -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());
}
};
};

View File

@ -2,6 +2,7 @@ import React from 'react';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import configureStore from '../store/configureStore'; import configureStore from '../store/configureStore';
import { showOnboardingOnce } from '../actions/onboarding';
import { BrowserRouter, Route } from 'react-router-dom'; import { BrowserRouter, Route } from 'react-router-dom';
import { ScrollContext } from 'react-router-scroll-4'; import { ScrollContext } from 'react-router-scroll-4';
import UI from '../features/ui'; 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'; const handlerUrl = window.location.protocol + '//' + window.location.host + '/intent?uri=%s';
window.setTimeout(() => navigator.registerProtocolHandler('web+mastodon', handlerUrl, 'Mastodon'), 5 * 60 * 1000); window.setTimeout(() => navigator.registerProtocolHandler('web+mastodon', handlerUrl, 'Mastodon'), 5 * 60 * 1000);
} }
store.dispatch(showOnboardingOnce());
} }
componentWillUnmount () { componentWillUnmount () {

View File

@ -9,6 +9,7 @@ import VideoModal from './video_modal';
import BoostModal from './boost_modal'; import BoostModal from './boost_modal';
import ConfirmationModal from './confirmation_modal'; import ConfirmationModal from './confirmation_modal';
import { import {
OnboardingModal,
MuteModal, MuteModal,
ReportModal, ReportModal,
EmbedModal, EmbedModal,
@ -17,6 +18,7 @@ import {
const MODAL_COMPONENTS = { const MODAL_COMPONENTS = {
'MEDIA': () => Promise.resolve({ default: MediaModal }), 'MEDIA': () => Promise.resolve({ default: MediaModal }),
'ONBOARDING': OnboardingModal,
'VIDEO': () => Promise.resolve({ default: VideoModal }), 'VIDEO': () => Promise.resolve({ default: VideoModal }),
'BOOST': () => Promise.resolve({ default: BoostModal }), 'BOOST': () => Promise.resolve({ default: BoostModal }),
'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }), 'CONFIRM': () => Promise.resolve({ default: ConfirmationModal }),

View File

@ -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 }) => (
<div className='onboarding-modal__page onboarding-modal__page-one'>
<div className='onboarding-modal__page-one__lead'>
<h1><FormattedMessage id='onboarding.page_one.welcome' defaultMessage='Welcome to Mastodon!' /></h1>
<p><FormattedMessage id='onboarding.page_one.federation' defaultMessage='Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.' /></p>
</div>
<div className='onboarding-modal__page-one__extra'>
<div className='display-case'>
<div className='display-case__label'>
<FormattedMessage id='onboarding.page_one.full_handle' defaultMessage='Your full handle' />
</div>
<div className='display-case__case'>
@{acct}@{domain}
</div>
</div>
<p><FormattedMessage id='onboarding.page_one.handle_hint' defaultMessage='This is what you would tell your friends to search for.' /></p>
</div>
</div>
);
PageOne.propTypes = {
acct: PropTypes.string.isRequired,
domain: PropTypes.string.isRequired,
};
const PageTwo = ({ myAccount }) => (
<div className='onboarding-modal__page onboarding-modal__page-two'>
<div className='figure non-interactive'>
<div className='pseudo-drawer'>
<NavigationBar account={myAccount} />
<ComposeForm
text='Awoo! #introductions'
suggestions={ImmutableList()}
mentionedDomains={[]}
spoiler={false}
onChange={noop}
onSubmit={noop}
onPaste={noop}
onPickEmoji={noop}
onChangeSpoilerText={noop}
onClearSuggestions={noop}
onFetchSuggestions={noop}
onSuggestionSelected={noop}
showSearch
/>
</div>
</div>
<p><FormattedMessage id='onboarding.page_two.compose' defaultMessage='Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.' /></p>
</div>
);
PageTwo.propTypes = {
myAccount: ImmutablePropTypes.map.isRequired,
};
const PageThree = ({ myAccount }) => (
<div className='onboarding-modal__page onboarding-modal__page-three'>
<div className='figure non-interactive'>
<Search
value=''
onChange={noop}
onSubmit={noop}
onClear={noop}
onShow={noop}
/>
<div className='pseudo-drawer'>
<NavigationBar account={myAccount} />
</div>
</div>
<p><FormattedMessage id='onboarding.page_three.search' defaultMessage='Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.' values={{ illustration: <Permalink to='/timelines/tag/illustration' href='/tags/illustration'>#illustration</Permalink>, introductions: <Permalink to='/timelines/tag/introductions' href='/tags/introductions'>#introductions</Permalink> }} /></p>
<p><FormattedMessage id='onboarding.page_three.profile' defaultMessage='Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.' /></p>
</div>
);
PageThree.propTypes = {
myAccount: ImmutablePropTypes.map.isRequired,
};
const PageFour = ({ domain, intl }) => (
<div className='onboarding-modal__page onboarding-modal__page-four'>
<div className='onboarding-modal__page-four__columns'>
<div className='row'>
<div>
<div className='figure non-interactive'><ColumnHeader icon='home' type={intl.formatMessage(messages.home_title)} /></div>
<p><FormattedMessage id='onboarding.page_four.home' defaultMessage='The home timeline shows posts from people you follow.' /></p>
</div>
<div>
<div className='figure non-interactive'><ColumnHeader icon='bell' type={intl.formatMessage(messages.notifications_title)} /></div>
<p><FormattedMessage id='onboarding.page_four.notifications' defaultMessage='The notifications column shows when someone interacts with you.' /></p>
</div>
</div>
<div className='row'>
<div>
<div className='figure non-interactive' style={{ marginBottom: 0 }}><ColumnHeader icon='users' type={intl.formatMessage(messages.local_title)} /></div>
</div>
<div>
<div className='figure non-interactive' style={{ marginBottom: 0 }}><ColumnHeader icon='globe' type={intl.formatMessage(messages.federated_title)} /></div>
</div>
</div>
<p><FormattedMessage id='onboarding.page_five.public_timelines' defaultMessage='The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.' values={{ domain }} /></p>
</div>
</div>
);
PageFour.propTypes = {
domain: PropTypes.string.isRequired,
intl: PropTypes.object.isRequired,
};
const PageSix = ({ admin, domain }) => {
let adminSection = '';
if (admin) {
adminSection = (
<p>
<FormattedMessage id='onboarding.page_six.admin' defaultMessage="Your instance's admin is {admin}." values={{ admin: <Permalink href={admin.get('url')} to={`/accounts/${admin.get('id')}`}>@{admin.get('acct')}</Permalink> }} />
<br />
<FormattedMessage id='onboarding.page_six.read_guidelines' defaultMessage="Please read {domain}'s {guidelines}!" values={{ domain, guidelines: <a href='/about/more' target='_blank'><FormattedMessage id='onboarding.page_six.guidelines' defaultMessage='community guidelines' /></a> }} />
</p>
);
}
return (
<div className='onboarding-modal__page onboarding-modal__page-six'>
<h1><FormattedMessage id='onboarding.page_six.almost_done' defaultMessage='Almost done...' /></h1>
{adminSection}
<p><FormattedMessage id='onboarding.page_six.github' defaultMessage='Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.' values={{ github: <a href='https://github.com/tootsuite/mastodon' target='_blank' rel='noopener'>GitHub</a> }} /></p>
<p><FormattedMessage id='onboarding.page_six.apps_available' defaultMessage='There are {apps} available for iOS, Android and other platforms.' values={{ apps: <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' target='_blank' rel='noopener'><FormattedMessage id='onboarding.page_six.various_app' defaultMessage='mobile apps' /></a> }} /></p>
<p><em><FormattedMessage id='onboarding.page_six.appetoot' defaultMessage='Bon Appetoot!' /></em></p>
</div>
);
};
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 = [
<PageOne acct={myAccount.get('acct')} domain={domain} />,
<PageTwo myAccount={myAccount} />,
<PageThree myAccount={myAccount} />,
<PageFour domain={domain} intl={intl} />,
<PageSix admin={admin} domain={domain} />,
];
};
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 ? (
<button onClick={this.handleNext} className='onboarding-modal__nav onboarding-modal__next shake-bottom'>
<FormattedMessage id='onboarding.next' defaultMessage='Next' /> <i className='fa fa-fw fa-chevron-right' />
</button>
) : (
<button onClick={this.handleClose} className='onboarding-modal__nav onboarding-modal__done shake-bottom'>
<FormattedMessage id='onboarding.done' defaultMessage='Done' /> <i className='fa fa-fw fa-check' />
</button>
);
return (
<div className='modal-root__modal onboarding-modal'>
<ReactSwipeableViews index={currentIndex} onChangeIndex={this.handleSwipe} className='onboarding-modal__pager'>
{pages.map((page, i) => {
const className = classNames('onboarding-modal__page__wrapper', `onboarding-modal__page__wrapper-${i}`, {
'onboarding-modal__page__wrapper--active': i === currentIndex,
});
return (
<div key={i} className={className}>{page}</div>
);
})}
</ReactSwipeableViews>
<div className='onboarding-modal__paginator'>
<div>
<button
onClick={this.handleSkip}
className='onboarding-modal__nav onboarding-modal__skip'
>
<FormattedMessage id='onboarding.skip' defaultMessage='Skip' />
</button>
</div>
<div className='onboarding-modal__dots'>
{pages.map((_, i) => {
const className = classNames('onboarding-modal__dot', {
active: i === currentIndex,
});
return (
<div
key={`dot-${i}`}
role='button'
tabIndex='0'
data-index={i}
onClick={this.handleDot}
className={className}
/>
);
})}
</div>
<div>
{nextOrDoneBtn}
</div>
</div>
</div>
);
}
}

View File

@ -94,6 +94,10 @@ export function Mutes () {
return import(/* webpackChunkName: "features/mutes" */'../../mutes'); return import(/* webpackChunkName: "features/mutes" */'../../mutes');
} }
export function OnboardingModal () {
return import(/* webpackChunkName: "modals/onboarding_modal" */'../components/onboarding_modal');
}
export function MuteModal () { export function MuteModal () {
return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal'); return import(/* webpackChunkName: "modals/mute_modal" */'../components/mute_modal');
} }

View File

@ -181,7 +181,8 @@
"onboarding.page_four.home": "The home timeline shows posts from people you follow.", "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_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.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.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_one.welcome": "Welcome to Mastodon!",
"onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.admin": "Your instance's admin is {admin}.",
"onboarding.page_six.almost_done": "Almost done...", "onboarding.page_six.almost_done": "Almost done...",

View File

@ -139,6 +139,7 @@
"loading_indicator.label": "加载中……", "loading_indicator.label": "加载中……",
"media_gallery.toggle_visible": "切换显示/隐藏", "media_gallery.toggle_visible": "切换显示/隐藏",
"missing_indicator.label": "找不到内容", "missing_indicator.label": "找不到内容",
"missing_indicator.sublabel": "无法找到此资源",
"mute_modal.hide_notifications": "同时隐藏来自这个用户的通知", "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知",
"navigation_bar.blocks": "被屏蔽的用户", "navigation_bar.blocks": "被屏蔽的用户",
"navigation_bar.community_timeline": "本站时间轴", "navigation_bar.community_timeline": "本站时间轴",
@ -174,7 +175,8 @@
"onboarding.page_four.home": "你的“主页”时间轴上显示的是你的关注对象所发布的嘟文。", "onboarding.page_four.home": "你的“主页”时间轴上显示的是你的关注对象所发布的嘟文。",
"onboarding.page_four.notifications": "如果有人与你互动了,他们就会出现在“通知”栏中哦~", "onboarding.page_four.notifications": "如果有人与你互动了,他们就会出现在“通知”栏中哦~",
"onboarding.page_one.federation": "Mastodon 是由一系列独立的服务器共同打造的强大的社交网络,我们将这些各自独立而又相互连接的服务器叫做“实例”。", "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_one.welcome": "欢迎来到 Mastodon",
"onboarding.page_six.admin": "{admin} 是你所在服务器实例的管理员。", "onboarding.page_six.admin": "{admin} 是你所在服务器实例的管理员。",
"onboarding.page_six.almost_done": "差不多了……", "onboarding.page_six.almost_done": "差不多了……",
@ -197,6 +199,8 @@
"privacy.public.short": "公开", "privacy.public.short": "公开",
"privacy.unlisted.long": "所有人可见,但不会出现在公共时间轴上", "privacy.unlisted.long": "所有人可见,但不会出现在公共时间轴上",
"privacy.unlisted.short": "不公开", "privacy.unlisted.short": "不公开",
"regeneration_indicator.label": "加载中……",
"regeneration_indicator.sublabel": "你的主页时间轴正在准备中!",
"relative_time.days": "{number}天", "relative_time.days": "{number}天",
"relative_time.hours": "{number}时", "relative_time.hours": "{number}时",
"relative_time.just_now": "刚刚", "relative_time.just_now": "刚刚",

View File

@ -17,7 +17,7 @@ body {
-ms-text-size-adjust: 100%; -ms-text-size-adjust: 100%;
} }
.email_body { .email-body {
td, td,
div, div,
a, a,
@ -235,6 +235,12 @@ h5 {
color: lighten($ui-base-color, 34%); color: lighten($ui-base-color, 34%);
} }
.input-cell {
h5 {
margin-top: 4px;
}
}
.input { .input {
td { td {
background: darken($ui-base-color, 8%); background: darken($ui-base-color, 8%);
@ -512,3 +518,29 @@ ul {
min-height: 1024px !important; 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;
}
}

View File

@ -1419,6 +1419,10 @@
color: $primary-text-color; color: $primary-text-color;
} }
a {
color: inherit;
}
.permalink { .permalink {
text-decoration: none; text-decoration: none;
} }
@ -2760,6 +2764,7 @@
flex: 1 1 auto; flex: 1 1 auto;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@supports(display: grid) { // hack to fix Chrome <57 @supports(display: grid) { // hack to fix Chrome <57
contain: strict; contain: strict;
} }
@ -2805,11 +2810,48 @@
} }
} }
.pulse-loading { .no-reduce-motion .pulse-loading {
transform-origin: center center; transform-origin: center center;
animation: heartbeat 1.5s ease-in-out infinite both; 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 { .emoji-picker-dropdown__menu {
background: $simple-background-color; background: $simple-background-color;
position: absolute; position: absolute;
@ -3300,6 +3342,7 @@
z-index: 100; z-index: 100;
} }
.onboarding-modal,
.error-modal, .error-modal,
.embed-modal { .embed-modal {
background: $ui-secondary-color; background: $ui-secondary-color;
@ -3310,6 +3353,25 @@
flex-direction: column; 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 { .error-modal__body {
height: 80vh; height: 80vh;
width: 80vw; width: 80vw;
@ -3343,6 +3405,23 @@
text-align: center; 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 { .error-modal__footer {
flex: 0 0 auto; flex: 0 0 auto;
background: darken($ui-secondary-color, 8%); background: darken($ui-secondary-color, 8%);
@ -3353,20 +3432,35 @@
min-width: 33px; min-width: 33px;
} }
.onboarding-modal__nav,
.error-modal__nav { .error-modal__nav {
color: darken($ui-secondary-color, 34%); color: darken($ui-secondary-color, 34%);
background-color: transparent;
border: 0; border: 0;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
padding: 0; padding: 10px 25px;
line-height: inherit; line-height: inherit;
height: auto; height: auto;
margin: -10px;
border-radius: 4px;
background-color: transparent;
&:hover, &:hover,
&:focus, &:focus,
&:active { &:active {
color: darken($ui-secondary-color, 38%); 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; 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;
}
<<<<<<< HEAD <<<<<<< HEAD
.onboarding-modal__dots { .onboarding-modal__dots {
flex: 1 1 auto; flex: 1 1 auto;

View File

@ -24,7 +24,7 @@
%tr %tr
%td.column-cell %td.column-cell
= link_to root_url do = 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 = yield
@ -41,15 +41,12 @@
%tr %tr
%td.blank-cell.footer %td.blank-cell.footer
.email-row .email-row
.col-4 .col-6
%table.column{ cellspacing: 0, cellpadding: 0 } %table.column{ cellspacing: 0, cellpadding: 0 }
%tbody %tbody
%td.column-cell %td.column-cell
%p= t 'about.hosted_on', domain: site_hostname %p= t 'about.hosted_on', domain: site_hostname
%p= link_to t('application_mailer.notification_preferences'), settings_notifications_url %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 %td.column-cell.text-right
= link_to root_url do = 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

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'notification_mailer.favourite.title'
%p.lead= t('notification_mailer.favourite.body', name: @account.acct) %p.lead= t('notification_mailer.favourite.body', name: @account.acct)

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'notification_mailer.follow.title'
%p.lead= t('notification_mailer.follow.body', name: @account.acct) %p.lead= t('notification_mailer.follow.body', name: @account.acct)

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'notification_mailer.follow_request.title'
%p.lead= t('notification_mailer.follow_request.body', name: @account.acct) %p.lead= t('notification_mailer.follow_request.body', name: @account.acct)

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'notification_mailer.mention.title'
%p.lead= t('notification_mailer.mention.body', name: @status.account.acct) %p.lead= t('notification_mailer.mention.body', name: @status.account.acct)

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'notification_mailer.reblog.title'
%p.lead= t('notification_mailer.reblog.body', name: @account.acct) %p.lead= t('notification_mailer.reblog.body', name: @account.acct)

View File

@ -1,12 +0,0 @@
مرحبا <%= @resource.email %> !
لقد قمت بإنشاء حساب على <%= @instance %>.
لتأكيد التسجيل يرجى النقر على الرابط التالي :
<%= confirmation_url(@resource, confirmation_token: @token) %>
يرجى الإطلاع على شروط الإستخدام <%= terms_url %>
مع أجمل التحيات،
فريق <%= @instance %>

View File

@ -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 %>

View File

@ -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

View File

@ -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 %>

View File

@ -1,12 +0,0 @@
خوش آمدید <%= @resource.email %> !
شما الان در <%= @instance %> حساب باز کردید.
برای تأیید عضویت، لطفاً روی پیوند زیر کلیک کنید:
<%= confirmation_url(@resource, confirmation_token: @token) %>
لطفاً همچنین شرایط و مقررات استفادهٔ ما را هم بخوانید <%= terms_url %>
با احترام،
گردانندگان سرور <%= @instance %>

View File

@ -1,5 +0,0 @@
Tervetuloa <%= @resource.email %>!
Voit vahvistaa Mastodon tilisi klikkaamalla alla olevaa linkkiä:
<%= confirmation_url(@resource, confirmation_token: @token) %>

View File

@ -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 loutil.
Pour rappel, nos conditions dutilisation sont indiquées ici <%= terms_url %>
Amicalement,
Léquipe <%= @instance %>

View File

@ -1,12 +0,0 @@
שלום <%= @resource.email %> !
הרגע יצרת חשבון בקהילה <%= @instance %>.
כדי לוודא את הרשמתך, יש ללחוץ על הקישורית הבאה :
<%= confirmation_url(@resource, confirmation_token: @token) %>
יש לעבור גם על תנאי השימוש <%= terms_url %>
בתודה מראש,
צוות ניהול <%= @instance %>

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'devise.mailer.confirmation_instructions.title'

View File

@ -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 %>

View File

@ -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 %>

View File

@ -1,11 +0,0 @@
ようこそ<%= @resource.email %>さん
<%= @instance %>にアカウントが作成されました。
以下のリンクをクリックしてMastodonアカウントのメールアドレスを確認してください。
<%= confirmation_url(@resource, confirmation_token: @token) %>
また、インスタンスの<%= link_to '利用規約', terms_url %>についてもご確認ください。
<%= @instance %> チーム

View File

@ -1,10 +0,0 @@
안녕하세요 <%= @resource.email %> 님!
<%= @instance %>에 새로 계정을 만들었습니다.
아래 링크를 눌러 회원가입을 완료 하세요.
<%= confirmation_url(@resource, confirmation_token: @token) %>
약관도 확인 바랍니다. <%= terms_url %>
<%= @instance %> 드림

View File

@ -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 %>

View File

@ -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 %>

View File

@ -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 laisina.
Pensatz tanben de gaitar nòstres <%= link_to 'tèrmes e condicions d\'utilizacion', terms_url %>.
Amistosament,
La còla <%= @instance %>

View File

@ -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 %>

View File

@ -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 %>

View File

@ -1,12 +0,0 @@
Добро пожаловать, <%= @resource.email %> !
Вы только что завели аккаунт на <%= @instance %>.
Чтобы подтвердить создание аккаунта, пожалуйста, перейдите по этой ссылке:
<%= confirmation_url(@resource, confirmation_token: @token) %>
Также просим Вас прочитать об условиях использования аккаунта здесь: <%= terms_url %>
Искренне Ваши,
Команда <%= @instance %>

View File

@ -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

View File

@ -1,12 +0,0 @@
Добродошао <%= @resource.email %> !
Управо сте направили налог на инстанци <%= @instance %>.
Да потврдите Вашу регистрацију, молимо Вас кликните на следећи линк:
<%= confirmation_url(@resource, confirmation_token: @token) %>
Такође погледајте и правила и услове коришћења <%= terms_url %>
С поштовањем,
<%= @instance %> тим

View File

@ -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 %>

View File

@ -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 %>

View File

@ -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

View File

@ -1,10 +0,0 @@
<%= @resource.email %>,你好呀!
你刚刚在 <%= @instance %> 创建了一个帐户呢。
点击下面的链接来完成注册啦:
<%= confirmation_url(@resource, confirmation_token: @token) %>
记得读一读我们的使用条款哦:<%= terms_url %>
来自 <%= @instance %> 管理团队

View File

@ -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

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'devise.mailer.email_changed.title'
%p.lead= t 'devise.mailer.email_changed.explanation' %p.lead= t 'devise.mailer.email_changed.explanation'

View File

@ -1,11 +0,0 @@
Hello <%= @resource.email %>!
<% if @resource&.unconfirmed_email? %>
<%= @instance %>で使っているメールアドレスが<%= @resource.unconfirmed_email %>に変更されようとしています。
<% else %>
<%= @instance %>で使っているメールアドレスが<%= @resource.email %>に変更されました。
<% end %>
メールアドレスを変更した覚えがない場合、誰かがあなたのアカウントにアクセスしたおそれがあります。すぐにパスワードを変更するか、アカウントにアクセスできない場合はインスタンスの管理者に連絡してください。
<%= @instance %>チームより

View File

@ -1,13 +0,0 @@
Bonjorn <%= @resource.email %>!
<% if @resource&.unconfirmed_email? %>
Vos contactem per vos senhalar que ladreça quutilizatz per <%= @instance %> es cambiada per aquesta daquí <%= @resource.unconfirmed_email %>.
<% else %>
Vos contactem per vos senhalar que ladreça quutilizatz per <%= @instance %> es cambiada per aquesta daquí <%= @resource.email %>.
<% end %>
Savètz pas demandat aqueste cambiament dadreça, poiriá arribar que qualquun mai aguèsse agut accès a vòstre compte. Mercés de cambiar sulpic vòstre senhal o de contactar vòstre administrator dinstància se laccès a vòstre compte vos es barrat.
Amistosament,
La còla <%= @instance %>

View File

@ -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 %>

View File

@ -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' %>

View File

@ -1,11 +0,0 @@
<%= @resource.email %>,你好呀!
<% if @resource&.unconfirmed_email? %>
我们发送这封邮件是为了提醒你,你在 <%= @instance %> 上使用的电子邮件地址即将变更为 <%= @resource.unconfirmed_email %>。
<% else %>
我们发送这封邮件是为了提醒你,你在 <%= @instance %> 上使用的电子邮件地址已经变更为 <%= @resource.unconfirmed_email %>。
<% end %>
如果你并没有请求更改你的电子邮件地址,则他人很有可能已经入侵你的帐户。请立即更改你的密码;如果你已经无法访问你的帐户,请联系实例的管理员请求协助。
来自 <%= @instance %> 管理团队

View File

@ -1,3 +0,0 @@
صباح الخير <%= @resource.email %> !
نود أن نخبرك أنه قد تم تعديل كلمة مرور ماستدون الخاصة بك بنجاح.

View File

@ -1,3 +0,0 @@
Hola <%= @resource.email %>!
Aquest correu es per a notificar-te que la teva contrasenya a mastodont.cat ha canviat.

View File

@ -1,3 +0,0 @@
Hello <%= @resource.email %>!
We're contacting you to notify you that your password on <%= @instance %> has been changed.

View File

@ -1,3 +0,0 @@
¡Hola, <%= @resource.email %>!
Te contactamos para notificarte que tu contraseña en <%= @instance %> ha sido modificada.

View File

@ -1,3 +0,0 @@
سلام <%= @resource.email %>!
این پیغام برای این است که به شما بگوییم رمز شما در ماستدون تغییر کرده است.

View File

@ -1,3 +0,0 @@
Hei <%= @resource.email %>!
Lähetämme tämän viestin ilmoittaaksemme että salasanasi on vaihdettu.

View File

@ -1,3 +0,0 @@
Bonjour <%= @resource.email %> !
Nous vous contactons pour vous informer que votre mot de passe sur Mastodon a bien été modifié.

View File

@ -1,3 +0,0 @@
שלום <%= @resource.email %>!
רצינו להודיע לך שסיסמתך במסטודון אצלנו הוחלפה.

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'devise.mailer.password_change.title'
%p.lead= t 'devise.mailer.password_change.explanation' %p.lead= t 'devise.mailer.password_change.explanation'

View File

@ -1,3 +0,0 @@
Hai <%= @resource.email %>!
Kami menghubungi anda untuk memberitahu bahwa kata sandi anda di Mastodon telah diubah.

View File

@ -1,3 +0,0 @@
Ciao <%= @resource.email %>!
Ti stiamo contattando per avvisarti che la tua password su Mastodon è stata cambiata.

View File

@ -1,3 +0,0 @@
こんにちは<%= @resource.email %>さん
Mastodonアカウントのパスワードが変更されました。

View File

@ -1,3 +0,0 @@
Hallo <%= @resource.email %>!
Hierbij laten we jou weten dat jouw wachtwoord op Mastodon is veranderd.

View File

@ -1,3 +0,0 @@
Hei <%= @resource.email %>!
Ditt Mastodon-passord har blitt endret.

View File

@ -1,3 +0,0 @@
Bonjorn <%= @resource.email %>!
Vos contactem per vos avisar quavèm ben cambiat vòstre senhal Mastodon.

View File

@ -1,3 +0,0 @@
Witaj, <%= @resource.email %>!
Informujemy, że ostatnio zmieniono Twoje hasło na <%= @instance %>.

View File

@ -1,3 +0,0 @@
Olá, <%= @resource.email %>!
Estamos te contatando para te notificar que a sua senha na instância <%= @instance %> foi modificada.

View File

@ -1,3 +0,0 @@
Здравствуйте, <%= @resource.email %>!
Мы пишем, чтобы оповестить Вас о смене пароля на Вашем аккаунте Mastodon.

View File

@ -1,3 +0,0 @@
Zdravo <%= @resource.email %>!
Želimo samo da Vas obavestimo da je Vaša lozinka na Mastodont instanci <%= @instance %> promenjena.

View File

@ -1,3 +0,0 @@
Здраво <%= @resource.email %>!
Желимо само да Вас обавестимо да је Ваша лозинка на Мастодонт инстанци <%= @instance %> промењена.

View File

@ -1,3 +0,0 @@
Hej <%= @resource.email %>!
Vi kontaktar dig för att meddela dig att ditt lösenord på <%= @instance %> har blivit ändrat.

View File

@ -0,0 +1,7 @@
<%= t 'devise.mailer.password_change.title' %>
===
<%= t 'devise.mailer.password_change.explanation' %>
<%= t 'devise.mailer.password_change.extra' %>

View File

@ -1,3 +0,0 @@
สวัสดี <%= @resource.email %>!
เราติดต่อมาเพื่อแจ้งให้คุณทราบว่า พาสเวิร์ดของคุณถูกเปลี่ยนแล้ว

View File

@ -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

View File

@ -1,3 +0,0 @@
<%= @resource.email %>,你好呀!
提醒一下,你在 <%= @instance %> 上的密码被更改了哦。

View File

@ -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

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'devise.mailer.reconfirmation_instructions.title'
%p.lead= t 'devise.mailer.reconfirmation_instructions.explanation' %p.lead= t 'devise.mailer.reconfirmation_instructions.explanation'

View File

@ -1,10 +0,0 @@
こんにちは<%= @resource.unconfirmed_email %>さん
<%= @instance %>で使っているメールアドレスの変更をあなたがリクエストしました。
新しいメールアドレスを確認するには次のリンクをクリックしてください:
<%= confirmation_url(@resource, confirmation_token: @token) %>
また利用規約もご確認ください <%= terms_url %>
<%= @instance %>チームより

View File

@ -1,12 +0,0 @@
Bonjorn <%= @resource.unconfirmed_email %>!
Avètz demandat a cambiar vòstra adreça de corrièl quutilizatz 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 %>

View File

@ -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 %>

View File

@ -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' %>

View File

@ -1,10 +0,0 @@
<%= @resource.email %>,你好呀!
你正在更改你在 <%= @instance %> 使用的电子邮件地址。
点击下面的链接以确认操作:
<%= confirmation_url(@resource, confirmation_token: @token) %>
记得读一读我们的使用条款哦:<%= terms_url %>
来自 <%= @instance %> 管理团队

View File

@ -1,8 +0,0 @@
صباح الخير <%= @resource.email %>!
لقد طلب أحدهم رابط تعديل كلمة مرور ماستدون الخاصة بك. يمكنك المتابعة و مواصلة التعديل على الرابط التالي.
<%= edit_password_url(@resource, reset_password_token: @token) %>
يمكنك تجاهل هذه الرسالة إن لم تكن من طلب ذلك.
لن يتم تعديل كلمة المرور الخاصة بك و ستبقى نفسها إلا إذا قمت بالضغط على الرابط أعلاه.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -1,8 +0,0 @@
سلام <%= @resource.email %>!
یک نفر درخواست کرده تا رمز شما در ماستدون عوض شود. برای این کار روی پیوند زیر کلیک کنید.
<%= edit_password_url(@resource, reset_password_token: @token) %>
اگر شما چنین درخواستی نداده‌اید، لطفاً این ایمیل را نادیده بگیرید.
تا وقتی که شما پیوند بالا را نبینید و رمز تازه‌ای نسازید، رمز شما عوض نخواهد شد.

View File

@ -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.

View File

@ -1,8 +0,0 @@
Bonjour <%= @resource.email %> !
Quelquun 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 à lorigine de cette demande, vous pouvez ignorer ce message.
Votre mot de passe ne sera pas modifié tant que vous naccéderez pas au lien ci-dessus et nen choisirez pas un nouveau.

View File

@ -1,8 +0,0 @@
שלום <%= @resource.email %>!
מישהו ביקש לינק להחלפת סיסמתך במסטודון. באפשרותך לעשות זאת ע"י בלחיצה על הקישורית שבהמשך.
<%= edit_password_url(@resource, reset_password_token: @token) %>
אם בקשה זו לא הגיעה ממך, אפשר להתעלם מההודעה.
סיסמתך לא תוחלף לפני שהקישורית תיפתח בדפדפן וסיסמא חדשה תוכנס.

View File

@ -17,7 +17,7 @@
%tbody %tbody
%tr %tr
%td %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' %h1= t 'devise.mailer.reset_password_instructions.title'
%p.lead= t 'devise.mailer.reset_password_instructions.explanation' %p.lead= t 'devise.mailer.reset_password_instructions.explanation'

View File

@ -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.

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