Merge commit 'd97d31cce664281d868e4c661451687a301c97c8' into glitch-soc/merge-upstream

Conflicts:
- `app/models/account.rb`:
  Upstream refactored this file a bit, moving validation limits to constants.
  We already had a similar change, although with different constant names.
  Updated to match upstream's code.

The following files were also modified accordingly:
- `app/views/settings/profiles/show.html.haml`
- `spec/requests/api/v1/accounts/credentials_spec.rb`
main
Claire 2024-05-04 16:12:51 +02:00
commit f09f5b35f2
47 changed files with 622 additions and 476 deletions

View File

@ -205,14 +205,6 @@ Style/SafeNavigation:
Exclude: Exclude:
- 'app/models/concerns/account/finder_concern.rb' - 'app/models/concerns/account/finder_concern.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: only_raise, only_fail, semantic
Style/SignalException:
Exclude:
- 'lib/devise/strategies/two_factor_ldap_authenticatable.rb'
- 'lib/devise/strategies/two_factor_pam_authenticatable.rb'
# This cop supports unsafe autocorrection (--autocorrect-all). # This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Mode. # Configuration parameters: Mode.
Style/StringConcatenation: Style/StringConcatenation:

View File

@ -102,17 +102,17 @@ GEM
attr_required (1.0.2) attr_required (1.0.2)
awrence (1.2.1) awrence (1.2.1)
aws-eventstream (1.3.0) aws-eventstream (1.3.0)
aws-partitions (1.916.0) aws-partitions (1.922.0)
aws-sdk-core (3.192.1) aws-sdk-core (3.194.0)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.79.0) aws-sdk-kms (1.80.0)
aws-sdk-core (~> 3, >= 3.191.0) aws-sdk-core (~> 3, >= 3.193.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.147.0) aws-sdk-s3 (1.149.0)
aws-sdk-core (~> 3, >= 3.192.0) aws-sdk-core (~> 3, >= 3.194.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0) aws-sigv4 (1.8.0)
@ -220,7 +220,7 @@ GEM
domain_name (0.6.20240107) domain_name (0.6.20240107)
doorkeeper (5.6.9) doorkeeper (5.6.9)
railties (>= 5) railties (>= 5)
dotenv (3.1.0) dotenv (3.1.1)
drb (2.2.1) drb (2.2.1)
ed25519 (1.3.0) ed25519 (1.3.0)
elasticsearch (7.13.3) elasticsearch (7.13.3)
@ -350,8 +350,8 @@ GEM
activesupport (>= 3.0) activesupport (>= 3.0)
nokogiri (>= 1.6) nokogiri (>= 1.6)
io-console (0.7.2) io-console (0.7.2)
irb (1.12.0) irb (1.13.0)
rdoc rdoc (>= 4.0.0)
reline (>= 0.4.2) reline (>= 0.4.2)
jmespath (1.6.2) jmespath (1.6.2)
json (2.7.2) json (2.7.2)
@ -605,7 +605,7 @@ GEM
redlock (1.3.2) redlock (1.3.2)
redis (>= 3.0.0, < 6.0) redis (>= 3.0.0, < 6.0)
regexp_parser (2.9.0) regexp_parser (2.9.0)
reline (0.5.2) reline (0.5.4)
io-console (~> 0.5) io-console (~> 0.5)
request_store (1.6.0) request_store (1.6.0)
rack (>= 1.4) rack (>= 1.4)

View File

@ -25,6 +25,8 @@ class Admin::DomainAllowsController < Admin::BaseController
def destroy def destroy
authorize @domain_allow, :destroy? authorize @domain_allow, :destroy?
UnallowDomainService.new.call(@domain_allow) UnallowDomainService.new.call(@domain_allow)
log_action :destroy, @domain_allow
redirect_to admin_instances_path, notice: I18n.t('admin.domain_allows.destroyed_msg') redirect_to admin_instances_path, notice: I18n.t('admin.domain_allows.destroyed_msg')
end end

View File

@ -7,7 +7,7 @@ import PersonIcon from '@/material-icons/400-24px/person.svg?react';
import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react'; import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react';
export const Badge = ({ icon, label, domain, roleId }) => ( export const Badge = ({ icon = <PersonIcon />, label, domain, roleId }) => (
<div className='account-role' data-account-role-id={roleId}> <div className='account-role' data-account-role-id={roleId}>
{icon} {icon}
{label} {label}
@ -22,10 +22,6 @@ Badge.propTypes = {
roleId: PropTypes.string roleId: PropTypes.string
}; };
Badge.defaultProps = {
icon: <PersonIcon />,
};
export const GroupBadge = () => ( export const GroupBadge = () => (
<Badge icon={<GroupsIcon />} label={<FormattedMessage id='account.badges.group' defaultMessage='Group' />} /> <Badge icon={<GroupsIcon />} label={<FormattedMessage id='account.badges.group' defaultMessage='Group' />} />
); );

View File

@ -1,16 +1,16 @@
import PropTypes from 'prop-types'; import { useCallback } from 'react';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react'; import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react';
import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react';
import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import TagIcon from '@/material-icons/400-24px/tag.svg?react';
import { expandSearch } from 'mastodon/actions/search';
import { Icon } from 'mastodon/components/icon'; import { Icon } from 'mastodon/components/icon';
import { LoadMore } from 'mastodon/components/load_more'; import { LoadMore } from 'mastodon/components/load_more';
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
import { SearchSection } from 'mastodon/features/explore/components/search_section'; import { SearchSection } from 'mastodon/features/explore/components/search_section';
import { useAppDispatch, useAppSelector } from 'mastodon/store';
import { ImmutableHashtag as Hashtag } from '../../../components/hashtag'; import { ImmutableHashtag as Hashtag } from '../../../components/hashtag';
import AccountContainer from '../../../containers/account_container'; import AccountContainer from '../../../containers/account_container';
@ -26,62 +26,68 @@ const withoutLastResult = list => {
} }
}; };
class SearchResults extends ImmutablePureComponent { export const SearchResults = () => {
const results = useAppSelector((state) => state.getIn(['search', 'results']));
const isLoading = useAppSelector((state) => state.getIn(['search', 'isLoading']));
static propTypes = { const dispatch = useAppDispatch();
results: ImmutablePropTypes.map.isRequired,
expandSearch: PropTypes.func.isRequired,
searchTerm: PropTypes.string,
};
handleLoadMoreAccounts = () => this.props.expandSearch('accounts'); const handleLoadMoreAccounts = useCallback(() => {
dispatch(expandSearch('accounts'));
}, [dispatch]);
handleLoadMoreStatuses = () => this.props.expandSearch('statuses'); const handleLoadMoreStatuses = useCallback(() => {
dispatch(expandSearch('statuses'));
}, [dispatch]);
handleLoadMoreHashtags = () => this.props.expandSearch('hashtags'); const handleLoadMoreHashtags = useCallback(() => {
dispatch(expandSearch('hashtags'));
}, [dispatch]);
render () { let accounts, statuses, hashtags;
const { results } = this.props;
let accounts, statuses, hashtags; if (results.get('accounts') && results.get('accounts').size > 0) {
accounts = (
if (results.get('accounts') && results.get('accounts').size > 0) { <SearchSection title={<><Icon id='users' icon={PeopleIcon} /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>}>
accounts = ( {withoutLastResult(results.get('accounts')).map(accountId => <AccountContainer key={accountId} id={accountId} />)}
<SearchSection title={<><Icon id='users' icon={PeopleIcon} /><FormattedMessage id='search_results.accounts' defaultMessage='Profiles' /></>}> {(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={handleLoadMoreAccounts} />}
{withoutLastResult(results.get('accounts')).map(accountId => <AccountContainer key={accountId} id={accountId} />)} </SearchSection>
{(results.get('accounts').size > INITIAL_PAGE_LIMIT && results.get('accounts').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreAccounts} />}
</SearchSection>
);
}
if (results.get('hashtags') && results.get('hashtags').size > 0) {
hashtags = (
<SearchSection title={<><Icon id='hashtag' icon={TagIcon} /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>}>
{withoutLastResult(results.get('hashtags')).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
{(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreHashtags} />}
</SearchSection>
);
}
if (results.get('statuses') && results.get('statuses').size > 0) {
statuses = (
<SearchSection title={<><Icon id='quote-right' icon={FindInPageIcon} /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>}>
{withoutLastResult(results.get('statuses')).map(statusId => <StatusContainer key={statusId} id={statusId} />)}
{(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={this.handleLoadMoreStatuses} />}
</SearchSection>
);
}
return (
<div className='search-results'>
{accounts}
{hashtags}
{statuses}
</div>
); );
} }
} if (results.get('hashtags') && results.get('hashtags').size > 0) {
hashtags = (
<SearchSection title={<><Icon id='hashtag' icon={TagIcon} /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></>}>
{withoutLastResult(results.get('hashtags')).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
{(results.get('hashtags').size > INITIAL_PAGE_LIMIT && results.get('hashtags').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={handleLoadMoreHashtags} />}
</SearchSection>
);
}
export default SearchResults; if (results.get('statuses') && results.get('statuses').size > 0) {
statuses = (
<SearchSection title={<><Icon id='quote-right' icon={FindInPageIcon} /><FormattedMessage id='search_results.statuses' defaultMessage='Posts' /></>}>
{withoutLastResult(results.get('statuses')).map(statusId => <StatusContainer key={statusId} id={statusId} />)}
{(results.get('statuses').size > INITIAL_PAGE_LIMIT && results.get('statuses').size % INITIAL_PAGE_LIMIT === 1) && <LoadMore visible onClick={handleLoadMoreStatuses} />}
</SearchSection>
);
}
return (
<div className='search-results'>
{!accounts && !hashtags && !statuses && (
isLoading ? (
<LoadingIndicator />
) : (
<div className='empty-column-indicator'>
<FormattedMessage id='search_results.nothing_found' defaultMessage='Could not find anything for these search terms' />
</div>
)
)}
{accounts}
{hashtags}
{statuses}
</div>
);
};

View File

@ -1,20 +0,0 @@
import { connect } from 'react-redux';
import { expandSearch } from 'mastodon/actions/search';
import { fetchSuggestions, dismissSuggestion } from 'mastodon/actions/suggestions';
import SearchResults from '../components/search_results';
const mapStateToProps = state => ({
results: state.getIn(['search', 'results']),
suggestions: state.getIn(['suggestions', 'items']),
searchTerm: state.getIn(['search', 'searchTerm']),
});
const mapDispatchToProps = dispatch => ({
fetchSuggestions: () => dispatch(fetchSuggestions()),
expandSearch: type => dispatch(expandSearch(type)),
dismissSuggestion: account => dispatch(dismissSuggestion(account.get('id'))),
});
export default connect(mapStateToProps, mapDispatchToProps)(SearchResults);

View File

@ -29,9 +29,9 @@ import { mascot } from '../../initial_state';
import { isMobile } from '../../is_mobile'; import { isMobile } from '../../is_mobile';
import Motion from '../ui/util/optional_motion'; import Motion from '../ui/util/optional_motion';
import { SearchResults } from './components/search_results';
import ComposeFormContainer from './containers/compose_form_container'; import ComposeFormContainer from './containers/compose_form_container';
import SearchContainer from './containers/search_container'; import SearchContainer from './containers/search_container';
import SearchResultsContainer from './containers/search_results_container';
const messages = defineMessages({ const messages = defineMessages({
start: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@ -138,7 +138,7 @@ class Compose extends PureComponent {
<Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}> <Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
{({ x }) => ( {({ x }) => (
<div className='drawer__inner darker' style={{ transform: `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}> <div className='drawer__inner darker' style={{ transform: `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>
<SearchResultsContainer /> <SearchResults />
</div> </div>
)} )}
</Motion> </Motion>

View File

@ -89,6 +89,14 @@
"announcement.announcement": "Cyhoeddiad", "announcement.announcement": "Cyhoeddiad",
"attachments_list.unprocessed": "(heb eu prosesu)", "attachments_list.unprocessed": "(heb eu prosesu)",
"audio.hide": "Cuddio sain", "audio.hide": "Cuddio sain",
"block_modal.remote_users_caveat": "Byddwn yn gofyn i'r gweinydd {domain} barchu eich penderfyniad. Fodd bynnag, nid yw cydymffurfiad wedi'i warantu gan y gall rhai gweinyddwyr drin rhwystro mewn ffyrdd gwahanol. Mae'n bosibl y bydd postiadau cyhoeddus yn dal i fod yn weladwy i ddefnyddwyr nad ydynt wedi mewngofnodi.",
"block_modal.show_less": "Dangos llai",
"block_modal.show_more": "Dangos mwy",
"block_modal.they_cant_mention": "Nid ydynt yn gallu eich crybwyll na'ch dilyn.",
"block_modal.they_cant_see_posts": "Nid ydynt yn gallu gweld eich postiadau ac ni fyddwch yn gweld eu rhai hwy.",
"block_modal.they_will_know": "Gallant weld eu bod wedi'u rhwystro.",
"block_modal.title": "Rhwystro defnyddiwr?",
"block_modal.you_wont_see_mentions": "Ni welwch bostiadau sy'n sôn amdanynt.",
"boost_modal.combo": "Mae modd pwyso {combo} er mwyn hepgor hyn tro nesa", "boost_modal.combo": "Mae modd pwyso {combo} er mwyn hepgor hyn tro nesa",
"bundle_column_error.copy_stacktrace": "Copïo'r adroddiad gwall", "bundle_column_error.copy_stacktrace": "Copïo'r adroddiad gwall",
"bundle_column_error.error.body": "Nid oedd modd cynhyrchu'r dudalen honno. Gall fod oherwydd gwall yn ein cod neu fater cydnawsedd porwr.", "bundle_column_error.error.body": "Nid oedd modd cynhyrchu'r dudalen honno. Gall fod oherwydd gwall yn ein cod neu fater cydnawsedd porwr.",
@ -169,6 +177,7 @@
"confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?", "confirmations.delete_list.message": "Ydych chi'n siŵr eich bod eisiau dileu'r rhestr hwn am byth?",
"confirmations.discard_edit_media.confirm": "Dileu", "confirmations.discard_edit_media.confirm": "Dileu",
"confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?", "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg - eu dileu beth bynnag?",
"confirmations.domain_block.confirm": "Rhwystro gweinydd",
"confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.", "confirmations.domain_block.message": "Ydych chi wir, wir eisiau blocio'r holl {domain}? Fel arfer, mae blocio neu dewi pobl penodol yn broses mwy effeithiol. Fyddwch chi ddim yn gweld cynnwys o'r parth hwnnw mewn ffrydiau cyhoeddus neu yn eich hysbysiadau. Bydd eich dilynwyr o'r parth hwnnw yn cael eu ddileu.",
"confirmations.edit.confirm": "Golygu", "confirmations.edit.confirm": "Golygu",
"confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?", "confirmations.edit.message": "Bydd golygu nawr yn trosysgrifennu'r neges rydych yn ei ysgrifennu ar hyn o bryd. Ydych chi'n siŵr eich bod eisiau gwneud hyn?",
@ -200,6 +209,27 @@
"dismissable_banner.explore_statuses": "Mae'r rhain yn bostiadau o bob rhan o'r we gymdeithasol sydd ar gynnydd heddiw. Mae postiadau mwy diweddar sydd â mwy o hybiau a ffefrynu'n cael eu graddio'n uwch.", "dismissable_banner.explore_statuses": "Mae'r rhain yn bostiadau o bob rhan o'r we gymdeithasol sydd ar gynnydd heddiw. Mae postiadau mwy diweddar sydd â mwy o hybiau a ffefrynu'n cael eu graddio'n uwch.",
"dismissable_banner.explore_tags": "Mae'r rhain yn hashnodau sydd ar gynnydd ar y we gymdeithasol heddiw. Mae hashnodau sy'n cael eu defnyddio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.", "dismissable_banner.explore_tags": "Mae'r rhain yn hashnodau sydd ar gynnydd ar y we gymdeithasol heddiw. Mae hashnodau sy'n cael eu defnyddio gan fwy o unigolion gwahanol yn cael eu graddio'n uwch.",
"dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y we gymdeithasol y mae pobl ar {domain} yn eu dilyn.", "dismissable_banner.public_timeline": "Dyma'r postiadau cyhoeddus diweddaraf gan bobl ar y we gymdeithasol y mae pobl ar {domain} yn eu dilyn.",
"domain_block_modal.block": "Rhwystro gweinydd",
"domain_block_modal.block_account_instead": "Rhwystro @{name} yn lle hynny",
"domain_block_modal.they_can_interact_with_old_posts": "Gall pobl o'r gweinydd hwn ryngweithio â'ch hen bostiadau.",
"domain_block_modal.they_cant_follow": "Ni all neb o'r gweinydd hwn eich dilyn.",
"domain_block_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu rhwystro.",
"domain_block_modal.title": "Rhwystro parth?",
"domain_block_modal.you_will_lose_followers": "Bydd eich holl ddilynwyr o'r gweinydd hwn yn cael eu tynnu.",
"domain_block_modal.you_wont_see_posts": "Fyddwch chi ddim yn gweld postiadau na hysbysiadau gan ddefnyddwyr ar y gweinydd hwn.",
"domain_pill.activitypub_lets_connect": "Mae'n caniatáu ichi gysylltu a rhyngweithio â phobl nid yn unig ar Mastodon, ond ar draws gwahanol apiau cymdeithasol hefyd.",
"domain_pill.activitypub_like_language": "Mae ActivityPub fel yr iaith y mae Mastodon yn ei siarad â rhwydweithiau cymdeithasol eraill.",
"domain_pill.server": "Gweinydd",
"domain_pill.their_handle": "Eu handlen:",
"domain_pill.their_server": "Eu cartref digidol, lle mae eu holl negeseuon yn byw.",
"domain_pill.their_username": "Eu dynodwr unigryw ar eu gweinydd. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
"domain_pill.username": "Enw Defnyddiwr",
"domain_pill.whats_in_a_handle": "Beth sydd mewn handlen?",
"domain_pill.who_they_are": "Gan fod handlen yn dweud pwy yw rhywun a ble maen nhw, gallwch chi ryngweithio â phobl ar draws gwe gymdeithasol <button>llwyfannau wedi'u pweru gan ActivityPub</button> .",
"domain_pill.who_you_are": "Oherwydd bod eich handlen yn dweud pwy ydych chi a ble rydych chi, gall pobl ryngweithio â chi ar draws gwe gymdeithasol <button>llwyfannau wedi'u pweru gan ActivityPub</button> .",
"domain_pill.your_handle": "Eich handlen:",
"domain_pill.your_server": "Eich cartref digidol, lle mae'ch holl bostiadau'n byw. Ddim yn hoffi'r un hon? Trosglwyddwch weinyddion ar unrhyw adeg a dewch â'ch dilynwyr hefyd.",
"domain_pill.your_username": "Eich dynodwr unigryw ar y gweinydd hwn. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.",
"embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
"embed.preview": "Dyma sut olwg fydd arno:", "embed.preview": "Dyma sut olwg fydd arno:",
"emoji_button.activity": "Gweithgarwch", "emoji_button.activity": "Gweithgarwch",
@ -267,6 +297,8 @@
"filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd", "filter_modal.select_filter.subtitle": "Defnyddiwch gategori sy'n bodoli eisoes neu crëu un newydd",
"filter_modal.select_filter.title": "Hidlo'r postiad hwn", "filter_modal.select_filter.title": "Hidlo'r postiad hwn",
"filter_modal.title.status": "Hidlo postiad", "filter_modal.title.status": "Hidlo postiad",
"filtered_notifications_banner.mentions": "{count, plural, one {crybwylliad} other {crybwylliad}}",
"filtered_notifications_banner.pending_requests": "Hysbysiadau gan {count, plural, =0 {neb} one {un person} other {# person}} efallai y gwyddoch amdanyn nhw",
"filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo", "filtered_notifications_banner.title": "Hysbysiadau wedi'u hidlo",
"firehose.all": "Popeth", "firehose.all": "Popeth",
"firehose.local": "Gweinydd hwn", "firehose.local": "Gweinydd hwn",
@ -276,6 +308,8 @@
"follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, roedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.", "follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, roedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.",
"follow_suggestions.curated_suggestion": "Dewis staff", "follow_suggestions.curated_suggestion": "Dewis staff",
"follow_suggestions.dismiss": "Peidio â dangos hwn eto", "follow_suggestions.dismiss": "Peidio â dangos hwn eto",
"follow_suggestions.featured_longer": "Wedi'i ddewis â llaw gan dîm {domain}",
"follow_suggestions.friends_of_friends_longer": "Yn boblogaidd ymhlith y bobl rydych chi'n eu dilyn",
"follow_suggestions.hints.featured": "Mae'r proffil hwn wedi'i ddewis yn arbennig gan dîm {domain}.", "follow_suggestions.hints.featured": "Mae'r proffil hwn wedi'i ddewis yn arbennig gan dîm {domain}.",
"follow_suggestions.hints.friends_of_friends": "Mae'r proffil hwn yn boblogaidd ymhlith y bobl rydych chi'n eu dilyn.", "follow_suggestions.hints.friends_of_friends": "Mae'r proffil hwn yn boblogaidd ymhlith y bobl rydych chi'n eu dilyn.",
"follow_suggestions.hints.most_followed": "Mae'r proffil hwn yn un o'r rhai sy'n cael ei ddilyn fwyaf ar {domain}.", "follow_suggestions.hints.most_followed": "Mae'r proffil hwn yn un o'r rhai sy'n cael ei ddilyn fwyaf ar {domain}.",
@ -283,6 +317,8 @@
"follow_suggestions.hints.similar_to_recently_followed": "Mae'r proffil hwn yn debyg i'r proffiliau rydych chi wedi'u dilyn yn fwyaf diweddar.", "follow_suggestions.hints.similar_to_recently_followed": "Mae'r proffil hwn yn debyg i'r proffiliau rydych chi wedi'u dilyn yn fwyaf diweddar.",
"follow_suggestions.personalized_suggestion": "Awgrym personol", "follow_suggestions.personalized_suggestion": "Awgrym personol",
"follow_suggestions.popular_suggestion": "Awgrym poblogaidd", "follow_suggestions.popular_suggestion": "Awgrym poblogaidd",
"follow_suggestions.popular_suggestion_longer": "Yn boblogaidd ar {domain}",
"follow_suggestions.similar_to_recently_followed_longer": "Yn debyg i broffiliau y gwnaethoch chi eu dilyn yn ddiweddar",
"follow_suggestions.view_all": "Gweld y cyfan", "follow_suggestions.view_all": "Gweld y cyfan",
"follow_suggestions.who_to_follow": "Pwy i ddilyn", "follow_suggestions.who_to_follow": "Pwy i ddilyn",
"followed_tags": "Hashnodau rydych yn eu dilyn", "followed_tags": "Hashnodau rydych yn eu dilyn",
@ -396,6 +432,15 @@
"loading_indicator.label": "Yn llwytho…", "loading_indicator.label": "Yn llwytho…",
"media_gallery.toggle_visible": "{number, plural, one {Cuddio delwedd} other {Cuddio delwedd}}", "media_gallery.toggle_visible": "{number, plural, one {Cuddio delwedd} other {Cuddio delwedd}}",
"moved_to_account_banner.text": "Ar hyn y bryd, mae eich cyfrif {disabledAccount} wedi ei analluogi am i chi symud i {movedToAccount}.", "moved_to_account_banner.text": "Ar hyn y bryd, mae eich cyfrif {disabledAccount} wedi ei analluogi am i chi symud i {movedToAccount}.",
"mute_modal.hide_from_notifications": "Cuddio rhag hysbysiadau",
"mute_modal.hide_options": "Cuddio'r dewis",
"mute_modal.indefinite": "Nes i mi eu dad-dewi",
"mute_modal.show_options": "Dangos y dewis",
"mute_modal.they_can_mention_and_follow": "Gallan nhw eich crybwyll a'ch dilyn, ond fyddwch chi ddim yn eu gweld.",
"mute_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu tawelu.",
"mute_modal.title": "Tewi defnyddiwr?",
"mute_modal.you_wont_see_mentions": "Welwch chi ddim postiadau sy'n sôn amdanyn nhw.",
"mute_modal.you_wont_see_posts": "Gallan nhw weld eich postiadau o hyd, ond fyddwch chi ddim yn gweld eu rhai hwy.",
"navigation_bar.about": "Ynghylch", "navigation_bar.about": "Ynghylch",
"navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch", "navigation_bar.advanced_interface": "Agor mewn rhyngwyneb gwe uwch",
"navigation_bar.blocks": "Defnyddwyr wedi eu blocio", "navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
@ -428,9 +473,23 @@
"notification.follow": "Dilynodd {name} chi", "notification.follow": "Dilynodd {name} chi",
"notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn", "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
"notification.mention": "Crybwyllodd {name} amdanoch chi", "notification.mention": "Crybwyllodd {name} amdanoch chi",
"notification.moderation-warning.learn_more": "Dysgu mwy",
"notification.moderation_warning": "Rydych wedi derbyn rhybudd cymedroli",
"notification.moderation_warning.action_delete_statuses": "Mae rhai o'ch postiadau wedi'u dileu.",
"notification.moderation_warning.action_disable": "Mae eich cyfrif wedi'i analluogi.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Mae rhai o'ch postiadau wedi'u marcio'n sensitif.",
"notification.moderation_warning.action_none": "Mae eich cyfrif wedi derbyn rhybudd cymedroli.",
"notification.moderation_warning.action_sensitive": "Bydd eich postiadau'n cael eu marcio'n sensitif o hyn ymlaen.",
"notification.moderation_warning.action_silence": "Mae eich cyfrif wedi'i gyfyngu.",
"notification.moderation_warning.action_suspend": "Mae eich cyfrif wedi'i hatal.",
"notification.own_poll": "Mae eich pleidlais wedi dod i ben", "notification.own_poll": "Mae eich pleidlais wedi dod i ben",
"notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben", "notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben",
"notification.reblog": "Hybodd {name} eich post", "notification.reblog": "Hybodd {name} eich post",
"notification.relationships_severance_event": "Wedi colli cysylltiad â {name}",
"notification.relationships_severance_event.account_suspension": "Mae gweinyddwr o {from} wedi atal {target}, sy'n golygu na allwch dderbyn diweddariadau ganddynt mwyach na rhyngweithio â nhw.",
"notification.relationships_severance_event.domain_block": "Mae gweinyddwr o {from} wedi rhwystro {target}, gan gynnwys {followersCount} o'ch dilynwyr a {followingCount, plural, one {# cyfrif} other {# cyfrif}} arall rydych chi'n ei ddilyn.",
"notification.relationships_severance_event.learn_more": "Dysgu mwy",
"notification.relationships_severance_event.user_domain_block": "Rydych wedi rhwystro {target}, gan ddileu {followersCount} o'ch dilynwyr a {followingCount, plural, one {# cyfrif} other {#cyfrifon}} arall rydych yn ei ddilyn.",
"notification.status": "{name} newydd ei bostio", "notification.status": "{name} newydd ei bostio",
"notification.update": "Golygodd {name} bostiad", "notification.update": "Golygodd {name} bostiad",
"notification_requests.accept": "Derbyn", "notification_requests.accept": "Derbyn",
@ -443,6 +502,8 @@
"notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:", "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:",
"notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
"notifications.column_settings.favourite": "Ffefrynnau:", "notifications.column_settings.favourite": "Ffefrynnau:",
"notifications.column_settings.filter_bar.advanced": "Dangos pob categori",
"notifications.column_settings.filter_bar.category": "Bar hidlo cyflym",
"notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.column_settings.follow": "Dilynwyr newydd:",
"notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:", "notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:",
"notifications.column_settings.mention": "Crybwylliadau:", "notifications.column_settings.mention": "Crybwylliadau:",
@ -653,9 +714,11 @@
"status.direct": "Crybwyll yn breifat @{name}", "status.direct": "Crybwyll yn breifat @{name}",
"status.direct_indicator": "Crybwyll preifat", "status.direct_indicator": "Crybwyll preifat",
"status.edit": "Golygu", "status.edit": "Golygu",
"status.edited": "Golygwyd ddiwethaf {date}",
"status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}", "status.edited_x_times": "Golygwyd {count, plural, one {count} two {count} other {{count} gwaith}}",
"status.embed": "Mewnblannu", "status.embed": "Mewnblannu",
"status.favourite": "Hoffi", "status.favourite": "Hoffi",
"status.favourites": "{count, plural, one {ffefryn} other {ffefryn}}",
"status.filter": "Hidlo'r postiad hwn", "status.filter": "Hidlo'r postiad hwn",
"status.filtered": "Wedi'i hidlo", "status.filtered": "Wedi'i hidlo",
"status.hide": "Cuddio'r postiad", "status.hide": "Cuddio'r postiad",
@ -676,6 +739,7 @@
"status.reblog": "Hybu", "status.reblog": "Hybu",
"status.reblog_private": "Hybu i'r gynulleidfa wreiddiol", "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
"status.reblogged_by": "Hybodd {name}", "status.reblogged_by": "Hybodd {name}",
"status.reblogs": "{count, plural, one {hwb} other {hwb}}",
"status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.", "status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
"status.redraft": "Dileu ac ailddrafftio", "status.redraft": "Dileu ac ailddrafftio",
"status.remove_bookmark": "Tynnu nod tudalen", "status.remove_bookmark": "Tynnu nod tudalen",

View File

@ -469,6 +469,7 @@
"notification.follow": "{name} te ha sequite", "notification.follow": "{name} te ha sequite",
"notification.follow_request": "{name} ha requestate de sequer te", "notification.follow_request": "{name} ha requestate de sequer te",
"notification.mention": "{name} te ha mentionate", "notification.mention": "{name} te ha mentionate",
"notification.moderation-warning.learn_more": "Apprender plus",
"notification.own_poll": "Tu sondage ha finite", "notification.own_poll": "Tu sondage ha finite",
"notification.poll": "Un sondage in le qual tu ha votate ha finite", "notification.poll": "Un sondage in le qual tu ha votate ha finite",
"notification.reblog": "{name} ha impulsate tu message", "notification.reblog": "{name} ha impulsate tu message",

View File

@ -299,7 +299,7 @@
"filter_modal.title.status": "投稿をフィルターする", "filter_modal.title.status": "投稿をフィルターする",
"filtered_notifications_banner.mentions": "{count, plural, one {メンション} other {メンション}}", "filtered_notifications_banner.mentions": "{count, plural, one {メンション} other {メンション}}",
"filtered_notifications_banner.pending_requests": "{count, plural, =0 {通知がブロックされているアカウントはありません} other {#アカウントからの通知がブロックされています}}", "filtered_notifications_banner.pending_requests": "{count, plural, =0 {通知がブロックされているアカウントはありません} other {#アカウントからの通知がブロックされています}}",
"filtered_notifications_banner.title": "ブロック済みの通知", "filtered_notifications_banner.title": "保留中の通知",
"firehose.all": "すべて", "firehose.all": "すべて",
"firehose.local": "このサーバー", "firehose.local": "このサーバー",
"firehose.remote": "ほかのサーバー", "firehose.remote": "ほかのサーバー",
@ -486,7 +486,7 @@
"notification_requests.accept": "受け入れる", "notification_requests.accept": "受け入れる",
"notification_requests.dismiss": "無視", "notification_requests.dismiss": "無視",
"notification_requests.notifications_from": "{name}からの通知", "notification_requests.notifications_from": "{name}からの通知",
"notification_requests.title": "ブロック済みの通知", "notification_requests.title": "保留中の通知",
"notifications.clear": "通知を消去", "notifications.clear": "通知を消去",
"notifications.clear_confirmation": "本当に通知を消去しますか?", "notifications.clear_confirmation": "本当に通知を消去しますか?",
"notifications.column_settings.admin.report": "新しい通報:", "notifications.column_settings.admin.report": "新しい通報:",

View File

@ -282,6 +282,7 @@
"filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.", "filter_modal.select_filter.subtitle": "Naudok esamą kategoriją arba sukurk naują.",
"filter_modal.select_filter.title": "Filtruoti šį įrašą", "filter_modal.select_filter.title": "Filtruoti šį įrašą",
"filter_modal.title.status": "Filtruoti įrašą", "filter_modal.title.status": "Filtruoti įrašą",
"filtered_notifications_banner.mentions": "{count, plural, one {paminėjimas} few {paminėjimai} many {paminėjimo} other {paminėjimų}}",
"firehose.all": "Visi", "firehose.all": "Visi",
"firehose.local": "Šis serveris", "firehose.local": "Šis serveris",
"firehose.remote": "Kiti serveriai", "firehose.remote": "Kiti serveriai",
@ -290,6 +291,8 @@
"follow_requests.unlocked_explanation": "Nors tavo paskyra neužrakinta, {domain} personalas mano, kad galbūt norėsi rankiniu būdu patikrinti šių paskyrų sekimo prašymus.", "follow_requests.unlocked_explanation": "Nors tavo paskyra neužrakinta, {domain} personalas mano, kad galbūt norėsi rankiniu būdu patikrinti šių paskyrų sekimo prašymus.",
"follow_suggestions.curated_suggestion": "Personalo pasirinkimai", "follow_suggestions.curated_suggestion": "Personalo pasirinkimai",
"follow_suggestions.dismiss": "Daugiau nerodyti", "follow_suggestions.dismiss": "Daugiau nerodyti",
"follow_suggestions.featured_longer": "Rankomis atrinkta {domain} komanda",
"follow_suggestions.friends_of_friends_longer": "Populiarus tarp žmonių, kurių seki",
"follow_suggestions.hints.featured": "Šį profilį atrinko {domain} komanda.", "follow_suggestions.hints.featured": "Šį profilį atrinko {domain} komanda.",
"follow_suggestions.hints.friends_of_friends": "Šis profilis yra populiarus tarp žmonių, kuriuos seki.", "follow_suggestions.hints.friends_of_friends": "Šis profilis yra populiarus tarp žmonių, kuriuos seki.",
"follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų {domain}.", "follow_suggestions.hints.most_followed": "Šis profilis yra vienas iš labiausiai sekamų {domain}.",
@ -297,6 +300,8 @@
"follow_suggestions.hints.similar_to_recently_followed": "Šis profilis panašus į profilius, kuriuos neseniai sekei.", "follow_suggestions.hints.similar_to_recently_followed": "Šis profilis panašus į profilius, kuriuos neseniai sekei.",
"follow_suggestions.personalized_suggestion": "Suasmenintas pasiūlymas", "follow_suggestions.personalized_suggestion": "Suasmenintas pasiūlymas",
"follow_suggestions.popular_suggestion": "Populiarus pasiūlymas", "follow_suggestions.popular_suggestion": "Populiarus pasiūlymas",
"follow_suggestions.popular_suggestion_longer": "Populiarus domene {domain}",
"follow_suggestions.similar_to_recently_followed_longer": "Panašūs į profilius, kuriuos neseniai seki",
"follow_suggestions.view_all": "Peržiūrėti viską", "follow_suggestions.view_all": "Peržiūrėti viską",
"follow_suggestions.who_to_follow": "Ką sekti", "follow_suggestions.who_to_follow": "Ką sekti",
"followed_tags": "Sekami saitažodžiai", "followed_tags": "Sekami saitažodžiai",
@ -442,6 +447,15 @@
"notification.follow": "{name} seka tave", "notification.follow": "{name} seka tave",
"notification.follow_request": "{name} paprašė tave sekti", "notification.follow_request": "{name} paprašė tave sekti",
"notification.mention": "{name} paminėjo tave", "notification.mention": "{name} paminėjo tave",
"notification.moderation-warning.learn_more": "Sužinoti daugiau",
"notification.moderation_warning": "Gavai prižiūrėjimo įspėjimą",
"notification.moderation_warning.action_delete_statuses": "Kai kurie tavo įrašai buvo pašalintos.",
"notification.moderation_warning.action_disable": "Tavo paskyra buvo išjungta.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Kai kurie tavo įrašai buvo pažymėtos kaip jautrios.",
"notification.moderation_warning.action_none": "Tavo paskyra gavo prižiūrėjimo įspėjimą.",
"notification.moderation_warning.action_sensitive": "Nuo šiol tavo įrašai bus pažymėti kaip jautrūs.",
"notification.moderation_warning.action_silence": "Tavo paskyra buvo apribota.",
"notification.moderation_warning.action_suspend": "Tavo paskyra buvo sustabdyta.",
"notification.own_poll": "Tavo apklausa baigėsi", "notification.own_poll": "Tavo apklausa baigėsi",
"notification.poll": "Apklausa, kurioje balsavai, pasibaigė", "notification.poll": "Apklausa, kurioje balsavai, pasibaigė",
"notification.reblog": "{name} pakėlė tavo įrašą", "notification.reblog": "{name} pakėlė tavo įrašą",

View File

@ -246,6 +246,7 @@
"empty_column.list": "Tento zoznam je zatiaľ prázdny. Keď ale členovia tohoto zoznamu uverejnia nové príspevky, objavia sa tu.", "empty_column.list": "Tento zoznam je zatiaľ prázdny. Keď ale členovia tohoto zoznamu uverejnia nové príspevky, objavia sa tu.",
"empty_column.lists": "Zatiaľ nemáte žiadne zoznamy. Keď nejaký vytvoríte, zobrazí sa tu.", "empty_column.lists": "Zatiaľ nemáte žiadne zoznamy. Keď nejaký vytvoríte, zobrazí sa tu.",
"empty_column.mutes": "Zatiaľ ste si nikoho nestíšili.", "empty_column.mutes": "Zatiaľ ste si nikoho nestíšili.",
"empty_column.notification_requests": "Všetko čisté! Nič tu nieje. Keď dostaneš nové oboznámenia, zobrazia sa tu podľa tvojich nastavení.",
"empty_column.notifications": "Zatiaľ nemáte žiadne upozornenia. Začnú vám pribúdať, keď s vami začnú interagovať ostatní.", "empty_column.notifications": "Zatiaľ nemáte žiadne upozornenia. Začnú vám pribúdať, keď s vami začnú interagovať ostatní.",
"empty_column.public": "Zatiaľ tu nič nie je. Napíšte niečo verejné alebo začnite sledovať účty z iných serverov, aby tu niečo pribudlo.", "empty_column.public": "Zatiaľ tu nič nie je. Napíšte niečo verejné alebo začnite sledovať účty z iných serverov, aby tu niečo pribudlo.",
"error.unexpected_crash.explanation": "Pre chybu v našom kóde alebo problém s kompatibilitou prehliadača nebolo túto stránku možné zobraziť správne.", "error.unexpected_crash.explanation": "Pre chybu v našom kóde alebo problém s kompatibilitou prehliadača nebolo túto stránku možné zobraziť správne.",

View File

@ -50,6 +50,7 @@ export default function search(state = initialState, action) {
return state.set('hidden', true); return state.set('hidden', true);
case SEARCH_FETCH_REQUEST: case SEARCH_FETCH_REQUEST:
return state.withMutations(map => { return state.withMutations(map => {
map.set('results', ImmutableMap());
map.set('isLoading', true); map.set('isLoading', true);
map.set('submitted', true); map.set('submitted', true);
map.set('type', action.searchType); map.set('type', action.searchType);

View File

@ -5616,7 +5616,7 @@ a.status-card {
user-select: text; user-select: text;
display: flex; display: flex;
@media screen and (max-width: $no-gap-breakpoint) { @media screen and (width <= 630px) {
margin-top: auto; margin-top: auto;
} }
} }

View File

@ -71,6 +71,9 @@ class Account < ApplicationRecord
MENTION_RE = %r{(?<![=/[:word:]])@((#{USERNAME_RE})(?:@[[:word:].-]+[[:word:]]+)?)}i MENTION_RE = %r{(?<![=/[:word:]])@((#{USERNAME_RE})(?:@[[:word:].-]+[[:word:]]+)?)}i
URL_PREFIX_RE = %r{\Ahttp(s?)://[^/]+} URL_PREFIX_RE = %r{\Ahttp(s?)://[^/]+}
USERNAME_ONLY_RE = /\A#{USERNAME_RE}\z/i USERNAME_ONLY_RE = /\A#{USERNAME_RE}\z/i
USERNAME_LENGTH_LIMIT = 30
DISPLAY_NAME_LENGTH_LIMIT = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i
NOTE_LENGTH_LIMIT = (ENV['MAX_BIO_CHARS'] || 500).to_i
include Attachmentable # Load prior to Avatar & Header concerns include Attachmentable # Load prior to Avatar & Header concerns
@ -87,9 +90,6 @@ class Account < ApplicationRecord
include DomainNormalizable include DomainNormalizable
include Paginable include Paginable
MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i
MAX_NOTE_LENGTH = (ENV['MAX_BIO_CHARS'] || 500).to_i
enum :protocol, { ostatus: 0, activitypub: 1 } enum :protocol, { ostatus: 0, activitypub: 1 }
enum :suspension_origin, { local: 0, remote: 1 }, prefix: true enum :suspension_origin, { local: 0, remote: 1 }, prefix: true
@ -103,10 +103,10 @@ class Account < ApplicationRecord
validates :uri, presence: true, unless: :local?, on: :create validates :uri, presence: true, unless: :local?, on: :create
# Local user validations # Local user validations
validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: 30 }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' } validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: USERNAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' } validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? } validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? }
validates :note, note_length: { maximum: MAX_NOTE_LENGTH }, if: -> { local? && will_save_change_to_note? } validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? }
validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? } validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? }
validates :uri, absence: true, if: :local?, on: :create validates :uri, absence: true, if: :local?, on: :create
validates :inbox_url, absence: true, if: :local?, on: :create validates :inbox_url, absence: true, if: :local?, on: :create
@ -138,7 +138,6 @@ class Account < ApplicationRecord
scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).joins(:account_stat) } scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).joins(:account_stat) }
scope :by_recent_status, -> { includes(:account_stat).merge(AccountStat.by_recent_status).references(:account_stat) } scope :by_recent_status, -> { includes(:account_stat).merge(AccountStat.by_recent_status).references(:account_stat) }
scope :by_recent_activity, -> { left_joins(:user, :account_stat).order(coalesced_activity_timestamps.desc).order(id: :desc) } scope :by_recent_activity, -> { left_joins(:user, :account_stat).order(coalesced_activity_timestamps.desc).order(id: :desc) }
scope :popular, -> { order('account_stats.followers_count desc') }
scope :by_domain_and_subdomains, ->(domain) { where(domain: Instance.by_domain_and_subdomains(domain).select(:domain)) } scope :by_domain_and_subdomains, ->(domain) { where(domain: Instance.by_domain_and_subdomains(domain).select(:domain)) }
scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) } scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) }
scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) } scope :not_domain_blocked_by_account, ->(account) { where(arel_table[:domain].eq(nil).or(arel_table[:domain].not_in(account.excluded_from_timeline_domains))) }

View File

@ -22,4 +22,10 @@ class ApplicationRecord < ActiveRecord::Base
value value
end end
end end
# Prevent implicit serialization in ActiveModel::Serializer or other code paths.
# This is a hardening step to avoid accidental leaking of attributes.
def as_json
raise NotImplementedError
end
end end

View File

@ -51,7 +51,6 @@ class CustomFilter < ApplicationRecord
after_commit :invalidate_cache! after_commit :invalidate_cache!
def expires_in def expires_in
return @expires_in if defined?(@expires_in)
return nil if expires_at.nil? return nil if expires_at.nil?
EXPIRATION_DURATIONS.find { |expires_in| expires_in.from_now >= expires_at } EXPIRATION_DURATIONS.find { |expires_in| expires_in.from_now >= expires_at }

View File

@ -109,7 +109,9 @@ class Status < ApplicationRecord
scope :remote, -> { where(local: false).where.not(uri: nil) } scope :remote, -> { where(local: false).where.not(uri: nil) }
scope :local, -> { where(local: true).or(where(uri: nil)) } scope :local, -> { where(local: true).or(where(uri: nil)) }
scope :with_accounts, ->(ids) { where(id: ids).includes(:account) } scope :with_accounts, ->(ids) { where(id: ids).includes(:account) }
scope :without_replies, -> { where('statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id') } scope :without_replies, -> { not_reply.or(reply_to_account) }
scope :not_reply, -> { where(reply: false) }
scope :reply_to_account, -> { where(arel_table[:in_reply_to_account_id].eq arel_table[:account_id]) }
scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) } scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) }
scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) } scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) }
scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) } scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) }

View File

@ -0,0 +1,7 @@
.fields-group
= form.input :text,
wrapper: :with_block_label
.fields-group
= form.input :hint,
wrapper: :with_block_label

View File

@ -1,14 +1,10 @@
- content_for :page_title do - content_for :page_title do
= t('admin.rules.edit') = t('admin.rules.edit')
= simple_form_for @rule, url: admin_rule_path(@rule) do |f| = simple_form_for @rule, url: admin_rule_path(@rule) do |form|
= render 'shared/error_messages', object: @rule = render 'shared/error_messages', object: @rule
.fields-group = render form
= f.input :text, wrapper: :with_block_label
.fields-group
= f.input :hint, wrapper: :with_block_label
.actions .actions
= f.button :button, t('generic.save_changes'), type: :submit = form.button :button, t('generic.save_changes'), type: :submit

View File

@ -6,17 +6,13 @@
%hr.spacer/ %hr.spacer/
- if can? :create, :rule - if can? :create, :rule
= simple_form_for @rule, url: admin_rules_path do |f| = simple_form_for @rule, url: admin_rules_path do |form|
= render 'shared/error_messages', object: @rule = render 'shared/error_messages', object: @rule
.fields-group = render form
= f.input :text, wrapper: :with_block_label
.fields-group
= f.input :hint, wrapper: :with_block_label
.actions .actions
= f.button :button, t('admin.rules.add_new'), type: :submit = form.button :button, t('admin.rules.add_new'), type: :submit
%hr.spacer/ %hr.spacer/

View File

@ -0,0 +1,7 @@
.fields-group
= form.input :title,
wrapper: :with_block_label
.fields-group
= form.input :text,
wrapper: :with_block_label

View File

@ -1,14 +1,10 @@
- content_for :page_title do - content_for :page_title do
= t('admin.warning_presets.edit_preset') = t('admin.warning_presets.edit_preset')
= simple_form_for @warning_preset, url: admin_warning_preset_path(@warning_preset) do |f| = simple_form_for @warning_preset, url: admin_warning_preset_path(@warning_preset) do |form|
= render 'shared/error_messages', object: @warning_preset = render 'shared/error_messages', object: @warning_preset
.fields-group = render form
= f.input :title, wrapper: :with_block_label
.fields-group
= f.input :text, wrapper: :with_block_label
.actions .actions
= f.button :button, t('generic.save_changes'), type: :submit = form.button :button, t('generic.save_changes'), type: :submit

View File

@ -2,17 +2,13 @@
= t('admin.warning_presets.title') = t('admin.warning_presets.title')
- if can? :create, :account_warning_preset - if can? :create, :account_warning_preset
= simple_form_for @warning_preset, url: admin_warning_presets_path do |f| = simple_form_for @warning_preset, url: admin_warning_presets_path do |form|
= render 'shared/error_messages', object: @warning_preset = render 'shared/error_messages', object: @warning_preset
.fields-group = render form
= f.input :title, wrapper: :with_block_label
.fields-group
= f.input :text, wrapper: :with_block_label
.actions .actions
= f.button :button, t('admin.warning_presets.add_new'), type: :submit = form.button :button, t('admin.warning_presets.add_new'), type: :submit
%hr.spacer/ %hr.spacer/

View File

@ -2,6 +2,6 @@
= t('admin.webhooks.edit') = t('admin.webhooks.edit')
= simple_form_for @webhook, url: admin_webhook_path(@webhook) do |form| = simple_form_for @webhook, url: admin_webhook_path(@webhook) do |form|
= render partial: 'form', object: form = render form
.actions .actions
= form.button :button, t('generic.save_changes'), type: :submit = form.button :button, t('generic.save_changes'), type: :submit

View File

@ -2,6 +2,6 @@
= t('admin.webhooks.new') = t('admin.webhooks.new')
= simple_form_for @webhook, url: admin_webhooks_path do |form| = simple_form_for @webhook, url: admin_webhooks_path do |form|
= render partial: 'form', object: form = render form
.actions .actions
= form.button :button, t('admin.webhooks.add_new'), type: :submit = form.button :button, t('admin.webhooks.add_new'), type: :submit

View File

@ -15,10 +15,10 @@
.fields-row .fields-row
.fields-row__column.fields-row__column-6 .fields-row__column.fields-row__column-6
.fields-group .fields-group
= f.input :display_name, wrapper: :with_block_label, input_html: { maxlength: Account::MAX_DISPLAY_NAME_LENGTH, data: { default: @account.username } } = f.input :display_name, wrapper: :with_block_label, input_html: { maxlength: Account::DISPLAY_NAME_LENGTH_LIMIT, data: { default: @account.username } }
.fields-group .fields-group
= f.input :note, wrapper: :with_block_label, input_html: { maxlength: Account::MAX_NOTE_LENGTH } = f.input :note, wrapper: :with_block_label, input_html: { maxlength: Account::NOTE_LENGTH_LIMIT }
.fields-row__column.fields-group.fields-row__column-6 .fields-row__column.fields-group.fields-row__column-6
.input.with_block_label .input.with_block_label

View File

@ -51,12 +51,8 @@ require_relative '../lib/active_record/database_tasks_extensions'
require_relative '../lib/active_record/batches' require_relative '../lib/active_record/batches'
require_relative '../lib/simple_navigation/item_extensions' require_relative '../lib/simple_navigation/item_extensions'
Dotenv::Rails.load
Bundler.require(:pam_authentication) if ENV['PAM_ENABLED'] == 'true' Bundler.require(:pam_authentication) if ENV['PAM_ENABLED'] == 'true'
require_relative '../lib/mastodon/redis_config'
module Mastodon module Mastodon
class Application < Rails::Application class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version. # Initialize configuration defaults for originally generated Rails version.
@ -98,6 +94,10 @@ module Mastodon
app.deprecators[:mastodon] = ActiveSupport::Deprecation.new('4.3', 'mastodon/mastodon') app.deprecators[:mastodon] = ActiveSupport::Deprecation.new('4.3', 'mastodon/mastodon')
end end
config.before_configuration do
require 'mastodon/redis_config'
end
config.to_prepare do config.to_prepare do
Doorkeeper::AuthorizationsController.layout 'modal' Doorkeeper::AuthorizationsController.layout 'modal'
Doorkeeper::AuthorizedApplicationsController.layout 'admin' Doorkeeper::AuthorizedApplicationsController.layout 'admin'

View File

@ -645,6 +645,9 @@ cy:
actions_description_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Os byddwch yn cymryd camau cosbol yn erbyn y cyfrif a adroddwyd, bydd hysbysiad e-bost yn cael ei anfon atyn nhw, ac eithrio pan fydd y categori <strong>Sbam</strong> yn cael ei ddewis. actions_description_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Os byddwch yn cymryd camau cosbol yn erbyn y cyfrif a adroddwyd, bydd hysbysiad e-bost yn cael ei anfon atyn nhw, ac eithrio pan fydd y categori <strong>Sbam</strong> yn cael ei ddewis.
actions_description_remote_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Bydd hyn ond yn effeithio ar sut <strong>mae'ch</strong> gweinydd yn cyfathrebu â'r cyfrif hwn o bell ac yn trin ei gynnwys. actions_description_remote_html: Penderfynwch pa gamau i'w cymryd i ddatrys yr adroddiad hwn. Bydd hyn ond yn effeithio ar sut <strong>mae'ch</strong> gweinydd yn cyfathrebu â'r cyfrif hwn o bell ac yn trin ei gynnwys.
add_to_report: Ychwanegu rhagor i adroddiad add_to_report: Ychwanegu rhagor i adroddiad
already_suspended_badges:
local: Wedi atal dros dro ar y gweinydd hwn yn barod
remote: Wedi'i atal eisoes ar eu gweinydd
are_you_sure: Ydych chi'n siŵr? are_you_sure: Ydych chi'n siŵr?
assign_to_self: Neilltuo i mi assign_to_self: Neilltuo i mi
assigned: Cymedrolwr wedi'i neilltuo assigned: Cymedrolwr wedi'i neilltuo
@ -804,6 +807,7 @@ cy:
desc_html: Mae hyn yn dibynnu ar sgriptiau allanol gan hCaptcha, a all fod yn bryder diogelwch a phreifatrwydd. Yn ogystal, <strong>gall hyn wneud y broses gofrestru yn llawer llai hygyrch i rai pobl (yn enwedig yr anabl)</strong>. Am y rhesymau hyn, ystyriwch fesurau eraill fel cofrestru ar sail cymeradwyaeth neu ar sail gwahoddiad. desc_html: Mae hyn yn dibynnu ar sgriptiau allanol gan hCaptcha, a all fod yn bryder diogelwch a phreifatrwydd. Yn ogystal, <strong>gall hyn wneud y broses gofrestru yn llawer llai hygyrch i rai pobl (yn enwedig yr anabl)</strong>. Am y rhesymau hyn, ystyriwch fesurau eraill fel cofrestru ar sail cymeradwyaeth neu ar sail gwahoddiad.
title: Ei gwneud yn ofynnol i ddefnyddwyr newydd ddatrys CAPTCHA i gadarnhau eu cyfrif title: Ei gwneud yn ofynnol i ddefnyddwyr newydd ddatrys CAPTCHA i gadarnhau eu cyfrif
content_retention: content_retention:
danger_zone: Parth perygl
preamble: Rheoli sut mae cynnwys sy'n cael ei gynhyrchu gan ddefnyddwyr yn cael ei storio yn Mastodon. preamble: Rheoli sut mae cynnwys sy'n cael ei gynhyrchu gan ddefnyddwyr yn cael ei storio yn Mastodon.
title: Cadw cynnwys title: Cadw cynnwys
default_noindex: default_noindex:
@ -1756,13 +1760,26 @@ cy:
import: Mewnforio import: Mewnforio
import_and_export: Mewnforio ac allforio import_and_export: Mewnforio ac allforio
migrate: Mudo cyfrif migrate: Mudo cyfrif
notifications: Hysbysiadau e-bost
preferences: Dewisiadau preferences: Dewisiadau
profile: Proffil cyhoeddus profile: Proffil cyhoeddus
relationships: Yn dilyn a dilynwyr relationships: Yn dilyn a dilynwyr
severed_relationships: Perthynasau wedi'u torri
statuses_cleanup: Dileu postiadau'n awtomatig statuses_cleanup: Dileu postiadau'n awtomatig
strikes: Rhybuddion cymedroli strikes: Rhybuddion cymedroli
two_factor_authentication: Dilysu dau-ffactor two_factor_authentication: Dilysu dau-ffactor
webauthn_authentication: Allweddi diogelwch webauthn_authentication: Allweddi diogelwch
severed_relationships:
download: Llwytho i lawr (%{count})
event_type:
account_suspension: Atal cyfrif (%{target_name})
domain_block: Ataliad gweinydd (%{target_name})
user_domain_block: Rydych wedi rhwystro %{target_name}
lost_followers: Dilynwyr coll
lost_follows: Yn dilyn coll
preamble: Efallai y byddwch yn colli dilynwyr a'r rhai rydych yn eu dilyn pan fyddwch yn rhwystro parth neu pan fydd eich cymedrolwyr yn penderfynu atal gweinydd o bell. Pan fydd hynny'n digwydd, byddwch yn gallu llwytho i lawr rhestrau o berthnasoedd wedi'u torri, i'w harchwilio ac o bosibl eu mewnforio ar weinydd arall.
purged: Mae gwybodaeth am y gweinydd hwn wedi'i dynnu gan weinyddwyr eich gweinydd.
type: Digwyddiad
statuses: statuses:
attached: attached:
audio: audio:
@ -1880,6 +1897,7 @@ cy:
contrast: Mastodon (Cyferbyniad uchel) contrast: Mastodon (Cyferbyniad uchel)
default: Mastodon (Tywyll) default: Mastodon (Tywyll)
mastodon-light: Mastodon (Golau) mastodon-light: Mastodon (Golau)
system: Awtomatig (defnyddio thema system)
time: time:
formats: formats:
default: "%b %d, %Y, %H:%M" default: "%b %d, %Y, %H:%M"
@ -1992,6 +2010,13 @@ cy:
follows_subtitle: Dilynwch gyfrifon adnabyddus follows_subtitle: Dilynwch gyfrifon adnabyddus
follows_title: Pwy i ddilyn follows_title: Pwy i ddilyn
follows_view_more: Gweld mwy o bobl i ddilyn follows_view_more: Gweld mwy o bobl i ddilyn
hashtags_recent_count:
few: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
many: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
one: "%{people} person yn ystod y 2 ddiwrnod diwethaf"
other: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
two: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
zero: "%{people} o bobl yn y 2 ddiwrnod diwethaf"
hashtags_subtitle: Gweld beth sy'n tueddu dros y 2 ddiwrnod diwethaf hashtags_subtitle: Gweld beth sy'n tueddu dros y 2 ddiwrnod diwethaf
hashtags_title: Hashnodau tuedd hashtags_title: Hashnodau tuedd
hashtags_view_more: Gweld mwy o hashnodau tuedd hashtags_view_more: Gweld mwy o hashnodau tuedd
@ -1999,7 +2024,7 @@ cy:
post_step: Dywedwch helo wrth y byd gyda thestun, lluniau, fideos neu arolygon barn. post_step: Dywedwch helo wrth y byd gyda thestun, lluniau, fideos neu arolygon barn.
post_title: Creu'ch postiad cyntaf post_title: Creu'ch postiad cyntaf
share_action: Rhannu share_action: Rhannu
share_step: Gadewch i'ch ffrindiau wybod sut i ddod o hyd i chi ar Mastodon! share_step: Gadewch i'ch ffrindiau wybod sut i ddod o hyd i chi ar Mastodon.
share_title: Rhannwch eich proffil Mastodon share_title: Rhannwch eich proffil Mastodon
sign_in_action: Mewngofnodi sign_in_action: Mewngofnodi
subject: Croeso i Mastodon subject: Croeso i Mastodon

View File

@ -174,6 +174,7 @@ cy:
read:filters: gweld eich hidlwyr read:filters: gweld eich hidlwyr
read:follows: gweld eich dilynwyr read:follows: gweld eich dilynwyr
read:lists: gweld eich rhestrau read:lists: gweld eich rhestrau
read:me: darllen dim ond manylion elfennol eich cyfrif
read:mutes: gweld eich anwybyddiadau read:mutes: gweld eich anwybyddiadau
read:notifications: gweld eich hysbysiadau read:notifications: gweld eich hysbysiadau
read:reports: gweld eich adroddiadau read:reports: gweld eich adroddiadau

View File

@ -174,6 +174,7 @@ lt:
read:filters: matyti tavo filtrus read:filters: matyti tavo filtrus
read:follows: matyti tavo sekimus read:follows: matyti tavo sekimus
read:lists: matyti tavo sąrašus read:lists: matyti tavo sąrašus
read:me: skaityti tik pagrindinę paskyros informaciją
read:mutes: matyti tavo nutildymus read:mutes: matyti tavo nutildymus
read:notifications: matyti tavo pranešimus read:notifications: matyti tavo pranešimus
read:reports: matyti tavo ataskaitas read:reports: matyti tavo ataskaitas

View File

@ -751,6 +751,7 @@ gl:
desc_html: Ten dependencia de scripts externos desde hCaptcha, que podería ser un problema de seguridade e privacidade. Ademáis, <strong>pode diminuír a accesiblidade para algunhas persoas (principalmente as discapacitadas)</strong>. Por estas razóns, considera medidas alternativas como o rexistro por convite e a aprobación manual das contas. desc_html: Ten dependencia de scripts externos desde hCaptcha, que podería ser un problema de seguridade e privacidade. Ademáis, <strong>pode diminuír a accesiblidade para algunhas persoas (principalmente as discapacitadas)</strong>. Por estas razóns, considera medidas alternativas como o rexistro por convite e a aprobación manual das contas.
title: Pedirlle ás novas usuarias resolver un CAPTCHA para confirmar a súa conta title: Pedirlle ás novas usuarias resolver un CAPTCHA para confirmar a súa conta
content_retention: content_retention:
danger_zone: Zona perigosa
preamble: Controla como se gardan en Mastodon os contidos creados polas usuarias. preamble: Controla como se gardan en Mastodon os contidos creados polas usuarias.
title: Retención do contido title: Retención do contido
default_noindex: default_noindex:

View File

@ -130,6 +130,7 @@ ia:
silenced: Limitate silenced: Limitate
statuses: Messages statuses: Messages
subscribe: Subscriber subscribe: Subscriber
suspend: Suspender
suspended: Suspendite suspended: Suspendite
title: Contos title: Contos
unblock_email: Disblocar adresse de e-mail unblock_email: Disblocar adresse de e-mail
@ -141,6 +142,8 @@ ia:
view_domain: Vider summario de dominio view_domain: Vider summario de dominio
action_logs: action_logs:
action_types: action_types:
change_email_user: Cambiar e-mail pro le usator
change_role_user: Cambiar le rolo del usator
confirm_user: Confirmar le usator confirm_user: Confirmar le usator
create_account_warning: Crear un advertimento create_account_warning: Crear un advertimento
create_announcement: Crear annuncio create_announcement: Crear annuncio
@ -155,6 +158,7 @@ ia:
enable_custom_emoji: Activar emoji personalisate enable_custom_emoji: Activar emoji personalisate
enable_user: Activar le usator enable_user: Activar le usator
promote_user: Promover usator promote_user: Promover usator
resend_user: Reinviar message de confirmation
reset_password_user: Reinitialisar contrasigno reset_password_user: Reinitialisar contrasigno
silence_account: Limitar conto silence_account: Limitar conto
unblock_email_account: Disblocar adresse de e-mail unblock_email_account: Disblocar adresse de e-mail
@ -187,6 +191,7 @@ ia:
delete: Deler delete: Deler
disable: Disactivar disable: Disactivar
disabled: Disactivate disabled: Disactivate
disabled_msg: Emoji disactivate con successo
enable: Activar enable: Activar
enabled: Activate enabled: Activate
enabled_msg: Emoji activate con successo enabled_msg: Emoji activate con successo

View File

@ -502,6 +502,8 @@ lt:
settings: settings:
captcha_enabled: captcha_enabled:
desc_html: Tai priklauso nuo hCaptcha išorinių skriptų, kurie gali kelti susirūpinimą dėl saugumo ir privatumo. Be to, <strong>dėl to registracijos procesas kai kuriems žmonėms (ypač neįgaliesiems) gali būti gerokai sunkiau prieinami</strong>. Dėl šių priežasčių apsvarstyk alternatyvias priemones, pavyzdžiui, patvirtinimu arba kvietimu grindžiamą registraciją. desc_html: Tai priklauso nuo hCaptcha išorinių skriptų, kurie gali kelti susirūpinimą dėl saugumo ir privatumo. Be to, <strong>dėl to registracijos procesas kai kuriems žmonėms (ypač neįgaliesiems) gali būti gerokai sunkiau prieinami</strong>. Dėl šių priežasčių apsvarstyk alternatyvias priemones, pavyzdžiui, patvirtinimu arba kvietimu grindžiamą registraciją.
content_retention:
danger_zone: Pavojinga zona
domain_blocks: domain_blocks:
all: Visiems all: Visiems
registrations: registrations:

View File

@ -77,10 +77,13 @@ cy:
warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd warn: Cuddiwch y cynnwys wedi'i hidlo y tu ôl i rybudd sy'n sôn am deitl yr hidlydd
form_admin_settings: form_admin_settings:
activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol activity_api_enabled: Cyfrif o bostiadau a gyhoeddir yn lleol, defnyddwyr gweithredol, a chofrestriadau newydd mewn bwcedi wythnosol
backups_retention_period: Mae gan ddefnyddwyr y gallu i gynhyrchu archifau o'u postiadau i'w llwytho i lawr yn ddiweddarach. Pan gânt eu gosod i werth positif, bydd yr archifau hyn yn cael eu dileu'n awtomatig o'ch storfa ar ôl y nifer penodedig o ddyddiau.
bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd. bootstrap_timeline_accounts: Bydd y cyfrifon hyn yn cael eu pinio i frig argymhellion dilynol defnyddwyr newydd.
closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau closed_registrations_message: Yn cael eu dangos pan fydd cofrestriadau wedi cau
content_cache_retention_period: Bydd yr holl bostiadau gan weinyddion eraill (gan gynnwys hwb ac atebion) yn cael eu dileu ar ôl y nifer penodedig o ddyddiau, heb ystyried unrhyw ryngweithio defnyddiwr lleol â'r postiadau hynny. Mae hyn yn cynnwys postiadau lle mae defnyddiwr lleol wedi ei farcio fel nodau tudalen neu ffefrynnau. Bydd cyfeiriadau preifat rhwng defnyddwyr o wahanol achosion hefyd yn cael eu colli ac yn amhosibl eu hadfer. Mae'r defnydd o'r gosodiad hwn wedi'i fwriadu ar gyfer achosion pwrpas arbennig ac mae'n torri llawer o ddisgwyliadau defnyddwyr pan gaiff ei weithredu at ddibenion cyffredinol.
custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon. custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon.
mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch. mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch.
media_cache_retention_period: Mae ffeiliau cyfryngau o bostiadau a wneir gan ddefnyddwyr o bell yn cael eu storio ar eich gweinydd. Pan gaiff ei osod i werth positif, bydd y cyfryngau yn cael eu dileu ar ôl y nifer penodedig o ddyddiau. Os gofynnir am y data cyfryngau ar ôl iddo gael ei ddileu, caiff ei ail-lwytho i lawr, os yw'r cynnwys ffynhonnell yn dal i fod ar gael. Oherwydd cyfyngiadau ar ba mor aml y mae cardiau rhagolwg cyswllt yn pleidleisio i wefannau trydydd parti, argymhellir gosod y gwerth hwn i o leiaf 14 diwrnod, neu ni fydd cardiau rhagolwg cyswllt yn cael eu diweddaru ar alw cyn yr amser hwnnw.
peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol. peers_api_enabled: Rhestr o enwau parth y mae'r gweinydd hwn wedi dod ar eu traws yn y ffediws. Nid oes unrhyw ddata wedi'i gynnwys yma ynghylch a ydych chi'n ffedereiddio â gweinydd penodol, dim ond bod eich gweinydd yn gwybod amdano. Defnyddir hwn gan wasanaethau sy'n casglu ystadegau ar ffedereiddio mewn ystyr cyffredinol.
profile_directory: Mae'r cyfeiriadur proffil yn rhestru'r holl ddefnyddwyr sydd wedi dewis i fod yn ddarganfyddiadwy. profile_directory: Mae'r cyfeiriadur proffil yn rhestru'r holl ddefnyddwyr sydd wedi dewis i fod yn ddarganfyddiadwy.
require_invite_text: Pan fydd angen cymeradwyaeth â llaw ar gyfer cofrestriadau, gwnewch y “Pam ydych chi am ymuno?” mewnbwn testun yn orfodol yn hytrach na dewisol require_invite_text: Pan fydd angen cymeradwyaeth â llaw ar gyfer cofrestriadau, gwnewch y “Pam ydych chi am ymuno?” mewnbwn testun yn orfodol yn hytrach na dewisol
@ -240,6 +243,7 @@ cy:
backups_retention_period: Cyfnod cadw archif defnyddwyr backups_retention_period: Cyfnod cadw archif defnyddwyr
bootstrap_timeline_accounts: Argymhellwch y cyfrifon hyn i ddefnyddwyr newydd bob amser bootstrap_timeline_accounts: Argymhellwch y cyfrifon hyn i ddefnyddwyr newydd bob amser
closed_registrations_message: Neges bersonol pan nad yw cofrestriadau ar gael closed_registrations_message: Neges bersonol pan nad yw cofrestriadau ar gael
content_cache_retention_period: Cyfnod cadw cynnwys o bell
custom_css: CSS cyfaddas custom_css: CSS cyfaddas
mascot: Mascot cyfaddas (hen) mascot: Mascot cyfaddas (hen)
media_cache_retention_period: Cyfnod cadw storfa cyfryngau media_cache_retention_period: Cyfnod cadw storfa cyfryngau

View File

@ -77,6 +77,7 @@ fi:
warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi warn: Piilota suodatettu sisältö varoituksen taakse, jossa mainitaan suodattimen nimi
form_admin_settings: form_admin_settings:
activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä
backups_retention_period: Käyttäjillä on mahdollisuus arkistoida julkaisujaan myöhemmin ladattaviksi. Kun tämä on asetettu positiiviseksi arvoksi, nämä arkistot poistetaan automaattisesti asetetun päivien määrän jälkeen.
bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun. bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun.
closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu
custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa. custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa.

View File

@ -77,10 +77,13 @@ gl:
warn: Agochar o contido filtrado tras un aviso que conteña o nome do filtro warn: Agochar o contido filtrado tras un aviso que conteña o nome do filtro
form_admin_settings: form_admin_settings:
activity_api_enabled: Conta do número de publicacións locais, usuarias activas, e novos rexistros en acumulados semanais activity_api_enabled: Conta do número de publicacións locais, usuarias activas, e novos rexistros en acumulados semanais
backups_retention_period: As usuarias poden crear arquivos das súas publicacións para descargalos. Cando se establece un valor positivo, estes arquivos serán borrados automáticamente da túa almacenaxe despois do número de días establecido.
bootstrap_timeline_accounts: Estas contas aparecerán fixas na parte superior das recomendacións para as usuarias. bootstrap_timeline_accounts: Estas contas aparecerán fixas na parte superior das recomendacións para as usuarias.
closed_registrations_message: Móstrase cando non se admiten novas usuarias closed_registrations_message: Móstrase cando non se admiten novas usuarias
content_cache_retention_period: Todas as publicacións procedentes de outros servidores (incluído promocións e respostas) van ser eliminadas despois do número de días indicado, sen importar as interaccións das usuarias locais con esas publicacións. Esto inclúe publicacións que a usuaria local marcou como favoritas ou incluíu nos marcadores. As mencións privadas entre usuarias de diferentes instancias tamén se eliminarán e non se poderán restablecer. O uso desta ferramenta esta orientado a situacións especiais e estraga moitas das expectativas das usuarias ao implementala cun propósito de uso xeral.
custom_css: Podes aplicar deseños personalizados na versión web de Mastodon. custom_css: Podes aplicar deseños personalizados na versión web de Mastodon.
mascot: Sobrescribe a ilustración na interface web avanzada. mascot: Sobrescribe a ilustración na interface web avanzada.
media_cache_retention_period: Os ficheiros multimedia de publicacións de usuarias remotas están almacenados no teu servidor. Ao establecer un valor positivo, o multimedia vaise eliminar despois do número de días establecido. Se o multimedia fose requerido após ser eliminado entón descargaríase outra vez, se aínda está dispoñible na orixe. Debido a restricións sobre a frecuencia en que o servizo de vista previa trae recursos de terceiras partes, é recomendable establecer este valor polo menos en 14 días, ou as tarxetas de vista previa non se actualizarán baixo demanda para casos anteriores a ese prazo.
peers_api_enabled: Unha lista dos nomes de dominio que este servidor atopou no fediverso. Non se inclúen aquí datos acerca de se estás a federar con eles ou non, só que o teu servidor os recoñeceu. Ten utilidade para servizos que recollen estatísticas acerca da federación nun amplo senso. peers_api_enabled: Unha lista dos nomes de dominio que este servidor atopou no fediverso. Non se inclúen aquí datos acerca de se estás a federar con eles ou non, só que o teu servidor os recoñeceu. Ten utilidade para servizos que recollen estatísticas acerca da federación nun amplo senso.
profile_directory: O directorio de perfís inclúe a tódalas usuarias que optaron por ser descubribles. profile_directory: O directorio de perfís inclúe a tódalas usuarias que optaron por ser descubribles.
require_invite_text: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo require_invite_text: Cando os rexistros requiren aprobación manual, facer que o texto "Por que te queres rexistrar?" do convite sexa obrigatorio en lugar de optativo
@ -240,6 +243,7 @@ gl:
backups_retention_period: Período de retención do arquivo da usuaria backups_retention_period: Período de retención do arquivo da usuaria
bootstrap_timeline_accounts: Recomendar sempre estas contas ás novas usuarias bootstrap_timeline_accounts: Recomendar sempre estas contas ás novas usuarias
closed_registrations_message: Mensaxe personalizada para cando o rexistro está pechado closed_registrations_message: Mensaxe personalizada para cando o rexistro está pechado
content_cache_retention_period: Período de retención de contido remoto
custom_css: CSS personalizado custom_css: CSS personalizado
mascot: Mascota propia (herdado) mascot: Mascota propia (herdado)
media_cache_retention_period: Período de retención da caché multimedia media_cache_retention_period: Período de retención da caché multimedia

View File

@ -5,8 +5,10 @@ ia:
account: account:
note: 'Tu pote @mentionar altere personas o #hashtags.' note: 'Tu pote @mentionar altere personas o #hashtags.'
defaults: defaults:
password: Usa al minus 8 characteres
setting_display_media_hide_all: Sempre celar le medios setting_display_media_hide_all: Sempre celar le medios
setting_display_media_show_all: Sempre monstrar le medios setting_display_media_show_all: Sempre monstrar le medios
username: Tu pote usar litteras, numeros e tractos de sublineamento
webhook: webhook:
events: Selige le eventos a inviar events: Selige le eventos a inviar
url: Ubi le eventos essera inviate url: Ubi le eventos essera inviate
@ -24,7 +26,10 @@ ia:
admin_account_action: admin_account_action:
type: Action type: Action
types: types:
disable: Gelar
none: Inviar un advertimento none: Inviar un advertimento
silence: Limitar
suspend: Suspender
announcement: announcement:
text: Annuncio text: Annuncio
defaults: defaults:

View File

@ -80,8 +80,10 @@ is:
backups_retention_period: Notendur hafa kost á að útbúa safnskrár með færslunum sínum til að sækja svo síðar. Þegar þetta er stillt á jákvætt gildi, verður þessum safnskrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga. backups_retention_period: Notendur hafa kost á að útbúa safnskrár með færslunum sínum til að sækja svo síðar. Þegar þetta er stillt á jákvætt gildi, verður þessum safnskrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga.
bootstrap_timeline_accounts: Þessir notendaaðgangar verða festir efst í meðmælum til nýrra notenda um að fylgjast með þeim. bootstrap_timeline_accounts: Þessir notendaaðgangar verða festir efst í meðmælum til nýrra notenda um að fylgjast með þeim.
closed_registrations_message: Birtist þegar lokað er á nýskráningar closed_registrations_message: Birtist þegar lokað er á nýskráningar
content_cache_retention_period: Öllum færslum af öðrum netþjónum (þar með taldar endurbirtingar og svör) verður eytt eftir uppgefinn fjölda daga, án tillits til gagnvirkni staðværra notenda við þessar færslur. Þetta á einnig við um færslur sem notandinn hefur merkt sem bókamerki eða eftirlæti. Beinar tilvísanir (einkaspjall) milli notenda af mismunandi netþjónum munu einnig tapast og er engin leið til að endurheimta þær. Notkun á þessari stillingu er einungis ætluð sérstilltum netþjónum og mun skemma fyrir notendum ef þetta er sett upp fyrir almenna notkun.
custom_css: Þú getur virkjað sérsniðna stíla í vefútgáfu Mastodon. custom_css: Þú getur virkjað sérsniðna stíla í vefútgáfu Mastodon.
mascot: Þetta tekyr yfir myndskreytinguna í ítarlega vefviðmótinu. mascot: Þetta tekyr yfir myndskreytinguna í ítarlega vefviðmótinu.
media_cache_retention_period: Myndefnisskrár úr færslum sem gerðar eru af fjartengdum notendum eru geymdar á netþjóninum þínum. Þegar þetta er stillt á jákvætt gildi, verður þessum skrám eytt sjáfkrafa eftir þeim tiltekna fjölda daga. Ef beðið er um myndefnið eftir að því er eytt, mun það verða sótt aftur ef frumgögnin eru ennþá aðgengileg. Vegna takmarkana á hversu oft forskoðunarspjöld tengla eru sótt á utanaðkomandi netþjóna, þá er mælt með því að setja þetta gildi á að minnsta kosti 14 daga, annars gæti mistekist að uppfæra forskoðunarspjöld tengla eftir þörfum fyrir þann tíma.
peers_api_enabled: Listi yfir þau lénaheiti sem þessi netþjónn hefur rekist á í skýjasambandinu. Engin gögn eru hér sem gefa til kynna hvort þú sért í sambandi við tiltekinn netþjón, bara að netþjónninn þinn viti um hann. Þetta er notað af þjónustum sem safna tölfræði um skýjasambönd á almennan hátt. peers_api_enabled: Listi yfir þau lénaheiti sem þessi netþjónn hefur rekist á í skýjasambandinu. Engin gögn eru hér sem gefa til kynna hvort þú sért í sambandi við tiltekinn netþjón, bara að netþjónninn þinn viti um hann. Þetta er notað af þjónustum sem safna tölfræði um skýjasambönd á almennan hátt.
profile_directory: Notendamappan telur upp alla þá notendur sem hafa valið að vera uppgötvanlegir. profile_directory: Notendamappan telur upp alla þá notendur sem hafa valið að vera uppgötvanlegir.
require_invite_text: Þegar nýskráningar krefjast handvirks samþykkis, þá skal gera textann í “Hvers vegna viltu taka þátt?” að kröfu en ekki valkvæðan require_invite_text: Þegar nýskráningar krefjast handvirks samþykkis, þá skal gera textann í “Hvers vegna viltu taka þátt?” að kröfu en ekki valkvæðan

View File

@ -74,6 +74,9 @@ lt:
warn: Slėpti filtruojamą turinį po įspėjimu, paminint filtro pavadinimą warn: Slėpti filtruojamą turinį po įspėjimu, paminint filtro pavadinimą
form_admin_settings: form_admin_settings:
activity_api_enabled: Vietinių paskelbtų įrašų, aktyvių naudotojų ir naujų registracijų skaičiai kas savaitę activity_api_enabled: Vietinių paskelbtų įrašų, aktyvių naudotojų ir naujų registracijų skaičiai kas savaitę
backups_retention_period: Naudotojai gali generuoti savo įrašų archyvus, kuriuos vėliau galės atsisiųsti. Nustačius teigiamą reikšmę, šie archyvai po nurodyto dienų skaičiaus bus automatiškai ištrinti iš saugyklos.
content_cache_retention_period: Visi įrašai iš kitų serverių (įskaitant pakėlimus ir atsakymus) bus ištrinti po nurodyto dienų skaičiaus, neatsižvelgiant į bet kokią vietinio naudotojo sąveiką su tais įrašais. Tai taikoma ir tiems įrašams, kuriuos vietinis naudotojas yra pažymėjęs kaip žymes ar mėgstamus. Privačios paminėjimai tarp naudotojų iš skirtingų instancijų taip pat bus prarastos ir jų bus neįmanoma atkurti. Šis nustatymas skirtas naudoti ypatingos paskirties instancijose, o įgyvendinus jį bendram naudojimui, pažeidžiami daugelio naudotojų lūkesčiai.
media_cache_retention_period: Nuotolinių naudotojų įrašytų įrašų medijos failai talpinami tavo serveryje. Nustačius teigiamą reikšmę, medijos bus ištrinamos po nurodyto dienų skaičiaus. Jei medijos duomenų bus paprašyta po to, kai jie bus ištrinti, jie bus atsiųsti iš naujo, jei šaltinio turinys vis dar prieinamas. Dėl apribojimų, susijusių su nuorodų peržiūros kortelių apklausos dažnumu trečiųjų šalių svetainėse, rekomenduojama nustatyti šią reikšmę ne trumpesnę kaip 14 dienų, kitaip nuorodų peržiūros kortelės nebus atnaujinamos pagal pareikalavimą iki to laiko.
peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme. peers_api_enabled: Domenų pavadinimų sąrašas, su kuriais šis serveris susidūrė fediverse. Čia nėra duomenų apie tai, ar tu bendrauji su tam tikru serveriu, tik apie tai, kad tavo serveris apie jį žino. Tai naudojama tarnybose, kurios renka federacijos statistiką bendrąja prasme.
site_contact_email: Kaip žmonės gali su tavimi susisiekti teisiniais ar pagalbos užklausimais. site_contact_email: Kaip žmonės gali su tavimi susisiekti teisiniais ar pagalbos užklausimais.
site_contact_username: Kaip žmonės gali tave pasiekti Mastodon. site_contact_username: Kaip žmonės gali tave pasiekti Mastodon.
@ -145,6 +148,7 @@ lt:
form_admin_settings: form_admin_settings:
activity_api_enabled: Skelbti suvestinį statistiką apie naudotojų veiklą per API activity_api_enabled: Skelbti suvestinį statistiką apie naudotojų veiklą per API
bootstrap_timeline_accounts: Visada rekomenduoti šias paskyras naujiems naudotojams bootstrap_timeline_accounts: Visada rekomenduoti šias paskyras naujiems naudotojams
content_cache_retention_period: Nuotolinio turinio saugojimo laikotarpis
custom_css: Pasirinktinis CSS custom_css: Pasirinktinis CSS
mascot: Pasirinktinis talismanas (pasenęs) mascot: Pasirinktinis talismanas (pasenęs)
registrations_mode: Kas gali užsiregistruoti registrations_mode: Kas gali užsiregistruoti

View File

@ -751,6 +751,7 @@ sv:
desc_html: Detta bygger på externa skript från hCaptcha vilket kan vara ett säkerhets- och integritetsproblem. Dessutom,<strong>kan detta göra registreringsprocessen betydligt mindre tillgänglig för vissa personer (särskilt funktionsnedsatta)</strong>. Av dessa skäl bör du överväga alternativa åtgärder såsom godkänningsbaserad eller inbjudningsbaserad registrering. desc_html: Detta bygger på externa skript från hCaptcha vilket kan vara ett säkerhets- och integritetsproblem. Dessutom,<strong>kan detta göra registreringsprocessen betydligt mindre tillgänglig för vissa personer (särskilt funktionsnedsatta)</strong>. Av dessa skäl bör du överväga alternativa åtgärder såsom godkänningsbaserad eller inbjudningsbaserad registrering.
title: Kräv att nya användare löser en CAPTCHA för att erkänna sitt konto title: Kräv att nya användare löser en CAPTCHA för att erkänna sitt konto
content_retention: content_retention:
danger_zone: Farozon
preamble: Kontrollera hur användargenererat innehåll lagras i Mastodon. preamble: Kontrollera hur användargenererat innehåll lagras i Mastodon.
title: Bibehållande av innehåll title: Bibehållande av innehåll
default_noindex: default_noindex:

View File

@ -1,4 +1,3 @@
version: '3'
services: services:
db: db:
restart: always restart: always

View File

@ -16,7 +16,7 @@ module Devise
if resource && !resource.otp_required_for_login? if resource && !resource.otp_required_for_login?
success!(resource) success!(resource)
else else
fail(:invalid) fail(:invalid) # rubocop:disable Style/SignalException -- method is from Warden::Strategies::Base
end end
end end

View File

@ -15,7 +15,7 @@ module Devise
if resource && !resource.otp_required_for_login? if resource && !resource.otp_required_for_login?
success!(resource) success!(resource)
else else
fail(:invalid) fail(:invalid) # rubocop:disable Style/SignalException -- method is from Warden::Strategies::Base
end end
end end

View File

@ -191,24 +191,24 @@ module Mastodon::CLI
def vacuum_and_analyze_statuses def vacuum_and_analyze_statuses
if options[:compress_database] if options[:compress_database]
say('Run VACUUM FULL ANALYZE to statuses...') say('Running "VACUUM FULL ANALYZE statuses"...')
ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE statuses') ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE statuses')
say('Run REINDEX to statuses...') say('Running "REINDEX TABLE statuses"...')
ActiveRecord::Base.connection.execute('REINDEX TABLE statuses') ActiveRecord::Base.connection.execute('REINDEX TABLE statuses')
else else
say('Run ANALYZE to statuses...') say('Running "ANALYZE statuses"...')
ActiveRecord::Base.connection.execute('ANALYZE statuses') ActiveRecord::Base.connection.execute('ANALYZE statuses')
end end
end end
def vacuum_and_analyze_conversations def vacuum_and_analyze_conversations
if options[:compress_database] if options[:compress_database]
say('Run VACUUM FULL ANALYZE to conversations...') say('Running "VACUUM FULL ANALYZE conversations"...')
ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE conversations') ActiveRecord::Base.connection.execute('VACUUM FULL ANALYZE conversations')
say('Run REINDEX to conversations...') say('Running "REINDEX TABLE conversations"...')
ActiveRecord::Base.connection.execute('REINDEX TABLE conversations') ActiveRecord::Base.connection.execute('REINDEX TABLE conversations')
else else
say('Run ANALYZE to conversations...') say('Running "ANALYZE conversations"...')
ActiveRecord::Base.connection.execute('ANALYZE conversations') ActiveRecord::Base.connection.execute('ANALYZE conversations')
end end
end end

View File

@ -79,7 +79,7 @@ RSpec.describe 'credentials API' do
end end
describe 'with invalid data' do describe 'with invalid data' do
let(:params) { { note: "This is too long. #{'a' * Account::MAX_NOTE_LENGTH}" } } let(:params) { { note: "This is too long. #{'a' * Account::NOTE_LENGTH_LIMIT}" } }
it 'returns http unprocessable entity' do it 'returns http unprocessable entity' do
subject subject

668
yarn.lock

File diff suppressed because it is too large Load Diff