about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/javascript/flavours/glitch/actions/announcements.js18
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/components/announcements.js20
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js4
-rw-r--r--app/javascript/flavours/glitch/features/home_timeline/index.js40
-rw-r--r--app/javascript/flavours/glitch/reducers/announcements.js28
-rw-r--r--app/javascript/flavours/glitch/styles/components/announcements.scss8
-rw-r--r--app/javascript/mastodon/actions/announcements.js18
-rw-r--r--app/javascript/mastodon/features/getting_started/components/announcements.js20
-rw-r--r--app/javascript/mastodon/features/getting_started/containers/announcements_container.js4
-rw-r--r--app/javascript/mastodon/features/home_timeline/index.js40
-rw-r--r--app/javascript/mastodon/locales/br.json38
-rw-r--r--app/javascript/mastodon/locales/ca.json14
-rw-r--r--app/javascript/mastodon/locales/co.json2
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json4
-rw-r--r--app/javascript/mastodon/locales/el.json2
-rw-r--r--app/javascript/mastodon/locales/es-AR.json2
-rw-r--r--app/javascript/mastodon/locales/es.json54
-rw-r--r--app/javascript/mastodon/locales/eu.json2
-rw-r--r--app/javascript/mastodon/locales/fa.json290
-rw-r--r--app/javascript/mastodon/locales/gl.json36
-rw-r--r--app/javascript/mastodon/locales/hu.json2
-rw-r--r--app/javascript/mastodon/locales/ja.json6
-rw-r--r--app/javascript/mastodon/locales/ko.json2
-rw-r--r--app/javascript/mastodon/locales/nn.json8
-rw-r--r--app/javascript/mastodon/locales/no.json8
-rw-r--r--app/javascript/mastodon/locales/ru.json2
-rw-r--r--app/javascript/mastodon/locales/sk.json2
-rw-r--r--app/javascript/mastodon/locales/th.json2
-rw-r--r--app/javascript/mastodon/locales/tr.json2
-rw-r--r--app/javascript/mastodon/locales/uk.json10
-rw-r--r--app/javascript/mastodon/reducers/announcements.js28
-rw-r--r--app/javascript/styles/mastodon/components.scss8
-rw-r--r--app/validators/reaction_validator.rb10
-rw-r--r--config/locales/ca.yml22
-rw-r--r--config/locales/co.yml30
-rw-r--r--config/locales/de.yml1
-rw-r--r--config/locales/devise.ca.yml4
-rw-r--r--config/locales/devise.es.yml20
-rw-r--r--config/locales/doorkeeper.uk.yml3
-rw-r--r--config/locales/el.yml26
-rw-r--r--config/locales/es-AR.yml22
-rw-r--r--config/locales/es.yml143
-rw-r--r--config/locales/eu.yml26
-rw-r--r--config/locales/hu.yml26
-rw-r--r--config/locales/ja.yml27
-rw-r--r--config/locales/kk.yml6
-rw-r--r--config/locales/ko.yml26
-rw-r--r--config/locales/nn.yml34
-rw-r--r--config/locales/no.yml56
-rw-r--r--config/locales/ru.yml23
-rw-r--r--config/locales/simple_form.ca.yml12
-rw-r--r--config/locales/simple_form.co.yml12
-rw-r--r--config/locales/simple_form.cs.yml4
-rw-r--r--config/locales/simple_form.el.yml12
-rw-r--r--config/locales/simple_form.es-AR.yml12
-rw-r--r--config/locales/simple_form.es.yml20
-rw-r--r--config/locales/simple_form.eu.yml12
-rw-r--r--config/locales/simple_form.gl.yml6
-rw-r--r--config/locales/simple_form.hu.yml12
-rw-r--r--config/locales/simple_form.id.yml6
-rw-r--r--config/locales/simple_form.ja.yml12
-rw-r--r--config/locales/simple_form.ko.yml12
-rw-r--r--config/locales/simple_form.nn.yml38
-rw-r--r--config/locales/simple_form.no.yml45
-rw-r--r--config/locales/simple_form.ru.yml12
-rw-r--r--config/locales/simple_form.th.yml2
-rw-r--r--config/locales/simple_form.tr.yml12
-rw-r--r--config/locales/simple_form.uk.yml12
-rw-r--r--config/locales/sk.yml8
-rw-r--r--config/locales/th.yml28
-rw-r--r--config/locales/tr.yml23
-rw-r--r--config/locales/uk.yml47
-rw-r--r--spec/validators/reaction_validator_spec.rb42
73 files changed, 1207 insertions, 423 deletions
diff --git a/app/javascript/flavours/glitch/actions/announcements.js b/app/javascript/flavours/glitch/actions/announcements.js
index d0e5ee176..b4e8cee2f 100644
--- a/app/javascript/flavours/glitch/actions/announcements.js
+++ b/app/javascript/flavours/glitch/actions/announcements.js
@@ -5,7 +5,6 @@ export const ANNOUNCEMENTS_FETCH_REQUEST = 'ANNOUNCEMENTS_FETCH_REQUEST';
 export const ANNOUNCEMENTS_FETCH_SUCCESS = 'ANNOUNCEMENTS_FETCH_SUCCESS';
 export const ANNOUNCEMENTS_FETCH_FAIL    = 'ANNOUNCEMENTS_FETCH_FAIL';
 export const ANNOUNCEMENTS_UPDATE        = 'ANNOUNCEMENTS_UPDATE';
-export const ANNOUNCEMENTS_DISMISS       = 'ANNOUNCEMENTS_DISMISS';
 
 export const ANNOUNCEMENTS_REACTION_ADD_REQUEST = 'ANNOUNCEMENTS_REACTION_ADD_REQUEST';
 export const ANNOUNCEMENTS_REACTION_ADD_SUCCESS = 'ANNOUNCEMENTS_REACTION_ADD_SUCCESS';
@@ -17,6 +16,8 @@ export const ANNOUNCEMENTS_REACTION_REMOVE_FAIL    = 'ANNOUNCEMENTS_REACTION_REM
 
 export const ANNOUNCEMENTS_REACTION_UPDATE = 'ANNOUNCEMENTS_REACTION_UPDATE';
 
+export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW';
+
 const noOp = () => {};
 
 export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => {
@@ -54,15 +55,6 @@ export const updateAnnouncements = announcement => ({
   announcement: normalizeAnnouncement(announcement),
 });
 
-export const dismissAnnouncement = announcementId => (dispatch, getState) => {
-  dispatch({
-    type: ANNOUNCEMENTS_DISMISS,
-    id: announcementId,
-  });
-
-  api(getState).post(`/api/v1/announcements/${announcementId}/dismiss`);
-};
-
 export const addReaction = (announcementId, name) => (dispatch, getState) => {
   dispatch(addReactionRequest(announcementId, name));
 
@@ -131,3 +123,9 @@ export const updateReaction = reaction => ({
   type: ANNOUNCEMENTS_REACTION_UPDATE,
   reaction,
 });
+
+export function toggleShowAnnouncements() {
+  return dispatch => {
+    dispatch({ type: ANNOUNCEMENTS_TOGGLE_SHOW });
+  };
+}
diff --git a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
index 71b54b060..9a7d175c4 100644
--- a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
+++ b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
@@ -277,19 +277,13 @@ class Announcement extends ImmutablePureComponent {
   static propTypes = {
     announcement: ImmutablePropTypes.map.isRequired,
     emojiMap: ImmutablePropTypes.map.isRequired,
-    dismissAnnouncement: PropTypes.func.isRequired,
     addReaction: PropTypes.func.isRequired,
     removeReaction: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
   };
 
-  handleDismissClick = () => {
-    const { dismissAnnouncement, announcement } = this.props;
-    dismissAnnouncement(announcement.get('id'));
-  }
-
   render () {
-    const { announcement, intl } = this.props;
+    const { announcement } = this.props;
     const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at'));
     const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));
     const now = new Date();
@@ -314,8 +308,6 @@ class Announcement extends ImmutablePureComponent {
           removeReaction={this.props.removeReaction}
           emojiMap={this.props.emojiMap}
         />
-
-        <IconButton title={intl.formatMessage(messages.close)} icon='times' className='announcements__item__dismiss-icon' onClick={this.handleDismissClick} />
       </div>
     );
   }
@@ -328,8 +320,6 @@ class Announcements extends ImmutablePureComponent {
   static propTypes = {
     announcements: ImmutablePropTypes.list,
     emojiMap: ImmutablePropTypes.map.isRequired,
-    fetchAnnouncements: PropTypes.func.isRequired,
-    dismissAnnouncement: PropTypes.func.isRequired,
     addReaction: PropTypes.func.isRequired,
     removeReaction: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
@@ -339,11 +329,6 @@ class Announcements extends ImmutablePureComponent {
     index: 0,
   };
 
-  componentDidMount () {
-    const { fetchAnnouncements } = this.props;
-    fetchAnnouncements();
-  }
-
   handleChangeIndex = index => {
     this.setState({ index: index % this.props.announcements.size });
   }
@@ -369,13 +354,12 @@ class Announcements extends ImmutablePureComponent {
         <img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />
 
         <div className='announcements__container'>
-          <ReactSwipeableViews index={index} onChangeIndex={this.handleChangeIndex}>
+          <ReactSwipeableViews animateHeight index={index} onChangeIndex={this.handleChangeIndex}>
             {announcements.map(announcement => (
               <Announcement
                 key={announcement.get('id')}
                 announcement={announcement}
                 emojiMap={this.props.emojiMap}
-                dismissAnnouncement={this.props.dismissAnnouncement}
                 addReaction={this.props.addReaction}
                 removeReaction={this.props.removeReaction}
                 intl={intl}
diff --git a/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js b/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
index b10d1d4ce..8fa695e34 100644
--- a/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
+++ b/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
@@ -1,5 +1,5 @@
 import { connect } from 'react-redux';
-import { fetchAnnouncements, dismissAnnouncement, addReaction, removeReaction } from 'mastodon/actions/announcements';
+import { addReaction, removeReaction } from 'flavours/glitch/actions/announcements';
 import Announcements from '../components/announcements';
 import { createSelector } from 'reselect';
 import { Map as ImmutableMap } from 'immutable';
@@ -12,8 +12,6 @@ const mapStateToProps = state => ({
 });
 
 const mapDispatchToProps = dispatch => ({
-  fetchAnnouncements: () => dispatch(fetchAnnouncements()),
-  dismissAnnouncement: id => dispatch(dismissAnnouncement(id)),
   addReaction: (id, name) => dispatch(addReaction(id, name)),
   removeReaction: (id, name) => dispatch(removeReaction(id, name)),
 });
diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.js b/app/javascript/flavours/glitch/features/home_timeline/index.js
index 263371b06..457ac051c 100644
--- a/app/javascript/flavours/glitch/features/home_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/home_timeline/index.js
@@ -9,15 +9,23 @@ import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/col
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
 import { Link } from 'react-router-dom';
+import { fetchAnnouncements, toggleShowAnnouncements } from 'flavours/glitch/actions/announcements';
 import AnnouncementsContainer from 'flavours/glitch/features/getting_started/containers/announcements_container';
+import classNames from 'classnames';
+import IconWithBadge from 'flavours/glitch/components/icon_with_badge';
 
 const messages = defineMessages({
   title: { id: 'column.home', defaultMessage: 'Home' },
+  show_announcements: { id: 'home.show_announcements', defaultMessage: 'Show announcements' },
+  hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' },
 });
 
 const mapStateToProps = state => ({
   hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,
   isPartial: state.getIn(['timelines', 'home', 'isPartial']),
+  hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(),
+  unreadAnnouncements: state.getIn(['announcements', 'unread']).size,
+  showAnnouncements: state.getIn(['announcements', 'show']),
 });
 
 export default @connect(mapStateToProps)
@@ -31,6 +39,9 @@ class HomeTimeline extends React.PureComponent {
     isPartial: PropTypes.bool,
     columnId: PropTypes.string,
     multiColumn: PropTypes.bool,
+    hasAnnouncements: PropTypes.bool,
+    unreadAnnouncements: PropTypes.number,
+    showAnnouncements: PropTypes.bool,
   };
 
   handlePin = () => {
@@ -61,6 +72,7 @@ class HomeTimeline extends React.PureComponent {
   }
 
   componentDidMount () {
+    this.props.dispatch(fetchAnnouncements());
     this._checkIfReloadNeeded(false, this.props.isPartial);
   }
 
@@ -93,10 +105,31 @@ class HomeTimeline extends React.PureComponent {
     }
   }
 
+  handleToggleAnnouncementsClick = (e) => {
+    e.stopPropagation();
+    this.props.dispatch(toggleShowAnnouncements());
+  }
+
   render () {
-    const { intl, hasUnread, columnId, multiColumn } = this.props;
+    const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props;
     const pinned = !!columnId;
 
+    let announcementsButton = null;
+
+    if (hasAnnouncements) {
+      announcementsButton = (
+        <button
+          className={classNames('column-header__button', { 'active': showAnnouncements })}
+          title={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-label={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-pressed={showAnnouncements ? 'true' : 'false'}
+          onClick={this.handleToggleAnnouncementsClick}
+        >
+          <IconWithBadge id='bullhorn' count={unreadAnnouncements} />
+        </button>
+      );
+    }
+
     return (
       <Column bindToDocument={!multiColumn} ref={this.setRef} name='home' label={intl.formatMessage(messages.title)}>
         <ColumnHeader
@@ -108,13 +141,14 @@ class HomeTimeline extends React.PureComponent {
           onClick={this.handleHeaderClick}
           pinned={pinned}
           multiColumn={multiColumn}
+          extraButton={announcementsButton}
         >
           <ColumnSettingsContainer />
         </ColumnHeader>
 
+        {hasAnnouncements && showAnnouncements && <AnnouncementsContainer />}
+
         <StatusListContainer
-          prepend={<AnnouncementsContainer />}
-          alwaysPrepend
           trackScroll={!pinned}
           scrollKey={`home_timeline-${columnId}`}
           onLoadMore={this.handleLoadMore}
diff --git a/app/javascript/flavours/glitch/reducers/announcements.js b/app/javascript/flavours/glitch/reducers/announcements.js
index aa674e516..1cfb598fb 100644
--- a/app/javascript/flavours/glitch/reducers/announcements.js
+++ b/app/javascript/flavours/glitch/reducers/announcements.js
@@ -3,18 +3,20 @@ import {
   ANNOUNCEMENTS_FETCH_SUCCESS,
   ANNOUNCEMENTS_FETCH_FAIL,
   ANNOUNCEMENTS_UPDATE,
-  ANNOUNCEMENTS_DISMISS,
   ANNOUNCEMENTS_REACTION_UPDATE,
   ANNOUNCEMENTS_REACTION_ADD_REQUEST,
   ANNOUNCEMENTS_REACTION_ADD_FAIL,
   ANNOUNCEMENTS_REACTION_REMOVE_REQUEST,
   ANNOUNCEMENTS_REACTION_REMOVE_FAIL,
+  ANNOUNCEMENTS_TOGGLE_SHOW,
 } from '../actions/announcements';
-import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+import { Map as ImmutableMap, List as ImmutableList, Set as ImmutableSet, fromJS } from 'immutable';
 
 const initialState = ImmutableMap({
   items: ImmutableList(),
   isLoading: false,
+  show: true,
+  unread: ImmutableSet(),
 });
 
 const updateReaction = (state, id, name, updater) => state.update('items', list => list.map(announcement => {
@@ -43,21 +45,35 @@ const addReaction = (state, id, name) => updateReaction(state, id, name, x => x.
 
 const removeReaction = (state, id, name) => updateReaction(state, id, name, x => x.set('me', false).update('count', y => y - 1));
 
+const addUnread = (state, items) => {
+  if (state.get('show')) return state;
+
+  const newIds = ImmutableSet(items.map(x => x.get('id')));
+  const oldIds = ImmutableSet(state.get('items').map(x => x.get('id')));
+  return state.update('unread', unread => unread.union(newIds.subtract(oldIds)));
+};
+
 export default function announcementsReducer(state = initialState, action) {
   switch(action.type) {
+  case ANNOUNCEMENTS_TOGGLE_SHOW:
+    return state.withMutations(map => {
+      if (!map.get('show')) map.set('unread', ImmutableSet());
+      map.set('show', !map.get('show'));
+    });
   case ANNOUNCEMENTS_FETCH_REQUEST:
     return state.set('isLoading', true);
   case ANNOUNCEMENTS_FETCH_SUCCESS:
     return state.withMutations(map => {
-      map.set('items', fromJS(action.announcements));
+      const items = fromJS(action.announcements);
+      map.set('unread', ImmutableSet());
+      addUnread(map, items);
+      map.set('items', items);
       map.set('isLoading', false);
     });
   case ANNOUNCEMENTS_FETCH_FAIL:
     return state.set('isLoading', false);
   case ANNOUNCEMENTS_UPDATE:
-    return state.update('items', list => list.unshift(fromJS(action.announcement)).sortBy(announcement => announcement.get('starts_at')));
-  case ANNOUNCEMENTS_DISMISS:
-    return state.update('items', list => list.filterNot(announcement => announcement.get('id') === action.id));
+    return addUnread(state, [fromJS(action.announcement)]).update('items', list => list.unshift(fromJS(action.announcement)).sortBy(announcement => announcement.get('starts_at')));
   case ANNOUNCEMENTS_REACTION_UPDATE:
     return updateReactionCount(state, action.reaction);
   case ANNOUNCEMENTS_REACTION_ADD_REQUEST:
diff --git a/app/javascript/flavours/glitch/styles/components/announcements.scss b/app/javascript/flavours/glitch/styles/components/announcements.scss
index 11d29931d..6bf9e2a0c 100644
--- a/app/javascript/flavours/glitch/styles/components/announcements.scss
+++ b/app/javascript/flavours/glitch/styles/components/announcements.scss
@@ -37,7 +37,7 @@
 }
 
 .announcements {
-  background: lighten($ui-base-color, 4%);
+  background: lighten($ui-base-color, 8%);
   border-top: 1px solid $ui-base-color;
   font-size: 13px;
   display: flex;
@@ -78,12 +78,6 @@
       font-weight: 500;
       margin-bottom: 10px;
     }
-
-    &__dismiss-icon {
-      position: absolute;
-      top: 12px;
-      right: 12px;
-    }
   }
 
   &__pagination {
diff --git a/app/javascript/mastodon/actions/announcements.js b/app/javascript/mastodon/actions/announcements.js
index c65bc052e..64bf5ef91 100644
--- a/app/javascript/mastodon/actions/announcements.js
+++ b/app/javascript/mastodon/actions/announcements.js
@@ -5,7 +5,6 @@ export const ANNOUNCEMENTS_FETCH_REQUEST = 'ANNOUNCEMENTS_FETCH_REQUEST';
 export const ANNOUNCEMENTS_FETCH_SUCCESS = 'ANNOUNCEMENTS_FETCH_SUCCESS';
 export const ANNOUNCEMENTS_FETCH_FAIL    = 'ANNOUNCEMENTS_FETCH_FAIL';
 export const ANNOUNCEMENTS_UPDATE        = 'ANNOUNCEMENTS_UPDATE';
-export const ANNOUNCEMENTS_DISMISS       = 'ANNOUNCEMENTS_DISMISS';
 
 export const ANNOUNCEMENTS_REACTION_ADD_REQUEST = 'ANNOUNCEMENTS_REACTION_ADD_REQUEST';
 export const ANNOUNCEMENTS_REACTION_ADD_SUCCESS = 'ANNOUNCEMENTS_REACTION_ADD_SUCCESS';
@@ -17,6 +16,8 @@ export const ANNOUNCEMENTS_REACTION_REMOVE_FAIL    = 'ANNOUNCEMENTS_REACTION_REM
 
 export const ANNOUNCEMENTS_REACTION_UPDATE = 'ANNOUNCEMENTS_REACTION_UPDATE';
 
+export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW';
+
 const noOp = () => {};
 
 export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => {
@@ -54,15 +55,6 @@ export const updateAnnouncements = announcement => ({
   announcement: normalizeAnnouncement(announcement),
 });
 
-export const dismissAnnouncement = announcementId => (dispatch, getState) => {
-  dispatch({
-    type: ANNOUNCEMENTS_DISMISS,
-    id: announcementId,
-  });
-
-  api(getState).post(`/api/v1/announcements/${announcementId}/dismiss`);
-};
-
 export const addReaction = (announcementId, name) => (dispatch, getState) => {
   dispatch(addReactionRequest(announcementId, name));
 
@@ -131,3 +123,9 @@ export const updateReaction = reaction => ({
   type: ANNOUNCEMENTS_REACTION_UPDATE,
   reaction,
 });
+
+export function toggleShowAnnouncements() {
+  return dispatch => {
+    dispatch({ type: ANNOUNCEMENTS_TOGGLE_SHOW });
+  };
+}
diff --git a/app/javascript/mastodon/features/getting_started/components/announcements.js b/app/javascript/mastodon/features/getting_started/components/announcements.js
index 975db0265..8ff1b0b4e 100644
--- a/app/javascript/mastodon/features/getting_started/components/announcements.js
+++ b/app/javascript/mastodon/features/getting_started/components/announcements.js
@@ -277,19 +277,13 @@ class Announcement extends ImmutablePureComponent {
   static propTypes = {
     announcement: ImmutablePropTypes.map.isRequired,
     emojiMap: ImmutablePropTypes.map.isRequired,
-    dismissAnnouncement: PropTypes.func.isRequired,
     addReaction: PropTypes.func.isRequired,
     removeReaction: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
   };
 
-  handleDismissClick = () => {
-    const { dismissAnnouncement, announcement } = this.props;
-    dismissAnnouncement(announcement.get('id'));
-  }
-
   render () {
-    const { announcement, intl } = this.props;
+    const { announcement } = this.props;
     const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at'));
     const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));
     const now = new Date();
@@ -314,8 +308,6 @@ class Announcement extends ImmutablePureComponent {
           removeReaction={this.props.removeReaction}
           emojiMap={this.props.emojiMap}
         />
-
-        <IconButton title={intl.formatMessage(messages.close)} icon='times' className='announcements__item__dismiss-icon' onClick={this.handleDismissClick} />
       </div>
     );
   }
@@ -328,8 +320,6 @@ class Announcements extends ImmutablePureComponent {
   static propTypes = {
     announcements: ImmutablePropTypes.list,
     emojiMap: ImmutablePropTypes.map.isRequired,
-    fetchAnnouncements: PropTypes.func.isRequired,
-    dismissAnnouncement: PropTypes.func.isRequired,
     addReaction: PropTypes.func.isRequired,
     removeReaction: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
@@ -339,11 +329,6 @@ class Announcements extends ImmutablePureComponent {
     index: 0,
   };
 
-  componentDidMount () {
-    const { fetchAnnouncements } = this.props;
-    fetchAnnouncements();
-  }
-
   handleChangeIndex = index => {
     this.setState({ index: index % this.props.announcements.size });
   }
@@ -369,13 +354,12 @@ class Announcements extends ImmutablePureComponent {
         <img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />
 
         <div className='announcements__container'>
-          <ReactSwipeableViews index={index} onChangeIndex={this.handleChangeIndex}>
+          <ReactSwipeableViews animateHeight index={index} onChangeIndex={this.handleChangeIndex}>
             {announcements.map(announcement => (
               <Announcement
                 key={announcement.get('id')}
                 announcement={announcement}
                 emojiMap={this.props.emojiMap}
-                dismissAnnouncement={this.props.dismissAnnouncement}
                 addReaction={this.props.addReaction}
                 removeReaction={this.props.removeReaction}
                 intl={intl}
diff --git a/app/javascript/mastodon/features/getting_started/containers/announcements_container.js b/app/javascript/mastodon/features/getting_started/containers/announcements_container.js
index b10d1d4ce..8c3fc2e6b 100644
--- a/app/javascript/mastodon/features/getting_started/containers/announcements_container.js
+++ b/app/javascript/mastodon/features/getting_started/containers/announcements_container.js
@@ -1,5 +1,5 @@
 import { connect } from 'react-redux';
-import { fetchAnnouncements, dismissAnnouncement, addReaction, removeReaction } from 'mastodon/actions/announcements';
+import { addReaction, removeReaction } from 'mastodon/actions/announcements';
 import Announcements from '../components/announcements';
 import { createSelector } from 'reselect';
 import { Map as ImmutableMap } from 'immutable';
@@ -12,8 +12,6 @@ const mapStateToProps = state => ({
 });
 
 const mapDispatchToProps = dispatch => ({
-  fetchAnnouncements: () => dispatch(fetchAnnouncements()),
-  dismissAnnouncement: id => dispatch(dismissAnnouncement(id)),
   addReaction: (id, name) => dispatch(addReaction(id, name)),
   removeReaction: (id, name) => dispatch(removeReaction(id, name)),
 });
diff --git a/app/javascript/mastodon/features/home_timeline/index.js b/app/javascript/mastodon/features/home_timeline/index.js
index b7f9d5095..c7de8c9cb 100644
--- a/app/javascript/mastodon/features/home_timeline/index.js
+++ b/app/javascript/mastodon/features/home_timeline/index.js
@@ -9,15 +9,23 @@ import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
 import { Link } from 'react-router-dom';
+import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements';
 import AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container';
+import classNames from 'classnames';
+import IconWithBadge from 'mastodon/components/icon_with_badge';
 
 const messages = defineMessages({
   title: { id: 'column.home', defaultMessage: 'Home' },
+  show_announcements: { id: 'home.show_announcements', defaultMessage: 'Show announcements' },
+  hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' },
 });
 
 const mapStateToProps = state => ({
   hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,
   isPartial: state.getIn(['timelines', 'home', 'isPartial']),
+  hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(),
+  unreadAnnouncements: state.getIn(['announcements', 'unread']).size,
+  showAnnouncements: state.getIn(['announcements', 'show']),
 });
 
 export default @connect(mapStateToProps)
@@ -32,6 +40,9 @@ class HomeTimeline extends React.PureComponent {
     isPartial: PropTypes.bool,
     columnId: PropTypes.string,
     multiColumn: PropTypes.bool,
+    hasAnnouncements: PropTypes.bool,
+    unreadAnnouncements: PropTypes.number,
+    showAnnouncements: PropTypes.bool,
   };
 
   handlePin = () => {
@@ -62,6 +73,7 @@ class HomeTimeline extends React.PureComponent {
   }
 
   componentDidMount () {
+    this.props.dispatch(fetchAnnouncements());
     this._checkIfReloadNeeded(false, this.props.isPartial);
   }
 
@@ -94,10 +106,31 @@ class HomeTimeline extends React.PureComponent {
     }
   }
 
+  handleToggleAnnouncementsClick = (e) => {
+    e.stopPropagation();
+    this.props.dispatch(toggleShowAnnouncements());
+  }
+
   render () {
-    const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props;
+    const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props;
     const pinned = !!columnId;
 
+    let announcementsButton = null;
+
+    if (hasAnnouncements) {
+      announcementsButton = (
+        <button
+          className={classNames('column-header__button', { 'active': showAnnouncements })}
+          title={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-label={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-pressed={showAnnouncements ? 'true' : 'false'}
+          onClick={this.handleToggleAnnouncementsClick}
+        >
+          <IconWithBadge id='bullhorn' count={unreadAnnouncements} />
+        </button>
+      );
+    }
+
     return (
       <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
         <ColumnHeader
@@ -109,13 +142,14 @@ class HomeTimeline extends React.PureComponent {
           onClick={this.handleHeaderClick}
           pinned={pinned}
           multiColumn={multiColumn}
+          extraButton={announcementsButton}
         >
           <ColumnSettingsContainer />
         </ColumnHeader>
 
+        {hasAnnouncements && showAnnouncements && <AnnouncementsContainer />}
+
         <StatusListContainer
-          prepend={<AnnouncementsContainer />}
-          alwaysPrepend
           trackScroll={!pinned}
           scrollKey={`home_timeline-${columnId}`}
           onLoadMore={this.handleLoadMore}
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 967577f2e..b6bf0eb8a 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -1,7 +1,7 @@
 {
   "account.add_or_remove_from_list": "Ouzhpenn pe lemel ag ar listennadoù",
   "account.badges.bot": "Robot",
-  "account.badges.group": "Group",
+  "account.badges.group": "Strollad",
   "account.block": "Stankañ @{name}",
   "account.block_domain": "Kuzh kement tra a {domain}",
   "account.blocked": "Stanket",
@@ -35,17 +35,17 @@
   "account.show_reblogs": "Diskouez toudoù a @{name}",
   "account.unblock": "Distankañ @{name}",
   "account.unblock_domain": "Diguzh {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Paouez da lakaat war-wel war ar profil",
   "account.unfollow": "Diheuliañ",
   "account.unmute": "Diguzhat @{name}",
   "account.unmute_notifications": "Diguzhat kemennoù a @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Klaskit en-dro a-benn {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
   "alert.unexpected.title": "C'hem !",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Kemenn",
   "autosuggest_hashtag.per_week": "{count} bep sizhun",
-  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "boost_modal.combo": "Ar wezh kentañ e c'halliot gwaskañ war {combo} evit tremen hebiou",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Klask endro",
   "bundle_column_error.title": "Fazi rouedad",
@@ -53,12 +53,12 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Klask endro",
   "column.blocks": "Implijour·ezed·ion stanket",
-  "column.bookmarks": "Bookmarks",
+  "column.bookmarks": "Sinedoù",
   "column.community": "Red-amzer lec'hel",
   "column.direct": "Kemennadoù prevez",
   "column.directory": "Mont a-dreuz ar profiloù",
   "column.domain_blocks": "Domani kuzhet",
-  "column.favourites": "Favourites",
+  "column.favourites": "Ar re vuiañ-karet",
   "column.follow_requests": "Pedadoù heuliañ",
   "column.home": "Degemer",
   "column.lists": "Listennoù",
@@ -93,28 +93,28 @@
   "compose_form.sensitive.marked": "Media is marked as sensitive",
   "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn",
   "compose_form.spoiler_placeholder": "Write your warning here",
-  "confirmation_modal.cancel": "Cancel",
+  "confirmation_modal.cancel": "Nullañ",
   "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.confirm": "Dilemel",
   "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.delete_list.confirm": "Dilemel",
+  "confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?",
+  "confirmations.domain_block.confirm": "Kuzhat an domani a-bezh",
   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
-  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.confirm": "Digevreañ",
   "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.confirm": "Kuzhat",
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.mute.message": "Ha sur oc'h e fell deoc'h kuzhaat {name} ?",
+  "confirmations.redraft.confirm": "Diverkañ ha skrivañ en-dro",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
-  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.confirm": "Respont",
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.confirm": "Diheuliañ",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 6516a4a80..65ec5750b 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -8,8 +8,8 @@
   "account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
   "account.direct": "Missatge directe @{name}",
   "account.domain_blocked": "Domini ocult",
-  "account.edit_profile": "Editar el perfil",
-  "account.endorse": "Recomanar en el teu perfil",
+  "account.edit_profile": "Edita el perfil",
+  "account.endorse": "Recomana en el teu perfil",
   "account.follow": "Segueix",
   "account.followers": "Seguidors",
   "account.followers.empty": "Encara ningú no segueix aquest usuari.",
@@ -29,13 +29,13 @@
   "account.never_active": "Mai",
   "account.posts": "Tuts",
   "account.posts_with_replies": "Tuts i respostes",
-  "account.report": "Informe @{name}",
+  "account.report": "Informar sobre @{name}",
   "account.requested": "Esperant aprovació. Clic per a cancel·lar la petició de seguiment",
   "account.share": "Comparteix el perfil de @{name}",
   "account.show_reblogs": "Mostra els impulsos de @{name}",
-  "account.unblock": "Desbloca @{name}",
+  "account.unblock": "Desbloqueja @{name}",
   "account.unblock_domain": "Mostra {domain}",
-  "account.unendorse": "No es mostren al perfil",
+  "account.unendorse": "No recomanar en el perfil",
   "account.unfollow": "Deixa de seguir",
   "account.unmute": "Treure silenci de @{name}",
   "account.unmute_notifications": "Activar notificacions de @{name}",
@@ -43,9 +43,9 @@
   "alert.rate_limited.title": "Límit de freqüència",
   "alert.unexpected.message": "S'ha produït un error inesperat.",
   "alert.unexpected.title": "Vaja!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Anunci",
   "autosuggest_hashtag.per_week": "{count} per setmana",
-  "boost_modal.combo": "Pots premer {combo} per saltar-te això el proper cop",
+  "boost_modal.combo": "Pots prémer {combo} per saltar-te això el proper cop",
   "bundle_column_error.body": "S'ha produït un error en carregar aquest component.",
   "bundle_column_error.retry": "Torna-ho a provar",
   "bundle_column_error.title": "Error de connexió",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 091a73c85..8f3c99f8a 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Ghjettu limitatu",
   "alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.",
   "alert.unexpected.title": "Uups!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Annunziu",
   "autosuggest_hashtag.per_week": "{count} per settimana",
   "boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta",
   "bundle_column_error.body": "C'hè statu un prublemu caricandu st'elementu.",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 8cd2bb8a3..d6f490fcf 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -2320,6 +2320,10 @@
         "id": "status.bookmark"
       },
       {
+        "defaultMessage": "More",
+        "id": "status.more"
+      },
+      {
         "defaultMessage": "Mute @{name}",
         "id": "status.mute"
       },
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index d9d2ef590..abb6f0d33 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Περιορισμός συχνότητας",
   "alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.",
   "alert.unexpected.title": "Εεπ!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Ανακοίνωση",
   "autosuggest_hashtag.per_week": "{count} ανα εβδομάδα",
   "boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις αυτό την επόμενη φορά",
   "bundle_column_error.body": "Κάτι πήγε στραβά ενώ φορτωνόταν αυτό το στοιχείο.",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 70bcef133..f83e5a251 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Tarifa limitada",
   "alert.unexpected.message": "Ocurrió un error.",
   "alert.unexpected.title": "¡Epa!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Anuncio",
   "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez",
   "bundle_column_error.body": "Algo salió mal al cargar este componente.",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 31f190616..93484b412 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -40,10 +40,10 @@
   "account.unmute": "Dejar de silenciar a @{name}",
   "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
   "alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Tasa limitada",
+  "alert.rate_limited.title": "Tarifa limitada",
   "alert.unexpected.message": "Hubo un error inesperado.",
   "alert.unexpected.title": "¡Ups!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Anuncio",
   "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
   "bundle_column_error.body": "Algo salió mal al cargar este componente.",
@@ -54,7 +54,7 @@
   "bundle_modal_error.retry": "Inténtalo de nuevo",
   "column.blocks": "Usuarios bloqueados",
   "column.bookmarks": "Marcadores",
-  "column.community": "Cronología local",
+  "column.community": "Línea de tiempo local",
   "column.direct": "Mensajes directos",
   "column.directory": "Buscar perfiles",
   "column.domain_blocks": "Dominios ocultados",
@@ -65,7 +65,7 @@
   "column.mutes": "Usuarios silenciados",
   "column.notifications": "Notificaciones",
   "column.pins": "Toots fijados",
-  "column.public": "Cronología federada",
+  "column.public": "Línea de tiempo federada",
   "column_back_button.label": "Atrás",
   "column_header.hide_settings": "Ocultar configuración",
   "column_header.moveLeft_settings": "Mover columna a la izquierda",
@@ -87,7 +87,7 @@
   "compose_form.poll.remove_option": "Eliminar esta opción",
   "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones",
   "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
-  "compose_form.publish": "Ipotxa",
+  "compose_form.publish": "Tootear",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marcar multimedia como sensible",
   "compose_form.sensitive.marked": "Material marcado como sensible",
@@ -104,7 +104,7 @@
   "confirmations.delete_list.confirm": "Eliminar",
   "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?",
   "confirmations.domain_block.confirm": "Ocultar dominio entero",
-  "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.\nNo podrás ver contenido de ese dominio en ninguna de las cronologías públicas o tus notificaciones. Tus seguidoras de ese dominio serán borradas.",
+  "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.",
   "confirmations.logout.confirm": "Cerrar sesión",
   "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?",
   "confirmations.mute.confirm": "Silenciar",
@@ -143,23 +143,23 @@
   "empty_column.account_timeline": "¡No hay toots aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
-  "empty_column.bookmarked_statuses": "Aún no tienes ninguna barritada guardada como marcador. Cuando guardes una, se mostrará aquí.",
-  "empty_column.community": "La cronología local está vacía. ¡Escribe algo para empezar la fiesta!",
+  "empty_column.bookmarked_statuses": "Aún no tienes ningún toot guardado como marcador. Cuando guardes uno, se mostrará aquí.",
+  "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
   "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.",
   "empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
   "empty_column.favourited_statuses": "Aún no tienes toots preferidos. Cuando marques uno como favorito, aparecerá aquí.",
   "empty_column.favourites": "Nadie ha marcado este toot como preferido. Cuando alguien lo haga, aparecerá aquí.",
   "empty_column.follow_requests": "No tienes ninguna petición de seguidor. Cuando recibas una, se mostrará aquí.",
-  "empty_column.hashtag": "No hay nada en esta etiqueta aún.",
+  "empty_column.hashtag": "No hay nada en este hashtag aún.",
   "empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.",
-  "empty_column.home.public_timeline": "la cronología pública",
+  "empty_column.home.public_timeline": "la línea de tiempo pública",
   "empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.",
   "empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.",
   "empty_column.mutes": "Aún no has silenciado a ningún usuario.",
   "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.",
   "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo",
   "error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador, esta página no se ha podido mostrar correctamente.",
-  "error.unexpected_crash.next_steps": "Intenta actualizar la página. Si eso no ayuda, es posible que puedas usar Mastodonte a través de otro navegador o aplicación nativa.",
+  "error.unexpected_crash.next_steps": "Intenta actualizar la página. Si eso no ayuda, es posible que puedas usar Mastodon a través de otro navegador o aplicación nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles",
   "errors.unexpected_crash.report_issue": "Informar de un problema/error",
   "follow_request.authorize": "Autorizar",
@@ -169,18 +169,18 @@
   "getting_started.documentation": "Documentación",
   "getting_started.heading": "Primeros pasos",
   "getting_started.invite": "Invitar usuarios",
-  "getting_started.open_source_notice": "Mastodonte es un Programa Libre y de Código Abierto - Plica/Foss -. Puedes contribuir o reportar errores en {github}.",
+  "getting_started.open_source_notice": "Mastodon es software libre. Puedes contribuir o reportar errores en {github}.",
   "getting_started.security": "Seguridad",
   "getting_started.terms": "Términos de servicio",
   "hashtag.column_header.tag_mode.all": "y {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
   "hashtag.column_header.tag_mode.none": "sin {additional}",
   "hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
-  "hashtag.column_settings.select.placeholder": "Introduzca etiquetas…",
-  "hashtag.column_settings.tag_mode.all": "Todos estos",
+  "hashtag.column_settings.select.placeholder": "Introduzca hashtags…",
+  "hashtag.column_settings.tag_mode.all": "Cualquiera de estos",
   "hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
   "hashtag.column_settings.tag_mode.none": "Ninguno de estos",
-  "hashtag.column_settings.tag_toggle": "Incluya etiquetas adicionales para esta columna",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Básico",
   "home.column_settings.show_reblogs": "Mostrar retoots",
   "home.column_settings.show_replies": "Mostrar respuestas",
@@ -193,7 +193,7 @@
   "introduction.federation.home.headline": "Inicio",
   "introduction.federation.home.text": "Los posts de personas que sigues aparecerán en tu cronología. ¡Puedes seguir a cualquiera en cualquier servidor!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Los mensajes públicos de personas en el mismo servidor que aparecerán en la cronología local.",
+  "introduction.federation.local.text": "Los posts públicos de personas en el mismo servidor que aparecerán en la cronología local.",
   "introduction.interactions.action": "¡Terminar tutorial!",
   "introduction.interactions.favourite.headline": "Favorito",
   "introduction.interactions.favourite.text": "Puedes guardar un toot para más tarde, y hacer saber al autor que te gustó, dándole a favorito.",
@@ -215,12 +215,12 @@
   "keyboard_shortcuts.enter": "abrir estado",
   "keyboard_shortcuts.favourite": "añadir a favoritos",
   "keyboard_shortcuts.favourites": "abrir la lista de favoritos",
-  "keyboard_shortcuts.federated": "abrir la cronología federada",
+  "keyboard_shortcuts.federated": "abrir el timeline federado",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "abrir la cronología propia",
+  "keyboard_shortcuts.home": "abrir el timeline propio",
   "keyboard_shortcuts.hotkey": "Tecla caliente",
   "keyboard_shortcuts.legend": "para mostrar esta leyenda",
-  "keyboard_shortcuts.local": "abrir la cronología local",
+  "keyboard_shortcuts.local": "abrir el timeline local",
   "keyboard_shortcuts.mention": "para mencionar al autor",
   "keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados",
   "keyboard_shortcuts.my_profile": "abrir tu perfil",
@@ -259,7 +259,7 @@
   "navigation_bar.apps": "Aplicaciones móviles",
   "navigation_bar.blocks": "Usuarios bloqueados",
   "navigation_bar.bookmarks": "Marcadores",
-  "navigation_bar.community_timeline": "Cronología local",
+  "navigation_bar.community_timeline": "Historia local",
   "navigation_bar.compose": "Escribir un nuevo toot",
   "navigation_bar.direct": "Mensajes directos",
   "navigation_bar.discover": "Descubrir",
@@ -277,7 +277,7 @@
   "navigation_bar.personal": "Personal",
   "navigation_bar.pins": "Toots fijados",
   "navigation_bar.preferences": "Preferencias",
-  "navigation_bar.public_timeline": "Cronología federada",
+  "navigation_bar.public_timeline": "Historia federada",
   "navigation_bar.security": "Seguridad",
   "notification.favourite": "{name} marcó tu estado como favorito",
   "notification.follow": "{name} te empezó a seguir",
@@ -321,9 +321,9 @@
   "privacy.direct.short": "Directo",
   "privacy.private.long": "Sólo mostrar a seguidores",
   "privacy.private.short": "Privado",
-  "privacy.public.long": "Mostrar en la cronología federada",
+  "privacy.public.long": "Mostrar en la historia federada",
   "privacy.public.short": "Público",
-  "privacy.unlisted.long": "No mostrar en la cronología federada",
+  "privacy.unlisted.long": "No mostrar en la historia federada",
   "privacy.unlisted.short": "No listado",
   "refresh": "Actualizar",
   "regeneration_indicator.label": "Cargando…",
@@ -345,12 +345,12 @@
   "search_popout.tips.full_text": "Búsquedas de texto recuperan posts que has escrito, marcado como favoritos, retooteado o en los que has sido mencionado, así como usuarios, nombres y hashtags.",
   "search_popout.tips.hashtag": "etiqueta",
   "search_popout.tips.status": "estado",
-  "search_popout.tips.text": "El texto simple devuelve correspondencias de nombre, persona usuaria y etiqueta",
+  "search_popout.tips.text": "El texto simple devuelve correspondencias de nombre, usuario y hashtag",
   "search_popout.tips.user": "usuario",
   "search_results.accounts": "Gente",
   "search_results.hashtags": "Etiquetas",
   "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Buscar bramidos por su contenido no está disponible en este servidor de Mastodonte.",
+  "search_results.statuses_fts_disabled": "Buscar toots por su contenido no está disponible en este servidor de Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "status.admin_account": "Abrir interfaz de moderación para @{name}",
   "status.admin_status": "Abrir este estado en la interfaz de moderación",
@@ -396,7 +396,7 @@
   "status.unpin": "Dejar de fijar",
   "suggestions.dismiss": "Descartar sugerencia",
   "suggestions.header": "Es posible que te interese…",
-  "tabs_bar.federated_timeline": "Federada",
+  "tabs_bar.federated_timeline": "Federado",
   "tabs_bar.home": "Inicio",
   "tabs_bar.local_timeline": "Local",
   "tabs_bar.notifications": "Notificaciones",
@@ -408,7 +408,7 @@
   "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando",
   "trends.trending_now": "Tendencia ahora",
-  "ui.beforeunload": "Tu borrador se perderá si sales de Mastodonte.",
+  "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.",
   "upload_area.title": "Arrastra y suelta para subir",
   "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Límite de subida de archivos excedido.",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index e9fbcedac..c89cb151f 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Abiadura mugatua",
   "alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
   "alert.unexpected.title": "Ene!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Iragarpena",
   "autosuggest_hashtag.per_week": "{count} asteko",
   "boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko",
   "bundle_column_error.body": "Zerbait okerra gertatu da osagai hau kargatzean.",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index c2a8eb0de..3bb2f0ee8 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -1,48 +1,48 @@
 {
-  "account.add_or_remove_from_list": "افزودن یا برداشتن از فهرست",
+  "account.add_or_remove_from_list": "افزودن یا برداشتن از فهرست‌ها",
   "account.badges.bot": "ربات",
   "account.badges.group": "گروه",
   "account.block": "مسدودسازی @{name}",
-  "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}",
+  "account.block_domain": "نهفتن همه چیز از {domain}",
   "account.blocked": "مسدود",
   "account.cancel_follow_request": "لغو درخواست پیگیری",
   "account.direct": "پیام خصوصی به @{name}",
-  "account.domain_blocked": "دامنه نهفته",
+  "account.domain_blocked": "دامنهٔ نهفته",
   "account.edit_profile": "ویرایش نمایه",
   "account.endorse": "معرّفی در نمایه",
-  "account.follow": "پیگیری",
+  "account.follow": "پی بگیرید",
   "account.followers": "پی‌گیران",
   "account.followers.empty": "هنوز کسی پیگیر این کاربر نیست.",
   "account.follows": "پی می‌گیرد",
   "account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
-  "account.follows_you": "پیگیرتان",
-  "account.hide_reblogs": "نهفتن تقویت‌های @{name}",
+  "account.follows_you": "پیگیر شماست",
+  "account.hide_reblogs": "نهفتن بازبوق‌های @{name}",
   "account.last_status": "آخرین فعالیت",
   "account.link_verified_on": "مالکیت این پیوند در {date} بررسی شد",
   "account.locked_info": "این حساب خصوصی است. صاحبش تصمیم می‌گیرد که چه کسی بتواند پیگیرش باشد.",
   "account.media": "رسانه",
-  "account.mention": "اشاره به @{name}",
+  "account.mention": "نام‌بردن از @{name}",
   "account.moved_to": "{name} منتقل شده به:",
   "account.mute": "خموشی @{name}",
-  "account.mute_notifications": "خموشی آگاهی‌ها از @{name}",
+  "account.mute_notifications": "خموشی اعلان‌ها از @{name}",
   "account.muted": "خموش",
   "account.never_active": "هرگز",
-  "account.posts": "بوق‌ها",
-  "account.posts_with_replies": "بوق‌ها و پاسخ‌ها",
+  "account.posts": "نوشته‌ها",
+  "account.posts_with_replies": "نوشته‌ها و پاسخ‌ها",
   "account.report": "گزارش @{name}",
-  "account.requested": "منتظر پذیرش. کلیک برای لغو درخواست پی‌گیری",
+  "account.requested": "منتظر پذیرش. برای لغو درخواست پی‌گیری کلیک کنید",
   "account.share": "هم‌رسانی نمایهٔ @{name}",
-  "account.show_reblogs": "نمایش تقویت‌های @{name}",
+  "account.show_reblogs": "نمایش بازبوق‌های @{name}",
   "account.unblock": "رفع انسداد @{name}",
   "account.unblock_domain": "رفع نهفتن {domain}",
   "account.unendorse": "معرّفی نکردن در نمایه",
-  "account.unfollow": "ناپی‌گیری",
+  "account.unfollow": "پایان پیگیری",
   "account.unmute": "رفع خموشی @{name}",
-  "account.unmute_notifications": "رفع خموشی آگاهی‌ها از @{name}",
+  "account.unmute_notifications": "رفع خموشی اعلان‌ها از @{name}",
   "alert.rate_limited.message": "لطفاً پس از {retry_time, time, medium} دوباره بیازمایید.",
-  "alert.rate_limited.title": "محدود شده",
+  "alert.rate_limited.title": "محدودیت تعداد",
   "alert.unexpected.message": "خطایی غیرمنتظره رخ داد.",
-  "alert.unexpected.title": "وای!",
+  "alert.unexpected.title": "ای وای!",
   "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} در هفته",
   "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
@@ -50,37 +50,37 @@
   "bundle_column_error.retry": "تلاش دوباره",
   "bundle_column_error.title": "خطای شبکه",
   "bundle_modal_error.close": "بستن",
-  "bundle_modal_error.message": "هنگام بار کردن این بخش خطایی رخ داد.",
+  "bundle_modal_error.message": "هنگام بازکردن این بخش خطایی رخ داد.",
   "bundle_modal_error.retry": "تلاش دوباره",
   "column.blocks": "کاربران مسدود",
   "column.bookmarks": "نشانک‌ها",
-  "column.community": "خط زمانی محلّی",
+  "column.community": "نوشته‌های محلی",
   "column.direct": "پیام‌های خصوصی",
   "column.directory": "مرور نمایه‌ها",
   "column.domain_blocks": "دامنه‌های نهفته",
-  "column.favourites": "برگزیده‌ها",
+  "column.favourites": "پسندیده‌ها",
   "column.follow_requests": "درخواست‌های پیگیری",
   "column.home": "خانه",
   "column.lists": "فهرست‌ها",
   "column.mutes": "کاربران خموش",
-  "column.notifications": "آگاهی‌ها",
-  "column.pins": "بوق‌های سنجاق‌شده",
-  "column.public": "خط‌زمانی عمومی",
+  "column.notifications": "اعلان‌ها",
+  "column.pins": "بوق‌های ثابت",
+  "column.public": "نوشته‌های همه‌جا",
   "column_back_button.label": "بازگشت",
   "column_header.hide_settings": "نهفتن تنظیمات",
   "column_header.moveLeft_settings": "انتقال ستون به راست",
   "column_header.moveRight_settings": "انتقال ستون به چپ",
-  "column_header.pin": "سنجاق",
+  "column_header.pin": "ثابت‌کردن",
   "column_header.show_settings": "نمایش تنظیمات",
-  "column_header.unpin": "برداشتن سنجاق",
+  "column_header.unpin": "رهاکردن",
   "column_subheading.settings": "تنظیمات",
   "community.column_settings.media_only": "فقط رسانه",
-  "compose_form.direct_message_warning": "این بوق تنها به کاربران اشاره‌شده فرستاده خواهد شد.",
-  "compose_form.direct_message_warning_learn_more": "بیش‌تر بدانید",
+  "compose_form.direct_message_warning": "این بوق تنها به کاربرانی که از آن‌ها نام برده شده فرستاده خواهد شد.",
+  "compose_form.direct_message_warning_learn_more": "بیشتر بدانید",
   "compose_form.hashtag_warning": "از آن‌جا که این بوق فهرست‌نشده است، در نتایج جست‌وجوی هشتگ‌ها پیدا نخواهد شد. تنها بوق‌های عمومی را می‌توان با جست‌وجوی هشتگ یافت.",
   "compose_form.lock_disclaimer": "حسابتان {locked} نیست. هر کسی می‌تواند پیگیرتان شده و فرسته‌های ویژهٔ پیگیرانتان را ببیند.",
   "compose_form.lock_disclaimer.lock": "قفل",
-  "compose_form.placeholder": "چی تو سرته؟",
+  "compose_form.placeholder": "تازه چه خبر؟",
   "compose_form.poll.add_option": "افزودن گزینه",
   "compose_form.poll.duration": "مدت نظرسنجی",
   "compose_form.poll.option_placeholder": "گزینهٔ {number}",
@@ -89,81 +89,81 @@
   "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای",
   "compose_form.publish": "بوق",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "علامت‌گذاری رسانه به عنوان حساس",
+  "compose_form.sensitive.hide": "علامت‌گذاری به عنوان حساس",
   "compose_form.sensitive.marked": "رسانه به عنوان حساس علامت‌گذاری شده",
   "compose_form.sensitive.unmarked": "رسانه به عنوان حساس علامت‌گذاری نشده",
   "compose_form.spoiler.marked": "نوشته پشت هشدار پنهان است",
   "compose_form.spoiler.unmarked": "نوشته پنهان نیست",
   "compose_form.spoiler_placeholder": "هشدارتان را این‌جا بنویسید",
-  "confirmation_modal.cancel": "لغو",
-  "confirmations.block.block_and_report": "انسداد و گزارش",
-  "confirmations.block.confirm": "انسداد",
+  "confirmation_modal.cancel": "بی‌خیال",
+  "confirmations.block.block_and_report": "مسدودسازی و گزارش",
+  "confirmations.block.confirm": "مسدود کن",
   "confirmations.block.message": "مطمئنید که می‌خواهید {name} را مسدود کنید؟",
-  "confirmations.delete.confirm": "حذف",
-  "confirmations.delete.message": "مطمئنید می‌خواهید این وضعیت را حذف کنید؟",
-  "confirmations.delete_list.confirm": "حذف",
+  "confirmations.delete.confirm": "پاک کن",
+  "confirmations.delete.message": "آیا مطمئنید که می‌خواهید این بوق را پاک کنید؟",
+  "confirmations.delete_list.confirm": "پاک کن",
   "confirmations.delete_list.message": "مطمئنید می‌خواهید این فهرست را برای همیشه پاک کنید؟",
   "confirmations.domain_block.confirm": "نهفتن تمام دامنه",
-  "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیش‌تر موارد انسداد یا خموش کردن چند حساب خاص کافی بوده و توصیه می‌شود. پس از این کار شما هیچ نوشته‌ای را از این دامنه در خط‌زمانی‌های عمومی یا آگاهی‌هایتان نخواهید دید. پیگیرانتان از این دامنه هم برداشته خواهند شد.",
+  "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدودسازی یا خموشیدن چند حساب خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ نوشته‌ای را از این دامنه در فهرست نوشته‌های عمومی یا اعلان‌هایتان نخواهید دید. پیگیرانتان از این دامنه هم حذف خواهند شد.",
   "confirmations.logout.confirm": "خروج",
   "confirmations.logout.message": "مطمئنید می‌خواهید خارج شوید؟",
   "confirmations.mute.confirm": "خموشی",
-  "confirmations.mute.explanation": "این کار فرسته‌هایشان و فرسته‌هایی که به آنان اشاره می‌کند را پنهان می‌کند، ولی همچنان اجازه دارند فرسته‌هایتان را دیده و دنبالتان کنند.",
-  "confirmations.mute.message": "مطمئنید می‌خواهید {name} را خموش کنید؟",
-  "confirmations.redraft.confirm": "حذف و بازنویسی",
-  "confirmations.redraft.message": "مطمئنید می‌خواهید این وضعیت را حذف کرده و از نو بنویسید؟ با این کار تقویت‌ها و برگزیدن‌هایش از دست رفته و پاسخ‌ها به فرستهٔ اصلی یتیم می‌شوند.",
+  "confirmations.mute.explanation": "این کار فرسته‌های آن‌ها و فرسته‌هایی را که از آن‌ها نام برده پنهان می‌کند، ولی آن‌ها همچنان اجازه دارند فرسته‌های شما را ببینند و شما را پی بگیرند.",
+  "confirmations.mute.message": "مطمئنید می‌خواهید {name} را بخموشید؟",
+  "confirmations.redraft.confirm": "پاک‌کردن و بازنویسی",
+  "confirmations.redraft.message": "مطمئنید که می‌خواهید این بوق را پاک کنید و از نو بنویسید؟ با این کار بازبوق‌ها و پسندهای آن از دست می‌رود و پاسخ‌ها به آن بی‌مرجع می‌شود.",
   "confirmations.reply.confirm": "پاسخ",
-  "confirmations.reply.message": "اگر الان پاسخ دهید، پیامی که در حال نوشتنش بودید پاک خواهد شد. می‌خواهید ادامه دهید؟",
-  "confirmations.unfollow.confirm": "ناپی‌گیری",
-  "confirmations.unfollow.message": "مطمئنید می‌خواهید پیگیری {name} را پایان دهید؟",
-  "conversation.delete": "حذف گفت‌وگو",
+  "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. می‌خواهید ادامه دهید؟",
+  "confirmations.unfollow.confirm": "پایان پیگیری",
+  "confirmations.unfollow.message": "مطمئنید که می‌خواهید به پیگیری از {name} پایان دهید؟",
+  "conversation.delete": "حذف گفتگو",
   "conversation.mark_as_read": "علامت‌گذاری به عنوان خوانده شده",
-  "conversation.open": "دیدن گفت‌وگو",
+  "conversation.open": "دیدن گفتگو",
   "conversation.with": "با {names}",
   "directory.federated": "از کارسازهای شناخته‌شده",
-  "directory.local": "فقط از {domain}",
+  "directory.local": "تنها از {domain}",
   "directory.new_arrivals": "تازه‌واردان",
   "directory.recently_active": "کاربران فعال اخیر",
-  "embed.instructions": "با رونوشت از کد زیر، این وضعیت را روی پایگاهتان جاگذاری کنید.",
+  "embed.instructions": "برای جاگذاری این بوق در سایت خودتان، کد زیر را کپی کنید.",
   "embed.preview": "این گونه دیده خواهد شد:",
   "emoji_button.activity": "فعالیت",
   "emoji_button.custom": "سفارشی",
   "emoji_button.flags": "پرچم‌ها",
   "emoji_button.food": "غذا و نوشیدنی",
-  "emoji_button.label": "درج اموجی",
+  "emoji_button.label": "افزودن شکلک",
   "emoji_button.nature": "طبیعت",
-  "emoji_button.not_found": "اموجی‌ای وجود ندارد!! ‪ (╯°□°)╯︵ ┻━┻‬",
+  "emoji_button.not_found": "این‌جا شکلکی نیست!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "اشیا",
   "emoji_button.people": "مردم",
   "emoji_button.recent": "پراستفاده",
-  "emoji_button.search": "جست‌وجو…",
-  "emoji_button.search_results": "نتایج جست‌وجو",
+  "emoji_button.search": "جستجو...",
+  "emoji_button.search_results": "نتایج جستجو",
   "emoji_button.symbols": "نمادها",
   "emoji_button.travel": "سفر و مکان",
   "empty_column.account_timeline": "هیچ بوقی این‌جا نیست!",
   "empty_column.account_unavailable": "نمایهٔ ناموجود",
   "empty_column.blocks": "هنوز کسی را مسدود نکرده‌اید.",
   "empty_column.bookmarked_statuses": "هنوز هیچ بوق نشان‌شده‌ای ندارید. وقتی بوقی را نشان‌کنید، این‌جا دیده خواهد شد.",
-  "empty_column.community": "خط‌زمانی محلّی خالی است. چیزی به صورت عمومی نوشته تا چرخش بچرخد!",
-  "empty_column.direct": "هنوز هیچ پیغام مستقیمی ندارید. هروقت چنین پیغامی بگیرید یا بفرستید این‌جا نمایش خواهد یافت.",
+  "empty_column.community": "فهرست نوشته‌های محلی خالی است. چیزی بنویسید تا چرخش بچرخد!",
+  "empty_column.direct": "هنوز هیچ پیام مستقیمی ندارید. هروقت چنین پیامی بگیرید یا بفرستید این‌جا نمایش خواهد یافت.",
   "empty_column.domain_blocks": "هنوز هیچ دامنه‌ای پنهان نشده است.",
-  "empty_column.favourited_statuses": "هنوز هیچ بوق برگزیده‌ای ندارید. وقتی بوقی را برگزینید، این‌جا دیده خواهد شد.",
-  "empty_column.favourites": "هنوز کسی این بوق را برنگزیده. وقتی کسی این کار را بکند، این‌جا دیده خواهد شد.",
-  "empty_column.follow_requests": "هنوز هیچ درخواست پیگیری‌ای ندارید. وقتی چنین درخواستی بگیرید، این‌جا دیده خواهد شد.",
+  "empty_column.favourited_statuses": "شما هنوز هیچ بوقی را نپسندیده‌اید. وقتی بوقی را بپسندید، این‌جا نمایش خواهد یافت.",
+  "empty_column.favourites": "هنوز هیچ کسی این بوق را نپسندیده است. وقتی کسی آن را بپسندد، نامش این‌جا نمایش خواهد یافت.",
+  "empty_column.follow_requests": "شما هنوز هیچ درخواست پیگیری‌ای ندارید. وقتی چنین درخواستی بگیرید، این‌جا نمایش خواهد یافت.",
   "empty_column.hashtag": "هنوز هیچ چیزی در این برچسب نیست.",
-  "empty_column.home": "خط‌زمانی خانگیتان خالیست! برای شروع و دیدن دیگر کاربران، از جست‌وجو استفاده کرده یا {public} را ببینید.",
-  "empty_column.home.public_timeline": "خط‌زمانی عمومی",
-  "empty_column.list": "هنوز چیزی در این فهرست وجود ندارد. هنگامی که اعضای این فهرست وضعیت جدیدی بفرستند، این‌جا ظاهر خواهد شد.",
+  "empty_column.home": "فهرست خانگی شما خالی است! {public} را ببینید یا چیزی را جستجو کنید تا کاربران دیگر را ببینید.",
+  "empty_column.home.public_timeline": "فهرست نوشته‌های همه‌جا",
+  "empty_column.list": "در این فهرست هنوز چیزی نیست. وقتی اعضای این فهرست چیزی بفرستند، این‌جا ظاهر خواهد شد.",
   "empty_column.lists": "هنوز هیچ فهرستی ندارید. هنگامی که فهرستی بسازید، این‌جا دیده خواهد شد.",
   "empty_column.mutes": "هنوز هیچ کاربری را خموش نکرده‌اید.",
-  "empty_column.notifications": "هنوز هیچ آگاهی‌ای ندارید. به دیگران واکنش نشان داده تا گفت‌وگو آغاز شود.",
-  "empty_column.public": "هیچ‌چیز این‌جا نیست! پرای پر کردنش چیزی به صورت عمومی نوشته یا کاربران دیگر کارسازها را پی بگیرید",
-  "error.unexpected_crash.explanation": "به خاطر مشکلی در کدمان یا یک ناسازگاری مرورگر، این صفحه نتوانست به درستی نمایش یابد.",
-  "error.unexpected_crash.next_steps": "تازه‌سازی صفحه را بیازمایید. اگر کمکی نکرد، شاید بتوانید از طریق مرورگری دیگر یا کارهٔ بومی از ماستودون استفاده کنید.",
+  "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به دیگران واکنش نشان دهید تا گفتگو آغاز شود.",
+  "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران کارسازهای دیگر را پی بگیرید تا این‌جا پر شود",
+  "error.unexpected_crash.explanation": "به خاطر اشکالی در کدهای ما یا ناسازگاری با مرورگر شما، این صفحه به درستی نمایش نیافت.",
+  "error.unexpected_crash.next_steps": "لطفاً صفحه را دوباره باز کنید. اگر کمکی نکرد، شاید همچنان بتوانید با ماستدون از راه یک مرورگر دیگر یا با یکی از اپ‌های آن کار کنید.",
   "errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
   "errors.unexpected_crash.report_issue": "گزارش مشکل",
-  "follow_request.authorize": "اجازه دادن",
-  "follow_request.reject": "رد کردن",
+  "follow_request.authorize": "اجازه دهید",
+  "follow_request.reject": "رد کنید",
   "getting_started.developers": "توسعه‌دهندگان",
   "getting_started.directory": "فهرست گزیدهٔ کاربران",
   "getting_started.documentation": "مستندات",
@@ -182,65 +182,65 @@
   "hashtag.column_settings.tag_mode.none": "هیچ‌کدام از این‌ها",
   "hashtag.column_settings.tag_toggle": "افزودن برچسب‌هایی بیشتر به این ستون",
   "home.column_settings.basic": "پایه‌ای",
-  "home.column_settings.show_reblogs": "نمایش تقویت‌ها",
+  "home.column_settings.show_reblogs": "نمایش بازبوق‌ها",
   "home.column_settings.show_replies": "نمایش پاسخ‌ها",
   "intervals.full.days": "{number, plural, one {# روز} other {# روز}}",
   "intervals.full.hours": "{number, plural, one {# ساعت} other {# ساعت}}",
   "intervals.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}}",
   "introduction.federation.action": "بعدی",
   "introduction.federation.federated.headline": "همگانی",
-  "introduction.federation.federated.text": "نوشته‌های عمومی دیگر کارسازها در خط‌زمانی همگانی طاهر خواهند شد.",
+  "introduction.federation.federated.text": "نوشته‌های عمومی کارسازهای دیگر در این فهرست نمایش می‌یابند.",
   "introduction.federation.home.headline": "خانه",
-  "introduction.federation.home.text": "فرسته‌ها از افرادی که دنبالشان می‌کنید در خوراک خانه‌تان ظاهر خواهند شد. می‌توانید هر کسی را روی هر کارسازی پی‌بگیرید!",
+  "introduction.federation.home.text": "فرسته‌های کسانی که شما آن‌ها را پی می‌گیرید این‌جا نمایش می‌یابند. شما می‌توانید هر کسی را روی هر کارسازی پی بگیرید!",
   "introduction.federation.local.headline": "محلّی",
-  "introduction.federation.local.text": "نوشته‌های عمومی افرادی که روی همان کارساز خودتان هستند در خط زمانی محلّی ظاهر خواهند شد.",
+  "introduction.federation.local.text": "فرسته‌های عمومی کسانی که روی کارساز شما هستند در فهرست نوشته‌های محلی نمایش می‌یابند.",
   "introduction.interactions.action": "پایان خودآموز!",
-  "introduction.interactions.favourite.headline": "برگزیدن",
-  "introduction.interactions.favourite.text": "می‌توانید بوقی را برای بعد ذخیره کنید و با برگزیدنش، بگذارید نویسنده بداند که پسندیدیش.",
-  "introduction.interactions.reblog.headline": "تقویت",
-  "introduction.interactions.reblog.text": "با تقویت بوق‌های دیگران، می‌توانید آن‌ها را با پی‌گیرانتان هم‌رسانی کنید.",
+  "introduction.interactions.favourite.headline": "پسندیدن",
+  "introduction.interactions.favourite.text": "با پسندیدن یک بوق، شما آن را برای آینده ذخیره می‌کنید و به نویسنده می‌گویید که از بوقش خوشتان آمده.",
+  "introduction.interactions.reblog.headline": "بازبوقیدن",
+  "introduction.interactions.reblog.text": "اگر بخواهید نوشته‌ای را با پیگیران خودتان به اشتراک بگذارید، آن را بازمی‌بوقید.",
   "introduction.interactions.reply.headline": "پاسخ",
-  "introduction.interactions.reply.text": "می‌توانید به بوق‌های خودتان و دیگران پاسخ دهید، تا در یک گفت‌وگو به هم زنجیر شوند.",
+  "introduction.interactions.reply.text": "می‌توانید به بوق‌های خودتان و دیگران پاسخ دهید، تا در یک گفتگو به هم زنجیر شوند.",
   "introduction.welcome.action": "بزن بریم!",
   "introduction.welcome.headline": "نخستین گام‌ها",
   "introduction.welcome.text": "به دنیای شبکه‌های اجتماعی غیرمتمرکز خوش آمدید! به زودی می‌توانید نوشته‌هایتان را منتشر کرده و با دوستانتان روی دامنهٔ وسیعی از کارسازها حرف بزنید. ولی این کارساز، {domain}، با بقیه فرق دارد، چرا که میزبان نمایهٔ شماست، پس نامش را به خاطر بسپارید.",
   "keyboard_shortcuts.back": "برای بازگشت",
   "keyboard_shortcuts.blocked": "برای گشودن فهرست کاربران خموش",
-  "keyboard_shortcuts.boost": "برای تقویت",
-  "keyboard_shortcuts.column": "برای تمرکز روی وضعیتی در یکی از ستون‌ها",
+  "keyboard_shortcuts.boost": "برای بازبوقیدن",
+  "keyboard_shortcuts.column": "برای تمرکز روی یک بوق در یکی از ستون‌ها",
   "keyboard_shortcuts.compose": "برای تمرکز روی محیط نوشتن",
   "keyboard_shortcuts.description": "توضیح",
-  "keyboard_shortcuts.direct": "برای گشودن ستون پیام‌های خصوصی",
+  "keyboard_shortcuts.direct": "برای گشودن ستون پیغام‌های مستقیم",
   "keyboard_shortcuts.down": "برای پایین رفتن در فهرست",
-  "keyboard_shortcuts.enter": "برای گشودن وضعیت",
-  "keyboard_shortcuts.favourite": "برای برگزیدن",
-  "keyboard_shortcuts.favourites": "برای گشودن فهرست برگزیده‌ها",
-  "keyboard_shortcuts.federated": "برای گشودن خط‌زمانی همگانی",
+  "keyboard_shortcuts.enter": "برای گشودن نوشته",
+  "keyboard_shortcuts.favourite": "برای پسندیدن",
+  "keyboard_shortcuts.favourites": "برای گشودن فهرست پسندیده‌ها",
+  "keyboard_shortcuts.federated": "برای گشودن فهرست نوشته‌های همه‌جا",
   "keyboard_shortcuts.heading": "میان‌برهای صفحه‌کلید",
-  "keyboard_shortcuts.home": "برای گشودن خط‌زمانی خانه",
+  "keyboard_shortcuts.home": "برای گشودن ستون اصلی پیگیری‌ها",
   "keyboard_shortcuts.hotkey": "میان‌بر",
   "keyboard_shortcuts.legend": "برای نمایش این راهنما",
-  "keyboard_shortcuts.local": "برای گشودن خط‌زمانی محلّی",
-  "keyboard_shortcuts.mention": "برای اشاره به نویسنده",
+  "keyboard_shortcuts.local": "برای گشودن فهرست نوشته‌های محلی",
+  "keyboard_shortcuts.mention": "برای نام‌بردن از نویسنده",
   "keyboard_shortcuts.muted": "برای گشودن فهرست کاربران خموش",
   "keyboard_shortcuts.my_profile": "برای گشودن نمایه‌تان",
-  "keyboard_shortcuts.notifications": "برای گشودن ستون آگاهی‌ها",
+  "keyboard_shortcuts.notifications": "برای گشودن ستون اعلان‌ها",
   "keyboard_shortcuts.open_media": "برای باز کردن رسانه",
-  "keyboard_shortcuts.pinned": "برای گشودن فهرست بوق‌های سنجاق‌شده",
+  "keyboard_shortcuts.pinned": "برای گشودن فهرست بوق‌های ثابت",
   "keyboard_shortcuts.profile": "برای گشودن نمایهٔ نویسنده",
   "keyboard_shortcuts.reply": "برای پاسخ",
   "keyboard_shortcuts.requests": "برای گشودن فهرست درخواست‌های پیگیری",
-  "keyboard_shortcuts.search": "برای تمرکز روی جست‌وجو",
+  "keyboard_shortcuts.search": "برای تمرکز روی جستجو",
   "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.next": "بعدی",
-  "lightbox.previous": "پیشین",
-  "lightbox.view_context": "نمایش متن",
+  "lightbox.previous": "قبلی",
+  "lightbox.view_context": "نمایش گفتگو",
   "lists.account.add": "افزودن به فهرست",
   "lists.account.remove": "برداشتن از فهرست",
   "lists.delete": "حذف فهرست",
@@ -248,100 +248,100 @@
   "lists.edit.submit": "تغییر عنوان",
   "lists.new.create": "افزودن فهرست",
   "lists.new.title_placeholder": "عنوان فهرست تازه",
-  "lists.search": "جست‌وجو بین افرادی که پی می‌گیرید",
-  "lists.subheading": "فهرست‌هایتان",
+  "lists.search": "بین کسانی که پی می‌گیرید بگردید",
+  "lists.subheading": "فهرست‌های شما",
   "load_pending": "{count, plural, one {# مورد تازه} other {# مورد تازه}}",
-  "loading_indicator.label": "در حال بار کردن…",
-  "media_gallery.toggle_visible": "تغییر وضعیت نمایانی",
+  "loading_indicator.label": "بارگیری...",
+  "media_gallery.toggle_visible": "تغییر پیدایی",
   "missing_indicator.label": "پیدا نشد",
   "missing_indicator.sublabel": "این منبع پیدا نشد",
-  "mute_modal.hide_notifications": "نهفتن آگاهی‌ها از این کاربر؟",
-  "navigation_bar.apps": "کاره‌های همراه",
-  "navigation_bar.blocks": "کاربران مسدود",
+  "mute_modal.hide_notifications": "اعلان‌های این کاربر پنهان شود؟",
+  "navigation_bar.apps": "اپ‌های موبایل",
+  "navigation_bar.blocks": "کاربران مسدودشده",
   "navigation_bar.bookmarks": "نشانک‌ها",
-  "navigation_bar.community_timeline": "خط‌زمانی محلّی",
+  "navigation_bar.community_timeline": "نوشته‌های محلی",
   "navigation_bar.compose": "نوشتن بوق تازه",
-  "navigation_bar.direct": "پیام‌های خصوصی",
-  "navigation_bar.discover": "کشف",
+  "navigation_bar.direct": "پیام‌های مستقیم",
+  "navigation_bar.discover": "گشت و گذار",
   "navigation_bar.domain_blocks": "دامنه‌های نهفته",
   "navigation_bar.edit_profile": "ویرایش نمایه",
-  "navigation_bar.favourites": "برگزیده‌ها",
+  "navigation_bar.favourites": "پسندیده‌ها",
   "navigation_bar.filters": "واژگان خموش",
   "navigation_bar.follow_requests": "درخواست‌های پیگیری",
-  "navigation_bar.follows_and_followers": "پی‌گیری‌ها و پی‌گیران",
+  "navigation_bar.follows_and_followers": "پیگیری‌ها و پیگیران",
   "navigation_bar.info": "دربارهٔ این کارساز",
   "navigation_bar.keyboard_shortcuts": "میان‌برها",
   "navigation_bar.lists": "فهرست‌ها",
   "navigation_bar.logout": "خروج",
-  "navigation_bar.mutes": "کاربران خموش",
+  "navigation_bar.mutes": "کاربران خموشیده",
   "navigation_bar.personal": "شخصی",
-  "navigation_bar.pins": "بوق‌های سنجاق‌شده",
+  "navigation_bar.pins": "بوق‌های ثابت",
   "navigation_bar.preferences": "ترجیحات",
-  "navigation_bar.public_timeline": "خط‌زمانی همگانی",
+  "navigation_bar.public_timeline": "نوشته‌های همه‌جا",
   "navigation_bar.security": "امنیت",
-  "notification.favourite": "‫{name}‬ وضعیتتان را برگزید",
-  "notification.follow": "‫{name}‬ پی‌گیرتان شد",
-  "notification.follow_request": "{name} درخواست پی‌گیریتان را داده است",
-  "notification.mention": "‫{name}‬ به شما اشاره کرد",
-  "notification.own_poll": "نظرسنجیتان پایان یافت",
-  "notification.poll": "نظرسنجی‌ای که در آن رأی دادید پایان یافته است",
-  "notification.reblog": "‫{name}‬ وضعیتتان را تقویت کرد",
-  "notifications.clear": "پاک‌سازی آگاهی‌ها",
-  "notifications.clear_confirmation": "مطمئنید می‌خواهید تمام آگاهی‌هایتان را برای همیشه پاک کنید؟",
-  "notifications.column_settings.alert": "آگاهی‌های میزکار",
-  "notifications.column_settings.favourite": "برگزیده‌ها:",
-  "notifications.column_settings.filter_bar.advanced": "نمایش تمام دسته‌ها",
+  "notification.favourite": "‫{name}‬ نوشتهٔ شما را پسندید",
+  "notification.follow": "‫{name}‬ پیگیرتان شد",
+  "notification.follow_request": "{name} می‌خواهد پیگیر شما باشد",
+  "notification.mention": "‫{name}‬ از شما نام برد",
+  "notification.own_poll": "نظرسنجی شما به پایان رسید",
+  "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است",
+  "notification.reblog": "‫{name}‬ نوشتهٔ شما را بازبوقید",
+  "notifications.clear": "پاک‌کردن اعلان‌ها",
+  "notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ اعلان‌هایتان را برای همیشه پاک کنید؟",
+  "notifications.column_settings.alert": "اعلان‌های میزکار",
+  "notifications.column_settings.favourite": "پسندیده‌ها:",
+  "notifications.column_settings.filter_bar.advanced": "نمایش همهٔ دسته‌ها",
   "notifications.column_settings.filter_bar.category": "نوار پالایش سریع",
   "notifications.column_settings.filter_bar.show": "نمایش",
-  "notifications.column_settings.follow": "پی‌گیران تازه:",
+  "notifications.column_settings.follow": "پیگیران تازه:",
   "notifications.column_settings.follow_request": "درخواست‌های جدید پی‌گیری:",
-  "notifications.column_settings.mention": "اشاره‌ها:",
+  "notifications.column_settings.mention": "نام‌بردن‌ها:",
   "notifications.column_settings.poll": "نتایج نظرسنجی:",
-  "notifications.column_settings.push": "ارسال آگاهی‌ها",
-  "notifications.column_settings.reblog": "تقویت‌ها:",
+  "notifications.column_settings.push": "اعلان‌ها از سمت سرور",
+  "notifications.column_settings.reblog": "بازبوق‌ها:",
   "notifications.column_settings.show": "نمایش در ستون",
   "notifications.column_settings.sound": "پخش صدا",
   "notifications.filter.all": "همه",
-  "notifications.filter.boosts": "تقویت‌ها",
-  "notifications.filter.favourites": "برگزیده‌ها",
-  "notifications.filter.follows": "پی‌گیری‌ها",
-  "notifications.filter.mentions": "اشاره‌ها",
+  "notifications.filter.boosts": "بازبوق‌ها",
+  "notifications.filter.favourites": "پسندها",
+  "notifications.filter.follows": "پیگیری‌ها",
+  "notifications.filter.mentions": "نام‌بردن‌ها",
   "notifications.filter.polls": "نتایج نظرسنجی",
-  "notifications.group": "{count} آگاهی",
-  "poll.closed": "بسته‌شده",
-  "poll.refresh": "نوسازی",
+  "notifications.group": "{count} اعلان",
+  "poll.closed": "پایان‌یافته",
+  "poll.refresh": "به‌روزرسانی",
   "poll.total_people": "{count, plural, one {# نفر} other {# نفر}}",
   "poll.total_votes": "{count, plural, one {# رأی} other {# رأی}}",
   "poll.vote": "رأی",
-  "poll.voted": "به این پاسخ رأی دادید",
+  "poll.voted": "شما به این گزینه رأی دادید",
   "poll_button.add_poll": "افزودن نظرسنجی",
-  "poll_button.remove_poll": "برداشتن نظرسنجی",
-  "privacy.change": "تنظیم محرمانگی وضعیت‌ها",
-  "privacy.direct.long": "ارسال فقط به کاربران اشاره‌شده",
+  "poll_button.remove_poll": "حذف نظرسنجی",
+  "privacy.change": "تنظیم محرمانگی نوشته",
+  "privacy.direct.long": "تنها به کاربران نام‌برده‌شده نشان بده",
   "privacy.direct.short": "خصوصی",
-  "privacy.private.long": "ارسال فقط به پی‌گیران",
-  "privacy.private.short": "فقط پی‌گیران",
-  "privacy.public.long": "ارسال به خط‌زمانی عمومی",
+  "privacy.private.long": "تنها به پیگیران نشان بده",
+  "privacy.private.short": "خصوصی",
+  "privacy.public.long": "نمایش در فهرست عمومی",
   "privacy.public.short": "عمومی",
-  "privacy.unlisted.long": "ارسال نکردن به خط‌زمانی عمومی",
+  "privacy.unlisted.long": "عمومی، ولی فهرست نکن",
   "privacy.unlisted.short": "فهرست‌نشده",
-  "refresh": "نوسازی",
-  "regeneration_indicator.label": "در حال بار کردن…",
-  "regeneration_indicator.sublabel": "خوراک خانه‌تان در حال آماده شدن است!",
+  "refresh": "به‌روزرسانی",
+  "regeneration_indicator.label": "در حال باز شدن…",
+  "regeneration_indicator.sublabel": "این فهرست دارد آماده می‌شود!",
   "relative_time.days": "{number} روز",
   "relative_time.hours": "{number} ساعت",
-  "relative_time.just_now": "اکنون",
+  "relative_time.just_now": "الان",
   "relative_time.minutes": "{number} دقیقه",
   "relative_time.seconds": "{number} ثانیه",
   "reply_indicator.cancel": "لغو",
-  "report.forward": "هدایت به {target}",
-  "report.forward_hint": "این حساب از کارسازی دیگر است. رونوشتی ناشناس از گزارش به آن‌جا نیز فرستاده شود؟",
-  "report.hint": "این گزارش به مدیران کارسازتان فرستاده خواهد شد. می‌توانید دلیلی بر چرایی گزارش این حساب را در ادامه بنویسید:",
+  "report.forward": "فرستادن به {target}",
+  "report.forward_hint": "این حساب در کارساز دیگری ثبت شده. آیا می‌خواهید رونوشتی ناشناس از این گزارش به آن‌جا هم فرستاده شود؟",
+  "report.hint": "این گزارش به مدیران کارسازتان فرستاده خواهد شد. می‌توانید دلیل گزارش این حساب را در ادامه بنویسید:",
   "report.placeholder": "توضیح اضافه",
-  "report.submit": "ثبت",
+  "report.submit": "بفرست",
   "report.target": "در حال گزارش {target}",
-  "search.placeholder": "جست‌وجو",
-  "search_popout.search_format": "قالب جست‌وجوی پیشرفته",
+  "search.placeholder": "جستجو",
+  "search_popout.search_format": "راهنمای جستجوی پیشرفته",
   "search_popout.tips.full_text": "جست‌وجوی متنی ساده وضعیت‌هایی که که نوشته، برگزیده، تقویت‌کرده یا در آن‌ها اشاره‌شده‌اید را به اضافهٔ نام‌های کاربری، نام‌های نمایشی و برچسب‌های مطابق برمی‌گرداند.",
   "search_popout.tips.hashtag": "برچسب",
   "search_popout.tips.status": "وضعیت",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index b2715cc4b..81ba22987 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -77,17 +77,17 @@
   "community.column_settings.media_only": "Só multimedia",
   "compose_form.direct_message_warning": "Este toot só será enviado ás usuarias mencionadas.",
   "compose_form.direct_message_warning_learn_more": "Coñecer máis",
-  "compose_form.hashtag_warning": "Este toot non se amosará baixo cancelos (hashtags) porque non é público. Só os toots públicos poden ser procurados por cancelos.",
-  "compose_form.lock_disclaimer": "A túa conta non está {locked}. Todos poden seguirche para ollar os teus toots só para seguidores.",
-  "compose_form.lock_disclaimer.lock": "bloqueado",
-  "compose_form.placeholder": "En que estás a pensar?",
+  "compose_form.hashtag_warning": "Este toot non aparecerá baixo ningún cancelo (hashtag) porque non está listado. Só se poden procurar toots públicos por cancelos.",
+  "compose_form.lock_disclaimer": "A túa conta non está {locked}. Todas poden seguirte para ollar os teus toots só para seguidoras.",
+  "compose_form.lock_disclaimer.lock": "bloqueada",
+  "compose_form.placeholder": "Qué contas?",
   "compose_form.poll.add_option": "Engadir unha opción",
   "compose_form.poll.duration": "Duración da enquisa",
   "compose_form.poll.option_placeholder": "Opción {number}",
   "compose_form.poll.remove_option": "Eliminar esta opción",
   "compose_form.poll.switch_to_multiple": "Mudar a enquisa para permitir múltiples escollas",
   "compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa escolla",
-  "compose_form.publish": "Tootear",
+  "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marcar coma contido multimedia sensíbel",
   "compose_form.sensitive.marked": "Contido multimedia marcado coma sensíbel",
@@ -104,16 +104,16 @@
   "confirmations.delete_list.confirm": "Eliminar",
   "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?",
   "confirmations.domain_block.confirm": "Agochar dominio enteiro",
-  "confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. Os teus seguidores deste dominio serán eliminados.",
+  "confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.",
   "confirmations.logout.confirm": "Pechar sesión",
   "confirmations.logout.message": "Desexas pechar a sesión?",
-  "confirmations.mute.confirm": "Silenciar",
-  "confirmations.mute.explanation": "Isto agochará as publicacións deles ou nas que os mencionen, mais permitirá que vexan as túas publicacións e sexan os teus seguidores.",
-  "confirmations.mute.message": "Tes a certeza de querer silenciar a {name}?",
+  "confirmations.mute.confirm": "Acalar",
+  "confirmations.mute.explanation": "Isto agochará as publicacións delas ou nas que as mencionen, mais permitirá que vexan as túas publicacións e sexan seguidoras túas.",
+  "confirmations.mute.message": "Tes a certeza de querer acalar a {name}?",
   "confirmations.redraft.confirm": "Eliminar e reescribir",
   "confirmations.redraft.message": "Tes a certeza de querer eliminar este estado e reescribilo? Perderás os compartidos e favoritos, e as respostas á publicación orixinal ficarán orfas.",
   "confirmations.reply.confirm": "Responder",
-  "confirmations.reply.message": "Respostar agora sobrescribirá a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
+  "confirmations.reply.message": "Responder agora sobrescribirá a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
   "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?",
   "conversation.delete": "Eliminar conversa",
@@ -122,10 +122,10 @@
   "conversation.with": "Con {names}",
   "directory.federated": "Do fediverso coñecido",
   "directory.local": "Só de {domain}",
-  "directory.new_arrivals": "Recén chegados",
-  "directory.recently_active": "Activos recentemente",
+  "directory.new_arrivals": "Recén chegadas",
+  "directory.recently_active": "Activas recentemente",
   "embed.instructions": "Engade este estado ó teu sitio web copiando o seguinte código.",
-  "embed.preview": "Así será amosado:",
+  "embed.preview": "Así será mostrado:",
   "emoji_button.activity": "Actividade",
   "emoji_button.custom": "Personalizado",
   "emoji_button.flags": "Bandeiras",
@@ -199,8 +199,8 @@
   "introduction.interactions.favourite.text": "Podes gardar un toot para depois e facer saber ó autor que che gostou marcandoo coma favorito.",
   "introduction.interactions.reblog.headline": "Promover",
   "introduction.interactions.reblog.text": "Podes compartir os toots doutras persoas coas túas seguidoras.",
-  "introduction.interactions.reply.headline": "Respostar",
-  "introduction.interactions.reply.text": "Podes respostar ós toots doutras persoas e ós teus propios, así ficarán encadeados nunha conversa.",
+  "introduction.interactions.reply.headline": "Responder",
+  "introduction.interactions.reply.text": "Podes responder ós toots doutras persoas e ós teus propios, así ficarán encadeados nunha conversa.",
   "introduction.welcome.action": "Imos!",
   "introduction.welcome.headline": "Primeiros pasos",
   "introduction.welcome.text": "Benvido ó fediverso! Nun intre poderás difundir mensaxes e falar coas túas amizades nun grande número de servidores. Mais este servidor, {domain}, é especial—hospeda o teu perfil, por iso lémbrate do seu nome.",
@@ -228,7 +228,7 @@
   "keyboard_shortcuts.open_media": "para abrir o contido multimedia",
   "keyboard_shortcuts.pinned": "para abrir a listaxe dos toots fixados",
   "keyboard_shortcuts.profile": "para abrir o perfil do autor",
-  "keyboard_shortcuts.reply": "para respostar",
+  "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "para abrir a listaxe das peticións de seguimento",
   "keyboard_shortcuts.search": "para destacar a procura",
   "keyboard_shortcuts.start": "para abrir a columna dos \"primeiros pasos\"",
@@ -381,8 +381,8 @@
   "status.reblogs.empty": "Aínda ninguén promoveu este toot. Cando alguén o faga, amosarase aquí.",
   "status.redraft": "Eliminar e reescribir",
   "status.remove_bookmark": "Eliminar marcador",
-  "status.reply": "Respostar",
-  "status.replyAll": "Respostar ó fío",
+  "status.reply": "Responder",
+  "status.replyAll": "Responder ó fío",
   "status.report": "Denunciar @{name}",
   "status.sensitive_warning": "Contido sensíbel",
   "status.share": "Compartir",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index f4280e740..e8dc573fa 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Forgalomkorlátozás",
   "alert.unexpected.message": "Váratlan hiba történt.",
   "alert.unexpected.title": "Hoppá!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Közlemény",
   "autosuggest_hashtag.per_week": "{count}/hét",
   "boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}",
   "bundle_column_error.body": "Hiba történt a komponens betöltése közben.",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 51eeb1eb6..67cee9276 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "制限に達しました",
   "alert.unexpected.message": "不明なエラーが発生しました。",
   "alert.unexpected.title": "エラー!",
-  "announcement.announcement": "告知",
+  "announcement.announcement": "お知らせ",
   "autosuggest_hashtag.per_week": "{count} 回 / 週",
   "boost_modal.combo": "次からは{combo}を押せばスキップできます",
   "bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。",
@@ -89,8 +89,8 @@
   "compose_form.poll.duration": "アンケート期間",
   "compose_form.poll.option_placeholder": "項目 {number}",
   "compose_form.poll.remove_option": "この項目を削除",
-  "compose_form.poll.switch_to_multiple": "複数選択用に変更",
-  "compose_form.poll.switch_to_single": "単一選択用に変更",
+  "compose_form.poll.switch_to_multiple": "複数選択に変更",
+  "compose_form.poll.switch_to_single": "単一選択に変更",
   "compose_form.publish": "トゥート",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "メディアを閲覧注意にする",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index f7be26c09..5a3b409c0 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "빈도 제한",
   "alert.unexpected.message": "예측하지 못한 에러가 발생했습니다.",
   "alert.unexpected.title": "앗!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "공지사항",
   "autosuggest_hashtag.per_week": "주간 {count}회",
   "boost_modal.combo": "{combo}를 누르면 다음부터 이 과정을 건너뛸 수 있습니다",
   "bundle_column_error.body": "컴포넌트를 불러오는 과정에서 문제가 발생했습니다.",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index d69717292..c04b30e04 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -1,7 +1,7 @@
 {
   "account.add_or_remove_from_list": "Legg til eller tak vekk frå listene",
   "account.badges.bot": "Robot",
-  "account.badges.group": "Group",
+  "account.badges.group": "Gruppe",
   "account.block": "Blokker @{name}",
   "account.block_domain": "Skjul alt frå {domain}",
   "account.blocked": "Blokkert",
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Begrensa rate",
   "alert.unexpected.message": "Eit uventa problem oppstod.",
   "alert.unexpected.title": "Oi sann!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Kunngjøring",
   "autosuggest_hashtag.per_week": "{count} per veke",
   "boost_modal.combo": "Du kan trykkja {combo} for å hoppa over dette neste gong",
   "bundle_column_error.body": "Noko gjekk gale mens denne komponenten vart lasta ned.",
@@ -85,8 +85,8 @@
   "compose_form.poll.duration": "Varigskap for røysting",
   "compose_form.poll.option_placeholder": "Val {number}",
   "compose_form.poll.remove_option": "Ta vekk dette valet",
-  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg",
+  "compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg",
   "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Merk medium som sensitivt",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index c6dc4ca0e..215cdb150 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -1,7 +1,7 @@
 {
   "account.add_or_remove_from_list": "Legg til eller fjern fra lister",
   "account.badges.bot": "Bot",
-  "account.badges.group": "Group",
+  "account.badges.group": "Gruppe",
   "account.block": "Blokkér @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blokkert",
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Hastighetsbegrenset",
   "alert.unexpected.message": "En uventet feil oppstod.",
   "alert.unexpected.title": "Oops!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Kunngjøring",
   "autosuggest_hashtag.per_week": "{count} per uke",
   "boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang",
   "bundle_column_error.body": "Noe gikk galt mens denne komponenten lastet.",
@@ -85,8 +85,8 @@
   "compose_form.poll.duration": "Avstemningens varighet",
   "compose_form.poll.option_placeholder": "Valg {number}",
   "compose_form.poll.remove_option": "Fjern dette valget",
-  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg",
+  "compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg",
   "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Merk media som sensitivt",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 1681da968..6e63a418c 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Вы выполняете действие слишком часто",
   "alert.unexpected.message": "Что-то пошло не так.",
   "alert.unexpected.title": "Ой!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Объявление",
   "autosuggest_hashtag.per_week": "{count} / неделю",
   "boost_modal.combo": "{combo}, чтобы пропустить это в следующий раз",
   "bundle_column_error.body": "Что-то пошло не так при загрузке этого компонента.",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 2410daf06..976dc572e 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Tempo obmedzené",
   "alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
   "alert.unexpected.title": "Ups!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Oboznámenie",
   "autosuggest_hashtag.per_week": "{count} týždenne",
   "boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie",
   "bundle_column_error.body": "Pri načítaní tohto prvku nastala nejaká chyba.",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 8a72783a2..2d009b851 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "มีการจำกัดอัตรา",
   "alert.unexpected.message": "เกิดข้อผิดพลาดที่ไม่คาดคิด",
   "alert.unexpected.title": "อุปส์!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "ประกาศ",
   "autosuggest_hashtag.per_week": "{count} ต่อสัปดาห์",
   "boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป",
   "bundle_column_error.body": "มีบางอย่างผิดพลาดขณะโหลดส่วนประกอบนี้",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 3ade92977..11f9ff2ef 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Oran sınırlıdır",
   "alert.unexpected.message": "Beklenmedik bir hata oluştu.",
   "alert.unexpected.title": "Hay aksi!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Duyuru",
   "autosuggest_hashtag.per_week": "Haftada {count}",
   "boost_modal.combo": "Bir daha ki sefere {combo} tuşuna basabilirsiniz",
   "bundle_column_error.body": "Bu bileşen yüklenirken bir şeyler ters gitti.",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 3dc69d6d6..061fc50cb 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -1,7 +1,7 @@
 {
   "account.add_or_remove_from_list": "Додати або видалити зі списків",
   "account.badges.bot": "Бот",
-  "account.badges.group": "Group",
+  "account.badges.group": "Група",
   "account.block": "Заблокувати @{name}",
   "account.block_domain": "Заглушити {domain}",
   "account.blocked": "Заблоковані",
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Швидкість обмежена",
   "alert.unexpected.message": "Трапилась неочікувана помилка.",
   "alert.unexpected.title": "Ой!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Оголошення",
   "autosuggest_hashtag.per_week": "{count} в тиждень",
   "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
   "bundle_column_error.body": "Щось пішло не так під час завантаження компоненту.",
@@ -85,8 +85,8 @@
   "compose_form.poll.duration": "Тривалість опитування",
   "compose_form.poll.option_placeholder": "Варіант {number}",
   "compose_form.poll.remove_option": "Видалити цей варіант",
-  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.poll.switch_to_multiple": "Перемкнути у режим вибору декількох відповідей",
+  "compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
   "compose_form.publish": "Дмухнути",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Позначити медіа як дражливе",
@@ -225,7 +225,7 @@
   "keyboard_shortcuts.muted": "відкрити список заглушених користувачів",
   "keyboard_shortcuts.my_profile": "відкрити ваш профіль",
   "keyboard_shortcuts.notifications": "відкрити колонку сповіщень",
-  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.open_media": "відкрити медіа",
   "keyboard_shortcuts.pinned": "відкрити список закріплених дмухів",
   "keyboard_shortcuts.profile": "відкрити профіль автора",
   "keyboard_shortcuts.reply": "відповісти",
diff --git a/app/javascript/mastodon/reducers/announcements.js b/app/javascript/mastodon/reducers/announcements.js
index aa674e516..1cfb598fb 100644
--- a/app/javascript/mastodon/reducers/announcements.js
+++ b/app/javascript/mastodon/reducers/announcements.js
@@ -3,18 +3,20 @@ import {
   ANNOUNCEMENTS_FETCH_SUCCESS,
   ANNOUNCEMENTS_FETCH_FAIL,
   ANNOUNCEMENTS_UPDATE,
-  ANNOUNCEMENTS_DISMISS,
   ANNOUNCEMENTS_REACTION_UPDATE,
   ANNOUNCEMENTS_REACTION_ADD_REQUEST,
   ANNOUNCEMENTS_REACTION_ADD_FAIL,
   ANNOUNCEMENTS_REACTION_REMOVE_REQUEST,
   ANNOUNCEMENTS_REACTION_REMOVE_FAIL,
+  ANNOUNCEMENTS_TOGGLE_SHOW,
 } from '../actions/announcements';
-import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+import { Map as ImmutableMap, List as ImmutableList, Set as ImmutableSet, fromJS } from 'immutable';
 
 const initialState = ImmutableMap({
   items: ImmutableList(),
   isLoading: false,
+  show: true,
+  unread: ImmutableSet(),
 });
 
 const updateReaction = (state, id, name, updater) => state.update('items', list => list.map(announcement => {
@@ -43,21 +45,35 @@ const addReaction = (state, id, name) => updateReaction(state, id, name, x => x.
 
 const removeReaction = (state, id, name) => updateReaction(state, id, name, x => x.set('me', false).update('count', y => y - 1));
 
+const addUnread = (state, items) => {
+  if (state.get('show')) return state;
+
+  const newIds = ImmutableSet(items.map(x => x.get('id')));
+  const oldIds = ImmutableSet(state.get('items').map(x => x.get('id')));
+  return state.update('unread', unread => unread.union(newIds.subtract(oldIds)));
+};
+
 export default function announcementsReducer(state = initialState, action) {
   switch(action.type) {
+  case ANNOUNCEMENTS_TOGGLE_SHOW:
+    return state.withMutations(map => {
+      if (!map.get('show')) map.set('unread', ImmutableSet());
+      map.set('show', !map.get('show'));
+    });
   case ANNOUNCEMENTS_FETCH_REQUEST:
     return state.set('isLoading', true);
   case ANNOUNCEMENTS_FETCH_SUCCESS:
     return state.withMutations(map => {
-      map.set('items', fromJS(action.announcements));
+      const items = fromJS(action.announcements);
+      map.set('unread', ImmutableSet());
+      addUnread(map, items);
+      map.set('items', items);
       map.set('isLoading', false);
     });
   case ANNOUNCEMENTS_FETCH_FAIL:
     return state.set('isLoading', false);
   case ANNOUNCEMENTS_UPDATE:
-    return state.update('items', list => list.unshift(fromJS(action.announcement)).sortBy(announcement => announcement.get('starts_at')));
-  case ANNOUNCEMENTS_DISMISS:
-    return state.update('items', list => list.filterNot(announcement => announcement.get('id') === action.id));
+    return addUnread(state, [fromJS(action.announcement)]).update('items', list => list.unshift(fromJS(action.announcement)).sortBy(announcement => announcement.get('starts_at')));
   case ANNOUNCEMENTS_REACTION_UPDATE:
     return updateReactionCount(state, action.reaction);
   case ANNOUNCEMENTS_REACTION_ADD_REQUEST:
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 2e6ea3c7e..adaed2826 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -6631,7 +6631,7 @@ noscript {
 }
 
 .announcements {
-  background: lighten($ui-base-color, 4%);
+  background: lighten($ui-base-color, 8%);
   border-top: 1px solid $ui-base-color;
   font-size: 13px;
   display: flex;
@@ -6672,12 +6672,6 @@ noscript {
       font-weight: 500;
       margin-bottom: 10px;
     }
-
-    &__dismiss-icon {
-      position: absolute;
-      top: 12px;
-      right: 12px;
-    }
   }
 
   &__pagination {
diff --git a/app/validators/reaction_validator.rb b/app/validators/reaction_validator.rb
index be899c89d..494b6041b 100644
--- a/app/validators/reaction_validator.rb
+++ b/app/validators/reaction_validator.rb
@@ -6,10 +6,10 @@ class ReactionValidator < ActiveModel::Validator
   LIMIT = 8
 
   def validate(reaction)
-    return if reaction.name.blank? || reaction.custom_emoji_id.present?
+    return if reaction.name.blank?
 
-    reaction.errors.add(:name, I18n.t('reactions.errors.unrecognized_emoji')) unless unicode_emoji?(reaction.name)
-    reaction.errors.add(:base, I18n.t('reactions.errors.limit_reached')) if limit_reached?(reaction)
+    reaction.errors.add(:name, I18n.t('reactions.errors.unrecognized_emoji')) if reaction.custom_emoji_id.blank? && !unicode_emoji?(reaction.name)
+    reaction.errors.add(:base, I18n.t('reactions.errors.limit_reached')) if new_reaction?(reaction) && limit_reached?(reaction)
   end
 
   private
@@ -18,6 +18,10 @@ class ReactionValidator < ActiveModel::Validator
     SUPPORTED_EMOJIS.include?(name)
   end
 
+  def new_reaction?(reaction)
+    !reaction.announcement.announcement_reactions.where(name: reaction.name).exists?
+  end
+
   def limit_reached?(reaction)
     reaction.announcement.announcement_reactions.where.not(name: reaction.name).count('distinct name') >= LIMIT
   end
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index ccbd16e2a..6cc50d6c6 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -198,11 +198,13 @@ ca:
         change_email_user: "%{name} ha canviat l'adreça de correu electrònic del usuari %{target}"
         confirm_user: "%{name} ha confirmat l'adreça de correu electrònic de l'usuari %{target}"
         create_account_warning: "%{name} ha enviat un avís a %{target}"
+        create_announcement: "%{name} ha creat un nou anunci %{target}"
         create_custom_emoji: "%{name} ha pujat un nou emoji %{target}"
         create_domain_allow: "%{name} ha afegit a la llista blanca el domini %{target}"
         create_domain_block: "%{name} ha blocat el domini %{target}"
         create_email_domain_block: "%{name} ha afegit a la llista negra el domini del correu electrònic %{target}"
         demote_user: "%{name} ha degradat l'usuari %{target}"
+        destroy_announcement: "%{name} ha eliminat l'anunci %{target}"
         destroy_custom_emoji: "%{name} ha destruït l'emoji %{target}"
         destroy_domain_allow: "%{name} ha eliminat el domini %{target} de la llista blanca"
         destroy_domain_block: "%{name} ha desblocat el domini %{target}"
@@ -224,10 +226,22 @@ ca:
         unassigned_report: "%{name} ha des-assignat l'informe %{target}"
         unsilence_account: "%{name} ha silenciat el compte de %{target}"
         unsuspend_account: "%{name} ha llevat la suspensió del compte de %{target}"
+        update_announcement: "%{name} ha actualitzat l'anunci %{target}"
         update_custom_emoji: "%{name} ha actualitzat l'emoji %{target}"
         update_status: "%{name} estat actualitzat per %{target}"
       deleted_status: "(tut esborrat)"
       title: Registre d'auditoria
+    announcements:
+      edit:
+        title: Edita l'anunci
+      empty: No s'ha trobat cap anunci.
+      live: En viu
+      new:
+        create: Crea un anunci
+        title: Nou anunci
+      published: Publicat
+      time_range: Interval de temps
+      title: Anuncis
     custom_emojis:
       assign_category: Assigna una categoria
       by_domain: Domini
@@ -657,6 +671,9 @@ ca:
     hint_html: "<strong>Pista:</strong> No et preguntarem un altre cop la teva contrasenya en la pròxima hora."
     invalid_password: Contrasenya no vàlida
     prompt: Confirmi la contrasenya per a continuar
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count} h"
@@ -758,6 +775,8 @@ ca:
     all: Tot
     changes_saved_msg: Els canvis s'han desat correctament!
     copy: Copia
+    delete: Esborra
+    edit: Edita
     no_batch_actions_available: Cap accions de lot disponibles en aquesta pàgina
     order_by: Ordena per
     save_changes: Desa els canvis
@@ -929,6 +948,9 @@ ca:
     other: Altre
     posting_defaults: Valors predeterminats de publicació
     public_timelines: Línies de temps públiques
+  reactions:
+    errors:
+      unrecognized_emoji: no és un emoji reconegut
   relationships:
     activity: Activitat del compte
     dormant: Inactiu
diff --git a/config/locales/co.yml b/config/locales/co.yml
index b21fc8d15..c75fa3f21 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -198,11 +198,13 @@ co:
         change_email_user: "%{name} hà cambiatu l’indirizzu e-mail di %{target}"
         confirm_user: "%{name} hà cunfirmatu l’indirizzu e-mail di %{target}"
         create_account_warning: "%{name} hà mandatu un'avertimentu à %{target}"
+        create_announcement: "%{name} hà creatu u novu annunziu %{target}"
         create_custom_emoji: "%{name} hà caricatu una nov’emoji %{target}"
         create_domain_allow: "%{name} hà messu u duminiu %{target} nant’a lista bianca"
         create_domain_block: "%{name} hà bluccatu u duminiu %{target}"
         create_email_domain_block: "%{name} hà messu u duminiu e-mail %{target} nant’a lista nera"
         demote_user: "%{name} hà ritrugradatu l’utilizatore %{target}"
+        destroy_announcement: "%{name} hà sguassatu u novu annunziu %{target}"
         destroy_custom_emoji: "%{name} hà sguassatu l'emoji %{target}"
         destroy_domain_allow: "%{name} hà sguassatu u duminiu %{target} da a lista bianca"
         destroy_domain_block: "%{name} hà sbluccatu u duminiu %{target}"
@@ -224,10 +226,22 @@ co:
         unassigned_report: "%{name} hà disassignatu u signalamentu %{target}"
         unsilence_account: "%{name} hà fattu che u contu di %{target} ùn hè più silenzatu"
         unsuspend_account: "%{name} hà fattu che u contu di %{target} ùn hè più suspesu"
+        update_announcement: "%{name} hà cambiatu u novu annunziu %{target}"
         update_custom_emoji: "%{name} hà messu à ghjornu l’emoji %{target}"
         update_status: "%{name} hà cambiatu u statutu di %{target}"
       deleted_status: "(statutu sguassatu)"
       title: Ghjurnale d’audit
+    announcements:
+      edit:
+        title: Mudificà annunzii
+      empty: Manc'un annunziu trovu.
+      live: Attivu
+      new:
+        create: Creà un'annunziu
+        title: Novu annunziu
+      published: Pubblicatu
+      time_range: Intervallu di tempu
+      title: Annunzii
     custom_emojis:
       assign_category: Aghjunghje categuria
       by_domain: Duminiu
@@ -372,6 +386,8 @@ co:
       title: Invitazione
     pending_accounts:
       title: Conti in attesa (%{count})
+    relationships:
+      title: Rilazione di %{acct}
     relays:
       add_new: Aghjunghje un ripetitore
       delete: Sguassà
@@ -655,6 +671,9 @@ co:
     hint_html: "<strong>Astuzia:</strong> Ùn avemu micca da dumandavvi stu codice per l'ore chì vene."
     invalid_password: Chjave d'accessu micca curretta
     prompt: Cunfirmà a chjave d'accessu per cuntinuvà
+  date:
+    formats:
+      default: "%d %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}o"
@@ -731,6 +750,7 @@ co:
     hint_html: "<strong>Quale sò i hashtag in mostra?</strong> Sò messi in vista nant'à u vostru prufile pubblicu è permettenu à a ghjente di vede i vostri statuti ch'annu stu hashtag. Sò una bona manere di mustrà e vostre opere creative o i prughjetti à longu termine."
   filters:
     contexts:
+      account: Prufili
       home: Accolta
       notifications: Nutificazione
       public: Linee pubbliche
@@ -755,6 +775,8 @@ co:
     all: Tuttu
     changes_saved_msg: Cambiamenti salvati!
     copy: Cupià
+    delete: Sguassà
+    edit: Mudificà
     no_batch_actions_available: Alcun'azzione di gruppu nant'à sta pagina
     order_by: Urdinà da
     save_changes: Salvà e mudificazione
@@ -926,11 +948,15 @@ co:
     other: Altre
     posting_defaults: Paramettri predefiniti
     public_timelines: Linee pubbliche
+  reactions:
+    errors:
+      unrecognized_emoji: ùn hè micca un'emoji ricunisciuta
   relationships:
     activity: Attività di u contu
     dormant: Inattivu
     followers: Abbunati
     following: Abbunamenti
+    invited: Invitatu
     last_active: Ultima attività
     most_recent: Più ricente
     moved: Spiazzatu
@@ -959,8 +985,8 @@ co:
       proceed: Cuntinuà per risponde
       prompt: 'Vulete risponde à stu statutu:'
   scheduled_statuses:
-    over_daily_limit: Avete trapassatu a limita di %{limit} statuti planificati per stu ghjornu
-    over_total_limit: Avete trapassatu a limita di %{limit} statuti planificati
+    over_daily_limit: Avete trapassatu a limita di %{limit} statuti pianificati per stu ghjornu
+    over_total_limit: Avete trapassatu a limita di %{limit} statuti pianificati
     too_soon: A data deve esse indè u futuru
   sessions:
     activity: Ultima attività
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 218267cd3..0fef69dff 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -950,6 +950,7 @@ de:
     public_timelines: Öffentliche Zeitleisten
   reactions:
     errors:
+      limit_reached: Limit für verschiedene Reaktionen erreicht
       unrecognized_emoji: ist kein anerkanntes Emoji
   relationships:
     activity: Kontoaktivität
diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml
index 573d055de..cca8764ea 100644
--- a/config/locales/devise.ca.yml
+++ b/config/locales/devise.ca.yml
@@ -2,7 +2,7 @@
 ca:
   devise:
     confirmations:
-      confirmed: L'adreça de correu s'ha confirmat correctament.
+      confirmed: La teva adreça de correu electrònic s'ha confirmat correctament.
       send_instructions: "En pocs minuts rebràs un correu electrònic amb instruccions sobre com confirmar l'adreça de correu. \nSi us plau verifica la teva carpeta de correu brossa si no has rebut aquest correu."
       send_paranoid_instructions: |-
         Si l'adreça de correu electrònic existeix en la nostra base de dades, en pocs minuts rebràs un correu electrònic amb instruccions sobre com confirmar l'adreça de correu.
@@ -25,7 +25,7 @@ ca:
         explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic de l'activació. Si no fos així, ignora aquest correu electrònic.
         explanation_when_pending: Has sol·licitat una invitació a %{host} amb aquesta adreça de correu electrònic. Un cop confirmis la teva adreça de correu electrònic revisarem la teva sol·licitud. No es pot iniciar la sessió fins llavors. Si la teva sol·licitud és rebutjada les teves dades s’eliminaran, de manera que no s’exigirà cap altra acció. Si no has estat tu qui ha fet aquest sol·licitud si us plau ignora aquest correu electrònic.
         extra_html: Si us plau consulta també <a href="%{terms_path}"> les regles del servidor</a> i <a href="%{policy_path}"> les nostres condicions de servei</a>.
-        subject: 'Mastodont: Instruccions de confirmació %{instance}'
+        subject: 'Mastodon: Instruccions de confirmació %{instance}'
         title: Verifica l'adreça de correu
       email_changed:
         explanation: 'L''adreça de correu del teu compte s''està canviant a:'
diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml
index 7cd806b05..80d438092 100644
--- a/config/locales/devise.es.yml
+++ b/config/locales/devise.es.yml
@@ -23,43 +23,43 @@ es:
         explanation: Has creado una cuenta en %{host} con esta dirección de correo electrónico. Estas a un clic de activarla. Si no fue usted, por favor ignore este correo electrónico.
         explanation_when_pending: Usted ha solicitado una invitación a %{host} con esta dirección de correo electrónico. Una vez que confirme su dirección de correo electrónico, revisaremos su aplicación. No puede iniciar sesión hasta que su aplicación sea revisada. Si su solicitud está rechazada, sus datos serán eliminados, así que no será necesaria ninguna acción adicional por ti. Si no fuera usted, por favor ignore este correo electrónico.
         extra_html: Por favor revise <a href="%{terms_path}">las reglas de la instancia</a> y <a href="%{policy_path}">nuestros términos de servicio</a>.
-        subject: 'Mastodonte: Instrucciones de confirmación para %{instance}'
+        subject: 'Mastodon: Instrucciones de confirmación para %{instance}'
         title: Verificar dirección de correo electrónico
       email_changed:
         explanation: 'El correo electrónico para su cuenta esta siendo cambiada a:'
         extra: Si usted no ha cambiado su correo electrónico, es probable que alguien haya conseguido acceso a su cuenta. Por favor cambie su contraseña inmediatamente o contacte al administrador de la instancia si usted no puede iniciar sesión.
-        subject: 'Mastodonte: Correo electrónico cambiado'
+        subject: 'Mastodon: Correo electrónico cambiado'
         title: Nueva dirección de correo electrónico
       password_change:
         explanation: La contraseña de su cuenta a sido cambiada.
         extra: Si usted no a cambiado su contraseña. es probable que alguien a conseguido acceso a su cuenta. Por favor cambie su contraseña inmediatamente o contacte a el administrador de la instancia si usted esta bloqueado de su cuenta.
-        subject: 'Mastodonte: Contraseña cambiada'
+        subject: 'Mastodon: Contraseña cambiada'
         title: Contraseña cambiada
       reconfirmation_instructions:
         explanation: Confirme la nueva dirección para cambiar su coreo electrónico.
-        extra: Si no iniciaste este cambio, por favor ignora este correo. Esta dirección de correo para la cuenta de Mastodonte no cambiará hasta que accedas al vinculo arriba.
-        subject: 'Mastodonte: Confirme correo electrónico para %{instance}'
+        extra: Si no iniciaste este cambio, por favor ignora este correo. Esta dirección de correo para la cuenta de Mastodon no cambiará hasta que accedas al vinculo arriba.
+        subject: 'Mastodon: Confirme correo electrónico para %{instance}'
         title: Verifique dirección de correo electrónico
       reset_password_instructions:
         action: Cambiar contraseña
         explanation: Solicitaste una nueva contraseña para tu cuenta.
         extra: Si no solicitaste esto, por favor ignora este correo. Tu contraseña no cambiará hasta que tu accedas al vinculo arriba y crees una nueva.
-        subject: 'Mastodonte: Instrucciones para reiniciar contraseña'
+        subject: 'Mastodon: Instrucciones para reiniciar contraseña'
         title: Reiniciar contraseña
       two_factor_disabled:
         explanation: La autenticación de dos factores para tu cuenta ha sido deshabilitada. Ahora puedes conectarte solamente usando la dirección de correo electrónico y la contraseña.
-        subject: 'Mastodonte: La autenticación de dos factores está deshabilitada'
+        subject: 'Mastodon: La autenticación de dos factores está deshabilitada'
         title: 2FA desactivada
       two_factor_enabled:
         explanation: La autenticación de dos factores para tu cuenta ha sido habilitada. Se requiere un token generado por la aplicación TOTP emparejada para ingresar.
-        subject: 'Mastodonte: La autenticación de dos factores está habilitada'
+        subject: 'Mastodon: La autenticación de dos factores está habilitada'
         title: 2FA activada
       two_factor_recovery_codes_changed:
         explanation: Los códigos de recuperación previos han sido invalidados y se generaron códigos nuevos.
-        subject: 'Mastodonte: Los códigos de recuperación de dos factores fueron regenerados'
+        subject: 'Mastodon: Los códigos de recuperación de dos factores fueron regenerados'
         title: Códigos de recuperación 2FA cambiados
       unlock_instructions:
-        subject: 'Mastodonte: Instrucciones para desbloquear'
+        subject: 'Mastodon: Instrucciones para desbloquear'
     omniauth_callbacks:
       failure: No podemos autentificarle desde %{kind} debido a "%{reason}".
       success: Autentificado con éxito desde la cuenta %{kind} .
diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml
index 274784b58..c5f0c64b6 100644
--- a/config/locales/doorkeeper.uk.yml
+++ b/config/locales/doorkeeper.uk.yml
@@ -38,6 +38,7 @@ uk:
         application: Додаток
         callback_url: URL зворотнього виклику
         delete: Видалити
+        empty: У вас немає створених додатків.
         name: Назва
         new: Новий додаток
         scopes: Області видимості
@@ -125,6 +126,7 @@ uk:
       read: читати усі дані вашого облікового запису
       read:accounts: бачити інформацію про облікові записи
       read:blocks: бачити Ваші блокування
+      read:bookmarks: бачити ваші закладки
       read:favourites: бачити Ваші вподобані пости
       read:filters: бачити Ваші фільтри
       read:follows: бачити Ваші підписки
@@ -137,6 +139,7 @@ uk:
       write: змінювати усі дані вашого облікового запису
       write:accounts: змінювати ваш профіль
       write:blocks: блокувати облікові записи і домени
+      write:bookmarks: додавати пости в закладки
       write:favourites: вподобані статуси
       write:filters: створювати фільтри
       write:follows: підписуйтесь на людей
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 53d475523..c5b622ef6 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -198,11 +198,13 @@ el:
         change_email_user: Ο/Η %{name} άλλαξε τη διεύθυνση email του χρήστη %{target}
         confirm_user: Ο/Η %{name} επιβεβαίωσε τη διεύθυνση email του χρήστη %{target}
         create_account_warning: Ο/Η %{name} έστειλε προειδοποίηση προς %{target}
+        create_announcement: Νέα ανακοίνωση %{target} από %{name}
         create_custom_emoji: Ο/Η %{name} ανέβασε νέο emoji %{target}
         create_domain_allow: Ο/Η %{name} έβαλε τον τομέα %{target} σε λευκή λίστα
         create_domain_block: Ο/Η %{name} μπλόκαρε τον τομέα %{target}
         create_email_domain_block: Ο/Η %{name} έβαλε τον τομέα email %{target} σε μαύρη λίστα
         demote_user: Ο/Η %{name} υποβίβασε το χρήστη %{target}
+        destroy_announcement: Διαγραφή ανακοίνωσης %{target} από %{name}
         destroy_custom_emoji: Ο/Η %{name} κατέστρεψε το emoji %{target}
         destroy_domain_allow: Ο/Η %{name} αφαίρεσε τον τομέα %{target} από λίστα εγκρίσεων
         destroy_domain_block: Ο/Η %{name} ξεμπλόκαρε τον τομέα %{target}
@@ -224,10 +226,22 @@ el:
         unassigned_report: Ο/Η %{name} αποδέσμευσε την καταγγελία %{target}
         unsilence_account: Ο/Η %{name} ήρε την αποσιώπηση του λογαριασμού του/της %{target}
         unsuspend_account: Ο/Η %{name} ήρε την παύση του λογαριασμού του χρήστη %{target}
+        update_announcement: Ενημέρωση ανακοίνωσης %{target} από %{name}
         update_custom_emoji: Ο/Η %{name} ενημέρωσε το emoji %{target}
         update_status: Ο/Η %{name} ενημέρωσε την κατάσταση του/της %{target}
       deleted_status: "(διαγραμμένη δημοσίευση)"
       title: Αρχείο ελέγχου
+    announcements:
+      edit:
+        title: Ενημέρωση ανακοίνωσης
+      empty: Δεν βρέθηκε ανακοίνωση.
+      live: Ενεργές
+      new:
+        create: Δημιουργία ανακοίνωσης
+        title: Νέα ανακοίνωση
+      published: Δημοσιευμένη
+      time_range: Χρονική διάρκεια
+      title: Ανακοινώσεις
     custom_emojis:
       assign_category: Κατηγορία
       by_domain: Τομέας
@@ -372,6 +386,8 @@ el:
       title: Προσκλήσεις
     pending_accounts:
       title: Λογαριασμοί σε αναμονή (%{count})
+    relationships:
+      title: Σχέσεις %{acct}
     relays:
       add_new: Πρόσθεσε νέο ανταποκριτή (relay)
       delete: Διαγραφή
@@ -655,6 +671,9 @@ el:
     hint_html: "<strong>Συμβουλή:</strong> Δεν θα σου ζητήσουμε τον κωδικό ασφαλείας σου ξανά για την επόμενη ώρα."
     invalid_password: Μη έγκυρο συνθηματικό
     prompt: Επιβεβαίωση συνθηματικού για συνέχεια
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}ω"
@@ -731,6 +750,7 @@ el:
     hint_html: "<strong>Τι είναι οι προβεβλημένες ταμπέλες;</strong> Προβάλλονται στο δημόσιο προφίλ σου επιτρέποντας σε όποιον το βλέπει να χαζέψει τις δημοσιεύσεις που τις χρησιμοποιούν. Είναι ωραίος τρόπος να παρακολουθείς κάποια δημιουργία ή ένα μακροπρόθεσμο έργο."
   filters:
     contexts:
+      account: Προφίλ
       home: Αρχική ροή
       notifications: Ειδοποιήσεις
       public: Δημόσιες ροές
@@ -755,6 +775,8 @@ el:
     all: Όλα
     changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν!
     copy: Αντιγραφή
+    delete: Διαγραφή
+    edit: Ενημέρωση
     no_batch_actions_available: Δεν υπάρχουν ομαδικές ενέργειες σε αυτή τη σελίδα
     order_by: Ταξινόμηση κατά
     save_changes: Αποθήκευση αλλαγών
@@ -926,11 +948,15 @@ el:
     other: Άλλες
     posting_defaults: Προεπιλογές δημοσίευσης
     public_timelines: Δημόσιες ροές
+  reactions:
+    errors:
+      unrecognized_emoji: δεν αναγνωρίζεται ως emoji
   relationships:
     activity: Δραστηριότητα λογαριασμού
     dormant: Αδρανείς
     followers: Σε ακολουθούν
     following: Ακολουθείς
+    invited: Προσκεκλημένοι
     last_active: Τελευταία δραστηριότητα
     most_recent: Πιο πρόσφατα
     moved: Μετακόμισε
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index f298cfbf5..30cbdbee5 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -198,11 +198,13 @@ es-AR:
         change_email_user: "%{name} cambió la dirección de correo electrónico del usuario %{target}"
         confirm_user: "%{name} confirmó la dirección de correo del usuario %{target}"
         create_account_warning: "%{name} envió una advertencia a %{target}"
+        create_announcement: "%{name} creó el nuevo anuncio %{target}"
         create_custom_emoji: "%{name} subió nuevo emoji %{target}"
         create_domain_allow: "%{name} aprobó el dominio %{target}"
         create_domain_block: "%{name} bloqueó el dominio %{target}"
         create_email_domain_block: "%{name} desaprobó el dominio de correo electrónico %{target}"
         demote_user: "%{name} bajó de nivel al usuario %{target}"
+        destroy_announcement: "%{name} eliminó el anuncio %{target}"
         destroy_custom_emoji: "%{name} destruyó el emoji %{target}"
         destroy_domain_allow: "%{name} quitó el dominio %{target} de los permitidos"
         destroy_domain_block: "%{name} desbloqueó el dominio %{target}"
@@ -224,10 +226,22 @@ es-AR:
         unassigned_report: "%{name} desasignó la denuncia %{target}"
         unsilence_account: "%{name} quitó el silenciado de la cuenta de %{target}"
         unsuspend_account: "%{name} quitó la suspensión de la cuenta de %{target}"
+        update_announcement: "%{name} actualizó el anuncio %{target}"
         update_custom_emoji: "%{name} actualizó el emoji %{target}"
         update_status: "%{name} actualizó el estado de %{target}"
       deleted_status: "(estado borrado)"
       title: Registro de auditoría
+    announcements:
+      edit:
+        title: Editar anuncio
+      empty: No se encontraron anuncios.
+      live: En vivo
+      new:
+        create: Crear anuncio
+        title: Nuevo anuncio
+      published: Publicados
+      time_range: Rango de tiempo
+      title: Anuncios
     custom_emojis:
       assign_category: Asignar categoría
       by_domain: Dominio
@@ -657,6 +671,9 @@ es-AR:
     hint_html: "<strong>Dato:</strong> No volveremos a preguntarte por la contraseña durante la siguiente hora."
     invalid_password: Contraseña no válida
     prompt: Confirmar contraseña para seguir
+  date:
+    formats:
+      default: "%Y.%b.%d"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -758,6 +775,8 @@ es-AR:
     all: Todas
     changes_saved_msg: "¡Cambios guardados exitosamente!"
     copy: Copiar
+    delete: Eliminar
+    edit: Editar
     no_batch_actions_available: No hay acciones por lotes disponibles en esta página
     order_by: Ordenar por
     save_changes: Guardar cambios
@@ -929,6 +948,9 @@ es-AR:
     other: Otros
     posting_defaults: Configuración predeterminada de publicaciones
     public_timelines: Líneas temporales públicas
+  reactions:
+    errors:
+      unrecognized_emoji: no es un emoji conocido
   relationships:
     activity: Actividad de la cuenta
     dormant: Inactivas
diff --git a/config/locales/es.yml b/config/locales/es.yml
index cc8857bfd..2d582cd7c 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1,32 +1,32 @@
 ---
 es:
   about:
-    about_hashtag_html: Estos son barritadas públicas etiquetadas con <strong>#%{hashtag}</strong>. Puedes interactuar con ellas si tienes una cuenta en el fediverso.
-    about_mastodon_html: Mastodonte es una red social basada en protocolos web abiertos y Programas Libres y de Código Abierto - Plica/Foss -. Está descentralizado como el correo electrónico!
+    about_hashtag_html: Estos son toots públicos etiquetados con <strong>#%{hashtag}</strong>. Puedes interactuar con ellos si tienes una cuenta en cualquier parte del fediverso.
+    about_mastodon_html: 'La red social del futuro: ¡Sin anuncios, sin vigilancia corporativa, diseño ético, y descentralización! ¡Sé dueño de tu información con Mastodon!'
     about_this: Información
     active_count_after: activo
     active_footnote: Usuarios Activos Mensuales (UAM)
     administered_by: 'Administrado por:'
-    api: Interfaz de Programación de la Aplicación
+    api: API
     apps: Aplicaciones móviles
-    apps_platforms: Utiliza Mastodonte desde iOS, Android y otras plataformas
+    apps_platforms: Utiliza Mastodon desde iOS, Android y otras plataformas
     browse_directory: Navega por el directorio de perfiles y filtra por intereses
     browse_local_posts: Explora en vivo los posts públicos de este servidor
     browse_public_posts: Navega por un transmisión en vivo de publicaciones públicas en Mastodon
     contact: Contacto
     contact_missing: No especificado
-    contact_unavailable: No disponible
+    contact_unavailable: N/A
     discover_users: Descubrir usuarios
     documentation: Documentación
-    federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodonte y más allá.
+    federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodon y más allá.
     get_apps: Probar una aplicación móvil
-    hosted_on: Mastodonte huesped en %{domain}
+    hosted_on: Mastodon hosteado en %{domain}
     instance_actor_flash: |
       Esta cuenta es un actor virtual usado para representar al servidor y no a ningún usuario individual.
       Se usa para fines federativos y no debe ser bloqueado a menos que usted quiera bloquear toda la instancia, en cuyo caso se debe utilizar un bloque de dominio.
-    learn_more: Aprenda más
+    learn_more: Aprende más
     privacy_policy: Política de privacidad
-    see_whats_happening: Vea lo que está pasando
+    see_whats_happening: Ver lo que está pasando
     server_stats: 'Datos del servidor:'
     source_code: Código fuente
     status_count_after:
@@ -42,16 +42,16 @@ es:
       rejecting_media: Los archivos multimedia de este servidor no serán procesados y no se mostrarán miniaturas, lo que requiere un clic manual en el otro servidor.
       silenced: Las publicaciones de este servidor no se mostrarán en ningún lugar salvo en el Inicio si sigues al autor.
       suspended: No podrás seguir a nadie de este servidor, y ningún dato de este será procesado o almacenado, y no se intercambiarán datos.
-    unavailable_content_html: Mastodonte generalmente le permite ver contenido e interactuar con usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular.
+    unavailable_content_html: Mastodon generalmente le permite ver contenido e interactuar con usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular.
     user_count_after:
       one: usuario
       other: usuarios
-    user_count_before: Inicio de
-    what_is_mastodon: "¿Qué es Mastodonte?"
+    user_count_before: Tenemos
+    what_is_mastodon: "¿Qué es Mastodon?"
   accounts:
     choices_html: 'Elecciones de %{name}:'
     endorsements_hint: Puedes recomendar a gente que sigues desde la interfaz web, y aparecerán allí.
-    featured_tags_hint: Puede presentar etiquetas específicas que se mostrarán aquí.
+    featured_tags_hint: Puede presentar hashtags específicos que se mostrarán aquí.
     follow: Seguir
     followers:
       one: Seguidor
@@ -198,11 +198,13 @@ es:
         change_email_user: "%{name} ha cambiado la dirección de correo del usuario %{target}"
         confirm_user: "%{name} confirmó la dirección de correo del usuario %{target}"
         create_account_warning: "%{name} envió una advertencia a %{target}"
+        create_announcement: "%{name} creó el nuevo anuncio %{target}"
         create_custom_emoji: "%{name} subió un nuevo emoji %{target}"
         create_domain_allow: "%{name} ha añadido a la lista blanca el dominio %{target}"
         create_domain_block: "%{name} bloqueó el dominio %{target}"
         create_email_domain_block: "%{name} puso en lista negra el dominio de correos %{target}"
         demote_user: "%{name} degradó al usuario %{target}"
+        destroy_announcement: "%{name} eliminó el anuncio %{target}"
         destroy_custom_emoji: "%{name} destruyó el emoji %{target}"
         destroy_domain_allow: "%{name} ha eliminado el dominio %{target} de la lista blanca"
         destroy_domain_block: "%{name} desbloqueó el dominio %{target}"
@@ -224,10 +226,22 @@ es:
         unassigned_report: "%{name} ha desasignado la denuncia %{target}"
         unsilence_account: "%{name} desactivó el silenciado de la cuenta de %{target}"
         unsuspend_account: "%{name} desactivó la suspensión de la cuenta de %{target}"
+        update_announcement: "%{name} actualizó el anuncio %{target}"
         update_custom_emoji: "%{name} actualizó el emoji %{target}"
         update_status: "%{name} actualizó el estado de %{target}"
       deleted_status: "(estado borrado)"
       title: Log de auditoría
+    announcements:
+      edit:
+        title: Editar anuncio
+      empty: No se encontraron anuncios.
+      live: En vivo
+      new:
+        create: Crear anuncio
+        title: Nuevo anuncio
+      published: Publicados
+      time_range: Intervalo de tiempo
+      title: Anuncios
     custom_emojis:
       assign_category: Asignar categoría
       by_domain: Dominio
@@ -270,11 +284,11 @@ es:
       feature_registrations: Registros
       feature_relay: Relés de federación
       feature_spam_check: Contra-spam
-      feature_timeline_preview: Vista previa de la cronología
+      feature_timeline_preview: Vista previa de la línea de tiempo
       features: Características
       hidden_service: Federación con servicios ocultos
       open_reports: informes abiertos
-      pending_tags: etiquetas esperando revisión
+      pending_tags: hashtags esperando revisión
       pending_users: usuarios esperando por revisión
       recent_users: Usuarios recientes
       search: Búsqueda por texto completo
@@ -433,8 +447,8 @@ es:
         desc_html: Conteo de estados publicados localmente, usuarios activos, y nuevos registros en  periodos semanales
         title: Publicar estadísticas locales acerca de actividad de usuario
       bootstrap_timeline_accounts:
-        desc_html: Separa con comas los nombres de usuaria. Solo funcionará para cuentas locales desbloqueadas. Si se deja vacia, se tomará como valor por defecto a todas las administradoras locales.
-        title: Seguimientos predeterminados para usuarias nuevas
+        desc_html: Separa con comas los nombres de usuario. Solo funcionará para cuentas locales desbloqueadas. Si se deja vacío, se tomará como valor por defecto a todos los administradores locales.
+        title: Seguimientos predeterminados para usuarios nuevos
       contact_information:
         email: Correo de trabajo
         username: Nombre de usuario
@@ -452,7 +466,7 @@ es:
       domain_blocks_rationale:
         title: Mostrar la razón de ser
       enable_bootstrap_timeline_accounts:
-        title: Habilitar seguimientos predeterminados para nuevas usuarias
+        title: Habilitar seguimientos predeterminados para usuarios nuevos
       hero:
         desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia
         title: Imagen de portada
@@ -486,7 +500,7 @@ es:
         title: Modo de registros
       show_known_fediverse_at_about_page:
         desc_html: Cuando esté activado, se mostrarán toots de todo el fediverso conocido en la vista previa. En otro caso, se mostrarán solamente toots locales.
-        title: Mostrar fediverso conocido en la vista previa de la cronología
+        title: Mostrar fediverso conocido en la vista previa de la historia
       show_staff_badge:
         desc_html: Mostrar un parche de staff en la página de un usuario
         title: Mostrar parche de staff
@@ -497,28 +511,28 @@ es:
         desc_html: Un buen lugar para tu código de conducta, reglas, guías y otras cosas que estén impuestas aparte en tu instancia. Puedes usar tags HTML
         title: Información extendida personalizada
       site_short_description:
-        desc_html: Mostrado en la barra lateral y las etiquetas de metadatos. Describe lo que es Mastodonte y qué hace especial a este servidor en un solo párrafo. si está vacío, pone por defecto la descripción de la instancia.
+        desc_html: Mostrado en la barra lateral y las etiquetas de metadatos. Describe lo que es Mastodon y qué hace especial a este servidor en un solo párrafo. si está vacío, pone por defecto la descripción de la instancia.
         title: Descripción corta de la instancia
       site_terms:
         desc_html: Puedes escribir tus propias políticas de privacidad, términos de servicio u otras legalidades. Puedes usar tags HTML
         title: Términos de servicio personalizados
       site_title: Nombre de instancia
       spam_check_enabled:
-        desc_html: Mastodonte puede silenciar y reportar cuentas automáticamente usando medidas como detectar cuentas que envían mensajes no solicitados repetidos. Puede que haya falsos positivos.
+        desc_html: Mastodon puede silenciar y reportar cuentas automáticamente usando medidas como detectar cuentas que envían mensajes no solicitados repetidos. Puede que haya falsos positivos.
         title: Contra-spam
       thumbnail:
         desc_html: Se usa para muestras con OpenGraph y APIs. Se recomienda 1200x630px
         title: Portada de instancia
       timeline_preview:
-        desc_html: Mostrar cronología pública en la portada
-        title: Permita acceso no autentificado a la cronología pública
+        desc_html: Mostrar línea de tiempo pública en la portada
+        title: Previsualización
       title: Ajustes del sitio
       trendable_by_default:
         desc_html: Afecta a etiquetas que no han sido previamente rechazadas
         title: Permitir que las etiquetas sean tendencia sin revisión previa
       trends:
-        desc_html: Mostrar públicamente etiquetas previamente revisadas que son tendencia
-        title: Etiquetas que son tendencia
+        desc_html: Mostrar públicamente hashtags previamente revisados que son tendencia
+        title: Hashtags de tendencia
     statuses:
       back_to_account: Volver a la cuenta
       batch:
@@ -543,14 +557,14 @@ es:
       last_active: Última actividad
       most_popular: Más popular
       most_recent: Más reciente
-      name: Etiqueta
+      name: Hashtag
       review: Estado de revisión
       reviewed: Revisado
       title: Etiquetas
       trending_right_now: En tendencia ahora mismo
       unique_uses_today: "%{count} publicando hoy"
       unreviewed: No revisado
-      updated_msg: Etiquetas actualizadas con éxito
+      updated_msg: Hashtags actualizados exitosamente
     title: Administración
     warning_presets:
       add_new: Añadir nuevo
@@ -567,7 +581,7 @@ es:
       body_remote: Alguien de %{domain} a reportado a %{target}
       subject: Nuevo reporte para la %{instance} (#%{id})
     new_trending_tag:
-      body: 'La etiqueta #%{name} es tendencia hoy, pero no ha sido revisada previamente. No se mostrará públicamente a menos que lo permita, o simplemente guarde el formulario evitando volver a ver este mensaje.'
+      body: 'El hashtag #%{name} está en tendencia hoy, pero no ha sido revisado previamente. No se mostrará públicamente a menos que lo permita, o simplemente guarde el formulario como para no volver a ver esto.'
       subject: Nuevo hashtag para revisión en %{instance} (#%{name})
   aliases:
     add_new: Crear alias
@@ -577,7 +591,7 @@ es:
     remove: Desvincular alias
   appearance:
     advanced_web_interface: Interfaz web avanzada
-    advanced_web_interface_hint: 'Si desea utilizar todo el ancho de pantalla, la interfaz web avanzada le permite configurar varias columnas diferentes para ver tanta información al mismo tiempo como quiera: Inicio, notificaciones, cronología federada, cualquier número de listas y etiquetas.'
+    advanced_web_interface_hint: 'Si desea utilizar todo el ancho de pantalla, la interfaz web avanzada le permite configurar varias columnas diferentes para ver tanta información al mismo tiempo como quiera: Inicio, notificaciones, línea de tiempo federada, cualquier número de listas y etiquetas.'
     animations_and_accessibility: Animaciones y accesibilidad
     confirmation_dialogs: Diálogos de confirmación
     discovery: Descubrir
@@ -610,9 +624,9 @@ es:
     delete_account: Borrar cuenta
     delete_account_html: Si desea eliminar su cuenta, puede <a href="%{path}">proceder aquí</a>. Será pedido de una confirmación.
     description:
-      prefix_invited_by_user: "¡@%{name} te invita a unirte a este servidor de Mastodonte!"
-      prefix_sign_up: "¡Únete a Mastodonte hoy!"
-      suffix: "¡Con una cuenta podrás seguir a gente, publicar novedades e intercambiar mensajes con usuarios de cualquier servidor de Mastodonte y más!"
+      prefix_invited_by_user: "¡@%{name} te invita a unirte a este servidor de Mastodon!"
+      prefix_sign_up: "¡Únete a Mastodon hoy!"
+      suffix: "¡Con una cuenta podrás seguir a gente, publicar novedades e intercambiar mensajes con usuarios de cualquier servidor de Mastodon y más!"
     didnt_get_confirmation: "¿No recibió el correo de confirmación?"
     forgot_password: "¿Olvidaste tu contraseña?"
     invalid_reset_password_token: El token de reinicio de contraseña es inválido o expiró. Por favor pide uno nuevo.
@@ -657,6 +671,9 @@ es:
     hint_html: "<strong>Tip:</strong> No volveremos a preguntarte por la contraseña durante la siguiente hora."
     invalid_password: Contraseña incorrecta
     prompt: Confirmar contraseña para seguir
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -708,7 +725,7 @@ es:
       content: Lo sentimos, algo ha funcionado mal por nuestra parte.
       title: Esta página no es correcta
     '503': La página no se ha podido cargar debido a un fallo temporal del servidor.
-    noscript_html: Para usar la aplicación web de Mastodonte, por favor activa Javascript. Alternativamente, prueba alguna de las <a href="%{apps_path}">aplicaciones nativas</a> para Mastodonte para tu plataforma.
+    noscript_html: Para usar la aplicación web de Mastodon, por favor activa Javascript. Alternativamente, prueba alguna de las <a href="%{apps_path}">aplicaciones nativas</a> para Mastodon para tu plataforma.
   existing_username_validator:
     not_found: no pudo encontrar un usuario local con ese nombre de usuario
     not_found_multiple: no pudo encontrar %{usernames}
@@ -729,14 +746,14 @@ es:
   featured_tags:
     add_new: Añadir nuevo
     errors:
-      limit: Alcanzaste el máximo de etiquetados
-    hint_html: "<strong>¿Qué son las etiquetas destacadas?</strong> Se muestran de forma prominente en tu perfil público y permiten a las personas usuarias navegar por tus publicaciones públicas específicamente bajo esas etiquetas. Son una gran herramienta para hacer un seguimiento de obras creativas o proyectos a largo plazo."
+      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:
       account: Perfiles
-      home: Cronología propia
+      home: Timeline propio
       notifications: Notificaciones
-      public: Cronología pública
+      public: Timeline público
       thread: Conversaciones
     edit:
       title: Editar filtro
@@ -755,9 +772,11 @@ es:
     resources: Recursos
     trending_now: Tendencia ahora
   generic:
-    all: Todas
+    all: Todos
     changes_saved_msg: "¡Cambios guardados con éxito!"
     copy: Copiar
+    delete: Eliminar
+    edit: Editar
     no_batch_actions_available: No hay acciones por lotes disponibles en esta página
     order_by: Ordenar por
     save_changes: Guardar cambios
@@ -928,7 +947,11 @@ es:
   preferences:
     other: Otros
     posting_defaults: Configuración por defecto de publicaciones
-    public_timelines: Cronologías públicas
+    public_timelines: Líneas de tiempo públicas
+  reactions:
+    errors:
+      limit_reached: Límite de reacciones diferentes alcanzado
+      unrecognized_emoji: no es un emoji conocido
   relationships:
     activity: Actividad de la cuenta
     dormant: Inactivo
@@ -989,7 +1012,7 @@ es:
       weibo: Weibo
     current_session: Sesión actual
     description: "%{browser} en %{platform}"
-    explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodonte.
+    explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -1018,7 +1041,7 @@ es:
     development: Desarrollo
     edit_profile: Editar perfil
     export: Exportar información
-    featured_tags: Etiquetas destacadas
+    featured_tags: Hashtags destacados
     identity_proofs: Pruebas de identidad
     import: Importar
     import_and_export: Importar y exportar
@@ -1042,8 +1065,8 @@ es:
     boosted_from_html: Impulsado desde %{acct_link}
     content_warning: 'Alerta de contenido: %{warning}'
     disallowed_hashtags:
-      one: 'contenía una etiqueta no permitida: %{tags}'
-      other: 'contenía las etiquetas no permitidas: %{tags}'
+      one: 'contenía un hashtag no permitido: %{tags}'
+      other: 'contenía los hashtags no permitidos: %{tags}'
     language_detection: Detección automática de idioma
     open_in_web: Abrir en web
     over_character_limit: Límite de caracteres de %{max} superado
@@ -1069,7 +1092,7 @@ es:
       public: Público
       public_long: Todos pueden ver
       unlisted: Público, pero no mostrar en la historia federada
-      unlisted_long: Todos pueden ver, pero no está listado en las cronologías públicas
+      unlisted_long: Todos pueden ver, pero no está listado en las líneas de tiempo públicas
   stream_entries:
     pinned: Toot fijado
     reblogged: retooteado
@@ -1082,9 +1105,9 @@ es:
       <h3 id="collect">¿Qué información recogemos?</h3>
 
       <ul>
-      <li><em>Información básica sobre su cuenta</em>: Si se registra en este servidor, se le requerirá un nombre de persona usuaria, una dirección de correo electrónico y una contraseña. Además puede incluir información adicional en el perfil como un nombre de perfil y una biografía, y subir una foto de perfil y una imagen de cabecera. El nombre de usuaria, nombre de perfil, biografía, foto de perfil e imagen de cabecera siempre son visibles públicamente</li>
-      <li><em>Publicaciones, seguimiento y otra información pública</em>: La lista de gente a la que sigue es mostrada públicamente, al igual que sus seguidores. Cuando publica un mensaje, la fecha y hora es almacenada, así como la aplicación desde la cual publicó el mensaje. Los mensajes pueden contener archivos adjuntos multimedia, como imágenes y vídeos. Las publicaciones públicas y no listadas están disponibles públicamente. Cuando destaca una entrada en su perfil, también es información disponible públicamente. Sus publicaciones son entregadas a sus seguidores, en algunos casos significa que son entregadas a diferentes servidores y las copias son almacenadas allí. Cuando elimina publicaciones, esto también se transfiere a sus seguidores. La acción de reenviar o marcar como favorito otra publicación es siempre pública.</li>
-      <li><em>Publicaciones directas y sólo para seguidoras</em>: Todos los mensajes se almacenan y procesan en el servidor. Las publicaciones sólo para seguidoras se entregan a las seguidoras y usuarias que se mencionan en ellas, y los mensajes directos se entregan sólo a las usuarias que se mencionan en ellos. En algunos casos significa que se entregan a diferentes servidores y que las copias se almacenan allí. Hacemos un esfuerzo de buena fe para limitar el acceso a esas publicaciones sólo a las personas autorizadas, pero otros servidores pueden no hacerlo. Por lo tanto, es importante revisar los servidores a los que pertenecen sus seguidoras. Puede cambiar una opción para aprobar y rechazar nuevas seguidoras manualmente en la configuración <em>Por favor, tenga en cuenta que las operadoras del servidor y de cualquier servidor receptor pueden ver dichos mensajes</em>, y que las destinatarias pueden capturarlos, copiarlos o volver a compartirlos de alguna otra manera. <em>No comparta ninguna información peligrosa en Mastodonte.</em></li>
+      <li><em>Información básica sobre su cuenta</em>: Si se registra en este servidor, se le requerirá un nombre de usuario, una dirección de correo electrónico y una contraseña. Además puede incluir información adicional en el perfil como un nombre de perfil y una biografía, y subir una foto de perfil y una imagen de cabecera. El nombre de usuario, nombre de perfil, biografía, foto de perfil e imagen de cabecera siempre son visibles públicamente</li>
+      <li><em>Publicaciones, seguimiento y otra información pública</em>: La lista de gente a la que sigue es mostrada públicamente, al igual que sus seguidores. Cuando publica un mensaje, la fecha y hora es almacenada, así como la aplicación desde la cual publicó el mensaje. Los mensajes pueden contener archivos adjuntos multimedia, como imágenes y vídeos. Las publicaciones públicas y no listadas están disponibles públicamente. Cuando destaca una entrada en su perfil, también es información disponible públicamente. Sus publicaciones son entregadas a sus seguidores, en algunos casos significa que son entregadas a diferentes servidores y las copias son almacenadas allí. Cuando elimina publicaciones, esto también se transfiere a sus seguidores. La acción de rebloguear o marcar como favorito otra publicación es siempre pública.</li>
+      <li><em>Publicaciones directas y sólo para seguidores</em>: Todos los mensajes se almacenan y procesan en el servidor. Los mensajes sólo para seguidores se entregan a los seguidores y usuarios que se mencionan en ellos, y los mensajes directos se entregan sólo a los usuarios que se mencionan en ellos. En algunos casos significa que se entregan a diferentes servidores y que las copias se almacenan allí. Hacemos un esfuerzo de buena fe para limitar el acceso a esas publicaciones sólo a las personas autorizadas, pero otros servidores pueden no hacerlo. Por lo tanto, es importante revisar los servidores a los que pertenecen sus seguidores. Puede cambiar una opción para aprobar y rechazar nuevos seguidores manualmente en la configuración <em>Por favor, tenga en cuenta que los operadores del servidor y de cualquier servidor receptor pueden ver dichos mensajes</em>, y que los destinatarios pueden capturarlos, copiarlos o volver a compartirlos de alguna otra manera. <em>No comparta ninguna información peligrosa en Mastodon.</em></li>
       <li><em>Direcciones IP y otros metadatos</em>: Al iniciar sesión, registramos la dirección IP desde la que se ha iniciado sesión, así como el nombre de la aplicación de su navegador. Todas las sesiones iniciadas están disponibles para su revisión y revocación en los ajustes. La última dirección IP utilizada se almacena hasta 12 meses. También podemos conservar los registros del servidor que incluyen la dirección IP de cada solicitud a nuestro servidor.</li>
       </ul>
 
@@ -1095,7 +1118,7 @@ es:
       <p>Toda la información que obtenemos de usted puede ser utilizada de las siguientes maneras:</p>
 
       <ul>
-      <li>Para proporcionar la funcionalidad principal de Mastodonte. Sólo puedes interactuar con el contenido de otras personas y publicar tu propio contenido cuando estés conectado. Por ejemplo, puedes seguir a otras personas para ver sus mensajes combinados en tu propia línea de tiempo personalizada.</li>
+      <li>Para proporcionar la funcionalidad principal de Mastodon. Sólo puedes interactuar con el contenido de otras personas y publicar tu propio contenido cuando estés conectado. Por ejemplo, puedes seguir a otras personas para ver sus mensajes combinados en tu propia línea de tiempo personalizada.</li>
       <li>Para ayudar a la moderación de la comunidad, por ejemplo, comparando su dirección IP con otras conocidas para determinar la evasión de prohibiciones u otras violaciones.</li>
       <li>La dirección de correo electrónico que nos proporcione podrá utilizarse para enviarle información, notificaciones sobre otras personas que interactúen con su contenido o para enviarle mensajes, así como para responder a consultas y/u otras solicitudes o preguntas.</li>
       </ul>
@@ -1135,9 +1158,9 @@ es:
 
       <p>No vendemos, comerciamos ni transferimos a terceros su información personal identificable. Esto no incluye a los terceros de confianza que nos asisten en la operación de nuestro sitio, en la realización de nuestros negocios o en la prestación de servicios, siempre y cuando dichas partes acuerden mantener la confidencialidad de esta información. También podemos divulgar su información cuando creamos que es apropiado para cumplir con la ley, hacer cumplir las políticas de nuestro sitio, o proteger nuestros u otros derechos, propiedad o seguridad.</p>
 
-      <p>Su contenido público puede ser descargado por otros servidores de la red. Tus mensajes públicos y sólo para seguidoras se envían a los servidores donde residen tus seguidoras, y los mensajes directos se envían a los servidores de las destinatarias, en la medida en que dichas seguidoras o destinatarias residan en un servidor diferente.</p>
+      <p>Su contenido público puede ser descargado por otros servidores de la red. Tus mensajes públicos y sólo para seguidores se envían a los servidores donde residen tus seguidores, y los mensajes directos se envían a los servidores de los destinatarios, en la medida en que dichos seguidores o destinatarios residan en un servidor diferente.</p>
 
-      <p>Cuando usted autoriza a una aplicación a usar su cuenta, dependiendo del alcance de los permisos que usted apruebe, puede acceder a la información de su perfil público, su lista de seguimiento, sus seguidoras, sus listas, todos sus mensajes y sus favoritas. Las aplicaciones nunca podrán acceder a su dirección de correo electrónico o contraseña.</p>
+      <p>Cuando usted autoriza a una aplicación a usar su cuenta, dependiendo del alcance de los permisos que usted apruebe, puede acceder a la información de su perfil público, su lista de seguimiento, sus seguidores, sus listas, todos sus mensajes y sus favoritos. Las aplicaciones nunca podrán acceder a su dirección de correo electrónico o contraseña.</p>
 
       <hr class="spacer" />
 
@@ -1160,9 +1183,9 @@ es:
       <p>Adaptado originalmente desde <a href="https://github.com/discourse/discourse">la política de privacidad de Discourse</a>.</p>
     title: Términos del Servicio y Políticas de Privacidad de %{instance}
   themes:
-    contrast: Mastodonte (Alto contraste)
-    default: Mastodonte (Oscuro)
-    mastodon-light: Mastodonte (claro)
+    contrast: Alto contraste
+    default: Mastodon
+    mastodon-light: Mastodon (claro)
   time:
     formats:
       default: "%d de %b del %Y, %H:%M"
@@ -1185,7 +1208,7 @@ es:
     wrong_code: "¡El código ingresado es inválido! ¿El dispositivo y tiempo del servidor están correctos?"
   user_mailer:
     backup_ready:
-      explanation: Has solicitado una copia completa de tu cuenta de Mastodonte. ¡Ya está preparada para descargar!
+      explanation: Has solicitado una copia completa de tu cuenta de Mastodon. ¡Ya está preparada para descargar!
       subject: Tu archivo está preparado para descargar
       title: Descargar archivo
     warning:
@@ -1211,15 +1234,15 @@ es:
       edit_profile_step: Puedes personalizar tu perfil subiendo un avatar, una cabecera, cambiando tu nombre de usuario y más cosas. Si quieres revisar a tus nuevos seguidores antes de que se les permita seguirte, puedes bloquear tu cuenta.
       explanation: Aquí hay algunos consejos para empezar
       final_action: Empezar a publicar
-      final_step: '¡Empieza a publicar! Incluso sin seguidores, tus mensajes públicos pueden ser vistos por otros, por ejemplo en la ristra teporal local y con "etiquetas". Podrías querer presentarte con la "etiqueta" #presentaciones o #nuevascuentas.'
+      final_step: '¡Empieza a publicar! Incluso sin seguidores, tus mensajes públicos pueden ser vistos por otros, por ejemplo en la linea de tiempo local y con "hashtags". Podrías querer introducirte con el "hashtag" #introductions.'
       full_handle: Su sobrenombre completo
       full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia.
       review_preferences_action: Cambiar preferencias
       review_preferences_step: Asegúrate de poner tus preferencias, como que correos te gustaría recibir, o que nivel de privacidad te gustaría que tus publicaciones tengan por defecto. Si no tienes mareos, podrías elegir habilitar la reproducción automática de "GIFs".
-      subject: Bienvenido a Mastodonte
-      tip_federated_timeline: La cronología federada es una vista de la red de Mastodonte. Pero solo incluye gente que tus vecinos están siguiendo, así que no está completa.
-      tip_following: Sigues a tus administradores de servidor por defecto. Para encontrar más gente interesante, revisa las cronologías local y federada.
-      tip_local_timeline: La cronología local is una vista de la gente en %{instance}. Estos son tus vecinos inmediatos!
+      subject: Bienvenido a Mastodon
+      tip_federated_timeline: La línea de tiempo federada es una vista de la red de Mastodon. Pero solo incluye gente que tus vecinos están siguiendo, así que no está completa.
+      tip_following: Sigues a tus administradores de servidor por defecto. Para encontrar más gente interesante, revisa las lineas de tiempo local y federada.
+      tip_local_timeline: La linea de tiempo local is una vista de la gente en %{instance}. Estos son tus vecinos inmediatos!
       tip_mobile_webapp: Si el navegador de tu dispositivo móvil ofrece agregar Mastodon a tu página de inicio, puedes recibir notificaciones. Actúa como una aplicación nativa en muchas formas!
       tips: Consejos
       title: Te damos la bienvenida a bordo, %{name}!
@@ -1231,5 +1254,5 @@ es:
     seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles.
     signed_in_as: 'Sesión iniciada como:'
   verification:
-    explanation_html: 'Puedes <strong> verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil </strong>. Para eso, el sitio vinculado debe contener un vínculo a tu perfil de Mastodonte. El vínculo en tu sitio <strong> debe </strong> tener un atributo <code> rel="me"</code>. El texto del vínculo no importa. Aquí un ejemplo:'
+    explanation_html: 'Puedes <strong> verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil </strong>. Para eso, el sitio vinculado debe contener un vínculo a tu perfil de Mastodon. El vínculo en tu sitio <strong> debe </strong> tener un atributo <code> rel="me"</code>. El texto del vínculo no importa. Aquí un ejemplo:'
     verification: Verificación
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 999772cfe..e3cedee53 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -198,11 +198,13 @@ eu:
         change_email_user: "%{name}(e)k %{target}(r)en e-mail helbidea aldatu du"
         confirm_user: "%{name}(e)k %{target}(r)en e-mail helbidea berretsi du"
         create_account_warning: "%{name}-k abisua bidali dio %{target}-ri"
+        create_announcement: "%{name}(e)k %{target}(e)rako iragarpen berria sortu du"
         create_custom_emoji: "%{name}(e)k emoji berria kargatu du %{target}"
         create_domain_allow: "%{name}(e)k %{target} domeinua zerrenda zurian zartu du"
         create_domain_block: "%{name}(e)k %{target} domeinua blokeatu du"
         create_email_domain_block: "%{name}(e)k %{target} e-mail helbideen domeinua zerrenda beltzean sartu du"
         demote_user: "%{name}(e)k %{target} mailaz jaitsi du"
+        destroy_announcement: "%{name}(e)k %{target}(e)rako iragarpena kendu du"
         destroy_custom_emoji: "%{name} erabiltzaileak %{target} emojia suntsitu du"
         destroy_domain_allow: "%{name}(e)k %{target} domeinua zerrenda zuritik kendu du"
         destroy_domain_block: "%{name}(e)k %{target} domeinua desblokeatu du"
@@ -224,10 +226,22 @@ eu:
         unassigned_report: "%{name}(e)k %{target} txotenaren esleipena atzera bota du"
         unsilence_account: "%{name}(e)k %{target} isilarazteko agindua kendu du"
         unsuspend_account: "%{name}(e)k %{target} kontuaren kanporaketa atzera bota du"
+        update_announcement: "%{name}(e)k %{target}(e)rako iragarpena eguneratu du du"
         update_custom_emoji: "%{name}(e)k %{target} emoji-a eguneratu du"
         update_status: "%{name} (e)k %{target}(r)en mezua aldatu du"
       deleted_status: "(ezabatutako mezua)"
       title: Auditoria-egunkaria
+    announcements:
+      edit:
+        title: Editatu iragarpena
+      empty: Ez da iragarpenik aurkitu.
+      live: Zuzenean
+      new:
+        create: Sortu iragarpena
+        title: Iragarpen berria
+      published: Argitaratua
+      time_range: Denbora-tartea
+      title: Iragarpenak
     custom_emojis:
       assign_category: Esleitu kategoria
       by_domain: Domeinua
@@ -372,6 +386,8 @@ eu:
       title: Gonbidapenak
     pending_accounts:
       title: Zain dauden kontuak (%{count})
+    relationships:
+      title: "%{acct}(e)ren erlazioak"
     relays:
       add_new: Gehitu hari errelea
       delete: Ezabatu
@@ -655,6 +671,9 @@ eu:
     hint_html: "<strong>Oharra:</strong> Ez dizugu pasahitza berriro eskatuko ordu batez."
     invalid_password: Pasahitz baliogabea
     prompt: Berretsi pasahitza jarraitzeko
+  date:
+    formats:
+      default: "%Y(e)ko %b %d"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -731,6 +750,7 @@ eu:
     hint_html: "<strong>Zer dira nabarmendutako traolak?</strong> Zure profilean toki nabarmendu batean agertzen dira eta jendeari traola hau daukaten mezu publikoak arakatzea ahalbidetzen diote. Sormen lana edo epe luzerako proiektuak jarraitzeko primerakoak dira."
   filters:
     contexts:
+      account: Profilak
       home: Hasierako denbora-lerroa
       notifications: Jakinarazpenak
       public: Denbora-lerro publikoak
@@ -755,6 +775,8 @@ eu:
     all: Denak
     changes_saved_msg: Aldaketak ongi gorde dira!
     copy: Kopiatu
+    delete: Ezabatu
+    edit: Editatu
     no_batch_actions_available: Ez dago ekintza masiborik orri honetan eskuragarri
     order_by: Ordenatze-irizpidea
     save_changes: Gorde aldaketak
@@ -926,11 +948,15 @@ eu:
     other: Denetarik
     posting_defaults: Bidalketarako lehenetsitakoak
     public_timelines: Denbora-lerro publikoak
+  reactions:
+    errors:
+      unrecognized_emoji: ez da emoji ezaguna
   relationships:
     activity: Kontuaren aktibitatea
     dormant: Ez aktiboa
     followers: Jarraitzaileak
     following: Jarraitzen
+    invited: Gonbidatuta
     last_active: Azkenekoz aktiboa
     most_recent: Azkenak
     moved: Lekuz aldatua
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 9f0e2f948..d83192ad5 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -200,11 +200,13 @@ hu:
         change_email_user: "%{name} megváltoztatta %{target} felhasználó e-mail címét"
         confirm_user: "%{name} megerősítette e-mail címét: %{target}"
         create_account_warning: "%{name} figyelmeztetést küldött %{target} felhasználónak"
+        create_announcement: "%{name} új közleményt hozott létre %{target}"
         create_custom_emoji: "%{name} új emojit töltött fel: %{target}"
         create_domain_allow: "%{name} engedélyező listára vette %{target} domaint"
         create_domain_block: "%{name} letiltotta az alábbi domaint: %{target}"
         create_email_domain_block: "%{name} feketelistára tette az alábbi e-mail domaint: %{target}"
         demote_user: "%{name} lefokozta az alábbi felhasználót: %{target}"
+        destroy_announcement: "%{name} törölte a közleményt %{target}"
         destroy_custom_emoji: "%{name} törölte az emojit: %{target}"
         destroy_domain_allow: "%{name} leszedte %{target} domaint az engedélyező listáról"
         destroy_domain_block: "%{name} engedélyezte az alábbi domaint: %{target}"
@@ -226,10 +228,22 @@ hu:
         unassigned_report: "%{name} törölte a %{target} bejelentés hozzárendelését"
         unsilence_account: "%{name} feloldotta a némítást %{target} felhasználói fiókján"
         unsuspend_account: "%{name} feloldotta %{target} felhasználói fiókjának felfüggesztését"
+        update_announcement: "%{name} frissítette a közleményt %{target}"
         update_custom_emoji: "%{name} frissítette az alábbi emojit: %{target}"
         update_status: "%{name} frissítette %{target} felhasználó tülkjét"
       deleted_status: "(törölt tülk)"
       title: Audit napló
+    announcements:
+      edit:
+        title: Közlemény szerkesztése
+      empty: Nincs közlemény.
+      live: Élő
+      new:
+        create: Közlemény létrehozása
+        title: Új közlemény
+      published: Közzétéve
+      time_range: Időintervallum
+      title: Közlemények
     custom_emojis:
       assign_category: Kategóriák
       by_domain: Domain
@@ -374,6 +388,8 @@ hu:
       title: Meghívások
     pending_accounts:
       title: Függőben lévő fiókok (%{count})
+    relationships:
+      title: "%{acct} kapcsolatai"
     relays:
       add_new: Új relé hozzáadása
       delete: Törlés
@@ -657,6 +673,9 @@ hu:
     hint_html: "<strong>Hasznos:</strong> Nem fogjuk megint a jelszavadat kérdezni a következő órában."
     invalid_password: Érvénytelen jelszó
     prompt: Add meg a jelszót a folytatáshoz
+  date:
+    formats:
+      default: "%Y.%b.%d."
   datetime:
     distance_in_words:
       about_x_hours: "%{count}ó"
@@ -733,6 +752,7 @@ hu:
     hint_html: "<strong>Mik a kiemelt hashtagek?</strong> Ezek állandóan megjelennek a nyilvános profilodon és lehetővé teszik, hogy mások kifejezetten az ezekhez tartozó tülkjeidet böngésszék. Jó eszköz ez kreatív munkák vagy hosszútávú projektek nyomonkövetésére."
   filters:
     contexts:
+      account: Profil
       home: Saját idővonal
       notifications: Értesítések
       public: Nyilvános idővonalak
@@ -757,6 +777,8 @@ hu:
     all: Mind
     changes_saved_msg: A változásokat elmentettük!
     copy: Másolás
+    delete: Törlés
+    edit: Szerkesztés
     no_batch_actions_available: Ezen az oldalon nem elérhetőek kötegelt műveletek
     order_by: Rendezés
     save_changes: Változások mentése
@@ -928,11 +950,15 @@ hu:
     other: Egyéb
     posting_defaults: Tülkölés alapértelmezései
     public_timelines: Nyilvános idővonalak
+  reactions:
+    errors:
+      unrecognized_emoji: nem ismert emoji
   relationships:
     activity: Fiók aktivitás
     dormant: Elhagyott
     followers: Követők
     following: Követve
+    invited: Meghívva
     last_active: Utoljára aktív
     most_recent: Legutóbbi
     moved: Átköltöztetve
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index ce15f4195..1add33a4a 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -194,11 +194,13 @@ ja:
         change_email_user: "%{name} さんが %{target} さんのメールアドレスを変更しました"
         confirm_user: "%{name} さんが %{target} さんのメールアドレスを確認済みにしました"
         create_account_warning: "%{name} さんが %{target} さんに警告メールを送信しました"
+        create_announcement: "%{name} さんが新しいお知らせ %{target} を作成しました"
         create_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を追加しました"
         create_domain_allow: "%{name} さんがドメイン %{target} をドメイン用ホワイトリストに追加しました"
         create_domain_block: "%{name} さんがドメイン %{target} をブロックしました"
         create_email_domain_block: "%{name} さんがドメイン %{target} をメールアドレス用ブラックリストに追加しました"
         demote_user: "%{name} さんが %{target} さんを降格しました"
+        destroy_announcement: "%{name} さんがお知らせ %{target} を削除しました"
         destroy_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を削除しました"
         destroy_domain_allow: "%{name} さんがドメイン %{target} をドメイン用ホワイトリストから外しました"
         destroy_domain_block: "%{name} さんがドメイン %{target} のブロックを外しました"
@@ -220,12 +222,22 @@ ja:
         unassigned_report: "%{name} さんが通報 %{target} の担当を外しました"
         unsilence_account: "%{name} さんが %{target} さんのサイレンスを解除しました"
         unsuspend_account: "%{name} さんが %{target} さんの停止を解除しました"
+        update_announcement: "%{name} さんがお知らせ %{target} を更新しました"
         update_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を更新しました"
         update_status: "%{name} さんが %{target} さんの投稿を更新しました"
       deleted_status: "(削除済)"
       title: 操作履歴
     announcements:
-      title: 告知
+      edit:
+        title: お知らせを編集
+      empty: お知らせはありません
+      live: 公開中
+      new:
+        create: お知らせを作成
+        title: お知らせを追加
+      published: 公開日時
+      time_range: 期間
+      title: お知らせ
     custom_emojis:
       assign_category: カテゴリーを割り当て
       by_domain: ドメイン
@@ -368,6 +380,8 @@ ja:
       title: 招待
     pending_accounts:
       title: 承認待ちアカウント (%{count})
+    relationships:
+      title: "%{acct} さんのフォロー・フォロワー"
     relays:
       add_new: リレーを追加
       delete: 削除
@@ -649,6 +663,9 @@ ja:
     hint_html: 以後 1 時間はパスワードの再入力を求めません
     invalid_password: パスワードが間違っています
     prompt: 続行するにはパスワードを入力してください
+  date:
+    formats:
+      default: "%Y年%m月%d日"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}時間"
@@ -725,6 +742,7 @@ ja:
     hint_html: "<strong>注目のハッシュタグとは?</strong>プロフィールページに目立つ形で表示され、そのハッシュタグのついたあなたの公開投稿だけを抽出して閲覧できるようにします。クリエイティブな仕事や長期的なプロジェクトを追うのに優れた機能です。"
   filters:
     contexts:
+      account: プロフィール
       home: ホームタイムライン
       notifications: 通知
       public: 公開タイムライン
@@ -919,11 +937,16 @@ ja:
     other: その他
     posting_defaults: デフォルトの投稿設定
     public_timelines: 公開タイムライン
+  reactions:
+    errors:
+      limit_reached: リアクションの種類が上限に達しました
+      unrecognized_emoji: 認識できない絵文字
   relationships:
     activity: 活動
     dormant: 非アクティブ
     followers: フォロワー
     following: フォロー中
+    invited: 招待済み
     last_active: 最後の活動
     most_recent: 新着
     moved: 引っ越し済み
@@ -988,7 +1011,7 @@ ja:
       firefox_os: Firefox OS
       ios: iOS
       linux: Linux
-      mac: Mac
+      mac: macOS
       other: 不明なプラットフォーム
       windows: Windows
       windows_mobile: Windows Mobile
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index 74c486ef6..16ddab9c3 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -372,6 +372,8 @@ kk:
       title: Шақырулар
     pending_accounts:
       title: Күтілген аккаунттар (%{count})
+    relationships:
+      title: "%{acct} байланыстары"
     relays:
       add_new: Жаңа арна қосу
       delete: Өшіру
@@ -915,11 +917,15 @@ kk:
     other: Басқа
     posting_defaults: Пост жазу негіздері
     public_timelines: Ашық таймлайндар
+  reactions:
+    errors:
+      limit_reached: Түрлі реакциялар лимиті толды
   relationships:
     activity: Аккаунт белсенділігі
     dormant: Ұйқысыз
     followers: Оқырмандар
     following: Жазылғандары
+    invited: Шақырылды
     last_active: Соңғы белсенділік
     most_recent: Ең соңғы
     moved: Көшірілді
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 21ea5b554..76f4ad4da 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -194,11 +194,13 @@ ko:
         change_email_user: "%{name}이 %{target}의 이메일 주소를 변경했습니다"
         confirm_user: "%{name}이 %{target}의 이메일 주소를 컨펌했습니다"
         create_account_warning: "%{name}가 %{target}에게 경고 보냄"
+        create_announcement: "%{name} 님이 새 공지 %{target}을 만들었습니다"
         create_custom_emoji: "%{name}이 새로운 에모지 %{target}를 추가했습니다"
         create_domain_allow: "%{name} 님이 %{target} 도메인을 화이트리스트에 넣었습니다"
         create_domain_block: "%{name}이 도메인 %{target}를 차단했습니다"
         create_email_domain_block: "%{name}이 이메일 도메인 %{target}를 차단했습니다"
         demote_user: "%{name}이 %{target}을 강등했습니다"
+        destroy_announcement: "%{name} 님이 공지 %{target}을 삭제했습니다"
         destroy_custom_emoji: "%{name}이 %{target} 에모지를 삭제함"
         destroy_domain_allow: "%{name} 님이 %{target} 도메인을 화이트리스트에서 제거하였습니다"
         destroy_domain_block: "%{name}이 도메인 %{target}의 차단을 해제했습니다"
@@ -220,10 +222,22 @@ ko:
         unassigned_report: "%{name}이 리포트 %{target}을 할당 해제했습니다"
         unsilence_account: "%{name}이 %{target}에 대한 침묵을 해제했습니다"
         unsuspend_account: "%{name}이 %{target}에 대한 정지를 해제했습니다"
+        update_announcement: "%{name} 님이 공지 %{target}을 갱신했습니다"
         update_custom_emoji: "%{name}이 에모지 %{target}를 업데이트 했습니다"
         update_status: "%{name}이 %{target}의 상태를 업데이트 했습니다"
       deleted_status: "(삭제됨)"
       title: 감사 기록
+    announcements:
+      edit:
+        title: 공지사항 수정
+      empty: 공지를 찾을 수 없습니다.
+      live: 진행 중
+      new:
+        create: 공지사항 생성
+        title: 새 공지사항
+      published: 발행됨
+      time_range: 시간 범위
+      title: 공지사항
     custom_emojis:
       assign_category: 분류 지정
       by_domain: 도메인
@@ -368,6 +382,8 @@ ko:
       title: 초대
     pending_accounts:
       title: 대기중인 계정 (%{count})
+    relationships:
+      title: "%{acct}의 관계"
     relays:
       add_new: 릴레이 추가
       delete: 삭제
@@ -649,6 +665,9 @@ ko:
     hint_html: "<strong>팁:</strong> 한 시간 동안 다시 암호를 묻지 않을 것입니다."
     invalid_password: 잘못된 암호
     prompt: 계속하려면 암호 확인
+  date:
+    formats:
+      default: "%Y-%b-%d"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}시간"
@@ -725,6 +744,7 @@ ko:
     hint_html: "<strong>추천 해시태그가 무엇이죠?</strong> 당신의 공개 프로필 페이지에 눈에 띄게 표현 되며 사람들이 그 해시태그를 포함한 당신의 글을 찾아 볼 수 있도록 합니다. 창작활동이나 긴 기간을 가지는 프로젝트를 쭉 따라가기에 좋은 도구입니다."
   filters:
     contexts:
+      account: 프로필
       home: 홈 타임라인
       notifications: 알림
       public: 퍼블릭 타임라인
@@ -749,6 +769,8 @@ ko:
     all: 모두
     changes_saved_msg: 정상적으로 변경되었습니다!
     copy: 복사
+    delete: 삭제
+    edit: 수정
     no_batch_actions_available: 이 페이지에서 수행할 수 있는 일괄작업이 없습니다
     order_by: 순서
     save_changes: 변경 사항을 저장
@@ -916,6 +938,10 @@ ko:
     other: 기타
     posting_defaults: 게시물 기본설정
     public_timelines: 공개 타임라인
+  reactions:
+    errors:
+      limit_reached: 다른 리액션 제한에 도달했습니다
+      unrecognized_emoji: 인식 되지 않은 에모지입니다
   relationships:
     activity: 계정 활동
     dormant: 휴면
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index c61523efe..875545c76 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -21,6 +21,9 @@ nn:
     federation_hint_html: Med ein konto på %{instance} kan du fylgja folk på kva som helst slags Mastod-tenar og meir.
     get_apps: Prøv ein mobilapp
     hosted_on: "%{domain} er vert for Mastodon"
+    instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet.
+
+'
     learn_more: Lær meir
     privacy_policy: Personvernsreglar
     see_whats_happening: Sjå kva som skjer
@@ -191,14 +194,17 @@ nn:
       whitelisted: Kvitlista
     action_logs:
       actions:
+        assigned_to_self_report: "%{name} tilegnet rapport %{target} til seg selv"
         change_email_user: "%{name} endra e-postadressa til brukaren %{target}"
         confirm_user: "%{name} stadfesta e-postadressa til brukaren %{target}"
         create_account_warning: "%{name} sende ei åtvaring til %{target}"
+        create_announcement: "%{name} laget en ny kunngjøring %{target}"
         create_custom_emoji: "%{name} lasta opp eit nytt kjensleteikn %{target}"
         create_domain_allow: "%{name} kvitlista domenet %{target}"
         create_domain_block: "%{name} blokkerte domenet %{target}"
         create_email_domain_block: "%{name} svartelista e-postdomenet %{target}"
         demote_user: "%{name} degraderte brukaren %{target}"
+        destroy_announcement: "%{name} slettet kunngjøring %{target}"
         destroy_custom_emoji: "%{name} utsletta kjensleteiknet %{target}"
         destroy_domain_allow: "%{name} fjerna domenet %{target} frå kvitliste"
         destroy_domain_block: "%{name} slutta å blokkera domenet %{target}"
@@ -217,12 +223,25 @@ nn:
         resolve_report: "%{name} løyste ein rapport %{target}"
         silence_account: "%{name} målbatt %{target} sin konto"
         suspend_account: "%{name} utviste %{target} sin konto"
+        unassigned_report: "%{name} avtilegnet rapport %{target}"
         unsilence_account: "%{name} fjernet forstummingen av %{target}s konto"
         unsuspend_account: "%{name} utviste %{target} sin konto"
+        update_announcement: "%{name} oppdaterte kunngjøring %{target}"
         update_custom_emoji: "%{name} oppdaterte kjensleteiknet %{target}"
         update_status: "%{name} oppdaterte status for %{target}"
       deleted_status: "(sletta status)"
       title: Revisionslogg
+    announcements:
+      edit:
+        title: Rediger kunngjøring
+      empty: Ingen kunngjøringer funnet.
+      live: Direkte
+      new:
+        create: Lag kunngjøring
+        title: Ny kunngjøring
+      published: Publisert
+      time_range: Tidsramme
+      title: Kunngjøringer
     custom_emojis:
       assign_category: Vel kategori
       by_domain: Domene
@@ -257,14 +276,17 @@ nn:
       upload: Last opp
     dashboard:
       authorized_fetch_mode: Trygg modus
+      backlog: opphopsloggede jobber
       config: Oppsett
       feature_deletions: Kontoslettingar
       feature_invites: Innbydingar
       feature_profile_directory: Profilmappe
       feature_registrations: Registreringar
+      feature_relay: Føderasjonsoverganger
       feature_spam_check: Søppelvern
       feature_timeline_preview: Førehandsvisning av tidsline
       features: Eigenskapar
+      hidden_service: Føderering med skjulte tjenester
       open_reports: opne rapportar
       pending_tags: emneknaggar som ventar på gjennomgang
       pending_users: brukarar som ventar på gjennomgang
@@ -290,6 +312,7 @@ nn:
       created_msg: Domeneblokkering blir nå behandlet
       destroyed_msg: Domeneblokkering har nå blitt angret
       domain: Domene
+      edit: Rediger domeneblokkering
       existing_domain_block_html: Du har allerede pålagt strengere begrensninger på %{name}, du kan være nødt til <a href="%{unblock_url}">oppheve blokkeringen av den</a> først.
       new:
         create: Lag blokkering
@@ -301,7 +324,9 @@ nn:
           suspend: Utvis
         title: Ny domeneblokkering
       private_comment: Privat kommentar
+      private_comment_hint: Kommenter angående denne domenebegrensningen for internt bruk av moderatorene.
       public_comment: Offentleg kommentar
+      public_comment_hint: Kommenter angående denne domenebegrensningen for offentligheten, hvis publisering av domenebegrensningslisten er slått på.
       reject_media: Avvis mediefiler
       reject_media_hint: Fjernar mediefiler som er lagra lokalt og nektar å lasta ned andre i framtida. Har ikkje noko å seia for utvisingar
       reject_reports: Avvis rapportar
@@ -321,12 +346,14 @@ nn:
         title: Angre domeneblokkering for %{domain}
         undo: Angr
       undo: Angre
+      view: Vis domeneblokkering
     email_domain_blocks:
       add_new: Lag ny
       created_msg: E-postdomenet ble lagt til i blokkeringslisten uten problemer
       delete: Slett
       destroyed_msg: E-postdomenet har blitt fjernet fra blokkeringslisten uten problemer
       domain: Domene
+      empty: Ingen e-mail-domener er sortelistet på dette tidspunkt.
       new:
         create: Legg til domene
         title: Ny blokkeringsoppføring av e-postdomene
@@ -359,15 +386,19 @@ nn:
       title: Innbydingar
     pending_accounts:
       title: Kontoar som ventar (%{count})
+    relationships:
+      title: "%{acct} sitt forhold"
     relays:
       add_new: Legg til ny overgang
       delete: Slett
+      description_html: En <strong>federert overgang</strong> er en mellomleddsserver som utveksler store mengder av offentlige tuter mellom servere som abonnerer og publiserer til den. <strong>Det kan hjelpe små og mellomstore servere til å oppdage innhold fra strømiverset</strong>, noe som ellers ville ha krevd at lokale brukere manuelt fulgte andre personer på fjerne servere.
       disable: Slå av
       disabled: Slege av
       enable: Slå på
       enable_hint: Når dette har blitt skrudd på, vil tjeneren din abonnere på alle offentlige tuter fra denne overgangen, og vil begynne å sende denne tjenerens offentlige tuter til den.
       enabled: Skrudd på
       inbox_url: Overførings-URL
+      pending: Avventer overgangens godkjenning
       save_and_enable: Lagr og slå på
       setup: Sett opp en overgangsforbindelse
       signatures_not_enabled: Overganger vil ikke fungere riktig mens sikkermodus eller hvitelistingsmodus er skrudd på
@@ -388,6 +419,7 @@ nn:
       are_you_sure: Er du sikker?
       assign_to_self: Tilegn til meg
       assigned: Tilsett moderator
+      by_target_domain: Domenet av rapportert bruker
       comment:
         none: Ingen
       created_at: Rapportert
@@ -398,6 +430,7 @@ nn:
         create_and_resolve: Løys med merknad
         create_and_unresolve: Opn på nytt med merknad
         delete: Slett
+        placeholder: Beskriv hvilke handlinger som har blitt tatt, eller andre relaterte oppdateringer...
       reopen: Opn rapport igjen
       report: 'Rapporter #%{id}'
       reported_account: Rapportert konto
@@ -420,6 +453,7 @@ nn:
         email: Offentleg e-postadresse
         username: Brukarnamn for kontakt
       custom_css:
+        desc_html: Modifiser utseendet med CSS lastet på hver side
         title: Eigen CSS
       default_noindex:
         desc_html: Påverkar alle brukarar som ikkje har justert denne innstillinga sjølve
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 12772f335..fed806d56 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -21,6 +21,9 @@
     federation_hint_html: Med en konto på %{instance} vil du kunne følge folk på enhver Mastodon-tjener, og mer til.
     get_apps: Prøv en mobilapp
     hosted_on: Mastodon driftet på %{domain}
+    instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet.
+
+'
     learn_more: Lær mer
     privacy_policy: Privatlivsretningslinjer
     see_whats_happening: Se hva som skjer
@@ -47,6 +50,8 @@
     what_is_mastodon: Hva er Mastodon?
   accounts:
     choices_html: "%{name} sine anbefalte:"
+    endorsements_hint: Du kan fremheve personer du følger fra nettgrensesnittet som deretter vil bli vist her.
+    featured_tags_hint: Du kan fremheve spesifikke emneknagger som vil bli vist her.
     follow: Følg
     followers:
       one: Følger
@@ -54,6 +59,7 @@
     following: Følger
     joined: Ble med den %{date}
     last_active: senest aktiv
+    link_verified_on: Eierskap av denne lenken ble sjekket %{date}
     media: Media
     moved_html: "%{name} har flyttet til %{new_profile_link}:"
     network_hidden: Denne informasjonen er ikke tilgjengelig
@@ -61,6 +67,8 @@
     nothing_here: Det er ingenting her!
     people_followed_by: Folk som %{name} følger
     people_who_follow: Folk som følger %{name}
+    pin_errors:
+      following: Du må allerede følge personen du vil fremheve
     posts:
       one: Tut
       other: Tuter
@@ -136,6 +144,7 @@
       moderation_notes: Moderasjonsnotater
       most_recent_activity: Nyligste aktivitet
       most_recent_ip: Nyligste IP
+      no_account_selected: Ingen brukere ble forandret da ingen var valgt
       no_limits_imposed: Ingen grenser er tatt i bruk
       not_subscribed: Ikke abonnért
       pending: Avventer gjennomgang
@@ -173,6 +182,7 @@
       statuses: Statuser
       subscribe: Abonnere
       suspended: Suspendert
+      time_in_queue: Venter i kø %{time}
       title: Kontoer
       unconfirmed_email: Ubekreftet E-postadresse
       undo_silenced: Angre målbinding
@@ -184,13 +194,17 @@
       whitelisted: Hvitelistet
     action_logs:
       actions:
+        assigned_to_self_report: "%{name} tilegnet rapport %{target} til seg selv"
+        change_email_user: "%{name} forandret e-postadressen for bruker %{target}"
         confirm_user: "%{name} bekreftet e-postadresse for bruker %{target}"
         create_account_warning: "%{name} sendte en advarsel til %{target}"
+        create_announcement: "%{name} laget en ny kunngjøring %{target}"
         create_custom_emoji: "%{name} lastet opp ny emoji %{target}"
         create_domain_allow: "%{name} hvitelistet domenet %{target}"
         create_domain_block: "%{name} blokkerte domenet %{target}"
         create_email_domain_block: "%{name} svartelistet e-postdomenet %{target}"
         demote_user: "%{name} degraderte bruker %{target}"
+        destroy_announcement: "%{name} slettet kunngjøring %{target}"
         destroy_custom_emoji: "%{name} ødela emojien %{target}"
         destroy_domain_allow: "%{name} fjernet domenet %{target} fra hvitelisten"
         destroy_domain_block: "%{name} fjernet blokkeringen av domenet %{target}"
@@ -209,12 +223,25 @@
         resolve_report: "%{name} avviste rapporten %{target}"
         silence_account: "%{name} forstummet %{target}s konto"
         suspend_account: "%{name} suspendert %{target}s konto"
+        unassigned_report: "%{name} avtilegnet rapport %{target}"
         unsilence_account: "%{name} fjernet forstummingen av %{target}s konto"
         unsuspend_account: "%{name} opphevde suspenderingen av %{target}s konto"
+        update_announcement: "%{name} oppdaterte kunngjøring %{target}"
         update_custom_emoji: "%{name} oppdaterte emoji %{target}"
         update_status: "%{name} oppdaterte status for %{target}"
       deleted_status: "(statusen er slettet)"
       title: Revisionslogg
+    announcements:
+      edit:
+        title: Rediger kunngjøring
+      empty: Ingen kunngjøringer funnet.
+      live: Direkte
+      new:
+        create: Lag kunngjøring
+        title: Ny kunngjøring
+      published: Publisert
+      time_range: Tidsramme
+      title: Kunngjøringer
     custom_emojis:
       assign_category: Tilegn kategori
       by_domain: Domene
@@ -249,17 +276,23 @@
       upload: Last opp
     dashboard:
       authorized_fetch_mode: Sikkermodus
+      backlog: opphopsloggede jobber
       config: Oppsett
       feature_deletions: Kontoslettinger
       feature_invites: Invitasjonslenker
       feature_profile_directory: Profilmappe
       feature_registrations: Registreringer
+      feature_relay: Føderasjonsoverganger
       feature_spam_check: Anti-spam
       feature_timeline_preview: Tidslinje-forhåndsvisning
       features: Egenskaper
+      hidden_service: Føderering med skjulte tjenester
       open_reports: åpne rapporter
+      pending_tags: emneknagger som venter gjennomgang
+      pending_users: brukere som venter gjennomgang
       recent_users: Nylige brukere
       search: Fulltekstsøk
+      single_user_mode: Enpersons-modus
       software: Programvare
       space: Plassbruk
       title: Kontrollpanel
@@ -271,12 +304,15 @@
       whitelist_mode: Hvitelistemodus
     domain_allows:
       add_new: Hvitelist domene
+      created_msg: Domenet har blitt hvitelistet
+      destroyed_msg: Domenet har blitt fjernet fra hvitelisten
       undo: Fjern fra hvitelisten
     domain_blocks:
       add_new: Lag ny
       created_msg: Domeneblokkering blir nå behandlet
       destroyed_msg: Domeneblokkering har nå blitt angret
       domain: Domene
+      edit: Rediger domeneblokkering
       existing_domain_block_html: Du har allerede pålagt strengere begrensninger på %{name}, du kan være nødt til <a href="%{unblock_url}">oppheve blokkeringen av den</a> først.
       new:
         create: Lag blokkering
@@ -288,10 +324,13 @@
           suspend: Utvis
         title: Ny domeneblokkering
       private_comment: Privat kommentar
+      private_comment_hint: Kommenter angående denne domenebegrensningen for internt bruk av moderatorene.
       public_comment: Offentlig kommentar
+      public_comment_hint: Kommenter angående denne domenebegrensningen for offentligheten, hvis publisering av domenebegrensningslisten er slått på.
       reject_media: Avvis mediefiler
       reject_media_hint: Fjerner lokalt lagrede mediefiler og nekter å laste dem ned i fremtiden. Irrelevant for utvisninger
       reject_reports: Avslå rapporter
+      reject_reports_hint: Ignorer alle rapporter som kommer fra dette domenet. Irrelevant for utvisninger
       rejecting_media: avviser mediafiler
       rejecting_reports: avslår rapporter
       severity:
@@ -307,12 +346,14 @@
         title: Angre domeneblokkering for %{domain}
         undo: Angre
       undo: Angre
+      view: Vis domeneblokkering
     email_domain_blocks:
       add_new: Lag ny
       created_msg: E-postdomenet ble lagt til i blokkeringslisten uten problemer
       delete: Fjern
       destroyed_msg: E-postdomenet har blitt fjernet fra blokkeringslisten uten problemer
       domain: Domene
+      empty: Ingen e-mail-domener er sortelistet på dette tidspunkt.
       new:
         create: Legg til domene
         title: Ny blokkeringsoppføring av e-postdomene
@@ -343,20 +384,29 @@
         expired: Utløpt
         title: Filtrer
       title: Invitasjoner
+    pending_accounts:
+      title: Avventende brukere (%{count})
+    relationships:
+      title: "%{acct} sitt forhold"
     relays:
       add_new: Legg til ny overgang
       delete: Slett
+      description_html: En <strong>federert overgang</strong> er en mellomleddsserver som utveksler store mengder av offentlige tuter mellom servere som abonnerer og publiserer til den. <strong>Det kan hjelpe små og mellomstore servere til å oppdage innhold fra strømiverset</strong>, noe som ellers ville ha krevd at lokale brukere manuelt fulgte andre personer på fjerne servere.
       disable: Skru av
       disabled: Skrudd av
       enable: Skru på
       enable_hint: Når dette har blitt skrudd på, vil tjeneren din abonnere på alle offentlige tuter fra denne overgangen, og vil begynne å sende denne tjenerens offentlige tuter til den.
       enabled: Skrudd på
       inbox_url: Overførings-URL
+      pending: Avventer overgangens godkjenning
       save_and_enable: Lagre og skru på
       setup: Sett opp en overgangsforbindelse
       signatures_not_enabled: Overganger vil ikke fungere riktig mens sikkermodus eller hvitelistingsmodus er skrudd på
       status: Status
       title: Overganger
+    report_notes:
+      created_msg: Rapportnotat opprettet!
+      destroyed_msg: Rapportnotat slettet!
     reports:
       account:
         notes:
@@ -369,6 +419,7 @@
       are_you_sure: Er du sikker?
       assign_to_self: Tilegn til meg
       assigned: Tilegnet moderator
+      by_target_domain: Domenet av rapportert bruker
       comment:
         none: Ingen
       created_at: Rapportert
@@ -376,12 +427,16 @@
       mark_as_unresolved: Merk som uoppklart
       notes:
         create: Legg til notat
+        create_and_resolve: Løst med notat
+        create_and_unresolve: Gjenåpne med notat
         delete: Slett
+        placeholder: Beskriv hvilke handlinger som har blitt tatt, eller andre relaterte oppdateringer...
       reopen: Gjenåpne rapporten
       report: 'Rapporter #%{id}'
       reported_account: Rapportert konto
       reported_by: Rapportert av
       resolved: Løst
+      resolved_msg: Rapport løst!
       status: Status
       title: Rapporter
       unassign: Fjern tilegning
@@ -398,6 +453,7 @@
         email: Skriv en offentlig e-postadresse
         username: Skriv brukernavn
       custom_css:
+        desc_html: Modifiser utseendet med CSS lastet på hver side
         title: Egendefinert CSS
       domain_blocks:
         all: Til alle
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index bd019ee17..47bd8e92e 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -206,11 +206,13 @@ ru:
         change_email_user: "%{name} сменил(а) e-mail пользователя %{target}"
         confirm_user: "%{name} подтвердил(а) e-mail адрес пользователя %{target}"
         create_account_warning: "%{name} выдал(а) предупреждение %{target}"
+        create_announcement: "%{name} содал новое объявление %{target}"
         create_custom_emoji: "%{name} загрузил(а) новый эмодзи %{target}"
         create_domain_allow: "%{name} внес(ла) домен %{target} в белый список"
         create_domain_block: "%{name} заблокировал(а) домен %{target}"
         create_email_domain_block: "%{name} добавил(а) e-mail домен %{target} в чёрный список"
         demote_user: "%{name} разжаловал(а) пользователя %{target}"
+        destroy_announcement: "%{name} удалил объявление %{target}"
         destroy_custom_emoji: "%{name} измельчил(а) эмодзи %{target} в пыль"
         destroy_domain_allow: "%{name} убрал домен %{target} из белого списка"
         destroy_domain_block: "%{name} разблокировал(а) домен %{target}"
@@ -232,10 +234,22 @@ ru:
         unassigned_report: "%{name} сняла назначение жалобы %{target}"
         unsilence_account: "%{name} снял ограничения видимости постов пользователя %{target}"
         unsuspend_account: "%{name} снял(а) блокировку с пользователя %{target}"
+        update_announcement: "%{name} обновил объявление %{target}"
         update_custom_emoji: "%{name} обновил(а) эмодзи %{target}"
         update_status: "%{name} изменил(а) пост пользователя %{target}"
       deleted_status: "(удалённый пост)"
       title: Журнал событий
+    announcements:
+      edit:
+        title: Редактировать объявление
+      empty: Объявления не найдены.
+      live: В эфире
+      new:
+        create: Создать объявление
+        title: Новое объявление
+      published: Опубликованные
+      time_range: Временной диапазон
+      title: Объявления
     custom_emojis:
       assign_category: Задать категорию
       by_domain: Домен
@@ -678,6 +692,9 @@ ru:
     hint_html: "<strong>Подсказка</strong>: мы не будем спрашивать пароль повторно в течение часа."
     invalid_password: Неверный пароль
     prompt: Введите пароль для продолжения
+  date:
+    formats:
+      default: "%d %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}ч"
@@ -779,6 +796,8 @@ ru:
     all: Любой
     changes_saved_msg: Изменения успешно сохранены!
     copy: Копировать
+    delete: Удалить
+    edit: Изменить
     no_batch_actions_available: На этой странице нет запланированных действий
     order_by: Сортировка
     save_changes: Сохранить изменения
@@ -958,6 +977,10 @@ ru:
     other: Всё остальное
     posting_defaults: Настройки отправки по умолчанию
     public_timelines: Публичные ленты
+  reactions:
+    errors:
+      limit_reached: Достигнут лимит разных реакций
+      unrecognized_emoji: не является распознанным эмодзи
   relationships:
     activity: Активность учётной записи
     dormant: Заброшенная
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index d43ab04fe..e91b74f85 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -14,6 +14,12 @@ ca:
         text_html: Opcional. Pots utilitzar tota la sintaxi. Pots <a href="%{path}">afegir configuracions predefinides d'avís</a> per a estalviar temps
         type_html: Tria què fer amb <strong>%{acct}</strong>
         warning_preset_id: Opcional. Encara pots afegir text personalitzat al final de la configuració predefinida
+      announcement:
+        all_day: Si es marca, només es mostraran les dates de l'interval de temps
+        ends_at: Opcional. En aquest moment, l’anunci deixarà automàticament d'estar publicat
+        scheduled_at: Deixa-ho en blanc per a publicar l’anunci immediatament
+        starts_at: Opcional. En el cas que el teu anunci estigui vinculat a un interval de temps específic
+        text: Pots utilitzar sintaxi d'un tut. Tingues en compte l’espai que l’anunci ocuparà a la pantalla de l’usuari
       defaults:
         autofollow: Les persones que es registrin a través de la invitació et seguiran automàticament
         avatar: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px
@@ -83,6 +89,12 @@ ca:
           silence: Silenci
           suspend: Suspèn i elimina irreversiblement les dades del compte
         warning_preset_id: Utilitza una configuració predefinida d'avís
+      announcement:
+        all_day: Esdeveniment de tot el dia
+        ends_at: Fi del esdeveniment
+        scheduled_at: Programa la publicació
+        starts_at: Inici del esdeveniment
+        text: Anunci
       defaults:
         autofollow: Convida a seguir el teu compte
         avatar: Avatar
diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml
index 7ffc8fe3d..f4737069b 100644
--- a/config/locales/simple_form.co.yml
+++ b/config/locales/simple_form.co.yml
@@ -14,6 +14,12 @@ co:
         text_html: In uzzione. Pudete utilizà a sintassa di i statuti. Pudete ancu <a href="%{path}">aghjustà preselezzione d'avertimentu</a> per piglià tempu
         type_html: Sceglie chì fà cù <strong>%{acct}</strong>
         warning_preset_id: In uzzione. Pudete sempre aghjustà un testu persunalizatu à a fine di a preselezzione
+      announcement:
+        all_day: Sole e date da st'intervallu di tempu saranu mustrate
+        ends_at: In uzzione. L'annunziu sarà autumaticamente piattatu dop'à sta data
+        scheduled_at: Lasciate viotu per pubblicà l'annunziu avà
+        starts_at: In uzzione. S'e l'annunziu hè ligatu à un'intervallu di tempu specificu
+        text: Pudete utilizà a sintassa di i statuti. Pensate à a piazza chì l'annunziu hà da piglià nant'à u screnu di l'utilizatore
       defaults:
         autofollow: Quelli·e chì s'arregistranu cù l'invitazione saranu autumaticamente abbunati·e à voi
         avatar: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px
@@ -83,6 +89,12 @@ co:
           silence: Silenzà
           suspend: Suspende è sguassà i dati di u contu di manera irreversibile
         warning_preset_id: Utilizà un'avertimentu preselezziunatu
+      announcement:
+        all_day: Tutta a ghjurnata
+        ends_at: Fine di l'avvenimentu
+        scheduled_at: Pianificà publicazione
+        starts_at: Principiu di l'avvenimentu
+        text: Annunziu
       defaults:
         autofollow: Invità à siguità u vostru contu
         avatar: Ritrattu di prufile
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 06482ebd0..532950a31 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -83,6 +83,10 @@ cs:
           silence: Ztišit
           suspend: Pozastavit účet a nenávratně smazat jeho data
         warning_preset_id: Použít předlohu pro varování
+      announcement:
+        all_day: Celodenní událost
+        scheduled_at: Naplánovat zveřejnění
+        starts_at: Začátek události
       defaults:
         autofollow: Pozvat ke sledování vašeho účtu
         avatar: Avatar
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index de6083e18..231c32959 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -14,6 +14,12 @@ el:
         text_html: Προαιρετικό. Μπορείς να χρησιμοποιήσεις συντακτικό ενός τουτ. Μπορείς να <a href="%{path}">ορίσεις προκαθορισμένες προειδοποιήσεις</a> για να γλυτώσεις χρόνο
         type_html: Διάλεξε τι θα κανείς με τον  <strong>%{acct}</strong>
         warning_preset_id: Προαιρετικό. Μπορείς να προσθέσεις επιπλέον κείμενο μετά το προκαθορισμένο κείμενο
+      announcement:
+        all_day: Όταν είναι επιλεγμένο, θα εμφανίζονται μόνο οι ημερομηνίες εντός της χρονικής διάρκειας
+        ends_at: Προαιρετικό. Η ανακοίνωση θα αποσυρθεί αυτόματα τη δηλωμένη ώρα
+        scheduled_at: Αν μείνει κενό, η ενημέρωση θα δημοσιευτεί αμέσως
+        starts_at: Προαιρετικό, για την περίπτωση που η ανακοίνωση αφορά συγκεκριμένη χρονική διάρκεια
+        text: Δεκτό το συντακτικό των τουτ. Παρακαλούμε έχε υπόψιν σου το χώρο που θα καταλάβει η ανακοίνωση στην οθόνη του χρήστη
       defaults:
         autofollow: Όσοι εγγραφούν μέσω της πρόσκλησης θα σε ακολουθούν αυτόματα
         avatar: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px
@@ -83,6 +89,12 @@ el:
           silence: Αποσιώπηση
           suspend: Αναστολή και αμετάκλητη διαγραφή στοιχείων λογαριασμού
         warning_preset_id: Χρήση προκαθορισμένης προειδοποίησης
+      announcement:
+        all_day: Ολοήμερο γεγονός
+        ends_at: Λήξη γεγονότος
+        scheduled_at: Προγραμματισμένη δημοσίευση
+        starts_at: Έναρξη γεγονότος
+        text: Ανακοίνωση
       defaults:
         autofollow: Προσκάλεσε για να ακολουθήσουν το λογαριασμό σου
         avatar: Αβατάρ
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index c62ded28b..78bb3e275 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -14,6 +14,12 @@ es-AR:
         text_html: Opcional. Podés usar sintaxis de toots. Podés <a href="%{path}">agregar preajustes de advertencia</a> para ahorrar tiempo.
         type_html: Elegí qué hacer con <strong>%{acct}</strong>
         warning_preset_id: Opcional. Todavía podés agregar texto personalizado al final del preajuste
+      announcement:
+        all_day: Cuando esté seleccionado, sólo se mostrarán las fechas del rango de tiempo
+        ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento
+        scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente
+        starts_at: Opcional. En caso de que tu anuncio esté vinculado a un rango de tiempo específico
+        text: Podés usar la sintaxis de toot. Por favor, tené en cuenta el espacio que ocupará el anuncio en la pantalla del usuario
       defaults:
         autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente
         avatar: 'PNG, GIF o JPG. Máximo: %{size}. Será subescalado a %{dimensions} píxeles.'
@@ -83,6 +89,12 @@ es-AR:
           silence: Silenciar
           suspend: Suspender y eliminar de forma irreversible los datos de la cuenta
         warning_preset_id: Usar un texto predeterminado
+      announcement:
+        all_day: Evento de todo el día
+        ends_at: Fin del evento
+        scheduled_at: Programar publicación
+        starts_at: Comienzo del evento
+        text: Anuncio
       defaults:
         autofollow: Invitar para seguir tu cuenta
         avatar: Avatar
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 20467dba4..745de3332 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -14,6 +14,12 @@ es:
         text_html: Opcional. Puede usar sintaxis de toots. Puede añadir <a href="%{path}">configuraciones predefinidas de advertencia</a> para ahorrar tiempo
         type_html: Elige qué hacer con <strong>%{acct}</strong>
         warning_preset_id: Opcional. Aún puede añadir texto personalizado al final de la configuración predefinida
+      announcement:
+        all_day: Cuando está seleccionado solo se mostrarán las fechas del rango de tiempo
+        ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento
+        scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente
+        starts_at: Opcional. En caso de que su anuncio esté vinculado a un intervalo de tiempo específico
+        text: Puedes usar la sintaxis toot. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario
       defaults:
         autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente
         avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px
@@ -42,7 +48,7 @@ es:
         setting_noindex: Afecta a tu perfil público y páginas de estado
         setting_show_application: La aplicación que utiliza usted para publicar toots se mostrará en la vista detallada de sus toots
         setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles
-        setting_use_pending_items: Ocultar actualizaciones cronológicas tras un clic en lugar de desplazar automáticamente la ristra
+        setting_use_pending_items: Ocultar nuevos estados detrás de un clic en lugar de desplazar automáticamente el feed
         username: Tu nombre de usuario será único en %{domain}
         whole_word: Cuando la palabra clave o frase es solo alfanumérica, solo será aplicado si concuerda con toda la palabra
       domain_allow:
@@ -52,7 +58,7 @@ es:
       form_challenge:
         current_password: Estás entrando en un área segura
       imports:
-        data: Archivo CSV exportado desde otra instancia de Mastodonte
+        data: Archivo CSV exportado desde otra instancia de Mastodon
       invite_request:
         text: Esto nos ayudará a revisar su aplicación
       sessions:
@@ -83,6 +89,12 @@ es:
           silence: Silenciar
           suspend: Suspender y eliminar de forma irreversible la información de la cuenta
         warning_preset_id: Usar un aviso predeterminado
+      announcement:
+        all_day: Evento de todo el día
+        ends_at: Fin del evento
+        scheduled_at: Programar publicación
+        starts_at: Comienzo del evento
+        text: Anuncio
       defaults:
         autofollow: Invitar a seguir tu cuenta
         avatar: Avatar
@@ -110,7 +122,7 @@ es:
         password: Contraseña
         phrase: Palabra clave o frase
         setting_advanced_layout: Habilitar interfaz web avanzada
-        setting_aggregate_reblogs: Agrupar rebarritadas en las cronologías
+        setting_aggregate_reblogs: Agrupar retoots en las líneas de tiempo
         setting_auto_play_gif: Reproducir automáticamente los GIFs animados
         setting_boost_modal: Mostrar ventana de confirmación antes de un Retoot
         setting_crop_images: Recortar a 16x9 las imágenes de los toots no expandidos
@@ -157,7 +169,7 @@ es:
         pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión
         reblog: Enviar correo electrónico cuando alguien comparta su publicación
         report: Enviar un correo cuando se envía un nuevo informe
-        trending_tag: Enviar correo electrónico cuando una etiqueta no revisada es tendencia
+        trending_tag: Enviar correo electrónico cuando una etiqueta no revisada está de tendencia
       tag:
         listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil
         name: Etiqueta
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 1f34adb05..b6253a197 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -14,6 +14,12 @@ eu:
         text_html: Aukerakoa. Toot sintaxia erabili dezakezu. <a href="%{path}">Abisu aurre-ezarpenak</a> gehitu ditzakezu denbora aurrezteko
         type_html: Erabaki zer egin <strong>%{acct}</strong> kontuarekin
         warning_preset_id: Aukerakoa. Zure testua gehitu dezakezu aurre-ezarpenaren ostean
+      announcement:
+        all_day: Markatutakoan soilik denbora barrutiko datak erakutsiko dira
+        ends_at: Aukerakoa. Iragapena une honetan automatikoki desargitaratuko da
+        scheduled_at: Laga hutsik iragarpena berehala argitaratzeko
+        starts_at: Aukerakoa. Zure iragarpena denbora-tarte batera lotuta dagoenerako
+        text: Toot-etako sintaxia erabili dezakezu. Kontuan izan iragarpenak erabiltzailearen pantailan hartuko duen neurria
       defaults:
         autofollow: Gonbidapena erabiliz izena ematen dutenek automatikoki jarraituko dizute
         avatar: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px neurrira eskalatuko da
@@ -83,6 +89,12 @@ eu:
           silence: Isiltarazi
           suspend: Kanporatu eta behin betiko ezabatu kontuko datuak
         warning_preset_id: Erabili aurre-ezarritako abisu bat
+      announcement:
+        all_day: Egun osoko gertaera
+        ends_at: Gertaeraren amaiera
+        scheduled_at: Programatu argitaratzea
+        starts_at: Gertaeraren hasiera
+        text: Iragarpena
       defaults:
         autofollow: Gonbidatu zure kontua jarraitzera
         avatar: Abatarra
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 0af6bd690..d6768a17d 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -13,7 +13,7 @@ gl:
         send_email_notification: A usuaria recibirá unha explicación sobre o que lle aconteceu a súa conta
         text_html: Optativo. Pode utilizar formato no toot. Pode <a href="%{path}">engadir avisos preestablecidos</a> para aforrar tempo
         type_html: Escolla que facer con <strong>%{acct}</strong>
-        warning_preset_id: Optativo. Poderá engadir texto persoalizado ao final do preestablecido
+        warning_preset_id: Optativo. Poderás engadir texto personalizado ao final do preestablecido
       announcement:
         all_day: Cando se marca, só serán amosadas as datas do intre de tempo
         ends_at: Opcional. O anuncio non se publicará de xeito automático neste intre
@@ -21,7 +21,7 @@ gl:
         starts_at: Opcional. No caso de que o teu anuncio estea vinculado a un intre de tempo específico
         text: Podes empregar a sintaxe do toot. Ten en conta o espazo que ocupará o anuncio na pantalla do usuario
       defaults:
-        autofollow: As persoas que se conectaron a través de un convite seguirana automáticamente a vostede
+        autofollow: As persoas que se conectaron a través dun convite seguirante automáticamente
         avatar: PNG, GIF ou JPG.  Máximo %{size}. Será reducida a %{dimensions}px
         bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada
         context: Un ou varios contextos onde se debería aplicar o filtro
@@ -90,7 +90,7 @@ gl:
           suspend: Suspender e eliminar irreversiblemente datos da conta
         warning_preset_id: Utilizar un aviso preestablecido
       announcement:
-        all_day: Acontecemento diario
+        all_day: Evento para todo o día
         ends_at: Final do acontecemento
         scheduled_at: Publicación programada
         starts_at: Comezo do acontecemento
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index 91ecd8746..cee6bdb45 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -14,6 +14,12 @@ hu:
         text_html: Opcionális. A tülk szintaxis használható. Egyszerűsítés végett létre is hozhatsz <a href="%{path}">figyelmeztetéseket</a>
         type_html: Megmondhatod, mi legyen vele <strong>%{acct}</strong>
         warning_preset_id: Opcionális. A figyelmeztetés végére saját szöveget is írhatsz
+      announcement:
+        all_day: Bejelölve csak a dátumok számítanak majd a megadott intervallumból
+        ends_at: Opcionális. A közleményt ekkor automatikusan levesszük
+        scheduled_at: Hagyd üresen, hogy a közleményt azonnal közzétegyük
+        starts_at: Opcionális. Akkor használd, ha a közleményed adott időintervallumra vonatkozik
+        text: Használhatod a tülkök szintaxisát. Ügyelj arra, mennyi helyet foglal el majd a közlemény a felhasználó képernyőjén
       defaults:
         autofollow: Akik meghívón keresztül regisztrálnak, automatikusan követni fognak téged
         avatar: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre
@@ -83,6 +89,12 @@ hu:
           silence: Elnémítás
           suspend: Fiók felfüggesztése, adatok törlése visszaállíthatatlanul
         warning_preset_id: Figyelmeztetés használata
+      announcement:
+        all_day: Egész napos esemény
+        ends_at: Esemény vége
+        scheduled_at: Közlemény időzítése
+        starts_at: Esemény kezdete
+        text: Közlemény
       defaults:
         autofollow: Meghívás a fiókod követésére
         avatar: Profilkép
diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml
index d8b39a4d8..263b749eb 100644
--- a/config/locales/simple_form.id.yml
+++ b/config/locales/simple_form.id.yml
@@ -14,6 +14,12 @@ id:
         text_html: Opsional. Anda dapat memakai sintaks toot. Anda dapat <a href="%{path}">menambahkan preset peringatan</a> untuk hemat waktu
         type_html: Pilih apa yang perlu dilakukan dengan <strong>%{acct}</strong>
         warning_preset_id: Opsional. Anda tetap dapat menambahkan teks kustom pada akhir preset
+      announcement:
+        all_day: Saat dicentang, hanya tanggal dalam rentang waktu tertentu yang akan ditampilkan
+        ends_at: Opsional. Pengumuman akan diterbitkan secara otomatis saat ini
+        scheduled_at: Biarkan kosong jika ingin menerbitkan pengumuman secara langsung
+        starts_at: Opsional. Persiapan jika pengumuman Anda terikat pada rentang waktu tertentu
+        text: Anda dapat menggunakan sintaks toot. Mohon perhatikan ruang pengumuman yang mungkin akan memenuhi layar pengguna
       defaults:
         autofollow: Orang yang ingin mendaftar lewat undangan, otomatis mengikuti Anda
         avatar: PNG, GIF atau JPG. Maksimal %{size}. Ukuran dikecilkan menjadi %{dimensions}px
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 503610652..6da1173ef 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -14,6 +14,12 @@ ja:
         text_html: オプションです。投稿に用いる構文を使うことができます。簡略化のため<a href="%{path}">プリセット警告文を追加</a>することができます
         type_html: "<strong>%{acct}</strong>さんに対し、何を行うか選択してください"
         warning_preset_id: オプションです。プリセット警告文の末尾に任意の文字列を追加することができます
+      announcement:
+        all_day: 選択すると、おしらせ対象の開始および終了日時は日付のみ表示されます
+        ends_at: オプションです。指定すると、お知らせの掲載はその日時で自動的に終了します
+        scheduled_at: お知らせを今すぐ掲載する場合は空欄にしてください
+        starts_at: オプションです。お知らせしたい事柄の期間が決まっている場合に使用します
+        text: トゥートと同じ構文を使用できます。アナウンスが占める画面のスペースに注意してください
       defaults:
         autofollow: 招待から登録した人が自動的にあなたをフォローするようになります
         avatar: "%{size}までのPNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます"
@@ -84,7 +90,11 @@ ja:
           suspend: 停止しアカウントのデータを恒久的に削除する
         warning_preset_id: プリセット警告文を使用
       announcement:
-        text: 告知
+        all_day: 終日
+        ends_at: お知らせ対象の終了日時
+        scheduled_at: 掲載する日時
+        starts_at: おしらせ対象の開始日時
+        text: お知らせ
       defaults:
         autofollow: 招待から参加後、あなたをフォロー
         avatar: アイコン
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index aadec0cac..5f2cccf4a 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -14,6 +14,12 @@ ko:
         text_html: 선택사항. 툿 문법을 사용할 수 있습니다. <a href="%{path}">경고 틀을 추가</a>하여 시간을 절약할 수 있습니다
         type_html: "<strong>%{acct}</strong>에 대해 취할 행동 선택"
         warning_preset_id: 선택사항. 틀의 마지막에 임의의 텍스트를 추가 할 수 있습니다
+      announcement:
+        all_day: 체크 되었을 경우, 그 시간에 속한 날짜들에만 표시됩니다
+        ends_at: 옵션입니다. 공지사항이 이 시간에 자동으로 발행 중지 됩니다
+        scheduled_at: 공백으로 두면 공지사항이 곧바로 발행 됩니다
+        starts_at: 공지사항이 특정한 시간에 종속 될 때를 위한 옵션입니다
+        text: 툿 문법을 사용할 수 있습니다. 공지사항은 사용자의 화면 상단 공간을 차지한다는 것을 명심하세요
       defaults:
         autofollow: 이 초대를 통해 가입하는 사람은 당신을 자동으로 팔로우 하게 됩니다
         avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨
@@ -83,6 +89,12 @@ ko:
           silence: 침묵
           suspend: 정지하고 되돌릴 수 없는 데이터 삭제
         warning_preset_id: 경고 틀 사용하기
+      announcement:
+        all_day: 종일 일정
+        ends_at: 이벤트 종료
+        scheduled_at: 발행 일정
+        starts_at: 이벤트 시작
+        text: 공지사항
       defaults:
         autofollow: 초대를 통한 팔로우
         avatar: 아바타
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index 3016db14d..5fb0e8fce 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -2,21 +2,39 @@
 nn:
   simple_form:
     hints:
+      account_alias:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte fra
+      account_migration:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte til
+      account_warning_preset:
+        text: Du kan bruke tut syntaks, f.eks. URLer, emneknagger og nevnelser
       admin_account_action:
         include_statuses: Brukeren vil se hvilke tuter som forårsaket moderator-handlingen eller -advarselen
+        send_email_notification: Brukeren vil motta en forklaring på hva som har skjedd med deres bruker
+        text_html: Valgfritt. Du kan bruke tut syntaks. Du kan <a href="%{path}">legge til advarsels-forhåndsinnstillinger</a> for å spare tid
         type_html: Velg hva du vil gjøre med <strong>%{acct}</strong>
         warning_preset_id: Valfritt. Du kan leggja inn eigen tekst på enden av føreoppsettet
+      announcement:
+        all_day: Hvis noen av dem er valgt, vil kun datoene av tidsrammen bli vist
+        ends_at: Valgfritt. Kunngjøring vil bli automatisk avpublisert på dette tidspunktet
+        scheduled_at: La stå tomt for å publisere kunngjøringen umiddelbart
+        starts_at: Valgfritt. I tilfellet din kunngjøring er bundet til en spesifikk tidsramme
+        text: Du kan bruke tut syntaks. Vennligst vær oppmerksom på plassen som kunngjøringen vil ta opp på brukeren sin skjerm
       defaults:
         autofollow: Folk som lager en konto gjennom invitasjonen, vil automatisk følge deg
         avatar: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
         bot: Denne kontoen utfører i hovedsak automatiserte handlinger og blir kanskje ikke holdt øye med
+        context: En eller flere sammenhenger der filteret skal gjelde
+        current_password: For sikkerhetsgrunner, vennligst oppgi passordet til den nåværende bruker
         current_username: Skriv inn brukarnamnet til den noverande kontoen for å stadfesta
         digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte
         discoverable: Profilmappen er en annen måte for kontoen din å nå et bredere publikum på
         email: Du får snart ein stadfestings-e-post
         fields: Du kan ha opptil 4 gjenstander vist som en tabell på profilsiden din
         header: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
+        inbox_url: Kopier URLen fra forsiden til overgangen du vil bruke
         irreversible: Filtrerte tuter vil ugjenkallelig forsvinne, selv om filteret senere blir fjernet
+        locale: Språket til brukergrensesnittet, e-mailer og push-varsler
         locked: Krever at du manuelt godkjenner følgere
         password: Nytt minst 8 teikn
         phrase: Vil bli samsvart med, uansett bruk av store/små bokstaver eller innholdsadvarselen til en tut
@@ -33,6 +51,8 @@ nn:
         setting_use_pending_items: Skjul tidslinjeoppdateringer bak et klikk, i stedet for å automatisk la strømmen skrolle
         username: Brukarnamnet ditt vert unikt på %{domain}
         whole_word: Når søkeordet eller setningen bare er alfanumerisk, aktiveres det bare hvis det samsvarer med hele ordet
+      domain_allow:
+        domain: Dette domenet vil være i stand til å hente data fra denne serveren og dets innkommende data vil bli prosessert og lagret
       featured_tag:
         name: 'Kanskje du vil nytta ein av desse:'
       form_challenge:
@@ -43,6 +63,8 @@ nn:
         text: Dette kjem til å hjelpa oss med å gå gjennom søknaden din
       sessions:
         otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder.
+      tag:
+        name: Du kan bare forandre bruken av store/små bokstaver, f.eks. for å gjøre det mer lesbart
       user:
         chosen_languages: Hvis noen av dem er valgt, vil kun tuter i de valgte språkene bli vist i de offentlige tidslinjene
     labels:
@@ -50,9 +72,14 @@ nn:
         fields:
           name: Merkelapp
           value: Innhald
+      account_alias:
+        acct: Brukernavnet til den gamle brukeren
+      account_migration:
+        acct: Brukernavnet til den nye brukeren
       account_warning_preset:
         text: Føreåtstekst
       admin_account_action:
+        include_statuses: Inkluder rapporterte tuter i e-mailen
         send_email_notification: Varsl brukaren med e-post
         text: Eigen åtvaring
         type: Handling
@@ -62,6 +89,12 @@ nn:
           silence: Togn
           suspend: Utvis og slett kontodata for godt
         warning_preset_id: Bruk åtvaringsoppsett
+      announcement:
+        all_day: Heldagshendelse
+        ends_at: Slutten av hendelsen
+        scheduled_at: Planlegg publisering
+        starts_at: Begynnelse av hendelsen
+        text: Kunngjøring
       defaults:
         autofollow: Bed om å fylgja kontoen din
         avatar: Bilete
@@ -78,6 +111,8 @@ nn:
         expires_in: Vert ugyldig etter
         fields: Profilmetadata
         header: Overskrift
+        inbox_url: URL til overgangsinnboksen
+        irreversible: Forkast i stedet for å skjule
         locale: Språk
         locked: Lås konto
         max_uses: Grense på brukartal
@@ -134,8 +169,11 @@ nn:
         pending_account: Send e-post når ein ny konto treng gjennomgang
         reblog: Send e-post når nokon framhevar statusen din
         report: Send e-post når nokon rapporterer noko
+        trending_tag: En ugjennomgått emneknagg trender
       tag:
+        listable: Tillat denne emneknaggen å vises i søk og på profilmappen
         name: Emneknagg
+        trendable: Tillat denne emneknaggen til å vises under trender
         usable: Gje tut lov til å nytta denne emneknaggen
     'no': Nei
     recommended: Tilrådt
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
index fb158e9e3..426247676 100644
--- a/config/locales/simple_form.no.yml
+++ b/config/locales/simple_form.no.yml
@@ -2,20 +2,39 @@
 'no':
   simple_form:
     hints:
+      account_alias:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte fra
+      account_migration:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte til
+      account_warning_preset:
+        text: Du kan bruke tut syntaks, f.eks. URLer, emneknagger og nevnelser
       admin_account_action:
         include_statuses: Brukeren vil se hvilke tuter som forårsaket moderator-handlingen eller -advarselen
+        send_email_notification: Brukeren vil motta en forklaring på hva som har skjedd med deres bruker
+        text_html: Valgfritt. Du kan bruke tut syntaks. Du kan <a href="%{path}">legge til advarsels-forhåndsinnstillinger</a> for å spare tid
         type_html: Velg hva du vil gjøre med <strong>%{acct}</strong>
+        warning_preset_id: Valgfritt. Du kan fortsatt legge til tilpasset tekst til slutten av forhåndsinnstillingen
+      announcement:
+        all_day: Hvis noen av dem er valgt, vil kun datoene av tidsrammen bli vist
+        ends_at: Valgfritt. Kunngjøring vil bli automatisk avpublisert på dette tidspunktet
+        scheduled_at: La stå tomt for å publisere kunngjøringen umiddelbart
+        starts_at: Valgfritt. I tilfellet din kunngjøring er bundet til en spesifikk tidsramme
+        text: Du kan bruke tut syntaks. Vennligst vær oppmerksom på plassen som kunngjøringen vil ta opp på brukeren sin skjerm
       defaults:
         autofollow: Folk som lager en konto gjennom invitasjonen, vil automatisk følge deg
         avatar: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
         bot: Denne kontoen utfører i hovedsak automatiserte handlinger og blir kanskje ikke holdt øye med
+        context: En eller flere sammenhenger der filteret skal gjelde
+        current_password: For sikkerhetsgrunner, vennligst oppgi passordet til den nåværende bruker
         current_username: For å bekrefte, vennligst skriv inn brukernavnet til den nåværende kontoen
         digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte
         discoverable: Profilmappen er en annen måte for kontoen din å nå et bredere publikum på
         email: Du vil bli tilsendt en bekreftelses-E-post
         fields: Du kan ha opptil 4 gjenstander vist som en tabell på profilsiden din
         header: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
+        inbox_url: Kopier URLen fra forsiden til overgangen du vil bruke
         irreversible: Filtrerte tuter vil ugjenkallelig forsvinne, selv om filteret senere blir fjernet
+        locale: Språket til brukergrensesnittet, e-mailer og push-varsler
         locked: Krever at du manuelt godkjenner følgere
         password: Bruk minst 8 tegn
         phrase: Vil bli samsvart med, uansett bruk av store/små bokstaver eller innholdsadvarselen til en tut
@@ -32,14 +51,20 @@
         setting_use_pending_items: Skjul tidslinjeoppdateringer bak et klikk, i stedet for å automatisk la strømmen skrolle
         username: Brukernavnet ditt vil være unikt på %{domain}
         whole_word: Når søkeordet eller setningen bare er alfanumerisk, aktiveres det bare hvis det samsvarer med hele ordet
+      domain_allow:
+        domain: Dette domenet vil være i stand til å hente data fra denne serveren og dets innkommende data vil bli prosessert og lagret
       featured_tag:
         name: 'Du vil kanskje ønske å bruke en av disse:'
       form_challenge:
         current_password: Du går inn i et sikkert område
       imports:
         data: CSV-fil eksportert fra en annen Mastodon-instans
+      invite_request:
+        text: Dette vil hjelpe oss med å gjennomgå din søknad
       sessions:
         otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder.
+      tag:
+        name: Du kan bare forandre bruken av store/små bokstaver, f.eks. for å gjøre det mer lesbart
       user:
         chosen_languages: Hvis noen av dem er valgt, vil kun tuter i de valgte språkene bli vist i de offentlige tidslinjene
     labels:
@@ -47,9 +72,14 @@
         fields:
           name: Etikett
           value: Innhold
+      account_alias:
+        acct: Brukernavnet til den gamle brukeren
+      account_migration:
+        acct: Brukernavnet til den nye brukeren
       account_warning_preset:
         text: Forhåndsvalgt tekst
       admin_account_action:
+        include_statuses: Inkluder rapporterte tuter i e-mailen
         send_email_notification: Si ifra til brukeren over E-post
         text: Tilpasset advarsel
         type: Handling
@@ -57,6 +87,14 @@
           disable: Deaktiver pålogging
           none: Ikke gjør noe
           silence: Stilne
+          suspend: Suspender og ugjenkallelig slett brukerdata
+        warning_preset_id: Bruk en advarsels-forhåndsinnstilling
+      announcement:
+        all_day: Heldagshendelse
+        ends_at: Slutten av hendelsen
+        scheduled_at: Planlegg publisering
+        starts_at: Begynnelse av hendelsen
+        text: Kunngjøring
       defaults:
         autofollow: Inviter til å følge kontoen din
         avatar: Profilbilde
@@ -73,6 +111,8 @@
         expires_in: Utløper etter
         fields: Profilmetadata
         header: Overskrift
+        inbox_url: URL til overgangsinnboksen
+        irreversible: Forkast i stedet for å skjule
         locale: Språk
         locked: Lås konto
         max_uses: Maksimalt antall bruk
@@ -126,9 +166,14 @@
         follow: Send e-post når noen følger deg
         follow_request: Send e-post når noen ber om å få følge deg
         mention: Send e-post når noen nevner deg
+        pending_account: Ny bruker avventer gjennomgang
         reblog: Send e-post når noen fremhever din status
+        report: Ny rapport er sendt inn
+        trending_tag: En ugjennomgått emneknagg trender
       tag:
+        listable: Tillat denne emneknaggen å vises i søk og på profilmappen
         name: Emneknagg
+        trendable: Tillat denne emneknaggen til å vises under trender
         usable: Tillat tuter å bruke denne emneknaggen
     'no': Nei
     recommended: Anbefalt
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index 918997695..0ec9d0d6b 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -14,6 +14,12 @@ ru:
         text_html: Необязательно. Вы можете использовать синтаксис постов. Для экономии времени, <a href="%{path}">добавьте шаблоны предупреждений</a>
         type_html: Выберите применяемое к <strong>%{acct}</strong> действие
         warning_preset_id: Необязательно. Вы можете добавить собственный текст в конце шаблона
+      announcement:
+        all_day: Если выбрано, часы начала и завершения будут скрыты
+        ends_at: Необязательно. Объявление будет автоматически отменено в это время
+        scheduled_at: Оставьте поля незаполненными, чтобы опубликовать объявление сразу
+        starts_at: Необязательно. На случай, если ваше объявление привязано к какому-то временному интервалу
+        text: Вы можете использовать тот же синтаксис, что и в постах. Будьте предусмотрительны насчёт места, которое займёт объявление на экране пользователей
       defaults:
         autofollow: Люди, пришедшие по этому приглашению, автоматически будут подписаны на вас
         avatar: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшен до %{dimensions}px
@@ -83,6 +89,12 @@ ru:
           silence: Скрыть
           suspend: Заблокировать и безвозвратно удалить все данные учётной записи
         warning_preset_id: Использовать шаблон
+      announcement:
+        all_day: Весь день
+        ends_at: Время завершения
+        scheduled_at: Отложенная публикация
+        starts_at: Время начала
+        text: Объявление
       defaults:
         autofollow: С подпиской на вашу учётную запись
         avatar: Аватар
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index dc118a47f..074a3ad41 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -83,6 +83,8 @@ th:
           silence: เงียบ
           suspend: ระงับและลบข้อมูลบัญชีอย่างถาวร
         warning_preset_id: ใช้คำเตือนที่ตั้งไว้ล่วงหน้า
+      announcement:
+        text: ประกาศ
       defaults:
         autofollow: เชิญให้ติดตามบัญชีของคุณ
         avatar: ภาพประจำตัว
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 4d022368a..69ee19f1b 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -14,6 +14,12 @@ tr:
         text_html: İsteğe bağlı. Toot sözdizimleri kullanabilirsiniz. Zamandan kazanmak için <a href="%{path}">uyarı ön-ayarları ekleyebilirsiniz</a>
         type_html: "<strong>%{acct}</strong> ile ne yapılacağını seçin"
         warning_preset_id: İsteğe bağlı. Hazır ayarın sonuna hala özel metin ekleyebilirsiniz
+      announcement:
+        all_day: İşaretlendiğinde, yalnızca zaman aralığındaki tarihler görüntülenir
+        ends_at: İsteğe bağlı. Duyuru, bu tarihte otomatik olarak yayından kaldırılacak
+        scheduled_at: Duyuruyu hemen yayınlamak için boş bırakın
+        starts_at: İsteğe bağlı. Duyurunuzun belirli bir zaman aralığına bağlı olması durumunda
+        text: Toot söz dizimini kullanabilirsiniz. Lütfen duyurunun kullanıcının ekranında yer alacağı alanı göz önünde bulundurun
       defaults:
         autofollow: Davetiyeyle kaydolan kişiler sizi otomatik olarak takip eder
         avatar: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir
@@ -83,6 +89,12 @@ tr:
           silence: Sessiz
           suspend: Hesap verilerini askıya alın ve geri alınamaz şekilde silin
         warning_preset_id: Bir uyarı ön-ayarı kullan
+      announcement:
+        all_day: Tüm gün etkinliği
+        ends_at: Etkinlik sonu
+        scheduled_at: Yayınlamayı zamanla
+        starts_at: Etkinlik başlangıcı
+        text: Duyuru
       defaults:
         autofollow: Hesabınızı takip etmeye davet edin
         avatar: Profil resmi
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index 272d2fe43..2fe0461cf 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -14,6 +14,12 @@ uk:
         text_html: Необов'язково. Ви можете використовувати синтакс дмухів. Ви можете <a href="%{path}">додати шаблони попереджень</a>, щоб заощадити час
         type_html: Оберіть, що робити з <strong>%{acct}</strong>
         warning_preset_id: Необов'язково. Ви можете ще додати будь-який текст до кінця шаблону
+      announcement:
+        all_day: Якщо вибрано, відображаються лише дати діапазону часу
+        ends_at: Необов'язково. Оголошення буде автоматично знято з публікації
+        scheduled_at: Залиште поля незаповненими, щоб опублікувати оголошення відразу
+        starts_at: Необов'язково. У разі якщо оголошення прив'язується до певного періоду часу
+        text: Ви можете використовувати той же синтаксис, що і в постах. Будьте завбачливі щодо місця, яке займе оголошення на екрані користувачів
       defaults:
         autofollow: Люди, що зареєструвалися за вашим запрошенням, автоматично підпишуться на вас
         avatar: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px
@@ -83,6 +89,12 @@ uk:
           silence: Глушення
           suspend: Призупинити та незворотньо видалити дані облікового запису
         warning_preset_id: Використати шаблон попередження
+      announcement:
+        all_day: Увесь день
+        ends_at: Завершення події
+        scheduled_at: Відкладена публікація
+        starts_at: Час початку
+        text: Оголошення
       defaults:
         autofollow: Запросити слідкувати за вашим обліковим записом
         avatar: Аватар
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index b02ee8eca..cd3ef0390 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -234,6 +234,14 @@ sk:
         update_status: "%{name} aktualizoval/a status pre %{target}"
       deleted_status: "(zmazaný príspevok)"
       title: Kontrólny záznam
+    announcements:
+      live: Naživo
+      new:
+        create: Vytvor oznam
+        title: Nové oznámenie
+      published: Zverejnený
+      time_range: Časový rozsah
+      title: Oboznámenia
     custom_emojis:
       assign_category: Priraď kategóriu
       by_domain: Doména
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 02b8fc97e..39664aec9 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -154,6 +154,7 @@ th:
         staff: พนักงาน
         user: ผู้ใช้
       search: ค้นหา
+      search_same_ip: ผู้ใช้อื่น ๆ ที่มี IP เดียวกัน
       shared_inbox_url: URL กล่องขาเข้าที่แบ่งปัน
       show:
         created_reports: รายงานที่สร้าง
@@ -178,10 +179,13 @@ th:
         change_email_user: "%{name} ได้เปลี่ยนที่อยู่อีเมลของผู้ใช้ %{target}"
         confirm_user: "%{name} ได้ยืนยันที่อยู่อีเมลของผู้ใช้ %{target}"
         create_account_warning: "%{name} ได้ส่งคำเตือนไปยัง %{target}"
+        create_announcement: "%{name} ได้สร้างประกาศใหม่ %{target}"
+        create_custom_emoji: "%{name} ได้อัปโหลดอีโมจิใหม่ %{target}"
         create_domain_allow: "%{name} ได้ขึ้นบัญชีขาวโดเมน %{target}"
         create_domain_block: "%{name} ได้ปิดกั้นโดเมน %{target}"
         create_email_domain_block: "%{name} ได้ขึ้นบัญชีดำโดเมนอีเมล %{target}"
         demote_user: "%{name} ได้ลดขั้นผู้ใช้ %{target}"
+        destroy_announcement: "%{name} ได้ลบประกาศ %{target}"
         destroy_custom_emoji: "%{name} ได้ทำลายอีโมจิ %{target}"
         destroy_domain_allow: "%{name} ได้เอาโดเมน %{target} ออกจากบัญชีขาว"
         destroy_domain_block: "%{name} ได้เลิกปิดกั้นโดเมน %{target}"
@@ -199,10 +203,22 @@ th:
         suspend_account: "%{name} ได้ระงับบัญชีของ %{target}"
         unassigned_report: "%{name} ได้เลิกมอบหมายรายงาน %{target}"
         unsuspend_account: "%{name} ได้เลิกระงับบัญชีของ %{target}"
+        update_announcement: "%{name} ได้อัปเดตประกาศ %{target}"
         update_custom_emoji: "%{name} ได้อัปเดตอีโมจิ %{target}"
         update_status: "%{name} ได้อัปเดตสถานะโดย %{target}"
       deleted_status: "(สถานะที่ลบแล้ว)"
       title: รายการบันทึกการตรวจสอบ
+    announcements:
+      edit:
+        title: แก้ไขประกาศ
+      empty: ไม่พบประกาศ
+      live: สด
+      new:
+        create: สร้างประกาศ
+        title: ประกาศใหม่
+      published: เผยแพร่เมื่อ
+      time_range: ช่วงเวลา
+      title: ประกาศ
     custom_emojis:
       assign_category: กำหนดหมวดหมู่
       by_domain: โดเมน
@@ -328,6 +344,8 @@ th:
       title: คำเชิญ
     pending_accounts:
       title: บัญชีที่รอดำเนินการ (%{count})
+    relationships:
+      title: ความสัมพันธ์ของ %{acct}
     relays:
       add_new: เพิ่มรีเลย์ใหม่
       delete: ลบ
@@ -539,6 +557,9 @@ th:
     confirm: ดำเนินการต่อ
     invalid_password: รหัสผ่านไม่ถูกต้อง
     prompt: ยืนยันรหัสผ่านเพื่อดำเนินการต่อ
+  date:
+    formats:
+      default: "%d %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count} ชั่วโมง"
@@ -600,6 +621,7 @@ th:
     add_new: เพิ่มใหม่
   filters:
     contexts:
+      account: โปรไฟล์
       home: เส้นเวลาหน้าแรก
       notifications: การแจ้งเตือน
       public: เส้นเวลาสาธารณะ
@@ -621,6 +643,8 @@ th:
     all: ทั้งหมด
     changes_saved_msg: บันทึกการเปลี่ยนแปลงสำเร็จ!
     copy: คัดลอก
+    delete: ลบ
+    edit: แก้ไข
     order_by: เรียงลำดับตาม
     save_changes: บันทึกการเปลี่ยนแปลง
   html_validator:
@@ -722,10 +746,14 @@ th:
     other: อื่น ๆ
     posting_defaults: ค่าเริ่มต้นการโพสต์
     public_timelines: เส้นเวลาสาธารณะ
+  reactions:
+    errors:
+      unrecognized_emoji: ไม่ใช่อีโมจิที่รู้จัก
   relationships:
     activity: กิจกรรมบัญชี
     followers: ผู้ติดตาม
     following: กำลังติดตาม
+    invited: เชิญแล้ว
     last_active: ใช้งานล่าสุด
     most_recent: ล่าสุด
     moved: ย้ายแล้ว
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 0fa4750bc..773117369 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -198,11 +198,13 @@ tr:
         change_email_user: "%{name}, %{target} kullanıcısının e-posta adresini değiştirdi"
         confirm_user: "%{name} %{target} kullanıcısının e-posta adresini onayladı"
         create_account_warning: "%{name} %{target} 'a bir uyarı gönderdi"
+        create_announcement: "%{name}, yeni %{target} duyurusunu oluşturdu"
         create_custom_emoji: "%{name} yeni ifade yükledi %{target}"
         create_domain_allow: "%{target} alan adı, %{name} tarafından beyaz listeye alındı"
         create_domain_block: "%{target} alanı, %{name} tarafından engellendi"
         create_email_domain_block: "%{target} e-posta alanı, %{name} tarafından kara listeye alınmış"
         demote_user: "%{name} %{target} kullanıcısını düşürdü"
+        destroy_announcement: "%{name}, %{target} duyurusunu sildi"
         destroy_custom_emoji: "%{target} emoji, %{name} tarafından kaldırıldı"
         destroy_domain_allow: "%{target} alan adı, %{name} tarafından beyaz listeden çıkartıldı"
         destroy_domain_block: "%{target} alan adının engeli %{name} tarafından kaldırıldı"
@@ -224,10 +226,22 @@ tr:
         unassigned_report: "%{name} %{target} şikayetinin atamasını geri aldı"
         unsilence_account: "%{name} %{target}'in hesabının susturmasını kaldırdı"
         unsuspend_account: "%{name} %{target}'in hesabının uzaklaştırmasını kaldırdı"
+        update_announcement: "%{name}, %{target} duyurusunu güncelledi"
         update_custom_emoji: "%{name} %{target} emojiyi güncelledi"
         update_status: "%{name}, %{target} kullanıcısının durumunu güncelledi"
       deleted_status: "(silinmiş durum)"
       title: Denetim günlüğü
+    announcements:
+      edit:
+        title: Duyuruyu düzenle
+      empty: Duyuru bulunamadı.
+      live: Canlı
+      new:
+        create: Duyuru oluştur
+        title: Yeni duyuru
+      published: Yayınlanan
+      time_range: Zaman aralığı
+      title: Duyurular
     custom_emojis:
       assign_category: Kategori ata
       by_domain: Alan adı
@@ -657,6 +671,9 @@ tr:
     hint_html: "<strong>İpucu:</strong> Önümüzdeki saat boyunca sana parolanı sormayacağız."
     invalid_password: Geçersiz parola
     prompt: Devam etmek parolayı doğrulayın
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}sa"
@@ -758,6 +775,8 @@ tr:
     all: Tümü
     changes_saved_msg: Değişiklikler başarıyla kaydedildi!
     copy: Kopyala
+    delete: Sil
+    edit: Düzenle
     no_batch_actions_available: Bu sayfada toplu işlem yok
     order_by: Sıralama ölçütü
     save_changes: Değişiklikleri kaydet
@@ -929,6 +948,10 @@ tr:
     other: Diğer
     posting_defaults: Gönderi varsayılanları
     public_timelines: Genel zaman çizelgeleri
+  reactions:
+    errors:
+      limit_reached: Farklı reaksiyonların sınırına ulaşıldı
+      unrecognized_emoji: tanınan bir emoji değil
   relationships:
     activity: Hesap etkinliği
     dormant: Atıl
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 7df8abcce..34bf41a15 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -206,11 +206,13 @@ uk:
         change_email_user: "%{name} змінив(-ла) поштову адресу користувача %{target}"
         confirm_user: "%{name} підтвердив(-ла) статус поштової адреси користувача %{target}"
         create_account_warning: "%{name} надіслав попередження до %{target}"
+        create_announcement: "%{name} створив нове оголошення %{target}"
         create_custom_emoji: "%{name} вивантажив(-ла) нове емодзі %{target}"
         create_domain_allow: "%{name} додав(-ла) домен %{target} до білого списку"
         create_domain_block: "%{name} заблокував(-ла) домен %{target}"
         create_email_domain_block: "%{name} додав(-ла) поштовий домен %{target} до чорного списку"
         demote_user: "%{name} понизив(-ла) %{target}"
+        destroy_announcement: "%{name} видалив оголошення %{target}"
         destroy_custom_emoji: "%{name} знищив(-ла) емодзі %{target}"
         destroy_domain_allow: "%{name} видалив(-ла) домен %{target} з білого списку"
         destroy_domain_block: "%{name} розблокував(-ла) домен %{target}"
@@ -232,10 +234,22 @@ uk:
         unassigned_report: "%{name} зняв(-ла) призначення скарги %{target}"
         unsilence_account: "%{name} розглушив(-ла) обліковий запис %{target}"
         unsuspend_account: "%{name} розморозив обліковий запис користувача %{target}"
+        update_announcement: "%{name} оновив оголошення %{target}"
         update_custom_emoji: "%{name} оновив(-ла) емодзі %{target}"
         update_status: "%{name} змінив(-ла) статус користуача %{target}"
       deleted_status: "(видалений статус)"
       title: Журнал подій
+    announcements:
+      edit:
+        title: Редагувати оголошення
+      empty: Оголошення не знайдені.
+      live: Наживо
+      new:
+        create: Створити оголошення
+        title: Нове оголошення
+      published: Опубліковане
+      time_range: Діапазон часу
+      title: Оголошення
     custom_emojis:
       assign_category: Призначити категорію
       by_domain: Домен
@@ -263,6 +277,7 @@ uk:
       shortcode_hint: Мінімум два символи, тільки цифрові й латинські символи або підкреслення
       title: Особливі емодзі
       uncategorized: Без категорії
+      unlist: Прибрати
       unlisted: Не у списку
       update_failed_msg: Не вийшло оновити емозді
       updated_msg: Емодзі успішно оновлене!
@@ -348,6 +363,7 @@ uk:
       delete: Видалити
       destroyed_msg: Успішно видалено поштовий домен з чорного списку
       domain: Домен
+      empty: Ніякі e-mail домени не блокуються.
       new:
         create: Додати домен
         title: Нове блокування поштового домену
@@ -382,6 +398,8 @@ uk:
       title: Запрошення
     pending_accounts:
       title: Облікові записи у черзі (%{count})
+    relationships:
+      title: "%{acct} відносини"
     relays:
       add_new: Додати новий ретранслятор
       delete: Видалити
@@ -455,6 +473,7 @@ uk:
         title: Користувацький CSS
       default_noindex:
         desc_html: Впливає на усіх користувачів, які не змінили це настроювання самостійно
+        title: Виключити користувачів з індексації пошуковими системами за замовчуванням
       domain_blocks:
         all: Всi
         disabled: Нікого
@@ -462,6 +481,8 @@ uk:
         users: Для авторизованих локальних користувачів
       domain_blocks_rationale:
         title: Обґрунтування
+      enable_bootstrap_timeline_accounts:
+        title: Увімкнути підписки за замовчуванням для нових користувачів
       hero:
         desc_html: Відображається на головній сторінці. Рекомендовано як мінімум 600x100 пікселів. Якщо не вказано, буде використано передпоказ інстанції
         title: Банер інстанції
@@ -492,6 +513,7 @@ uk:
           approved: Для входу потрібне схвалення
           none: Ніхто не може увійти
           open: Будь-хто може увійти
+        title: Режим реєстрації
       show_known_fediverse_at_about_page:
         desc_html: Коли увімкнено, будуть показані пости з усього відомого федисвіту у передпоказі. Інакше будуть показані лише локальні дмухи.
         title: Показувати доступний федисвіт у передпоказі стрічки
@@ -577,11 +599,13 @@ uk:
       body_remote: Хтось з домену %{domain} поскаржився(-лася) на %{target}
       subject: Нова скарга до %{instance} (#%{id})
     new_trending_tag:
+      body: 'Хештег #%{name} сьогодні є в тренді, але раніше не переглядався. Він не відображатиметься публічно, якщо ви не дозволите це чи просто збережете форму, щоб ніколи більше про нього не чути.'
       subject: Новий хештеґ надіслано на розгляд до %{instance} (#%{name})
   aliases:
     add_new: Створити псевдонім
     created_msg: Новий псевдонім успішно створено. Тепер ви можете починати переміщення зі старого облікового запису.
     deleted_msg: Псевдонім успішно видалено. Переміщення з того облікового запису до цього більше не можливе.
+    hint_html: Якщо ви збираєтеся мігрувати з іншого облікового запису на цей, ви можете налаштувати псевдонім, що потрібно для перенесення передплатників зі старою облікового запису. Ця дія саме по собі <strong>нешкідливо і оборотно</strong>. <strong>Міграція облікового запису починається з старого облікового запису</strong>.
     remove: Від'єднати псевдонім
   appearance:
     advanced_web_interface: Розширений web-інтерфейс
@@ -665,6 +689,9 @@ uk:
     hint_html: "<strong>Підказка:</strong> ми не будемо запитувати ваш пароль впродовж наступної години."
     invalid_password: Невірний пароль
     prompt: Підтвердіть пароль для продовження
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}г"
@@ -741,6 +768,7 @@ uk:
     hint_html: "<strong>Що таке виділені хештеґи?</strong> Це ті, що відображаються ни видному місці у вашому публічному профілі. Вони дають змогу людям фільтрувати ваші публічні пости за цими хештеґами. Це дуже корисно для відстеження мистецьких творів та довготривалих проектів."
   filters:
     contexts:
+      account: Профілі
       home: Ваша стрічка
       notifications: Сповіщення
       public: Глобальні стрічки
@@ -765,6 +793,9 @@ uk:
     all: Усі
     changes_saved_msg: Зміни успішно збережені!
     copy: Копіювати
+    delete: Видалити
+    edit: Змінити
+    no_batch_actions_available: На цій сторінці немає запланованих дій
     order_by: Сортувати за
     save_changes: Зберегти зміни
     validation_errors:
@@ -780,6 +811,11 @@ uk:
     authorize_connection_prompt: Авторизувати це зашифроване з'єднання?
     errors:
       failed: Не вдалося встановити це зашифроване з'єднання. Спробуйте ще раз за допомогою %{provider}.
+      keybase:
+        invalid_token: Токени Keybase - це хеші від підписів і повинні бути по довжині в 66 hex-символів
+        verification_failed: Keybase не розпізнає цей токен як підпис користувача Keybase %{kb_username}. Будь-ласка, спробуйте з Keybase.
+      wrong_user: Неможливо підтвердити користувача%{proving}, під час входу в систему як %{current}. Виконайте вхід як %{proving} і спробуйте ще раз.
+    explanation_html: На цій сторінці відображаються криптографічні підтверджені ідентифікатори - наприклад, прив'язаний профіль Keybase. Це дозволяє людям відправляти вам зашифровані повідомлення, а також довіряти вашим постам.
     i_am_html: Я %{username} з %{service}.
     identity: Ідентичність
     inactive: Неактивний
@@ -836,9 +872,11 @@ uk:
   migrations:
     acct: username@domain нового облікового запису
     cancel: Скасувати перенаправлення
+    cancel_explanation: Скасування перенаправлення реактивує ваш поточний обліковий запис, але не поверне підписників, які були переміщені в інший обліковий запис.
     cancelled_msg: Перенаправлення успішно скасовано.
     errors:
       already_moved: той самий обліковий запис, до якого ви вже переміщені
+      missing_also_known_as: не є зворотнім посиланням на цей обліковий запис
       move_to_self: неможливо перемістити обліковий запис до самого себе
       not_found: не знайдено
       on_cooldown: Ви у витверезнику
@@ -858,7 +896,9 @@ uk:
       cooldown: Після переїзду ви деякий час не можете переїжджати знову
       disabled_account: Поточний обліковий запис не буде повністю придатний до використання. Проте ви матимете доступ до експорту даних та повторної активації.
       followers: Ця дія призведе до переміщення всіх підписників з поточного облікового запису до нового облікового запису
+      only_redirect_html: Або ж ви можете <a href="%{path}"> просто налаштувати перенаправлення у ваш профіль</a>.
       other_data: Ніякі інші дані не будуть переміщені автоматично
+      redirect: Профіль цього облікового запису буде оновлено з заміткою про перенаправлення, а також виключений з пошуку
   moderation:
     title: Модерація
   notification_mailer:
@@ -926,6 +966,7 @@ uk:
       duration_too_long: надто далеко у майбутньому
       duration_too_short: надто мала тривалість
       expired: Це опитування вже завершено
+      invalid_choice: Обраного варіанту голосування не існує
       over_character_limit: не може бути довше ніж %{max} символів кожен
       too_few_options: має містити більше ніж один варіант
       too_many_options: не може мати більше ніж %{max} варіантів
@@ -933,11 +974,15 @@ uk:
     other: Інше
     posting_defaults: Промовчання для постів
     public_timelines: Глобальні стрічки
+  reactions:
+    errors:
+      unrecognized_emoji: не є розпізнаним емоджі
   relationships:
     activity: Діяльність облікового запису
     dormant: Неактивні
     followers: Підписники
     following: Підписник(-ця)
+    invited: Запрошені
     last_active: Крайня активність
     most_recent: За часом створення
     moved: Переміщено
@@ -1128,6 +1173,7 @@ uk:
         suspend: Ваш обліковий запис було призупинено, а всі ваші дмухи і вивантажені медіафайли - безповоротно видалено з цього сервера та серверів, де ви мали послідовників.
       get_in_touch: Ви можете відповісти на цей електронний лист, щоб зконтактувати з працівниками %{instance}.
       review_server_policies: Переглянути політики сервера
+      statuses: 'Зокрема, для:'
       subject:
         disable: Ваш обліковий запис %{acct} було заморожено
         none: Попередження для %{acct}
@@ -1163,4 +1209,5 @@ uk:
     seamless_external_login: Ви увійшли за допомогою зовнішнього сервісу, тому налаштування паролю та електронної пошти недоступні.
     signed_in_as: 'Ви увійшли як:'
   verification:
+    explanation_html: 'Володіння посиланнями у профілі <strong>можна підтвердити</strong>. Для цього на зазначеному сайті повинна міститися посилання на ваш профіль Mastodon, а у самому посиланні <strong>повинен</strong> бути атрибут <code>rel="me"</code>. Що всередині посилання - значення не має. Ось вам приклад посилання:'
     verification: Підтвердження
diff --git a/spec/validators/reaction_validator_spec.rb b/spec/validators/reaction_validator_spec.rb
new file mode 100644
index 000000000..d73104cb6
--- /dev/null
+++ b/spec/validators/reaction_validator_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe ReactionValidator do
+  let(:announcement) { Fabricate(:announcement) }
+
+  describe '#validate' do
+    it 'adds error when not a valid unicode emoji' do
+      reaction = announcement.announcement_reactions.build(name: 'F')
+      subject.validate(reaction)
+      expect(reaction.errors).to_not be_empty
+    end
+
+    it 'does not add error when non-unicode emoji is a custom emoji' do
+      custom_emoji = Fabricate(:custom_emoji)
+      reaction = announcement.announcement_reactions.build(name: custom_emoji.shortcode, custom_emoji_id: custom_emoji.id)
+      subject.validate(reaction)
+      expect(reaction.errors).to be_empty
+    end
+
+    it 'adds error when 8 reactions already exist' do
+      %w(🐘 ❤️ 🙉 😍 😋 😂 😞 👍).each do |name|
+        announcement.announcement_reactions.create!(name: name, account: Fabricate(:account))
+      end
+
+      reaction = announcement.announcement_reactions.build(name: '😘')
+      subject.validate(reaction)
+      expect(reaction.errors).to_not be_empty
+    end
+
+    it 'does not add error when new reaction is part of the existing ones' do
+      %w(🐘 ❤️ 🙉 😍 😋 😂 😞 👍).each do |name|
+        announcement.announcement_reactions.create!(name: name, account: Fabricate(:account))
+      end
+
+      reaction = announcement.announcement_reactions.build(name: '😋')
+      subject.validate(reaction)
+      expect(reaction.errors).to be_empty
+    end
+  end
+end