Merge pull request #3007 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 1960aac90b16fce1ec620ac990aa931efcf04700
This commit is contained in:
commit
69be65bed3
12
Gemfile.lock
12
Gemfile.lock
@ -91,7 +91,7 @@ GEM
|
|||||||
aes_key_wrap (1.1.0)
|
aes_key_wrap (1.1.0)
|
||||||
android_key_attestation (0.3.0)
|
android_key_attestation (0.3.0)
|
||||||
annotaterb (4.14.0)
|
annotaterb (4.14.0)
|
||||||
ast (2.4.2)
|
ast (2.4.3)
|
||||||
attr_required (1.0.2)
|
attr_required (1.0.2)
|
||||||
aws-eventstream (1.3.2)
|
aws-eventstream (1.3.2)
|
||||||
aws-partitions (1.1066.0)
|
aws-partitions (1.1066.0)
|
||||||
@ -170,7 +170,7 @@ GEM
|
|||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
css_parser (1.21.1)
|
css_parser (1.21.1)
|
||||||
addressable
|
addressable
|
||||||
csv (3.3.2)
|
csv (3.3.3)
|
||||||
database_cleaner-active_record (2.2.0)
|
database_cleaner-active_record (2.2.0)
|
||||||
activerecord (>= 5.a)
|
activerecord (>= 5.a)
|
||||||
database_cleaner-core (~> 2.0.0)
|
database_cleaner-core (~> 2.0.0)
|
||||||
@ -257,7 +257,7 @@ GEM
|
|||||||
fog-json (1.2.0)
|
fog-json (1.2.0)
|
||||||
fog-core
|
fog-core
|
||||||
multi_json (~> 1.10)
|
multi_json (~> 1.10)
|
||||||
fog-openstack (1.1.4)
|
fog-openstack (1.1.5)
|
||||||
fog-core (~> 2.1)
|
fog-core (~> 2.1)
|
||||||
fog-json (>= 1.0)
|
fog-json (>= 1.0)
|
||||||
formatador (1.1.0)
|
formatador (1.1.0)
|
||||||
@ -280,7 +280,7 @@ GEM
|
|||||||
activesupport (>= 5.1)
|
activesupport (>= 5.1)
|
||||||
haml (>= 4.0.6)
|
haml (>= 4.0.6)
|
||||||
railties (>= 5.1)
|
railties (>= 5.1)
|
||||||
haml_lint (0.61.0)
|
haml_lint (0.61.1)
|
||||||
haml (>= 5.0)
|
haml (>= 5.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
rainbow
|
rainbow
|
||||||
@ -440,7 +440,7 @@ GEM
|
|||||||
net-smtp (0.5.1)
|
net-smtp (0.5.1)
|
||||||
net-protocol
|
net-protocol
|
||||||
nio4r (2.7.4)
|
nio4r (2.7.4)
|
||||||
nokogiri (1.18.4)
|
nokogiri (1.18.5)
|
||||||
mini_portile2 (~> 2.8.2)
|
mini_portile2 (~> 2.8.2)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
oj (3.16.10)
|
oj (3.16.10)
|
||||||
@ -580,7 +580,7 @@ GEM
|
|||||||
ox (2.14.22)
|
ox (2.14.22)
|
||||||
bigdecimal (>= 3.0)
|
bigdecimal (>= 3.0)
|
||||||
parallel (1.26.3)
|
parallel (1.26.3)
|
||||||
parser (3.3.7.1)
|
parser (3.3.7.2)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
racc
|
racc
|
||||||
parslet (2.0.0)
|
parslet (2.0.0)
|
||||||
|
@ -39,6 +39,7 @@ class Item extends PureComponent {
|
|||||||
|
|
||||||
state = {
|
state = {
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
error: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
handleMouseEnter = (e) => {
|
handleMouseEnter = (e) => {
|
||||||
@ -82,6 +83,10 @@ class Item extends PureComponent {
|
|||||||
this.setState({ loaded: true });
|
this.setState({ loaded: true });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
handleImageError = () => {
|
||||||
|
this.setState({ error: true });
|
||||||
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { attachment, lang, index, size, standalone, letterbox, displayWidth, visible } = this.props;
|
const { attachment, lang, index, size, standalone, letterbox, displayWidth, visible } = this.props;
|
||||||
|
|
||||||
@ -150,6 +155,7 @@ class Item extends PureComponent {
|
|||||||
lang={lang}
|
lang={lang}
|
||||||
style={{ objectPosition: letterbox ? null : `${x}% ${y}%` }}
|
style={{ objectPosition: letterbox ? null : `${x}% ${y}%` }}
|
||||||
onLoad={this.handleImageLoad}
|
onLoad={this.handleImageLoad}
|
||||||
|
onError={this.handleImageError}
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
);
|
);
|
||||||
@ -185,7 +191,7 @@ class Item extends PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames('media-gallery__item', { standalone, letterbox, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
|
<div className={classNames('media-gallery__item', { standalone, letterbox, 'media-gallery__item--error': this.state.error, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
|
||||||
<Blurhash
|
<Blurhash
|
||||||
hash={attachment.get('blurhash')}
|
hash={attachment.get('blurhash')}
|
||||||
dummy={!useBlurhash}
|
dummy={!useBlurhash}
|
||||||
|
@ -101,10 +101,10 @@ class AccountNote extends ImmutablePureComponent {
|
|||||||
if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
|
if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
this._save();
|
|
||||||
|
|
||||||
if (this.textarea) {
|
if (this.textarea) {
|
||||||
this.textarea.blur();
|
this.textarea.blur();
|
||||||
|
} else {
|
||||||
|
this._save();
|
||||||
}
|
}
|
||||||
} else if (e.keyCode === 27) {
|
} else if (e.keyCode === 27) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -30,11 +30,16 @@ export const MediaItem: React.FC<{
|
|||||||
displayMedia === 'show_all',
|
displayMedia === 'show_all',
|
||||||
);
|
);
|
||||||
const [loaded, setLoaded] = useState(false);
|
const [loaded, setLoaded] = useState(false);
|
||||||
|
const [error, setError] = useState(false);
|
||||||
|
|
||||||
const handleImageLoad = useCallback(() => {
|
const handleImageLoad = useCallback(() => {
|
||||||
setLoaded(true);
|
setLoaded(true);
|
||||||
}, [setLoaded]);
|
}, [setLoaded]);
|
||||||
|
|
||||||
|
const handleImageError = useCallback(() => {
|
||||||
|
setError(true);
|
||||||
|
}, [setError]);
|
||||||
|
|
||||||
const handleMouseEnter = useCallback(
|
const handleMouseEnter = useCallback(
|
||||||
(e: React.MouseEvent<HTMLVideoElement>) => {
|
(e: React.MouseEvent<HTMLVideoElement>) => {
|
||||||
if (e.target instanceof HTMLVideoElement) {
|
if (e.target instanceof HTMLVideoElement) {
|
||||||
@ -102,6 +107,7 @@ export const MediaItem: React.FC<{
|
|||||||
alt={description}
|
alt={description}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
onLoad={handleImageLoad}
|
onLoad={handleImageLoad}
|
||||||
|
onError={handleImageError}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div className='media-gallery__item__overlay media-gallery__item__overlay--corner'>
|
<div className='media-gallery__item__overlay media-gallery__item__overlay--corner'>
|
||||||
@ -122,6 +128,7 @@ export const MediaItem: React.FC<{
|
|||||||
lang={lang}
|
lang={lang}
|
||||||
style={{ objectPosition: `${x}% ${y}%` }}
|
style={{ objectPosition: `${x}% ${y}%` }}
|
||||||
onLoad={handleImageLoad}
|
onLoad={handleImageLoad}
|
||||||
|
onError={handleImageError}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
} else if (['video', 'gifv'].includes(type)) {
|
} else if (['video', 'gifv'].includes(type)) {
|
||||||
@ -177,7 +184,11 @@ export const MediaItem: React.FC<{
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='media-gallery__item media-gallery__item--square'>
|
<div
|
||||||
|
className={classNames('media-gallery__item media-gallery__item--square', {
|
||||||
|
'media-gallery__item--error': error,
|
||||||
|
})}
|
||||||
|
>
|
||||||
<Blurhash
|
<Blurhash
|
||||||
hash={blurhash}
|
hash={blurhash}
|
||||||
className={classNames('media-gallery__preview', {
|
className={classNames('media-gallery__preview', {
|
||||||
|
@ -7288,6 +7288,10 @@ img.modal-warning {
|
|||||||
filter: var(--overlay-icon-shadow);
|
filter: var(--overlay-icon-shadow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&--error img {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-gallery__item-thumbnail {
|
.media-gallery__item-thumbnail {
|
||||||
|
@ -38,6 +38,7 @@ class Item extends PureComponent {
|
|||||||
|
|
||||||
state = {
|
state = {
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
error: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
handleMouseEnter = (e) => {
|
handleMouseEnter = (e) => {
|
||||||
@ -81,6 +82,10 @@ class Item extends PureComponent {
|
|||||||
this.setState({ loaded: true });
|
this.setState({ loaded: true });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
handleImageError = () => {
|
||||||
|
this.setState({ error: true });
|
||||||
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { attachment, lang, index, size, standalone, displayWidth, visible } = this.props;
|
const { attachment, lang, index, size, standalone, displayWidth, visible } = this.props;
|
||||||
|
|
||||||
@ -148,6 +153,7 @@ class Item extends PureComponent {
|
|||||||
lang={lang}
|
lang={lang}
|
||||||
style={{ objectPosition: `${x}% ${y}%` }}
|
style={{ objectPosition: `${x}% ${y}%` }}
|
||||||
onLoad={this.handleImageLoad}
|
onLoad={this.handleImageLoad}
|
||||||
|
onError={this.handleImageError}
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
);
|
);
|
||||||
@ -183,7 +189,7 @@ class Item extends PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames('media-gallery__item', { standalone, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
|
<div className={classNames('media-gallery__item', { standalone, 'media-gallery__item--error': this.state.error, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
|
||||||
<Blurhash
|
<Blurhash
|
||||||
hash={attachment.get('blurhash')}
|
hash={attachment.get('blurhash')}
|
||||||
dummy={!useBlurhash}
|
dummy={!useBlurhash}
|
||||||
|
@ -101,10 +101,10 @@ class AccountNote extends ImmutablePureComponent {
|
|||||||
if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
|
if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
this._save();
|
|
||||||
|
|
||||||
if (this.textarea) {
|
if (this.textarea) {
|
||||||
this.textarea.blur();
|
this.textarea.blur();
|
||||||
|
} else {
|
||||||
|
this._save();
|
||||||
}
|
}
|
||||||
} else if (e.keyCode === 27) {
|
} else if (e.keyCode === 27) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -26,11 +26,16 @@ export const MediaItem: React.FC<{
|
|||||||
displayMedia === 'show_all',
|
displayMedia === 'show_all',
|
||||||
);
|
);
|
||||||
const [loaded, setLoaded] = useState(false);
|
const [loaded, setLoaded] = useState(false);
|
||||||
|
const [error, setError] = useState(false);
|
||||||
|
|
||||||
const handleImageLoad = useCallback(() => {
|
const handleImageLoad = useCallback(() => {
|
||||||
setLoaded(true);
|
setLoaded(true);
|
||||||
}, [setLoaded]);
|
}, [setLoaded]);
|
||||||
|
|
||||||
|
const handleImageError = useCallback(() => {
|
||||||
|
setError(true);
|
||||||
|
}, [setError]);
|
||||||
|
|
||||||
const handleMouseEnter = useCallback(
|
const handleMouseEnter = useCallback(
|
||||||
(e: React.MouseEvent<HTMLVideoElement>) => {
|
(e: React.MouseEvent<HTMLVideoElement>) => {
|
||||||
if (e.target instanceof HTMLVideoElement) {
|
if (e.target instanceof HTMLVideoElement) {
|
||||||
@ -98,6 +103,7 @@ export const MediaItem: React.FC<{
|
|||||||
alt={description}
|
alt={description}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
onLoad={handleImageLoad}
|
onLoad={handleImageLoad}
|
||||||
|
onError={handleImageError}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div className='media-gallery__item__overlay media-gallery__item__overlay--corner'>
|
<div className='media-gallery__item__overlay media-gallery__item__overlay--corner'>
|
||||||
@ -118,6 +124,7 @@ export const MediaItem: React.FC<{
|
|||||||
lang={lang}
|
lang={lang}
|
||||||
style={{ objectPosition: `${x}% ${y}%` }}
|
style={{ objectPosition: `${x}% ${y}%` }}
|
||||||
onLoad={handleImageLoad}
|
onLoad={handleImageLoad}
|
||||||
|
onError={handleImageError}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
} else if (['video', 'gifv'].includes(type)) {
|
} else if (['video', 'gifv'].includes(type)) {
|
||||||
@ -173,7 +180,11 @@ export const MediaItem: React.FC<{
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='media-gallery__item media-gallery__item--square'>
|
<div
|
||||||
|
className={classNames('media-gallery__item media-gallery__item--square', {
|
||||||
|
'media-gallery__item--error': error,
|
||||||
|
})}
|
||||||
|
>
|
||||||
<Blurhash
|
<Blurhash
|
||||||
hash={blurhash}
|
hash={blurhash}
|
||||||
className={classNames('media-gallery__preview', {
|
className={classNames('media-gallery__preview', {
|
||||||
|
@ -513,9 +513,9 @@
|
|||||||
"loading_indicator.label": "Načítání…",
|
"loading_indicator.label": "Načítání…",
|
||||||
"media_gallery.hide": "Skrýt",
|
"media_gallery.hide": "Skrýt",
|
||||||
"moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.",
|
"moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.",
|
||||||
"mute_modal.hide_from_notifications": "Skrýt z notifikací",
|
"mute_modal.hide_from_notifications": "Skrýt z oznámení",
|
||||||
"mute_modal.hide_options": "Skrýt možnosti",
|
"mute_modal.hide_options": "Skrýt možnosti",
|
||||||
"mute_modal.indefinite": "Dokud je neodkryju",
|
"mute_modal.indefinite": "Dokud je neodeberu ze ztišených",
|
||||||
"mute_modal.show_options": "Zobrazit možnosti",
|
"mute_modal.show_options": "Zobrazit možnosti",
|
||||||
"mute_modal.they_can_mention_and_follow": "Mohou vás zmínit a sledovat, ale neuvidíte je.",
|
"mute_modal.they_can_mention_and_follow": "Mohou vás zmínit a sledovat, ale neuvidíte je.",
|
||||||
"mute_modal.they_wont_know": "Nebudou vědět, že byli skryti.",
|
"mute_modal.they_wont_know": "Nebudou vědět, že byli skryti.",
|
||||||
@ -524,7 +524,7 @@
|
|||||||
"mute_modal.you_wont_see_posts": "Stále budou moci vidět vaše příspěvky, ale vy jejich neuvidíte.",
|
"mute_modal.you_wont_see_posts": "Stále budou moci vidět vaše příspěvky, ale vy jejich neuvidíte.",
|
||||||
"navigation_bar.about": "O aplikaci",
|
"navigation_bar.about": "O aplikaci",
|
||||||
"navigation_bar.administration": "Administrace",
|
"navigation_bar.administration": "Administrace",
|
||||||
"navigation_bar.advanced_interface": "Otevřít pokročilé webové rozhraní",
|
"navigation_bar.advanced_interface": "Otevřít v pokročilém webovém rozhraní",
|
||||||
"navigation_bar.blocks": "Blokovaní uživatelé",
|
"navigation_bar.blocks": "Blokovaní uživatelé",
|
||||||
"navigation_bar.bookmarks": "Záložky",
|
"navigation_bar.bookmarks": "Záložky",
|
||||||
"navigation_bar.community_timeline": "Místní časová osa",
|
"navigation_bar.community_timeline": "Místní časová osa",
|
||||||
@ -553,13 +553,13 @@
|
|||||||
"notification.admin.report": "Uživatel {name} nahlásil {target}",
|
"notification.admin.report": "Uživatel {name} nahlásil {target}",
|
||||||
"notification.admin.report_account": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target} za {category}",
|
"notification.admin.report_account": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target} za {category}",
|
||||||
"notification.admin.report_account_other": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target}",
|
"notification.admin.report_account_other": "{name} nahlásil {count, plural, one {jeden příspěvek} few {# příspěvky} many {# příspěvků} other {# příspěvků}} od {target}",
|
||||||
"notification.admin.report_statuses": "{name} nahlásil {target} za {category}",
|
"notification.admin.report_statuses": "{name} nahlásili {target} za {category}",
|
||||||
"notification.admin.report_statuses_other": "{name} nahlásil {target}",
|
"notification.admin.report_statuses_other": "{name} nahlásili {target}",
|
||||||
"notification.admin.sign_up": "Uživatel {name} se zaregistroval",
|
"notification.admin.sign_up": "Uživatel {name} se zaregistroval",
|
||||||
"notification.admin.sign_up.name_and_others": "{name} a {count, plural, one {# další} few {# další} many {# dalších} other {# dalších}} se zaregistrovali",
|
"notification.admin.sign_up.name_and_others": "{name} a {count, plural, one {# další} few {# další} many {# dalších} other {# dalších}} se zaregistrovali",
|
||||||
"notification.annual_report.message": "Váš #Wrapstodon {year} na Vás čeká! Podívejte se, jak vypadal tento Váš rok na Mastodonu!",
|
"notification.annual_report.message": "Váš #Wrapstodon {year} na Vás čeká! Podívejte se, jak vypadal tento Váš rok na Mastodonu!",
|
||||||
"notification.annual_report.view": "Zobrazit #Wrapstodon",
|
"notification.annual_report.view": "Zobrazit #Wrapstodon",
|
||||||
"notification.favourite": "Uživatel {name} si oblíbil váš příspěvek",
|
"notification.favourite": "{name} si oblíbil*a váš příspěvek",
|
||||||
"notification.favourite.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Váš příspěvek",
|
"notification.favourite.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Váš příspěvek",
|
||||||
"notification.favourite_pm": "{name} si oblíbil vaši soukromou zmínku",
|
"notification.favourite_pm": "{name} si oblíbil vaši soukromou zmínku",
|
||||||
"notification.favourite_pm.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Vaši soukromou zmínku",
|
"notification.favourite_pm.name_and_others_with_link": "{name} a {count, plural, one {<a># další</a> si oblíbil} few {<a># další</a> si oblíbili} other {<a># dalších</a> si oblíbilo}} Vaši soukromou zmínku",
|
||||||
@ -578,7 +578,7 @@
|
|||||||
"notification.moderation_warning.action_delete_statuses": "Některé z vašich příspěvků byly odstraněny.",
|
"notification.moderation_warning.action_delete_statuses": "Některé z vašich příspěvků byly odstraněny.",
|
||||||
"notification.moderation_warning.action_disable": "Váš účet je zablokován.",
|
"notification.moderation_warning.action_disable": "Váš účet je zablokován.",
|
||||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Některé z vašich příspěvků byly označeny jako citlivé.",
|
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Některé z vašich příspěvků byly označeny jako citlivé.",
|
||||||
"notification.moderation_warning.action_none": "Váš účet obdržel moderační varování.",
|
"notification.moderation_warning.action_none": "Váš účet obdržel varování od moderátorů.",
|
||||||
"notification.moderation_warning.action_sensitive": "Vaše příspěvky budou od nynějška označeny jako citlivé.",
|
"notification.moderation_warning.action_sensitive": "Vaše příspěvky budou od nynějška označeny jako citlivé.",
|
||||||
"notification.moderation_warning.action_silence": "Váš účet byl omezen.",
|
"notification.moderation_warning.action_silence": "Váš účet byl omezen.",
|
||||||
"notification.moderation_warning.action_suspend": "Váš účet byl pozastaven.",
|
"notification.moderation_warning.action_suspend": "Váš účet byl pozastaven.",
|
||||||
@ -610,7 +610,7 @@
|
|||||||
"notification_requests.maximize": "Maximalizovat",
|
"notification_requests.maximize": "Maximalizovat",
|
||||||
"notification_requests.minimize_banner": "Minimalizovat banner filtrovaných oznámení",
|
"notification_requests.minimize_banner": "Minimalizovat banner filtrovaných oznámení",
|
||||||
"notification_requests.notifications_from": "Oznámení od {name}",
|
"notification_requests.notifications_from": "Oznámení od {name}",
|
||||||
"notification_requests.title": "Vyfiltrovaná oznámení",
|
"notification_requests.title": "Filtrovaná oznámení",
|
||||||
"notification_requests.view": "Zobrazit oznámení",
|
"notification_requests.view": "Zobrazit oznámení",
|
||||||
"notifications.clear": "Vyčistit oznámení",
|
"notifications.clear": "Vyčistit oznámení",
|
||||||
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
|
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
|
||||||
@ -773,7 +773,7 @@
|
|||||||
"report_notification.categories.spam": "Spam",
|
"report_notification.categories.spam": "Spam",
|
||||||
"report_notification.categories.spam_sentence": "spam",
|
"report_notification.categories.spam_sentence": "spam",
|
||||||
"report_notification.categories.violation": "Porušení pravidla",
|
"report_notification.categories.violation": "Porušení pravidla",
|
||||||
"report_notification.categories.violation_sentence": "porušení pravidla",
|
"report_notification.categories.violation_sentence": "porušení pravidel",
|
||||||
"report_notification.open": "Otevřít hlášení",
|
"report_notification.open": "Otevřít hlášení",
|
||||||
"search.no_recent_searches": "Žádná nedávná vyhledávání",
|
"search.no_recent_searches": "Žádná nedávná vyhledávání",
|
||||||
"search.placeholder": "Hledat",
|
"search.placeholder": "Hledat",
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
"account.featured_tags.last_status_never": "Aucune publication",
|
"account.featured_tags.last_status_never": "Aucune publication",
|
||||||
"account.featured_tags.title": "Hashtags inclus de {name}",
|
"account.featured_tags.title": "Hashtags inclus de {name}",
|
||||||
"account.follow": "Suivre",
|
"account.follow": "Suivre",
|
||||||
"account.follow_back": "S'abonner en retour",
|
"account.follow_back": "Suivre en retour",
|
||||||
"account.followers": "abonné·e·s",
|
"account.followers": "abonné·e·s",
|
||||||
"account.followers.empty": "Personne ne suit ce compte pour l'instant.",
|
"account.followers.empty": "Personne ne suit ce compte pour l'instant.",
|
||||||
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"about.contact": "Contact :",
|
"about.contact": "Contact :",
|
||||||
"about.disclaimer": "Mastodon est un logiciel libre, open-source et une marque déposée de Mastodon gGmbH.",
|
"about.disclaimer": "Mastodon est un logiciel libre, open-source et une marque déposée de Mastodon gGmbH.",
|
||||||
"about.domain_blocks.no_reason_available": "Raison non disponible",
|
"about.domain_blocks.no_reason_available": "Raison non disponible",
|
||||||
"about.domain_blocks.preamble": "Mastodon vous permet généralement de visualiser le contenu et d'interagir avec les utilisateur⋅rice⋅s de n'importe quel autre serveur dans le fédiverse. Voici les exceptions qui ont été faites sur ce serveur en particulier.",
|
"about.domain_blocks.preamble": "Mastodon vous permet généralement de visualiser le contenu et d'interagir avec les utilisateur⋅rices de n'importe quel autre serveur dans le fédivers. Voici les exceptions qui ont été faites sur ce serveur-là.",
|
||||||
"about.domain_blocks.silenced.explanation": "Vous ne verrez généralement pas les profils et le contenu de ce serveur, à moins que vous ne les recherchiez explicitement ou que vous ne choisissiez de les suivre.",
|
"about.domain_blocks.silenced.explanation": "Vous ne verrez généralement pas les profils et le contenu de ce serveur, à moins que vous ne les recherchiez explicitement ou que vous ne choisissiez de les suivre.",
|
||||||
"about.domain_blocks.silenced.title": "Limité",
|
"about.domain_blocks.silenced.title": "Limité",
|
||||||
"about.domain_blocks.suspended.explanation": "Aucune donnée de ce serveur ne sera traitée, enregistrée ou échangée, rendant impossible toute interaction ou communication avec les comptes de ce serveur.",
|
"about.domain_blocks.suspended.explanation": "Aucune donnée de ce serveur ne sera traitée, enregistrée ou échangée, rendant impossible toute interaction ou communication avec les comptes de ce serveur.",
|
||||||
@ -19,7 +19,7 @@
|
|||||||
"account.block_domain": "Bloquer le domaine {domain}",
|
"account.block_domain": "Bloquer le domaine {domain}",
|
||||||
"account.block_short": "Bloquer",
|
"account.block_short": "Bloquer",
|
||||||
"account.blocked": "Bloqué·e",
|
"account.blocked": "Bloqué·e",
|
||||||
"account.cancel_follow_request": "Annuler le suivi",
|
"account.cancel_follow_request": "Annuler l'abonnement",
|
||||||
"account.copy": "Copier le lien vers le profil",
|
"account.copy": "Copier le lien vers le profil",
|
||||||
"account.direct": "Mention privée @{name}",
|
"account.direct": "Mention privée @{name}",
|
||||||
"account.disable_notifications": "Ne plus me notifier quand @{name} publie quelque chose",
|
"account.disable_notifications": "Ne plus me notifier quand @{name} publie quelque chose",
|
||||||
@ -31,18 +31,18 @@
|
|||||||
"account.featured_tags.last_status_never": "Aucun message",
|
"account.featured_tags.last_status_never": "Aucun message",
|
||||||
"account.featured_tags.title": "Les hashtags en vedette de {name}",
|
"account.featured_tags.title": "Les hashtags en vedette de {name}",
|
||||||
"account.follow": "Suivre",
|
"account.follow": "Suivre",
|
||||||
"account.follow_back": "S'abonner en retour",
|
"account.follow_back": "Suivre en retour",
|
||||||
"account.followers": "Abonné·e·s",
|
"account.followers": "Abonné·e·s",
|
||||||
"account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
|
"account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
|
||||||
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
"account.followers_counter": "{count, plural, one {{counter} abonné·e} other {{counter} abonné·e·s}}",
|
||||||
"account.following": "Abonnements",
|
"account.following": "Abonnements",
|
||||||
"account.following_counter": "{count, plural, one {{counter} abonnement} other {{counter} abonnements}}",
|
"account.following_counter": "{count, plural, one {{counter} abonnement} other {{counter} abonnements}}",
|
||||||
"account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
|
"account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
|
||||||
"account.go_to_profile": "Aller au profil",
|
"account.go_to_profile": "Voir le profil",
|
||||||
"account.hide_reblogs": "Masquer les partages de @{name}",
|
"account.hide_reblogs": "Masquer les partages de @{name}",
|
||||||
"account.in_memoriam": "En mémoire de.",
|
"account.in_memoriam": "En mémoire de.",
|
||||||
"account.joined_short": "Ici depuis",
|
"account.joined_short": "Ici depuis",
|
||||||
"account.languages": "Changer les langues abonnées",
|
"account.languages": "Modifier les langues d'abonnements",
|
||||||
"account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}",
|
"account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}",
|
||||||
"account.locked_info": "Ce compte est privé. Son ou sa propriétaire approuve manuellement qui peut le suivre.",
|
"account.locked_info": "Ce compte est privé. Son ou sa propriétaire approuve manuellement qui peut le suivre.",
|
||||||
"account.media": "Médias",
|
"account.media": "Médias",
|
||||||
|
@ -6902,6 +6902,10 @@ a.status-card {
|
|||||||
filter: var(--overlay-icon-shadow);
|
filter: var(--overlay-icon-shadow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&--error img {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-gallery__item-thumbnail {
|
.media-gallery__item-thumbnail {
|
||||||
|
@ -55,6 +55,8 @@ it:
|
|||||||
too_soon: è troppo presto, deve essere successivo alla data %{date}
|
too_soon: è troppo presto, deve essere successivo alla data %{date}
|
||||||
user:
|
user:
|
||||||
attributes:
|
attributes:
|
||||||
|
date_of_birth:
|
||||||
|
below_limit: è inferiore al limite di età
|
||||||
email:
|
email:
|
||||||
blocked: utilizza un provider di posta elettronica non autorizzato
|
blocked: utilizza un provider di posta elettronica non autorizzato
|
||||||
unreachable: non sembra esistere
|
unreachable: non sembra esistere
|
||||||
|
@ -55,6 +55,8 @@ pt-PT:
|
|||||||
too_soon: é muito cedo, deve ser após %{date}
|
too_soon: é muito cedo, deve ser após %{date}
|
||||||
user:
|
user:
|
||||||
attributes:
|
attributes:
|
||||||
|
date_of_birth:
|
||||||
|
below_limit: está abaixo da idade mínima
|
||||||
email:
|
email:
|
||||||
blocked: usa um fornecedor de e-mail que não é permitido
|
blocked: usa um fornecedor de e-mail que não é permitido
|
||||||
unreachable: não parece existir
|
unreachable: não parece existir
|
||||||
|
@ -3,7 +3,7 @@ ru:
|
|||||||
activerecord:
|
activerecord:
|
||||||
attributes:
|
attributes:
|
||||||
poll:
|
poll:
|
||||||
expires_at: Крайний срок
|
expires_at: Срок окончания голосования
|
||||||
options: Варианты
|
options: Варианты
|
||||||
user:
|
user:
|
||||||
agreement: Соглашение с условиями сервиса
|
agreement: Соглашение с условиями сервиса
|
||||||
@ -49,8 +49,14 @@ ru:
|
|||||||
attributes:
|
attributes:
|
||||||
reblog:
|
reblog:
|
||||||
taken: пост уже существует
|
taken: пост уже существует
|
||||||
|
terms_of_service:
|
||||||
|
attributes:
|
||||||
|
effective_date:
|
||||||
|
too_soon: должна быть не ранее %{date}
|
||||||
user:
|
user:
|
||||||
attributes:
|
attributes:
|
||||||
|
date_of_birth:
|
||||||
|
below_limit: ниже возрастного ограничения
|
||||||
email:
|
email:
|
||||||
blocked: использует запрещённого провайдера эл. почты
|
blocked: использует запрещённого провайдера эл. почты
|
||||||
unreachable: не существует
|
unreachable: не существует
|
||||||
|
@ -99,7 +99,7 @@ cs:
|
|||||||
active: Aktivní
|
active: Aktivní
|
||||||
all: Vše
|
all: Vše
|
||||||
disabled: Deaktivován
|
disabled: Deaktivován
|
||||||
pending: Čekající
|
pending: Nevyřízeno
|
||||||
silenced: Omezeno
|
silenced: Omezeno
|
||||||
suspended: Pozastavené
|
suspended: Pozastavené
|
||||||
title: Moderování
|
title: Moderování
|
||||||
|
@ -315,6 +315,7 @@ ru:
|
|||||||
title: Журнал аудита
|
title: Журнал аудита
|
||||||
unavailable_instance: "(доменное имя недоступно)"
|
unavailable_instance: "(доменное имя недоступно)"
|
||||||
announcements:
|
announcements:
|
||||||
|
back: Вернуться к объявлениям
|
||||||
destroyed_msg: Объявление удалено.
|
destroyed_msg: Объявление удалено.
|
||||||
edit:
|
edit:
|
||||||
title: Редактировать объявление
|
title: Редактировать объявление
|
||||||
@ -323,6 +324,9 @@ ru:
|
|||||||
new:
|
new:
|
||||||
create: Создать объявление
|
create: Создать объявление
|
||||||
title: Новое объявление
|
title: Новое объявление
|
||||||
|
preview:
|
||||||
|
explanation_html: 'Сообщение будет отравлено <strong>%{display_count} пользователям</strong>. В теле письма будет указан следующий текст:'
|
||||||
|
title: Предпросмотр объявления по электронной почте
|
||||||
publish: Опубликовать
|
publish: Опубликовать
|
||||||
published_msg: Объявление опубликовано.
|
published_msg: Объявление опубликовано.
|
||||||
scheduled_for: Запланировано на %{time}
|
scheduled_for: Запланировано на %{time}
|
||||||
@ -967,6 +971,7 @@ ru:
|
|||||||
chance_to_review_html: "<strong>Сгенерированное пользовательское соглашение не будет опубликовано автоматически.</strong> У вас будет возможность просмотреть результат. Введите все необходимые сведения, чтобы продолжить."
|
chance_to_review_html: "<strong>Сгенерированное пользовательское соглашение не будет опубликовано автоматически.</strong> У вас будет возможность просмотреть результат. Введите все необходимые сведения, чтобы продолжить."
|
||||||
explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях, и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов.
|
explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях, и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов.
|
||||||
title: Создание пользовательского соглашения
|
title: Создание пользовательского соглашения
|
||||||
|
going_live_on_html: Вступило в силу с %{date}
|
||||||
history: История
|
history: История
|
||||||
live: Действует
|
live: Действует
|
||||||
no_history: Нет зафиксированных изменений пользовательского соглашения.
|
no_history: Нет зафиксированных изменений пользовательского соглашения.
|
||||||
@ -1990,6 +1995,10 @@ ru:
|
|||||||
recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. <strong>Каждый код действителен только один раз</strong>.'
|
recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. <strong>Каждый код действителен только один раз</strong>.'
|
||||||
webauthn: Ключи безопасности
|
webauthn: Ключи безопасности
|
||||||
user_mailer:
|
user_mailer:
|
||||||
|
announcement_published:
|
||||||
|
description: 'Администраторы %{domain} опубликовали новое объявление:'
|
||||||
|
subject: Сервисное объявление
|
||||||
|
title: Сервисное объявление %{domain}
|
||||||
appeal_approved:
|
appeal_approved:
|
||||||
action: Настройки аккаунта
|
action: Настройки аккаунта
|
||||||
explanation: Апелляция на разблокировку против вашей учетной записи %{strike_date}, которую вы подали на %{appeal_date}, была одобрена. Ваша учетная запись снова на хорошем счету.
|
explanation: Апелляция на разблокировку против вашей учетной записи %{strike_date}, которую вы подали на %{appeal_date}, была одобрена. Ваша учетная запись снова на хорошем счету.
|
||||||
@ -2022,6 +2031,8 @@ ru:
|
|||||||
terms_of_service_changed:
|
terms_of_service_changed:
|
||||||
agreement: Продолжая использовать %{domain}, вы соглашаетесь с этими условиями. Если вы не согласны с новыми условиями, вы в любой момент можете удалить вашу учётную запись на %{domain}.
|
agreement: Продолжая использовать %{domain}, вы соглашаетесь с этими условиями. Если вы не согласны с новыми условиями, вы в любой момент можете удалить вашу учётную запись на %{domain}.
|
||||||
changelog: 'Вот что обновление условий будет значит для вас в общих чертах:'
|
changelog: 'Вот что обновление условий будет значит для вас в общих чертах:'
|
||||||
|
description: 'Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями по ссылке:'
|
||||||
|
description_html: Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу <strong>%{date}</strong>. Рекомендуем вам ознакомиться с <a href="%{path}" target="_blank">обновлёнными условиями</a>.
|
||||||
sign_off: Ваш %{domain}
|
sign_off: Ваш %{domain}
|
||||||
subject: Обновления наших условий использования
|
subject: Обновления наших условий использования
|
||||||
subtitle: На %{domain} изменилось пользовательское соглашение
|
subtitle: На %{domain} изменилось пользовательское соглашение
|
||||||
|
@ -139,6 +139,7 @@ bg:
|
|||||||
admin_email: Правните бележки включват насрещни известия, постановления на съда, заявки за сваляне и заявки от правоохранителните органи.
|
admin_email: Правните бележки включват насрещни известия, постановления на съда, заявки за сваляне и заявки от правоохранителните органи.
|
||||||
arbitration_address: Може да е същото като физическия адрес горе или "неприложимо", ако се употребява имейл.
|
arbitration_address: Може да е същото като физическия адрес горе или "неприложимо", ако се употребява имейл.
|
||||||
choice_of_law: Град, регион, територия, щат или държава, чиито вътрешни материални права ще уреждат всички искове.
|
choice_of_law: Град, регион, територия, щат или държава, чиито вътрешни материални права ще уреждат всички искове.
|
||||||
|
dmca_email: Може да е същият имейл, използван за "Имейл адрес за правни известия" по-горе.
|
||||||
domain: Неповторимо идентифициране на онлайн услугата, която предоставяте.
|
domain: Неповторимо идентифициране на онлайн услугата, която предоставяте.
|
||||||
jurisdiction: Впишете държавата, където живее всеки, който плаща сметките. Ако е дружество или друго образувание, то впишете държавата, в която е регистрирано, и градът, регионът, територията или щатът според случая.
|
jurisdiction: Впишете държавата, където живее всеки, който плаща сметките. Ако е дружество или друго образувание, то впишете държавата, в която е регистрирано, и градът, регионът, територията или щатът според случая.
|
||||||
min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви.
|
min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви.
|
||||||
|
@ -88,6 +88,7 @@ it:
|
|||||||
favicon: WEBP, PNG, GIF o JPG. Sostituisce la favicon predefinita di Mastodon con un'icona personalizzata.
|
favicon: WEBP, PNG, GIF o JPG. Sostituisce la favicon predefinita di Mastodon con un'icona personalizzata.
|
||||||
mascot: Sostituisce l'illustrazione nell'interfaccia web avanzata.
|
mascot: Sostituisce l'illustrazione nell'interfaccia web avanzata.
|
||||||
media_cache_retention_period: I file multimediali da post fatti da utenti remoti sono memorizzati nella cache sul tuo server. Quando impostato a un valore positivo, i media verranno eliminati dopo il numero specificato di giorni. Se i dati multimediali sono richiesti dopo che sono stati eliminati, saranno nuovamente scaricati, se il contenuto sorgente è ancora disponibile. A causa di restrizioni su quanto spesso link anteprima carte sondaggio siti di terze parti, si consiglia di impostare questo valore ad almeno 14 giorni, o le schede di anteprima link non saranno aggiornate su richiesta prima di quel tempo.
|
media_cache_retention_period: I file multimediali da post fatti da utenti remoti sono memorizzati nella cache sul tuo server. Quando impostato a un valore positivo, i media verranno eliminati dopo il numero specificato di giorni. Se i dati multimediali sono richiesti dopo che sono stati eliminati, saranno nuovamente scaricati, se il contenuto sorgente è ancora disponibile. A causa di restrizioni su quanto spesso link anteprima carte sondaggio siti di terze parti, si consiglia di impostare questo valore ad almeno 14 giorni, o le schede di anteprima link non saranno aggiornate su richiesta prima di quel tempo.
|
||||||
|
min_age: Gli utenti saranno invitati a confermare la loro data di nascita durante la registrazione
|
||||||
peers_api_enabled: Un elenco di nomi di dominio che questo server ha incontrato nel fediverse. Qui non sono inclusi dati sul fatto se si federano con un dato server, solo che il server ne è a conoscenza. Questo viene utilizzato dai servizi che raccolgono statistiche sulla federazione in senso generale.
|
peers_api_enabled: Un elenco di nomi di dominio che questo server ha incontrato nel fediverse. Qui non sono inclusi dati sul fatto se si federano con un dato server, solo che il server ne è a conoscenza. Questo viene utilizzato dai servizi che raccolgono statistiche sulla federazione in senso generale.
|
||||||
profile_directory: La directory del profilo elenca tutti gli utenti che hanno acconsentito ad essere individuabili.
|
profile_directory: La directory del profilo elenca tutti gli utenti che hanno acconsentito ad essere individuabili.
|
||||||
require_invite_text: 'Quando le iscrizioni richiedono l''approvazione manuale, rendi la domanda: "Perché vuoi unirti?" obbligatoria anziché facoltativa'
|
require_invite_text: 'Quando le iscrizioni richiedono l''approvazione manuale, rendi la domanda: "Perché vuoi unirti?" obbligatoria anziché facoltativa'
|
||||||
@ -351,6 +352,9 @@ it:
|
|||||||
jurisdiction: Giurisdizione legale
|
jurisdiction: Giurisdizione legale
|
||||||
min_age: Età minima
|
min_age: Età minima
|
||||||
user:
|
user:
|
||||||
|
date_of_birth_1i: Giorno
|
||||||
|
date_of_birth_2i: Mese
|
||||||
|
date_of_birth_3i: Anno
|
||||||
role: Ruolo
|
role: Ruolo
|
||||||
time_zone: Fuso orario
|
time_zone: Fuso orario
|
||||||
user_role:
|
user_role:
|
||||||
|
@ -88,6 +88,7 @@ pt-PT:
|
|||||||
favicon: WEBP, PNG, GIF ou JPG. Substitui o ícone de favorito padrão do Mastodon por um ícone personalizado.
|
favicon: WEBP, PNG, GIF ou JPG. Substitui o ícone de favorito padrão do Mastodon por um ícone personalizado.
|
||||||
mascot: Sobrepõe-se à ilustração na interface web avançada.
|
mascot: Sobrepõe-se à ilustração na interface web avançada.
|
||||||
media_cache_retention_period: Os ficheiros multimédia de publicações feitas por utilizadores remotos são armazenados em cache no seu servidor. Quando definido para um valor positivo, os ficheiros multimédia serão eliminados após o número de dias especificado. Se os ficheiros multimédia forem solicitados depois de terem sido eliminados, serão transferidos novamente, se o conteúdo de origem ainda estiver disponível. Devido a restrições sobre a frequência com que os cartões de pré-visualização de links pesquisam sites de terceiros, recomenda-se que este valor seja definido para, pelo menos, 14 dias, ou os cartões de pré-visualização de links não serão atualizados a pedido antes desse período.
|
media_cache_retention_period: Os ficheiros multimédia de publicações feitas por utilizadores remotos são armazenados em cache no seu servidor. Quando definido para um valor positivo, os ficheiros multimédia serão eliminados após o número de dias especificado. Se os ficheiros multimédia forem solicitados depois de terem sido eliminados, serão transferidos novamente, se o conteúdo de origem ainda estiver disponível. Devido a restrições sobre a frequência com que os cartões de pré-visualização de links pesquisam sites de terceiros, recomenda-se que este valor seja definido para, pelo menos, 14 dias, ou os cartões de pré-visualização de links não serão atualizados a pedido antes desse período.
|
||||||
|
min_age: Os utilizadores serão convidados a confirmar a sua data de nascimento durante o processo de inscrição
|
||||||
peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no fediverso. Nenhum dado é incluído aqui sobre se você federa com um determinado servidor, apenas que o seu servidor o conhece. Este serviço é utilizado por serviços que recolhem estatísticas na federação, em termos gerais.
|
peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no fediverso. Nenhum dado é incluído aqui sobre se você federa com um determinado servidor, apenas que o seu servidor o conhece. Este serviço é utilizado por serviços que recolhem estatísticas na federação, em termos gerais.
|
||||||
profile_directory: O diretório de perfis lista todos os utilizadores que optaram por ter a sua conta a ser sugerida a outros.
|
profile_directory: O diretório de perfis lista todos os utilizadores que optaram por ter a sua conta a ser sugerida a outros.
|
||||||
require_invite_text: Quando as incrições exigirem aprovação manual, faça o texto "Por que se quer juntar a nós?" da solicitação de convite ser obrigatório, em vez de opcional
|
require_invite_text: Quando as incrições exigirem aprovação manual, faça o texto "Por que se quer juntar a nós?" da solicitação de convite ser obrigatório, em vez de opcional
|
||||||
@ -146,6 +147,7 @@ pt-PT:
|
|||||||
min_age: Não deve ter menos do que a idade mínima exigida pela legislação da sua jurisdição.
|
min_age: Não deve ter menos do que a idade mínima exigida pela legislação da sua jurisdição.
|
||||||
user:
|
user:
|
||||||
chosen_languages: Quando selecionado, só serão mostradas nas cronologias públicas as publicações nos idiomas escolhidos
|
chosen_languages: Quando selecionado, só serão mostradas nas cronologias públicas as publicações nos idiomas escolhidos
|
||||||
|
date_of_birth: Temos de ter a certeza de que tens pelo menos %{age} para usar o Mastodon. Não vamos guardar esta informação.
|
||||||
role: A função controla as permissões que o utilizador tem.
|
role: A função controla as permissões que o utilizador tem.
|
||||||
user_role:
|
user_role:
|
||||||
color: Cor a ser utilizada para a função em toda a interface de utilizador, como RGB no formato hexadecimal
|
color: Cor a ser utilizada para a função em toda a interface de utilizador, como RGB no formato hexadecimal
|
||||||
@ -271,6 +273,7 @@ pt-PT:
|
|||||||
favicon: Ícone de favoritos
|
favicon: Ícone de favoritos
|
||||||
mascot: Mascote personalizada (legado)
|
mascot: Mascote personalizada (legado)
|
||||||
media_cache_retention_period: Período de retenção de ficheiros multimédia em cache
|
media_cache_retention_period: Período de retenção de ficheiros multimédia em cache
|
||||||
|
min_age: Idade mínima requerida
|
||||||
peers_api_enabled: Publicar lista de servidores descobertos na API
|
peers_api_enabled: Publicar lista de servidores descobertos na API
|
||||||
profile_directory: Ativar o diretório de perfis
|
profile_directory: Ativar o diretório de perfis
|
||||||
registrations_mode: Quem se pode inscrever
|
registrations_mode: Quem se pode inscrever
|
||||||
@ -349,6 +352,9 @@ pt-PT:
|
|||||||
jurisdiction: Jurisdição legal
|
jurisdiction: Jurisdição legal
|
||||||
min_age: Idade mínima
|
min_age: Idade mínima
|
||||||
user:
|
user:
|
||||||
|
date_of_birth_1i: Dia
|
||||||
|
date_of_birth_2i: Mês
|
||||||
|
date_of_birth_3i: Ano
|
||||||
role: Função
|
role: Função
|
||||||
time_zone: Fuso horário
|
time_zone: Fuso horário
|
||||||
user_role:
|
user_role:
|
||||||
|
@ -88,6 +88,7 @@ ru:
|
|||||||
favicon: WEBP, PNG, GIF или JPG. Заменяет стандартный фавикон Mastodon на собственный значок.
|
favicon: WEBP, PNG, GIF или JPG. Заменяет стандартный фавикон Mastodon на собственный значок.
|
||||||
mascot: Заменяет иллюстрацию в расширенном веб-интерфейсе.
|
mascot: Заменяет иллюстрацию в расширенном веб-интерфейсе.
|
||||||
media_cache_retention_period: Медиафайлы из сообщений, сделанных удаленными пользователями, кэшируются на вашем сервере. При положительном значении медиафайлы будут удалены через указанное количество дней. Если медиаданные будут запрошены после удаления, они будут загружены повторно, если исходный контент все еще доступен. В связи с ограничениями на частоту опроса карточек предварительного просмотра ссылок на сторонних сайтах рекомендуется устанавливать значение не менее 14 дней, иначе карточки предварительного просмотра ссылок не будут обновляться по запросу до этого времени.
|
media_cache_retention_period: Медиафайлы из сообщений, сделанных удаленными пользователями, кэшируются на вашем сервере. При положительном значении медиафайлы будут удалены через указанное количество дней. Если медиаданные будут запрошены после удаления, они будут загружены повторно, если исходный контент все еще доступен. В связи с ограничениями на частоту опроса карточек предварительного просмотра ссылок на сторонних сайтах рекомендуется устанавливать значение не менее 14 дней, иначе карточки предварительного просмотра ссылок не будут обновляться по запросу до этого времени.
|
||||||
|
min_age: Пользователям при регистрации будет предложено ввести свою дату рождения
|
||||||
peers_api_enabled: Список доменных имен, с которыми сервер столкнулся в fediverse. Здесь нет данных о том, федерировались ли вы с данным сервером, только что ваш сервер знает об этом. Это используется службами, которые собирают статистику по федерации в общем смысле.
|
peers_api_enabled: Список доменных имен, с которыми сервер столкнулся в fediverse. Здесь нет данных о том, федерировались ли вы с данным сервером, только что ваш сервер знает об этом. Это используется службами, которые собирают статистику по федерации в общем смысле.
|
||||||
profile_directory: В каталоге профилей перечислены все пользователи, которые согласились быть доступными для обнаружения.
|
profile_directory: В каталоге профилей перечислены все пользователи, которые согласились быть доступными для обнаружения.
|
||||||
require_invite_text: Когда регистрация требует ручного одобрения, сделайте текстовый ввод "Почему вы хотите присоединиться?" обязательным, а не опциональным
|
require_invite_text: Когда регистрация требует ручного одобрения, сделайте текстовый ввод "Почему вы хотите присоединиться?" обязательным, а не опциональным
|
||||||
@ -132,15 +133,21 @@ ru:
|
|||||||
name: Вы можете изменить только регистр букв чтобы, например, сделать тег более читаемым
|
name: Вы можете изменить только регистр букв чтобы, например, сделать тег более читаемым
|
||||||
terms_of_service:
|
terms_of_service:
|
||||||
changelog: Можно использовать синтаксис языка разметки Markdown.
|
changelog: Можно использовать синтаксис языка разметки Markdown.
|
||||||
|
effective_date: Разумные временные рамки могут варьироваться в диапазоне от 10 до 30 дней после уведомления пользователей.
|
||||||
text: Можно использовать синтаксис языка разметки Markdown.
|
text: Можно использовать синтаксис языка разметки Markdown.
|
||||||
terms_of_service_generator:
|
terms_of_service_generator:
|
||||||
admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов.
|
admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов.
|
||||||
choice_of_law: Город, регион, территория или государственное материальное право, которое регулирует любые претензии и все их требования.
|
arbitration_address: Может совпадать с почтовым адресом, указанным выше, либо «N/A» в случае электронной почты.
|
||||||
|
arbitration_website: Веб-форма или «N/A» в случае электронной почты.
|
||||||
|
choice_of_law: Город, регион, территория или государство, внутреннее материальное право которого регулирует любые претензии.
|
||||||
dmca_address: Находящиеся в США операторы должны использовать адрес, зарегистрированный в DMCA Designated Agent Directory. Использовать абонентский ящик возможно при обращении в соответствующей просьбой, для чего нужно с помощью DMCA Designated Agent Post Office Box Waiver Request написать сообщение в Copyright Office и объяснить, что вы занимаетесь модерацией контента из дома и опасаетесь мести за свои действия, поэтому должны использовать абонентский ящик, чтобы убрать ваш домашний адрес из общего доступа.
|
dmca_address: Находящиеся в США операторы должны использовать адрес, зарегистрированный в DMCA Designated Agent Directory. Использовать абонентский ящик возможно при обращении в соответствующей просьбой, для чего нужно с помощью DMCA Designated Agent Post Office Box Waiver Request написать сообщение в Copyright Office и объяснить, что вы занимаетесь модерацией контента из дома и опасаетесь мести за свои действия, поэтому должны использовать абонентский ящик, чтобы убрать ваш домашний адрес из общего доступа.
|
||||||
|
dmca_email: Может совпадать с адресом электронной почты для юридических уведомлений, указанным выше.
|
||||||
domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс.
|
domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс.
|
||||||
jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо.
|
jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо.
|
||||||
|
min_age: Не меньше минимального возраста, требуемого по закону в вашей юрисдикции.
|
||||||
user:
|
user:
|
||||||
chosen_languages: Если выбрано, то в публичных лентах будут показаны только посты на выбранных языках.
|
chosen_languages: Если выбрано, то в публичных лентах будут показаны только посты на выбранных языках.
|
||||||
|
date_of_birth: Нужно убедиться, что вам не меньше %{age} лет. Мы не храним введённые здесь данные.
|
||||||
role: Роль определяет, какими правами обладает пользователь.
|
role: Роль определяет, какими правами обладает пользователь.
|
||||||
user_role:
|
user_role:
|
||||||
color: Цвет, который будет использоваться для роли в интерфейсе (UI), как RGB в формате HEX
|
color: Цвет, который будет использоваться для роли в интерфейсе (UI), как RGB в формате HEX
|
||||||
@ -266,6 +273,7 @@ ru:
|
|||||||
favicon: Favicon
|
favicon: Favicon
|
||||||
mascot: Пользовательский маскот (устаревшее)
|
mascot: Пользовательский маскот (устаревшее)
|
||||||
media_cache_retention_period: Период хранения кэша медиафайлов
|
media_cache_retention_period: Период хранения кэша медиафайлов
|
||||||
|
min_age: Требование минимального возраста
|
||||||
peers_api_enabled: Публикация списка обнаруженных узлов в API
|
peers_api_enabled: Публикация списка обнаруженных узлов в API
|
||||||
profile_directory: Включить каталог профилей
|
profile_directory: Включить каталог профилей
|
||||||
registrations_mode: Кто может зарегистрироваться
|
registrations_mode: Кто может зарегистрироваться
|
||||||
@ -331,17 +339,22 @@ ru:
|
|||||||
usable: Позволить этот хэштег в локальных сообщениях
|
usable: Позволить этот хэштег в локальных сообщениях
|
||||||
terms_of_service:
|
terms_of_service:
|
||||||
changelog: Что изменилось?
|
changelog: Что изменилось?
|
||||||
|
effective_date: Дата вступления в силу
|
||||||
text: Пользовательское соглашение
|
text: Пользовательское соглашение
|
||||||
terms_of_service_generator:
|
terms_of_service_generator:
|
||||||
admin_email: Адрес электронной почты для юридических уведомлений
|
admin_email: Адрес электронной почты для юридических уведомлений
|
||||||
arbitration_address: Почтовый адрес для уведомлений об арбитраже
|
arbitration_address: Почтовый адрес для уведомлений об арбитраже
|
||||||
arbitration_website: Вебсайт для подачи уведомления об арбитраже
|
arbitration_website: Вебсайт для подачи уведомления об арбитраже
|
||||||
choice_of_law: Выбор закана.
|
choice_of_law: Юрисдикция
|
||||||
dmca_address: Почтовый адрес для обращений правообладателей
|
dmca_address: Почтовый адрес для обращений правообладателей
|
||||||
dmca_email: Адрес электронной почты для обращений правообладателей
|
dmca_email: Адрес электронной почты для обращений правообладателей
|
||||||
domain: Доменное имя
|
domain: Доменное имя
|
||||||
jurisdiction: Юрисдикция
|
jurisdiction: Юрисдикция
|
||||||
|
min_age: Минимальный возраст
|
||||||
user:
|
user:
|
||||||
|
date_of_birth_1i: День
|
||||||
|
date_of_birth_2i: Месяц
|
||||||
|
date_of_birth_3i: Год
|
||||||
role: Роль
|
role: Роль
|
||||||
time_zone: Часовой пояс
|
time_zone: Часовой пояс
|
||||||
user_role:
|
user_role:
|
||||||
|
@ -331,7 +331,11 @@ sv:
|
|||||||
dmca_address: Fysisk adress för meddelanden om DMCA/upphovsrätt
|
dmca_address: Fysisk adress för meddelanden om DMCA/upphovsrätt
|
||||||
dmca_email: Fysisk adress för meddelanden om DMCA/upphovsrätt
|
dmca_email: Fysisk adress för meddelanden om DMCA/upphovsrätt
|
||||||
domain: Domän
|
domain: Domän
|
||||||
|
min_age: Minimiålder
|
||||||
user:
|
user:
|
||||||
|
date_of_birth_1i: Dag
|
||||||
|
date_of_birth_2i: Månad
|
||||||
|
date_of_birth_3i: År
|
||||||
role: Roll
|
role: Roll
|
||||||
time_zone: Tidszon
|
time_zone: Tidszon
|
||||||
user_role:
|
user_role:
|
||||||
|
@ -14,10 +14,8 @@ module Mastodon
|
|||||||
obj = {
|
obj = {
|
||||||
type: 'web',
|
type: 'web',
|
||||||
queue_time: queue_time,
|
queue_time: queue_time,
|
||||||
default_labels: default_labels(env, result),
|
default_labels: {},
|
||||||
}
|
}
|
||||||
labels = custom_labels(env)
|
|
||||||
obj = obj.merge(custom_labels: labels) if labels
|
|
||||||
|
|
||||||
@client.send_json(obj)
|
@client.send_json(obj)
|
||||||
end
|
end
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
RSpec.describe Admin::ChangeEmailsController do
|
|
||||||
render_views
|
|
||||||
|
|
||||||
let(:admin) { Fabricate(:admin_user) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
sign_in admin
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'GET #show' do
|
|
||||||
it 'returns http success' do
|
|
||||||
user = Fabricate(:user)
|
|
||||||
|
|
||||||
get :show, params: { account_id: user.account.id }
|
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'GET #update' do
|
|
||||||
before do
|
|
||||||
allow(UserMailer).to receive(:confirmation_instructions)
|
|
||||||
.and_return(instance_double(ActionMailer::MessageDelivery, deliver_later: nil))
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns http success' do
|
|
||||||
user = Fabricate(:user)
|
|
||||||
|
|
||||||
previous_email = user.email
|
|
||||||
|
|
||||||
post :update, params: { account_id: user.account.id, user: { unconfirmed_email: 'test@example.com' } }
|
|
||||||
|
|
||||||
user.reload
|
|
||||||
|
|
||||||
expect(user.email).to eq previous_email
|
|
||||||
expect(user.unconfirmed_email).to eq 'test@example.com'
|
|
||||||
expect(user.confirmation_token).to_not be_nil
|
|
||||||
|
|
||||||
expect(UserMailer).to have_received(:confirmation_instructions).with(user, user.confirmation_token, { to: 'test@example.com' })
|
|
||||||
|
|
||||||
expect(response).to redirect_to(admin_account_path(user.account.id))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,54 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
require 'webauthn/fake_client'
|
|
||||||
|
|
||||||
RSpec.describe Admin::Users::TwoFactorAuthenticationsController do
|
|
||||||
render_views
|
|
||||||
|
|
||||||
let(:user) { Fabricate(:user) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
sign_in Fabricate(:admin_user), scope: :user
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'DELETE #destroy' do
|
|
||||||
context 'when user has OTP enabled' do
|
|
||||||
before do
|
|
||||||
user.update(otp_required_for_login: true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'redirects to admin account page' do
|
|
||||||
delete :destroy, params: { user_id: user.id }
|
|
||||||
|
|
||||||
user.reload
|
|
||||||
expect(user.otp_enabled?).to be false
|
|
||||||
expect(response).to redirect_to(admin_account_path(user.account_id))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when user has OTP and WebAuthn enabled' do
|
|
||||||
let(:fake_client) { WebAuthn::FakeClient.new('http://test.host') }
|
|
||||||
|
|
||||||
before do
|
|
||||||
user.update(otp_required_for_login: true, webauthn_id: WebAuthn.generate_user_id)
|
|
||||||
|
|
||||||
public_key_credential = WebAuthn::Credential.from_create(fake_client.create)
|
|
||||||
Fabricate(:webauthn_credential,
|
|
||||||
user_id: user.id,
|
|
||||||
external_id: public_key_credential.id,
|
|
||||||
public_key: public_key_credential.public_key,
|
|
||||||
nickname: 'Security Key')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'redirects to admin account page' do
|
|
||||||
delete :destroy, params: { user_id: user.id }
|
|
||||||
|
|
||||||
user.reload
|
|
||||||
expect(user.otp_enabled?).to be false
|
|
||||||
expect(user.webauthn_enabled?).to be false
|
|
||||||
expect(response).to redirect_to(admin_account_path(user.account_id))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
@ -2,29 +2,33 @@
|
|||||||
|
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe Admin::ActionLogsController do
|
RSpec.describe 'Admin Action Logs' do
|
||||||
render_views
|
|
||||||
|
|
||||||
# Action logs typically cause issues when their targets are not in the database
|
# Action logs typically cause issues when their targets are not in the database
|
||||||
let!(:account) { Fabricate(:account) }
|
let!(:account) { Fabricate(:account) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
orphaned_log_types.map do |type|
|
populate_action_logs
|
||||||
Fabricate(:action_log, account: account, action: 'destroy', target_type: type, target_id: 1312)
|
sign_in Fabricate(:admin_user)
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET #index' do
|
describe 'Viewing action logs' do
|
||||||
it 'returns 200' do
|
it 'shows page with action logs listed' do
|
||||||
sign_in Fabricate(:admin_user)
|
visit admin_action_logs_path
|
||||||
get :index, params: { page: 1 }
|
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(page)
|
||||||
|
.to have_title(I18n.t('admin.action_logs.title'))
|
||||||
|
.and have_css('.log-entry')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def populate_action_logs
|
||||||
|
orphaned_log_types.map do |type|
|
||||||
|
Fabricate(:action_log, account: account, action: 'destroy', target_type: type, target_id: 1312)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def orphaned_log_types
|
def orphaned_log_types
|
||||||
%w(
|
%w(
|
||||||
Account
|
Account
|
35
spec/system/admin/change_emails_spec.rb
Normal file
35
spec/system/admin/change_emails_spec.rb
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'Admin Change Emails' do
|
||||||
|
let(:admin) { Fabricate(:admin_user) }
|
||||||
|
|
||||||
|
before { sign_in admin }
|
||||||
|
|
||||||
|
describe 'Changing the email address for a user', :inline_jobs do
|
||||||
|
let(:user) { Fabricate :user }
|
||||||
|
|
||||||
|
it 'updates user details and sends email' do
|
||||||
|
visit admin_account_change_email_path(user.account.id)
|
||||||
|
expect(page)
|
||||||
|
.to have_title(I18n.t('admin.accounts.change_email.title', username: user.account.username))
|
||||||
|
|
||||||
|
fill_in 'user_unconfirmed_email', with: 'test@host.example'
|
||||||
|
emails = capture_emails { process_change_email }
|
||||||
|
expect(emails.first)
|
||||||
|
.to be_present
|
||||||
|
.and(deliver_to('test@host.example'))
|
||||||
|
.and(have_subject(/Confirm email/))
|
||||||
|
expect(page)
|
||||||
|
.to have_title(user.account.pretty_acct)
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_change_email
|
||||||
|
expect { click_on I18n.t('admin.accounts.change_email.submit') }
|
||||||
|
.to not_change { user.reload.email }
|
||||||
|
.and(change { user.reload.unconfirmed_email }.to('test@host.example'))
|
||||||
|
.and(change { user.reload.confirmation_token }.from(nil).to(be_present))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
58
spec/system/admin/users/two_factor_authentications_spec.rb
Normal file
58
spec/system/admin/users/two_factor_authentications_spec.rb
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
require 'webauthn/fake_client'
|
||||||
|
|
||||||
|
RSpec.describe 'Admin Users TwoFactorAuthentications' do
|
||||||
|
let(:user) { Fabricate(:user) }
|
||||||
|
|
||||||
|
before { sign_in Fabricate(:admin_user) }
|
||||||
|
|
||||||
|
describe 'Disabling 2FA for users' do
|
||||||
|
before { stub_webauthn_credential }
|
||||||
|
|
||||||
|
let(:fake_client) { WebAuthn::FakeClient.new('http://test.host') }
|
||||||
|
|
||||||
|
context 'when user has OTP enabled' do
|
||||||
|
before { user.update(otp_required_for_login: true) }
|
||||||
|
|
||||||
|
it 'disables OTP and redirects to admin account page' do
|
||||||
|
visit admin_account_path(user.account.id)
|
||||||
|
|
||||||
|
expect { disable_two_factor }
|
||||||
|
.to change { user.reload.otp_enabled? }.to(false)
|
||||||
|
expect(page)
|
||||||
|
.to have_title(user.account.pretty_acct)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when user has OTP and WebAuthn enabled' do
|
||||||
|
before { user.update(otp_required_for_login: true, webauthn_id: WebAuthn.generate_user_id) }
|
||||||
|
|
||||||
|
it 'disables OTP and webauthn and redirects to admin account page' do
|
||||||
|
visit admin_account_path(user.account.id)
|
||||||
|
|
||||||
|
expect { disable_two_factor }
|
||||||
|
.to change { user.reload.otp_enabled? }.to(false)
|
||||||
|
.and(change { user.reload.webauthn_enabled? }.to(false))
|
||||||
|
expect(page)
|
||||||
|
.to have_title(user.account.pretty_acct)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable_two_factor
|
||||||
|
click_on I18n.t('admin.accounts.disable_two_factor_authentication')
|
||||||
|
end
|
||||||
|
|
||||||
|
def stub_webauthn_credential
|
||||||
|
public_key_credential = WebAuthn::Credential.from_create(fake_client.create)
|
||||||
|
Fabricate(
|
||||||
|
:webauthn_credential,
|
||||||
|
external_id: public_key_credential.id,
|
||||||
|
nickname: 'Security Key',
|
||||||
|
public_key: public_key_credential.public_key,
|
||||||
|
user_id: user.id
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -5244,13 +5244,13 @@ __metadata:
|
|||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"axios@npm:^1.4.0":
|
"axios@npm:^1.4.0":
|
||||||
version: 1.8.3
|
version: 1.8.4
|
||||||
resolution: "axios@npm:1.8.3"
|
resolution: "axios@npm:1.8.4"
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects: "npm:^1.15.6"
|
follow-redirects: "npm:^1.15.6"
|
||||||
form-data: "npm:^4.0.0"
|
form-data: "npm:^4.0.0"
|
||||||
proxy-from-env: "npm:^1.1.0"
|
proxy-from-env: "npm:^1.1.0"
|
||||||
checksum: 10c0/de75da9859adf0a6481d4af2b687db357a054d20f0d69b99d502b71dae3578326b1fdc0951dabaef769827484941cda93d3f89150bf9e04f05f6615fb8316780
|
checksum: 10c0/450993c2ba975ffccaf0d480b68839a3b2435a5469a71fa2fb0b8a55cdb2c2ae47e609360b9c1e2b2534b73dfd69e2733a1cf9f8215bee0bcd729b72f801b0ce
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user