diff options
author | Claire <claire.github-309c@sitedethib.com> | 2023-03-05 20:37:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-05 20:37:42 +0100 |
commit | bcbc2a43d4a8913475d47d77cfb5d54b15bfe5cc (patch) | |
tree | ae50a1c4344476421eb36fc254ec9bbcfcfc6f8a | |
parent | 6a4be4e96677eb3e1303ddcab8f8b4bea7298453 (diff) | |
parent | 0e476f3c4fbbcab9b4895b8abff93075dfd2bf0c (diff) |
Merge pull request #2121 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes
112 files changed, 1492 insertions, 547 deletions
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 8cd4afa5a..22e1a99c1 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -2056,13 +2056,6 @@ Style/HashAsLastArrayItem: - 'app/services/notify_service.rb' - 'db/migrate/20181024224956_migrate_account_conversations.rb' -# Offense count: 1 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: AllowSplatArgument. -Style/HashConversion: - Exclude: - - 'app/services/import_service.rb' - # Offense count: 12 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle, EnforcedShorthandSyntax, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. diff --git a/Gemfile b/Gemfile index 42340f58d..d9678a889 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ ruby '>= 2.7.0', '< 3.3.0' gem 'pkg-config', '~> 1.5' gem 'rexml', '~> 3.2' -gem 'puma', '~> 5.6' +gem 'puma', '~> 6.1' gem 'rails', '~> 6.1.7' gem 'sprockets', '~> 3.7.2' gem 'thor', '~> 1.2' @@ -106,7 +106,7 @@ group :development, :test do gem 'i18n-tasks', '~> 1.0', require: false gem 'pry-byebug', '~> 3.10' gem 'pry-rails', '~> 0.3' - gem 'rspec-rails', '~> 5.1' + gem 'rspec-rails', '~> 6.0' gem 'rubocop-performance', require: false gem 'rubocop-rails', require: false gem 'rubocop-rspec', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 0deb4542d..22cb86df8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -193,7 +193,7 @@ GEM cocoon (1.2.15) coderay (1.1.3) color_diff (0.1) - concurrent-ruby (1.2.0) + concurrent-ruby (1.2.2) connection_pool (2.3.0) cose (1.3.0) cbor (~> 0.5.9) @@ -508,7 +508,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (5.0.1) - puma (5.6.5) + puma (6.1.0) nio4r (~> 2.0) pundit (2.3.0) activesupport (>= 3.0.0) @@ -587,26 +587,26 @@ GEM chunky_png (~> 1.0) rqrcode_core (~> 1.0) rqrcode_core (1.2.0) - rspec-core (3.11.0) - rspec-support (~> 3.11.0) - rspec-expectations (3.11.0) + rspec-core (3.12.1) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.11.0) - rspec-mocks (3.11.1) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.11.0) - rspec-rails (5.1.2) - actionpack (>= 5.2) - activesupport (>= 5.2) - railties (>= 5.2) - rspec-core (~> 3.10) - rspec-expectations (~> 3.10) - rspec-mocks (~> 3.10) - rspec-support (~> 3.10) + rspec-support (~> 3.12.0) + rspec-rails (6.0.1) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.11) + rspec-expectations (~> 3.11) + rspec-mocks (~> 3.11) + rspec-support (~> 3.11) rspec-sidekiq (3.1.0) rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) - rspec-support (3.11.1) + rspec-support (3.12.0) rspec_junit_formatter (0.6.0) rspec-core (>= 2, < 4, != 2.12.0) rubocop (1.45.1) @@ -856,7 +856,7 @@ DEPENDENCIES pry-byebug (~> 3.10) pry-rails (~> 0.3) public_suffix (~> 5.0) - puma (~> 5.6) + puma (~> 6.1) pundit (~> 2.3) rack (~> 2.2.6) rack-attack (~> 6.6) @@ -872,7 +872,7 @@ DEPENDENCIES redis-namespace (~> 1.10) rexml (~> 3.2) rqrcode (~> 2.1) - rspec-rails (~> 5.1) + rspec-rails (~> 6.0) rspec-sidekiq (~> 3.1) rspec_junit_formatter (~> 0.6) rubocop diff --git a/app/helpers/admin/announcements_helper.rb b/app/helpers/admin/announcements_helper.rb deleted file mode 100644 index 0c053ddec..000000000 --- a/app/helpers/admin/announcements_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module Admin::AnnouncementsHelper - def time_range(announcement) - if announcement.all_day? - safe_join([l(announcement.starts_at.to_date), ' - ', l(announcement.ends_at.to_date)]) - else - safe_join([l(announcement.starts_at), ' - ', l(announcement.ends_at)]) - end - end -end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index f41104709..ea2196086 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -41,9 +41,9 @@ module HomeHelper def obscured_counter(count) if count <= 0 - 0 + '0' elsif count == 1 - 1 + '1' else '1+' end @@ -57,14 +57,6 @@ module HomeHelper end end - def optional_link_to(condition, path, options = {}, &block) - if condition - link_to(path, options, &block) - else - content_tag(:div, &block) - end - end - def sign_up_message if closed_registrations? t('auth.registration_closed', instance: site_hostname) diff --git a/app/javascript/flavours/glitch/components/gifv.jsx b/app/javascript/flavours/glitch/components/gifv.jsx index 1f0f99b46..9ec201c6c 100644 --- a/app/javascript/flavours/glitch/components/gifv.jsx +++ b/app/javascript/flavours/glitch/components/gifv.jsx @@ -6,6 +6,7 @@ export default class GIFV extends React.PureComponent { static propTypes = { src: PropTypes.string.isRequired, alt: PropTypes.string, + lang: PropTypes.string, width: PropTypes.number, height: PropTypes.number, onClick: PropTypes.func, @@ -35,7 +36,7 @@ export default class GIFV extends React.PureComponent { }; render () { - const { src, width, height, alt } = this.props; + const { src, width, height, alt, lang } = this.props; const { loading } = this.state; return ( @@ -48,6 +49,7 @@ export default class GIFV extends React.PureComponent { tabIndex='0' aria-label={alt} title={alt} + lang={lang} onClick={this.handleClick} /> )} @@ -58,6 +60,7 @@ export default class GIFV extends React.PureComponent { tabIndex='0' aria-label={alt} title={alt} + lang={lang} muted loop autoPlay diff --git a/app/javascript/flavours/glitch/components/media_attachments.jsx b/app/javascript/flavours/glitch/components/media_attachments.jsx index 33f01bb5a..b11d3526f 100644 --- a/app/javascript/flavours/glitch/components/media_attachments.jsx +++ b/app/javascript/flavours/glitch/components/media_attachments.jsx @@ -10,6 +10,7 @@ export default class MediaAttachments extends ImmutablePureComponent { static propTypes = { status: ImmutablePropTypes.map.isRequired, + lang: PropTypes.string, height: PropTypes.number, width: PropTypes.number, revealed: PropTypes.bool, @@ -49,7 +50,7 @@ export default class MediaAttachments extends ImmutablePureComponent { }; render () { - const { status, width, height, revealed } = this.props; + const { status, lang, width, height, revealed } = this.props; const mediaAttachments = status.get('media_attachments'); if (mediaAttachments.size === 0) { @@ -65,6 +66,7 @@ export default class MediaAttachments extends ImmutablePureComponent { <Component src={audio.get('url')} alt={audio.get('description')} + lang={lang || status.get('language')} width={width} height={height} poster={audio.get('preview_url') || status.getIn(['account', 'avatar_static'])} @@ -88,6 +90,7 @@ export default class MediaAttachments extends ImmutablePureComponent { blurhash={video.get('blurhash')} src={video.get('url')} alt={video.get('description')} + lang={lang || status.get('language')} width={width} height={height} inline @@ -104,6 +107,7 @@ export default class MediaAttachments extends ImmutablePureComponent { {Component => ( <Component media={mediaAttachments} + lang={lang || status.get('language')} sensitive={status.get('sensitive')} defaultWidth={width} revealed={revealed} diff --git a/app/javascript/flavours/glitch/components/media_gallery.jsx b/app/javascript/flavours/glitch/components/media_gallery.jsx index c11ac46c2..6ae510d08 100644 --- a/app/javascript/flavours/glitch/components/media_gallery.jsx +++ b/app/javascript/flavours/glitch/components/media_gallery.jsx @@ -36,6 +36,7 @@ class Item extends React.PureComponent { static propTypes = { attachment: ImmutablePropTypes.map.isRequired, + lang: PropTypes.string, standalone: PropTypes.bool, index: PropTypes.number.isRequired, size: PropTypes.number.isRequired, @@ -98,7 +99,7 @@ class Item extends React.PureComponent { }; render () { - const { attachment, index, size, standalone, letterbox, displayWidth, visible } = this.props; + const { attachment, lang, index, size, standalone, letterbox, displayWidth, visible } = this.props; let width = 50; let height = 100; @@ -154,7 +155,7 @@ class Item extends React.PureComponent { if (attachment.get('type') === 'unknown') { return ( <div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}> - <a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} style={{ cursor: 'pointer' }} title={attachment.get('description')} target='_blank' rel='noopener noreferrer'> + <a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} style={{ cursor: 'pointer' }} title={attachment.get('description')} lang={lang} target='_blank' rel='noopener noreferrer'> <Blurhash hash={attachment.get('blurhash')} className='media-gallery__preview' @@ -195,6 +196,7 @@ class Item extends React.PureComponent { sizes={sizes} alt={attachment.get('description')} title={attachment.get('description')} + lang={lang} style={{ objectPosition: letterbox ? null : `${x}% ${y}%` }} onLoad={this.handleImageLoad} /> @@ -209,6 +211,7 @@ class Item extends React.PureComponent { className={`media-gallery__item-gifv-thumbnail${letterbox ? ' letterbox' : ''}`} aria-label={attachment.get('description')} title={attachment.get('description')} + lang={lang} role='application' src={attachment.get('url')} onClick={this.handleClick} @@ -251,6 +254,7 @@ class MediaGallery extends React.PureComponent { fullwidth: PropTypes.bool, hidden: PropTypes.bool, media: ImmutablePropTypes.list.isRequired, + lang: PropTypes.string, size: PropTypes.object, onOpenMedia: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, @@ -342,7 +346,7 @@ class MediaGallery extends React.PureComponent { } render () { - const { media, intl, sensitive, letterbox, fullwidth, defaultWidth, autoplay } = this.props; + const { media, lang, intl, sensitive, letterbox, fullwidth, defaultWidth, autoplay } = this.props; const { visible } = this.state; const size = media.take(4).size; const uncached = media.every(attachment => attachment.get('type') === 'unknown'); @@ -364,9 +368,9 @@ class MediaGallery extends React.PureComponent { } if (this.isStandaloneEligible()) { - children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />; + children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} lang={lang} displayWidth={width} visible={visible} />; } else { - children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} size={size} letterbox={letterbox} displayWidth={width} visible={visible || uncached} />); + children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} lang={lang} size={size} letterbox={letterbox} displayWidth={width} visible={visible || uncached} />); } if (uncached) { diff --git a/app/javascript/flavours/glitch/components/poll.jsx b/app/javascript/flavours/glitch/components/poll.jsx index 53ece560e..8b799309b 100644 --- a/app/javascript/flavours/glitch/components/poll.jsx +++ b/app/javascript/flavours/glitch/components/poll.jsx @@ -40,6 +40,7 @@ class Poll extends ImmutablePureComponent { static propTypes = { poll: ImmutablePropTypes.map, + lang: PropTypes.string, intl: PropTypes.object.isRequired, disabled: PropTypes.bool, refresh: PropTypes.func, @@ -126,7 +127,7 @@ class Poll extends ImmutablePureComponent { }; renderOption (option, optionIndex, showResults) { - const { poll, disabled, intl } = this.props; + const { poll, lang, disabled, intl } = this.props; const pollVotesCount = poll.get('voters_count') || poll.get('votes_count'); const percent = pollVotesCount === 0 ? 0 : (option.get('votes_count') / pollVotesCount) * 100; const leading = poll.get('options').filterNot(other => other.get('title') === option.get('title')).every(other => option.get('votes_count') >= other.get('votes_count')); @@ -159,6 +160,7 @@ class Poll extends ImmutablePureComponent { onKeyPress={this.handleOptionKeyPress} aria-checked={active} aria-label={option.get('title')} + lang={lang} data-index={optionIndex} /> )} @@ -175,6 +177,7 @@ class Poll extends ImmutablePureComponent { <span className='poll__option__text translate' + lang={lang} dangerouslySetInnerHTML={{ __html: titleEmojified }} /> diff --git a/app/javascript/flavours/glitch/components/status.jsx b/app/javascript/flavours/glitch/components/status.jsx index 34880efe4..2f919176c 100644 --- a/app/javascript/flavours/glitch/components/status.jsx +++ b/app/javascript/flavours/glitch/components/status.jsx @@ -630,6 +630,7 @@ class Status extends ImmutablePureComponent { <Component src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])} backgroundColor={attachment.getIn(['meta', 'colors', 'background'])} foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])} @@ -659,6 +660,7 @@ class Status extends ImmutablePureComponent { blurhash={attachment.get('blurhash')} src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} inline sensitive={status.get('sensitive')} letterbox={settings.getIn(['media', 'letterbox'])} @@ -680,6 +682,7 @@ class Status extends ImmutablePureComponent { {Component => ( <Component media={attachments} + lang={status.get('language')} sensitive={status.get('sensitive')} letterbox={settings.getIn(['media', 'letterbox'])} fullwidth={settings.getIn(['media', 'fullwidth'])} @@ -714,7 +717,7 @@ class Status extends ImmutablePureComponent { } if (status.get('poll')) { - contentMedia.push(<PollContainer pollId={status.get('poll')} />); + contentMedia.push(<PollContainer pollId={status.get('poll')} lang={status.get('language')} />); contentMediaIcons.push('tasks'); } diff --git a/app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx index d169875b0..5fd84996b 100644 --- a/app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx +++ b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.jsx @@ -76,6 +76,7 @@ export default class MediaItem extends ImmutablePureComponent { <img src={attachment.get('preview_url') || attachment.getIn(['account', 'avatar_static'])} alt={attachment.get('description')} + lang={status.get('language')} onLoad={this.handleImageLoad} /> ); @@ -95,6 +96,7 @@ export default class MediaItem extends ImmutablePureComponent { <img src={attachment.get('preview_url')} alt={attachment.get('description')} + lang={status.get('language')} style={{ objectPosition: `${x}% ${y}%` }} onLoad={this.handleImageLoad} /> @@ -105,6 +107,7 @@ export default class MediaItem extends ImmutablePureComponent { className='media-gallery__item-gifv-thumbnail' aria-label={attachment.get('description')} title={attachment.get('description')} + lang={status.get('language')} role='application' src={attachment.get('url')} onMouseEnter={this.handleMouseEnter} diff --git a/app/javascript/flavours/glitch/features/audio/index.jsx b/app/javascript/flavours/glitch/features/audio/index.jsx index c4aa98962..05c3beef9 100644 --- a/app/javascript/flavours/glitch/features/audio/index.jsx +++ b/app/javascript/flavours/glitch/features/audio/index.jsx @@ -28,6 +28,7 @@ class Audio extends React.PureComponent { static propTypes = { src: PropTypes.string.isRequired, alt: PropTypes.string, + lang: PropTypes.string, poster: PropTypes.string, duration: PropTypes.number, width: PropTypes.number, @@ -464,7 +465,7 @@ class Audio extends React.PureComponent { }; render () { - const { src, intl, alt, editable, autoPlay, sensitive, blurhash } = this.props; + const { src, intl, alt, lang, editable, autoPlay, sensitive, blurhash } = this.props; const { paused, muted, volume, currentTime, duration, buffer, dragging, revealed } = this.state; const progress = Math.min((currentTime / duration) * 100, 100); @@ -509,6 +510,7 @@ class Audio extends React.PureComponent { onKeyDown={this.handleAudioKeyDown} title={alt} aria-label={alt} + lang={lang} /> <div className={classNames('spoiler-button', { 'spoiler-button--hidden': revealed || editable })}> diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.jsx b/app/javascript/flavours/glitch/features/status/components/detailed_status.jsx index 644881fa5..a94572855 100644 --- a/app/javascript/flavours/glitch/features/status/components/detailed_status.jsx +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.jsx @@ -169,6 +169,7 @@ class DetailedStatus extends ImmutablePureComponent { <Audio src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} duration={attachment.getIn(['meta', 'original', 'duration'], 0)} poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])} backgroundColor={attachment.getIn(['meta', 'colors', 'background'])} @@ -191,6 +192,7 @@ class DetailedStatus extends ImmutablePureComponent { blurhash={attachment.get('blurhash')} src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} inline sensitive={status.get('sensitive')} letterbox={settings.getIn(['media', 'letterbox'])} @@ -209,6 +211,7 @@ class DetailedStatus extends ImmutablePureComponent { standalone sensitive={status.get('sensitive')} media={status.get('media_attachments')} + lang={status.get('language')} letterbox={settings.getIn(['media', 'letterbox'])} fullwidth={settings.getIn(['media', 'fullwidth'])} hidden={!expanded} @@ -225,7 +228,7 @@ class DetailedStatus extends ImmutablePureComponent { } if (status.get('poll')) { - contentMedia.push(<PollContainer pollId={status.get('poll')} />); + contentMedia.push(<PollContainer pollId={status.get('poll')} lang={status.get('language')} />); contentMediaIcons.push('tasks'); } diff --git a/app/javascript/flavours/glitch/features/ui/components/audio_modal.jsx b/app/javascript/flavours/glitch/features/ui/components/audio_modal.jsx index fc98cc6af..ff7687c1e 100644 --- a/app/javascript/flavours/glitch/features/ui/components/audio_modal.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/audio_modal.jsx @@ -7,15 +7,17 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import Footer from 'flavours/glitch/features/picture_in_picture/components/footer'; const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), accountStaticAvatar: state.getIn(['accounts', state.getIn(['statuses', statusId, 'account']), 'avatar_static']), }); -export default @connect(mapStateToProps) +export default @connect(mapStateToProps, null, null, { forwardRef: true }) class AudioModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, statusId: PropTypes.string.isRequired, + language: PropTypes.string, accountStaticAvatar: PropTypes.string.isRequired, options: PropTypes.shape({ autoPlay: PropTypes.bool, @@ -29,7 +31,7 @@ class AudioModal extends ImmutablePureComponent { }; render () { - const { media, accountStaticAvatar, statusId, onClose } = this.props; + const { media, language, accountStaticAvatar, statusId, onClose } = this.props; const options = this.props.options || {}; return ( @@ -38,6 +40,7 @@ class AudioModal extends ImmutablePureComponent { <Audio src={media.get('url')} alt={media.get('description')} + lang={language} duration={media.getIn(['meta', 'original', 'duration'], 0)} height={150} poster={media.get('preview_url') || accountStaticAvatar} diff --git a/app/javascript/flavours/glitch/features/ui/components/compare_history_modal.jsx b/app/javascript/flavours/glitch/features/ui/components/compare_history_modal.jsx index baf7f25be..4e74feb02 100644 --- a/app/javascript/flavours/glitch/features/ui/components/compare_history_modal.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/compare_history_modal.jsx @@ -12,6 +12,7 @@ import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; import MediaAttachments from 'flavours/glitch/components/media_attachments'; const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), versions: state.getIn(['history', statusId, 'items']), }); @@ -30,11 +31,12 @@ class CompareHistoryModal extends React.PureComponent { onClose: PropTypes.func.isRequired, index: PropTypes.number.isRequired, statusId: PropTypes.string.isRequired, + language: PropTypes.string.isRequired, versions: ImmutablePropTypes.list.isRequired, }; render () { - const { index, versions, onClose } = this.props; + const { index, versions, language, onClose } = this.props; const currentVersion = versions.get(index); const emojiMap = currentVersion.get('emojis').reduce((obj, emoji) => { @@ -65,12 +67,12 @@ class CompareHistoryModal extends React.PureComponent { <div className='status__content'> {currentVersion.get('spoiler_text').length > 0 && ( <React.Fragment> - <div className='translate' dangerouslySetInnerHTML={spoilerContent} /> + <div className='translate' dangerouslySetInnerHTML={spoilerContent} lang={language} /> <hr /> </React.Fragment> )} - <div className='status__content__text status__content__text--visible translate' dangerouslySetInnerHTML={content} /> + <div className='status__content__text status__content__text--visible translate' dangerouslySetInnerHTML={content} lang={language} /> {!!currentVersion.get('poll') && ( <div className='poll'> @@ -82,6 +84,7 @@ class CompareHistoryModal extends React.PureComponent { <span className='poll__option__text translate' dangerouslySetInnerHTML={{ __html: emojify(escapeTextContentForBrowser(option.get('title')), emojiMap) }} + lang={language} /> </li> ))} @@ -89,7 +92,7 @@ class CompareHistoryModal extends React.PureComponent { </div> )} - <MediaAttachments status={currentVersion} /> + <MediaAttachments status={currentVersion} lang={language} /> </div> </div> </div> diff --git a/app/javascript/flavours/glitch/features/ui/components/image_loader.jsx b/app/javascript/flavours/glitch/features/ui/components/image_loader.jsx index 92aeef5c4..9093eab28 100644 --- a/app/javascript/flavours/glitch/features/ui/components/image_loader.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/image_loader.jsx @@ -8,6 +8,7 @@ export default class ImageLoader extends PureComponent { static propTypes = { alt: PropTypes.string, + lang: PropTypes.string, src: PropTypes.string.isRequired, previewSrc: PropTypes.string, width: PropTypes.number, @@ -18,6 +19,7 @@ export default class ImageLoader extends PureComponent { static defaultProps = { alt: '', + lang: '', width: null, height: null, }; @@ -129,7 +131,7 @@ export default class ImageLoader extends PureComponent { }; render () { - const { alt, src, width, height, onClick } = this.props; + const { alt, lang, src, width, height, onClick } = this.props; const { loading } = this.state; const className = classNames('image-loader', { @@ -154,6 +156,7 @@ export default class ImageLoader extends PureComponent { ) : ( <ZoomableImage alt={alt} + lang={lang} src={src} onClick={onClick} width={width} diff --git a/app/javascript/flavours/glitch/features/ui/components/media_modal.jsx b/app/javascript/flavours/glitch/features/ui/components/media_modal.jsx index 24559264e..9c67ed808 100644 --- a/app/javascript/flavours/glitch/features/ui/components/media_modal.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.jsx @@ -3,6 +3,7 @@ import ReactSwipeableViews from 'react-swipeable-views'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Video from 'flavours/glitch/features/video'; +import { connect } from 'react-redux'; import classNames from 'classnames'; import { defineMessages, injectIntl } from 'react-intl'; import IconButton from 'flavours/glitch/components/icon_button'; @@ -20,7 +21,12 @@ const messages = defineMessages({ next: { id: 'lightbox.next', defaultMessage: 'Next' }, }); -export default @injectIntl +const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), +}); + +export default @connect(mapStateToProps, null, null, { forwardRef: true }) +@injectIntl class MediaModal extends ImmutablePureComponent { static contextTypes = { @@ -131,7 +137,7 @@ class MediaModal extends ImmutablePureComponent { } render () { - const { media, statusId, intl, onClose } = this.props; + const { media, language, statusId, intl, onClose } = this.props; const { navigationHidden } = this.state; const index = this.getIndex(); @@ -151,6 +157,7 @@ class MediaModal extends ImmutablePureComponent { width={width} height={height} alt={image.get('description')} + lang={language} key={image.get('url')} onClick={this.toggleNavigation} zoomButtonHidden={this.state.zoomButtonHidden} @@ -173,6 +180,7 @@ class MediaModal extends ImmutablePureComponent { onCloseVideo={onClose} detailed alt={image.get('description')} + lang={language} key={image.get('url')} /> ); @@ -184,6 +192,7 @@ class MediaModal extends ImmutablePureComponent { height={height} key={image.get('preview_url')} alt={image.get('description')} + lang={language} onClick={this.toggleNavigation} /> ); diff --git a/app/javascript/flavours/glitch/features/ui/components/video_modal.jsx b/app/javascript/flavours/glitch/features/ui/components/video_modal.jsx index 90be11e4b..c1f837717 100644 --- a/app/javascript/flavours/glitch/features/ui/components/video_modal.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/video_modal.jsx @@ -2,11 +2,17 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Video from 'flavours/glitch/features/video'; +import { connect } from 'react-redux'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Footer from 'flavours/glitch/features/picture_in_picture/components/footer'; import { getAverageFromBlurhash } from 'flavours/glitch/blurhash'; -export default class VideoModal extends ImmutablePureComponent { +const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), +}); + +export default @connect(mapStateToProps, null, null, { forwardRef: true }) +class VideoModal extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, @@ -15,6 +21,7 @@ export default class VideoModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, statusId: PropTypes.string, + language: PropTypes.string, options: PropTypes.shape({ startTime: PropTypes.number, autoPlay: PropTypes.bool, @@ -35,7 +42,7 @@ export default class VideoModal extends ImmutablePureComponent { } render () { - const { media, statusId, onClose } = this.props; + const { media, statusId, language, onClose } = this.props; const options = this.props.options || {}; return ( @@ -53,6 +60,7 @@ export default class VideoModal extends ImmutablePureComponent { autoFocus detailed alt={media.get('description')} + lang={language} /> </div> diff --git a/app/javascript/flavours/glitch/features/ui/components/zoomable_image.jsx b/app/javascript/flavours/glitch/features/ui/components/zoomable_image.jsx index 50b36b478..82ba6e692 100644 --- a/app/javascript/flavours/glitch/features/ui/components/zoomable_image.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/zoomable_image.jsx @@ -96,6 +96,7 @@ class ZoomableImage extends React.PureComponent { static propTypes = { alt: PropTypes.string, + lang: PropTypes.string, src: PropTypes.string.isRequired, width: PropTypes.number, height: PropTypes.number, @@ -106,6 +107,7 @@ class ZoomableImage extends React.PureComponent { static defaultProps = { alt: '', + lang: '', width: null, height: null, }; @@ -403,7 +405,7 @@ class ZoomableImage extends React.PureComponent { }; render () { - const { alt, src, width, height, intl } = this.props; + const { alt, lang, src, width, height, intl } = this.props; const { scale, lockTranslate } = this.state; const overflow = scale === MIN_SCALE ? 'hidden' : 'scroll'; const zoomButtonShouldHide = this.state.navigationHidden || this.props.zoomButtonHidden || this.state.zoomMatrix.rate <= MIN_SCALE ? 'media-modal__zoom-button--hidden' : ''; @@ -431,6 +433,7 @@ class ZoomableImage extends React.PureComponent { ref={this.setImageRef} alt={alt} title={alt} + lang={lang} src={src} width={width} height={height} diff --git a/app/javascript/flavours/glitch/features/video/index.jsx b/app/javascript/flavours/glitch/features/video/index.jsx index cb923bcf7..9ab56b439 100644 --- a/app/javascript/flavours/glitch/features/video/index.jsx +++ b/app/javascript/flavours/glitch/features/video/index.jsx @@ -101,6 +101,7 @@ class Video extends React.PureComponent { frameRate: PropTypes.string, src: PropTypes.string.isRequired, alt: PropTypes.string, + lang: PropTypes.string, width: PropTypes.number, height: PropTypes.number, sensitive: PropTypes.bool, @@ -538,7 +539,7 @@ class Video extends React.PureComponent { } render () { - const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, letterbox, fullwidth, detailed, sensitive, editable, blurhash, autoFocus } = this.props; + const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, lang, letterbox, fullwidth, detailed, sensitive, editable, blurhash, autoFocus } = this.props; const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; const progress = Math.min((currentTime / duration) * 100, 100); const playerStyle = {}; @@ -603,6 +604,7 @@ class Video extends React.PureComponent { tabIndex='0' aria-label={alt} title={alt} + lang={lang} width={width} height={height} volume={volume} diff --git a/app/javascript/mastodon/components/gifv.jsx b/app/javascript/mastodon/components/gifv.jsx index 1f0f99b46..9ec201c6c 100644 --- a/app/javascript/mastodon/components/gifv.jsx +++ b/app/javascript/mastodon/components/gifv.jsx @@ -6,6 +6,7 @@ export default class GIFV extends React.PureComponent { static propTypes = { src: PropTypes.string.isRequired, alt: PropTypes.string, + lang: PropTypes.string, width: PropTypes.number, height: PropTypes.number, onClick: PropTypes.func, @@ -35,7 +36,7 @@ export default class GIFV extends React.PureComponent { }; render () { - const { src, width, height, alt } = this.props; + const { src, width, height, alt, lang } = this.props; const { loading } = this.state; return ( @@ -48,6 +49,7 @@ export default class GIFV extends React.PureComponent { tabIndex='0' aria-label={alt} title={alt} + lang={lang} onClick={this.handleClick} /> )} @@ -58,6 +60,7 @@ export default class GIFV extends React.PureComponent { tabIndex='0' aria-label={alt} title={alt} + lang={lang} muted loop autoPlay diff --git a/app/javascript/mastodon/components/media_attachments.jsx b/app/javascript/mastodon/components/media_attachments.jsx index 565a30330..0e25e5973 100644 --- a/app/javascript/mastodon/components/media_attachments.jsx +++ b/app/javascript/mastodon/components/media_attachments.jsx @@ -10,6 +10,7 @@ export default class MediaAttachments extends ImmutablePureComponent { static propTypes = { status: ImmutablePropTypes.map.isRequired, + lang: PropTypes.string, height: PropTypes.number, width: PropTypes.number, }; @@ -48,7 +49,7 @@ export default class MediaAttachments extends ImmutablePureComponent { }; render () { - const { status, width, height } = this.props; + const { status, lang, width, height } = this.props; const mediaAttachments = status.get('media_attachments'); if (mediaAttachments.size === 0) { @@ -64,6 +65,7 @@ export default class MediaAttachments extends ImmutablePureComponent { <Component src={audio.get('url')} alt={audio.get('description')} + lang={lang || status.get('language')} width={width} height={height} poster={audio.get('preview_url') || status.getIn(['account', 'avatar_static'])} @@ -87,6 +89,7 @@ export default class MediaAttachments extends ImmutablePureComponent { blurhash={video.get('blurhash')} src={video.get('url')} alt={video.get('description')} + lang={lang || status.get('language')} width={width} height={height} inline @@ -102,6 +105,7 @@ export default class MediaAttachments extends ImmutablePureComponent { {Component => ( <Component media={mediaAttachments} + lang={lang || status.get('language')} sensitive={status.get('sensitive')} defaultWidth={width} height={height} diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index 659a83375..f869bd62d 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -17,6 +17,7 @@ class Item extends React.PureComponent { static propTypes = { attachment: ImmutablePropTypes.map.isRequired, + lang: PropTypes.string, standalone: PropTypes.bool, index: PropTypes.number.isRequired, size: PropTypes.number.isRequired, @@ -78,7 +79,7 @@ class Item extends React.PureComponent { }; render () { - const { attachment, index, size, standalone, displayWidth, visible } = this.props; + const { attachment, lang, index, size, standalone, displayWidth, visible } = this.props; let width = 50; let height = 100; @@ -134,7 +135,7 @@ class Item extends React.PureComponent { if (attachment.get('type') === 'unknown') { return ( <div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}> - <a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} style={{ cursor: 'pointer' }} title={attachment.get('description')} target='_blank' rel='noopener noreferrer'> + <a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} style={{ cursor: 'pointer' }} title={attachment.get('description')} lang={lang} target='_blank' rel='noopener noreferrer'> <Blurhash hash={attachment.get('blurhash')} className='media-gallery__preview' @@ -174,6 +175,7 @@ class Item extends React.PureComponent { sizes={sizes} alt={attachment.get('description')} title={attachment.get('description')} + lang={lang} style={{ objectPosition: `${x}% ${y}%` }} onLoad={this.handleImageLoad} /> @@ -188,6 +190,7 @@ class Item extends React.PureComponent { className='media-gallery__item-gifv-thumbnail' aria-label={attachment.get('description')} title={attachment.get('description')} + lang={lang} role='application' src={attachment.get('url')} onClick={this.handleClick} @@ -227,6 +230,7 @@ class MediaGallery extends React.PureComponent { sensitive: PropTypes.bool, standalone: PropTypes.bool, media: ImmutablePropTypes.list.isRequired, + lang: PropTypes.string, size: PropTypes.object, height: PropTypes.number.isRequired, onOpenMedia: PropTypes.func.isRequired, @@ -310,9 +314,8 @@ class MediaGallery extends React.PureComponent { } render () { - const { media, intl, sensitive, height, defaultWidth, standalone, autoplay } = this.props; + const { media, lang, intl, sensitive, height, defaultWidth, standalone, autoplay } = this.props; const { visible } = this.state; - const width = this.state.width || defaultWidth; let children, spoilerButton; @@ -333,9 +336,9 @@ class MediaGallery extends React.PureComponent { const uncached = media.every(attachment => attachment.get('type') === 'unknown'); if (standalone && this.isFullSizeEligible()) { - children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />; + children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} lang={lang} displayWidth={width} visible={visible} />; } else { - children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} size={size} displayWidth={width} visible={visible || uncached} />); + children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} lang={lang} size={size} displayWidth={width} visible={visible || uncached} />); } if (uncached) { diff --git a/app/javascript/mastodon/components/poll.jsx b/app/javascript/mastodon/components/poll.jsx index 95a900c49..7efedfe34 100644 --- a/app/javascript/mastodon/components/poll.jsx +++ b/app/javascript/mastodon/components/poll.jsx @@ -40,6 +40,7 @@ class Poll extends ImmutablePureComponent { static propTypes = { poll: ImmutablePropTypes.map, + lang: PropTypes.string, intl: PropTypes.object.isRequired, disabled: PropTypes.bool, refresh: PropTypes.func, @@ -126,7 +127,7 @@ class Poll extends ImmutablePureComponent { }; renderOption (option, optionIndex, showResults) { - const { poll, disabled, intl } = this.props; + const { poll, lang, disabled, intl } = this.props; const pollVotesCount = poll.get('voters_count') || poll.get('votes_count'); const percent = pollVotesCount === 0 ? 0 : (option.get('votes_count') / pollVotesCount) * 100; const leading = poll.get('options').filterNot(other => other.get('title') === option.get('title')).every(other => option.get('votes_count') >= other.get('votes_count')); @@ -159,6 +160,7 @@ class Poll extends ImmutablePureComponent { onKeyPress={this.handleOptionKeyPress} aria-checked={active} aria-label={option.get('title')} + lang={lang} data-index={optionIndex} /> )} @@ -175,6 +177,7 @@ class Poll extends ImmutablePureComponent { <span className='poll__option__text translate' + lang={lang} dangerouslySetInnerHTML={{ __html: titleEmojified }} /> diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 2e2d96634..a48230baf 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -417,6 +417,7 @@ class Status extends ImmutablePureComponent { <Component src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])} backgroundColor={attachment.getIn(['meta', 'colors', 'background'])} foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])} @@ -446,6 +447,7 @@ class Status extends ImmutablePureComponent { blurhash={attachment.get('blurhash')} src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} width={this.props.cachedMediaWidth} height={110} inline @@ -465,6 +467,7 @@ class Status extends ImmutablePureComponent { {Component => ( <Component media={status.get('media_attachments')} + lang={status.get('language')} sensitive={status.get('sensitive')} height={110} onOpenMedia={this.handleOpenMedia} diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index ece54621f..a1c38171f 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -242,7 +242,7 @@ class StatusContent extends React.PureComponent { ); const poll = !!status.get('poll') && ( - <PollContainer pollId={status.get('poll')} /> + <PollContainer pollId={status.get('poll')} lang={status.get('language')} /> ); if (status.get('spoiler_text').length > 0) { diff --git a/app/javascript/mastodon/features/account_gallery/components/media_item.jsx b/app/javascript/mastodon/features/account_gallery/components/media_item.jsx index d6d60ebda..53b04acfd 100644 --- a/app/javascript/mastodon/features/account_gallery/components/media_item.jsx +++ b/app/javascript/mastodon/features/account_gallery/components/media_item.jsx @@ -76,6 +76,7 @@ export default class MediaItem extends ImmutablePureComponent { <img src={attachment.get('preview_url') || attachment.getIn(['account', 'avatar_static'])} alt={attachment.get('description')} + lang={status.get('language')} onLoad={this.handleImageLoad} /> ); @@ -95,6 +96,7 @@ export default class MediaItem extends ImmutablePureComponent { <img src={attachment.get('preview_url')} alt={attachment.get('description')} + lang={status.get('language')} style={{ objectPosition: `${x}% ${y}%` }} onLoad={this.handleImageLoad} /> @@ -105,6 +107,7 @@ export default class MediaItem extends ImmutablePureComponent { className='media-gallery__item-gifv-thumbnail' aria-label={attachment.get('description')} title={attachment.get('description')} + lang={status.get('language')} role='application' src={attachment.get('url')} onMouseEnter={this.handleMouseEnter} diff --git a/app/javascript/mastodon/features/audio/index.jsx b/app/javascript/mastodon/features/audio/index.jsx index bf954c06d..9a9de02ae 100644 --- a/app/javascript/mastodon/features/audio/index.jsx +++ b/app/javascript/mastodon/features/audio/index.jsx @@ -28,6 +28,7 @@ class Audio extends React.PureComponent { static propTypes = { src: PropTypes.string.isRequired, alt: PropTypes.string, + lang: PropTypes.string, poster: PropTypes.string, duration: PropTypes.number, width: PropTypes.number, @@ -458,7 +459,7 @@ class Audio extends React.PureComponent { }; render () { - const { src, intl, alt, editable, autoPlay, sensitive, blurhash } = this.props; + const { src, intl, alt, lang, editable, autoPlay, sensitive, blurhash } = this.props; const { paused, muted, volume, currentTime, duration, buffer, dragging, revealed } = this.state; const progress = Math.min((currentTime / duration) * 100, 100); @@ -503,6 +504,7 @@ class Audio extends React.PureComponent { onKeyDown={this.handleAudioKeyDown} title={alt} aria-label={alt} + lang={lang} /> <div className={classNames('spoiler-button', { 'spoiler-button--hidden': revealed || editable })}> diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index 064231ffe..f9ff57261 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -139,6 +139,7 @@ class DetailedStatus extends ImmutablePureComponent { <Audio src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} duration={attachment.getIn(['meta', 'original', 'duration'], 0)} poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])} backgroundColor={attachment.getIn(['meta', 'colors', 'background'])} @@ -161,6 +162,7 @@ class DetailedStatus extends ImmutablePureComponent { blurhash={attachment.get('blurhash')} src={attachment.get('url')} alt={attachment.get('description')} + lang={status.get('language')} width={300} height={150} inline @@ -176,6 +178,7 @@ class DetailedStatus extends ImmutablePureComponent { standalone sensitive={status.get('sensitive')} media={status.get('media_attachments')} + lang={status.get('language')} height={300} onOpenMedia={this.props.onOpenMedia} visible={this.props.showMedia} diff --git a/app/javascript/mastodon/features/ui/components/audio_modal.jsx b/app/javascript/mastodon/features/ui/components/audio_modal.jsx index c46fefce8..a2fa8c49c 100644 --- a/app/javascript/mastodon/features/ui/components/audio_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/audio_modal.jsx @@ -7,15 +7,17 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import Footer from 'mastodon/features/picture_in_picture/components/footer'; const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), accountStaticAvatar: state.getIn(['accounts', state.getIn(['statuses', statusId, 'account']), 'avatar_static']), }); -export default @connect(mapStateToProps) +export default @connect(mapStateToProps, null, null, { forwardRef: true }) class AudioModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, statusId: PropTypes.string.isRequired, + language: PropTypes.string, accountStaticAvatar: PropTypes.string.isRequired, options: PropTypes.shape({ autoPlay: PropTypes.bool, @@ -25,7 +27,7 @@ class AudioModal extends ImmutablePureComponent { }; render () { - const { media, accountStaticAvatar, statusId, onClose } = this.props; + const { media, language, accountStaticAvatar, statusId, onClose } = this.props; const options = this.props.options || {}; return ( @@ -34,6 +36,7 @@ class AudioModal extends ImmutablePureComponent { <Audio src={media.get('url')} alt={media.get('description')} + lang={language} duration={media.getIn(['meta', 'original', 'duration'], 0)} height={150} poster={media.get('preview_url') || accountStaticAvatar} diff --git a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx index ecccc8f7d..cbb1567b7 100644 --- a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx @@ -12,6 +12,7 @@ import RelativeTimestamp from 'mastodon/components/relative_timestamp'; import MediaAttachments from 'mastodon/components/media_attachments'; const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), versions: state.getIn(['history', statusId, 'items']), }); @@ -30,11 +31,12 @@ class CompareHistoryModal extends React.PureComponent { onClose: PropTypes.func.isRequired, index: PropTypes.number.isRequired, statusId: PropTypes.string.isRequired, + language: PropTypes.string.isRequired, versions: ImmutablePropTypes.list.isRequired, }; render () { - const { index, versions, onClose } = this.props; + const { index, versions, language, onClose } = this.props; const currentVersion = versions.get(index); const emojiMap = currentVersion.get('emojis').reduce((obj, emoji) => { @@ -65,12 +67,12 @@ class CompareHistoryModal extends React.PureComponent { <div className='status__content'> {currentVersion.get('spoiler_text').length > 0 && ( <React.Fragment> - <div className='translate' dangerouslySetInnerHTML={spoilerContent} /> + <div className='translate' dangerouslySetInnerHTML={spoilerContent} lang={language} /> <hr /> </React.Fragment> )} - <div className='status__content__text status__content__text--visible translate' dangerouslySetInnerHTML={content} /> + <div className='status__content__text status__content__text--visible translate' dangerouslySetInnerHTML={content} lang={language} /> {!!currentVersion.get('poll') && ( <div className='poll'> @@ -82,6 +84,7 @@ class CompareHistoryModal extends React.PureComponent { <span className='poll__option__text translate' dangerouslySetInnerHTML={{ __html: emojify(escapeTextContentForBrowser(option.get('title')), emojiMap) }} + lang={language} /> </li> ))} @@ -89,7 +92,7 @@ class CompareHistoryModal extends React.PureComponent { </div> )} - <MediaAttachments status={currentVersion} /> + <MediaAttachments status={currentVersion} lang={language} /> </div> </div> </div> diff --git a/app/javascript/mastodon/features/ui/components/image_loader.jsx b/app/javascript/mastodon/features/ui/components/image_loader.jsx index 92aeef5c4..9093eab28 100644 --- a/app/javascript/mastodon/features/ui/components/image_loader.jsx +++ b/app/javascript/mastodon/features/ui/components/image_loader.jsx @@ -8,6 +8,7 @@ export default class ImageLoader extends PureComponent { static propTypes = { alt: PropTypes.string, + lang: PropTypes.string, src: PropTypes.string.isRequired, previewSrc: PropTypes.string, width: PropTypes.number, @@ -18,6 +19,7 @@ export default class ImageLoader extends PureComponent { static defaultProps = { alt: '', + lang: '', width: null, height: null, }; @@ -129,7 +131,7 @@ export default class ImageLoader extends PureComponent { }; render () { - const { alt, src, width, height, onClick } = this.props; + const { alt, lang, src, width, height, onClick } = this.props; const { loading } = this.state; const className = classNames('image-loader', { @@ -154,6 +156,7 @@ export default class ImageLoader extends PureComponent { ) : ( <ZoomableImage alt={alt} + lang={lang} src={src} onClick={onClick} width={width} diff --git a/app/javascript/mastodon/features/ui/components/media_modal.jsx b/app/javascript/mastodon/features/ui/components/media_modal.jsx index 1cda8de04..086da8cf5 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/media_modal.jsx @@ -3,6 +3,7 @@ import ReactSwipeableViews from 'react-swipeable-views'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Video from 'mastodon/features/video'; +import { connect } from 'react-redux'; import classNames from 'classnames'; import { defineMessages, injectIntl } from 'react-intl'; import IconButton from 'mastodon/components/icon_button'; @@ -20,7 +21,12 @@ const messages = defineMessages({ next: { id: 'lightbox.next', defaultMessage: 'Next' }, }); -export default @injectIntl +const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), +}); + +export default @connect(mapStateToProps, null, null, { forwardRef: true }) +@injectIntl class MediaModal extends ImmutablePureComponent { static propTypes = { @@ -129,7 +135,7 @@ class MediaModal extends ImmutablePureComponent { }; render () { - const { media, statusId, intl, onClose } = this.props; + const { media, language, statusId, intl, onClose } = this.props; const { navigationHidden } = this.state; const index = this.getIndex(); @@ -149,6 +155,7 @@ class MediaModal extends ImmutablePureComponent { width={width} height={height} alt={image.get('description')} + lang={language} key={image.get('url')} onClick={this.toggleNavigation} zoomButtonHidden={this.state.zoomButtonHidden} @@ -171,6 +178,7 @@ class MediaModal extends ImmutablePureComponent { onCloseVideo={onClose} detailed alt={image.get('description')} + lang={language} key={image.get('url')} /> ); @@ -182,6 +190,7 @@ class MediaModal extends ImmutablePureComponent { height={height} key={image.get('preview_url')} alt={image.get('description')} + lang={language} onClick={this.toggleNavigation} /> ); diff --git a/app/javascript/mastodon/features/ui/components/video_modal.jsx b/app/javascript/mastodon/features/ui/components/video_modal.jsx index abaccbe98..1737d52db 100644 --- a/app/javascript/mastodon/features/ui/components/video_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/video_modal.jsx @@ -2,15 +2,22 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Video from 'mastodon/features/video'; +import { connect } from 'react-redux'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Footer from 'mastodon/features/picture_in_picture/components/footer'; import { getAverageFromBlurhash } from 'mastodon/blurhash'; -export default class VideoModal extends ImmutablePureComponent { +const mapStateToProps = (state, { statusId }) => ({ + language: state.getIn(['statuses', statusId, 'language']), +}); + +export default @connect(mapStateToProps, null, null, { forwardRef: true }) +class VideoModal extends ImmutablePureComponent { static propTypes = { media: ImmutablePropTypes.map.isRequired, statusId: PropTypes.string, + language: PropTypes.string, options: PropTypes.shape({ startTime: PropTypes.number, autoPlay: PropTypes.bool, @@ -31,7 +38,7 @@ export default class VideoModal extends ImmutablePureComponent { } render () { - const { media, statusId, onClose } = this.props; + const { media, statusId, language, onClose } = this.props; const options = this.props.options || {}; return ( @@ -49,6 +56,7 @@ export default class VideoModal extends ImmutablePureComponent { autoFocus detailed alt={media.get('description')} + lang={language} /> </div> diff --git a/app/javascript/mastodon/features/ui/components/zoomable_image.jsx b/app/javascript/mastodon/features/ui/components/zoomable_image.jsx index 3b2bb0286..7faba4c10 100644 --- a/app/javascript/mastodon/features/ui/components/zoomable_image.jsx +++ b/app/javascript/mastodon/features/ui/components/zoomable_image.jsx @@ -96,6 +96,7 @@ class ZoomableImage extends React.PureComponent { static propTypes = { alt: PropTypes.string, + lang: PropTypes.string, src: PropTypes.string.isRequired, width: PropTypes.number, height: PropTypes.number, @@ -106,6 +107,7 @@ class ZoomableImage extends React.PureComponent { static defaultProps = { alt: '', + lang: '', width: null, height: null, }; @@ -403,7 +405,7 @@ class ZoomableImage extends React.PureComponent { }; render () { - const { alt, src, width, height, intl } = this.props; + const { alt, lang, src, width, height, intl } = this.props; const { scale, lockTranslate } = this.state; const overflow = scale === MIN_SCALE ? 'hidden' : 'scroll'; const zoomButtonShouldHide = this.state.navigationHidden || this.props.zoomButtonHidden || this.state.zoomMatrix.rate <= MIN_SCALE ? 'media-modal__zoom-button--hidden' : ''; @@ -431,6 +433,7 @@ class ZoomableImage extends React.PureComponent { ref={this.setImageRef} alt={alt} title={alt} + lang={lang} src={src} width={width} height={height} diff --git a/app/javascript/mastodon/features/video/index.jsx b/app/javascript/mastodon/features/video/index.jsx index 8d63394aa..dc722a7a7 100644 --- a/app/javascript/mastodon/features/video/index.jsx +++ b/app/javascript/mastodon/features/video/index.jsx @@ -102,6 +102,7 @@ class Video extends React.PureComponent { frameRate: PropTypes.string, src: PropTypes.string.isRequired, alt: PropTypes.string, + lang: PropTypes.string, width: PropTypes.number, height: PropTypes.number, sensitive: PropTypes.bool, @@ -524,7 +525,7 @@ class Video extends React.PureComponent { } render () { - const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive, editable, blurhash, autoFocus } = this.props; + const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, lang, detailed, sensitive, editable, blurhash, autoFocus } = this.props; const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; const progress = Math.min((currentTime / duration) * 100, 100); const playerStyle = {}; @@ -585,6 +586,7 @@ class Video extends React.PureComponent { tabIndex='0' aria-label={alt} title={alt} + lang={lang} width={width} height={height} volume={volume} diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 3e685efec..cf5dfb55b 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -138,7 +138,7 @@ "compose_form.poll.remove_option": "إزالة هذا الخيار", "compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة", "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط", - "compose_form.publish": "انشر", + "compose_form.publish": "نشر", "compose_form.publish_form": "انشر", "compose_form.publish_loud": "{publish}!", "compose_form.save_changes": "احفظ التعديلات", @@ -176,7 +176,7 @@ "conversation.delete": "احذف المحادثة", "conversation.mark_as_read": "اعتبرها كمقروءة", "conversation.open": "اعرض المحادثة", - "conversation.with": "بـ {names}", + "conversation.with": "مع {names}", "copypaste.copied": "تم نسخه", "copypaste.copy": "انسخ", "directory.federated": "مِن الفديفرس المعروف", @@ -215,7 +215,7 @@ "empty_column.bookmarked_statuses": "ليس لديك أية منشورات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.", "empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!", "empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.", - "empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.", + "empty_column.domain_blocks": "ليس هناك نطاقات تم حجبها بعد.", "empty_column.explore_statuses": "ليس هناك ما هو متداوَل الآن. عد في وقت لاحق!", "empty_column.favourited_statuses": "ليس لديك أية منشورات مفضلة بعد. عندما ستقوم بالإعجاب بواحدة، ستظهر هنا.", "empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.", @@ -245,7 +245,7 @@ "filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.", "filter_modal.added.context_mismatch_title": "عدم تطابق السياق!", "filter_modal.added.expired_explanation": "انتهت صلاحية فئة عامل التصفية هذه، سوف تحتاج إلى تغيير تاريخ انتهاء الصلاحية لتطبيقها.", - "filter_modal.added.expired_title": "تصفية منتهية الصلاحية!", + "filter_modal.added.expired_title": "عامل تصفية انتهت صلاحيته!", "filter_modal.added.review_and_configure": "لمراجعة وزيادة تكوين فئة عوامل التصفية هذه، انتقل إلى {settings_link}.", "filter_modal.added.review_and_configure_title": "إعدادات التصفية", "filter_modal.added.settings_link": "صفحة الإعدادات", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 54bab60d0..018d950d7 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -383,7 +383,7 @@ "navigation_bar.filters": "Pallabres desactivaes", "navigation_bar.follow_requests": "Solicitúes de siguimientu", "navigation_bar.followed_tags": "Followed hashtags", - "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.follows_and_followers": "Perfiles que sigues ya te siguen", "navigation_bar.lists": "Llistes", "navigation_bar.logout": "Zarrar la sesión", "navigation_bar.mutes": "Perfiles colos avisos desactivaos", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 7736877d9..b3cdd4fda 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -16,7 +16,7 @@ "account.badges.bot": "Bot", "account.badges.group": "Gruppe", "account.block": "@{name} blockieren", - "account.block_domain": "Alles von {domain} verstecken", + "account.block_domain": "{domain} sperren", "account.blocked": "Blockiert", "account.browse_more_on_origin_server": "Mehr auf dem Originalprofil durchsuchen", "account.cancel_follow_request": "Folgeanfrage zurückziehen", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index c1994b5f9..f48187e5d 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -32,9 +32,9 @@ "account.follow": "Seguir", "account.followers": "Seguidores", "account.followers.empty": "Todavía nadie sigue a este usuario.", - "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}", + "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", "account.following": "Siguiendo", - "account.following_counter": "{count, plural, other {{counter} Siguiendo}}", + "account.following_counter": "{count, plural, other {Siguiendo a {counter}}}", "account.follows.empty": "Todavía este usuario no sigue a nadie.", "account.follows_you": "Te sigue", "account.go_to_profile": "Ir al perfil", @@ -57,7 +57,7 @@ "account.requested_follow": "{name} solicitó seguirte", "account.share": "Compartir el perfil de @{name}", "account.show_reblogs": "Mostrar adhesiones de @{name}", - "account.statuses_counter": "{count, plural, one {{counter} Mensaje} other {{counter} Mensajes}}", + "account.statuses_counter": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}", "account.unblock": "Desbloquear a @{name}", "account.unblock_domain": "Desbloquear dominio {domain}", "account.unblock_short": "Desbloquear", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 61800fd6b..47c6edd82 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -51,7 +51,7 @@ "account.muted": "Silenciado", "account.open_original_page": "Abrir página original", "account.posts": "Publicaciones", - "account.posts_with_replies": "Publicaciones y respuestas", + "account.posts_with_replies": "Pub. y respuestas", "account.report": "Reportar a @{name}", "account.requested": "Esperando aprobación. Clica para cancelar la solicitud de seguimiento", "account.requested_follow": "{name} ha solicitado seguirte", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index a1decf1ed..f41082ed7 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -29,7 +29,7 @@ "account.featured_tags.last_status_at": "Viimeisin viesti {date}", "account.featured_tags.last_status_never": "Ei viestejä", "account.featured_tags.title": "Käyttäjän {name} esillä olevat aihetunnisteet", - "account.follow": "Seuratut", + "account.follow": "Seuraa", "account.followers": "Seuraajat", "account.followers.empty": "Kukaan ei seuraa tätä käyttäjää vielä.", "account.followers_counter": "{count, plural, one {{counter} seuraaja} other {{counter} seuraajaa}}", @@ -582,7 +582,7 @@ "status.reblogs.empty": "Kukaan ei ole vielä tehostanut tätä viestiä. Kun joku tekee niin, näkyy kyseinen henkilö tässä.", "status.redraft": "Poista ja palauta muokattavaksi", "status.remove_bookmark": "Poista kirjanmerkki", - "status.replied_to": "Vastasit käyttäjälle {name}", + "status.replied_to": "Vastaus käyttäjälle {name}", "status.reply": "Vastaa", "status.replyAll": "Vastaa ketjuun", "status.report": "Raportoi @{name}", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 3ac57d50d..24745cca5 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -54,7 +54,7 @@ "account.posts_with_replies": "टूट्स एवं जवाब", "account.report": "रिपोर्ट @{name}", "account.requested": "मंजूरी का इंतजार। फॉलो रिक्वेस्ट को रद्द करने के लिए क्लिक करें", - "account.requested_follow": "{name} has requested to follow you", + "account.requested_follow": "{name} ने आपको फॉलो करने के लिए अनुरोध किया है", "account.share": "@{name} की प्रोफाइल शेयर करे", "account.show_reblogs": "@{name} के बूस्ट दिखाए", "account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}", @@ -128,7 +128,7 @@ "compose.language.search": "भाषाएँ खोजें...", "compose_form.direct_message_warning_learn_more": "और जानें", "compose_form.encryption_warning": "मास्टोडॉन पर पोस्ट एन्ड-टू-एन्ड एन्क्रिप्टेड नहीं है। कोई भी व्यक्तिगत जानकारी मास्टोडॉन पर मत भेजें।", - "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", + "compose_form.hashtag_warning": "ये पोस्ट किसी भी हैशटैग में लिस्ट नहीं किया जाएगा क्योंकि ये पब्लिक नहीं है। सिर्फ पब्लिक पोस्ट ही हैशटैग से खोजे जा सकते हैं।", "compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।", "compose_form.lock_disclaimer.lock": "लॉक्ड", "compose_form.placeholder": "What is on your mind?", @@ -221,7 +221,7 @@ "empty_column.favourites": "अभी तक किसी ने भी इस टूट को पसंद (स्टार) नहीं किया है. जब भी कोई इसे पसंद करेगा, उनका नाम यहाँ दिखेगा।", "empty_column.follow_recommendations": "ऐसा लगता है कि आपके लिए कोई सुझाव जेनरेट नहीं किया जा सका. आप उन लोगों को खोजने के लिए सर्च का उपयोग करने का प्रयास कर सकते हैं जिन्हें आप जानते हैं या ट्रेंडिंग हैशटैग का पता लगा सकते हैं।", "empty_column.follow_requests": "अभी तक किसी ने भी आपका अनुसरण करने की विनती नहीं की है. जब भी कोई आपको विनती भेजेगा, वो यहाँ दिखेगी.", - "empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.", + "empty_column.followed_tags": "आपने किसी हैशटैग को फॉलो नहीं किया है। जैसे ही आप फॉलो करेंगे, आपके फॉलो किए गए हैशटैग यहां दिखेंगे।", "empty_column.hashtag": "यह हैशटैग अभी तक खाली है।", "empty_column.home": "आपकी मुख्य कालक्रम अभी खली है. अन्य उपयोगकर्ताओं से मिलने के लिए और अपनी गतिविधियां शुरू करने के लिए या तो {public} पर जाएं या खोज का उपयोग करें।", "empty_column.home.suggestions": "कुछ सुझाव देखिए", @@ -240,8 +240,8 @@ "explore.suggested_follows": "आपके लिए", "explore.title": "एक्स्प्लोर", "explore.trending_links": "समाचार", - "explore.trending_statuses": "Posts", - "explore.trending_tags": "Hashtags", + "explore.trending_statuses": "पोस्ट्स", + "explore.trending_tags": "हैशटैग्स", "filter_modal.added.context_mismatch_explanation": "यह फ़िल्टर श्रेणी उस संदर्भ पर लागू नहीं होती जिसमें आपने इस पोस्ट को एक्सेस किया है। यदि आप चाहते हैं कि इस संदर्भ में भी पोस्ट को फ़िल्टर किया जाए, तो आपको फ़िल्टर को एडिट करना होगा।", "filter_modal.added.context_mismatch_title": "कंटेंट मिसमैच!", "filter_modal.added.expired_explanation": "यह फ़िल्टर श्रेणी समाप्त हो गई है, इसे लागू करने के लिए आपको समाप्ति तिथि बदलनी होगी।", @@ -264,7 +264,7 @@ "follow_request.authorize": "अधिकार दें", "follow_request.reject": "अस्वीकार करें", "follow_requests.unlocked_explanation": "हालाँकि आपका खाता लॉक नहीं है, फिर भी {domain} डोमेन स्टाफ ने सोचा कि आप इन खातों के मैन्युअल अनुरोधों की समीक्षा करना चाहते हैं।", - "followed_tags": "Followed hashtags", + "followed_tags": "फॉलो किए गए हैशटैग्स", "footer.about": "अबाउट", "footer.directory": "प्रोफाइल्स डायरेक्टरी", "footer.get_app": "अप्प प्राप्त करें", @@ -272,7 +272,7 @@ "footer.keyboard_shortcuts": "कीबोर्ड शॉर्टकट", "footer.privacy_policy": "प्राइवेसी पालिसी", "footer.source_code": "सोर्स कोड देखें", - "footer.status": "Status", + "footer.status": "स्टेटस", "generic.saved": "सेव्ड", "getting_started.heading": "पहले कदम रखें", "hashtag.column_header.tag_mode.all": "और {additional}", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 56ef257c9..0d5b08b68 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -312,7 +312,7 @@ "keyboard_shortcuts.column": "Setja virkni í dálk", "keyboard_shortcuts.compose": "Setja virkni á textainnsetningarreit", "keyboard_shortcuts.description": "Lýsing", - "keyboard_shortcuts.direct": "að opna dálk með beinum skilaboðum", + "keyboard_shortcuts.direct": "Opna dálk með beinum skilaboðum", "keyboard_shortcuts.down": "Fara neðar í listanum", "keyboard_shortcuts.enter": "Opna færslu", "keyboard_shortcuts.favourite": "Eftirlætisfærsla", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index e7b480814..7914b54ab 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -474,7 +474,7 @@ "relative_time.full.seconds": "{number, plural, one {# secondo} other {# secondi}} fa", "relative_time.hours": "{number}h", "relative_time.just_now": "ora", - "relative_time.minutes": "{number} minuti", + "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "oggi", "reply_indicator.cancel": "Annulla", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 3d6021b6e..c3eb3d37c 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -10,7 +10,7 @@ "about.domain_blocks.suspended.title": "Suspended", "about.not_available": "This information has not been made available on this server.", "about.powered_by": "Decentralized social media powered by {mastodon}", - "about.rules": "Server rules", + "about.rules": "Ilugan n uqeddac", "account.account_note_header": "Tazmilt", "account.add_or_remove_from_list": "Rnu neɣ kkes seg tebdarin", "account.badges.bot": "Aṛubut", @@ -83,7 +83,7 @@ "boost_modal.combo": "Tzemreḍ ad tetekkiḍ ɣef {combo} akken ad tessurfeḍ aya tikelt-nniḍen", "bundle_column_error.copy_stacktrace": "Nɣel tuccḍa n uneqqis", "bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.", - "bundle_column_error.error.title": "Oh, no!", + "bundle_column_error.error.title": "Uh, ala !", "bundle_column_error.network.body": "There was an error when trying to load this page. This could be due to a temporary problem with your internet connection or this server.", "bundle_column_error.network.title": "Tuccḍa deg uẓeṭṭa", "bundle_column_error.retry": "Ɛreḍ tikelt-nniḍen", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index cf428b3d8..e5a73258d 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -145,7 +145,7 @@ "compose_form.sensitive.hide": "미디어를 민감함으로 설정하기", "compose_form.sensitive.marked": "미디어가 열람주의로 설정되어 있습니다", "compose_form.sensitive.unmarked": "미디어가 열람주의로 설정 되어 있지 않습니다", - "compose_form.spoiler.marked": "콘텐츠 경고 제거", + "compose_form.spoiler.marked": "열람주의 제거", "compose_form.spoiler.unmarked": "열람 주의 문구 추가", "compose_form.spoiler_placeholder": "경고 문구를 여기에 작성하세요", "confirmation_modal.cancel": "취소", @@ -224,7 +224,7 @@ "empty_column.followed_tags": "아직 아무 해시태그도 팔로우하고 있지 않습니다. 해시태그를 팔로우하면, 여기에 표시됩니다.", "empty_column.hashtag": "이 해시태그는 아직 사용되지 않았습니다.", "empty_column.home": "당신의 홈 타임라인은 비어있습니다! 더 많은 사람들을 팔로우 하여 채워보세요. {suggestions}", - "empty_column.home.suggestions": "몇몇의 제안 보기", + "empty_column.home.suggestions": "몇몇 제안 보기", "empty_column.list": "리스트에 아직 아무것도 없습니다. 리스트의 누군가가 게시물을 올리면 여기에 나타납니다.", "empty_column.lists": "아직 리스트가 없습니다. 리스트를 만들면 여기에 나타납니다.", "empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.", @@ -259,7 +259,7 @@ "filter_modal.select_filter.title": "이 게시물을 필터", "filter_modal.title.status": "게시물 필터", "follow_recommendations.done": "완료", - "follow_recommendations.heading": "게시물을 받아 볼 사람들을 팔로우 하세요! 여기 몇몇의 추천이 있습니다.", + "follow_recommendations.heading": "게시물을 받아 볼 사람을 팔로우하세요! 여기 몇몇 추천이 있습니다.", "follow_recommendations.lead": "당신이 팔로우 하는 사람들의 게시물이 시간순으로 정렬되어 당신의 홈 피드에 표시될 것입니다. 실수를 두려워 하지 마세요, 언제든지 쉽게 팔로우 취소를 할 수 있습니다!", "follow_request.authorize": "허가", "follow_request.reject": "거부", @@ -400,7 +400,7 @@ "notification.follow": "{name} 님이 나를 팔로우했습니다", "notification.follow_request": "{name} 님이 팔로우 요청을 보냈습니다", "notification.mention": "{name}님의 멘션", - "notification.own_poll": "내 투표가 끝났습니다", + "notification.own_poll": "투표를 마쳤습니다.", "notification.poll": "참여했던 투표가 끝났습니다.", "notification.reblog": "{name} 님이 부스트했습니다", "notification.status": "{name} 님이 방금 게시물을 올렸습니다", @@ -589,13 +589,13 @@ "status.sensitive_warning": "민감한 내용", "status.share": "공유", "status.show_filter_reason": "그냥 표시하기", - "status.show_less": "적게 보기", + "status.show_less": "접기", "status.show_less_all": "모두 접기", - "status.show_more": "더 보기", + "status.show_more": "펼치기", "status.show_more_all": "모두 펼치기", "status.show_original": "원본 보기", "status.translate": "번역", - "status.translated_from_with": "{lang}에서 {provider}를 사용해 번역됨", + "status.translated_from_with": "{provider}에 의해 {lang}에서 번역됨", "status.uncached_media_warning": "사용할 수 없음", "status.unmute_conversation": "이 대화의 뮤트 해제하기", "status.unpin": "고정 해제", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index c7a27873d..a2dac91ca 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -1,7 +1,7 @@ { "about.blocks": "Moderatorių prižiūrimi serveriai", "about.contact": "Kontaktai:", - "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.", + "about.disclaimer": "Mastodon, tai nemokama, atviro kodo programa, kuriuos prekybinis ženklas priklauso Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Priežastis nežinoma", "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.", "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 3f971026e..a003f42f4 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -128,7 +128,7 @@ "compose.language.search": "Cari bahasa...", "compose_form.direct_message_warning_learn_more": "Ketahui lebih lanjut", "compose_form.encryption_warning": "Hantaran pada Mastodon tidak disulitkan hujung ke hujung. Jangan berkongsi sebarang maklumat sensitif melalui Mastodon.", - "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", + "compose_form.hashtag_warning": "Hantaran ini tidak akan disenaraikan di bawah mana-mana tanda pagar kerana ia tidak tersenarai. Hanya hantaran awam sahaja boleh dicari menggunakan tanda pagar.", "compose_form.lock_disclaimer": "Akaun anda tidak {locked}. Sesiapa pun boleh mengikuti anda untuk melihat hantaran pengikut-sahaja anda.", "compose_form.lock_disclaimer.lock": "dikunci", "compose_form.placeholder": "Apakah yang sedang anda fikirkan?", @@ -237,11 +237,11 @@ "errors.unexpected_crash.copy_stacktrace": "Salin surih tindanan ke papan keratan", "errors.unexpected_crash.report_issue": "Laporkan masalah", "explore.search_results": "Hasil carian", - "explore.suggested_follows": "For you", + "explore.suggested_follows": "Untuk anda", "explore.title": "Terokai", - "explore.trending_links": "News", - "explore.trending_statuses": "Posts", - "explore.trending_tags": "Hashtags", + "explore.trending_links": "Baru", + "explore.trending_statuses": "Hantar", + "explore.trending_tags": "-Hashtags", "filter_modal.added.context_mismatch_explanation": "Kumpulan penapis ini tidak terpakai pada konteks di mana anda mengakses hantaran ini. Jika anda ingin hantaran ini untuk ditapis dalam konteks ini juga, anda perlu menyunting penapis tersebut.", "filter_modal.added.context_mismatch_title": "Konteks tidak sepadan!", "filter_modal.added.expired_explanation": "Kumpulan filter ini telah tamat tempoh, anda perlu mengubah tarikh luput untuk melaksanakannya.", @@ -264,7 +264,7 @@ "follow_request.authorize": "Benarkan", "follow_request.reject": "Tolak", "follow_requests.unlocked_explanation": "Walaupun akaun anda tidak dikunci, kakitangan {domain} merasakan anda mungkin ingin menyemak permintaan ikutan daripada akaun ini secara manual.", - "followed_tags": "Followed hashtags", + "followed_tags": "Topik terpilih", "footer.about": "Perihal", "footer.directory": "Direktori profil", "footer.get_app": "Dapatkan app", @@ -272,7 +272,7 @@ "footer.keyboard_shortcuts": "Pintasan papan kekunci", "footer.privacy_policy": "Dasar privasi", "footer.source_code": "Lihat kod sumber", - "footer.status": "Status", + "footer.status": "Status:", "generic.saved": "Disimpan", "getting_started.heading": "Mari bermula", "hashtag.column_header.tag_mode.all": "dan {additional}", @@ -382,7 +382,7 @@ "navigation_bar.favourites": "Kegemaran", "navigation_bar.filters": "Perkataan yang dibisukan", "navigation_bar.follow_requests": "Permintaan ikutan", - "navigation_bar.followed_tags": "Followed hashtags", + "navigation_bar.followed_tags": "Ikuti hashtag", "navigation_bar.follows_and_followers": "Ikutan dan pengikut", "navigation_bar.lists": "Senarai", "navigation_bar.logout": "Log keluar", @@ -544,9 +544,9 @@ "server_banner.server_stats": "Statistik pelayan:", "sign_in_banner.create_account": "Cipta akaun", "sign_in_banner.sign_in": "Daftar masuk", - "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.", + "sign_in_banner.text": "Daftar masuk untuk mengikut profil atau tanda pagar, menggemari, mengkongsi dan membalas kepada hantaran, atau berinteraksi daripada akaun anda pada pelayan lain.", "status.admin_account": "Buka antara muka penyederhanaan untuk @{name}", - "status.admin_domain": "Open moderation interface for {domain}", + "status.admin_domain": "antara muka penyederhanaan", "status.admin_status": "Buka hantaran ini dalam antara muka penyederhanaan", "status.block": "Sekat @{name}", "status.bookmark": "Tanda buku", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index 366544d2a..3c1cec63f 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -102,7 +102,7 @@ "column.blocks": "ဘလော့ထားသောအကောင့်များ", "column.bookmarks": "မှတ်တမ်းများ", "column.community": "ဒေသတွင်း အချိန်ဇယား", - "column.direct": "တိုက်ရိုက် မက်ဆေ့ခ်ျများ", + "column.direct": "တိုက်ရိုက်မက်ဆေ့ခ်ျများ", "column.directory": "ပရိုဖိုင်များကို ရှာဖွေမည်\n", "column.domain_blocks": " ဒိုမိန်းကိုပိတ်မည်", "column.favourites": "အကြိုက်ဆုံးများ", @@ -121,7 +121,7 @@ "column_header.show_settings": "ဆက်တင်များကို ပြပါ။", "column_header.unpin": "မတွဲတော့ပါ", "column_subheading.settings": "ဆက်တင်များ", - "community.column_settings.local_only": "Local only", + "community.column_settings.local_only": "ပြည်တွင်း၌သာ", "community.column_settings.media_only": "Media only", "community.column_settings.remote_only": "Remote only", "compose.language.change": "ဘာသာစကား ပြောင်းမည်", @@ -195,32 +195,32 @@ "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", "emoji_button.clear": "ရှင်းလင်းမည်", - "emoji_button.custom": "Custom", + "emoji_button.custom": "စိတ်ကြိုက်", "emoji_button.flags": "Flags", "emoji_button.food": "အစားအသောက်", - "emoji_button.label": "Insert emoji", + "emoji_button.label": "အီမိုဂျီထည့်ပါ", "emoji_button.nature": "သဘာဝ", - "emoji_button.not_found": "No matching emojis found", + "emoji_button.not_found": "ကိုက်ညီသော အီမိုဂျီများ ရှာမတွေ့ပါ", "emoji_button.objects": "Objects", "emoji_button.people": "လူများ", "emoji_button.recent": "မကြာခဏ အသုံးပြုသော", "emoji_button.search": "ရှာရန်...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.account_suspended": "Account suspended", + "emoji_button.search_results": "ရှာဖွေမှု ရလဒ်များ", + "emoji_button.symbols": "သင်္ကေတများ", + "emoji_button.travel": "ခရီးသွားခြင်း နှင့် နေရာများ", + "empty_column.account_suspended": "အကောင့်ရပ်ဆိုင်းထားသည်", "empty_column.account_timeline": "No posts found", - "empty_column.account_unavailable": "Profile unavailable", + "empty_column.account_unavailable": "ပရိုဖိုင် မရနိုင်ပါ", "empty_column.blocks": "ပိတ်ထားသောအကောင့်များမရှိသေးပါ", - "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", + "empty_column.bookmarked_statuses": "သင့်တွင် မှတ်သားထားသော ပို့စ်များ မရှိသေးပါ။ တစ်ခုကို အမှတ်အသားပြုလိုက်ပါက ၎င်းကို ဤနေရာတွင် ပြထားပါမည်။", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.direct": "သင့်တွင် တိုက်ရိုက်မက်ဆေ့ချ်များ မရှိသေးပါ။ ပေးပို့ထားပါက သို့မဟုတ် လက်ခံထားပါက ၎င်းတို့ကို ဤနေရာတွင် ပြထားပါမည်။", "empty_column.domain_blocks": "သင်ပိတ်ထားသော ဒိုမိန်းမရှိသေးပါ", - "empty_column.explore_statuses": "Nothing is trending right now. Check back later!", - "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.", + "empty_column.explore_statuses": "အခုလောလောဆယ်တွင် ရေပန်းစားနေသောပို့စ်များ မရှိသေးပါ။ နောက်မှ ပြန်စစ်ဆေးပါရန်။", + "empty_column.favourited_statuses": "သင့်တွင် အကြိုက်ဆုံးပို့စ်များ မရှိသေးပါ။ တစ်ခုကို သင်နှစ်သက်ထားပါက ၎င်းကို ဤနေရာတွင် ပြထားပါမည်။", + "empty_column.favourites": "ဤပို့စ်ကို အကြိုက်တွေ့သူ မရှိသေးပါ။ တစ်စုံတစ်ယောက်က ကြိုက်နှစ်သက်ပါက ဤနေရာတွင် ပြထားပါမည်။", "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.follow_requests": "သင့်တွင် စောင့်ကြည့်ရန် တောင်းဆိုမှုများ မရှိသေးပါ။ သင်လက်ခံရရှိပါက ၎င်းကို ဤနေရာတွင် ပြထားပါမည်။", "empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.", "empty_column.hashtag": "There is nothing in this hashtag yet.", "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", @@ -231,12 +231,12 @@ "empty_column.notifications": "သတိပေးချက်မရှိသေးပါ။ သတိပေးချက်အသစ်ရှိလျှင် ဤနေရာတွင်ကြည့်ရှုနိုင်သည်", "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", - "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", - "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", + "error.unexpected_crash.explanation_addons": "ဤစာမျက်နှာကို မှန်ကန်စွာ မပြသနိုင်ခဲ့ပါ။ ဤအမှားသည် Browser add-on ထည့်သွင်းထားမှုများ သို့မဟုတ် အလိုအလျောက် ဘာသာပြန်ကိရိယာများကြောင့် ဖြစ်နိုင်သည်။", + "error.unexpected_crash.next_steps": "စာမျက်နှာကို ပြန်လည်စတင်ကြည့်ပါ။ ၎င်းမှာ အကူအညီမဖြစ်ပါက သင်သည် အခြား Browser သို့မဟုတ် မူရင်းအက်ပ်မှတစ်ဆင့် Mastodon ကို ဆက်လက်အသုံးပြုနိုင်ပါမည်။", "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard", - "errors.unexpected_crash.report_issue": "Report issue", - "explore.search_results": "Search results", + "errors.unexpected_crash.report_issue": "အဆင်မပြေမှုကို တိုင်ကြားရန်", + "explore.search_results": "ရှာဖွေမှုရလဒ်များ", "explore.suggested_follows": "သင့်အတွက်", "explore.title": "စူးစမ်းရန်", "explore.trending_links": "သတင်းများ", @@ -247,50 +247,50 @@ "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", "filter_modal.added.expired_title": "Expired filter!", "filter_modal.added.review_and_configure": "To review and further configure this filter category, go to the {settings_link}.", - "filter_modal.added.review_and_configure_title": "Filter settings", + "filter_modal.added.review_and_configure_title": "စစ်ထုတ်မှု သတ်မှတ်ချက်များ", "filter_modal.added.settings_link": "settings page", - "filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.", - "filter_modal.added.title": "Filter added!", + "filter_modal.added.short_explanation": "ဤပို့စ်ကို အောက်ပါ စစ်ထုတ်မှုအမျိုးအစားတွင် ပေါင်းထည့်ထားပါသည် - {title}။", + "filter_modal.added.title": "စစ်ထုတ်မှု ထည့်သွင်းပြီးပါပြီ။", "filter_modal.select_filter.context_mismatch": "does not apply to this context", "filter_modal.select_filter.expired": "သက်တမ်းကုန်သွားပါပြီ", - "filter_modal.select_filter.prompt_new": "New category: {name}", - "filter_modal.select_filter.search": "Search or create", - "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", - "filter_modal.select_filter.title": "Filter this post", - "filter_modal.title.status": "Filter a post", - "follow_recommendations.done": "Done", - "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.", + "filter_modal.select_filter.prompt_new": "အမျိုးအစားအသစ် - {name}", + "filter_modal.select_filter.search": "ရှာရန် သို့မဟုတ် ဖန်တီးရန်", + "filter_modal.select_filter.subtitle": "ရှိပြီးသားအမျိုးအစားကို သုံးပါ သို့မဟုတ် အသစ်တစ်ခု ဖန်တီးပါ", + "filter_modal.select_filter.title": "ဤပို့စ်ကို စစ်ထုတ်ပါ", + "filter_modal.title.status": "ပို့စ်တစ်ခု စစ်ထုတ်ပါ", + "follow_recommendations.done": "ပြီးပါပြီ", + "follow_recommendations.heading": "သင်မြင်လိုသော သူများထံမှ ပို့စ်များကို စောင့်ကြည့်ပါ။ ဤတွင် အကြံပြုချက်အချို့ရှိပါသည်။", "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!", "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", + "follow_request.reject": "ဖယ်ရှားပါ", "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", "followed_tags": "Followed hashtags", "footer.about": "အကြောင်း", - "footer.directory": "Profiles directory", - "footer.get_app": "Get the app", - "footer.invite": "Invite people", - "footer.keyboard_shortcuts": "Keyboard shortcuts", - "footer.privacy_policy": "Privacy policy", + "footer.directory": "ပရိုဖိုင်များလမ်းညွှန်", + "footer.get_app": "အက်ပ်ကို ရယူပါ", + "footer.invite": "လူများကို ဖိတ်ပါ", + "footer.keyboard_shortcuts": "ကီးဘုတ်အမြန်ခလုတ်များ", + "footer.privacy_policy": "ကိုယ်ရေးအချက်အလက်မူဝါဒ", "footer.source_code": "မူရင်းကုဒ်အားကြည့်ရှုမည်", "footer.status": "အခြေအနေ", "generic.saved": "သိမ်းဆည်းထားပြီး", "getting_started.heading": "စတင်မည်", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_header.tag_mode.all": "နှင့် {additional}", + "hashtag.column_header.tag_mode.any": "သို့မဟုတ် {additional}", + "hashtag.column_header.tag_mode.none": "မပါဘဲ {additional}", + "hashtag.column_settings.select.no_options_message": "အကြံပြုချက်မတွေ့ပါ", "hashtag.column_settings.select.placeholder": "Enter hashtags…", "hashtag.column_settings.tag_mode.all": "All of these", "hashtag.column_settings.tag_mode.any": "Any of these", "hashtag.column_settings.tag_mode.none": "None of these", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", - "hashtag.follow": "Follow hashtag", - "hashtag.unfollow": "Unfollow hashtag", - "home.column_settings.basic": "Basic", + "hashtag.follow": "Hashtag ကို စောင့်ကြည့်မယ်", + "hashtag.unfollow": "Hashtag ကို မစောင့်ကြည့်ပါ", + "home.column_settings.basic": "အခြေခံ", "home.column_settings.show_reblogs": "Show boosts", - "home.column_settings.show_replies": "Show replies", - "home.hide_announcements": "Hide announcements", - "home.show_announcements": "Show announcements", + "home.column_settings.show_replies": "ပြန်စာများကို ပြပါ", + "home.hide_announcements": "ကြေညာချက်များကို ဖျောက်ပါ", + "home.show_announcements": "ကြေညာချက်များကို ပြပါ", "interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.", "interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.", "interaction_modal.description.reblog": "With an account on Mastodon, you can boost this post to share it with your own followers.", @@ -299,10 +299,10 @@ "interaction_modal.on_this_server": "ဤဆာဗာတွင်", "interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.", "interaction_modal.preamble": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.", - "interaction_modal.title.favourite": "Favourite {name}'s post", - "interaction_modal.title.follow": "Follow {name}", + "interaction_modal.title.favourite": "အကြိုက်ဆုံး {name} ၏ ပို့စ်", + "interaction_modal.title.follow": "{name} ကို စောင့်ကြည့်မယ်", "interaction_modal.title.reblog": "Boost {name}'s post", - "interaction_modal.title.reply": "Reply to {name}'s post", + "interaction_modal.title.reply": "{name} ၏ ပို့စ်ကို စာပြန်မယ်", "intervals.full.days": "{number, plural, one {# day} other {# days}}", "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", @@ -312,7 +312,7 @@ "keyboard_shortcuts.column": "to focus a status in one of the columns", "keyboard_shortcuts.compose": "to focus the compose textarea", "keyboard_shortcuts.description": "ဖော်ပြချက်", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "တိုက်ရိုက်မက်ဆေ့ချ်ကော်လံကို ဖွင့်ရန်", "keyboard_shortcuts.down": "to move down in the list", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "to favourite", @@ -345,8 +345,8 @@ "lightbox.expand": "ပုံကိုဖွင့်ပါ", "lightbox.next": "ရှေ့သို့", "lightbox.previous": "Previous", - "limited_account_hint.action": "Show profile anyway", - "limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.", + "limited_account_hint.action": "ဘာပဲဖြစ်ဖြစ် ပရိုဖိုင်ကို ပြပါ", + "limited_account_hint.title": "ဤပရိုဖိုင်ကို {domain} ၏ စိစစ်သူများမှ ဖျောက်ထားသည်။", "lists.account.add": "စာရင်းထဲသို့ထည့်ပါ", "lists.account.remove": "စာရင်းမှ ဖယ်ရှားလိုက်ပါ။", "lists.delete": "စာရင်းကိုဖျက်ပါ", @@ -374,37 +374,37 @@ "navigation_bar.bookmarks": "မှတ်ထားသည်များ", "navigation_bar.community_timeline": "ဒေသစံတော်ချိန်", "navigation_bar.compose": "Compose new post", - "navigation_bar.direct": "Direct messages", + "navigation_bar.direct": "တိုက်ရိုက်မက်ဆေ့ချ်များ", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Hidden domains", "navigation_bar.edit_profile": "ကိုယ်ရေးမှတ်တမ်းပြင်ဆင်မည်", "navigation_bar.explore": "Explore", - "navigation_bar.favourites": "Favourites", + "navigation_bar.favourites": "အကြိုက်ဆုံးများ", "navigation_bar.filters": "Muted words", - "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follow_requests": "တောင်းဆိုချက်များကို စောင့်ကြည့်ပါ", "navigation_bar.followed_tags": "Followed hashtags", - "navigation_bar.follows_and_followers": "Follows and followers", - "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", + "navigation_bar.follows_and_followers": "စောင့်ကြည့်သူများနှင့် စောင့်ကြည့်စာရင်း", + "navigation_bar.lists": "စာရင်းများ", + "navigation_bar.logout": "ထွက်မယ်", "navigation_bar.mutes": "Muted users", - "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned posts", + "navigation_bar.personal": "ကိုယ်ရေးကိုယ်တာ", + "navigation_bar.pins": "ပင်တွဲထားသောပို့စ်များ", "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.search": "Search", - "navigation_bar.security": "Security", - "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", + "navigation_bar.search": "ရှာရန်", + "navigation_bar.security": "လုံခြုံရေး", + "not_signed_in_indicator.not_signed_in": "ဤရင်းမြစ်သို့ ဝင်ရောက်ရန်အတွက် သင်သည် အကောင့်ဝင်ရန် လိုအပ်ပါသည်။", "notification.admin.report": "{name} reported {target}", - "notification.admin.sign_up": "{name} signed up", + "notification.admin.sign_up": "{name} က အကောင့်ဖွင့်ထားသည်", "notification.favourite": "{name} favourited your status", - "notification.follow": "{name} followed you", - "notification.follow_request": "{name} has requested to follow you", - "notification.mention": "{name} mentioned you", + "notification.follow": "{name} သင့်ကို စောင့်ကြည့်ခဲ့သည်", + "notification.follow_request": "{name} က သင့်ကို စောင့်ကြည့်ရန် တောင်းဆိုထားသည်", + "notification.mention": "{name} က သင့်ကို ဖော်ပြခဲ့သည်", "notification.own_poll": "စစ်တမ်းကောက်မှု ပြီးဆုံးပါပြီ", "notification.poll": "သင်ပါဝင်ခဲ့သော စစ်တမ်းပြီးပါပြီ", "notification.reblog": "{name} boosted your status", - "notification.status": "{name} just posted", - "notification.update": "{name} edited a post", + "notification.status": "{name} က အခုလေးတင် ပို့စ်တင်လိုက်ပါပြီ", + "notification.update": "{name} က ပို့စ်တစ်ခုကို ပြင်ဆင်ခဲ့သည်", "notifications.clear": "အသိပေးချက်များအား ရှင်းလင်းပါ", "notifications.clear_confirmation": "သတိပေးချက်အားလုံးကို အပြီးတိုင်ဖယ်ရှားမည်", "notifications.column_settings.admin.report": "New reports:", @@ -413,29 +413,29 @@ "notifications.column_settings.favourite": "ကြိုက်နှစ်သက်မှုများ", "notifications.column_settings.filter_bar.advanced": "ခေါင်းစဥ်အားလုံးများကိုဖော်ပြပါ", "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show_bar": "Show filter bar", - "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.filter_bar.show_bar": "စစ်ထုတ်မှုဘားကို ပြပါ", + "notifications.column_settings.follow": "စောင့်ကြည့်သူအသစ်များ -", "notifications.column_settings.follow_request": "New follow requests:", "notifications.column_settings.mention": "Mentions:", "notifications.column_settings.poll": "စစ်တမ်းရလဒ်", - "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.push": "အသိပေးချက်များအား ရအောင်ပို့ခြင်း", "notifications.column_settings.reblog": "Boosts:", - "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.column_settings.status": "New posts:", - "notifications.column_settings.unread_notifications.category": "Unread notifications", + "notifications.column_settings.show": "ကော်လံတွင်ပြပါ", + "notifications.column_settings.sound": "အသံဖွင့်မည်", + "notifications.column_settings.status": "ပို့စ်အသစ်များ -", + "notifications.column_settings.unread_notifications.category": "မဖတ်ရသေးသောအသိပေးချက်များ -", "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications", - "notifications.column_settings.update": "Edits:", + "notifications.column_settings.update": "ပြင်ဆင်ထားမှုများ -", "notifications.filter.all": "အားလုံး", "notifications.filter.boosts": "အားပေးမည်", "notifications.filter.favourites": "ကြိုက်နှစ်သက်မှုများ", "notifications.filter.follows": "ဖောလိုးမည်", "notifications.filter.mentions": " မန်းရှင်းမည်", "notifications.filter.polls": "စစ်တမ်းရလဒ်", - "notifications.filter.statuses": "Updates from people you follow", + "notifications.filter.statuses": "သင်စောင့်ကြည့်သူများထံမှ အပ်ဒိတ်များ", "notifications.grant_permission": "ခွင့်ပြုချက်ပေးမည်", - "notifications.group": "{count} notifications", - "notifications.mark_as_read": "Mark every notification as read", + "notifications.group": "အသိပေးချက်များ {count} ခု", + "notifications.mark_as_read": "အသိပေးချက်တိုင်းကို ဖတ်ပြီးကြောင်း အမှတ်အသားပြုပါ", "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request", "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before", "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.", @@ -462,9 +462,9 @@ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features", "privacy.unlisted.short": "Unlisted", "privacy_policy.last_updated": "Last updated {date}", - "privacy_policy.title": "Privacy Policy", - "refresh": "Refresh", - "regeneration_indicator.label": "Loading…", + "privacy_policy.title": "ကိုယ်ရေးအချက်အလက်မူဝါဒ", + "refresh": "ပြန်လည်စတင်ပါ", + "regeneration_indicator.label": "လုပ်ဆောင်နေသည်…", "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago", @@ -473,7 +473,7 @@ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago", "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago", "relative_time.hours": "{number}h", - "relative_time.just_now": "now", + "relative_time.just_now": "ယခု", "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "ယနေ့", @@ -516,13 +516,13 @@ "report.unfollow": "Unfollow @{name}", "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached", - "report_notification.categories.other": "Other", + "report_notification.categories.other": "အခြား", "report_notification.categories.spam": "Spam", "report_notification.categories.violation": "Rule violation", "report_notification.open": "Open report", "search.placeholder": "ရှာဖွေရန်", "search.search_or_paste": "URL ရိုက်ထည့်ပါ သို့မဟုတ် ရှာဖွေပါ", - "search_popout.search_format": "Advanced search format", + "search_popout.search_format": "အဆင့်မြင့်ရှာဖွေမှုပုံစံ", "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": "ဟက်ရှ်တက်ခ်", "search_popout.tips.status": "ပို့စ်", @@ -534,29 +534,29 @@ "search_results.nothing_found": "ရှာဖွေလိုသောအရာမရှိပါ", "search_results.statuses": "ပို့စ်တင်မယ်", "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.", - "search_results.title": "Search for {q}", + "search_results.title": "{q} ကို ရှာပါ", "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)", - "server_banner.active_users": "active users", + "server_banner.active_users": "လက်ရှိအသုံးပြုသူများ", "server_banner.administered_by": "Administered by:", "server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.", - "server_banner.learn_more": "Learn more", + "server_banner.learn_more": "ပိုမိုသိရှိရန်", "server_banner.server_stats": "Server stats:", - "sign_in_banner.create_account": "Create account", - "sign_in_banner.sign_in": "Sign in", + "sign_in_banner.create_account": "အကောင့်ဖန်တီးမည်", + "sign_in_banner.sign_in": "အကောင့်ဝင်မည်", "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.", "status.admin_account": "Open moderation interface for @{name}", "status.admin_domain": "Open moderation interface for {domain}", "status.admin_status": "Open this status in the moderation interface", "status.block": "@{name} ကိုဘလော့မည်", - "status.bookmark": "Bookmark", + "status.bookmark": "မှတ်ထားသည်များ", "status.cancel_reblog_private": "Unboost", "status.cannot_reblog": "This post cannot be boosted", "status.copy": "Copy link to status", - "status.delete": "Delete", + "status.delete": "ဖျက်ရန်", "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", - "status.edit": "Edit", + "status.direct": "@{name} ကို တိုက်ရိုက်စာပို့မည်", + "status.edit": "ပြင်ဆင်ရန်", "status.edited": "Edited {date}", "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}", "status.embed": "Embed", @@ -574,86 +574,86 @@ "status.mute_conversation": "Mute conversation", "status.open": "ပို့စ်ကိုချဲ့ထွင်မည်", "status.pin": "Pin on profile", - "status.pinned": "Pinned post", - "status.read_more": "Read more", + "status.pinned": "ပင်တွဲထားသောပို့စ်", + "status.read_more": "ပိုမိုဖတ်ရှုရန်", "status.reblog": "Boost", "status.reblog_private": "Boost with original visibility", "status.reblogged_by": "{name} boosted", "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.", "status.redraft": "Delete & re-draft", - "status.remove_bookmark": "Remove bookmark", - "status.replied_to": "Replied to {name}", - "status.reply": "Reply", + "status.remove_bookmark": "မှတ်ထားသည်များကို ဖယ်ရှားပါ", + "status.replied_to": "{name} ကို စာပြန်ခဲ့သည်", + "status.reply": "စာပြန်ရန်", "status.replyAll": "Reply to thread", "status.report": "Report @{name}", - "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_filter_reason": "Show anyway", - "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.show_original": "Show original", - "status.translate": "Translate", - "status.translated_from_with": "Translated from {lang} using {provider}", - "status.uncached_media_warning": "Not available", + "status.sensitive_warning": "သတိထားရသော အကြောင်းအရာ", + "status.share": "မျှဝေ", + "status.show_filter_reason": "မည်သို့ပင်ဖြစ်စေ ပြပါ", + "status.show_less": "အနည်းငယ်သာ ပြပါ", + "status.show_less_all": "အားလုံးအတွက် အနည်းငယ်သာ ပြပါ", + "status.show_more": "ပိုမိုပြရန်", + "status.show_more_all": "အားလုံးအတွက် ပိုပြပါ", + "status.show_original": "မူရင်းပြပါ", + "status.translate": "ဘာသာပြန်ပါ", + "status.translated_from_with": "{provider} ကို အသုံးပြု၍ {lang} မှ ဘာသာပြန်ထားသည်", + "status.uncached_media_warning": "မရနိုင်ပါ", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.", - "subscribed_languages.save": "Save changes", - "subscribed_languages.target": "Change subscribed languages for {target}", + "subscribed_languages.save": "ပြောင်းလဲမှုများကို သိမ်းဆည်းပါ", + "subscribed_languages.target": "{target} အတွက် စာရင်းသွင်းထားသော ဘာသာစကားများကို ပြောင်းပါ", "suggestions.dismiss": "Dismiss suggestion", "suggestions.header": "You might be interested in…", - "tabs_bar.federated_timeline": "Federated", - "tabs_bar.home": "Home", - "tabs_bar.local_timeline": "Local", - "tabs_bar.notifications": "Notifications", + "tabs_bar.federated_timeline": "ဖက်ဒီ", + "tabs_bar.home": "ပင်မစာမျက်နှာ", + "tabs_bar.local_timeline": "ပြည်တွင်း", + "tabs_bar.notifications": "အသိပေးချက်များ", "time_remaining.days": "{number, plural, one {# day} other {# days}} left", "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.", - "timeline_hint.resources.followers": "Followers", - "timeline_hint.resources.follows": "Follows", - "timeline_hint.resources.statuses": "Older posts", + "timeline_hint.remote_resource_not_displayed": "အခြားဆာဗာများမှ {resource} ကို ပြသမည်မဟုတ်ပါ။", + "timeline_hint.resources.followers": "စောင့်ကြည့်သူများ", + "timeline_hint.resources.follows": "စောင့်ကြည့်မယ်", + "timeline_hint.resources.statuses": "ပို့စ်အဟောင်းများ", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}", - "trends.trending_now": "Trending now", + "trends.trending_now": "လက်ရှိခေတ်စားနေသော ပို့စ်များ", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "units.short.billion": "{count}B", "units.short.million": "{count}M", "units.short.thousand": "{count}K", "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add images, a video or an audio file", - "upload_error.limit": "File upload limit exceeded.", + "upload_button.label": "ပုံများ၊ ဗီဒီယို သို့မဟုတ် အသံဖိုင်တစ်ခု ထည့်ပါ", + "upload_error.limit": "ဖိုင်အများဆုံးတင်နိုင်မည့်ကန့်သတ်ချက်ကို ကျော်သွားပါပြီ။", "upload_error.poll": "စစ်တမ်းနှင့်အတူဖိုင်များတင်ခွင့်မပြုပါ", "upload_form.audio_description": "အကြားအာရုံချို့ယွင်းသော ခက်ခဲသောသူများအတွက် ဖော်ပြထားသည်", "upload_form.description": "အမြင်အာရုံချို့ယွင်းသော ခက်ခဲသောသူများအတွက် ဖော်ပြထားသည်", - "upload_form.description_missing": "No description added", - "upload_form.edit": "Edit", + "upload_form.description_missing": "ဖော်ပြချက် မထည့်ပါ", + "upload_form.edit": "ပြင်ရန်", "upload_form.thumbnail": "Change thumbnail", - "upload_form.undo": "Delete", + "upload_form.undo": "ဖျက်ရန်", "upload_form.video_description": "အမြင်အာရုံနှင့်အကြားအာရုံ ချို့ယွင်းသော ခက်ခဲသောသူများအတွက် ဖော်ပြထားသည်", "upload_modal.analyzing_picture": "Analyzing picture…", "upload_modal.apply": "Apply", "upload_modal.applying": "Applying…", - "upload_modal.choose_image": "Choose image", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.choose_image": "ပုံရွေးပါ", + "upload_modal.description_placeholder": "သီဟိုဠ်မှ ဉာဏ်ကြီးရှင်သည် အာယုဝဍ္ဎနဆေးညွှန်းစာကို ဇလွန်ဈေးဘေး ဗာဒံပင်ထက် အဓိဋ္ဌာန်လျက် ဂဃနဏဖတ်ခဲ့သည်", "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.edit_media": "မီဒီယာကို ပြင်ဆင်ရန်", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preparing_ocr": "Preparing OCR…", + "upload_modal.preparing_ocr": "OCR ပြင်ဆင်နေသည်…", "upload_modal.preview_label": "Preview ({ratio})", "upload_progress.label": "တင်နေသည်...", - "upload_progress.processing": "Processing…", - "video.close": "Close video", - "video.download": "Download file", - "video.exit_fullscreen": "Exit full screen", - "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", - "video.mute": "Mute sound", - "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound" + "upload_progress.processing": "လုပ်ဆောင်နေသည်…", + "video.close": "ဗီဒီယိုကို ပိတ်ပါ", + "video.download": "ဖိုင်ကို ဒေါင်းလုဒ်လုပ်ပါ", + "video.exit_fullscreen": "မျက်နှာပြင်အပြည့်မှ ထွက်ပါ", + "video.expand": "ဗီဒီယိုကို ချဲ့ပါ", + "video.fullscreen": "မျက်နှာပြင်အပြည့်", + "video.hide": "ဗီဒီယိုကို ဖျောက်ပါ", + "video.mute": "အသံပိတ်ထားပါ", + "video.pause": "ခဏရပ်ပါ", + "video.play": "ဖွင့်ပါ", + "video.unmute": "အသံပြန်ဖွင့်ပါ" } diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 9ed91cc34..33026253a 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -34,7 +34,7 @@ "account.followers.empty": "Ingen fylgjer denne brukaren enno.", "account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}", "account.following": "Fylgjer", - "account.following_counter": "{count, plural, one {Fylgjar {counter}} other {Fylgjar {counter}}}", + "account.following_counter": "{count, plural, one {Fylgjer {counter}} other {Fylgjer {counter}}}", "account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.", "account.follows_you": "Fylgjer deg", "account.go_to_profile": "Gå til profil", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 75a9467be..47efca424 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -221,7 +221,7 @@ "empty_column.favourites": "Ingen har favoritmarkerat detta inlägg än. När någon gör det kommer de synas här.", "empty_column.follow_recommendations": "Det ser ut som om inga förslag kan genereras till dig. Du kan prova att använda sök för att leta efter personer som du kanske känner eller utforska trendande hash-taggar.", "empty_column.follow_requests": "Du har inga följarförfrågningar än. När du får en kommer den visas här.", - "empty_column.followed_tags": "You have not followed any hashtags yet. When you do, they will show up here.", + "empty_column.followed_tags": "Du följer inga hashtags ännu. När du gör det kommer de att dyka upp här.", "empty_column.hashtag": "Det finns inget i denna hashtag ännu.", "empty_column.home": "Din hemma-tidslinje är tom! Följ fler användare för att fylla den. {suggestions}", "empty_column.home.suggestions": "Se några förslag", @@ -264,7 +264,7 @@ "follow_request.authorize": "Godkänn", "follow_request.reject": "Avvisa", "follow_requests.unlocked_explanation": "Även om ditt konto inte är låst tror {domain} personalen att du kanske vill granska dessa följares förfrågningar manuellt.", - "followed_tags": "Followed hashtags", + "followed_tags": "Följda hashtags", "footer.about": "Om", "footer.directory": "Profilkatalog", "footer.get_app": "Skaffa appen", @@ -544,7 +544,7 @@ "server_banner.server_stats": "Serverstatistik:", "sign_in_banner.create_account": "Skapa konto", "sign_in_banner.sign_in": "Logga in", - "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.", + "sign_in_banner.text": "Logga in för att följa profiler eller hashtags, favoritmarkera, dela och svara på inlägg. Du kan också interagera med ditt konto på en annan server.", "status.admin_account": "Öppet modereringsgränssnitt för @{name}", "status.admin_domain": "Öppet modereringsgränssnitt för @{domain}", "status.admin_status": "Öppna detta inlägg i modereringsgränssnittet", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 76009ba1e..41098618c 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -7,7 +7,7 @@ "about.domain_blocks.silenced.explanation": "Гадәттә, сез бу серверның профильләрен һәм эчтәлеген күрмәячәксез, әгәр сез аларны ачыктан-ачык карамасагыз яки бу адымнарны үтәп язылмасагыз.", "about.domain_blocks.silenced.title": "Чикле", "about.domain_blocks.suspended.explanation": "Бу серверның бернинди мәгълүматлары да эшкәртелмәячәк, сакланмаячак яки алмаштырылмаячак, бу сервердан кулланучылар белән үзара бәйләнешне яки аралашуны мөмкин итми.", - "about.domain_blocks.suspended.title": "Асылмалы", + "about.domain_blocks.suspended.title": "Блокланган", "about.not_available": "Бу серверда бу мәгълүмат юк иде.", "about.powered_by": "Децентрализованные социаль челтәрләр нигезендә {mastodon}", "about.rules": "Сервер кагыйдәләре", @@ -39,22 +39,22 @@ "account.follows_you": "Сезгә язылган", "account.go_to_profile": "Профильгә күчү", "account.hide_reblogs": "Скрывать көчен нче @{name}", - "account.joined_short": "Кушылу", - "account.languages": "Подписка телләрен үзгәртү", + "account.joined_short": "Кушылды", + "account.languages": "Сайланган телләрен үзгәртү", "account.link_verified_on": "Бу сылтамага милек хокукы тикшерелде {date}", "account.locked_info": "Бу - ябык аккаунт. Аны язылучылар гына күрә ала.", "account.media": "Медиа", "account.mention": "@{name} искәртү", "account.moved_to": "{name} аларның яңа счеты хәзер күрсәтте:", - "account.mute": "Тавышсыз @{name}", - "account.mute_notifications": "Отключите хәбәрләр нче @{name}", - "account.muted": "Тавышсыз", + "account.mute": "@{name} кулланучыга әһәмият бирмәү", + "account.mute_notifications": "@{name} кулланучыдан хәбәрләргә әһәмият бирмәү", + "account.muted": "Әһәмият бирмәнгән", "account.open_original_page": "Чыганак битен ачу", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", - "account.report": "Хисап @{name}", + "account.posts": "Пост", + "account.posts_with_replies": "Пост һәм җавап", + "account.report": "@{name} кулланучыга шикаять итү", "account.requested": "Awaiting approval", - "account.requested_follow": "{name} сиңа иярүеңне сорады", + "account.requested_follow": "{name} Сезгә язылу соравын җиберде", "account.share": "Уртаклашу @{name} профиль", "account.show_reblogs": "Күрсәтергә көчәйтү нче @{name}", "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 3af82e86e..4e5cfb876 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -104,14 +104,14 @@ "column.community": "本站時間軸", "column.direct": "私訊", "column.directory": "瀏覽個人檔案", - "column.domain_blocks": "已封鎖的網域", + "column.domain_blocks": "已封鎖網域", "column.favourites": "最愛", "column.follow_requests": "跟隨請求", "column.home": "首頁", "column.lists": "列表", "column.mutes": "已靜音的使用者", "column.notifications": "通知", - "column.pins": "釘選嘟文", + "column.pins": "釘選的嘟文", "column.public": "聯邦時間軸", "column_back_button.label": "上一頁", "column_header.hide_settings": "隱藏設定", @@ -168,7 +168,7 @@ "confirmations.mute.explanation": "這將會隱藏來自他們的嘟文與通知,但是他們還是可以查閱您的嘟文與跟隨您。", "confirmations.mute.message": "您確定要靜音 {name} 嗎?", "confirmations.redraft.confirm": "刪除並重新編輯", - "confirmations.redraft.message": "您確定要刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及最愛,且回覆這則的嘟文將會變成獨立的嘟文。", + "confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文的轉嘟及最愛,且對原始嘟文的回覆都會變成獨立的嘟文。", "confirmations.reply.confirm": "回覆", "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?", "confirmations.unfollow.confirm": "取消跟隨", @@ -190,7 +190,7 @@ "dismissable_banner.explore_links": "這些新聞故事正在被此伺服器以及去中心化網路上的人們熱烈討論著。", "dismissable_banner.explore_statuses": "這些於此伺服器以及去中心化網路中其他伺服器發出的嘟文正在被此伺服器上的人們熱烈討論著。", "dismissable_banner.explore_tags": "這些主題標籤正在被此伺服器以及去中心化網路上的人們熱烈討論著。", - "dismissable_banner.public_timeline": "這些是來自此伺服器以及去中心化網路中其他已知伺服器的最新公開嘟文。", + "dismissable_banner.public_timeline": "這些是來自這裡以及去中心化網路中其他已知伺服器之最新公開嘟文。", "embed.instructions": "要在您的網站嵌入此嘟文,請複製以下程式碼。", "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", @@ -246,7 +246,7 @@ "filter_modal.added.context_mismatch_title": "不符合情境!", "filter_modal.added.expired_explanation": "此過濾器類別已失效,您需要更新過期日期以套用。", "filter_modal.added.expired_title": "過期的過濾器!", - "filter_modal.added.review_and_configure": "若欲檢視和進一步設定此過濾器類別,請至 {settings_link}。", + "filter_modal.added.review_and_configure": "要檢視和進一步設定此過濾器類別,請至 {settings_link}。", "filter_modal.added.review_and_configure_title": "過濾器設定", "filter_modal.added.settings_link": "設定頁面", "filter_modal.added.short_explanation": "此嘟文已被新增至以下過濾器類別:{title}。", @@ -306,11 +306,11 @@ "intervals.full.days": "{number, plural, one {# 天} other {# 天}}", "intervals.full.hours": "{number, plural, one {# 小時} other {# 小時}}", "intervals.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}", - "keyboard_shortcuts.back": "返回上一頁", - "keyboard_shortcuts.blocked": "開啟「封鎖使用者」名單", + "keyboard_shortcuts.back": "上一頁", + "keyboard_shortcuts.blocked": "開啟「封鎖使用者」列表", "keyboard_shortcuts.boost": "轉嘟", - "keyboard_shortcuts.column": "聚焦至其中一欄的嘟文", - "keyboard_shortcuts.compose": "聚焦至撰寫文字區塊", + "keyboard_shortcuts.column": "將游標移至其中一欄", + "keyboard_shortcuts.compose": "將游標移至文字撰寫區塊", "keyboard_shortcuts.description": "說明", "keyboard_shortcuts.direct": "開啟私訊欄", "keyboard_shortcuts.down": "往下移動", @@ -332,13 +332,13 @@ "keyboard_shortcuts.profile": "開啟作者的個人檔案頁面", "keyboard_shortcuts.reply": "回應嘟文", "keyboard_shortcuts.requests": "開啟跟隨請求列表", - "keyboard_shortcuts.search": "聚焦至搜尋框", + "keyboard_shortcuts.search": "將游標移至搜尋框", "keyboard_shortcuts.spoilers": "顯示或隱藏內容警告之嘟文", "keyboard_shortcuts.start": "開啟「開始使用」欄位", "keyboard_shortcuts.toggle_hidden": "顯示或隱藏在內容警告之後的嘟文", "keyboard_shortcuts.toggle_sensitivity": "顯示或隱藏媒體", "keyboard_shortcuts.toot": "發個新嘟文", - "keyboard_shortcuts.unfocus": "取消輸入文字區塊或搜尋之焦點", + "keyboard_shortcuts.unfocus": "跳離文字撰寫區塊或搜尋框", "keyboard_shortcuts.up": "往上移動", "lightbox.close": "關閉", "lightbox.compress": "折疊圖片檢視框", @@ -376,27 +376,27 @@ "navigation_bar.compose": "撰寫新嘟文", "navigation_bar.direct": "私訊", "navigation_bar.discover": "探索", - "navigation_bar.domain_blocks": "已封鎖的網域", + "navigation_bar.domain_blocks": "已封鎖網域", "navigation_bar.edit_profile": "編輯個人檔案", "navigation_bar.explore": "探索", "navigation_bar.favourites": "最愛", "navigation_bar.filters": "已靜音的關鍵字", "navigation_bar.follow_requests": "跟隨請求", - "navigation_bar.followed_tags": "已跟隨主題標籤", + "navigation_bar.followed_tags": "已跟隨的主題標籤", "navigation_bar.follows_and_followers": "跟隨中與跟隨者", "navigation_bar.lists": "列表", "navigation_bar.logout": "登出", "navigation_bar.mutes": "已靜音的使用者", "navigation_bar.personal": "個人", - "navigation_bar.pins": "釘選嘟文", + "navigation_bar.pins": "釘選的嘟文", "navigation_bar.preferences": "偏好設定", "navigation_bar.public_timeline": "聯邦時間軸", "navigation_bar.search": "搜尋", "navigation_bar.security": "安全性", "not_signed_in_indicator.not_signed_in": "您需要登入才能存取此資源。", - "notification.admin.report": "{name} 檢舉了 {target}", + "notification.admin.report": "{name} 已檢舉 {target}", "notification.admin.sign_up": "{name} 已經註冊", - "notification.favourite": "{name} 把您的嘟文加入了最愛", + "notification.favourite": "{name} 已將您的嘟文加入最愛", "notification.follow": "{name} 跟隨了您", "notification.follow_request": "{name} 要求跟隨您", "notification.mention": "{name} 提到了您", @@ -404,7 +404,7 @@ "notification.poll": "您曾投過的投票已經結束", "notification.reblog": "{name} 轉嘟了您的嘟文", "notification.status": "{name} 剛剛嘟文", - "notification.update": "{name} 編輯了嘟文", + "notification.update": "{name} 已編輯嘟文", "notifications.clear": "清除通知", "notifications.clear_confirmation": "您確定要永久清除您的通知嗎?", "notifications.column_settings.admin.report": "新檢舉報告:", @@ -544,7 +544,7 @@ "server_banner.server_stats": "伺服器統計:", "sign_in_banner.create_account": "新增帳號", "sign_in_banner.sign_in": "登入", - "sign_in_banner.text": "登入以追蹤個人檔案、主題標籤、最愛,分享和回覆嘟文。您也能與您其他伺服器之帳號進行互動。", + "sign_in_banner.text": "登入以跟隨個人檔案和主題標籤,或收藏、分享和回覆嘟文。您也可以使用您的帳號在其他伺服器上進行互動。", "status.admin_account": "開啟 @{name} 的管理介面", "status.admin_domain": "開啟 {domain} 的管理介面", "status.admin_status": "在管理介面開啟此嘟文", diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb index d27bb46fc..1666ea883 100644 --- a/app/models/account_filter.rb +++ b/app/models/account_filter.rb @@ -17,13 +17,13 @@ class AccountFilter attr_reader :params def initialize(params) - @params = params + @params = params.to_h.symbolize_keys end def results scope = Account.includes(:account_stat, user: [:ips, :invite_request]).without_instance_actor.reorder(nil) - params.each do |key, value| + relevant_params.each do |key, value| next if key.to_s == 'page' scope.merge!(scope_for(key, value)) if value.present? @@ -34,6 +34,16 @@ class AccountFilter private + def relevant_params + params.tap do |args| + args.delete(:origin) if origin_is_remote_and_domain_present? + end + end + + def origin_is_remote_and_domain_present? + params[:origin] == 'remote' && params[:by_domain].present? + end + def scope_for(key, value) case key.to_s when 'origin' @@ -94,7 +104,15 @@ class AccountFilter def order_scope(value) case value.to_s when 'active' - accounts_with_users.left_joins(:account_stat).order(Arel.sql('coalesce(users.current_sign_in_at, account_stats.last_status_at, to_timestamp(0)) desc, accounts.id desc')) + accounts_with_users + .left_joins(:account_stat) + .order( + Arel.sql( + <<~SQL.squish + COALESCE(users.current_sign_in_at, account_stats.last_status_at, to_timestamp(0)) DESC, accounts.id DESC + SQL + ) + ) when 'recent' Account.recent else diff --git a/app/models/poll_vote.rb b/app/models/poll_vote.rb index 00eaedd12..92d74a6db 100644 --- a/app/models/poll_vote.rb +++ b/app/models/poll_vote.rb @@ -23,6 +23,7 @@ class PollVote < ApplicationRecord after_create_commit :increment_counter_cache delegate :local?, to: :account + delegate :multiple?, :expired?, to: :poll, prefix: true def object_type :vote diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index e3ba984f7..50e2a5156 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -74,10 +74,6 @@ class InstancePresenter < ActiveModelSerializers::Model Rails.cache.fetch('distinct_domain_count') { Instance.count } end - def sample_accounts - Rails.cache.fetch('sample_accounts', expires_in: 12.hours) { Account.local.discoverable.popular.limit(3) } - end - def version Mastodon::Version.to_s end diff --git a/app/services/import_service.rb b/app/services/import_service.rb index 7a68e4ca3..940c236d4 100644 --- a/app/services/import_service.rb +++ b/app/services/import_service.rb @@ -67,7 +67,7 @@ class ImportService < BaseService def import_relationships!(action, undo_action, overwrite_scope, limit, extra_fields = {}) local_domain_suffix = "@#{Rails.configuration.x.local_domain}" - items = @data.take(limit).map { |row| [row['Account address']&.strip&.delete_suffix(local_domain_suffix), Hash[extra_fields.map { |key, field_settings| [key, row[field_settings[:header]]&.strip || field_settings[:default]] }]] }.reject { |(id, _)| id.blank? } + items = @data.take(limit).map { |row| [row['Account address']&.strip&.delete_suffix(local_domain_suffix), extra_fields.to_h { |key, field_settings| [key, row[field_settings[:header]]&.strip || field_settings[:default]] }] }.reject { |(id, _)| id.blank? } if @import.overwrite? presence_hash = items.each_with_object({}) { |(id, extra), mapping| mapping[id] = [true, extra] } diff --git a/app/validators/vote_validator.rb b/app/validators/vote_validator.rb index b1692562d..9c55f9ab6 100644 --- a/app/validators/vote_validator.rb +++ b/app/validators/vote_validator.rb @@ -2,13 +2,13 @@ class VoteValidator < ActiveModel::Validator def validate(vote) - vote.errors.add(:base, I18n.t('polls.errors.expired')) if vote.poll.expired? + vote.errors.add(:base, I18n.t('polls.errors.expired')) if vote.poll_expired? vote.errors.add(:base, I18n.t('polls.errors.invalid_choice')) if invalid_choice?(vote) - if vote.poll.multiple? && vote.poll.votes.where(account: vote.account, choice: vote.choice).exists? + if vote.poll_multiple? && already_voted_for_same_choice_on_multiple_poll?(vote) vote.errors.add(:base, I18n.t('polls.errors.already_voted')) - elsif !vote.poll.multiple? && vote.poll.votes.where(account: vote.account).exists? + elsif !vote.poll_multiple? && already_voted_on_non_multiple_poll?(vote) vote.errors.add(:base, I18n.t('polls.errors.already_voted')) end end @@ -18,4 +18,24 @@ class VoteValidator < ActiveModel::Validator def invalid_choice?(vote) vote.choice.negative? || vote.choice >= vote.poll.options.size end + + def already_voted_for_same_choice_on_multiple_poll?(vote) + if vote.persisted? + account_votes_on_same_poll(vote).where(choice: vote.choice).where.not(poll_votes: { id: vote }).exists? + else + account_votes_on_same_poll(vote).where(choice: vote.choice).exists? + end + end + + def already_voted_on_non_multiple_poll?(vote) + if vote.persisted? + account_votes_on_same_poll(vote).where.not(poll_votes: { id: vote }).exists? + else + account_votes_on_same_poll(vote).exists? + end + end + + def account_votes_on_same_poll(vote) + vote.poll.votes.where(account: vote.account) + end end diff --git a/config/locales/activerecord.bg.yml b/config/locales/activerecord.bg.yml index 2fd079171..8b1e44ee4 100644 --- a/config/locales/activerecord.bg.yml +++ b/config/locales/activerecord.bg.yml @@ -41,7 +41,7 @@ bg: attributes: email: blocked: използва се забранен доставчик на услуга за е-поща - unreachable: изглежда, че не съществува + unreachable: изглежда не съществува role_id: elevated: не може да е по-висока от текущата ви роля user_role: diff --git a/config/locales/activerecord.de.yml b/config/locales/activerecord.de.yml index 0c25cea8c..c45d3ae8c 100644 --- a/config/locales/activerecord.de.yml +++ b/config/locales/activerecord.de.yml @@ -28,7 +28,7 @@ de: doorkeeper/application: attributes: website: - invalid: ist keine gültige Adresse + invalid: ist keine gültige URL import: attributes: data: diff --git a/config/locales/activerecord.fy.yml b/config/locales/activerecord.fy.yml index cc10d817d..22f0c0d15 100644 --- a/config/locales/activerecord.fy.yml +++ b/config/locales/activerecord.fy.yml @@ -43,13 +43,13 @@ fy: blocked: brûkt in net tastiene e-mailprovider unreachable: liket net te bestean role_id: - elevated: kin net heger wêze as dyn aktuele rol + elevated: kin net heger wêze as jo aktuele rol user_role: attributes: permissions_as_keys: dangerous: rjochten tafoegje dy’t net feilich binne foar de basisrol - elevated: kin gjin rjochten tafoegje dy’t dyn aktuele rol net besit - own_role: kin net mei dyn aktuele rol wizige wurde + elevated: kin gjin rjochten tafoegje dy’t jo aktuele rol net besit + own_role: kin net mei jo aktuele rol wizige wurde position: - elevated: kin net heger wêze as dyn aktuele rol - own_role: kin net mei dyn aktuele rol wizige wurde + elevated: kin net heger wêze as jo aktuele rol + own_role: kin net mei jo aktuele rol wizige wurde diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml index 5b3d06634..909ff68c2 100644 --- a/config/locales/activerecord.kab.yml +++ b/config/locales/activerecord.kab.yml @@ -25,3 +25,7 @@ kab: attributes: reblog: taken: n iddaden yellan yakan + user: + attributes: + email: + unreachable: ur d-ttban ara d akken yella diff --git a/config/locales/activerecord.pt-BR.yml b/config/locales/activerecord.pt-BR.yml index 9aa9af62e..eb29b5a3a 100644 --- a/config/locales/activerecord.pt-BR.yml +++ b/config/locales/activerecord.pt-BR.yml @@ -43,7 +43,7 @@ pt-BR: blocked: usa provedor de e-mail não permitido unreachable: parece não existir role_id: - elevated: não pode ser maior do que seu cargo atual + elevated: não pode ser maior que seu cargo atual user_role: attributes: permissions_as_keys: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 5ab26083a..32130cc7d 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -114,6 +114,13 @@ ar: pending: في انتظار المراجعة perform_full_suspension: تعليق الحساب previous_strikes: العقوبات السابقة + previous_strikes_description_html: + few: لدى هذا الحساب <strong>%{count}</strong> إنذارات. + many: لدى هذا الحساب <strong>%{count}</strong> إنذارًا. + one: هذا الحساب لديه <strong>%{count}</strong>انذار. + other: لدى هذا الحساب <strong>%{count}</strong> إنذار. + two: لدى هذا الحساب <strong>%{count}</strong> إنذاران اثنان. + zero: هذا الحساب لديه <strong>%{count}</strong>انذار. promote: ترقية protocol: البروتوكول public: عمومي @@ -880,6 +887,13 @@ ar: trending_rank: 'المتداولة #%{rank}' usable: يمكن استخدامه usage_comparison: تم استخدامه %{today} مرات اليوم، مقارنة بـ %{yesterday} بالأمس + used_by_over_week: + few: مستخدَم من قِبل %{count} أشخاص خلال الأسبوع الماضي + many: مستخدَم من قِبل %{count} شخصا خلال الأسبوع الماضي + one: مستخدَم من قِبل %{count} شخص واحد خلال الأسبوع الماضي + other: مستخدَم من قِبل %{count} شخص خلال الأسبوع الماضي + two: مستخدَم من قِبل %{count} شخصين خلال الأسبوع الماضي + zero: مستخدَم من قِبل %{count} شخص خلال الأسبوع الماضي title: المتداوَلة trending: المتداولة warning_presets: @@ -1150,6 +1164,8 @@ ar: storage: ذاكرة التخزين featured_tags: add_new: أضف واحدًا جديدا + errors: + limit: لقد قمت بالفعل بعرض الحد الأقصى من عدد الوسوم hint_html: "<strong>ما هي الوسوم الرائجة؟</strong> يتم عرضها بشكل بارز على ملفك الشخصي العام وتسمح للناس بتصفح منشوراتك العامة على وجه التحديد تحت تلك الوسوم. وهي أداة رائعة لتتبع الأعمال الإبداعية أو المشاريع الطويلة الأجل." filters: contexts: diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 536e3887c..afdb5176c 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -6,7 +6,7 @@ ast: hosted_on: 'Mastodon ta agospiáu en: %{domain}' title: Tocante a accounts: - last_active: Última actividá + last_active: última actividá nothing_here: "¡Equí nun hai nada!" posts: one: Artículu @@ -20,6 +20,7 @@ ast: accounts: add_email_domain_block: Bloquiar el dominiu de corréu electrónicu approved_msg: Aprobóse correutamente la solicitú de rexistru de «%{username}» + are_you_sure: "¿De xuru que quies facer esta aición?" avatar: Avatar by_domain: Dominiu confirming: En confirmación @@ -39,6 +40,7 @@ ast: login_status: Estáu del aniciu de la sesión moderation: pending: Pendiente + title: Moderación most_recent_activity: L'actividá más recién most_recent_ip: La IP más recién perform_full_suspension: Suspender @@ -201,12 +203,19 @@ ast: known_accounts: one: "%{count} cuenta conocida" other: "%{count} cuentes conocíes" + moderation: + title: Moderación private_comment: Comentariu priváu public_comment: Comentariu públicu title: Federación total_reported: Informes d'esa instancia invites: deactivate_all: Desactivalo too + filter: + all: Too + available: Disponible + expired: Caducó + title: Peñera title: Invitaciones ip_blocks: expires_in: @@ -231,6 +240,7 @@ ast: silence_description_html: La cuenta va ser visible namás pa quien xá la siguiere o la buscare manualmente, lo que llenda'l so algame. Esta decisión pue desfacese en cualesquier momentu. Si escueyes esta opción, zárrense tolos informes escontra esta cuenta. actions_description_html: Decidi qué aición tomar pa resolver esti informe. Si tomes una aición punitiva escontra la cuenta de la que s'informó, va unviase un avisu per corréu electrónicu a esa cuenta, esceuto cuando se seleiciona la categoría <strong>Puxarra</strong>. add_to_report: Amestar más al informe + are_you_sure: "¿De xuru que quies facer esta aición?" category: Categoría category_description_html: El motivu pol que s'informó d'esta cuenta y/o conteníu cítase na comunicación cola cuenta de la que s'informó comment_description_html: 'Pa fornir más información, %{name} escribió:' @@ -268,6 +278,7 @@ ast: administration: Alministración devops: DevOps invites: Invitaciones + moderation: Moderación edit: Edición del rol «%{name}» everyone: Permisos predeterminaos permissions_count: @@ -339,6 +350,7 @@ ast: strikes: actions: delete_statuses: "%{name} desanició l'artículu de: %{target}" + disable: "%{name} conxeló la cuenta de: %{target}" mark_statuses_as_sensitive: "%{name} marcó l'artículu de %{target} como sensible" none: "%{name} unvió una alvertencia a %{target}" sensitive: "%{name} marcó la cuenta de %{target} como sensible" @@ -433,6 +445,7 @@ ast: notification_preferences: Camudar les preferencies de los mensaxes de corréu electrónicu applications: created: L'aplicación creóse correutamente + destroyed: L'aplicación desanicióse correutamente regenerate_token: Volver xenerar el pase d'accesu token_regenerated: El pase d'accesu volvió xenerase correutamente warning: Ten munchu curiáu con estos datos, ¡enxamás nun los compartas con naide! @@ -520,12 +533,14 @@ ast: action_taken: Aición tomada appeal: Apellación appeal_rejected: Refugóse l'apellación + appeal_submitted_at: Data de l'apellación appealed_msg: Unvióse l'apellación. Si s'aprueba, avisámoste. appeals: submit: Unviu d'una apellación approve_appeal: Aprobar l'apellación associated_report: Informe asociáu created_at: Data + recipient: Dirixóse a reject_appeal: Refugar l'apellación status: 'Artículu #%{id}' status_removed: L'artículu xá se quitó del sistema @@ -570,6 +585,7 @@ ast: public: Llinies de tiempu públiques thread: Conversaciones edit: + add_keyword: Amestar una pallabra clave keywords: Pallabres clave statuses: Artículos individuales errors: @@ -654,6 +670,8 @@ ast: incoming_migrations_html: Pa migrar d'otra cuenta a esta, primero tienes de <a href="%{path}">crear un nomatu de cuenta</a>. warning: followers: Esta aición va mover tolos siguidores de la cuenta actual a la nueva + moderation: + title: Moderación notification_mailer: admin: sign_up: @@ -778,6 +796,7 @@ ast: notifications: Avisos preferences: Preferencies profile: Perfil + relationships: Perfiles que sigues ya te siguen statuses_cleanup: Desaniciu automáticu d'artículos two_factor_authentication: Autenticación en dos pasos webauthn_authentication: Llaves de seguranza @@ -819,8 +838,16 @@ ast: exceptions: Esceiciones interaction_exceptions: Esceiciones basaes nes interaiciones keep_direct: Caltener los mensaxes direutos + keep_direct_hint: Nun desanicia nengún mensaxe direutu + keep_media: Caltener los artículos con elementos multimedia + keep_media_hint: Nun desanicia nengún artículu de to que contenta elementos multimedia keep_pinned: Caltener los artículos fixaos keep_polls: Caltener les encuestes + keep_polls_hint: Nun desanicia nenguna encuesta de to + keep_self_bookmark: Caltener los artículos que metieres en Marcadores + keep_self_bookmark_hint: Nun desanicia nengún artículu que metieres en Marcadores + keep_self_fav: Caltener los artículos que seyan favoritos + keep_self_fav_hint: Nun desanicia nengún artículu que marcares como favoritu min_age: '1209600': 2 selmanes '15778476': 6 meses diff --git a/config/locales/bg.yml b/config/locales/bg.yml index adaf31d85..7483c562b 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -105,7 +105,7 @@ bg: not_subscribed: Без абонамент pending: Изчаква преглед perform_full_suspension: Спиране - previous_strikes: Предишни нарушения + previous_strikes: Предишни предупреждения previous_strikes_description_html: one: Този акаунт има <strong>едно</strong> нарушение. other: Този акунт има <strong>%{count}</strong> нарушения. @@ -231,7 +231,7 @@ bg: actions: approve_appeal_html: "%{name} одобри обжалването на решение за модериране от %{target}" approve_user_html: "%{name} одобри регистрирането от %{target}" - assigned_to_self_report_html: "%{name} назначете доклада %{target} на себе си" + assigned_to_self_report_html: "%{name} възложи на себе си доклад %{target}" change_email_user_html: "%{name} промени адреса на имейла на потребителя %{target}" change_role_user_html: "%{name} промени ролята на %{target}" confirm_user_html: "%{name} потвърди адреса на имейла на потребителя %{target}" @@ -613,6 +613,7 @@ bg: placeholder: Опишете какви действия са били предприети или всякакви други свързани нови неща... title: Бележки notes_description_html: Прегледайте и оставете бележки за други модератори и за вас самите след време + processed_msg: Доклад №%{id} успешно обработен quick_actions_description_html: 'Предприемете бързо действие или превъртете надолу, за да видите докладваното съдържание:' remote_user_placeholder: отдалеченият потребител от %{instance} reopen: Отваряне пак на доклад @@ -633,10 +634,14 @@ bg: suspend_html: 'На път сте да <strong>спрете</strong> акаунта на <strong>@%{acct}</strong>. Това ще:' actions: delete_html: Премахване на обидните публикации + mark_as_sensitive_html: Означаване на мултимедийните обидни публикации като деликатни silence_html: Силно ограничаване достигането на <strong>@%{acct}</strong>, което прави профилът и съдържанието на това лице видимо само до хората, които са го последвали или ръчно търсещите профила + suspend_html: Спирането на <strong>@%{acct}</strong> ще направи профилът и съдържанието недостъпни и невъзможни за взаимодействие close_report: Отбелязване на доклад №%{id} като решен close_reports_html: Означаване на <strong>всички</strong> доклади срещу <strong>@%{acct}</strong> като решени + delete_data_html: Изтриване на профила и съдържанието на <strong>@%{acct}</strong> за 30 дни от сега, освен ако междувременно не получи спиране preview_preamble_html: "<strong>@%{acct}</strong> ще получи предупреждение със следното съдържание:" + record_strike_html: Запис на предупреждение против <strong>@%{acct}</strong>, за да ви помогне при изострянето на бъдещи нарушения от този акаунт send_email_html: Изпращане на предупредително е-писмо на <strong>@%{acct}</strong> warning_placeholder: Незадължителни допълнителни причини за модераторско действие. target_origin: Произход на докладвания акаунт @@ -1020,7 +1025,7 @@ bg: functional: Вашият акаунт е в изправност. pending: Вашето приложение чака преглед от нашия екип. Това може да отнеме време. Ще получите имейл, ако приложението е одобрено. redirecting_to: Вашият акаунт е бездеен, защото сега се пренасочва към %{acct}. - view_strikes: Преглед на предишните нарушения за вашия акаунт + view_strikes: Преглед на предишните предупреждения против акаунта ви too_fast: Образецът подаден пребързо, опитайте пак. use_security_key: Употреба на ключ за сигурност authorize_follow: @@ -1083,7 +1088,7 @@ bg: strikes: action_taken: Предприето действие appeal: Обжалване - appeal_approved: Това нарушение беше успешно обжалвано и е вече невалидно + appeal_approved: Това предупреждение беше успешно обжалвано и е вече невалидно appeal_rejected: Обжалването е отхвърлено appeal_submitted_at: Подадено обжалване appealed_msg: Вашето обжалване е отхвърлено. Ако е одобрено, то ще бъдете известени. @@ -1492,7 +1497,7 @@ bg: profile: Профил relationships: Последвания и последователи statuses_cleanup: Автоматично изтриване на публикации - strikes: Нарушения + strikes: Модериране на предупреждения two_factor_authentication: Двустепенно удостоверяване webauthn_authentication: Ключове за сигурност statuses: @@ -1586,7 +1591,7 @@ bg: sensitive_content: Деликатно съдържание strikes: errors: - too_late: Късно е за обжалване на това нарушение + too_late: Твърде късно е за обжалване на това предупреждение tags: does_not_match_previous_name: не съвпада с предишното име themes: diff --git a/config/locales/da.yml b/config/locales/da.yml index e0468d6c7..38111748d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -990,7 +990,7 @@ da: migrate_account: Flyt til en anden konto migrate_account_html: Ønsker du at omdirigere denne konto til en anden, kan du <a href="%{path}">opsætte dette hér</a>. or_log_in_with: Eller log ind med - privacy_policy_agreement_html: Jeg accepterer <a href="%{privacy_policy_path}" target="_blank">Fortrolighedspolitikken</a> + privacy_policy_agreement_html: Jeg accepterer <a href="%{privacy_policy_path}" target="_blank">privatlivspolitikken</a> providers: cas: CAS saml: SAML @@ -1077,7 +1077,7 @@ da: email_contact_html: Hvis det stadig ikke ankommer, kan du sende en e-mail til <a href="mailto:%{email}">%{email}</a> for hjælp email_reconfirmation_html: Modtager du ikke bekræftelses-e-mailen, kan du <a href="%{path}">anmode om en ny</a> irreversible: Du vil ikke kunne gendanne/genaktivere din konto - more_details_html: For yderligere oplysningerer, tjek <a href="%{terms_path}">fortrolighedspolitikken</a>. + more_details_html: For yderligere oplysningerer, tjek <a href="%{terms_path}">privatlivspolitikken</a>. username_available: Dit brugernavn vil blive tilgængeligt igen username_unavailable: Dit brugernavn vil forblive utilgængeligt disputes: @@ -1392,7 +1392,7 @@ da: posting_defaults: Standarder for indlæg public_timelines: Offentlige tidslinjer privacy_policy: - title: Fortrolighedspolitik + title: Privatlivspolitik reactions: errors: limit_reached: Grænse for forskellige reaktioner nået diff --git a/config/locales/de.yml b/config/locales/de.yml index d5aa904f9..69284b09f 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -735,8 +735,8 @@ de: preamble: Lege fest, wie lange nutzergenerierte Inhalte auf deiner Mastodon-Instanz gespeichert werden. title: Cache & Archive default_noindex: - desc_html: Betrifft alle Benutzer, die diese Einstellung nicht selbst geändert haben - title: Benutzer standardmäßig von der Suchmaschinen-Indizierung ausnehmen + desc_html: Betrifft alle Benutzer*innen, die diese Einstellung bei sich nicht geändert haben + title: Profile standardmäßig von der Suchmaschinen-Indizierung ausnehmen discovery: follow_recommendations: Folgeempfehlungen preamble: Das Auffinden interessanter Inhalte ist wichtig, um neue Nutzer einzubinden, die Mastodon noch nicht kennen. Bestimme, wie verschiedene Suchfunktionen auf deinem Server funktionieren. diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml index 577cf1300..c4d41aa62 100644 --- a/config/locales/devise.de.yml +++ b/config/locales/devise.de.yml @@ -20,9 +20,9 @@ de: confirmation_instructions: action: E-Mail-Adresse verifizieren action_with_app: Bestätigen – und dann zur App %{app} zurückkehren - explanation: Du hast auf %{host} mit dieser E-Mail-Adresse ein Konto erstellt. Du bist nur noch einen Klick von der Aktivierung entfernt. Wenn du das nicht warst, kannst du diese E-Mail ignorieren. + explanation: Du hast mit dieser E-Mail-Adresse ein Konto auf %{host} erstellt. Du bist nur noch einen Klick von der Aktivierung entfernt. Wenn du das nicht warst, kannst du diese E-Mail ignorieren. explanation_when_pending: Du hast dich für eine Einladung bei %{host} mit dieser E-Mailadresse beworben. Sobald du deine E-Mailadresse bestätigst hast, werden wir deine Anfrage überprüfen. Du kannst dich in dieser Zeit nicht anmelden. Wenn deine Anfrage abgelehnt wird, werden deine Daten entfernt, also wird keine weitere Handlung benötigt. Wenn du das nicht warst, kannst du diese E-Mail ignorieren. - extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln des Servers</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>. + extra_html: Bitte beachte auch die <a href="%{terms_path}">Serverregeln</a> und <a href="%{policy_path}">unsere Datenschutzerklärung</a>. subject: 'Mastodon: Bestätigung deines Kontos bei %{instance}' title: E-Mail-Adresse verifizieren email_changed: diff --git a/config/locales/devise.et.yml b/config/locales/devise.et.yml index 9fd54d142..c15801f4c 100644 --- a/config/locales/devise.et.yml +++ b/config/locales/devise.et.yml @@ -48,15 +48,15 @@ et: title: Salasõna lähtestamine two_factor_disabled: explanation: Kontol on kaheastmeline autentimine välja lülitatud. Sisenemine on võimalik ainult kasutades e-postiaadressi ja salasõna. - subject: 'Mastodon: Kahe-etapine autentimine välja lülitatud' + subject: 'Mastodon: Kaheastmeline autentimine välja lülitatud' title: 2FA keelatud two_factor_enabled: explanation: Kontol on sisse lülitatud kaheastmeline autentimine. Sisenemiseks on vajalik ühekordne aeguv võti TOTP-rakenduse poolt. - subject: 'Mastodon: Kahe-etapine autentimine sisse lülitatud' + subject: 'Mastodon: kaheastmeline autentimine sisse lülitatud' title: 2FA lubatud two_factor_recovery_codes_changed: explanation: Eelmised taastekoodid on nüüd kehtetud ning loodud uued. - subject: 'Mastodon: Kahe-etapise autentimise taastuskoodid taasloodud' + subject: 'Mastodon: Kaheastmelise autentimise taastuskoodid taasloodud' title: 2FA taastekoodid muudetud unlock_instructions: subject: 'Mastodon: Lahti lukustamis juhendid' diff --git a/config/locales/devise.fy.yml b/config/locales/devise.fy.yml index 3a7ead83e..fd246227a 100644 --- a/config/locales/devise.fy.yml +++ b/config/locales/devise.fy.yml @@ -6,13 +6,13 @@ fy: send_instructions: Do ûntfangst fia in e-mailberjocht ynstruksjes hoe’tsto dyn account befêstigje kinst. Sjoch yn de map net-winske wannear’t neat ûntfongen waard. send_paranoid_instructions: As dyn e-mailadres yn de database stiet, ûntfangsto fia in e-mailberjocht ynstruksjes hoe’tsto dyn account befêstigje kinst. Sjoch yn de map net-winske wannear’t neat ûntfongen waard. failure: - already_authenticated: Do bist al oanmeld. + already_authenticated: Jo binne al oanmeld. inactive: Jo account is noch net aktivearre. invalid: "%{authentication_keys} of wachtwurd ûnjildich." last_attempt: Do hast noch ien besykjen oer eardat dyn account blokkearre wurdt. - locked: Dyn account is blokkearre. + locked: Jo account is blokkearre. not_found_in_database: "%{authentication_keys} of wachtwurd ûnjildich." - pending: Dyn account moat noch hieltyd beoardiele wurde. + pending: Jo account moat noch hieltyd beoardiele wurde. timeout: Dyn sesje is ferrûn, meld dy opnij oan. unauthenticated: Jo moatte oanmelde of registrearje. unconfirmed: Do moatst earst dyn account befêstigje. diff --git a/config/locales/devise.my.yml b/config/locales/devise.my.yml index 14b26845a..4a5500aed 100644 --- a/config/locales/devise.my.yml +++ b/config/locales/devise.my.yml @@ -3,14 +3,16 @@ my: devise: confirmations: confirmed: သင်၏ အီးမေးလ်လိပ်စာ အောင်မြင်စွာအတည်ပြုပြီးပါပြီ။ - send_instructions: မိနစ်အနည်းငယ်အတွင်း သင့်အီးမေးလ်လိပ်စာကို အတည်ပြုရန်အတွက် ညွှန်ကြားချက်များပါရှိသည့် အီးမေးလ်တစ်စောင်ကို သင့်ထံ ပေးပို့လိုက်မည်ဖြစ်ပါသည်။ ဤအီးမေးလ်ကို လက်ခံမရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ - send_paranoid_instructions: အကယ်၍ သင့်အီးမေးလ်လိပ်စာသည် ကျွန်ုပ်တို့၏ဒေတာဘေ့စ်တွင် ရှိနေပါက မိနစ်အနည်းငယ်အတွင်း သင့်အီးမေးလ်လိပ်စာကို အတည်ပြုရန်အတွက် ညွှန်ကြားချက်များပါရှိသည့် အီးမေးလ်တစ်စောင်ကို သင့်ထံ ပေးပို့လိုက်မည်ဖြစ်ပါသည်။ ဤအီးမေးလ်ကို လက်ခံမရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ + send_instructions: မိနစ်အနည်းငယ်အတွင်း သင့်အီးမေးလ်လိပ်စာကို အတည်ပြုရန်အတွက် ညွှန်ကြားချက်များပါရှိသည့် အီးမေးလ်တစ်စောင်ကို သင်ရရှိမည်ဖြစ်ပါသည်။ ဤအီးမေးလ်ကို လက်ခံမရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ + send_paranoid_instructions: အကယ်၍ သင့်အီးမေးလ်လိပ်စာသည် ကျွန်ုပ်တို့၏ဒေတာဘေ့စ်တွင် ရှိနေပါက မိနစ်အနည်းငယ်အတွင်း သင့်အီးမေးလ်လိပ်စာကို အတည်ပြုရန်အတွက် ညွှန်ကြားချက်များပါရှိသည့် အီးမေးလ်တစ်စောင်ကို သင်ရရှိမည်ဖြစ်ပါသည်။ ဤအီးမေးလ်ကို လက်ခံမရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ failure: already_authenticated: သင်ဝင်ရောက်ပြီးဖြစ်သည်။ + inactive: သင့်အကောင့်မှာ အတည်မဖြစ်သေးပါ။ invalid: မှားယွင်းသော %{authentication_keys} သို့မဟုတ် စကားဝှက် ဖြစ်ပါသည်။ last_attempt: သင့်အကောင့်ကို လော့ခ်မချမီ နောက်ထပ်ကြိုးစားမှုတစ်ခု ရှိသေးသည်။ locked: သင့်အကောင့်ကို လော့ခ်ချထားသည်။ not_found_in_database: မှားယွင်းသော %{authentication_keys} သို့မဟုတ် စကားဝှက် ဖြစ်ပါသည်။ + pending: သင့်အကောင့်အား စိစစ်ဆဲဖြစ်သည်။ timeout: သင့် Session သက်တမ်းကုန်သွားပါပြီ။ ရှေ့ဆက်ရန်အတွက် ကျေးဇူးပြုပြီး ထပ်မံဝင်ရောက်ပါ။ unauthenticated: ဆက်မလုပ်မီ သင်သည် အကောင့်ဝင်ရန် သို့မဟုတ် အကောင့်ဖွင့်ရန် လိုအပ်သည်။ unconfirmed: ဆက်မလုပ်မီ သင့်အီးမေးလ်လိပ်စာကို အတည်ပြုရပါမည်။ @@ -18,33 +20,46 @@ my: confirmation_instructions: action: အီးမေးလ်လိပ်စာကို အတည်ပြုပါ action_with_app: အတည်ပြုပြီး %{app} သို့ပြန်သွားပါ + explanation: "%{host} တွင် ဤအီးမေးလ်လိပ်စာဖြင့် သင် အကောင့်တစ်ခု ဖန်တီးထားပြီးဖြစ်သည်။ သင် ကလစ်တစ်ချက်နှိပ်ရုံဖြင့် အကောင့်အား အသက်ဝင်စေနိုင်သည်။ အကယ်၍ သင်ဖန်တီးထားခြင်းမဟုတ်ခဲ့လျှင် ယခုအီးမေးလ်အား ကျေးဇူးပြု၍ လျစ်လျူရှုပါ။" + explanation_when_pending: "%{host} သို့ ဖိတ်ခေါ်မှုတစ်ခုကို ဤအီးမေးလ်လိပ်စာဖြင့် သင်တောင်းဆိုခဲ့သည်။ အီးမေးလ်လိပ်စာကို သင်အတည်ပြုပြီးပါက ကျွန်ုပ်တို့အနေဖြင့် သင့်တောင်းဆိုမှုအား စိစစ်မည်ဖြစ်သည်။ သင့်အနေဖြင့် မိမိအကောင့်အတွင်း ဝင်ရောက်၍ အသေးစိတ်အချက်အလက်များအား ပြုပြင်နိုင်သည် (သို့) မိမိအကောင့်အား ဖျက်နိုင်သည်။ သို့သော် သင့်အကောင့်ကို အတည်ပြုမပြီးမချင်း သင့်အနေဖြင့် လုပ်ငန်းဆောင်တာအများစုအား ဆောင်ရွက်နိုင်မည် မဟုတ်ပေ။ သင်၏ အကောင့်တောင်းဆိုမှု ငြင်းဆန်ခံရပါက သင့်အချက်အလက်များအား ဖယ်ရှားပေးမည်ဖြစ်သည်။ သင့်အနေဖြင့် တခြားအရေးယူဆောင်ရွက်ရန် မလိုအပ်ပါ။ အကယ်၍ ယခုတောင်းဆိုမှုအား သင်ပြုလုပ်ထားခြင်းမဟုတ်ခဲ့လျှင် ယခုအီးမေးလ်အား ကျေးဇူးပြု၍ လျစ်လျူရှုပါ။" extra_html: ကျေးဇူးပြု၍ <a href="%{terms_path}">ဆာဗာစည်းမျဉ်းများ</a> နှင့် <a href="%{policy_path}">ကျွန်ုပ်တို့၏ဝန်ဆောင်မှုစည်းမျဉ်းများ</a>ကိုလည်း စစ်ဆေးကြည့်ပါ။ subject: Mastodon - %{instance} အတွက် အတည်ပြုချက် ညွှန်ကြားချက်များ title: အီးမေးလ်လိပ်စာကို အတည်ပြုပါ email_changed: explanation: သင့်အကောင့်အတွက် အီးမေးလ်လိပ်စာကို ပြောင်းလဲနေပါသည် - + extra: သင့်အီးမေးလ်လိပ်စာ မပြောင်းထားပါက တစ်စုံတစ်ဦးသည် သင့်အကောင့်သို့ ဝင်ရောက်ခွင့်ရရှိသွားနိုင်ပါသည်။ သင့်အကောင့် လော့ခ်ကျသွားပါက သင့်စကားဝှက်ကို ချက်ချင်းပြောင်းပါ သို့မဟုတ် ဆာဗာစီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။ subject: 'Mastodon: အီးမေးလ်ပြောင်းလဲသွားပြီ' title: အီးမေးလ်လိပ်စာအသစ် password_change: explanation: သင့်အကောင့်အတွက် စကားဝှက်ကို ပြောင်းလဲလိုက်ပါပြီ။ + extra: သင့်စကားဝှက် မပြောင်းထားပါက တစ်စုံတစ်ဦးသည် သင့်အကောင့်သို့ ဝင်ရောက်ခွင့်ရရှိသွားနိုင်ပါသည်။ သင့်အကောင့် လော့ခ်ကျသွားပါက သင့်စကားဝှက်ကို ချက်ချင်းပြောင်းပါ သို့မဟုတ် ဆာဗာစီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။ subject: 'Mastodon: စကားဝှက်ပြောင်းလဲသွားပြီ' title: စကားဝှက်ပြောင်းလဲသွားပြီ reconfirmation_instructions: explanation: သင်၏အီးမေးလ်လိပ်စာပြောင်းရန် လိပ်စာအသစ်အတည်ပြုပါ။ + extra: တစ်ကယ်လို့ ပြောင်းလဲမှုကို သင်တောင်းဆိုတာမဟုတ်ဘူးဆိုရင် ဤအီးမေးလ်ကို လျစ်လျူရှုလိုက်ပါ။ အပေါ်မှ လင့်ခ်ကိုမဝင်မချင်း သင့်အီးမေးလ်ပြောင်းသွားမည်မဟုတ်ပါ subject: 'Mastodon: %{instance} အတွက်အီးမေးလ်အတည်ပြုပါ' title: အီးမေးလ်လိပ်စာစစ်ဆေးပါ reset_password_instructions: action: စကားဝှက်ပြောင်းမည် + explanation: သင့်အကောင့်အတွက် စကားဝှက်အသစ်တစ်ခု တောင်းဆိုခဲ့သည်။ + extra: သင်မတောင်းဆိုထားပါက ဤအီးမေးလ်ကို လျစ်လျူရှုလိုက်ပါ။ အထက်ဖော်ပြပါလင့်ခ်ကို သင်ဝင်ရောက်ပြီး အသစ်တစ်ခုမဖန်တီးမချင်း သင့်စကားဝှက်သည် ပြောင်းလဲမည်မဟုတ်ပါ။ subject: 'Mastodon: စကားဝှက်ညွှန်ကြားချက် ပြန်လည်သတ်မှတ်မည်' title: စကားဝှက်ပြန်လည်သတ်မှတ်မည် two_factor_disabled: + explanation: သင့်အကောင့်အတွက် နှစ်ဆင့်ခံလုံခြုံရေးစနစ်အထောက်အထားပြခြင်းကို ပိတ်ထားသည်။ အီးမေးလ်လိပ်စာနှင့် စကားဝှက်ကိုသာ အသုံးပြု၍ အကောင့်ဝင်ရောက်နိုင်ပါသည်။ subject: 'Mastodon: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ပိတ်ထားသည်' title: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ပိတ်ထားသည် two_factor_enabled: + explanation: သင့်အကောင့်အတွက် နှစ်ဆင့်ခံလုံခြုံရေးစနစ်အထောက်အထားပြခြင်းကို ဖွင့်ထားသည်။ TOTP အက်ပ်မှ ထုတ်ပေးသည့် တိုကင်တစ်ခုမှာ အကောင့်ဝင်ရန်အတွက် လိုအပ်ပါသည်။ subject: 'Mastodon: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ဖွင့်ထားသည်' title: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ဖွင့်ထားသည် two_factor_recovery_codes_changed: + explanation: ယခင်ပြန်လည်ရယူသည့်ကုဒ်များမှာ မမှန်ကန်သောကြောင့် အသစ်များကို ထုတ်ပေးခဲ့သည်။ + subject: Mastodon - နှစ်ဆင့်ခံလုံခြုံရေး ပြန်လည်ရယူသည့်ကုဒ်များကို ပြန်လည်ထုတ်ပေးခြင်း title: နှစ်ဆင့်ခံလုံခြုံရေးစနစ် ပြန်လည်ရယူသည့်ကုဒ်နံပါတ်များ ပြောင်းလဲခဲ့သည် + unlock_instructions: + subject: Mastodon - ညွှန်ကြားချက်များကို လော့ခ်ဖွင့်ပါ webauthn_credential: added: explanation: ဖော်ပြပါလုံခြုံရေးသော့ချက်အား သင့်အကောင့်ထဲသို့ထည့်ပြီးပါပြီ @@ -55,16 +70,43 @@ my: subject: 'Mastodon: လုံခြုံရေးသော့ချက် ဖျက်လိုက်ပါပြီ' title: လုံခြုံရေးသော့ချက်များထဲမှတစ်ခု ဖျက်လိုက်ပါပြီ webauthn_disabled: + explanation: သင့်အကောင့်အတွက် လုံခြုံရေးကီးများဖြင့် အထောက်အထားပြခြင်းကို ပိတ်ထားသည်။ TOTP အက်ပ်မှထုတ်ပေးသည့် တိုကင်ကိုသာ အသုံးပြု၍ အကောင့်ဝင်ရောက်နိုင်ပါသည်။ + subject: Mastodon - လုံခြုံရေးကီးများဖြင့် အထောက်အထားစိစစ်ခြင်းကို ပိတ်ထားသည် title: လုံခြုံရေးသော့ချက်များ ပိတ်ပြီးပါပြီ webauthn_enabled: + explanation: သင့်အကောင့်အတွက် လုံခြုံရေးကီး အထောက်အထားစိစစ်ခြင်းကို ဖွင့်ထားသည်။ အကောင့်ဝင်ရန်အတွက် သင်၏လုံခြုံရေးကီးကို ယခုအသုံးပြုနိုင်ပါပြီ။ + subject: Mastodon - လုံခြုံရေးကီး အထောက်အထားစိစစ်ခြင်းကို ဖွင့်ထားသည် title: လုံခြုံရေးသော့ချက်များ ဖွင့်ပြီးပါပြီ + omniauth_callbacks: + failure: "“%{reason}” ကြောင့် %{kind} မှ သင့်ကို စစ်မှန်ကြောင်း အထောက်အထား မပြနိုင်ပါ။" + success: "%{kind} အကောင့်မှ အထောက်အထားပြပြီးပါပြီ။" + passwords: + no_token: စကားဝှက်ပြန်လည်သတ်မှတ်ခြင်းအီးမေးလ်မှ မလာပါက ဤစာမျက်နှာကို သင်ဝင်ရောက်၍မရနိုင်ပါ။ အကယ်၍ ၎င်းမှလာပါက ပေးထားသော URL အပြည့်အစုံကို အသုံးပြုရပါမည်။ + send_instructions: အကယ်၍ သင့်အီးမေးလ်လိပ်စာသည် ကျွန်ုပ်တို့၏ဒေတာဘေ့စ်တွင် ရှိနေပါက မိနစ်အနည်းငယ်အတွင်း သင့်အီးမေးလ်လိပ်စာတွင် စကားဝှက်ပြန်လည်ရယူရေးလင့်ခ် ရရှိမည်ဖြစ်ပါသည်။ ဤအီးမေးလ်ကို လက်ခံမရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ + send_paranoid_instructions: အကယ်၍ သင့်အီးမေးလ်လိပ်စာသည် ကျွန်ုပ်တို့၏ဒေတာဘေ့စ်တွင် ရှိနေပါက မိနစ်အနည်းငယ်အတွင်း သင့်အီးမေးလ်လိပ်စာတွင် စကားဝှက်ပြန်လည်ရယူရေးလင့်ခ် ရရှိမည်ဖြစ်ပါသည်။ ဤအီးမေးလ်ကို လက်ခံမရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ + updated: သင့်စကားဝှက်ကို အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီ။ သင်သည် ယခု အကောင့်ဝင်ထားပြီးဖြစ်ပါသည်။ + updated_not_active: သင့်စကားဝှက်ကို အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီ။ registrations: + destroyed: တာ့တာ၊ သင့်အကောင့်ကို ပယ်ဖျက်လိုက်ပါပြီ။ မကြာခင် ပြန်တွေ့နိုင်ရန်မျှော်လင့်မိပါသည်။ + signed_up: ကြိုဆိုပါသည်။ သင်သည် အောင်မြင်စွာ စာရင်းသွင်းပြီးပါပြီ။ + signed_up_but_inactive: သင်သည် အောင်မြင်စွာ အကောင့်ဖွင့်ပြီးပါပြီ။ သို့သော်လည်း သင့်အကောင့် အတည်မပြုရသေးသောကြောင့် ဝင်၍မရနိုင်ပါ။ + signed_up_but_locked: သင်သည် အောင်မြင်စွာ အကောင့်ဖွင့်ပြီးပါပြီ။ သို့သော်လည်း သင့်အကောင့်လော့ခ်ချထားသောကြောင့် လက်မှတ်ထိုးဝင်၍မရနိုင်ပါ။ + signed_up_but_pending: အတည်ပြုချက်လင့်ခ်ပါရှိသော စာတိုတစ်စောင်ကို သင့်အီးမေးလ်လိပ်စာသို့ ပေးပို့လိုက်ပါပြီ။ လင့်ခ်ကို နှိပ်ပြီးနောက် သင့်အက်ပလီကေးရှင်းကို ကျွန်ုပ်တို့ ပြန်လည်စစ်ဆေးပါမည်။ အတည်ပြုပြီးပါက သင့်ထံ အကြောင်းကြားပါမည်။ + signed_up_but_unconfirmed: အကောင့်ဖွင့်ရန်အတွက် လင့်ခ်တစ်ခုကို ထောက်ခံချက်အီးမေးလ််နှင့်အတူပို့ပေးလိုက်ပါပြီ။ သင့်အကောင့်ဖွင့်နိုင်ရန် လင့်ခ်ကိုဝင်ရောက်ပေးပါ။ အီးမေးလ်မတွေ့ပါက စပမ်းဖိုင်တွဲထဲတွင်စစ်ကြည့်ပါ။ + update_needs_confirmation: သင့်အကောင့်ကို မွမ်းမံပြင်ဆင်ထားသော်လည်း သင့်အီးမေးလ်လိပ်စာအသစ်ကို အတည်ပြုရန် လိုအပ်ပါသည်။ ကျေးဇူးပြု၍ သင့်အီးမေးလ်ကို စစ်ဆေးပြီး သင့်အီးမေးလ်လိပ်စာအသစ်ကို အတည်ပြုရန်အတွက် အတည်ပြုလင့်ခ်အား နှိပ်ပါ။ ဤအီးမေးလ်ကို မရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ updated: သင့်အကောင့်အားအောင်မြင်စွာ ပြင်ဆင်ပြီးပါပြီ။ sessions: already_signed_out: အောင်မြင်စွာအကောင့်မှထွက်ပြီးပါပြီ။ signed_in: အောင်မြင်စွာအကောင့်ဝင်ပြီးပါပြီ။ signed_out: အောင်မြင်စွာအကောင့်မှထွက်ပြီးပါပြီ။ + unlocks: + send_instructions: မိနစ်အနည်းငယ်အတွင်း သင့်အကောင့်လော့ခ်ဖွင့်နည်းအတွက် ညွှန်ကြားချက်များပါရှိသည့် အီးမေးလ်တစ်စောင်ကို သင်လက်ခံရရှိမည်ဖြစ်သည်။ ဤအီးမေးလ်ကို မရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ + send_paranoid_instructions: အကယ်၍ သင့်တွင် အကောင့်ရှိပါက မိနစ်အနည်းငယ်အတွင်း လော့ခ်ဖွင့်နည်းအတွက် ညွှန်ကြားချက်များပါရှိသည့် အီးမေးလ်တစ်စောင်ကို သင်ရရှိမည်ဖြစ်သည်။ ဤအီးမေးလ်ကို လက်ခံမရရှိပါက သင်၏ Spam ဖိုင်ကို စစ်ဆေးပါ။ + unlocked: သင့်အကောင့်ကို လော့ခ်ဖွင့်ပြီးပါပြီ။ ရှေ့ဆက်ရန်အတွက် အကောင့်ဝင်ပါ။ errors: messages: + already_confirmed: အတည်ပြုပြီးဖြစ်သည်။ ကျေးဇူးပြု၍ အကောင့်ဝင်ကြည့်ပါ။ + confirmation_period_expired: "%{period} အတွင်း အတည်ပြုရန် လိုအပ်ပြီး အသစ်တစ်ခု တောင်းဆိုပါ" expired: သည် သက်တမ်းကျော်လွန်သွားပြီ။ ကျေးဇူးပြု၍အသစ်တစ်ခု တောင်းဆိုပါ not_found: ရှာမတွေ့ပါ + not_locked: လော့ခ် မချထားပါ diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index 85b775b0b..3c1968e50 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -20,7 +20,7 @@ zh-TW: confirmation_instructions: action: 驗證電子郵件地址 action_with_app: 確認並返回 %{app} - explanation: 您已經使用此電子郵件地址在 %{host} 上建立了一個帳號。距離啟用它只剩一點之遙了。如果這不是您本人,請忽略此郵件。 + explanation: 您已經在 %{host} 上以此電子郵件地址建立了一支帳號。您距離啟用它只剩一點之遙了。若這不是您,請忽略此信件。 explanation_when_pending: 您使用此電子郵件地址申請了 %{host} 的邀請。當您確認電子郵件地址後我們將審核您的申請。您可以在登入後變更詳細資訊或刪除您的帳號,但直到您的帳號被核准之前,您無法操作大部分的功能。若您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您本人,請忽略此郵件。 extra_html: 同時也請看看<a href="%{terms_path}">伺服器規則</a>與<a href="%{policy_path}">服務條款</a>。 subject: Mastodon:%{instance} 確認說明 diff --git a/config/locales/doorkeeper.ast.yml b/config/locales/doorkeeper.ast.yml index 628de6524..61d6c4ad1 100644 --- a/config/locales/doorkeeper.ast.yml +++ b/config/locales/doorkeeper.ast.yml @@ -14,6 +14,8 @@ ast: destroy: Destruyir edit: Editar submit: Unviar + confirmations: + destroy: "¿De xuru que quies facer esta aición?" form: error: "¡Meca! Revisa los errores posibles del formulariu" help: @@ -46,6 +48,8 @@ ast: authorized_applications: buttons: revoke: Revocar + confirmations: + revoke: "¿De xuru que quies facer esta aición?" index: description_html: Estes son les aplicaciones que puen acceder a la cuenta cola API. Si equí hai aplicaciones que nun conoces o hai dalguna aplicación que nun funciona correutamente, pues revocar el so accesu. never_used: Enxamás s'usó @@ -94,7 +98,7 @@ ast: admin:write: modifica tolos datos del sirvidor crypto: usa'l cifráu de puntu a puntu follow: modifica les rellaciones de les cuentes - push: receición d'avisos push + push: recibe avisos push read: llee tolos datos de les cuentes read:accounts: mira la información de les cuentes read:blocks: mira les cuentes bloquiaes @@ -118,5 +122,5 @@ ast: write:media: xube ficheros multimedia write:mutes: desactiva los avisos de perfiles ya de conversaciones write:notifications: borra los avisos - write:reports: informa d'otres perfiles + write:reports: informa d'otros perfiles write:statuses: espubliza artículos diff --git a/config/locales/doorkeeper.ko.yml b/config/locales/doorkeeper.ko.yml index 504fefd28..584ff7219 100644 --- a/config/locales/doorkeeper.ko.yml +++ b/config/locales/doorkeeper.ko.yml @@ -4,7 +4,7 @@ ko: attributes: doorkeeper/application: name: 애플리케이션 이름 - redirect_uri: 리다이렉트 URI + redirect_uri: 리디렉트 URI scopes: 범위 website: 애플리케이션 웹사이트 errors: @@ -15,7 +15,7 @@ ko: fragment_present: fragment를 포함할 수 없습니다 invalid_uri: 올바른 URI 이어야 합니다. relative_uri: 절대경로 URI 이어야 합니다 - secured_uri: " HTTPS/SSL URI 이어야 합니다." + secured_uri: HTTPS/SSL URI 이어야 합니다. doorkeeper: applications: buttons: @@ -31,16 +31,16 @@ ko: form: error: 이런! 오류를 확인하세요 help: - native_redirect_uri: "%{native_redirect_uri} 을/를 이용해 로컬 테스트를 할 수 있습니다" + native_redirect_uri: "%{native_redirect_uri}에서 로컬 테스트를 할 수 있습니다." redirect_uri: 한 줄에 하나의 URI를 작성하세요 scopes: 스페이스로 범위를 구분하세요. 빈 칸으로 놔두면 기본 범위를 사용합니다. index: application: 애플리케이션 callback_url: 콜백 URL delete: 삭제 - empty: 애플리케이션이 없습니다. + empty: 앱이 없습니다. name: 이름 - new: 새 애플리케이션 + new: 새로운 앱 scopes: 범위 show: 표시 title: 내 응용프로그램 @@ -52,7 +52,7 @@ ko: callback_urls: 콜백 URL scopes: 범위 secret: 클라이언트 비밀키 - title: '애플리케이션: %{name}' + title: '앱: %{name}' authorizations: buttons: authorize: 승인 @@ -60,11 +60,11 @@ ko: error: title: 오류가 발생하였습니다 new: - prompt_html: "%{client_name}이 당신의 계정에 대한 접근 권한을 요청합니다. 이것은 제3자의 응용프로그램입니다. <strong>이것을 신뢰하지 않는다면, 권한을 승인하지 말아야 합니다.</strong>" + prompt_html: "%{client_name} 제3자 앱이 귀하의 계정에 접근하기 위한 권한을 요청했습니다. <strong>이 앱을 신뢰할 수 없다면 요청을 승인하지 마십시오.</strong>" review_permissions: 권한 검토 title: 승인 필요 show: - title: 이 승인 코드를 복사하여 애플리케이션에 붙여넣으세요 + title: 이 승인 코드를 복사해 앱에 붙여 넣어야 합니다. authorized_applications: buttons: revoke: 삭제 @@ -72,7 +72,7 @@ ko: revoke: 확실합니까? index: authorized_at: "%{date}에 승인됨" - description_html: 당신의 계정에 API를 통해 접근 가능한 응용프로그램의 목록입니다. 알 수 없는 응용프로그램, 혹은 잘못된 행동을 하고 있는 응용프로그램이 있다면, 권한을 취소할 수 있습니다. + description_html: 이 계정에 API를 통해 접근 가능한 앱의 목록입니다. 알 수 없는 앱이나 잘못된 행위를 하는 앱이 있다면 권한을 취소할 수 있습니다. last_used_at: "%{date}에 마지막으로 사용됨" never_used: 사용되지 않음 scopes: 권한 @@ -82,7 +82,7 @@ ko: messages: access_denied: 리소스 소유자 또는 인증 서버가 요청을 거부했습니다. credential_flow_not_configured: Doorkeeper.configure.resource_owner_from_credentials의 설정이 되어있지 않아 리소스 소유자 암호 자격증명이 실패하였습니다. - invalid_client: 알 수 없는 클라이언트이기 때문에 클라이언트 인증이 실패하였습니다, 클라이언트 자격증명이 포함되지 않았거나, 지원 되지 않는 메소드입니다. + invalid_client: 클라이언트를 확인할 수 없기 때문에 인증이 실패하였습니다. 클라이언트 자격 증명이 포함되지 않았거나 지원되지 않는 메소드입니다. invalid_grant: 제공된 권한 부여가 잘못되거나, 만료되었거나, 취소되었거나, 권한 부여 요청에 사용된 리디렉션 URI가 일치하지 않거나, 다른 클라이언트에 지정되었습니다. invalid_redirect_uri: 리디렉션 URI가 올바르지 않습니다 invalid_request: @@ -104,14 +104,14 @@ ko: flash: applications: create: - notice: 애플리케이션이 생성 되었습니다. + notice: 앱이 생성 되었습니다. destroy: - notice: 애플리케이션이 삭제 되었습니다. + notice: 앱을 삭제했습니다. update: - notice: 애플리케이션이 갱신 되었습니다. + notice: 앱을 갱신했습니다. authorized_applications: destroy: - notice: 애플리케이션이 삭제되었습니다. + notice: 운영자에 의해 앱이 해지되었습니다. grouped_scopes: access: read: 읽기 전용 권한 @@ -142,7 +142,7 @@ ko: layouts: admin: nav: - applications: 애플리케이션 + applications: 앱 oauth2_provider: OAuth2 제공자 application: title: OAuth 인증이 필요합니다 @@ -164,26 +164,26 @@ ko: admin:write:ip_blocks: IP 차단에 모더레이션 조치 취하기 admin:write:reports: 신고에 모더레이션 조치 취하기 crypto: 종단간 암호화 사용 - follow: 계정의 관계를 수정 - push: 푸시 알림을 받기 - read: 계정의 모든 데이터를 읽기 - read:accounts: 계정의 정보를 보기 - read:blocks: 차단을 보기 + follow: 계정 관계 수정 + push: 푸시 알림 받기 + read: 계정의 모든 데이터 읽기 + read:accounts: 계정 정보 보기 + read:blocks: 차단 보기 read:bookmarks: 내 북마크 보기 - read:favourites: 관심글을 보기 - read:filters: 필터를 보기 - read:follows: 팔로우를 보기 - read:lists: 리스트를 보기 - read:mutes: 뮤트를 보기 + read:favourites: 좋아요 보기 + read:filters: 필터 보기 + read:follows: 팔로우 보기 + read:lists: 리스트 보기 + read:mutes: 뮤트 보기 read:notifications: 알림 보기 read:reports: 신고 보기 read:search: 당신의 권한으로 검색 - read:statuses: 게시물 모두 보기 + read:statuses: 모든 게시물 보기 write: 계정 정보 수정 write:accounts: 프로필 수정 - write:blocks: 계정이나 도메인 차단 + write:blocks: 계정 및 도메인 차단 write:bookmarks: 게시물을 북마크에 넣기 - write:conversations: 뮤트와 대화 삭제 + write:conversations: 뮤트 및 대화 삭제 write:favourites: 관심글 지정 write:filters: 필터 만들기 write:follows: 사람을 팔로우 diff --git a/config/locales/doorkeeper.my.yml b/config/locales/doorkeeper.my.yml index 345a3b264..8a92d7e79 100644 --- a/config/locales/doorkeeper.my.yml +++ b/config/locales/doorkeeper.my.yml @@ -12,6 +12,7 @@ my: doorkeeper/application: attributes: redirect_uri: + fragment_present: အပိုင်းတစ်ပိုင်း မပါဝင်နိုင်ပါ။ invalid_uri: သည် မှန်ကန်သော URI ဖြစ်ရမည်။ relative_uri: URI ဖြစ်ရမည်။ secured_uri: သည် HTTPS/SSL URI ဖြစ်ရမည်။ @@ -59,6 +60,7 @@ my: error: title: အမှားအယွင်းတစ်ခု ဖြစ်ပေါ်ခဲ့သည် new: + prompt_html: "%{client_name} က သင့်အကောင့်သို့ ဝင်ရောက်ရန် ခွင့်ပြုချက်ရယူလိုပါသည်။ ၎င်းမှာ ပြင်ပကြားခံအက်ပလီကေးရှင်းတစ်ခုဖြစ်သည်။ <strong>သင် မယုံကြည်ပါက ၎င်းကိုခွင့်မပြုသင့်ပါ။</strong>" review_permissions: ခွင့်ပြုချက်များကို ပြန်လည်သုံးသပ်ပါ title: ခွင့်ပြုချက် လိုအပ်သည် show: @@ -74,16 +76,29 @@ my: last_used_at: "%{date} တွင် နောက်ဆုံးအသုံးပြုခဲ့သည်" never_used: မသုံးဖူးပါ scopes: ခွင့်ပြုချက်များ + superapp: အတွင်းပိုင်း title: ခွင့်ပြုထားသော အက်ပလီကေးရှင်းများ errors: messages: access_denied: မူလပိုင်ရှင် သို့မဟုတ် ခွင့်ပြုချက်ရှိသောဆာဗာမှ တောင်းဆိုချက်ကို ငြင်းပယ်ခဲ့သည်။ credential_flow_not_configured: Doorkeeper.configure.resource_owner_from_credentials ကို သတ်မှတ်မထားသည့်အတွက် မူလပိုင်ရှင် စကားဝှက် အထောက်အထားများထည့်သွင်းခြင်းမှာ မအောင်မြင်တော့ပါ။ + invalid_client: Client အထောက်အထားစိစစ်မှု မအောင်မြင်ခြင်းမှာ အမည်မသိ Client ဖြစ်ခြင်း၊ Client စစ်မှန်ကြောင်းအထောက်အထားမပါဝင်ခြင်း သို့မဟုတ် ပံ့ပိုးမထားသည့် အထောက်အထားဖြစ်နေခြင်းကြောင့် ဖြစ်ပါသည်။ invalid_redirect_uri: ပြန်ညွှန်းထားခြင်းတွင် ပါဝင်သော URI မှာ မမှန်ကန်ပါ။ + invalid_request: + missing_param: ပျောက်နေသည့် လိုအပ်သောအရာ - %{value}။ + request_not_authorized: ခွင့်ပြုချက်တောင်းခံရန် လိုအပ်ပါသည်။ တောင်းဆိုမှုခွင့်ပြုချက်အတွက် လိုအပ်သောအရာမှာ ပျောက်ဆုံးနေခြင်း သို့မဟုတ် မမှန်ကန်ခြင်း ကြောင့်ဖြစ်ပါသည်။ + unknown: တောင်းဆိုချက်တွင် ပံ့ပိုးမထားသော တန်ဖိုးတစ်ခုပါဝင်သည့် လိုအပ်သောအချက်အလက်တစ်ခု ပျောက်ဆုံးနေပါသည် သို့မဟုတ် ပုံစံမှားယွင်းနေပါသည်။ + invalid_resource_owner: ပံ့ပိုးပေးထားသည့် မူလပိုင်ရှင်အထောက်အထားများမှာ မမှန်ကန်ပါ သို့မဟုတ် မူလပိုင်ရှင်ကို ရှာမတွေ့ပါ။ + invalid_scope: တောင်းဆိုထားသော နယ်ပယ်မှာ မမှန်ကန်ခြင်း၊ မသိခြင်း သို့မဟုတ် ပုံစံမမှန်ကန်ခြင်းတို့ကြောင့် ဖြစ်ပါသည်။ invalid_token: expired: အသုံးပြုခွင့် တိုကင် သက်တမ်းကုန်သွားပါပြီ revoked: အသုံးပြုခွင့်တိုကင်ကို ရုပ်သိမ်းခဲ့သည် unknown: အသုံးပြုခွင့်တိုကင်မှာ မမှန်ကန်ပါ + resource_owner_authenticator_not_configured: Doorkeeper.configure.resource_owner_authenticator ကို ပြုပြင်မွမ်းမံမှုအားဖယ်ရှားထားခြင်းကြောင့် မူလပိုင်ရှင်ရှာဖွေခြင်းမှာ မအောင်မြင်ပါ။ + server_error: ခွင့်ပြုထားသောဆာဗာသည် တောင်းဆိုချက်ကို မဖြည့်ဆည်းပေးနိုင်သည့် မမျှော်လင့်ထားသော အခြေအနေတစ်ခုကို ကြုံတွေ့ခဲ့ရသည်။ + temporarily_unavailable: ဆာဗာမှာ ယာယီအလုပ်များပိုလုပ်နေရခြင်း သို့မဟုတ် ဆာဗာပြုပြင်ထိန်းသိမ်းမှုတို့ကြောင့် တောင်းဆိုချက်ကို လောလောဆယ်တွင် ကိုင်တွယ်နိုင်ခြင်းမရှိသေးပါ။ + unauthorized_client: ဤနည်းလမ်းကို အသုံးပြု၍ Client မှ ဤတောင်းဆိုမှုကို ဆောင်ရွက်ခွင့်မရှိပါ။ + unsupported_grant_type: တရားဝင်ခွင့်ပြုချက်အမျိုးအစားကို ခွင့်ပြုချက်ဆာဗာမှ မပံ့ပိုးထားပါ။ unsupported_response_type: ခွင့်ပြုထားသောဆာဗာသည် ဤတုံ့ပြန်မှုအမျိုးအစားကို မပံ့ပိုးပါ။ flash: applications: @@ -100,6 +115,7 @@ my: access: read: ဖတ်ခွင့်သာရှိသည် read/write: ဖတ်ပြီးပြင်ဆင်ခွင့်ရှိသည် + write: ပြင်ခွင့်သာရှိသည် title: accounts: အကောင့်များ admin/accounts: အကောင့်စီမံခန့်ခွဲမှု @@ -132,6 +148,7 @@ my: scopes: admin:read: ဆာဗာရှိ အချက်အလက်အားလုံးကို ဖတ်ပါ admin:read:accounts: အကောင့်အားလုံး၏ အရေးကြီးသော သတင်းအချက်အလက်များကို ဖတ်ပါ + admin:read:canonical_email_blocks: ပိတ်ပင်ထားသော Canonical Email အားလုံး၏ အရေးကြီးသောသတင်းအချက်အလက်များကို ဖတ်ပါ admin:read:domain_allows: ခွင့်ပြုထားသော ဒိုမိန်းအားလုံး၏ အရေးကြီးသော သတင်းအချက်အလက်များကို ဖတ်ပါ admin:read:domain_blocks: ပိတ်ပင်ထားသော ဒိုမိန်းအားလုံး၏ အရေးကြီးသော သတင်းအချက်အလက်များကို ဖတ်ပါ admin:read:email_domain_blocks: ပိတ်ပင်ထားသော အီးမေးလ်ဒိုမိန်းအားလုံး၏ အရေးကြီးသောသတင်းအချက်အလက်များကို ဖတ်ပါ @@ -139,6 +156,7 @@ my: admin:read:reports: မှတ်တမ်းများနှင့် တိုင်ကြားထားသောအကောင့်များအားလုံး၏ အရေးကြီးသော အချက်အလက်ကို ဖတ်ပါ။ admin:write: ဆာဗာပေါ်ရှိ အချက်အလက်အားလုံးကို ပြင်ဆင်ပါ admin:write:accounts: အကောင့်များအား စိစစ်လုပ်ဆောင်မှုများ ဆောင်ရွက်ပါ + admin:write:canonical_email_blocks: Canonical Email ပိတ်ပင်ထားမှုများအား စိစစ်လုပ်ဆောင်မှုများ ဆောင်ရွက်ပါ admin:write:domain_allows: ခွင့်ပြုထားသောဒိုမိန်းပေါ်တွင် စိစစ်လုပ်ဆောင်ချက်များ ဆောင်ရွက်ပါ admin:write:domain_blocks: ပိတ်ပင်ထားသောဒိုမိန်းပေါ်တွင် စိစစ်လုပ်ဆောင်ချက်များ ဆောင်ရွက်ပါ admin:write:email_domain_blocks: ပိတ်ပင်ထားသော အီးမေးလ်ဒိုမိန်းပေါ်တွင် စိစစ်လုပ်ဆောင်ချက်များ ဆောင်ရွက်ပါ @@ -158,6 +176,7 @@ my: read:mutes: သင်အသံပိတ်ထားမှုများကို ကြည့်ပါ read:notifications: သင့်အသိပေးချက်များကို ကြည့်ပါ read:reports: သင့်မှတ်တမ်းများကို ကြည့်ပါ + read:search: သင့်ကိုယ်စား ရှာဖွေပါ read:statuses: ပို့စ်အားလုံးကို ကြည့်ပါ write: သင့်အကောင့်၏ အချက်အလက်အားလုံးကို ပြင်ဆင်ပါ write:accounts: သင့်ပရိုဖိုင်ကို ပြင်ဆင်ပါ diff --git a/config/locales/doorkeeper.sr.yml b/config/locales/doorkeeper.sr.yml index 887a21895..db399b05f 100644 --- a/config/locales/doorkeeper.sr.yml +++ b/config/locales/doorkeeper.sr.yml @@ -122,16 +122,18 @@ sr: admin/accounts: Администрација налога admin/all: Све функције администрације admin/reports: Администрација пријава + all: Потпуни приступ вашем Mastodon налогу blocks: Блокирани bookmarks: Обележивачи conversations: Разговори crypto: End-to-end енкрипција favourites: Омиљени filters: Филтери + follow: Праћења, игнорисања и блокирања follows: Праћени lists: Листе media: Мултимедијални прилози - mutes: Утишани + mutes: Игнорисани notifications: Обавештења push: Прослеђена обавештења reports: Пријаве @@ -157,7 +159,7 @@ sr: admin:write:ip_blocks: изврши модераторске активности на IP блоковима admin:write:reports: вршење модераторских активности над извештајима crypto: коришћење end-to-end енкрипције - follow: прати, блокира, одблокира и отпрати налоге + follow: мења односе налога push: примање прослеђених обавештења read: чита податке Вашег налога read:accounts: погледај информације о налозима @@ -167,7 +169,7 @@ sr: read:filters: погледај своје филтере read:follows: погледај кога пратиш read:lists: погледај своје листе - read:mutes: погледај своје утишане + read:mutes: погледај игнорисања read:notifications: погледај своја обавештења read:reports: погледај своје пријаве read:search: претражи у своје име @@ -176,13 +178,13 @@ sr: write:accounts: измени свој профил write:blocks: блокирај налоге и домене write:bookmarks: обележи објаве - write:conversations: утишај и обриши разговоре + write:conversations: игнориши и избриши разговоре write:favourites: омиљене објаве write:filters: креирај филтере write:follows: прати кориснике write:lists: креирај листе write:media: отпреми медијске датотеке - write:mutes: утишај коринсике и разговоре + write:mutes: игнориши кориснике и разговоре write:notifications: обриши своја обавештења write:reports: пријави друге кориснике write:statuses: објави објаве diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml index da5597c85..6d07717e1 100644 --- a/config/locales/doorkeeper.zh-TW.yml +++ b/config/locales/doorkeeper.zh-TW.yml @@ -131,7 +131,7 @@ zh-TW: filters: 過濾器 follow: 跟隨、靜音與封鎖 follows: 跟隨的使用者 - lists: 名單 + lists: 列表 media: 多媒體附加檔案 mutes: 靜音 notifications: 通知 @@ -168,12 +168,12 @@ zh-TW: push: 接收帳號的推播通知 read: 讀取您所有的帳號資料 read:accounts: 檢視帳號資訊 - read:blocks: 檢視您的封鎖名單 + read:blocks: 檢視您的封鎖列表 read:bookmarks: 檢視您的書籤 read:favourites: 檢視您收藏的最愛 read:filters: 檢視您的過濾條件 read:follows: 檢視您跟隨的人 - read:lists: 檢視您的名單 + read:lists: 檢視您的列表 read:mutes: 檢視您靜音的人 read:notifications: 檢視您的通知 read:reports: 檢視您的檢舉 diff --git a/config/locales/el.yml b/config/locales/el.yml index 9a0ac8dbd..7994f7174 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -278,6 +278,15 @@ el: suspend_account_html: Ο/Η %{name} ανέστειλε τον λογαριασμό του/της %{target} unassigned_report_html: Ο/Η %{name} αποδέσμευσε την αναφορά %{target} unblock_email_account_html: "%{name} ξεμπλόκαρε τη διεύθυνση ηλεκτρονικού ταχυδρομείου του %{target}" + unsensitive_account_html: Ο/Η %{name} επισήμανε τα πολυμέσα του/της %{target} ως ευαίσθητα + unsilence_account_html: Ο/Η %{name} αφαίρεσε το όριο του λογαριασμού του/της %{target} + unsuspend_account_html: Ο/Η %{name} επανέφερε τον λογαριασμό του/της %{target} + update_announcement_html: Ο/Η %{name} ενημέρωση την ανακοίνωση %{target} + update_custom_emoji_html: Ο/Η %{name} ενημέρωσε το emoji %{target} + update_domain_block_html: Ο/Η %{name} ενημέρωσε τον αποκλεισμό τομέα για %{target} + update_ip_block_html: Ο/Η %{name} άλλαξε τον κανόνα για την IP %{target} + update_status_html: Ο/Η %{name} ενημέρωσε την ανάρτηση του/της %{target} + update_user_role_html: Ο/Η %{name} άλλαξε τον ρόλο %{target} deleted_account: διαγραμμένος λογαριασμός empty: Δεν βρέθηκαν αρχεία καταγραφής. filter_by_action: Φιλτράρισμα ανά ενέργεια @@ -322,6 +331,7 @@ el: listed: Αναφερθέντα new: title: Προσθήκη νέου προσαρμοσμένου emoji + no_emoji_selected: Δεν άλλαξαν τα emoji καθώς δεν επιλέχθηκε κανένα not_permitted: Δεν επιτρέπεται να κάνετε αυτή την λειτουργία overwrite: Αντικατάσταση shortcode: Σύντομος κωδικός @@ -335,12 +345,30 @@ el: upload: Ανέβασμα dashboard: active_users: ενεργοί χρήστες + interactions: αλληλεπιδράσεις + media_storage: Αποθηκευτικός Χώρος new_users: νέοι χρήστες + opened_reports: αναφορές που ανοίχτηκαν + pending_reports_html: + one: "<strong>%{count}</strong> εκκρεμής αναφορά" + other: "<strong>%{count}</strong> εκκρεμείς αναφορές" + pending_tags_html: + one: "<strong>%{count}</strong> εκκρεμής ετικέτα" + other: "<strong>%{count}</strong> εκκρεμείς ετικέτες" + pending_users_html: + one: "<strong>%{count}</strong> χρήστης σε εκκρεμότητα" + other: "<strong>%{count}</strong> χρήστες σε εκκρεμότητα" + resolved_reports: επιλυμμένες αναφορές software: Λογισμικό + sources: Πηγές εγγραφής space: Κατανάλωση χώρου title: Ταμπλό + top_languages: Κορυφαίες ενεργές γλώσσες + top_servers: Κορυφαίοι ενεργοί διακομιστές + website: Ιστοσελίδα disputes: appeals: + empty: Καμία ένσταση. title: Εφέσεις domain_allows: add_new: Έγκριση τομέα @@ -363,10 +391,13 @@ el: create: Δημιουργία αποκλεισμού hint: Ο αποκλεισμός τομέα δεν θα αποτρέψει νέες καταχωρίσεις λογαριασμών στην βάση δεδομένων, αλλά θα εφαρμόσει αναδρομικά και αυτόματα συγκεκριμένες πολιτικές μεσολάβησης σε αυτούς τους λογαριασμούς. severity: + desc_html: Ο <strong>περιορισμός</strong> θα κάνει αόρατες τις δημοσιεύσεις ενός λογαριασμού σε όσους δεν τον ακολουθούν. Η <strong>αναστολή</strong> θα αφαιρέσει όλο το περιεχόμενο, τα πολυμέσα και τα στοιχεία προφίλ ενός λογαριασμού. Χρησιμοποίησε το <strong>κανένα</strong> αν θέλεις απλά να απορρίψεις τα αρχεία πολυμέσων. noop: Κανένα silence: Περιορισμός suspend: Αναστολή title: Αποκλεισμός νέου τομέα + no_domain_block_selected: Δεν άλλαξαν οι αποκλεισμοί τομέα καθώς δεν επιλέχθηκε κανένας + not_permitted: Δεν επιτρπέπεται να εκτελέσετε αυτήν την ενέργεια private_comment: Ιδιωτικό σχόλιο private_comment_hint: Σχόλιο για τον περιορισμό αυτού του τομέα για εσωτερική χρήση από τους διαχειριστές. public_comment: Δημόσιο σχόλιο diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 0ce2a894a..1267c4917 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -91,6 +91,7 @@ es-MX: moderation: active: Activo all: Todos + disabled: Deshabilitado pending: Pendiente silenced: Limitado suspended: Suspendidos @@ -133,6 +134,7 @@ es-MX: search: Buscar search_same_email_domain: Otros usuarios con el mismo dominio de correo search_same_ip: Otros usuarios con la misma IP + security: Seguridad security_measures: only_password: Sólo contraseña password_and_2fa: Contraseña y 2FA @@ -427,6 +429,7 @@ es-MX: resolve: Resolver dominio title: Nueva entrada en la lista negra de correo no_email_domain_block_selected: No se han cambiado bloqueos de dominio ya que ninguno ha sido seleccionado + not_permitted: No permitido resolved_dns_records_hint_html: El nombre de dominio resuelve los siguientes dominios MX, los cuales son responsables en última instancia de aceptar el correo electrónico. Bloquear un dominio MX bloqueará los registros de cualquier dirección de correo electrónico que utilice el mismo dominio MX, incluso si el nombre de dominio visible es diferente. <strong>Tenga cuidado de no bloquear los principales proveedores de correo electrónico.</strong> resolved_through_html: Resuelto a través de %{domain} title: Lista negra de correo @@ -473,6 +476,7 @@ es-MX: content_policies: comment: Nota interna description_html: Puedes definir políticas de contenido que se aplicarán a todas las cuentas de este dominio y a cualquiera de sus subdominios. + limited_federation_mode_description_html: Puedes elegir si permites la federación con este dominio. policies: reject_media: Rechazar multimedia reject_reports: Rechazar informes @@ -585,11 +589,13 @@ es-MX: assign_to_self: Asignármela a mí assigned: Moderador asignado by_target_domain: Dominio de la cuenta reportada + cancel: Cancelar category: Categoría category_description_html: La razón por la que se reportó esta cuenta o contenido será citada en las comunicaciones con la cuenta reportada comment: none: Ninguno comment_description_html: 'Para proporcionar más información, %{name} escribió:' + confirm: Confirmar confirm_action: Confirmar acción de moderación contra @%{acct} created_at: Denunciado delete_and_resolve: Eliminar publicaciones @@ -792,6 +798,7 @@ es-MX: suspend: "%{name} suspendio la cuenta de %{target}" appeal_approved: Apelado appeal_pending: Apelación pendiente + appeal_rejected: Apelación rechazada system_checks: database_schema_check: message_html: Hay migraciones pendientes de la base de datos. Por favor, ejecútalas para asegurarte de que la aplicación funciona como debería @@ -827,6 +834,7 @@ es-MX: other: Compartido por %{count} personas durante la última semana title: Enlaces en tendencia usage_comparison: Compartido %{today} veces hoy, comparado a %{yesterday} ayer + not_allowed_to_trend: No permitido para tendencia only_allowed: Sólo las permitidas pending_review: Revisión pendiente preview_card_providers: @@ -958,6 +966,7 @@ es-MX: applications: created: Aplicación creada exitosamente destroyed: Apicación eliminada exitosamente + logout: Cerrar sesión regenerate_token: Regenerar token de acceso token_regenerated: Token de acceso regenerado exitosamente warning: Ten mucho cuidado con estos datos. ¡No los compartas con nadie! @@ -994,6 +1003,8 @@ es-MX: resend_confirmation: Volver a enviar el correo de confirmación reset_password: Restablecer contraseña rules: + accept: Aceptar + back: Atrás preamble: Estas son establecidas y aplicadas por los moderadores de %{domain}. title: Algunas reglas básicas. security: Cambiar contraseña @@ -1140,6 +1151,8 @@ es-MX: storage: Almacenamiento featured_tags: add_new: Añadir nuevo + errors: + limit: Ya has alcanzado la cantidad máxima de hashtags hint_html: "<strong>¿Qué son las etiquetas destacadas?</strong> Se muestran de forma prominente en tu perfil público y permiten a los usuarios navegar por tus publicaciones públicas específicamente bajo esas etiquetas. Son una gran herramienta para hacer un seguimiento de trabajos creativos o proyectos a largo plazo." filters: contexts: @@ -1247,6 +1260,9 @@ es-MX: expires_at: Expira uses: Usos title: Invitar a gente + lists: + errors: + limit: Has alcanzado la cantidad máxima de listas login_activities: authentication_methods: otp: aplicación de autenticación en dos pasos @@ -1566,6 +1582,7 @@ es-MX: '7889238': 3 meses min_age_label: Umbral de tiempo min_favs: Mantener mensajes con un número de favoritos mayor que + min_favs_hint: No borra ninguna de las publicaciones que hayan recibido al menos esta cantidad de favoritos. Deja en blanco para eliminar publicaciones sin importar el número de favoritos min_reblogs: Mantener publicaciones reblogueadas más de min_reblogs_hint: No borra ninguna de las publicaciones que hayan sido reblogueadas más de este número de veces. Deja en blanco para eliminar publicaciones sin importar el número de reblogueos stream_entries: diff --git a/config/locales/es.yml b/config/locales/es.yml index aaf438b17..f87042792 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -476,7 +476,7 @@ es: content_policies: comment: Nota interna description_html: Puedes definir políticas de contenido que se aplicarán a todas las cuentas de este dominio y a cualquiera de sus subdominios. - limited_federation_mode_description_html: Puede elegir si permite la federación en este dominio. + limited_federation_mode_description_html: Puedes elegir si permites la federación con este dominio. policies: reject_media: Rechazar multimedia reject_reports: Rechazar informes @@ -925,7 +925,7 @@ es: new_report: body: "%{reporter} ha reportado a %{target}" body_remote: Alguien de %{domain} a reportado a %{target} - subject: Nuevo reporte para la %{instance} (#%{id}) + subject: Nuevo informe para %{instance} (#%{id}) new_trends: body: 'Los siguientes elementos necesitan una revisión antes de que se puedan mostrar públicamente:' new_trending_links: diff --git a/config/locales/fr-QC.yml b/config/locales/fr-QC.yml index 4c69085b6..76788b995 100644 --- a/config/locales/fr-QC.yml +++ b/config/locales/fr-QC.yml @@ -834,6 +834,7 @@ fr-QC: other: Partagé par %{count} personnes au cours de la dernière semaine title: Liens tendances usage_comparison: Partagé %{today} fois aujourd'hui, comparé à %{yesterday} hier + not_allowed_to_trend: Non autorisé à apparaître dans les tendances only_allowed: Autorisées seulement pending_review: En attente de révision preview_card_providers: @@ -1002,6 +1003,7 @@ fr-QC: resend_confirmation: Envoyer à nouveau les consignes de confirmation reset_password: Réinitialiser le mot de passe rules: + accept: Accepter back: Retour preamble: Celles-ci sont définies et appliqués par les modérateurs de %{domain}. title: Quelques règles de base. @@ -1149,6 +1151,8 @@ fr-QC: storage: Médias stockés featured_tags: add_new: Ajouter un nouveau hashtag + errors: + limit: Vous avez déjà mis en avant le nombre maximum de hashtags hint_html: "<strong>Que sont les hashtags mis en avant ?</strong> Ils sont affichés en évidence sur votre profil public et permettent aux gens de parcourir vos messages publics qui utilisent ces hashtags. Ils sont un excellent outil pour garder la trace d’activités créatrices ou de projets de long terme." filters: contexts: @@ -1256,6 +1260,9 @@ fr-QC: expires_at: Expire uses: Utilisations title: Inviter des gens + lists: + errors: + limit: Vous avez atteint le nombre maximum de listes login_activities: authentication_methods: otp: application d'authentification à deux facteurs @@ -1575,6 +1582,7 @@ fr-QC: '7889238': 3 mois min_age_label: Seuil d'ancienneté min_favs: Conserver les messages mis en favoris au moins + min_favs_hint: Ne supprime aucun de vos messages qui ont reçu au moins ce nombre de favoris. Laisser vide pour supprimer les messages quel que soit leur nombre de favoris min_reblogs: Conserver les messages partagés au moins min_reblogs_hint: Ne supprime aucun de vos messages qui ont été partagés au moins ce nombre de fois. Laisser vide pour supprimer les messages indépendamment de leur nombre de partages stream_entries: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index a8fe44087..fb778f803 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1466,7 +1466,7 @@ ko: export: 데이터 내보내기 featured_tags: 추천 해시태그 import: 데이터 가져오기 - import_and_export: 가져오기 / 내보내기 + import_and_export: 가져오기 & 내보내기 migrate: 계정 이동 notifications: 알림 preferences: 사용자 설정 diff --git a/config/locales/nn.yml b/config/locales/nn.yml index f6bae8c5c..49f30bab0 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -91,6 +91,7 @@ nn: moderation: active: Aktiv all: Alle + disabled: Deaktivert pending: Ventar på svar silenced: Avgrensa suspended: Utvist @@ -133,6 +134,7 @@ nn: search: Søk search_same_email_domain: Andre brukarar med same e-postdomene search_same_ip: Andre brukarar med same IP + security: Sikkerhet security_measures: only_password: Kun passord password_and_2fa: Passord og 2FA @@ -421,6 +423,7 @@ nn: resolve: Løs domene title: Ny blokkeringsoppføring av e-postdomene no_email_domain_block_selected: Blokkering av e-post-domener vart ikkje endra sidan ingen var valde + not_permitted: Ikke tillatt resolved_dns_records_hint_html: Domenenamnet gjer oppslag til desse MX-domenene som til sist er ansvarlige for å motta e-post. Blokkering av eit MX-domene vil blokkere registreringar frå alle e-postadresser som bruker same MX-domene, sjølv om det synlige domenenavnet skulle vera noko anna. <strong>Pass på så du ikkje blokkerer dei store e-postleverandørane.</strong> resolved_through_html: Løyst gjennom %{domain} title: Blokkerte e-postadresser @@ -435,6 +438,7 @@ nn: private_comment_description_html: 'For å hjelpa deg med å halda oversikt over kvar importerte blokkeringar kjem frå, vil dei bli oppretta med fylgjande private kommentar: <q>%{comment}</q>' private_comment_template: Importert frå %{source} den %{date} title: Importer domeneblokkeringar + invalid_domain_block: 'En eller flere domeneblokker ble hoppet over på grunn av følgende feil(er): %{error}' new: title: Importer domeneblokkeringar no_file: Inga fil vald @@ -569,17 +573,23 @@ nn: mark_as_sensitive_description_html: Mediene i dei rapporterte innlegga vil verte markerte som ømtolege, og ein merknad vil verte lagra for å hjelpe deg å eskalera ved framtidige regelbrot frå same konto. other_description_html: Sjå fleire alternativ når det gjeld kontroll av kontoåtferd og tilpassing av kommunikasjonen til den rapporterte kontoen. resolve_description_html: Ingen handling utføres mot den rapporterte kontoen, ingen advarsel gis, og rapporten lukkes. + silence_description_html: Profilen vil kun være synlig for dem som allerede følger den eller manuelt slår den opp, noe som sterkt begrenser dens rekkevidde. Kan alltid tilbakestilles. Lukker alle rapporter mot denne kontoen. + suspend_description_html: Kontoen og alt dens innhold vil være utilgjengelig og til slutt slettet, og det vil ikke være mulig å bruke den. Reversibel innen 30 dager. Lukker alle rapporter mot denne kontoen. actions_description_html: Avgjer kva som skal gjerast med denne rapporteringa. Dersom du utfører straffetiltak mot den rapporterte kontoen, vil dei motta ein e-post – så sant du ikkje har valt kategorien <strong>Spam</strong>. + actions_description_remote_html: Velg hvilke tiltak som skal treffes for å løse denne rapporten. Dette påvirker bare hvordan <strong>din</strong> server kommuniserer med denne eksterne kontoen og håndterer innholdet. add_to_report: Legg til i rapporten are_you_sure: Er du sikker? assign_to_self: Tilegn til meg assigned: Tilsett moderator by_target_domain: Domenet av rapportert bruker + cancel: Avbryt category: Kategori category_description_html: Årsaka til at kontoen og/eller innhaldet vart rapportert vil bli inkludert i kommunikasjonen med den rapporterte kontoen comment: none: Ingen comment_description_html: 'For å gje meir informasjon, skreiv %{name}:' + confirm: Bekreft + confirm_action: Bekreft moderasjonshandling mot @%{acct} created_at: Rapportert delete_and_resolve: Slett innlegg forwarded: Videresendt @@ -596,6 +606,7 @@ nn: placeholder: Beskriv hvilke handlinger som har blitt tatt, eller andre relaterte oppdateringer... title: Merknad notes_description_html: Sjå og skriv merknadar til andre moderatorar og ditt framtidige sjølv + processed_msg: 'Rapport #%{id} er behandlet' quick_actions_description_html: 'Utfør ei handling eller bla ned for å sjå det rapporterte innhaldet:' remote_user_placeholder: den eksterne brukaren frå %{instance} reopen: Opn rapport igjen @@ -608,6 +619,12 @@ nn: status: Status statuses: Rapportert innhold statuses_description_html: Støytande innhald vil bli inkludert i kommunikasjonen med den rapporterte kontoen + summary: + action_preambles: + delete_html: 'Du er i ferd med å <strong>fjerne</strong> noe av <strong>@%{acct}</strong> sine innlegg. Dette vil:' + mark_as_sensitive_html: 'Du er i ferd med å <strong>markere</strong> noen av <strong>@%{acct}</strong> sine innlegg som <strong>sensitivt</strong>. Dette vil:' + silence_html: 'Du er i ferd med å <strong>avgrense</strong> <strong>@%{acct}</strong> sin konto. Dette vil:' + suspend_html: 'Du er i ferd med å <strong>stoppe</strong> <strong>@%{acct}</strong> sin konto. Dette vil:' target_origin: Opprinnelse for innrapportert konto title: Rapportar unassign: Avset diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 79ad3e839..d85572107 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -91,6 +91,7 @@ pt-BR: moderation: active: Ativo all: Todos + disabled: Desativado pending: Pendente silenced: Limitado suspended: Suspendido @@ -133,6 +134,7 @@ pt-BR: search: Buscar search_same_email_domain: Outros usuários com o mesmo domínio de e-mail search_same_ip: Outros usuários com o mesmo IP + security: Segurança security_measures: only_password: Apenas senha password_and_2fa: Senha e autenticação de dois fatores @@ -426,6 +428,7 @@ pt-BR: resolve: Resolver domínio title: Nova entrada de lista negra de e-mail no_email_domain_block_selected: Nenhum bloco de domínio de e-mail foi alterado, pois nenhum foi selecionado + not_permitted: Não permitido resolved_dns_records_hint_html: O nome de domínio resolve os seguintes domínios MX, que são responsáveis finais por aceitar o e-mail. Bloquear um domínio MX bloqueará inscrições de qualquer endereço de e-mail que use o mesmo domínio MX, mesmo que o nome de domínio visível seja diferente. <strong>Cuidado para não bloquear os principais provedores de e-mail.</strong> resolved_through_html: Resolvido através de %{domain} title: Lista de negra de e-mail @@ -580,11 +583,13 @@ pt-BR: assign_to_self: Atribuir para si assigned: Moderador responsável by_target_domain: Domínio da conta denunciada + cancel: Cancelar category: Categoria category_description_html: O motivo pelo qual esta conta e/ou conteúdo foi denunciado será citado na comunicação com a conta denunciada comment: none: Nenhum comment_description_html: 'Para fornecer mais informações, %{name} escreveu:' + confirm: Confirmar created_at: Denunciado delete_and_resolve: Excluir publicações forwarded: Encaminhados @@ -601,6 +606,7 @@ pt-BR: placeholder: Descreva quais ações foram tomadas ou quaisquer outras atualizações relacionadas... title: Notas notes_description_html: Visualize e deixe anotações para outros moderadores e para você mesmo no futuro + processed_msg: 'Relatório #%{id} processado com sucesso' quick_actions_description_html: 'Tome uma ação rápida ou role para baixo para ver o conteúdo denunciado:' remote_user_placeholder: o usuário remoto de %{instance} reopen: Reabrir denúncia @@ -982,6 +988,8 @@ pt-BR: resend_confirmation: Reenviar instruções de confirmação reset_password: Redefinir senha rules: + accept: Aceitar + back: Voltar preamble: Estes são definidos e aplicados pelos moderadores de %{domain}. title: Algumas regras básicas. security: Segurança @@ -1235,6 +1243,9 @@ pt-BR: expires_at: Expira em uses: Usos title: Convidar pessoas + lists: + errors: + limit: Você atingiu o número máximo de listas login_activities: authentication_methods: otp: autenticação de dois fatores diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 701be825e..d3649ba40 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1151,6 +1151,8 @@ pt-PT: storage: Armazenamento de media featured_tags: add_new: Adicionar nova + errors: + limit: Já destacou o número máximo de hashtags permitido hint_html: "<strong>O que são etiquetas em destaque?</strong> Exibidas de forma bem visível no seu perfil público, permitem que as pessoas consultem as suas publicações públicas especificamente sob essas etiquetas. São uma óptima ferramenta para dar seguimento a trabalhos criativos ou projectos de longo prazo." filters: contexts: @@ -1258,6 +1260,9 @@ pt-PT: expires_at: Expira uses: Usos title: Convidar pessoas + lists: + errors: + limit: Atingiu o número máximo de listas permitido login_activities: authentication_methods: otp: aplicação de autenticação em duas etapas @@ -1577,6 +1582,7 @@ pt-PT: '7889238': 3 meses min_age_label: Limite de idade min_favs: Manter pelo menos as publicações dos marcadores + min_favs_hint: Não elimina nenhuma das suas publicações que tenha recebido pelo menos este número de favoritos. Deixe em branco para eliminar publicações, independentemente do seu número de favoritos min_reblogs: Manter as publicações reforçadas mais de min_reblogs_hint: Não apaga nenhuma das suas publicações que tenha sido partilhada mais do que este número de vezes. Deixe em branco para apagar as publicações, independentemente do número de partilhas stream_entries: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 28402b46b..9b8749b81 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -95,6 +95,7 @@ ru: moderation: active: Действующие all: Все + disabled: Отключено pending: В ожидании silenced: Ограниченные suspended: Заблокированные @@ -139,6 +140,7 @@ ru: search: Поиск search_same_email_domain: Другие пользователи с тем же доменом электронной почты search_same_ip: Другие пользователи с таким же IP + security: Безопасность security_measures: only_password: Только пароль password_and_2fa: Пароль и 2FA @@ -443,6 +445,7 @@ ru: resolve: Проверить домен title: Новая блокировка по домену no_email_domain_block_selected: Блоки домена электронной почты не были изменены, так как не были выбраны + not_permitted: Не разрешено resolved_dns_records_hint_html: Доменное имя устраняется на следующие MX-домены, которые в конечном итоге отвечают за прием электронной почты. Блокировка MX-домена будет блокировать регистрации с любого адреса электронной почты, который использует тот же MX-домен, даже если видимое доменное имя отличается от него. <strong>Будьте осторожны, чтобы не блокировать основных поставщиков электронной почты</strong> resolved_through_html: Разрешено через %{domain} title: Блокировка e-mail доменов @@ -493,6 +496,7 @@ ru: content_policies: comment: Внутренняя заметка description_html: Вы можете определить политики контента, которые будут применяться ко всем учетным записям этого домена и любого из его субдоменов. + limited_federation_mode_description_html: Вы можете выбрать, разрешать ли объединение с этим доменом. policies: reject_media: Отклонить медиа reject_reports: Отклонять жалобы @@ -609,11 +613,13 @@ ru: assign_to_self: Назначить себе assigned: Назначенный модератор by_target_domain: Домен объекта жалобы + cancel: Отменить category: Категория category_description_html: Причина, по которой были доложены этот пользователь или содержимое, будет указана при коммуникации с фигурирующим в жалобе пользователем comment: none: Нет comment_description_html: 'В дополнение, %{name} добавил(а) следующий комментарий:' + confirm: Подтвердить created_at: Создана delete_and_resolve: Удалить посты forwarded: Переслано @@ -810,6 +816,7 @@ ru: suspend: "%{name} приостановил аккаунт %{target}" appeal_approved: Обжаловано appeal_pending: Обжалование в обработке + appeal_rejected: Апелляция отклонена system_checks: database_schema_check: message_html: Есть отложенные миграции базы данных. Запустите их, чтобы убедиться, что приложение работает должным образом @@ -847,6 +854,7 @@ ru: other: Поделился %{count} человек за последнюю неделю title: Актуальные ссылки usage_comparison: Поделились %{today} раз сегодня, по сравнению с %{yesterday} вчера + not_allowed_to_trend: Не допущено в популярное only_allowed: Только разрешенное pending_review: Ожидает рассмотрения preview_card_providers: @@ -984,6 +992,7 @@ ru: applications: created: Приложение успешно создано destroyed: Приложение успешно удалено + logout: Выйти regenerate_token: Повторно сгенерировать токен доступа token_regenerated: Токен доступа успешно сгенерирован warning: Будьте очень внимательны с этими данными. Не делитесь ими ни с кем! @@ -1020,6 +1029,8 @@ ru: resend_confirmation: Повторить отправку инструкции для подтверждения reset_password: Сбросить пароль rules: + accept: Принять + back: Назад preamble: Они устанавливаются и применяются модераторами %{domain}. title: Несколько основных правил. security: Безопасность diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 267d2292c..61befb9e6 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -19,6 +19,7 @@ ar: none: استخدم هذه لإرسال تحذير للمستخدم، دون تشغيل أو إثارة أي إجراء آخر. sensitive: إجبار جميع مرفقات الوسائط لهذا المستخدم على أن تكون حساسة. silence: منع المستخدم من القدرة على النشر للعامة، وإخفاء مشاركاته وإشعاراته لمن لا يتبعونه. إغلاق جميع التقارير المقترنة بهذا الحساب. + suspend: منع أي تفاعل من هذا الحساب أو إليه وحذف محتوياته. يمكن التراجع عنه في غضون 30 يوما. إغلاق جميع التقارير المفتوحة ضد هذا الحساب. warning_preset_id: اختياري. يمكنك إضافة نص مخصص إلى نهاية النموذج announcement: all_day: إن أختير، سيتم عرض تواريخ النطاق الزمني فقط @@ -95,6 +96,7 @@ ar: timeline_preview: الزوار الذين سجلوا خروجهم سيكونون قادرين على تصفح أحدث المشاركات العامة المتاحة على الخادم. trendable_by_default: تخطي مراجعة المحتوى التريند اليدوي. لا يزال من الممكن الإزالة اللاحقة للعناصر الفردية من التريندات. trends: تظهر التريندز أي المشاركات وعلامات وقصص الأخبار التي تجذب الانتباه على الخادم الخاص بك. + trends_as_landing_page: إظهار المحتوى المتداوَل للمستخدمين والزوار غير المسجلين بدلاً من وصف هذا الخادم. يتطلب هذا تفعيل المتداولة. form_challenge: current_password: إنك بصدد الدخول إلى منطقة آمنة imports: @@ -230,6 +232,7 @@ ar: hide: إخفاء بالكامل warn: إخفاء بتحذير form_admin_settings: + activity_api_enabled: نشر مُجمل الإحصائيات عن نشاط المستخدمين في واجهة برمجة التطبيقات API backups_retention_period: فترة الاحتفاظ بأرشيف المستخدم bootstrap_timeline_accounts: أوصي دائما بهذه الحسابات للمستخدمين الجدد closed_registrations_message: رسالة مخصصة عندما يكون التسجيل غير متاح diff --git a/config/locales/simple_form.fr-QC.yml b/config/locales/simple_form.fr-QC.yml index bc78f0ae6..541bc8be6 100644 --- a/config/locales/simple_form.fr-QC.yml +++ b/config/locales/simple_form.fr-QC.yml @@ -82,7 +82,7 @@ fr-QC: custom_css: Vous pouvez appliquer des styles personnalisés sur la version Web de Mastodon. mascot: Remplace l'illustration dans l'interface Web avancée. media_cache_retention_period: Les fichiers multimédias téléchargés seront supprimés après le nombre de jours spécifiés lorsque la valeur est positive, et seront téléchargés à nouveau sur demande. - peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fediverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. + peers_api_enabled: Une liste de noms de domaine que ce serveur a rencontrés dans le fédiverse. Aucune donnée indiquant si vous vous fédérez ou non avec un serveur particulier n'est incluse ici, seulement l'information que votre serveur connaît un autre serveur. Cette option est utilisée par les services qui collectent des statistiques sur la fédération en général. profile_directory: L'annuaire des profils répertorie tous les utilisateurs qui ont opté pour être découverts. require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif site_contact_email: Comment les personnes peuvent vous joindre pour des demandes de renseignements juridiques ou d'assistance. @@ -91,11 +91,13 @@ fr-QC: site_short_description: Une courte description pour aider à identifier de manière unique votre serveur. Qui l'exécute, à qui il est destiné ? site_terms: Utilisez votre propre politique de confidentialité ou laissez vide pour utiliser la syntaxe par défaut. Peut être structurée avec la syntaxe Markdown. site_title: Comment les personnes peuvent se référer à votre serveur en plus de son nom de domaine. + status_page_url: URL d'une page où les gens peuvent voir l'état de ce serveur en cas de panne theme: Thème que verront les utilisateur·rice·s déconnecté·e·s ainsi que les nouveaux·elles utilisateur·rice·s. thumbnail: Une image d'environ 2:1 affichée à côté des informations de votre serveur. timeline_preview: Les visiteurs déconnectés pourront parcourir les derniers messages publics disponibles sur le serveur. trendable_by_default: Ignorer l'examen manuel du contenu tendance. Des éléments individuels peuvent toujours être supprimés des tendances après coup. trends: Les tendances montrent quelles publications, hashtags et actualités sont en train de gagner en traction sur votre serveur. + trends_as_landing_page: Afficher le contenu tendance au lieu d'une description de ce serveur pour les comptes déconnectés et les non-inscrit⋅e⋅s. Nécessite que les tendances soient activées. form_challenge: current_password: Vous entrez une zone sécurisée imports: @@ -251,11 +253,13 @@ fr-QC: site_short_description: Description du serveur site_terms: Politique de confidentialité site_title: Nom du serveur + status_page_url: URL de la page de l'état du serveur theme: Thème par défaut thumbnail: Miniature du serveur timeline_preview: Autoriser l’accès non authentifié aux fils publics trendable_by_default: Autoriser les tendances sans révision préalable trends: Activer les tendances + trends_as_landing_page: Utiliser les tendances comme page d'accueil interactions: must_be_follower: Bloquer les notifications des personnes qui ne vous suivent pas must_be_following: Bloquer les notifications des personnes que vous ne suivez pas diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 3af09275f..189b9bfc5 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -259,7 +259,7 @@ it: timeline_preview: Consenti l'accesso non autenticato alle timeline pubbliche trendable_by_default: Consenti le tendenze senza revisione preventiva trends: Abilita le tendenze - trends_as_landing_page: Utilizza le tendenze come pagina di destinazione + trends_as_landing_page: Usa le tendenze come pagina di destinazione interactions: must_be_follower: Blocca notifiche da chi non ti segue must_be_following: Blocca notifiche dalle persone che non segui diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index b8edaf636..294fc548b 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -101,7 +101,7 @@ ko: form_challenge: current_password: 당신은 보안 구역에 진입하고 있습니다 imports: - data: 다른 마스토돈 서버에서 추출된 CSV 파일 + data: 다른 마스토돈 서버에서 내보낸 CSV 파일 invite_request: text: 이 정보는 신청을 검토하는데 도움을 줄 수 있습니다. ip_block: @@ -116,7 +116,7 @@ ko: rule: text: 이 서버 사용자들이 지켜야 할 규칙과 요구사항을 설명해주세요. 짧고 간단하게 작성해주세요 sessions: - otp: '휴대전화에서 생성 된 2단계 인증 코드를 입력하거나, 복구 코드 중 하나를 사용하세요:' + otp: '휴대전화에서 생성된 이중 인증 코드를 입력하거나, 복구 코드 중 하나를 사용하세요:' webauthn: USB 키라면 삽입했는지 확인하고, 필요하다면 누르세요. tag: name: 읽기 쉽게하기 위한 글자의 대소문자만 변경할 수 있습니다. @@ -150,11 +150,11 @@ ko: text: 커스텀 경고 type: 조치 types: - disable: 비활성화 - none: 아무 것도 하지 않기 + disable: 동결 + none: 경고 보내기 sensitive: 민감함 silence: 제한 - suspend: 정지하고 되돌릴 수 없는 데이터 삭제 + suspend: 정지 warning_preset_id: 경고 틀 사용하기 announcement: all_day: 종일 일정 @@ -163,7 +163,7 @@ ko: starts_at: 이벤트 시작 text: 공지사항 appeal: - text: 이 결정이 왜 번복되어야 하는지에 대해 설명해주세요 + text: 이 결정을 번복해야만 하는 이유가 무엇입니까 defaults: autofollow: 초대를 통한 팔로우 avatar: 아바타 @@ -188,7 +188,7 @@ ko: max_uses: 사용 횟수 제한 new_password: 새로운 암호 입력 note: 자기소개 - otp_attempt: 2단계 인증 코드 + otp_attempt: 이중 인증 코드 password: 암호 phrase: 키워드 또는 문장 setting_advanced_layout: 고급 웹 UI 활성화 @@ -206,11 +206,11 @@ ko: setting_display_media_default: 기본 setting_display_media_hide_all: 모두 가리기 setting_display_media_show_all: 모두 보이기 - setting_expand_spoilers: 열람주의 툿을 항상 펼치기 + setting_expand_spoilers: 열람주의 게시물을 항상 펼치기 setting_hide_network: 내 인맥 숨기기 setting_noindex: 검색엔진의 인덱싱을 거절 setting_reduce_motion: 애니메이션 줄이기 - setting_show_application: 툿 작성에 사용한 앱을 공개 + setting_show_application: 게시물 작성에 쓰인 애플리케이션 공개 setting_system_font_ui: 시스템의 기본 글꼴을 사용 setting_theme: 사이트 테마 setting_trends: 오늘의 유행 보이기 @@ -305,7 +305,7 @@ ko: webhook: events: 활성화된 이벤트 url: 엔드포인트 URL - 'no': 아니오 + 'no': 아니요 not_recommended: 추천하지 않음 recommended: 추천함 required: diff --git a/config/locales/simple_form.my.yml b/config/locales/simple_form.my.yml index 5e1fc6bee..8a1cefc94 100644 --- a/config/locales/simple_form.my.yml +++ b/config/locales/simple_form.my.yml @@ -1 +1,121 @@ +--- my: + simple_form: + hints: + defaults: + password: အနည်းဆုံး စာလုံး ၈ လုံး အသုံးပြုပါ။ + setting_display_media_hide_all: မီဒီယာကို အမြဲတမ်းဖျောက်ထားပါ + setting_display_media_show_all: မီဒီယာကို အမြဲတမ်းပြပါ + setting_hide_network: သင်စောင့်ကြည့်မည့်သူများနှင့် သင့်ကိုစောင့်ကြည့်မည့်သူများကို သင့်ပရိုဖိုင်တွင် ဖျောက်ထားနိုင်ပါသည် + setting_noindex: သင်၏ အများမြင်သည့်ပရိုဖိုင်နှင့် ပို့စ်စာမျက်နှာများကို အကျိုးသက်ရောက်သည် + setting_show_application: ပို့စ်တင်ရန်အတွက် သင်အသုံးပြုသည့် အက်ပလီကေးရှင်းကို သင့်ပို့စ်များ၏ အသေးစိတ်ကြည့်ရှုမှုတွင် ပြသမည်ဖြစ်သည် + imports: + data: အခြား Mastodon ဆာဗာမှ CSV ဖိုင်ကို ပို့ထားသည် + invite_request: + text: "၎င်းသည် သင့်အက်ပလီကေးရှင်းကို ပြန်လည်သုံးသပ်ရန်အတွက် ကူညီပေးနိုင်ပါသည်" + ip_block: + severities: + sign_up_requires_approval: အကောင့်အသစ်များသည် သင့်ခွင့်ပြုချက်လိုအပ်ပါသည် + sessions: + otp: သင့်ဖုန်းအက်ပ်မှထုတ်ပေးသောနှစ်ဆင့်ခံလုံခြုံရေးကုဒ်ကို ထည့်ပါ သို့မဟုတ် ပြန်လည်ရယူရေးကုဒ်များထဲမှ တစ်ခုကို အသုံးပြုပါ - + labels: + account: + fields: + value: အကြောင်းအရာ + account_alias: + acct: အကောင့်ဟောင်းကို ကိုင်တွယ်ပါ။ + account_migration: + acct: အကောင့်သစ်ကို ကိုင်တွယ်ပါ။ + account_warning_preset: + title: ခေါင်းစဥ် + admin_account_action: + type: လုပ်ဆောင်ချက် + types: + none: သတိပေးချက်ပေးပို့ပါ + silence: ကန့်သတ် + announcement: + text: ကြေညာချက် + defaults: + avatar: ကိုယ်စားပြုရုပ်ပုံ + bot: ဤသည်မှာ ဘော့တ်အကောင့်တစ်ခုဖြစ်သည်။ + chosen_languages: ဘာသာစကားများကို စစ်ထုတ်ထားခြင်း + confirm_new_password: စကားဝှက်အသစ်ကို အတည်ပြုပါ + confirm_password: စကားဝှက်ကို အတည်ပြုပါ။ + context: အကြောင်းအရာများကို စစ်ထုတ်ပါ။ + current_password: လက်ရှိစကားဝှက် + data: အချက်အလက် + display_name: ဖော်ပြမည့်အမည် + email: အီးမေးလ်လိပ်စာ + header: မျက်နှာဖုံးပုံ + honeypot: "%{label} (မဖြည့်ပါနှင့်)" + new_password: စကားဝှက်အသစ် + note: ကိုယ်ရေးအကျဉ်း + otp_attempt: နှစ်ဆင့်ခံလုံခြုံရေးကုဒ် + password: စကားဝှက် + phrase: အဓိကစကားလုံး သို့မဟုတ် စကားစု + setting_always_send_emails: အီးမေးလ်သတိပေးချက်များကို အမြဲပို့ပါ + setting_auto_play_gif: ကာတွန်း GIF များကို အလိုအလျောက်ဖွင့်ပါ + setting_display_media: မီဒီယာဖော်ပြမှု + setting_display_media_hide_all: အားလုံးကို ဖျောက်ပါ + setting_display_media_show_all: အားလုံးပြရန် + setting_system_font_ui: စနစ်ရှိ နဂိုမူလ စာလုံးပုံစံကို အသုံးပြုပါ + setting_trends: ယနေ့ ရေပန်းစားသည်များကို ပြပါ + setting_unfollow_modal: တစ်စုံတစ်ဦးကို မစောင့်ကြည့်မီ အတည်ပြုချက် ဒိုင်ယာလော့ခ်ကို ပြပါ + sign_in_token_attempt: လုံခြုံရေးကုဒ် + title: ခေါင်းစဥ် + username: အသုံးပြုသူအမည် + username_or_email: အသုံးပြုသူအမည် သို့မဟုတ် အီးမေးလ် + featured_tag: + name: Hashtag + form_admin_settings: + custom_css: စိတ်ကြိုက်ပြုလုပ်ထားသော CSS + mascot: စိတ်ကြိုက်ပြုလုပ်ထားသော mascot (legacy) + registrations_mode: ဘယ်သူတွေ အကောင့်ဖွင့်နိုင်မလဲ + require_invite_text: ပါဝင်ရန် အကြောင်းပြချက်တစ်ခု လိုအပ်ပါသည် + show_domain_blocks: ဒိုမိန်းပိတ်ပင်ထားမှုများကိုပြရန် + show_domain_blocks_rationale: ဒိုမိန်းများကို ဘာကြောင့် ပိတ်ဆို့ထားရကြောင်း ပြရန် + site_contact_email: ဆက်သွယ်ရမည့် အီးမေးလ် + site_contact_username: ဆက်သွယ်ရမည့် အသုံးပြုသူအမည် + site_short_description: ဆာဗာဖော်ပြချက် + site_terms: ကိုယ်ရေးအချက်အလက်မူဝါဒ + site_title: ဆာဗာအမည် + thumbnail: ဆာဗာ ပုံသေး + interactions: + must_be_follower: စောင့်ကြည့်မနေသူများထံမှ အသိပေးချက်များကို ပိတ်ပါ + must_be_following: သင် စောင့်ကြည့်မထားသူများထံမှ အသိပေးချက်များကို ပိတ်ပါ + must_be_following_dm: သင် စောင့်ကြည့်မထားသူများထံမှ တိုက်ရိုက်မက်ဆေ့ချ်များကို ပိတ်ပါ + invite: + comment: မှတ်ချက် + invite_request: + text: သင် ဘာကြောင့် ပါဝင်ချင်တာလဲ။ + ip_block: + comment: မှတ်ချက် + ip: IP + severities: + sign_up_block: အကောင့်ဖွင့်ခြင်းများကို ပိတ်ပါ + sign_up_requires_approval: အကောင့်ဖွင့်ခြင်းများကို ကန့်သတ်ပါ + severity: စည်းမျဉ်း + notification_emails: + favourite: တစ်စုံတစ်ဦးက သင့်ပို့စ်ကို နှစ်သက်ခဲ့သည်။ + follow: တစ်စုံတစ်ဦးက သင့်ကို စောင့်ကြည့်ခဲ့သည် + follow_request: တစ်စုံတစ်ဦးက သင့်ကို စောင့်ကြည့်ရန် တောင်းဆိုခဲ့သည် + mention: တစ်စုံတစ်ဦးက သင့်ကို ဖော်ပြခဲ့သည် + pending_account: အကောင့်အသစ်ကို ပြန်လည်သုံးသပ်ရန် လိုအပ်သည် + rule: + text: စည်းမျဉ်း + tag: + name: Hashtag + user: + role: အခန်းကဏ္ဍ + user_role: + name: အမည် + permissions_as_keys: ခွင့်ပြုချက်များ + position: ဦးစားပေး + 'no': မလုပ်ပါ + required: + mark: "*" + text: လိုအပ်သော + title: + sessions: + webauthn: အကောင့်ဝင်ရန်အတွက် သင့်လုံခြုံရေးကီးများထဲမှ တစ်ခုကို အသုံးပြုပါ + 'yes': ဟုတ်ကဲ့ diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 47137d801..cb11250ad 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -7,12 +7,12 @@ sr: account_migration: acct: Наведи корисничко_име@домен налога на који желиш да пређеш account_warning_preset: - text: Можете користити синтаксу труба, као што су нпр. УРЛ-ова, тарабе и помињања + text: Можете користити синтаксу објава, као што су URL адресе, хеш ознаке и помињања title: Опционо. Није видљиво примаоцу admin_account_action: include_statuses: Корисник ће видети које су објаве проузроковале модерирање или упозорење send_email_notification: Корисник ће добити објашњење тога шта му се десило са налога - text_html: Опционално. Можете користити синтаксу труба. Можете <a href="%{path}">додати упозоравајућа преподешавање</a> да сачувате време + text_html: Опционално. Можете користити синтаксу објава. Можете <a href="%{path}">додати унапред одређене поставке упозорења</a> за уштеду времена type_html: Изаберите шта да радите са <strong>%{acct}</strong> types: disable: Спречи корисника да користи свој налог, али немој брисати или сакривати његов садржај. @@ -29,7 +29,7 @@ sr: text: На брисање се можеш жалити само једном defaults: autofollow: Особе које се пријаве кроз позивнице ће вас аутоматски запратити - avatar: PNG, GIF или JPG. Највише %{size}. Биће смањена на %{dimensions}px + avatar: PNG, GIF или JPG. Највише %{size}. Биће смањено на %{dimensions}px bot: Овај налог углавном врши аутоматизоване радње и можда се не надгледа context: Један или више контекста у којима треба да се примени филтер current_password: Унеси лозинку текућег налога из безбедносних разлога @@ -38,7 +38,7 @@ sr: discoverable: Дозволи непознатим корисницима да открију твој налог путем препорука, трендова и других функција email: Биће вам послата е-пошта са потврдом fields: Можете имати до 4 ставке приказане као табела на вашем налогу - header: PNG, GIF или JPG. Највише %{size}. Биће смањена на %{dimensions}px + header: PNG, GIF или JPG. Највише %{size}. Биће смањено на %{dimensions}px inbox_url: Копирајте URL са насловне стране релеја који желите користити irreversible: Филтриранe обајве ће нестати неповратно, чак и ако је филтер касније уклоњен locale: Језик корисничког окружења, е-поште и мобилних обавештења diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index ede921615..cf914b058 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -18,6 +18,8 @@ sv: disable: Förhindra användaren från att använda sitt konto, men radera eller dölj inte innehållet. none: Använd det här för att skicka en varning till användaren, utan att vidta någon ytterligare åtgärd. sensitive: Tvinga alla denna användares mediebilagor till att flaggas som känsliga. + silence: Hindra användaren från att kunna göra offentliga inlägg, göm deras inlägg och notiser från folk som inte följer dem. Stänger alla anmälningar mot detta kontot. + suspend: Förhindrar all interaktion från eller till detta konto och ta bort dess innehåll. Går att ångra inom 30 dagar. Stänger alla anmälningar mot detta konto. warning_preset_id: Valfri. Du kan lägga till anpassad text i slutet av förinställningen announcement: all_day: När det är markerat visas endast datum för tidsintervallet @@ -72,6 +74,7 @@ sv: hide: Dölj det filtrerade innehållet helt (beter sig som om det inte fanns) warn: Dölj det filtrerade innehållet bakom en varning som visar filtrets rubrik form_admin_settings: + activity_api_enabled: Antalet lokalt publicerade inlägg, aktiva användare och nya registrerade konton per vecka backups_retention_period: Behåll genererade användararkiv i det angivna antalet dagar. bootstrap_timeline_accounts: Dessa konton kommer fästas högst upp i nya användares följrekommendationer. closed_registrations_message: Visas när nyregistreringar är avstängda @@ -79,6 +82,7 @@ sv: custom_css: Du kan använda anpassade stilar på webbversionen av Mastodon. mascot: Åsidosätter illustrationen i det avancerade webbgränssnittet. media_cache_retention_period: Nedladdade mediefiler kommer raderas efter det angivna antalet dagar, om inställt till ett positivt värde, och laddas ned på nytt vid behov. + peers_api_enabled: En lista över domänen den här servern har stött på i fediversum. Ingen data inkluderas om du har federerat med servern, bara att din server känner till den. Detta används av tjänster som samlar statistik om federering i allmänhet. profile_directory: Profilkatalogen visar alla användare som har samtyckt till att bli upptäckbara. require_invite_text: Gör fältet "Varför vill du gå med?" obligatoriskt när nyregistreringar kräver manuellt godkännande site_contact_email: Hur människor kan nå dig för juridiska spörsmål eller supportfrågor. @@ -87,11 +91,13 @@ sv: site_short_description: En kort beskrivning för att unikt identifiera din server. Vem är det som driver den, vilka är den till för? site_terms: Använd din egen sekretesspolicy eller lämna tomt för att använda standardinställningen. Kan struktureras med Markdown-syntax. site_title: Hur folk kan hänvisa till din server förutom med dess domännamn. + status_page_url: URL till en sida där personer kan se serverns status under ett driftavbrott theme: Tema som utloggade besökare och nya användare ser. thumbnail: En bild i cirka 2:1-proportioner som visas tillsammans med din serverinformation. timeline_preview: Utloggade besökare kommer kunna bläddra bland de senaste offentliga inläggen som finns på servern. trendable_by_default: Hoppa över manuell granskning av trendande innehåll. Enskilda objekt kan ändå raderas från trender retroaktivt. trends: Trender visar vilka inlägg, hashtaggar och nyheter det pratas om på din server. + trends_as_landing_page: Visa trendande innehåll för utloggade användare och besökare istället för en beskrivning om servern. Kräver att trender är aktiverat. form_challenge: current_password: Du går in i ett säkert område imports: @@ -227,6 +233,7 @@ sv: hide: Dölj helt warn: Dölj med en varning form_admin_settings: + activity_api_enabled: Publicera aggregerad statistik om användaraktivitet i API:et backups_retention_period: Lagringsperiod för användararkivet bootstrap_timeline_accounts: Rekommendera alltid dessa konton till nya användare closed_registrations_message: Anpassat meddelande när nyregistreringar inte är tillgängliga @@ -234,6 +241,7 @@ sv: custom_css: Anpassad CSS mascot: Anpassad maskot (tekniskt arv) media_cache_retention_period: Tid för bibehållande av mediecache + peers_api_enabled: Publicera lista över upptäckta servrar i API:et profile_directory: Aktivera profilkatalog registrations_mode: Vem kan registrera sig require_invite_text: Kräv anledning för att gå med @@ -245,11 +253,13 @@ sv: site_short_description: Serverbeskrivning site_terms: Integritetspolicy site_title: Servernamn + status_page_url: URL för statussida theme: Standardtema thumbnail: Serverns tumnagelbild timeline_preview: Tillåt oautentiserad åtkomst till offentliga tidslinjer trendable_by_default: Tillåt trender utan föregående granskning trends: Aktivera trender + trends_as_landing_page: Använd trender som landningssida interactions: must_be_follower: Blockera notiser från icke-följare must_be_following: Blockera notiser från personer du inte följer diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 5f974c6fd..8a2bcc0a1 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -49,7 +49,7 @@ zh-TW: phrase: 無論是嘟文的本文或是內容警告都會被過濾 scopes: 允許讓應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。 setting_aggregate_reblogs: 請勿顯示最近已被轉嘟之嘟文的最新轉嘟(只影響最新收到的嘟文) - setting_always_send_emails: 一般情況下若您活躍使用 Mastodon ,我們不會寄送 e-mail 通知 + setting_always_send_emails: 一般情況下若您活躍使用 Mastodon ,我們不會寄送電子郵件通知 setting_default_sensitive: 敏感內容媒體預設隱藏,且按一下即可重新顯示 setting_display_media_default: 隱藏標為敏感內容的媒體 setting_display_media_hide_all: 總是隱藏所有媒體 @@ -62,10 +62,10 @@ zh-TW: username: 您的使用者名稱將在 %{domain} 是獨一無二的 whole_word: 如果關鍵字或詞組僅有字母與數字,則其將只在符合整個單字的時候才會套用 domain_allow: - domain: 此域名將能夠攫取本站資料,而自域名該發出的資料也會於本站處理和留存。 + domain: 此網域將能夠攫取本站資料,而自該網域發出的資料也會於本站處理和留存。 email_domain_block: domain: 這可以是顯示在電子郵件中的網域名稱,或是其使用的 MX 紀錄。其將在註冊時檢查。 - with_dns_records: Mastodon 會嘗試解析所給域名的 DNS 記錄,解析結果一致者將一併封鎖 + with_dns_records: Mastodon 會嘗試解析所給網域的 DNS 記錄,解析結果一致者將一併封鎖 featured_tag: name: 這些是您最近使用的一些主題標籤: filters: @@ -107,7 +107,7 @@ zh-TW: ip_block: comment: 可選的,但請記得您為何添加這項規則。 expires_in: IP 位址是經常共用或轉手的有限資源,不建議無限期地封鎖特定 IP 位址。 - ip: 請輸入 IPv4 或 IPv6 位址,亦可以用 CIDR 語法以封鎖整個 IP 區段。小心不要把自己給一併封鎖掉囉! + ip: 請輸入 IPv4 或 IPv6 位址,亦可以用 CIDR 語法以封鎖整個 IP 區段。小心不要將自己給一併封鎖掉囉! severities: no_access: 封鎖對所有資源存取 sign_up_block: 無法註冊新帳號 @@ -154,7 +154,7 @@ zh-TW: none: 什麼也不做 sensitive: 敏感内容 silence: 安靜 - suspend: 停權並永久刪除帳號資料 + suspend: 停權並不可逆的刪除帳號資料 warning_preset_id: 使用警告預設 announcement: all_day: 全天活動 @@ -193,7 +193,7 @@ zh-TW: phrase: 關鍵字或片語 setting_advanced_layout: 啟用進階網頁介面 setting_aggregate_reblogs: 時間軸中的群組轉嘟 - setting_always_send_emails: 總是發送 e-mail 通知 + setting_always_send_emails: 總是發送電子郵件通知 setting_auto_play_gif: 自動播放 GIF 動畫 setting_boost_modal: 轉嘟前先詢問我 setting_crop_images: 將未展開嘟文中的圖片裁剪至 16x9 @@ -283,7 +283,7 @@ zh-TW: follow: 當有使用者跟隨您時,傳送電子郵件通知 follow_request: 當有使用者請求跟隨您時,傳送電子郵件通知 mention: 當有使用者在嘟文提及您時,傳送電子郵件通知 - pending_account: 需要審核的新帳號 + pending_account: 有新的帳號需要審核 reblog: 當有使用者轉嘟您的嘟文時,傳送電子郵件通知 report: 新回報已遞交 trending_tag: 新熱門趨勢需要審核 diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 8cb4bcb39..8a56fa7f3 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -105,6 +105,7 @@ sr: reject: Одбаци remove_avatar: Уклони аватар remove_header: Одстрани заглавље + removed_avatar_msg: Слика аватара корисника %{username} је успешно уклоњена resend_confirmation: already_confirmed: Овој корисник е веќе потврден send: Препрати го е-мајлот за потврда @@ -152,10 +153,13 @@ sr: disable_user: Онемогући корисника enable_user: Омогући корисника reject_user: Одбаци корисника + remove_avatar_user: Уклони аватар silence_account: Ограничи налог suspend_account: Обустави налог update_status: Уреди објаву update_user_role: Уреди улогу + actions: + remove_avatar_user_html: "%{name} је уклонио аватар корисника %{target}" deleted_account: обрисан налог filter_by_action: Филтрирај по активности filter_by_user: Филтрирај по кориснику @@ -236,6 +240,9 @@ sr: create: Додај домен title: Нова ставка е-поштe у црној листи title: Црна листа E-поште + export_domain_blocks: + import: + existing_relationships_warning: Постојећи односи у облику праћења follow_recommendations: status: Статус instances: @@ -283,6 +290,8 @@ sr: new: title: Креирај ново IP правило no_ip_block_selected: Ниједно IP правило није промењено јер ниједно није изабрано + relationships: + title: Односи корисника %{acct} relays: add_new: Додај нови релеј delete: Обриши @@ -404,14 +413,14 @@ sr: your_token: Ваш приступни токен auth: change_password: Лозинка - delete_account: Обриши налог - delete_account_html: Ако желите да обришете Ваш налог, можете <a href="%{path}">наставити овде</a>. Бићете упитани да потврдите. + delete_account: Брисање налога + delete_account_html: Ако желите да избришете ваш налог, можете <a href="%{path}">наставити овде</a>. Од вас ће се тражити потврда. didnt_get_confirmation: Нисте добили поруку са упутствима за потврду налога? forgot_password: Заборавили сте лозинку? invalid_reset_password_token: Токен за ресетовање лозинке је неисправан или је истекао. Затражите нови. login: Пријави се logout: Одјава - migrate_account: Помери у други налог + migrate_account: Премештање у други налог migrate_account_html: Ако желите да преусмерите овај налог на неки други, можете то <a href="%{path}">подесити овде</a>. or_log_in_with: Или се пријавите са providers: @@ -422,6 +431,9 @@ sr: reset_password: Ресетуј лозинку security: Безбедност set_new_password: Постави нову лозинку + status: + account_status: Статус налога + functional: Ваш налог је потпуно оперативан. authorize_follow: already_following: Већ пратите овај налог error: Нажалост, десила се грешка при тражењу удаљеног налога @@ -466,15 +478,20 @@ sr: archive_takeout: date: Датум download: Преузмите Вашу архиву - hint_html: Можете затражити архиву ваших <strong>труба и отпремљених медија</strong>. Извезени подаци ће бити у АктивитиПаб формату, који можете читати са било којим усаглашеним софтвером. Архиву можете затражити сваких 7 дана. + hint_html: Можете затражити архиву ваших <strong>објава и отпремљених медија</strong>. Извезени подаци ће бити у ActivityPub формату, који може читати било који компатибилан софтвер. Архиву можете затражити сваких 7 дана. in_progress: Састављање ваше архиве... - request: Затражите Вашу архиву + request: Затражите своју архиву size: Величина blocks: Блокирали сте domain_blocks: Блокови домена lists: Листе - mutes: Ућуткали сте + mutes: Игноришете storage: Мултимедијално складиште + featured_tags: + add_new: Додај нову + errors: + limit: Већ сте истакли максималан број хеш ознака + hint_html: "<strong>Шта су истакнуте хеш онаке?</strong> Оне се приказују истакнуто на вашем јавном профилу и омогућују људима да прегледају ваше јавне објаве конкретно под тим хеш ознакама. Оне су сјајан алат за праћење креативних радова или дугорочних пројеката." filters: contexts: home: Временска линија почетне @@ -487,6 +504,7 @@ sr: invalid_context: Ниједан или неважећи контекст испоручен index: delete: Избриши + empty: Немате филтере. title: Филтери new: title: Додај нови филтер @@ -535,6 +553,8 @@ sr: too_many: Не може се прикачити више од 4 фајла migrations: acct: корисник@домен новог налога + incoming_migrations: Премештање из другог налога + incoming_migrations_html: Да бисте прешли са другог налога на овај, прво морате <a href="%{path}">креирате псеудоним налога</a>. moderation: title: Модерација notification_mailer: @@ -573,18 +593,38 @@ sr: other: Остало posting_defaults: Подразумевана подешавања објављивања public_timelines: Јавне временске линије + relationships: + activity: Активност налога + confirm_follow_selected_followers: Да ли сте сигурни да желите да пратите изабране пратиоце? + confirm_remove_selected_followers: Да ли сте сигурни да желите да уклоните изабране пратиоце? + confirm_remove_selected_follows: Да ли сте сигурни да желите да уклоните изабрана праћења? + dormant: Неактиван + follow_selected_followers: Прати изабране пратиоце + followers: Пратиоци + following: Праћења + invited: Позван + last_active: Последњи пут активан + most_recent: Најновији + moved: Премештен + mutual: Заједнички + primary: Примарни + relationship: Однос + remove_selected_domains: Уклони све пратиоце са изабраних домена + remove_selected_followers: Уклони изабране пратиоце + remove_selected_follows: Отпрати изабране кориснике + status: Статус налога remote_follow: missing_resource: Не могу да нађем захтевану адресу преусмеравања за Ваш налог scheduled_statuses: - over_daily_limit: Прекорачили сте границу од %{limit} планираних труба за тај дан - over_total_limit: Прекорачили сте границу од %{limit} планираних труба + over_daily_limit: Прекорачили сте границу од %{limit} планираних објава за данас + over_total_limit: Прекорачили сте границу од %{limit} планираних објава too_soon: Планирани датум мора бити у будућности sessions: activity: Последња активност browser: Веб читач browsers: alipay: Алипеј - chrome: Хром + chrome: Chrome edge: Мајкрософт Еџ electron: Електрон firefox: Фајерфокс @@ -609,13 +649,16 @@ sr: linux: Линукса mac: Мека other: непознате платформе - windows: Виндоуза - windows_mobile: Виндоуз мобилног - windows_phone: Виндоуз телефона + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: Опозови revoke_success: Сесија успешно опозвана title: Сесије + view_authentication_history: Погледајте историју аутентификације вашег налога settings: + account: Налог + account_settings: Подешавања налога appearance: Изглед authorized_apps: Ауторизоване апликације back: Назад на Мастодон @@ -623,6 +666,7 @@ sr: development: Развој edit_profile: Уређивање профила export: Извоз података + featured_tags: Истакнуте хеш ознаке import: Увоз import_and_export: Увоз и извоз migrate: Пребацивање налога @@ -630,6 +674,7 @@ sr: preferences: Подешавања profile: Налог relationships: Праћења и пратиоци + statuses_cleanup: Аутоматско брисање објава two_factor_authentication: Двофакторска идентификација statuses: attached: @@ -652,7 +697,7 @@ sr: open_in_web: Отвори у вебу over_character_limit: ограничење од %{max} карактера прекорачено pin_errors: - limit: Већ имате прикачен највећи број труба + limit: Већ сте закачили максималан број објава ownership: Туђа објава се не може закачити reblog: Подршка не може да се прикачи show_more: Прикажи још @@ -664,6 +709,40 @@ sr: public_long: Свако може да види unlisted: Неизлистано unlisted_long: Свако може да види, али није излистано на јавним временским линијама + statuses_cleanup: + enabled: Аутоматски избриши старе објаве + enabled_hint: Аутоматски брише ваше објаве када достигну одређени старосни праг, осим ако се не подударају са једним од изузетака у наставку + exceptions: Изузеци + explanation: Пошто је брисање објава скупа операција, ово се ради полако током времена када сервер иначе није заузет. Из тог разлога, ваше објаве могу бити избрисане неко време након што достигну старосни праг. + ignore_favs: Игнориши омиљене + ignore_reblogs: Игнориши подржавања + interaction_exceptions: Изузеци засновани на интеракцијама + interaction_exceptions_explanation: Имајте на уму да не постоји гаранција да ће објаве бити избрисане ако број означавања као омиљених или број подржавања падне испод прага након што га премаше. + keep_direct: Задржи директне поруке + keep_direct_hint: Не брише ниједну од ваших директних порука + keep_media: Задржи објаве са медијским прилозима + keep_media_hint: Не брише ниједну од ваших објава које имају медијске прилоге + keep_pinned: Задржи закачене објаве + keep_pinned_hint: Не брише ниједну од ваших закачених објава + keep_polls: Задржи анкете + keep_polls_hint: Не брише ниједну од ваших анкета + keep_self_bookmark: Задржи објаве које сте додали у обележиваче + keep_self_bookmark_hint: Не брише ваше сопствене објаве ако сте их додлаи у обележиваче + keep_self_fav: Задржи омиљене објаве + keep_self_fav_hint: Не брише ваше сопствене објаве ако сте их означили као омиљене + min_age: + '1209600': 2 седмице + '15778476': 6 месеци + '2629746': 1 месец + '31556952': 1 година + '5259492': 2 месеца + '604800': 1 седмица + '63113904': 2 годинe + '7889238': 3 месеца + min_age_label: Старосни праг + min_favs: Задржи објаве означене као омиљене најмање + min_favs_hint: Не брише ниједну вашу објаву која је добила најмање овај број омиљених. Оставите празно за брисање објава без обзира на њихов број омиљених + min_reblogs_hint: Не брише ниједну вашу објаву која је била подржана најмање оволико пута. Оставите празно за брисање објава без обзира на њихов број подржавања stream_entries: pinned: Закачена објава reblogged: подржано diff --git a/config/locales/sv.yml b/config/locales/sv.yml index c5ad5a8da..9352f0c19 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -91,6 +91,7 @@ sv: moderation: active: Aktiv all: Alla + disabled: Inaktiverad pending: Väntande silenced: Begränsad suspended: Avstängda @@ -133,6 +134,7 @@ sv: search: Sök search_same_email_domain: Andra användare med samma e-postdomän search_same_ip: Annan användare med samma IP-adress + security: Säkerhet security_measures: only_password: Endast lösenord password_and_2fa: Lösenord och 2FA @@ -427,6 +429,7 @@ sv: resolve: Slå upp domän title: Blockera ny e-postdomän no_email_domain_block_selected: Inga blockeringar av e-postdomäner ändrades eftersom inga valdes + not_permitted: Ej tillåtet resolved_dns_records_hint_html: Domännamnet ger uppslag till följande MX-domäner, vilka är ytterst ansvariga för att e-post tas emot. Att blockera en MX-domän blockerar även registreringar från alla e-postadresser som använder samma MX-domän, även om det synliga domännamnet är annorlunda. <strong>Var noga med att inte blockera stora e-postleverantörer.</strong> resolved_through_html: Uppslagen genom %{domain} title: Blockerade e-postdomäner @@ -473,6 +476,7 @@ sv: content_policies: comment: Intern anteckning description_html: Du kan definiera innehållspolicyer som kommer tillämpas på alla konton från denna domän samt alla dess underdomäner. + limited_federation_mode_description_html: Du kan välja om du vill tillåta federering med den här domänen. policies: reject_media: Avvisa media reject_reports: Avvisa rapporter @@ -585,11 +589,13 @@ sv: assign_to_self: Tilldela till mig assigned: Tilldelad moderator by_target_domain: Domän för rapporterat konto + cancel: Avbryt category: Kategori category_description_html: Anledningen till att kontot och/eller innehållet rapporterades kommer att visas i kommunikation med det rapporterade kontot comment: none: Ingen comment_description_html: 'För att ge mer information, skrev %{name}:' + confirm: Bekräfta confirm_action: Bekräfta modereringsåtgärd mot @%{acct} created_at: Anmäld delete_and_resolve: Ta bort inlägg @@ -628,9 +634,20 @@ sv: suspend_html: 'Du håller på att <strong>stänga av</strong> <strong>@%{acct}</strong>s konto. Detta kommer:' actions: delete_html: Ta bort kränkande inlägg + mark_as_sensitive_html: Markera de anmälda inläggens media som känslig + silence_html: Begränsa kraftigt <strong>@%{acct}</strong> räckvidd genom att göra deras profil och innehåll bara synligt till folk som redan följer dom eller som manuellt söker upp deras profil + suspend_html: Stäng av <strong>@%{acct}</strong>, vilket gör deras profil och innehåll oåtkomligt och omöjligt att interagera med + close_report: 'Markera anmälningen #%{id} som löst' + close_reports_html: Markera <strong>alla</strong> anmälningar mot <strong>@%{acct}</strong> som lösta + delete_data_html: Ta bort <strong>@%{acct}</strong>s profil och innehåll om 30 dagar ifall deras avstängning inte tagits bort under tiden + preview_preamble_html: "<strong>@%{acct}</strong> kommer få en varning med följande innehåll:" + record_strike_html: Registrera en varning mot <strong>@%{acct}</strong> för att hjälpa dig eskalera vid framtida överträdelser från detta konto + send_email_html: Skicka <strong>@%{acct}</strong> ett varningsmejl + warning_placeholder: Valfri ytterligare resonemang för modereringsåtgärd. target_origin: Ursprung för anmält konto title: Anmälningar unassign: Otilldela + unknown_action_msg: 'Okänd åtgärd: %{action}' unresolved: Olösta updated_at: Uppdaterad view_profile: Visa profil @@ -781,6 +798,7 @@ sv: suspend: "%{name} stängde av %{target}s konto" appeal_approved: Överklagad appeal_pending: Överklagande väntar + appeal_rejected: Överklagan avslagen system_checks: database_schema_check: message_html: Det finns väntande databasmigreringar. Vänligen kör dem för att säkerställa att programmet beter sig som förväntat @@ -816,6 +834,7 @@ sv: other: Delad av %{count} personer under den senaste veckan title: Trendande länkar usage_comparison: Delade %{today} gånger idag, jämfört med %{yesterday} igår + not_allowed_to_trend: Inte tillåtet att trenda only_allowed: Endast tillåtna pending_review: Väntar på granskning preview_card_providers: @@ -947,6 +966,7 @@ sv: applications: created: Ansökan är framgångsrikt skapad destroyed: Ansökan är framgångsrikt borttagen + logout: Logga ut regenerate_token: Regenerera access token token_regenerated: Access token lyckades regenereras warning: Var mycket försiktig med denna data. Dela aldrig den med någon! @@ -954,6 +974,8 @@ sv: auth: apply_for_account: Ansök om konto change_password: Lösenord + confirmations: + wrong_email_hint: Om e-postadressen inte är rätt, kan du ändra den i kontoinställningarna. delete_account: Radera 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. description: @@ -981,6 +1003,8 @@ sv: resend_confirmation: Skicka instruktionerna om bekräftelse igen reset_password: Återställ lösenord rules: + accept: Godkänn + back: Tillbaka preamble: Dessa bestäms och upprätthålls av moderatorerna för %{domain}. title: Några grundregler. security: Säkerhet @@ -1127,6 +1151,8 @@ sv: storage: Medialagring featured_tags: add_new: Lägg till ny + errors: + limit: Du har redan fäst det maximala antalet hashtags hint_html: "<strong>Vad är utvalda hashtaggar?</strong> De visas tydligt på din offentliga profil och låter andra bläddra bland dina offentliga inlägg specifikt under dessa hashtaggar. De är ett bra verktyg för att hålla reda på kreativa arbeten eller långsiktiga projekt." filters: contexts: @@ -1234,6 +1260,9 @@ sv: expires_at: Utgår uses: Användningar title: Bjud in andra + lists: + errors: + limit: Du har nått det maximala antalet listor login_activities: authentication_methods: otp: tvåfaktorsautentiseringsapp @@ -1374,6 +1403,9 @@ sv: unrecognized_emoji: är inte en igenkänd emoji relationships: activity: Kontoaktivitet + confirm_follow_selected_followers: Är du säker på att du vill följa valda följare? + confirm_remove_selected_followers: Är du säker på att du vill ta bort valda följare? + confirm_remove_selected_follows: Är du säker på att du vill ta bort valda följare? dormant: Vilande follow_selected_followers: Följ valda personer followers: Följare @@ -1550,6 +1582,7 @@ sv: '7889238': 3 månader min_age_label: Åldersgräns min_favs: Behåll favoritmarkerade inlägg i minst + min_favs_hint: Raderar inte några av dina inlägg som har fått minst detta antalet av favoritmarkeringar. Lämna tomt för att ta bort inlägg oavsett hur många favoritmarkeringar de har fått min_reblogs: Behåll boostade inlägg i minst min_reblogs_hint: Raderar inte något av dina inlägg som har blivit boostat minst detta antal gånger. Lämna tomt för att radera inlägg oavsett antal boostar stream_entries: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 269e4f4b0..538b9304b 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1550,6 +1550,7 @@ vi: '7889238': 3 tháng min_age_label: Thời điểm min_favs: Giữ những tút yêu thích lâu hơn + min_favs_hint: Những tút có lượt thích nhiều hơn số này sẽ không bị xóa. Để trống nếu bạn muốn xóa hết min_reblogs: Giữ những tút đã đăng lại lâu hơn min_reblogs_hint: Những tút có lượt đăng lại nhiều hơn số này sẽ không bị xóa. Để trống nếu bạn muốn xóa hết stream_entries: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index adaad2c1c..6538e3459 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1133,6 +1133,8 @@ zh-HK: storage: 媒體容量大小 featured_tags: add_new: 新增 + errors: + limit: 你推薦的標籤數量已達上限 hint_html: "<strong>甚麼是推薦主題標籤?</strong> 它們會被顯示在你的個人資料頁面,讓其他人可以根據標籤瀏覽你的公開文章,令人們更易找到你創作或者長期作品!" filters: contexts: @@ -1232,6 +1234,9 @@ zh-HK: expires_at: 失效時間 uses: 已使用次數 title: 邀請用戶 + lists: + errors: + limit: 你已達到列表數量的上限 login_activities: authentication_methods: otp: 兩步認證軟體 @@ -1545,6 +1550,7 @@ zh-HK: '7889238': 3 個月 min_age_label: 按時間篩選 min_favs: 保留超過嘟文最愛門檻 + min_favs_hint: 收到此數量或更多最愛的帖文將不會被刪除。 留空可無視最愛數量刪除帖子 min_reblogs: 保留超過嘟文轉嘟門檻 min_reblogs_hint: 如果您嘟文已收到超過轉嘟門檻則不會刪除。留白表示不論轉嘟數量皆刪除嘟文。 stream_entries: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 04752a294..a25818bca 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -31,7 +31,7 @@ zh-TW: accounts: add_email_domain_block: 將電子郵件網域加入黑名單 approve: 批准 - approved_msg: 成功審核了 %{username} 的新帳號申請 + approved_msg: 已成功審核 %{username} 的新帳號申請 are_you_sure: 您確定嗎? avatar: 大頭貼 by_domain: 站點 @@ -113,13 +113,13 @@ zh-TW: redownload: 重新整理個人檔案 redownloaded_msg: 成功重新載入%{username} 的個人檔案頁面 reject: 拒絕 - rejected_msg: 成功婉拒了 %{username} 的新帳號申請 + rejected_msg: 已成功婉拒 %{username} 的新帳號申請 remote_suspension_irreversible: 此帳號之資料已被不可逆地刪除。 remote_suspension_reversible_hint_html: 這個帳號已於此伺服器被停權,所有資料將會於 %{date} 被刪除。在此之前,遠端伺服器可以完全回復此的帳號。如果您想即時刪除這個帳號的資料,您可以在下面進行操作。 remove_avatar: 取消大頭貼 remove_header: 移除開頭 - removed_avatar_msg: 成功刪除了 %{username} 的大頭貼 - removed_header_msg: 成功刪除了 %{username} 的封面圖片 + removed_avatar_msg: 已成功刪除 %{username} 的大頭貼 + removed_header_msg: 已成功刪除 %{username} 的封面圖片 resend_confirmation: already_confirmed: 此使用者已被確認 send: 重新發送驗證信 @@ -135,11 +135,11 @@ zh-TW: security_measures: only_password: 僅使用密碼 password_and_2fa: 密碼及兩階段驗證 (2FA) - sensitive: 敏感内容 + sensitive: 強制標記為敏感内容 sensitized: 已標記為敏感內容 shared_inbox_url: 共享收件匣 URL show: - created_reports: 建立檢舉 + created_reports: 新增檢舉 targeted_reports: 由其他人檢舉 silence: 靜音 silenced: 已靜音 @@ -154,7 +154,7 @@ zh-TW: unblock_email: 解除封鎖電子郵件地址 unblocked_email_msg: 成功解除封鎖 %{username} 的電子郵件地址 unconfirmed_email: 未確認的電子郵件地址 - undo_sensitized: 取消敏感狀態 + undo_sensitized: 取消強制標記為敏感內容 undo_silenced: 取消靜音 undo_suspension: 取消停權 unsilenced_msg: 成功解除 %{username} 的帳號限制 @@ -173,23 +173,23 @@ zh-TW: change_email_user: 變更使用者的電子郵件地址 change_role_user: 變更使用者角色 confirm_user: 確認使用者 - create_account_warning: 建立警告 - create_announcement: 建立公告 + create_account_warning: 新增警告 + create_announcement: 新增公告 create_canonical_email_block: 新增 E-mail 封鎖 - create_custom_emoji: 建立自訂顏文字 - create_domain_allow: 建立允許網域 - create_domain_block: 建立阻擋網域 + create_custom_emoji: 新增自訂顏文字 + create_domain_allow: 新增允許網域 + create_domain_block: 新增網域封鎖 create_email_domain_block: 新增電子郵件網域封鎖 create_ip_block: 新增IP規則 create_unavailable_domain: 新增無法存取的網域 - create_user_role: 建立角色 - demote_user: 把用戶降級 + create_user_role: 新增角色 + demote_user: 將用戶降級 destroy_announcement: 刪除公告 destroy_canonical_email_block: 刪除 E-mail 封鎖 destroy_custom_emoji: 刪除自訂顏文字 destroy_domain_allow: 刪除允許網域 - destroy_domain_block: 刪除阻擋網域 - destroy_email_domain_block: 刪除阻擋電郵網域 + destroy_domain_block: 刪除網域封鎖 + destroy_email_domain_block: 刪除電子郵件網域封鎖 destroy_instance: 清除網域 destroy_ip_block: 刪除 IP 規則 destroy_status: 刪除狀態 @@ -203,7 +203,7 @@ zh-TW: enable_sign_in_token_auth_user: 啟用使用者電子郵件 token 驗證 enable_user: 啓用帳號 memorialize_account: 設定成追悼帳號 - promote_user: 把用戶升級 + promote_user: 將用戶升級 reject_appeal: 駁回申訴 reject_user: 回絕使用者 remove_avatar_user: 刪除大頭貼 @@ -211,79 +211,79 @@ zh-TW: resend_user: 重新發送驗證信 reset_password_user: 重設密碼 resolve_report: 消除舉報 - sensitive_account: 把您的帳號的媒體標記為敏感內容 + sensitive_account: 將媒體強制標記為敏感內容 silence_account: 靜音帳號 suspend_account: 停權帳號 unassigned_report: 取消指派舉報 unblock_email_account: 解除封鎖電子郵件地址 - unsensitive_account: 取消把您的帳號的媒體設定為敏感內容 + unsensitive_account: 取消將媒體強制標記為敏感內容 unsilence_account: 取消帳號的靜音狀態 unsuspend_account: 取消帳號的暫停狀態 update_announcement: 更新公告 update_custom_emoji: 更新自訂顏文字 - update_domain_block: 更新封鎖網域 + update_domain_block: 更新網域封鎖 update_ip_block: 更新 IP 規則 update_status: 更新狀態 update_user_role: 更新角色 actions: - approve_appeal_html: "%{name} 批准了來自 %{target} 的審核決定申訴" - approve_user_html: "%{name} 批准了從 %{target} 而來的註冊" + approve_appeal_html: "%{name} 已批准來自 %{target} 的審核決定申訴" + approve_user_html: "%{name} 已批准從 %{target} 而來的註冊" assigned_to_self_report_html: "%{name} 將報告 %{target} 指派給自己" - change_email_user_html: "%{name} 變更了使用者 %{target} 的電子郵件地址" - change_role_user_html: "%{name} 變更了 %{target} 的角色" - confirm_user_html: "%{name} 確認了使用者 %{target} 的電子郵件位址" + change_email_user_html: "%{name} 已變更使用者 %{target} 的電子郵件地址" + change_role_user_html: "%{name} 已變更 %{target} 的角色" + confirm_user_html: "%{name} 已確認使用者 %{target} 的電子郵件位址" create_account_warning_html: "%{name} 已對 %{target} 送出警告" - create_announcement_html: "%{name} 新增了公告 %{target}" - create_canonical_email_block_html: "%{name} 已封鎖了 hash 為 %{target} 之 e-mail" - create_custom_emoji_html: "%{name} 上傳了新自訂表情符號 %{target}" + create_announcement_html: "%{name} 已新增公告 %{target}" + create_canonical_email_block_html: "%{name} 已封鎖 hash 為 %{target} 的 e-mail" + create_custom_emoji_html: "%{name} 已上傳新自訂表情符號 %{target}" create_domain_allow_html: "%{name} 允許 %{target} 網域加入聯邦宇宙" - create_domain_block_html: "%{name} 封鎖了網域 %{target}" - create_email_domain_block_html: "%{name} 封鎖了電子郵件網域 %{target}" - create_ip_block_html: "%{name} 已經設定了IP %{target} 的規則" + create_domain_block_html: "%{name} 已封鎖網域 %{target}" + create_email_domain_block_html: "%{name} 已封鎖電子郵件網域 %{target}" + create_ip_block_html: "%{name} 已設定 IP %{target} 的規則" create_unavailable_domain_html: "%{name} 停止發送至網域 %{target}" - create_user_role_html: "%{name} 建立了 %{target} 角色" + create_user_role_html: "%{name} 已新增 %{target} 角色" demote_user_html: "%{name} 將使用者 %{target} 降級" - destroy_announcement_html: "%{name} 刪除了公告 %{target}" + destroy_announcement_html: "%{name} 已刪除公告 %{target}" destroy_canonical_email_block_html: "%{name} 已解除封鎖 hash 為 %{target} 的電子郵件" - destroy_custom_emoji_html: "%{name} 刪除了表情符號 %{target}" + destroy_custom_emoji_html: "%{name} 已刪除表情符號 %{target}" destroy_domain_allow_html: "%{name} 不允許與網域 %{target} 加入聯邦宇宙" destroy_domain_block_html: "%{name} 已解除封鎖網域 %{target}" destroy_email_domain_block_html: "%{name} 已解除封鎖電子郵件網域 %{target}" - destroy_instance_html: "%{name} 清除了網域 %{target}" - destroy_ip_block_html: "%{name} 刪除了 IP %{target} 的規則" - destroy_status_html: "%{name} 刪除了 %{target} 的嘟文" - destroy_unavailable_domain_html: "%{name} 恢復了對網域 %{target} 的發送" - destroy_user_role_html: "%{name} 刪除了 %{target} 角色" - disable_2fa_user_html: "%{name} 停用了使用者 %{target} 的兩階段認證 (2FA) " - disable_custom_emoji_html: "%{name} 停用了自訂表情符號 %{target}" - disable_sign_in_token_auth_user_html: "%{name} 停用了 %{target} 之使用者電子郵件 token 驗證" + destroy_instance_html: "%{name} 已清除網域 %{target}" + destroy_ip_block_html: "%{name} 已刪除 IP %{target} 的規則" + destroy_status_html: "%{name} 已刪除 %{target} 的嘟文" + destroy_unavailable_domain_html: "%{name} 已恢復對網域 %{target} 的發送" + destroy_user_role_html: "%{name} 已刪除 %{target} 角色" + disable_2fa_user_html: "%{name} 已停用使用者 %{target} 的兩階段認證 (2FA) " + disable_custom_emoji_html: "%{name} 已停用自訂表情符號 %{target}" + disable_sign_in_token_auth_user_html: "%{name} 已停用 %{target} 之使用者電子郵件 token 驗證" disable_user_html: "%{name} 將使用者 %{target} 設定為禁止登入" - enable_custom_emoji_html: "%{name} 啟用了自訂表情符號 %{target}" - enable_sign_in_token_auth_user_html: "%{name} 啟用了 %{target} 之使用者電子郵件 token 驗證" + enable_custom_emoji_html: "%{name} 已啟用自訂表情符號 %{target}" + enable_sign_in_token_auth_user_html: "%{name} 已啟用 %{target} 之使用者電子郵件 token 驗證" enable_user_html: "%{name} 將使用者 %{target} 設定為允許登入" memorialize_account_html: "%{name} 將 %{target} 設定為追悼帳號" - promote_user_html: "%{name} 對使用者 %{target} 進行了晉級操作" - reject_appeal_html: "%{name} 回絕了來自 %{target} 的審核決定申訴" - reject_user_html: "%{name} 回絕了從 %{target} 而來的註冊" - remove_avatar_user_html: "%{name} 移除了 %{target} 的大頭貼" + promote_user_html: "%{name} 對使用者 %{target} 已進行晉級操作" + reject_appeal_html: "%{name} 已回絕來自 %{target} 的審核決定申訴" + reject_user_html: "%{name} 已回絕從 %{target} 而來的註冊" + remove_avatar_user_html: "%{name} 已移除 %{target} 的大頭貼" reopen_report_html: "%{name} 重新開啟 %{target} 的檢舉" resend_user_html: "%{name} 已重新發送驗證信給 %{target}" - reset_password_user_html: "%{name} 重新設定了使用者 %{target} 的密碼" - resolve_report_html: "%{name} 處理了 %{target} 的檢舉" + reset_password_user_html: "%{name} 已重新設定使用者 %{target} 的密碼" + resolve_report_html: "%{name} 已處理 %{target} 的檢舉" sensitive_account_html: "%{name} 將 %{target} 的媒體檔案標記為敏感內容" - silence_account_html: "%{name} 靜音了使用者 %{target}" + silence_account_html: "%{name} 已靜音使用者 %{target}" suspend_account_html: "%{name} 已停權 %{target} 的帳號" unassigned_report_html: "%{name} 取消指派 %{target} 的檢舉" unblock_email_account_html: "%{name} 已解除封鎖 %{target} 的電子郵件地址" - unsensitive_account_html: "%{name} 將 %{target} 的媒體檔案的敏感狀態取消" - unsilence_account_html: "%{name} 取消了使用者 %{target} 的靜音狀態" + unsensitive_account_html: "%{name} 將 %{target} 的媒體檔案取消標記為敏感內容" + unsilence_account_html: "%{name} 已取消使用者 %{target} 的靜音狀態" unsuspend_account_html: "%{name} 已取消停權 %{target} 的帳號" - update_announcement_html: "%{name} 更新了公告 %{target}" - update_custom_emoji_html: "%{name} 更新了自訂表情符號 %{target}" - update_domain_block_html: "%{name} 更新了 %{target} 之網域封鎖" - update_ip_block_html: "%{name} 已經更新了 IP %{target} 之規則" - update_status_html: "%{name} 更新了 %{target} 的嘟文" - update_user_role_html: "%{name} 變更了 %{target} 角色" + update_announcement_html: "%{name} 已更新公告 %{target}" + update_custom_emoji_html: "%{name} 已更新自訂表情符號 %{target}" + update_domain_block_html: "%{name} 已更新 %{target} 之網域封鎖" + update_ip_block_html: "%{name} 已變更 IP %{target} 之規則" + update_status_html: "%{name} 已更新 %{target} 的嘟文" + update_user_role_html: "%{name} 已變更 %{target} 角色" deleted_account: 已刪除帳號 empty: 找不到 log filter_by_action: 按動作過濾 @@ -296,7 +296,7 @@ zh-TW: empty: 找不到公告。 live: 直播 new: - create: 建立公告 + create: 新增公告 title: 新增公告 publish: 發布 published_msg: 成功發布公告! @@ -374,13 +374,13 @@ zh-TW: import: 匯入 undo: 從聯邦宇宙白名單移除 domain_blocks: - add_new: 新增欲封鎖域名 + add_new: 新增網域黑名單 created_msg: 正在進行網域封鎖 destroyed_msg: 已撤銷網域封鎖 domain: 站點 edit: 更改封鎖的站台 - existing_domain_block: 您已對 %{name} 施加了更嚴格的限制。 - existing_domain_block_html: 您已經對 %{name} 施加了更嚴格的限制,您需要先 <a href="%{unblock_url}">解除封鎖</a>。 + existing_domain_block: 您已對 %{name} 施加更嚴格的限制。 + existing_domain_block_html: 您已對 %{name} 施加更嚴格的限制,您需要先 <a href="%{unblock_url}">解除封鎖</a>。 export: 匯出 import: 匯入 new: @@ -391,7 +391,7 @@ zh-TW: noop: 無 silence: 靜音 suspend: 停權 - title: 新增封鎖站點 + title: 新增網域黑名單 no_domain_block_selected: 因未選取網域黑名單,所以什麼事都沒發生 not_permitted: 您無權執行此操作 obfuscate: 混淆網域名稱 @@ -405,7 +405,7 @@ zh-TW: reject_reports: 拒絕檢舉 reject_reports_hint: 忽略所有來自此網域的檢舉。與停權無關 undo: 撤銷網域封鎖 - view: 顯示阻擋的網域 + view: 顯示已封鎖網域 email_domain_blocks: add_new: 加入新項目 attempts_over_week: @@ -715,7 +715,7 @@ zh-TW: title: 關於 appearance: preamble: 客製化 Mastodon 網頁介面。 - title: 外觀設定 + title: 外觀 branding: preamble: 您的伺服器品牌使之從聯邦宇宙網路中其他伺服器間凸顯自己。此資訊可能於各種不同的環境中顯示,例如 Mastodon 網頁介面、原生應用程式、其他網頁上的連結預覽或是其他通訊應用程式等等。因此,請盡可能保持此資訊簡潔明朗。 title: 品牌化 @@ -777,13 +777,13 @@ zh-TW: with_media: 含有媒體檔案 strikes: actions: - delete_statuses: "%{name} 刪除了 %{target} 的嘟文" - disable: "%{name} 凍結了 %{target} 的帳號" + delete_statuses: "%{name} 已刪除 %{target} 的嘟文" + disable: "%{name} 已凍結 %{target} 的帳號" mark_statuses_as_sensitive: "%{name} 將 %{target} 的嘟文標記為敏感內容" none: "%{name} 已對 %{target} 送出警告" sensitive: "%{name} 將 %{target} 的帳號標記為含有敏感內容" - silence: "%{name} 限制了 %{target} 的帳號" - suspend: "%{name} 將 %{target} 的帳號停權" + silence: "%{name} 已限制 %{target} 的帳號" + suspend: "%{name} 已將 %{target} 的帳號停權" appeal_approved: 已申訴 appeal_pending: 申訴待審中 appeal_rejected: 申訴被駁回 @@ -907,8 +907,8 @@ zh-TW: body: 以下是新帳號的詳細資訊。您可以同意或拒絕這項申請。 subject: "%{instance} 上有新帳號 (%{username}) 待審核" new_report: - body: "%{reporter} 檢舉了使用者 %{target}" - body_remote: 來自 %{domain} 的使用者檢舉了使用者 %{target} + body: "%{reporter} 已檢舉使用者 %{target}" + body_remote: 來自 %{domain} 的使用者已檢舉使用者 %{target} subject: 來自 %{instance} 的使用者檢舉(#%{id}) new_trends: body: 以下項目需要經過審核才能公開顯示: @@ -953,7 +953,7 @@ zh-TW: logout: 登出 regenerate_token: 重新產生存取 token token_regenerated: 已重新產生存取 token - warning: 警告,不要把它分享給任何人! + warning: 警告,不要將它分享給任何人! your_token: 您的 access token auth: apply_for_account: 申請帳號 @@ -1001,7 +1001,7 @@ zh-TW: preamble_html: 請使用您在 <strong>%{domain}</strong> 的帳號密碼登入。若您的帳號託管於其他伺服器,您將無法在此登入。 title: 登入 %{domain} sign_up: - preamble: 在這個 Mastodon 伺服器上有個帳號的話,您將能跟隨聯邦宇宙網路中的任何人,無論他們的帳號託管於哪個伺服器。 + preamble: 於此 Mastodon 伺服器擁有帳號的話,您將能跟隨聯邦宇宙網路中任何一份子,無論他們的帳號託管於何處。 title: 讓我們一起設定 %{domain} 吧! status: account_status: 帳號狀態 @@ -1013,7 +1013,7 @@ zh-TW: too_fast: 送出表單的速度太快跟不上,請稍後再試。 use_security_key: 使用安全金鑰 authorize_follow: - already_following: 您已經跟隨了這個使用者 + already_following: 您已經跟隨這個使用者 already_requested: 您早已向該帳號寄送跟隨請求 error: 對不起,搜尋其他站點使用者出現錯誤 follow: 跟隨 @@ -1099,7 +1099,7 @@ zh-TW: your_appeal_pending: 您已遞交申訴 your_appeal_rejected: 您的申訴已被駁回 domain_validator: - invalid_domain: 並非一個有效域名 + invalid_domain: 並非一個有效網域 errors: '400': 您所送出的請求無效或格式不正確。 '403': 您沒有檢視這個頁面的權限。 @@ -1129,7 +1129,7 @@ zh-TW: blocks: 您封鎖的使用者 bookmarks: 書籤 csv: CSV - domain_blocks: 域名封鎖 + domain_blocks: 網域封鎖 lists: 列表 mutes: 您靜音的使用者 storage: 儲存空間大小 @@ -1191,7 +1191,7 @@ zh-TW: deselect: 取消選擇全部 none: 無 order_by: 排序 - save_changes: 儲存修改 + save_changes: 儲存變更 select_all_matching_items: other: 選取 %{count} 個符合您搜尋的項目。 today: 今天 @@ -1209,10 +1209,10 @@ zh-TW: preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括跟隨的使用者、封鎖的使用者名單。 success: 資料上傳成功,正在匯入,請稍候 types: - blocking: 您封鎖的使用者名單 + blocking: 您封鎖的使用者列表 bookmarks: 書籤 - domain_blocking: 域名封鎖名單 - following: 您跟隨的使用者名單 + domain_blocking: 網域封鎖列表 + following: 您跟隨的使用者列表 muting: 您靜音的使用者名單 upload: 上傳 invites: @@ -1282,7 +1282,7 @@ zh-TW: before: 在進行下一步驟之前,請詳細閱讀以下説明: cooldown: 在轉移帳號後會有一段等待時間,在等待時間內您將無法再次轉移 disabled_account: 之後您的目前帳號將完全無法使用。但您可以存取資料匯出與重新啟用。 - followers: 此動作將會把目前帳號的所有跟隨者轉移至新帳號 + followers: 此動作將會將目前帳號的所有跟隨者轉移至新帳號 only_redirect_html: 或者,您也可以<a href="%{path}">僅在您的個人檔案中設定重新導向</a>。 other_data: 其他資料並不會自動轉移 redirect: 您目前的帳號將會在個人檔案頁面新增重新導向公告,並會被排除在搜尋結果之外 @@ -1297,7 +1297,7 @@ zh-TW: notification_mailer: admin: report: - subject: "%{name} 送出了一則檢舉報告" + subject: "%{name} 已送出一則檢舉報告" sign_up: subject: "%{name} 已進行註冊" favourite: @@ -1327,7 +1327,7 @@ zh-TW: status: subject: "%{name} 剛剛嘟文" update: - subject: "%{name} 編輯了嘟文" + subject: "%{name} 已編輯嘟文" notifications: email_events: 電子郵件通知設定 email_events_hint: 選取您想接收通知的事件: @@ -1379,11 +1379,11 @@ zh-TW: unrecognized_emoji: 並非一個可識別的 emoji relationships: activity: 帳號動態 - confirm_follow_selected_followers: 您確定要跟隨這些選取的跟隨者嗎? - confirm_remove_selected_followers: 您確定要移除這些選取的跟隨者嗎? + confirm_follow_selected_followers: 您確定要跟隨選取的跟隨者嗎? + confirm_remove_selected_followers: 您確定要移除選取的跟隨者嗎? confirm_remove_selected_follows: 您確定要取消跟隨這些選取的使用者嗎? dormant: 潛水中 - follow_selected_followers: 跟隨所選取的跟隨者 + follow_selected_followers: 跟隨選取的跟隨者 followers: 跟隨者 following: 跟隨中 invited: 已邀請 @@ -1394,8 +1394,8 @@ zh-TW: primary: 主要 relationship: 關係 remove_selected_domains: 從所選取網域中移除所有跟隨者 - remove_selected_followers: 移除所選取的跟隨者 - remove_selected_follows: 取消跟隨所選取使用者 + remove_selected_followers: 移除選取的跟隨者 + remove_selected_follows: 取消跟隨選取的使用者 status: 帳號狀態 remote_follow: missing_resource: 無法找到資源 @@ -1409,7 +1409,7 @@ zh-TW: tag: '帶有 #%{hashtag} 之公開嘟文' scheduled_statuses: over_daily_limit: 您已經超過了本日排定發嘟的限額 (%{limit}) - over_total_limit: 您已經超過了排定發嘟的限額 (%{limit}) + over_total_limit: 您已經超過排程發嘟的限額 (%{limit}) too_soon: 嘟文不可以改變過去哦,只能預定未來 (咦) sessions: activity: 最近活動 @@ -1457,7 +1457,7 @@ zh-TW: account: 帳號 account_settings: 帳號設定 aliases: 帳號別名 - appearance: 外觀設定 + appearance: 外觀 authorized_apps: 已授權應用程式 back: 回到 Mastodon delete: 刪除帳號 @@ -1494,9 +1494,9 @@ zh-TW: errors: in_reply_not_found: 您嘗試回覆的嘟文看起來不存在。 open_in_web: 以網頁開啟 - over_character_limit: 超過了 %{max} 字的限制 + over_character_limit: 已超過 %{max} 字的限制 pin_errors: - direct: 不能釘選只對被提及的使用者顯示的嘟文 + direct: 無法釘選只有僅提及使用者可見之嘟文 limit: 釘選嘟文的數量已達上限 ownership: 不能釘選他人的嘟文 reblog: 不能釘選轉嘟 @@ -1533,8 +1533,8 @@ zh-TW: keep_direct_hint: 不會刪除任何您的私訊 keep_media: 保留包含媒體內容的嘟文 keep_media_hint: 不會刪除您包含媒體內容之嘟文 - keep_pinned: 保留釘選的嘟文 - keep_pinned_hint: 不會刪除您釘選的嘟文 + keep_pinned: 保留釘選嘟文 + keep_pinned_hint: 不會刪除您的釘選嘟文 keep_polls: 保留投票 keep_polls_hint: 不會刪除您的投票 keep_self_bookmark: 保留您已標記為書籤之嘟文 @@ -1556,7 +1556,7 @@ zh-TW: min_reblogs: 保留超過嘟文轉嘟門檻 min_reblogs_hint: 如果您嘟文已收到超過轉嘟門檻則不會刪除。留白表示不論轉嘟數量皆刪除該嘟文。 stream_entries: - pinned: 釘選的嘟文 + pinned: 釘選嘟文 reblogged: 轉嘟 sensitive_content: 敏感內容 strikes: @@ -1581,7 +1581,7 @@ zh-TW: enabled: 兩階段認證已啟用 enabled_success: 已成功啟用兩階段認證 generate_recovery_codes: 產生備用驗證碼 - lost_recovery_codes: 讓您可以在遺失手機時,使用備用驗證碼登入。若您遺失了備用驗證碼,可以在這裏產生一批新的,舊有的備用驗證碼將會失效。 + lost_recovery_codes: 讓您可以在遺失手機時,使用備用驗證碼登入。若您已遺失備用驗證碼,可於此產生一批新的,舊有的備用驗證碼將會失效。 methods: 兩步驟方式 otp: 驗證應用程式 recovery_codes: 備份備用驗證碼 @@ -1616,7 +1616,7 @@ zh-TW: spam: 垃圾訊息 violation: 該內容違反以下社群規章 explanation: - delete_statuses: 您的某些嘟文被發現違反了一項或多項社群準則,隨後已被 %{instance} 的管理員刪除。 + delete_statuses: 您的某些嘟文被發現已違反一項或多項社群準則,隨後已被 %{instance} 的管理員刪除。 disable: 您無法繼續使用您的帳號,但您的個人頁面及其他資料內容保持不變。您可以要求一份您的資料備份,帳號異動設定,或是刪除帳號。 mark_statuses_as_sensitive: 您的部份嘟文已被 %{instance} 的管理員標記為敏感內容。這代表了人們必須在顯示預覽前點擊嘟文中的媒體。您可以在將來嘟文時自己將媒體標記為敏感內容。 sensitive: 您之後上傳的所有媒體檔案會被標為敏感內容,並且被隱藏起來,須點擊警告按鈕才會顯示。 diff --git a/package.json b/package.json index df0ba24ff..e5e0c2946 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@babel/preset-react": "^7.18.6", "@babel/runtime": "^7.21.0", "@gamestdio/websocket": "^0.3.2", - "@github/webauthn-json": "^0.5.7", + "@github/webauthn-json": "^2.1.1", "@rails/ujs": "^6.1.7", "abortcontroller-polyfill": "^1.7.5", "array-includes": "^3.1.6", @@ -48,7 +48,7 @@ "blurhash": "^2.0.5", "classnames": "^2.3.2", "cocoon-js-vanilla": "^1.3.0", - "color-blend": "^3.0.1", + "color-blend": "^4.0.0", "compression-webpack-plugin": "^6.1.1", "cross-env": "^7.0.3", "css-loader": "^5.2.7", @@ -63,7 +63,7 @@ "favico.js": "^0.3.10", "file-loader": "^6.2.0", "font-awesome": "^4.7.0", - "fuzzysort": "^1.9.0", + "fuzzysort": "^2.0.4", "glob": "^8.1.0", "history": "^4.10.1", "http-link-header": "^1.1.0", diff --git a/spec/fabricators/user_fabricator.rb b/spec/fabricators/user_fabricator.rb index 967347319..9031d5cd0 100644 --- a/spec/fabricators/user_fabricator.rb +++ b/spec/fabricators/user_fabricator.rb @@ -5,5 +5,6 @@ Fabricator(:user) do email { sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } } password '123456789' confirmed_at { Time.zone.now } - agreement true + current_sign_in_at { Time.zone.now } + agreement true end diff --git a/spec/helpers/admin/trends/statuses_helper_spec.rb b/spec/helpers/admin/trends/statuses_helper_spec.rb new file mode 100644 index 000000000..92caae690 --- /dev/null +++ b/spec/helpers/admin/trends/statuses_helper_spec.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Admin::Trends::StatusesHelper do + describe '.one_line_preview' do + before do + allow(helper).to receive(:current_user).and_return(Fabricate.build(:user)) + end + + context 'with a local status' do + let(:status) { Fabricate.build(:status, text: 'Test local status') } + + it 'renders a correct preview text' do + result = helper.one_line_preview(status) + + expect(result).to eq 'Test local status' + end + end + + context 'with a remote status' do + let(:status) { Fabricate.build(:status, uri: 'https://sfd.sdf', text: '<html><body><p>Test remote status</p><p>text</p></body></html>') } + + it 'renders a correct preview text' do + result = helper.one_line_preview(status) + + expect(result).to eq 'Test remote status' + end + end + + context 'with a status that has empty text' do + let(:status) { Fabricate.build(:status, text: '') } + + it 'renders a correct preview text' do + result = helper.one_line_preview(status) + + expect(result).to eq '' + end + end + + context 'with a status that has emoji' do + before { Fabricate(:custom_emoji, shortcode: 'florpy') } + + let(:status) { Fabricate(:status, text: 'hello there :florpy:') } + + it 'renders a correct preview text' do + result = helper.one_line_preview(status) + + expect(result).to match 'hello there' + expect(result).to match '<img rel="emoji"' + end + end + end +end diff --git a/spec/helpers/home_helper_spec.rb b/spec/helpers/home_helper_spec.rb index 77db327c2..3d2c5fe24 100644 --- a/spec/helpers/home_helper_spec.rb +++ b/spec/helpers/home_helper_spec.rb @@ -8,4 +8,116 @@ RSpec.describe HomeHelper, type: :helper do expect(helper.default_props).to eq locale: I18n.locale end end + + describe 'account_link_to' do + context 'with a missing account' do + let(:account) { nil } + + it 'returns a button' do + result = helper.account_link_to(account) + + expect(result).to match t('about.contact_missing') + end + end + + context 'with a valid account' do + let(:account) { Fabricate(:account) } + + it 'returns a link to the account' do + without_partial_double_verification do + allow(helper).to receive(:current_account).and_return(account) + allow(helper).to receive(:prefers_autoplay?).and_return(false) + result = helper.account_link_to(account) + + expect(result).to match "@#{account.acct}" + end + end + end + end + + describe 'obscured_counter' do + context 'with a value of less than zero' do + let(:count) { -10 } + + it 'returns the correct string' do + expect(helper.obscured_counter(count)).to eq '0' + end + end + + context 'with a value of zero' do + let(:count) { 0 } + + it 'returns the correct string' do + expect(helper.obscured_counter(count)).to eq '0' + end + end + + context 'with a value of one' do + let(:count) { 1 } + + it 'returns the correct string' do + expect(helper.obscured_counter(count)).to eq '1' + end + end + + context 'with a value of more than one' do + let(:count) { 10 } + + it 'returns the correct string' do + expect(helper.obscured_counter(count)).to eq '1+' + end + end + end + + describe 'custom_field_classes' do + context 'with a verified field' do + let(:field) { instance_double(Account::Field, verified?: true) } + + it 'returns verified string' do + result = helper.custom_field_classes(field) + expect(result).to eq 'verified' + end + end + + context 'with a non-verified field' do + let(:field) { instance_double(Account::Field, verified?: false) } + + it 'returns verified string' do + result = helper.custom_field_classes(field) + expect(result).to eq 'emojify' + end + end + end + + describe 'sign_up_messages' do + context 'with closed registrations' do + it 'returns correct sign up message' do + allow(helper).to receive(:closed_registrations?).and_return(true) + result = helper.sign_up_message + + expect(result).to eq t('auth.registration_closed', instance: 'cb6e6126.ngrok.io') + end + end + + context 'with open registrations' do + it 'returns correct sign up message' do + allow(helper).to receive(:closed_registrations?).and_return(false) + allow(helper).to receive(:open_registrations?).and_return(true) + result = helper.sign_up_message + + expect(result).to eq t('auth.register') + end + end + + context 'with approved registrations' do + it 'returns correct sign up message' do + allow(helper).to receive(:closed_registrations?).and_return(false) + allow(helper).to receive(:open_registrations?).and_return(false) + allow(helper).to receive(:approved_registrations?).and_return(true) + result = helper.sign_up_message + + expect(result).to eq t('auth.apply_for_account') + end + end + end end diff --git a/spec/mailers/admin_mailer_spec.rb b/spec/mailers/admin_mailer_spec.rb index 29fb586a3..132c6c758 100644 --- a/spec/mailers/admin_mailer_spec.rb +++ b/spec/mailers/admin_mailer_spec.rb @@ -23,4 +23,66 @@ RSpec.describe AdminMailer, type: :mailer do expect(mail.body.encoded).to eq("Mike,\r\n\r\nJohn has reported Mike\r\n\r\nView: https://cb6e6126.ngrok.io/admin/reports/#{report.id}\r\n") end end + + describe '.new_appeal' do + let(:appeal) { Fabricate(:appeal) } + let(:recipient) { Fabricate(:account, username: 'Kurt') } + let(:mail) { described_class.new_appeal(recipient, appeal) } + + before do + recipient.user.update(locale: :en) + end + + it 'renders the headers' do + expect(mail.subject).to eq("#{appeal.account.username} is appealing a moderation decision on cb6e6126.ngrok.io") + expect(mail.to).to eq [recipient.user_email] + expect(mail.from).to eq ['notifications@localhost'] + end + + it 'renders the body' do + expect(mail.body.encoded).to match "#{appeal.account.username} is appealing a moderation decision by #{appeal.strike.account.username}" + end + end + + describe '.new_pending_account' do + let(:recipient) { Fabricate(:account, username: 'Barklums') } + let(:user) { Fabricate(:user) } + let(:mail) { described_class.new_pending_account(recipient, user) } + + before do + recipient.user.update(locale: :en) + end + + it 'renders the headers' do + expect(mail.subject).to eq("New account up for review on cb6e6126.ngrok.io (#{user.account.username})") + expect(mail.to).to eq [recipient.user_email] + expect(mail.from).to eq ['notifications@localhost'] + end + + it 'renders the body' do + expect(mail.body.encoded).to match 'The details of the new account are below. You can approve or reject this application.' + end + end + + describe '.new_trends' do + let(:recipient) { Fabricate(:account, username: 'Snurf') } + let(:links) { [] } + let(:statuses) { [] } + let(:tags) { [] } + let(:mail) { described_class.new_trends(recipient, links, tags, statuses) } + + before do + recipient.user.update(locale: :en) + end + + it 'renders the headers' do + expect(mail.subject).to eq('New trends up for review on cb6e6126.ngrok.io') + expect(mail.to).to eq [recipient.user_email] + expect(mail.from).to eq ['notifications@localhost'] + end + + it 'renders the body' do + expect(mail.body.encoded).to match 'The following items need a review before they can be displayed publicly' + end + end end diff --git a/spec/models/account_filter_spec.rb b/spec/models/account_filter_spec.rb index 853d20a0c..3032260fe 100644 --- a/spec/models/account_filter_spec.rb +++ b/spec/models/account_filter_spec.rb @@ -18,4 +18,30 @@ describe AccountFilter do expect { filter.results }.to raise_error(/wrong/) end end + + describe 'with origin and by_domain interacting' do + let!(:local_account) { Fabricate(:account, domain: nil) } + let!(:remote_account_one) { Fabricate(:account, domain: 'example.org') } + let(:remote_account_two) { Fabricate(:account, domain: 'other.domain') } + + it 'works with domain first and origin remote' do + filter = described_class.new(by_domain: 'example.org', origin: 'remote') + expect(filter.results).to match_array [remote_account_one] + end + + it 'works with domain last and origin remote' do + filter = described_class.new(origin: 'remote', by_domain: 'example.org') + expect(filter.results).to match_array [remote_account_one] + end + + it 'works with domain first and origin local' do + filter = described_class.new(by_domain: 'example.org', origin: 'local') + expect(filter.results).to match_array [local_account] + end + + it 'works with domain last and origin local' do + filter = described_class.new(origin: 'local', by_domain: 'example.org') + expect(filter.results).to match_array [remote_account_one] + end + end end diff --git a/spec/models/poll_vote_spec.rb b/spec/models/poll_vote_spec.rb index 563f34699..6886a82aa 100644 --- a/spec/models/poll_vote_spec.rb +++ b/spec/models/poll_vote_spec.rb @@ -10,4 +10,53 @@ RSpec.describe PollVote, type: :model do expect(poll_vote.object_type).to eq :vote end end + + describe 'validations' do + context 'with a vote on an expired poll' do + it 'marks the vote invalid' do + poll = Fabricate.build(:poll, expires_at: 30.days.ago) + + vote = Fabricate.build(:poll_vote, poll: poll) + expect(vote).to_not be_valid + end + end + + context 'with invalid choices' do + it 'marks vote invalid with negative choice' do + poll = Fabricate.build(:poll) + + vote = Fabricate.build(:poll_vote, poll: poll, choice: -100) + expect(vote).to_not be_valid + end + + it 'marks vote invalid with choice in excess of options' do + poll = Fabricate.build(:poll, options: %w(a b c)) + + vote = Fabricate.build(:poll_vote, poll: poll, choice: 10) + expect(vote).to_not be_valid + end + end + + context 'with a poll where multiple is true' do + it 'does not allow a second vote on same choice from same account' do + poll = Fabricate(:poll, multiple: true, options: %w(a b c)) + first_vote = Fabricate(:poll_vote, poll: poll, choice: 1) + expect(first_vote).to be_valid + + second_vote = Fabricate.build(:poll_vote, account: first_vote.account, poll: poll, choice: 1) + expect(second_vote).to_not be_valid + end + end + + context 'with a poll where multiple is false' do + it 'does not allow a second vote from same account' do + poll = Fabricate(:poll, multiple: false, options: %w(a b c)) + first_vote = Fabricate(:poll_vote, poll: poll) + expect(first_vote).to be_valid + + second_vote = Fabricate.build(:poll_vote, account: first_vote.account, poll: poll) + expect(second_vote).to_not be_valid + end + end + end end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 7ec334a56..1ad0efe0a 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -77,7 +77,7 @@ describe SearchService, type: :service do it 'includes the tag in the results' do query = '#tag' tag = Tag.new - allow(Tag).to receive(:search_for).with('tag', 10, 0, exclude_unreviewed: nil).and_return([tag]) + allow(Tag).to receive(:search_for).with('tag', 10, 0, { exclude_unreviewed: nil }).and_return([tag]) results = subject.call(query, nil, 10) expect(Tag).to have_received(:search_for).with('tag', 10, 0, exclude_unreviewed: nil) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ddc872fc8..25f314002 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -5,8 +5,10 @@ GC.disable if ENV['DISABLE_SIMPLECOV'] != 'true' require 'simplecov' SimpleCov.start 'rails' do - add_group 'Services', 'app/services' + add_group 'Policies', 'app/policies' add_group 'Presenters', 'app/presenters' + add_group 'Serializers', 'app/serializers' + add_group 'Services', 'app/services' add_group 'Validators', 'app/validators' end end diff --git a/spec/workers/scheduler/follow_recommendations_scheduler_spec.rb b/spec/workers/scheduler/follow_recommendations_scheduler_spec.rb new file mode 100644 index 000000000..18d5260e4 --- /dev/null +++ b/spec/workers/scheduler/follow_recommendations_scheduler_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Scheduler::FollowRecommendationsScheduler do + let!(:target_accounts) do + Fabricate.times(3, :account) do + statuses(count: 6) + end + end + let!(:follower_accounts) do + Fabricate.times(5, :account) do + statuses(count: 6) + end + end + + describe '#perform' do + subject(:scheduled_run) { described_class.new.perform } + + context 'when there are accounts to recommend' do + before do + # Follow the target accounts by follow accounts to make them recommendable + follower_accounts.each do |follower_account| + target_accounts.each do |target_account| + Fabricate(:follow, account: follower_account, target_account: target_account) + end + end + end + + it 'creates recommendations' do + expect { scheduled_run }.to change(FollowRecommendation, :count).from(0).to(target_accounts.size) + expect(redis.zrange('follow_recommendations:en', 0, -1)).to match_array(target_accounts.pluck(:id).map(&:to_s)) + end + end + + context 'when there are no accounts to recommend' do + it 'does not create follow recommendations' do + expect { scheduled_run }.to_not change(FollowRecommendation, :count) + expect(redis.zrange('follow_recommendations:en', 0, -1)).to be_empty + end + end + end +end diff --git a/yarn.lock b/yarn.lock index 3c7202d8d..9c7e3827a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1245,10 +1245,10 @@ resolved "https://registry.yarnpkg.com/@gamestdio/websocket/-/websocket-0.3.2.tgz#321ba0976ee30fd14e51dbf8faa85ce7b325f76a" integrity sha512-J3n5SKim+ZoLbe44hRGI/VYAwSMCeIJuBy+FfP6EZaujEpNchPRFcIsVQLWAwpU1bP2Ji63rC+rEUOd1vjUB6Q== -"@github/webauthn-json@^0.5.7": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@github/webauthn-json/-/webauthn-json-0.5.7.tgz#143bc67f6e0f75f8d188e565741507bb08c31214" - integrity sha512-SUYsttDxFSvWvvJssJpwzjmRCqYfdfqC9VCmAHQYfdKCVelyJteCHo9/lK1CB72mx/jrl6cFNY08aua4J2jIyg== +"@github/webauthn-json@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@github/webauthn-json/-/webauthn-json-2.1.1.tgz#648e63fc28050917d2882cc2b27817a88cb420fc" + integrity sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ== "@humanwhocodes/config-array@^0.11.8": version "0.11.8" @@ -3378,10 +3378,10 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-blend@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/color-blend/-/color-blend-3.0.1.tgz#3882ed1190ca18760ffe11570d8537960171172b" - integrity sha512-KueDvNiKHAvVeApic0SxHZLyy4x3NELfTLzMHRpRRLi+9e2kWhpeWvtuH3Sjb92mOJYEUhRjb8z7lr4OqDv17Q== +color-blend@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/color-blend/-/color-blend-4.0.0.tgz#e9950e9fa5d6e552ff8bb107c39f7e83a0c1a3bb" + integrity sha512-fYODTHhI/NG+B5GnzvuL3kiFrK/UnkUezWFTgEPBTY5V+kpyfAn95Vn9sJeeCX6omrCOdxnqCL3CvH+6sXtIbw== color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" @@ -5273,10 +5273,10 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -fuzzysort@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fuzzysort/-/fuzzysort-1.9.0.tgz#d36d27949eae22340bb6f7ba30ea6751b92a181c" - integrity sha512-MOxCT0qLTwLqmEwc7UtU045RKef7mc8Qz8eR4r2bLNEq9dy/c3ZKMEFp6IEst69otkQdFZ4FfgH2dmZD+ddX1g== +fuzzysort@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/fuzzysort/-/fuzzysort-2.0.4.tgz#a21d1ce8947eaf2797dc3b7c28c36db9d1165f84" + integrity sha512-Api1mJL+Ad7W7vnDZnWq5pGaXJjyencT+iKGia2PlHUcSsSzWwIQ3S1isiMpwpavjYtGd2FzhUIhnnhOULZgDw== gauge@^5.0.0: version "5.0.0" |