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

Conflicts:
	README.md
pull/389/head
David Yip 2018-03-12 17:52:19 -05:00
commit f8e934f955
No known key found for this signature in database
GPG Key ID: 7DA0036508FCC0CC
59 changed files with 330 additions and 183 deletions

View File

@ -1,4 +1,4 @@
web: PORT=3000 bundle exec puma -C config/puma.rb
sidekiq: PORT=3000 bundle exec sidekiq
stream: PORT=4000 yarn run start
web: env PORT=3000 bundle exec puma -C config/puma.rb
sidekiq: env PORT=3000 bundle exec sidekiq
stream: env PORT=4000 yarn run start
webpack: ./bin/webpack-dev-server --listen-host 0.0.0.0

View File

@ -24,7 +24,7 @@ defineMessages({
const fetchRelatedRelationships = (dispatch, notifications) => {
const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id);
if (accountIds > 0) {
if (accountIds.length > 0) {
dispatch(fetchRelationships(accountIds));
}
};

View File

@ -12,26 +12,6 @@ const messages = defineMessages({
toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' },
});
const shiftToPoint = (containerToImageRatio, containerSize, imageSize, focusSize, toMinus) => {
const containerCenter = Math.floor(containerSize / 2);
const focusFactor = (focusSize + 1) / 2;
const scaledImage = Math.floor(imageSize / containerToImageRatio);
let focus = Math.floor(focusFactor * scaledImage);
if (toMinus) focus = scaledImage - focus;
let focusOffset = focus - containerCenter;
const remainder = scaledImage - focus;
const containerRemainder = containerSize - containerCenter;
if (remainder < containerRemainder) focusOffset -= containerRemainder - remainder;
if (focusOffset < 0) focusOffset = 0;
return (focusOffset * -100 / containerSize) + '%';
};
class Item extends React.PureComponent {
static contextTypes = {
@ -44,8 +24,6 @@ class Item extends React.PureComponent {
index: PropTypes.number.isRequired,
size: PropTypes.number.isRequired,
onClick: PropTypes.func.isRequired,
containerWidth: PropTypes.number,
containerHeight: PropTypes.number,
};
static defaultProps = {
@ -84,7 +62,7 @@ class Item extends React.PureComponent {
}
render () {
const { attachment, index, size, standalone, containerWidth, containerHeight } = this.props;
const { attachment, index, size, standalone } = this.props;
let width = 50;
let height = 100;
@ -143,45 +121,16 @@ class Item extends React.PureComponent {
const originalUrl = attachment.get('url');
const originalWidth = attachment.getIn(['meta', 'original', 'width']);
const originalHeight = attachment.getIn(['meta', 'original', 'height']);
const hasSize = typeof originalWidth === 'number' && typeof previewWidth === 'number';
const srcSet = hasSize ? `${originalUrl} ${originalWidth}w, ${previewUrl} ${previewWidth}w` : null;
const sizes = hasSize ? `(min-width: 1025px) ${320 * (width / 100)}px, ${width}vw` : null;
const focusX = attachment.getIn(['meta', 'focus', 'x']);
const focusY = attachment.getIn(['meta', 'focus', 'y']);
const imageStyle = {};
if (originalWidth && originalHeight && containerWidth && containerHeight && focusX && focusY) {
const widthRatio = originalWidth / (containerWidth * (width / 100));
const heightRatio = originalHeight / (containerHeight * (height / 100));
let hShift = 0;
let vShift = 0;
if (widthRatio > heightRatio) {
hShift = shiftToPoint(heightRatio, (containerWidth * (width / 100)), originalWidth, focusX);
} else if(widthRatio < heightRatio) {
vShift = shiftToPoint(widthRatio, (containerHeight * (height / 100)), originalHeight, focusY, true);
}
if (originalWidth > originalHeight) {
imageStyle.height = '100%';
imageStyle.width = 'auto';
imageStyle.minWidth = '100%';
} else {
imageStyle.height = 'auto';
imageStyle.width = '100%';
imageStyle.minHeight = '100%';
}
imageStyle.top = vShift;
imageStyle.left = hShift;
} else {
imageStyle.height = '100%';
}
const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0;
const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0;
const x = ((focusX / 2) + .5) * 100;
const y = ((focusY / -2) + .5) * 100;
thumbnail = (
<a
@ -196,7 +145,7 @@ class Item extends React.PureComponent {
sizes={sizes}
alt={attachment.get('description')}
title={attachment.get('description')}
style={imageStyle}
style={{ objectPosition: `${x}% ${y}%` }}
/>
</a>
);
@ -320,7 +269,7 @@ export default class MediaGallery extends React.PureComponent {
if (this.isStandaloneEligible()) {
children = <Item standalone onClick={this.handleClick} attachment={media.get(0)} />;
} else {
children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} index={i} size={size} containerWidth={width} containerHeight={style.height} />);
children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} index={i} size={size} />);
}
}

View File

@ -17,7 +17,7 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false })
return {
statusIds: state.getIn(['timelines', `account:${path}`, 'items'], ImmutableList()),
featuredStatusIds: state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], ImmutableList()),
featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], ImmutableList()),
isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
hasMore: !!state.getIn(['timelines', `account:${path}`, 'next']),
};
@ -40,14 +40,18 @@ export default class AccountTimeline extends ImmutablePureComponent {
const { params: { accountId }, withReplies } = this.props;
this.props.dispatch(fetchAccount(accountId));
if (!withReplies) {
this.props.dispatch(refreshAccountFeaturedTimeline(accountId));
}
this.props.dispatch(refreshAccountTimeline(accountId, withReplies));
}
componentWillReceiveProps (nextProps) {
if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
this.props.dispatch(fetchAccount(nextProps.params.accountId));
if (!nextProps.withReplies) {
this.props.dispatch(refreshAccountFeaturedTimeline(nextProps.params.accountId));
}
this.props.dispatch(refreshAccountTimeline(nextProps.params.accountId, nextProps.params.withReplies));
}
}

View File

@ -5,7 +5,7 @@ import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import { me } from '../../../initial_state';
const APPROX_HASHTAG_RE = /(?:^|[^\/\)\w])#(\w*[a-zA-Z]\w*)/i;
const APPROX_HASHTAG_RE = /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i;
const mapStateToProps = state => ({
needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']),

View File

@ -103,7 +103,7 @@ export default class FocalPointModal extends ImmutablePureComponent {
const height = media.getIn(['meta', 'original', 'height']) || null;
return (
<div className='modal-root__modal video-modal'>
<div className='modal-root__modal video-modal focal-point-modal'>
<div className={classNames('focal-point', { dragging })} ref={this.setRef}>
<ImageLoader
previewSrc={media.get('preview_url')}

View File

@ -130,6 +130,15 @@ export default class MediaModal extends ImmutablePureComponent {
return null;
}).toArray();
// you can't use 100vh, because the viewport height is taller
// than the visible part of the document in some mobile
// browsers when it's address bar is visible.
// https://developers.google.com/web/updates/2016/12/url-bar-resizing
const swipeableViewsStyle = {
width: '100%',
height: '100%',
};
const containerStyle = {
alignItems: 'center', // center vertically
};
@ -145,15 +154,8 @@ export default class MediaModal extends ImmutablePureComponent {
role='presentation'
onClick={onClose}
>
<div className='media-modal__content'>
<ReactSwipeableViews
style={{
// you can't use 100vh, because the viewport height is taller
// than the visible part of the document in some mobile
// browsers when it's address bar is visible.
// https://developers.google.com/web/updates/2016/12/url-bar-resizing
height: `${document.body.clientHeight}px`,
}}
style={swipeableViewsStyle}
containerStyle={containerStyle}
onChangeIndex={this.handleSwipe}
onSwitching={this.handleSwitching}
@ -162,7 +164,6 @@ export default class MediaModal extends ImmutablePureComponent {
{content}
</ReactSwipeableViews>
</div>
</div>
<div className={navigationClassName}>
<IconButton className='media-modal__close' title={intl.formatMessage(messages.close)} icon='times' onClick={onClose} size={40} />
{leftNav}

View File

@ -3,7 +3,7 @@
"account.block_domain": "إخفاء كل شيئ قادم من إسم النطاق {domain}",
"account.blocked": "محظور",
"account.disclaimer_full": "قد لا تعكس المعلومات أدناه الملف الشخصي الكامل للمستخدم.",
"account.domain_blocked": "Domain hidden",
"account.domain_blocked": "النطاق مخفي",
"account.edit_profile": "تعديل الملف الشخصي",
"account.follow": "تابِع",
"account.followers": "المتابعون",
@ -252,7 +252,9 @@
"status.sensitive_warning": "محتوى حساس",
"status.share": "مشاركة",
"status.show_less": "إعرض أقلّ",
"status.show_less_all": "Show less for all",
"status.show_more": "أظهر المزيد",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "فك الكتم عن المحادثة",
"status.unpin": "فك التدبيس من الملف الشخصي",
"tabs_bar.federated_timeline": "الموحَّد",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Деликатно съдържание",
"status.share": "Share",
"status.show_less": "Show less",
"status.show_less_all": "Show less for all",
"status.show_more": "Show more",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Federated",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Contingut sensible",
"status.share": "Compartir",
"status.show_less": "Mostra menys",
"status.show_less_all": "Show less for all",
"status.show_more": "Mostra més",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Activar conversació",
"status.unpin": "Deslliga del perfil",
"tabs_bar.federated_timeline": "Federada",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Heikle Inhalte",
"status.share": "Teilen",
"status.show_less": "Weniger anzeigen",
"status.show_less_all": "Show less for all",
"status.show_more": "Mehr anzeigen",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Stummschaltung von Thread aufheben",
"status.unpin": "Vom Profil lösen",
"tabs_bar.federated_timeline": "Föderation",

View File

@ -1375,6 +1375,14 @@
"defaultMessage": "Block",
"id": "confirmations.block.confirm"
},
{
"defaultMessage": "Show more for all",
"id": "status.show_more_all"
},
{
"defaultMessage": "Show less for all",
"id": "status.show_less_all"
},
{
"defaultMessage": "Are you sure you want to block {name}?",
"id": "confirmations.block.message"

View File

@ -259,7 +259,9 @@
"status.sensitive_warning": "Sensitive content",
"status.share": "Share",
"status.show_less": "Show less",
"status.show_less_all": "Show less for all",
"status.show_more": "Show more",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Federated",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Tikla enhavo",
"status.share": "Diskonigi",
"status.show_less": "Malgrandigi",
"status.show_less_all": "Show less for all",
"status.show_more": "Grandigi",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Malsilentigi konversacion",
"status.unpin": "Depingli de profilo",
"tabs_bar.federated_timeline": "Fratara tempolinio",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Contenido sensible",
"status.share": "Compartir",
"status.show_less": "Mostrar menos",
"status.show_less_all": "Show less for all",
"status.show_more": "Mostrar más",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Dejar de silenciar conversación",
"status.unpin": "Dejar de fijar",
"tabs_bar.federated_timeline": "Federado",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "محتوای حساس",
"status.share": "هم‌رسانی",
"status.show_less": "نهفتن",
"status.show_less_all": "Show less for all",
"status.show_more": "نمایش",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "باصداکردن گفتگو",
"status.unpin": "برداشتن نوشتهٔ ثابت نمایه",
"tabs_bar.federated_timeline": "همگانی",

View File

@ -1,7 +1,7 @@
{
"account.block": "Estä @{name}",
"account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}",
"account.blocked": "Blocked",
"account.blocked": "Estetty",
"account.disclaimer_full": "Alla olevat käyttäjän profiilitiedot saattavat olla epätäydellisiä.",
"account.domain_blocked": "Domain hidden",
"account.edit_profile": "Muokkaa",
@ -15,9 +15,9 @@
"account.moved_to": "{name} on muuttanut instanssiin:",
"account.mute": "Mykistä @{name}",
"account.mute_notifications": "Mykistä ilmoitukset käyttäjältä @{name}",
"account.muted": "Muted",
"account.muted": "Mykistetty",
"account.posts": "Töötit",
"account.posts_with_replies": "Toots with replies",
"account.posts_with_replies": "Töötit ja vastaukset",
"account.report": "Report @{name}",
"account.requested": "Odottaa hyväksyntää. Klikkaa peruuttaaksesi seurauspyynnön",
"account.share": "Jaa käyttäjän @{name} profiili",
@ -211,22 +211,22 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"reply_indicator.cancel": "Peruuta",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
"report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
"report.forward": "Uudelleenohjaa kohteeseen {target}",
"report.forward_hint": "Tämä tili on toiselta serveriltä. Haluatko, että myös sinne lähetetään anonymisoitu kopio ilmiantoraportista?",
"report.hint": "Ilmianto lähetetään instanssisi moderaattoreille. Voit antaa kuvauksen käyttäjän ilmiantamisen syystä alle:",
"report.placeholder": "Lisäkommentit",
"report.submit": "Submit",
"report.target": "Reporting",
"search.placeholder": "Hae",
"search_popout.search_format": "Tarkennettu haku",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
"search_popout.tips.full_text": "Tekstihaku palauttaa statuspäivitykset jotka olet kirjoittanut, lisännyt suosikkeihisi, boostannut tai joissa sinut mainitaan, sekä käyttäjänimet, nimimerkit ja hastagit jotka sisältävät tekstin.",
"search_popout.tips.hashtag": "hashtagi",
"search_popout.tips.status": "status",
"search_popout.tips.text": "Pelkkä tekstihaku palauttaa hakua vastaavat nimimerkit, käyttäjänimet ja hastagit",
"search_popout.tips.user": "käyttäjä",
"search_results.accounts": "People",
"search_results.hashtags": "Hashtags",
"search_results.statuses": "Toots",
"search_results.accounts": "Ihmiset",
"search_results.hashtags": "Hashtagit",
"search_results.statuses": "Töötit",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"standalone.public_title": "Kurkistus sisälle...",
"status.block": "Block @{name}",
@ -242,7 +242,7 @@
"status.mute_conversation": "Mykistä keskustelu",
"status.open": "Laajenna statuspäivitys",
"status.pin": "Kiinnitä profiiliin",
"status.pinned": "Pinned toot",
"status.pinned": "Kiinnitetty töötti",
"status.reblog": "Buustaa",
"status.reblogged_by": "{name} buustasi",
"status.reply": "Vastaa",
@ -252,7 +252,9 @@
"status.sensitive_warning": "Arkaluontoista sisältöä",
"status.share": "Jaa",
"status.show_less": "Näytä vähemmän",
"status.show_less_all": "Show less for all",
"status.show_more": "Näytä lisää",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Poista mykistys keskustelulta",
"status.unpin": "Irrota profiilista",
"tabs_bar.federated_timeline": "Federated",
@ -263,7 +265,7 @@
"upload_area.title": "Raahaa ja pudota tähän ladataksesi",
"upload_button.label": "Lisää mediaa",
"upload_form.description": "Anna kuvaus näkörajoitteisia varten",
"upload_form.focus": "Crop",
"upload_form.focus": "Rajaa",
"upload_form.undo": "Peru",
"upload_progress.label": "Ladataan...",
"video.close": "Sulje video",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Contenu sensible",
"status.share": "Partager",
"status.show_less": "Replier",
"status.show_less_all": "Show less for all",
"status.show_more": "Déplier",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Ne plus masquer la conversation",
"status.unpin": "Retirer du profil",
"tabs_bar.federated_timeline": "Fil public global",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Contido sensible",
"status.share": "Compartir",
"status.show_less": "Mostrar menos",
"status.show_less_all": "Show less for all",
"status.show_more": "Mostrar máis",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Non acalar a conversa",
"status.unpin": "Despegar do perfil",
"tabs_bar.federated_timeline": "Federado",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "תוכן רגיש",
"status.share": "שיתוף",
"status.show_less": "הראה פחות",
"status.show_less_all": "Show less for all",
"status.show_more": "הראה יותר",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "הסרת השתקת שיחה",
"status.unpin": "לשחרר מקיבוע באודות",
"tabs_bar.federated_timeline": "ציר זמן בין-קהילתי",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Osjetljiv sadržaj",
"status.share": "Share",
"status.show_less": "Pokaži manje",
"status.show_less_all": "Show less for all",
"status.show_more": "Pokaži više",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Poništi utišavanje razgovora",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Federalni",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Érzékeny tartalom",
"status.share": "Megosztás",
"status.show_less": "Kevesebb",
"status.show_less_all": "Show less for all",
"status.show_more": "Többet",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Beszélgetés némításának elvonása",
"status.unpin": "Kitűzés eltávolítása a profilról",
"tabs_bar.federated_timeline": "Federált",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Կասկածելի բովանդակություն",
"status.share": "Կիսվել",
"status.show_less": "Պակաս",
"status.show_less_all": "Show less for all",
"status.show_more": "Ավելին",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Ապալռեցնել խոսակցությունը",
"status.unpin": "Հանել անձնական էջից",
"tabs_bar.federated_timeline": "Դաշնային",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Konten sensitif",
"status.share": "Share",
"status.show_less": "Tampilkan lebih sedikit",
"status.show_less_all": "Show less for all",
"status.show_more": "Tampilkan semua",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Gabungan",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Trubliva kontenajo",
"status.share": "Share",
"status.show_less": "Montrar mine",
"status.show_less_all": "Show less for all",
"status.show_more": "Montrar plue",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Federata",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Materiale sensibile",
"status.share": "Share",
"status.show_less": "Mostra meno",
"status.show_less_all": "Show less for all",
"status.show_more": "Mostra di più",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Federazione",

View File

@ -3,7 +3,7 @@
"account.block_domain": "{domain}全体を非表示",
"account.blocked": "ブロック済み",
"account.disclaimer_full": "以下の情報は不正確な可能性があります。",
"account.domain_blocked": "Domain hidden",
"account.domain_blocked": "ドメイン非表示中",
"account.edit_profile": "プロフィールを編集",
"account.follow": "フォロー",
"account.followers": "フォロワー",
@ -259,7 +259,9 @@
"status.sensitive_warning": "閲覧注意",
"status.share": "共有",
"status.show_less": "隠す",
"status.show_less_all": "Show less for all",
"status.show_more": "もっと見る",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "会話のミュートを解除",
"status.unpin": "プロフィールの固定表示を解除",
"tabs_bar.federated_timeline": "連合",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "민감한 미디어",
"status.share": "공유",
"status.show_less": "숨기기",
"status.show_less_all": "Show less for all",
"status.show_more": "더 보기",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "이 대화의 뮤트 해제하기",
"status.unpin": "고정 해제",
"tabs_bar.federated_timeline": "연합",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Gevoelige inhoud",
"status.share": "Delen",
"status.show_less": "Minder tonen",
"status.show_less_all": "Show less for all",
"status.show_more": "Meer tonen",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Conversatie niet meer negeren",
"status.unpin": "Van profielpagina losmaken",
"tabs_bar.federated_timeline": "Globaal",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Følsomt innhold",
"status.share": "Del",
"status.show_less": "Vis mindre",
"status.show_less_all": "Show less for all",
"status.show_more": "Vis mer",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Ikke demp samtale",
"status.unpin": "Angre festing på profilen",
"tabs_bar.federated_timeline": "Felles",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Contengut sensible",
"status.share": "Partejar",
"status.show_less": "Tornar plegar",
"status.show_less_all": "Show less for all",
"status.show_more": "Desplegar",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Tornar mostrar la conversacion",
"status.unpin": "Tirar del perfil",
"tabs_bar.federated_timeline": "Flux public global",

View File

@ -258,8 +258,10 @@
"status.sensitive_toggle": "Naciśnij aby wyświetlić",
"status.sensitive_warning": "Wrażliwa zawartość",
"status.share": "Udostępnij",
"status.show_less": "Pokaż mniej",
"status.show_more": "Pokaż więcej",
"status.show_less": "Zwiń",
"status.show_less_all": "Zwiń wszystkie",
"status.show_more": "Rozwiń",
"status.show_more_all": "Rozwiń wszystkie",
"status.unmute_conversation": "Cofnij wyciszenie konwersacji",
"status.unpin": "Odepnij z profilu",
"tabs_bar.federated_timeline": "Globalne",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Conteúdo sensível",
"status.share": "Compartilhar",
"status.show_less": "Mostrar menos",
"status.show_less_all": "Show less for all",
"status.show_more": "Mostrar mais",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Desativar silêncio desta conversa",
"status.unpin": "Desafixar do perfil",
"tabs_bar.federated_timeline": "Global",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Conteúdo sensível",
"status.share": "Compartilhar",
"status.show_less": "Mostrar menos",
"status.show_less_all": "Show less for all",
"status.show_more": "Mostrar mais",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Deixar de silenciar esta conversa",
"status.unpin": "Não fixar no perfil",
"tabs_bar.federated_timeline": "Global",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Чувствительный контент",
"status.share": "Поделиться",
"status.show_less": "Свернуть",
"status.show_less_all": "Show less for all",
"status.show_more": "Развернуть",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Снять глушение с треда",
"status.unpin": "Открепить от профиля",
"tabs_bar.federated_timeline": "Глобальная",

View File

@ -217,8 +217,8 @@
"report.placeholder": "Ďalšie komentáre",
"report.submit": "Poslať",
"report.target": "Nahlásenie {target}",
"search.placeholder": "Hľadať",
"search_popout.search_format": "Pokročilý formát vyhľadávania",
"search.placeholder": "Hľadaj",
"search_popout.search_format": "Pokročilé vyhľadávanie",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
"search_popout.tips.hashtag": "haštag",
"search_popout.tips.status": "status",
@ -252,7 +252,9 @@
"status.sensitive_warning": "Chúlostivý obsah",
"status.share": "Zdieľať",
"status.show_less": "Zobraz menej",
"status.show_less_all": "Show less for all",
"status.show_more": "Zobraz viac",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Prestať ignorovať konverzáciu",
"status.unpin": "Odopnúť z profilu",
"tabs_bar.federated_timeline": "Federovaná",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Osetljiv sadržaj",
"status.share": "Podeli",
"status.show_less": "Prikaži manje",
"status.show_less_all": "Show less for all",
"status.show_more": "Prikaži više",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Uključi prepisku",
"status.unpin": "Otkači sa profila",
"tabs_bar.federated_timeline": "Federisano",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Осетљив садржај",
"status.share": "Подели",
"status.show_less": "Прикажи мање",
"status.show_less_all": "Show less for all",
"status.show_more": "Прикажи више",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Укључи преписку",
"status.unpin": "Откачи са профила",
"tabs_bar.federated_timeline": "Федерисано",

View File

@ -1,9 +1,9 @@
{
"account.block": "Blockera @{name}",
"account.block_domain": "Dölj allt från {domain}",
"account.blocked": "Blocked",
"account.blocked": "Blockerad",
"account.disclaimer_full": "Informationen nedan kan spegla användarens profil ofullständigt.",
"account.domain_blocked": "Domain hidden",
"account.domain_blocked": "Domän gömd",
"account.edit_profile": "Redigera profil",
"account.follow": "Följ",
"account.followers": "Följare",
@ -15,9 +15,9 @@
"account.moved_to": "{name} har flyttat till:",
"account.mute": "Tysta @{name}",
"account.mute_notifications": "Stäng av notifieringar från @{name}",
"account.muted": "Muted",
"account.muted": "Nertystad",
"account.posts": "Inlägg",
"account.posts_with_replies": "Toots with replies",
"account.posts_with_replies": "Toots med svar",
"account.report": "Rapportera @{name}",
"account.requested": "Inväntar godkännande. Klicka för att avbryta följförfrågan",
"account.share": "Dela @{name}'s profil",
@ -211,20 +211,20 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"reply_indicator.cancel": "Ångra",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
"report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
"report.forward": "Vidarebefordra till {target}",
"report.forward_hint": "Kontot är från en annan server. Skicka även en anonymiserad kopia av anmälan dit?",
"report.hint": "Anmälan skickas till din instans moderatorer. Du kan ge en förklaring till varför du har anmält detta konto nedan:",
"report.placeholder": "Ytterligare kommentarer",
"report.submit": "Skicka",
"report.target": "Rapporterar {target}",
"search.placeholder": "Sök",
"search_popout.search_format": "Avancerat sökformat",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
"search_popout.tips.full_text": "Enkel text returnerar statusar där du har skrivit, favoriserat, knuffat eller nämnts samt med matchande användarnamn, visningsnamn och hashtags.",
"search_popout.tips.hashtag": "hashtag",
"search_popout.tips.status": "status",
"search_popout.tips.text": "Enkel text returnerar matchande visningsnamn, användarnamn och hashtags",
"search_popout.tips.user": "användare",
"search_results.accounts": "People",
"search_results.accounts": "Människor",
"search_results.hashtags": "Hashtags",
"search_results.statuses": "Toots",
"search_results.total": "{count, number} {count, plural, ett {result} andra {results}}",
@ -242,7 +242,7 @@
"status.mute_conversation": "Tysta konversation",
"status.open": "Utvidga denna status",
"status.pin": "Fäst i profil",
"status.pinned": "Pinned toot",
"status.pinned": "Fäst toot",
"status.reblog": "Knuff",
"status.reblogged_by": "{name} knuffade",
"status.reply": "Svara",
@ -252,7 +252,9 @@
"status.sensitive_warning": "Känsligt innehåll",
"status.share": "Dela",
"status.show_less": "Visa mindre",
"status.show_less_all": "Show less for all",
"status.show_more": "Visa mer",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Öppna konversation",
"status.unpin": "Ångra fäst i profil",
"tabs_bar.federated_timeline": "Förenad",
@ -263,7 +265,7 @@
"upload_area.title": "Dra & släpp för att ladda upp",
"upload_button.label": "Lägg till media",
"upload_form.description": "Beskriv för synskadade",
"upload_form.focus": "Crop",
"upload_form.focus": "Beskär",
"upload_form.undo": "Ångra",
"upload_progress.label": "Laddar upp...",
"video.close": "Stäng video",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Sensitive content",
"status.share": "Share",
"status.show_less": "Show less",
"status.show_less_all": "Show less for all",
"status.show_more": "Show more",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Federated",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Hassas içerik",
"status.share": "Share",
"status.show_less": "Daha azı",
"status.show_less_all": "Show less for all",
"status.show_more": "Daha fazlası",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Unmute conversation",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Federe",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "Непристойний зміст",
"status.share": "Share",
"status.show_less": "Згорнути",
"status.show_less_all": "Show less for all",
"status.show_more": "Розгорнути",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "Зняти глушення з діалогу",
"status.unpin": "Unpin from profile",
"tabs_bar.federated_timeline": "Глобальна",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "敏感内容",
"status.share": "分享",
"status.show_less": "隐藏内容",
"status.show_less_all": "Show less for all",
"status.show_more": "显示内容",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "不再隐藏此对话",
"status.unpin": "在个人资料页面取消置顶",
"tabs_bar.federated_timeline": "跨站",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "敏感內容",
"status.share": "Share",
"status.show_less": "減少顯示",
"status.show_less_all": "Show less for all",
"status.show_more": "顯示更多",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "解禁對話",
"status.unpin": "解除置頂",
"tabs_bar.federated_timeline": "跨站",

View File

@ -252,7 +252,9 @@
"status.sensitive_warning": "敏感內容",
"status.share": "Share",
"status.show_less": "看少點",
"status.show_less_all": "Show less for all",
"status.show_more": "看更多",
"status.show_more_all": "Show more for all",
"status.unmute_conversation": "不消音對話",
"status.unpin": "解除置頂",
"tabs_bar.federated_timeline": "聯盟",

View File

@ -35,6 +35,8 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrde
import uuid from '../uuid';
import { me } from '../initial_state';
const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d';
const initialState = ImmutableMap({
mounted: 0,
sensitive: false,
@ -135,12 +137,14 @@ const updateSuggestionTags = (state, token) => {
};
const insertEmoji = (state, position, emojiData) => {
const emoji = emojiData.native;
const oldText = state.get('text');
const needsSpace = emojiData.custom && position > 0 && !allowedAroundShortCode.includes(oldText[position - 1]);
const emoji = needsSpace ? ' ' + emojiData.native : emojiData.native;
return state.withMutations(map => {
map.update('text', oldText => `${oldText.slice(0, position)}${emoji} ${oldText.slice(position)}`);
map.set('focusDate', new Date());
map.set('idempotencyKey', uuid());
return state.merge({
text: `${oldText.slice(0, position)}${emoji} ${oldText.slice(position)}`,
focusDate: new Date(),
idempotencyKey: uuid(),
});
};

View File

@ -3422,8 +3422,12 @@ a.status-card {
img,
canvas,
video {
max-width: 100vw;
max-height: 100vh;
max-width: 100%;
/*
put margins on top and bottom of image to avoid the screen coverd by
image.
*/
max-height: 80%;
width: auto;
height: auto;
margin: auto;
@ -3435,11 +3439,6 @@ a.status-card {
background: url('~images/void.png') repeat;
object-fit: contain;
}
.react-swipeable-view-container {
width: 100vw;
height: 100%;
}
}
.media-modal__closer {
@ -4315,18 +4314,16 @@ a.status-card {
display: block;
text-decoration: none;
color: $ui-secondary-color;
height: 100%;
line-height: 0;
&,
img {
height: 100%;
width: 100%;
}
img {
position: relative;
object-fit: cover;
height: auto;
}
}
@ -5076,6 +5073,12 @@ noscript {
}
}
.focal-point-modal {
max-width: 80vw;
max-height: 80vh;
position: relative;
}
.focal-point {
position: relative;
cursor: pointer;
@ -5085,6 +5088,14 @@ noscript {
cursor: move;
}
img {
max-width: 80vw;
max-height: 80vh;
width: auto;
height: auto;
margin: auto;
}
&__reticle {
position: absolute;
width: 100px;

View File

@ -12,7 +12,7 @@
class Tag < ApplicationRecord
has_and_belongs_to_many :statuses
HASHTAG_NAME_RE = '[[:word:]_]*[[:alpha:]_][[:word:]_]*'
HASHTAG_NAME_RE = '[[:word:]_]*[[:alpha:]_·][[:word:]_]*'
HASHTAG_RE = /(?:^|[^\/\)\w])#(#{HASHTAG_NAME_RE})/i
validates :name, presence: true, uniqueness: true, format: { with: /\A#{HASHTAG_NAME_RE}\z/i }

View File

@ -11,10 +11,14 @@ ar:
domain_count_after: خوادم أخرى
domain_count_before: متصل بـ
features:
humane_approach_body: تعلُّمًا مِن فشل الشبكات الأخرى، غاية ماستدون هي بلوغ الخيارات الأخلاقية في التصميم لمُحارَبة إسائة إستعمال شبكات التواصل الإجتماعية.
humane_approach_title: أسلوب يعيد الإعتبار للإنسان
not_a_product_body: ماستدون ليس شبكة تجارية. لا يحتوي على إعلانات و لا يقوم باستغلال البيانات و لا هو بِبُستان مُسيَّج. لا تحكم فيه وليس له أية هيئةٍ مركزيةٍ.
not_a_product_title: إنك إنسان و لست سلعة
real_conversation_body: يُمكنكم التعبير عن آرائكم بكل حرية بفضل 500 حرف و انتقاء دقيق للمحتوى و الوسائط بفضل أدوات التحذير التي هي بين أيديكم.
real_conversation_title: مبني لتحقيق تواصل حقيقي
within_reach_body: إبقوا على اتصال دائم بأصدقائكم حيثما كانوا عبر عدة تطبيقات لنظام آي أواس و أندرويد و عدة منصات أخرى بفضل واجهة برمجية للتطبيقات و بيئة صديقة للتطوير.
within_reach_title: في مُتناوَل يدك دائمًا
generic_description: "%{domain} هو سيرفر من بين سيرفرات الشبكة"
hosted_on: ماستدون مُستضاف على %{domain}
learn_more: تعلم المزيد
@ -49,11 +53,13 @@ ar:
created_at: التاريخ
created_msg: تم إنشاء ملاحظة الإشراف بنجاح !
delete: حذف
destroyed_msg: تم تدمير ملاحظة الإشراف بنجاح !
accounts:
are_you_sure: متأكد ؟
by_domain: النطاق
confirm: تأكيد
confirmed: مؤكَّد
demote: إنزال الرُتبة الوظيفية
disable: تعطيل
disable_two_factor_authentication: تعطيل 2FA
disabled: معطَّل
@ -87,6 +93,7 @@ ar:
most_recent: الأحدث
title: الترتيب
profile_url: رابط الملف الشخصي
promote: ترقية
protocol: البروتوكول
public: عمومي
redownload: تحديث الصورة الرمزية
@ -100,31 +107,53 @@ ar:
user: مستخدِم
salmon_url: عنوان رابط سالمون Salmon
search: البحث
show:
created_reports: البلاغات التي أنشأها هذا الحساب
report: التقرير
targeted_reports: التقريرات التي أُنشِأت ضد هذا الحساب
statuses: المنشورات
title: الحسابات
undo_suspension: إلغاء تعليق الحساب
username: إسم المستخدم
web: الويب
action_logs:
actions:
confirm_user: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}"
create_custom_emoji: "%{name} قام برفع إيموجي جديد %{target}"
create_domain_block: "%{name} قام بحجب نطاق %{target}"
create_email_domain_block: "%{name} قد قام بحظر نطاق البريد الإلكتروني %{target}"
demote_user: "%{name} قد قام بإنزال الرتبة الوظيفية لـ %{target}"
destroy_domain_block: "%{name} قام بإلغاء الحجب عن النطاق %{target}"
disable_2fa_user: "%{name} لقد قام بتعطيل ميزة المصادقة بخطوتين للمستخدم %{target}"
disable_custom_emoji: "%{name} قام بتعطيل الإيموجي %{target}"
disable_user: "%{name} لقد قام بتعطيل تسجيل الدخول للمستخدِم %{target}"
enable_custom_emoji: "%{name} قام بتنشيط الإيموجي %{target}"
enable_user: "%{name} لقد قام بتنشيط تسجيل الدخول للمستخدِم %{target}"
promote_user: "%{name} قام بترقية المستخدم %{target}"
reset_password_user: "%{name} لقد قام بإعادة تعيين الكلمة السرية الخاصة بـ %{target}"
update_custom_emoji: "%{name} قام بتحديث الإيموجي %{target}"
title: سِجلّ التفتيش و المعاينة
custom_emojis:
by_domain: النطاق
copied_msg: تم إنشاء نسخة محلية للإيموجي بنجاح
copy: نسخ
copy_failed_msg: فشلت عملية إنشاء نسخة محلية لهذا الإيموجي
created_msg: تم إنشاء الإيموجي بنجاح !
delete: حذف
destroyed_msg: تمت عملية تدمير الإيموجي بنجاح !
disable: تعطيل
disabled_msg: تمت عملية تعطيل ذلك الإيموجي بنجاح
emoji: إيموجي
enable: تفعيل
enabled_msg: تم تنشيط ذاك الإيموجي بنجاح
image_hint: ملف PNG إلى غاية حجم 50 ك.ب
new:
title: إضافة إيموجي خاص جديد
shortcode: الترميز المُصَغّر
shortcode_hint: على الأقل حرفين، و فقط رموز أبجدية عددية و أسطر سفلية
title: الإيموجي الخاصة
update_failed_msg: تعذرت عملية تحذيث ذاك الإيموجي
updated_msg: تم تحديث الإيموجي بنجاح !
upload: رفع
domain_blocks:
add_new: إضافة نطاق جديد
@ -135,9 +164,11 @@ ar:
noop: لا شيء
silence: كتم
title: حجب نطاق جديد
reject_media: رفض ملفات الوسائط
severities:
noop: لا شيء
show:
title: رفع حظر النطاق عن %{domain}
undo: إلغاء
undo: إلغاء
email_domain_blocks:
@ -145,6 +176,7 @@ ar:
domain: النطاق
new:
create: إضافة نطاق
title: القائمة السوداء للبريد الإلكتروني
instances:
account_count: الحسابات المعروفة
domain_name: النطاق
@ -156,8 +188,10 @@ ar:
all: الكل
available: المتوفرة
expired: المنتهي صلاحيتها
title: التصفية
title: الدعوات
reports:
action_taken_by: تم اتخاذ الإجراء مِن طرف
are_you_sure: هل أنت متأكد ؟
comment:
label: تعليق
@ -174,6 +208,7 @@ ar:
settings:
contact_information:
email: البريد الإلكتروني المهني
username: الإتصال بالمستخدِم
registrations:
closed_message:
title: رسالة التسجيلات المقفلة
@ -221,6 +256,7 @@ ar:
regenerate_token: إعادة توليد رمز النفاذ
your_token: رمز نفاذك
auth:
agreement_html: بقبولك التسجيل فإنك تُصرِّح قبول <a href="%{rules_path}">قواعد مثيل الخادوم</a> و <a href="%{terms_path}">شروط الخدمة التي نوفرها لك</a>.
confirm_email: تأكيد عنوان البريد الإلكتروني
delete_account: حذف حساب
delete_account_html: إن كنت ترغب في حذف حسابك يُمكنك <a href="%{path}">المواصلة هنا</a>. سوف يُطلَبُ منك التأكيد قبل الحذف.
@ -275,6 +311,11 @@ ar:
content: نحن متأسفون، لقد حدث خطأ ما مِن جانبنا.
title: هذه الصفحة خاطئة
exports:
archive_takeout:
download: تنزيل نسخة لحسابك
hint_html: بإمكانك طلب نسخة كاملة لـ <strong>كافة تبويقاتك و الوسائط التي قمت بنشرها</strong>. البيانات المُصدَّرة ستكون محفوظة على شكل نسق ActivityPub و باستطاعتك قراءتها بأي برنامج يدعم هذا النسق.
in_progress: عملية جمع نسخة لبيانات حسابك جارية …
request: طلب نسخة لحسابك
blocks: قمت بحظر
csv: CSV
follows: أنت تتبع
@ -314,7 +355,7 @@ ar:
table:
expires_at: تنتهي مدة صلاحيتها في
title: دعوة أشخاص
landing_strip_html: "<strong>%{name}</strong> is a user on %{link_to_root_path}. You can follow them or interact with them if you have an account anywhere in the fediverse.."
landing_strip_html: "<strong>%{name}</strong> هو أحد مُستخدِمي %{link_to_root_path}. بإمكانك متابعته أو التواصل معه إن كنت تملك حسابًا أيا كان على البيئة الموحَّدة فيديفرس."
landing_strip_signup_html: إن كنت لا تملك واحدا، يمكنك <a href="%{sign_up_path}">التسجيل مِن هنا</a>.
lists:
errors:
@ -371,7 +412,9 @@ ar:
trillion: T
unit: ''
pagination:
newer: الأحدَث
next: التالي
older: الأقدَم
prev: السابق
truncate: "&hellip;"
preferences:
@ -488,6 +531,10 @@ ar:
recovery_codes_regenerated: تم إعادة توليد رموز الإسترجاع الإحتياطية بنجاح
setup: تنشيط
wrong_code: الرمز الذي أدخلته غير صالح ! تحقق من صحة الوقت على الخادم و الجهاز ؟
user_mailer:
backup_ready:
subject: نسخة بيانات حسابك جاهزة للتنزيل
title: المغادرة بأرشيف الحساب
users:
invalid_email: عنوان البريد الإلكتروني غير صالح
invalid_otp_token: الرمز الثنائي غير صالح

View File

@ -57,7 +57,7 @@ fi:
prompt: Applikaatio %{client_name} pyytää lupaa tilillesi
title: Valtuutus vaaditaan
show:
title: Copy this authorization code and paste it to the application.
title: Kopioi tämä valtuutuskoodi ja liitä se applikaatioon.
authorized_applications:
buttons:
revoke: Evää
@ -73,7 +73,7 @@ fi:
messages:
access_denied: Resurssin omistaja tai valtuutus palvelin hylkäsi pyynnönr.
credential_flow_not_configured: Resurssin omistajan salasana epäonnistui koska Doorkeeper.configure.resource_owner_from_credentials ei ole konfiguroitu.
invalid_client: Asiakkaan valtuutus epäonnistui koska tuntematon asiakas, asiakas ei sisältänyt valtuutusta, tai tukematon valtuutus tapa
invalid_client: Asiakkaan valtuutus epäonnistui koska tuntematon asiakas, asiakas ei sisältänyt valtuutusta, tai tukematon valtuutus tapa.
invalid_grant: Antamasi valtuutus lupa on joko väärä, erääntynyt, peruttu, ei vastaa uudelleenohjaus URI jota käytetään valtuutus pyynnössä, tai se myönnettin toiselle asiakkaalle.
invalid_redirect_uri: Uudelleenohjaus uri ei ole oikein.
invalid_request: Pyynnöstä puutti parametri, sisältää tukemattoman parametri arvonn, tai on korruptoitunut.

View File

@ -114,6 +114,6 @@ sv:
application:
title: OAuth-behörighet krävs
scopes:
follow: följ, blockera, ta bort blockering och sluta följa konton
read: läs dina kontodata
write: posta på dina vägnar
follow: följa, blockera, ta bort blockerade och sluta följa konton
read: läsa dina kontodata
write: posta åt dig

View File

@ -120,8 +120,8 @@ fi:
body: 'Tässä on pieni yhteenveto palvelimelta %{instance} viimeksi kun olit paikalla %{since}:'
mention: "%{name} mainitsi sinut:"
new_followers_summary:
one: Olet saanut yhden uuden seuraajan! Jee!
other: Olet saanut %{count} uutta seuraajaa! Loistavaa!
one: Olet myös saanut yhden uuden seuraajan poissaollessasi! Jee!
other: Olet saanut %{count} uutta seuraajaa poissaollessasi! Loistavaa!
subject:
one: "1 uusi ilmoitus viimeisen käyntisi jälkeen \U0001F418"
other: "%{count} uutta ilmoitusta viimeisen käyntisi jälkeen \U0001F418"

View File

@ -4,41 +4,43 @@ fi:
hints:
defaults:
avatar: PNG, GIF tai JPG. Korkeintaan 2MB. Skaalataan kokoon 400x400px
digest: Lähetetään vain pitkän poissaolon jälkeen, ja vain jos olet vastaanottanut yksityisviestejä poissaolosi aikana.
display_name: Korkeintaan 30 merkkiä
header: PNG, GIF tai JPG. Korkeintaan 2MB. Skaalataan kokoon 700x335px
locked: Vaatii sinun manuaalisesti hyväksymään seuraajat ja asettaa julkaisujen yksityisyyden vain seuraajille
locked: Vaatii sinun manuaalisesti hyväksymään seuraajat, ja asettaa julkaisujen yksityisyyden vain seuraajille
note: Korkeintaan 160 merkkiä
imports:
data: CSV tiedosto tuotu toiselta Mastodon palvelimelta
labels:
defaults:
avatar: Avatar
avatar: Profiilikuva
confirm_new_password: Varmista uusi salasana
confirm_password: Varmista salasana
current_password: Nykyinen salasana
data: Data
display_name: Näykyvä nimi
email: Sähköpostiosoite
header: Header
header: Otsake
locale: Kieli
locked: Tee tilistä yksityinen
max_uses: Max käyttökerrat
new_password: Uusi salasana
note: Bio
otp_attempt: Kaksivaiheinen koodi
password: Salasana
setting_default_privacy: Julkaisun yksityisyys
type: Tuonti tyyppi
type: Tuontityyppi
username: Käyttäjänimi
interactions:
must_be_follower: Estä ilmoitukset käyttäjiltä jotka eivät seuraa sinua
must_be_following: Estä ilmoitukset käyttäjiltä joita et seuraa
notification_emails:
digest: Send digest e-mails
favourite: Lähetä s-posti kun joku tykkää statuksestasi
follow: Lähetä s-posti kun joku seuraa sinua
follow_request: Lähetä s-posti kun joku pyytää seurata sinua
mention: Lähetä s-posti kun joku mainitsee sinut
reblog: Lähetä s-posti kun joku buustaa julkaisusi
digest: Lähetä koosteviestejä sähköpostilla
favourite: Lähetä sähköposti, kun joku tykkää statuksestasi
follow: Lähetä sähköposti, kun joku seuraa sinua
follow_request: Lähetä sähköposti, kun joku pyytää seurata sinua
mention: Lähetä sähköposti, kun joku mainitsee sinut
reblog: Lähetä sähköposti, kun joku buustaa julkaisusi
'no': Ei
required:
mark: "*"

View File

@ -13,8 +13,8 @@ sv:
note:
one: <span class="note-counter">1</span> tecken kvar
other: <span class="note-counter">%{count}</span> tecken kvar
setting_noindex: Påverkar din offentliga profil och status sidor
setting_theme: Påverkar hur Mastodon ser ut när du är inloggad från vilken enhet som helst.
setting_noindex: Påverkar din offentliga profil och statussidor
setting_theme: Påverkar hur Mastodon ser ut oavsett från vilken enhet du är inloggad.
imports:
data: CSV-fil som exporteras från en annan Mastodon-instans
sessions:
@ -32,7 +32,7 @@ sv:
email: E-postadress
expires_in: Förfaller efter
filtered_languages: Filtrerade språk
header: Rubrik
header: Bakgrundsbild
locale: Språk
locked: Lås konto
max_uses: Högst antal användningar
@ -45,6 +45,7 @@ sv:
setting_default_privacy: Postintegritet
setting_default_sensitive: Markera alltid media som känsligt
setting_delete_modal: Visa bekräftelsedialog innan du raderar en toot
setting_display_sensitive_media: Visa alltid media märkt som känsligt
setting_noindex: Uteslutning av sökmotorindexering
setting_reduce_motion: Minska rörelser i animationer
setting_system_font_ui: Använd systemets standardfont

View File

@ -397,8 +397,8 @@ sk:
about_x_months: "%{count}mesiace"
about_x_years: "%{count}rok"
almost_x_years: "%{count}rok"
half_a_minute: Len teraz
less_than_x_seconds: Len teraz
half_a_minute: Práve teraz
less_than_x_seconds: Práve teraz
over_x_years: "%{count}rok"
x_days: "%{count}dni"
x_minutes: ''
@ -629,6 +629,8 @@ sk:
terms:
title: Podmienky užívania, a pravidlá o súkromí pre %{instance}
two_factor_authentication:
enable: Povoliť
generate_recovery_codes: Vygeneruj zálohové kódy
setup: Nastavenie
user_mailer:
backup_ready:
@ -640,12 +642,15 @@ sk:
explanation: Tu nájdeš nejaké tipy do začiatku
final_action: Začni prispievať
final_step: 'Začnite písať! Aj bez následovníkov budú vaše verejné správy videné ostatnými, napríklad na lokálnej osi a pod haštagmi. Môžete sa ostatným predstaviť pod haštagom #introductions.'
full_handle: Adresa tvojho profilu v celom formáte
review_preferences_action: Zmeniť nastavenia
subject: Vitaj na Mastodone
tip_local_timeline: Lokálna os je celkový pohľad na aktivitu užívateľov %{instance}. Toto sú tvoji najbližší susedia!
tip_mobile_webapp: Pokiaľ ti prehliadač ponúkne možnosť pridať Mastodon na tvoju obrazovku, môžeš potom dostávať notifikácie skoro ako z natívnej aplikácie!
tips: Tipy
title: Vitaj na palube, %{name}!
users:
invalid_email: Emailová adresa je neplatná
invalid_otp_token: Neplatný kód pre dvojfaktorovú autentikáciu
seamless_external_login: Si prihlásená/ý cez externú službu, takže nastavenia hesla a emailu ti niesú prístupné.
signed_in_as: 'Prihlásený ako:'

View File

@ -273,6 +273,9 @@ sv:
contact_information:
email: Företag E-post
username: Användarnamn för kontakt
hero:
desc_html: Visas på framsidan. Minst 600x100px rekommenderas. Om inte angiven faller den tillbaka på instansens miniatyrbild
title: Hjältebild
peers_api_enabled:
desc_html: Domännamn denna instans har påträffat i fediverse
title: Publicera lista över upptäckta instanser
@ -356,6 +359,7 @@ sv:
your_token: Din access token
auth:
agreement_html: Genom att registrera dig godkänner du att följa <a href="%{rules_path}">instansens regler</a> och <a href="%{terms_path}">våra användarvillkor</a>.
change_password: Lösenord
confirm_email: Bekräfta e-postadress
delete_account: Ta bort konto
delete_account_html: Om du vill radera ditt konto kan du <a href="%{path}">fortsätta här</a>. Du kommer att bli ombedd att bekräfta.
@ -366,11 +370,13 @@ sv:
logout: Logga ut
migrate_account: Flytta till ett annat konto
migrate_account_html: Om du vill omdirigera detta konto till ett annat, kan du <a href="%{path}">konfigurera det här</a>.
or: eller
or_log_in_with: Eller logga in med
providers:
cas: CAS
saml: SAML
register: Registrera
register_elsewhere: Registrera dig på en annan server
resend_confirmation: Skicka instruktionerna om bekräftelse igen
reset_password: Återställ lösenord
security: Säkerhet
@ -420,14 +426,21 @@ sv:
title: Den här sidan är inte korrekt
noscript_html: För att använda Mastodon webbapplikationen, vänligen aktivera JavaScript. Alternativt kan du prova en av <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">inhemska appar</a> för Mastodon för din plattform.
exports:
archive_takeout:
date: Datum
download: Ladda ner ditt arkiv
hint_html: Du kan begära ett arkiv av dina <strong>toots och uppladdad media</strong>. Den exporterade datan kommer att vara i ActivityPub-format och läsbar av kompatibel programvara.
in_progress: Kompilerar ditt arkiv...
request: Efterfråga ditt arkiv
size: Storlek
blocks: Du blockerar
csv: CSV
follows: Du följer
mutes: Du tystar
storage: Media lagring
storage: Medialagring
followers:
domain: Domän
explanation_html: Om du vill se integriteten för dina statusar måste du vara medveten om vem som följer dig. <strong>Dina privata statusar levereras till alla instanser där du har följare</strong>. Du kanske vill granska dem och ta bort följare om du inte litar på att din integritet respekteras av staff eller programvaran i instanserna.
explanation_html: Om du vill försäkra integriteten av dina statusar måste du vara medveten om vem som följer dig. <strong>Dina privata statusar levereras till alla instanser där du har följare</strong>. Du kanske vill granska och eventuellt ta bort följare om du inte litar på att din integritet respekteras hos medarbetarna eller programvara i dessa instanser.
followers_count: Antal följare
lock_link: Lås ditt konto
purge: Ta bort från följare
@ -435,7 +448,7 @@ sv:
one: I processen med soft-blocking följare från en domän ...
other: I processen med soft-blocking följare från %{count} domäner...
true_privacy_html: Kom ihåg att <strong>sann integritet kan bara uppnås med end-to-end kryptering</strong>.
unlocked_warning_html: Vem som helst kan följa dig omedelbart se dina privata statusar. %{lock_link} för att kunna granska och avvisa följare.
unlocked_warning_html: Vem som helst kan följa dig för att omedelbart se dina privata statusar. %{lock_link} för att kunna granska och avvisa följare.
unlocked_warning_title: Ditt konto är inte låst
generic:
changes_saved_msg: Ändringar sparades framgångsrikt!
@ -448,9 +461,9 @@ sv:
preface: Du kan importera data som du exporterat från en annan instans, till exempel en lista över personer du följer eller blockerar.
success: Dina uppgifter har laddats upp och kommer nu att behandlas snarast
types:
blocking: Blockering lista
following: Följare lista
muting: Tystade lista
blocking: Lista av blockerade
following: Lista av följare
muting: Lista av nertystade
upload: Ladda upp
in_memoriam_html: Till minne av.
invites:
@ -535,7 +548,9 @@ sv:
trillion: T
unit: enhet
pagination:
newer: Nyare
next: Nästa
older: Äldre
prev: Tidigare
truncate: "&hellip;"
preferences:
@ -551,7 +566,7 @@ sv:
group:
title: "%{count} meddelanden"
mention:
action_boost: Boosta
action_boost: Knuffa
action_expand: Visa mer
action_favourite: Favoriter
title: "%{name} nämnde dig"
@ -609,7 +624,7 @@ sv:
delete: Konto radering
development: Utveckling
edit_profile: Redigera profil
export: Data export
export: Exportera data
followers: Auktoriserade följare
import: Import
migrate: Kontoflytt
@ -625,7 +640,7 @@ sv:
limit: Du har redan fäst det maximala antalet toots
ownership: Någon annans toot kan inte fästas
private: Icke-offentliga toot kan inte fästas
reblog: En boost kan inte fästas
reblog: Knuffar kan inte fästas
show_more: Visa mer
title: '%{name}: "%{quote}"'
visibilities:
@ -634,7 +649,7 @@ sv:
public: Offentlig
public_long: Alla kan se
unlisted: Olistade
unlisted_long: Alla kan se, men inte listade på offentliga tidslinjer
unlisted_long: Alla kan se, men listas inte på offentliga tidslinjer
stream_entries:
click_to_show: Klicka för att visa
pinned: Fäst toot
@ -717,7 +732,7 @@ sv:
default: "%b %d, %Y, %H:%M"
two_factor_authentication:
code_hint: Ange koden som genererats av din autentiseringsapp för att bekräfta
description_html: Om du aktiverar <strong>tvåfaktors autentisering</strong>, loggar in kommer att kräva att du är i besittning av din telefon, vilket kommer att generera tokens för dig att uppge.
description_html: Om du aktiverar <strong>tvåstegsautentisering</strong> kommer inloggningen kräva att du har din telefon tillgänglig, vilket kommer att generera tokens för dig att uppge.
disable: Avaktivera
enable: Aktivera
enabled: Tvåfaktorsautentisering är aktiverad
@ -732,9 +747,13 @@ sv:
setup: Ställ in
wrong_code: Den angivna koden var ogiltig! Är servertid och enhetstid korrekt?
user_mailer:
backup_ready:
explanation: Du begärde en fullständig säkerhetskopiering av ditt Mastodon-konto. Det är nu klart för nedladdning!
subject: Ditt arkiv är klart för nedladdning
title: Arkivuttagning
welcome:
edit_profile_action: Profilinställning
edit_profile_step: Du kan anpassa din profil genom att ladda upp en avatar, rubrik, ändra ditt visningsnamn och mer. Om du vill granska nya följare innan de får följa dig kan du låsa ditt konto.
edit_profile_step: Du kan anpassa din profil genom att ladda upp en avatar, bakgrundsbild, ändra ditt visningsnamn och mer. Om du vill granska nya följare innan de får följa dig kan du låsa ditt konto.
explanation: Här är några tips för att komma igång
final_action: Börja posta
final_step: 'Börja posta! Även utan anhängare kan dina offentliga meddelanden ses av andra, till exempel på den lokala tidslinjen och i hashtags. Du får gärna presentera dig via hashtaggen #introductions.'
@ -753,4 +772,5 @@ sv:
users:
invalid_email: E-postadressen är ogiltig
invalid_otp_token: Ogiltig tvåfaktorkod
seamless_external_login: Du är inloggad via en extern tjänst, så lösenord och e-postinställningar är inte tillgängliga.
signed_in_as: 'Inloggad som:'

View File

@ -13,7 +13,7 @@ module Mastodon
end
def patch
0
1
end
def pre
@ -21,7 +21,7 @@ module Mastodon
end
def flags
''
'rc2'
end
def to_a

View File

@ -224,6 +224,12 @@ namespace :mastodon do
prompt.say "\n"
loop do
if prompt.yes?('Do you want to send e-mails from localhost?', default: false)
env['SMTP_SERVER'] = 'localhost'
env['SMTP_PORT'] = 25
env['SMTP_AUTH_METHOD'] = 'none'
env['SMTP_OPENSSL_VERIFY_MODE'] = 'none'
else
env['SMTP_SERVER'] = prompt.ask('SMTP server:') do |q|
q.required true
q.default 'smtp.mailgun.org'
@ -244,6 +250,19 @@ namespace :mastodon do
q.echo false
end
env['SMTP_AUTH_METHOD'] = prompt.ask('SMTP authentication:') do |q|
q.required
q.default 'plain'
q.modify :strip
end
env['SMTP_OPENSSL_VERIFY_MODE'] = prompt.ask('SMTP OpenSSL verify mode:') do |q|
q.required
q.default 'peer'
q.modify :strip
end
end
env['SMTP_FROM_ADDRESS'] = prompt.ask('E-mail address to send e-mails "from":') do |q|
q.required true
q.default "Mastodon <notifications@#{env['LOCAL_DOMAIN']}>"
@ -261,7 +280,8 @@ namespace :mastodon do
:user_name => env['SMTP_LOGIN'].presence,
:password => env['SMTP_PASSWORD'].presence,
:domain => env['LOCAL_DOMAIN'],
:authentication => :plain,
:authentication => env['SMTP_AUTH_METHOD'] == 'none' ? nil : env['SMTP_AUTH_METHOD'] || :plain,
:openssl_verify_mode => env['SMTP_OPENSSL_VERIFY_MODE'],
:enable_starttls_auto => true,
}
@ -271,6 +291,7 @@ namespace :mastodon do
mail = ActionMailer::Base.new.mail to: send_to, subject: 'Test', body: 'Mastodon SMTP configuration works!'
mail.deliver
break
rescue StandardError => e
prompt.error 'E-mail could not be sent with this configuration, try again.'
prompt.error e.message
@ -302,7 +323,7 @@ namespace :mastodon do
prompt.say 'Running `RAILS_ENV=production rails db:setup` ...'
prompt.say "\n"
if cmd.run!({ RAILS_ENV: 'production' }, :rails, 'db:setup').failure?
if cmd.run!({ RAILS_ENV: 'production', SAFETY_ASSURED: 1 }, :rails, 'db:setup').failure?
prompt.say "\n"
prompt.error 'That failed! Perhaps your configuration is not right'
else

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB