diff options
124 files changed, 1799 insertions, 483 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml index 02b505457..8791965f0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,6 +11,7 @@ aliases: RAILS_ENV: test PARALLEL_TEST_PROCESSORS: 4 ALLOW_NOPAM: true + CONTINUOUS_INTEGRATION: true DISABLE_SIMPLECOV: true working_directory: ~/projects/mastodon/ diff --git a/app/controllers/api/v1/push/subscriptions_controller.rb b/app/controllers/api/v1/push/subscriptions_controller.rb new file mode 100644 index 000000000..5038cc03c --- /dev/null +++ b/app/controllers/api/v1/push/subscriptions_controller.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +class Api::V1::Push::SubscriptionsController < Api::BaseController + before_action -> { doorkeeper_authorize! :push } + before_action :require_user! + before_action :set_web_push_subscription + + def create + @web_subscription&.destroy! + + @web_subscription = ::Web::PushSubscription.create!( + endpoint: subscription_params[:endpoint], + key_p256dh: subscription_params[:keys][:p256dh], + key_auth: subscription_params[:keys][:auth], + data: data_params, + user_id: current_user.id, + access_token_id: doorkeeper_token.id + ) + + render json: @web_subscription, serializer: REST::WebPushSubscriptionSerializer + end + + def update + raise ActiveRecord::RecordNotFound if @web_subscription.nil? + + @web_subscription.update!(data: data_params) + + render json: @web_subscription, serializer: REST::WebPushSubscriptionSerializer + end + + def destroy + @web_subscription&.destroy! + render_empty + end + + private + + def set_web_push_subscription + @web_subscription = ::Web::PushSubscription.find_by(access_token_id: doorkeeper_token.id) + end + + def subscription_params + params.require(:subscription).permit(:endpoint, keys: [:auth, :p256dh]) + end + + def data_params + return {} if params[:data].blank? + params.require(:data).permit(alerts: [:follow, :favourite, :reblog, :mention]) + end +end diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb index 249e7c186..fe8e42580 100644 --- a/app/controllers/api/web/push_subscriptions_controller.rb +++ b/app/controllers/api/web/push_subscriptions_controller.rb @@ -31,22 +31,23 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController endpoint: subscription_params[:endpoint], key_p256dh: subscription_params[:keys][:p256dh], key_auth: subscription_params[:keys][:auth], - data: data + data: data, + user_id: active_session.user_id, + access_token_id: active_session.access_token_id ) active_session.update!(web_push_subscription: web_subscription) - render json: web_subscription.as_payload + render json: web_subscription, serializer: REST::WebPushSubscriptionSerializer end def update params.require([:id]) web_subscription = ::Web::PushSubscription.find(params[:id]) - web_subscription.update!(data: data_params) - render json: web_subscription.as_payload + render json: web_subscription, serializer: REST::WebPushSubscriptionSerializer end private @@ -56,6 +57,6 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController end def data_params - @data_params ||= params.require(:data).permit(:alerts) + @data_params ||= params.require(:data).permit(alerts: [:follow, :favourite, :reblog, :mention]) end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 158c0c10e..27ebc3333 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base include Localized include UserTrackingConcern + include SessionTrackingConcern helper_method :current_account helper_method :current_session diff --git a/app/controllers/concerns/session_tracking_concern.rb b/app/controllers/concerns/session_tracking_concern.rb new file mode 100644 index 000000000..45361b019 --- /dev/null +++ b/app/controllers/concerns/session_tracking_concern.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module SessionTrackingConcern + extend ActiveSupport::Concern + + UPDATE_SIGN_IN_HOURS = 24 + + included do + before_action :set_session_activity + end + + private + + def set_session_activity + return unless session_needs_update? + current_session.touch + end + + def session_needs_update? + !current_session.nil? && current_session.updated_at < UPDATE_SIGN_IN_HOURS.hours.ago + end +end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 189e4072e..2e9f73bb8 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -9,9 +9,9 @@ class InvitesController < ApplicationController before_action :set_pack def index - authorize :invite, :create? + authorize :invite, :index? - @invites = Invite.where(user: current_user) + @invites = invites @invite = Invite.new(expires_in: 1.day.to_i) end @@ -24,13 +24,13 @@ class InvitesController < ApplicationController if @invite.save redirect_to invites_path else - @invites = Invite.where(user: current_user) + @invites = invites render :index end end def destroy - @invite = Invite.where(user: current_user).find(params[:id]) + @invite = invites.find(params[:id]) authorize @invite, :destroy? @invite.expire! redirect_to invites_path @@ -42,6 +42,10 @@ class InvitesController < ApplicationController use_pack 'settings' end + def invites + Invite.where(user: current_user) + end + def resource_params params.require(:invite).permit(:max_uses, :expires_in) end diff --git a/app/controllers/shares_controller.rb b/app/controllers/shares_controller.rb index 3cbaccb35..4624c29a6 100644 --- a/app/controllers/shares_controller.rb +++ b/app/controllers/shares_controller.rb @@ -16,6 +16,7 @@ class SharesController < ApplicationController def initial_state_params text = [params[:title], params[:text], params[:url]].compact.join(' ') + { settings: Web::Setting.find_by(user: current_user)&.data || {}, push_subscription: current_account.user.web_push_subscription(current_session), diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js index cf27eff90..0d52100b9 100644 --- a/app/javascript/flavours/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -3,6 +3,7 @@ import { List as ImmutableList } from 'immutable'; import IntlMessageFormat from 'intl-messageformat'; import { fetchRelationships } from './accounts'; import { defineMessages } from 'react-intl'; +import { unescapeHTML } from 'flavours/glitch/util/html'; export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE'; @@ -40,13 +41,6 @@ const fetchRelatedRelationships = (dispatch, notifications) => { } }; -const unescapeHTML = (html) => { - const wrapper = document.createElement('div'); - html = html.replace(/<br \/>|<br>|\n/g, ' '); - wrapper.innerHTML = html; - return wrapper.textContent; -}; - export function updateNotifications(notification, intlMessages, intlLocale) { return (dispatch, getState) => { const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); diff --git a/app/javascript/flavours/glitch/components/modal_root.js b/app/javascript/flavours/glitch/components/modal_root.js index 789e117c7..89f81f58e 100644 --- a/app/javascript/flavours/glitch/components/modal_root.js +++ b/app/javascript/flavours/glitch/components/modal_root.js @@ -6,6 +6,7 @@ export default class ModalRoot extends React.PureComponent { static propTypes = { children: PropTypes.node, onClose: PropTypes.func.isRequired, + noEsc: PropTypes.bool, }; state = { @@ -16,7 +17,7 @@ export default class ModalRoot extends React.PureComponent { handleKeyUp = (e) => { if ((e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27) - && !!this.props.children && !this.props.props.noEsc) { + && !!this.props.children && !this.props.noEsc) { this.props.onClose(); } } diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js index 15bd6b365..464c73c9a 100644 --- a/app/javascript/flavours/glitch/features/account/components/header.js +++ b/app/javascript/flavours/glitch/features/account/components/header.js @@ -111,7 +111,7 @@ export default class Header extends ImmutablePureComponent { {fields.map((pair, i) => ( <dl key={i}> <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} /> - <dd dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} title={pair.get('value')} /> + <dd dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} title={pair.get('value_plain')} /> </dl> ))} </div> diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js index 320c039a4..cdb6dc9d0 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_root.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js @@ -59,7 +59,7 @@ export default class ModalRoot extends React.PureComponent { const visible = !!type; return ( - <Base onClose={onClose}> + <Base onClose={onClose} noEsc={props.noEsc}> {visible && ( <BundleContainer fetchComponent={MODAL_COMPONENTS[type]} loading={this.renderLoading(type)} error={this.renderError} renderDelay={200}> {(SpecificComponent) => <SpecificComponent {...props} onClose={onClose} />} diff --git a/app/javascript/flavours/glitch/reducers/accounts.js b/app/javascript/flavours/glitch/reducers/accounts.js index 23fbd999c..e8127a871 100644 --- a/app/javascript/flavours/glitch/reducers/accounts.js +++ b/app/javascript/flavours/glitch/reducers/accounts.js @@ -57,6 +57,7 @@ import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import emojify from 'flavours/glitch/util/emoji'; import { Map as ImmutableMap, fromJS } from 'immutable'; import escapeTextContentForBrowser from 'escape-html'; +import { unescapeHTML } from 'flavours/glitch/util/html'; const normalizeAccount = (state, account) => { account = { ...account }; @@ -74,6 +75,7 @@ const normalizeAccount = (state, account) => { ...pair, name_emojified: emojify(escapeTextContentForBrowser(pair.name)), value_emojified: emojify(pair.value), + value_plain: unescapeHTML(pair.value), })); } diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss index 55f31266f..c9c0e3081 100644 --- a/app/javascript/flavours/glitch/styles/about.scss +++ b/app/javascript/flavours/glitch/styles/about.scss @@ -322,6 +322,11 @@ $small-breakpoint: 960px; border: 0; border-bottom: 1px solid rgba($ui-base-lighter-color, .6); margin: 20px 0; + + &.spacer { + height: 1px; + border: 0; + } } .container-alt { @@ -681,6 +686,54 @@ $small-breakpoint: 960px; margin-bottom: 0; } + .account { + border-bottom: 0; + padding: 0; + + &__display-name { + align-items: center; + display: flex; + margin-right: 5px; + } + + div.account__display-name { + &:hover { + .display-name strong { + text-decoration: none; + } + } + + .account__avatar { + cursor: default; + } + } + + &__avatar-wrapper { + margin-left: 0; + flex: 0 0 auto; + } + + &__avatar { + width: 44px; + height: 44px; + background-size: 44px 44px; + } + + .display-name { + font-size: 15px; + + &__account { + font-size: 14px; + } + } + } + + @media screen and (max-width: $small-breakpoint) { + .contact { + margin-top: 30px; + } + } + @media screen and (max-width: $column-breakpoint) { padding: 25px 20px; } @@ -816,6 +869,8 @@ $small-breakpoint: 960px; font-size: 16px; line-height: inherit; font-weight: inherit; + margin: 0; + padding: 0; } .column { @@ -852,8 +907,13 @@ $small-breakpoint: 960px; } &__features { + & > p { + padding-right: 60px; + } + .features-list { - margin: 40px 0 !important; + margin: 40px 0; + margin-top: 30px; } &__action { @@ -862,17 +922,11 @@ $small-breakpoint: 960px; } .features-list { - margin-top: 20px; - .features-list__row { display: flex; padding: 10px 0; justify-content: space-between; - &:first-child { - padding-top: 0; - } - .visual { flex: 0 0 auto; display: flex; @@ -898,6 +952,14 @@ $small-breakpoint: 960px; } } } + + @media screen and (min-width: $small-breakpoint) { + display: grid; + grid-gap: 30px; + grid-template-columns: 1fr 1fr; + grid-auto-columns: 50%; + grid-auto-rows: max-content; + } } .extended-description { diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index b077df145..1948a2a23 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -141,14 +141,15 @@ } hr { - margin: 20px 0; + width: 100%; + height: 0; border: 0; - background: transparent; - border-bottom: 1px solid $ui-base-color; + border-bottom: 1px solid rgba($ui-base-lighter-color, .6); + margin: 20px 0; - &.section-break { - margin: 30px 0; - border-bottom: 2px solid $ui-base-lighter-color; + &.spacer { + height: 1px; + border: 0; } } @@ -273,22 +274,6 @@ } } -.flavour-screen { - display: block; - margin: 10px auto; - max-width: 100%; -} - -.flavour-description { - display: block; - font-size: 16px; - margin: 10px 0; - - & > p { - margin: 10px 0; - } -} - .report-accounts { display: flex; flex-wrap: wrap; @@ -351,34 +336,9 @@ } } -.report-note__comment { - margin-bottom: 20px; -} - -.report-note__form { - margin-bottom: 20px; - - .report-note__textarea { - box-sizing: border-box; - border: 0; - padding: 7px 4px; - margin-bottom: 10px; - font-size: 16px; - color: $inverted-text-color; - display: block; - width: 100%; - outline: 0; - font-family: inherit; - resize: vertical; - } - - .report-note__buttons { - text-align: right; - } - - .report-note__button { - margin: 0 0 5px 5px; - } +.simple_form.new_report_note, +.simple_form.new_account_moderation_note { + max-width: 100%; } .batch-form-box { @@ -406,13 +366,6 @@ } } -.batch-checkbox, -.batch-checkbox-all { - display: flex; - align-items: center; - margin-right: 5px; -} - .back-link { margin-bottom: 10px; font-size: 14px; @@ -432,7 +385,7 @@ } .log-entry { - margin-bottom: 8px; + margin-bottom: 20px; line-height: 20px; &__header { @@ -530,9 +483,12 @@ } } +a.name-tag, .name-tag { display: flex; align-items: center; + text-decoration: none; + color: $secondary-text-color; .avatar { display: block; @@ -544,4 +500,52 @@ .username { font-weight: 500; } + + &.suspended { + .username { + text-decoration: line-through; + color: lighten($error-red, 12%); + } + + .avatar { + filter: grayscale(100%); + opacity: 0.8; + } + } +} + +.speech-bubble { + margin-bottom: 20px; + border-left: 4px solid $ui-highlight-color; + + &.positive { + border-left-color: $success-green; + } + + &.negative { + border-left-color: lighten($error-red, 12%); + } + + &__bubble { + padding: 16px; + padding-left: 14px; + font-size: 15px; + line-height: 20px; + border-radius: 4px 4px 4px 0; + position: relative; + font-weight: 500; + + a { + color: $darker-text-color; + } + } + + &__owner { + padding: 8px; + padding-left: 12px; + } + + time { + color: $dark-text-color; + } } diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss index 5167a507e..dadfa6d57 100644 --- a/app/javascript/flavours/glitch/styles/components/accounts.scss +++ b/app/javascript/flavours/glitch/styles/components/accounts.scss @@ -32,7 +32,8 @@ .account__avatar-wrapper { float: left; - margin: 6px 16px 6px 6px; + margin-left: 12px; + margin-right: 12px; } .account__avatar { diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss index 9d5ab66a4..c40b38a5a 100644 --- a/app/javascript/flavours/glitch/styles/containers.scss +++ b/app/javascript/flavours/glitch/styles/containers.scss @@ -60,6 +60,7 @@ } } +.card-standalone__body, .media-gallery-standalone__body { overflow: hidden; } diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index 0b12742a9..f97890187 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -280,6 +280,11 @@ code { .actions { margin-top: 30px; display: flex; + + &.actions--top { + margin-top: 0; + margin-bottom: 30px; + } } button, @@ -563,9 +568,27 @@ code { .post-follow-actions { text-align: center; - color: $ui-primary-color; + color: $darker-text-color; div { margin-bottom: 4px; } } + +.alternative-login { + margin-top: 20px; + margin-bottom: 20px; + + h4 { + font-size: 16px; + color: $primary-text-color; + text-align: center; + margin-bottom: 20px; + border: 0; + padding: 0; + } + + .button { + display: block; + } +} diff --git a/app/javascript/flavours/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss index 77420c84b..e9099a9e9 100644 --- a/app/javascript/flavours/glitch/styles/rtl.scss +++ b/app/javascript/flavours/glitch/styles/rtl.scss @@ -1,6 +1,22 @@ body.rtl { direction: rtl; + .column-header > button { + text-align: right; + padding-left: 0; + padding-right: 15px; + } + + .landing-page__logo { + margin-right: 0; + margin-left: 20px; + } + + .landing-page .features-list .features-list__row .visual { + margin-left: 0; + margin-right: 15px; + } + .column-link__icon, .column-header__icon { margin-right: 0; diff --git a/app/javascript/flavours/glitch/styles/stream_entries.scss b/app/javascript/flavours/glitch/styles/stream_entries.scss index b505c1580..40963ae84 100644 --- a/app/javascript/flavours/glitch/styles/stream_entries.scss +++ b/app/javascript/flavours/glitch/styles/stream_entries.scss @@ -6,7 +6,8 @@ background: $simple-background-color; .detailed-status.light, - .status.light { + .status.light, + .more.light { border-bottom: 1px solid $ui-secondary-color; animation: none; } @@ -65,6 +66,10 @@ } } + .media-gallery__gifv__label { + bottom: 9px; + } + .status.light { padding: 14px 14px 14px (48px + 14px * 2); position: relative; @@ -145,10 +150,10 @@ a.status__content__spoiler-link { color: $primary-text-color; - background: $ui-primary-color; + background: $ui-base-color; &:hover { - background: lighten($ui-primary-color, 8%); + background: lighten($ui-base-color, 8%); } } } @@ -215,10 +220,10 @@ a.status__content__spoiler-link { color: $primary-text-color; - background: $ui-primary-color; + background: $ui-base-color; &:hover { - background: lighten($ui-primary-color, 8%); + background: lighten($ui-base-color, 8%); } } } @@ -261,16 +266,8 @@ } .media-spoiler { - background: $ui-primary-color; - color: $inverted-text-color; - transition: all 100ms linear; - - &:hover, - &:active, - &:focus { - background: darken($ui-primary-color, 5%); - color: unset; - } + background: $ui-base-color; + color: $darker-text-color; } .pre-header { @@ -299,6 +296,17 @@ text-decoration: underline; } } + + .more { + color: $darker-text-color; + display: block; + padding: 14px; + text-align: center; + + &:not(:hover) { + text-decoration: none; + } + } } .embed { diff --git a/app/javascript/flavours/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss index c12d84f1c..fa876e603 100644 --- a/app/javascript/flavours/glitch/styles/tables.scss +++ b/app/javascript/flavours/glitch/styles/tables.scss @@ -11,6 +11,7 @@ vertical-align: top; border-top: 1px solid $ui-base-color; text-align: left; + background: darken($ui-base-color, 4%); } & > thead > tr > th { @@ -48,9 +49,38 @@ } } - &.inline-table > tbody > tr:nth-child(odd) > td, - &.inline-table > tbody > tr:nth-child(odd) > th { - background: transparent; + &.inline-table { + & > tbody > tr:nth-child(odd) { + & > td, + & > th { + background: transparent; + } + } + + & > tbody > tr:first-child { + & > td, + & > th { + border-top: 0; + } + } + } + + &.batch-table { + & > thead > tr > th { + background: $ui-base-color; + border-top: 1px solid darken($ui-base-color, 8%); + border-bottom: 1px solid darken($ui-base-color, 8%); + + &:first-child { + border-radius: 4px 0 0; + border-left: 1px solid darken($ui-base-color, 8%); + } + + &:last-child { + border-radius: 0 4px 0 0; + border-right: 1px solid darken($ui-base-color, 8%); + } + } } } @@ -63,6 +93,13 @@ samp { font-family: 'mastodon-font-monospace', monospace; } +button.table-action-link { + background: transparent; + border: 0; + font: inherit; +} + +button.table-action-link, a.table-action-link { text-decoration: none; display: inline-block; @@ -79,4 +116,77 @@ a.table-action-link { font-weight: 400; margin-right: 5px; } + + &:first-child { + padding-left: 0; + } +} + +.batch-table { + &__toolbar, + &__row { + display: flex; + + &__select { + box-sizing: border-box; + padding: 8px 16px; + cursor: pointer; + min-height: 100%; + + input { + margin-top: 8px; + } + } + + &__actions, + &__content { + padding: 8px 0; + padding-right: 16px; + flex: 1 1 auto; + } + } + + &__toolbar { + border: 1px solid darken($ui-base-color, 8%); + background: $ui-base-color; + border-radius: 4px 0 0; + height: 47px; + align-items: center; + + &__actions { + text-align: right; + padding-right: 16px - 5px; + } + } + + &__row { + border: 1px solid darken($ui-base-color, 8%); + border-top: 0; + background: darken($ui-base-color, 4%); + + &:hover { + background: darken($ui-base-color, 2%); + } + + &:nth-child(even) { + background: $ui-base-color; + + &:hover { + background: lighten($ui-base-color, 2%); + } + } + + &__content { + padding-top: 12px; + padding-bottom: 16px; + } + } + + .status__content { + padding-top: 0; + + strong { + font-weight: 700; + } + } } diff --git a/app/javascript/flavours/glitch/util/html.js b/app/javascript/flavours/glitch/util/html.js new file mode 100644 index 000000000..0b646ce58 --- /dev/null +++ b/app/javascript/flavours/glitch/util/html.js @@ -0,0 +1,6 @@ +export const unescapeHTML = (html) => { + const wrapper = document.createElement('div'); + html = html.replace(/<br \/>|<br>|\n/g, ' '); + wrapper.innerHTML = html; + return wrapper.textContent; +}; diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js index 61b2d19e0..bfa2b4727 100644 --- a/app/javascript/mastodon/features/compose/components/upload.js +++ b/app/javascript/mastodon/features/compose/components/upload.js @@ -77,7 +77,7 @@ export default class Upload extends ImmutablePureComponent { {({ scale }) => ( <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}> <div className={classNames('compose-form__upload__actions', { active })}> - <button className='icon-button' onClick={this.handleUndoClick}><i className='fa fa-times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Undo' /></button> + <button className='icon-button' onClick={this.handleUndoClick}><i className='fa fa-times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button> {media.get('type') === 'image' && <button className='icon-button' onClick={this.handleFocalPointClick}><i className='fa fa-crosshairs' /> <FormattedMessage id='upload_form.focus' defaultMessage='Crop' /></button>} </div> diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index d531d8fd5..a4f27cd31 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "حظر @{name}", "account.block_domain": "إخفاء كل شيئ قادم من إسم النطاق {domain}", "account.blocked": "محظور", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 971475114..dd747ab3b 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Блокирай", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index f2e3699d5..22c5453ca 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Bloca @{name}", "account.block_domain": "Amaga-ho tot de {domain}", "account.blocked": "Bloquejat", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 2d7427c55..9d8d950a8 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -1,9 +1,10 @@ { + "account.badges.bot": "Bot", "account.block": "Bluccà @{name}", "account.block_domain": "Piattà tuttu da {domain}", "account.blocked": "Bluccatu", "account.direct": "Missaghju direttu @{name}", - "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.disclaimer_full": "Ghjè pussibule chì l’infurmazione quì sottu ùn rifletta micca u prufile sanu di l’utilizatore.", "account.domain_blocked": "Duminiu piattatu", "account.edit_profile": "Mudificà u prufile", "account.follow": "Siguità", @@ -28,7 +29,7 @@ "account.unfollow": "Ùn siguità più", "account.unmute": "Ùn piattà più @{name}", "account.unmute_notifications": "Ùn piattà più nutificazione da @{name}", - "account.view_full_profile": "View full profile", + "account.view_full_profile": "Vede tuttu u prufile", "alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.", "alert.unexpected.title": "Uups!", "boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta", @@ -78,7 +79,7 @@ "confirmations.delete.message": "Site sicuru·a che vulete supprime stu statutu?", "confirmations.delete_list.confirm": "Toglie", "confirmations.delete_list.message": "Site sicuru·a che vulete supprime sta lista?", - "confirmations.domain_block.confirm": "Piattà tuttu u duminiu?", + "confirmations.domain_block.confirm": "Piattà tuttu u duminiu", "confirmations.domain_block.message": "Site sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà.", "confirmations.mute.confirm": "Piattà", "confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?", @@ -107,13 +108,13 @@ "empty_column.home.public_timeline": "a linea pubblica", "empty_column.list": "Ùn c'hè ancu nunda quì. Quandu membri di sta lista manderanu novi statuti, i vidarete quì.", "empty_column.notifications": "Ùn avete ancu nisuna nutificazione. Interact with others to start the conversation.", - "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altre istanze per empie a linea pubblica.", + "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altre istanze per empie a linea pubblica", "follow_request.authorize": "Auturizà", "follow_request.reject": "Righjittà", "getting_started.appsshort": "Applicazione", "getting_started.faq": "FAQ", "getting_started.heading": "Per principià", - "getting_started.open_source_notice": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un bug, nant'à GitHub: {github}", + "getting_started.open_source_notice": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un bug, nant'à GitHub: {github}.", "getting_started.userguide": "Guida d'utilizazione", "home.column_settings.advanced": "Avanzati", "home.column_settings.basic": "Bàsichi", @@ -200,7 +201,7 @@ "onboarding.page_six.apps_available": "Ci sò {apps} dispunibule per iOS, Android è altre piattaforme.", "onboarding.page_six.github": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un prublemu, nant'à {github}.", "onboarding.page_six.guidelines": "regule di a cumunità", - "onboarding.page_six.read_guidelines": "Ùn vi scurdate di leghje e {guidelines} di {domain}", + "onboarding.page_six.read_guidelines": "Ùn vi scurdate di leghje e {guidelines} di {domain}!", "onboarding.page_six.various_app": "applicazione pè u telefuninu", "onboarding.page_three.profile": "Pudete mudificà u prufile per cambia u ritrattu, a descrizzione è u nome affissatu. Ci sò ancu alcun'altre preferenze.", "onboarding.page_three.search": "Fate usu di l'area di ricerca per truvà altre persone è vede hashtag cum'è {illustration} o {introductions}. Per vede qualcunu ch'ùn hè micca nant'à st'istanza, cercate u so identificatore complettu (pare un'email).", @@ -231,13 +232,13 @@ "report.target": "Signalamentu", "search.placeholder": "Circà", "search_popout.search_format": "Ricerca avanzata", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.full_text": "I testi simplici rimandanu i statuti ch'avete scritti, aghjunti à i vostri favuriti, spartuti o induve quelli site mintuvatu·a, è ancu i cugnomi, nomi pubblichi è hashtag chì currispondenu.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "statutu", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Un testu simplice rimanda i nomi pubblichi, cugnomi è hashtag", "search_popout.tips.user": "utilizatore", "search_results.accounts": "Ghjente", - "search_results.hashtags": "Hashtags", + "search_results.hashtags": "Hashtag", "search_results.statuses": "Statuti", "search_results.total": "{count, number} {count, plural, one {risultatu} other {risultati}}", "standalone.public_title": "Una vista di...", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index f442e0675..fe5bc4443 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "@{name} blocken", "account.block_domain": "Alles von {domain} verstecken", "account.blocked": "Blockiert", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index b400349d2..74bf97361 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -552,6 +552,10 @@ { "defaultMessage": "Domain hidden", "id": "account.domain_blocked" + }, + { + "defaultMessage": "Bot", + "id": "account.badges.bot" } ], "path": "app/javascript/mastodon/features/account/components/header.json" @@ -815,7 +819,7 @@ "id": "upload_form.description" }, { - "defaultMessage": "Undo", + "defaultMessage": "Delete", "id": "upload_form.undo" }, { @@ -1866,4 +1870,4 @@ ], "path": "app/javascript/mastodon/features/video/index.json" } -] \ No newline at end of file +] diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 5b36348eb..d1421be76 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Απόκλεισε τον/την @{name}", "account.block_domain": "Απόκρυψε τα πάντα από τον/την", "account.blocked": "Αποκλεισμένος/η", @@ -111,7 +112,7 @@ "follow_request.authorize": "Ενέκρινε", "follow_request.reject": "Απέρριψε", "getting_started.appsshort": "Εφαρμογές", - "getting_started.faq": "FAQ", + "getting_started.faq": "Συχνές Ερωτήσεις", "getting_started.heading": "Ξεκινώντας", "getting_started.open_source_notice": "Το Mastodon είναι ελεύθερο λογισμικό. Μπορείς να συνεισφέρεις ή να αναφέρεις ζητήματα στο GitHub στο {github}.", "getting_started.userguide": "Οδηγός Χρηστών", @@ -174,7 +175,7 @@ "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", "notification.reblog": "{name} boosted your status", - "notifications.clear": "Clear notifications", + "notifications.clear": "Καθαρισμός ειδοποιήσεων", "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", "notifications.column_settings.alert": "Desktop notifications", "notifications.column_settings.favourite": "Favourites:", @@ -194,7 +195,7 @@ "onboarding.page_one.full_handle": "Your full handle", "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", - "onboarding.page_six.admin": "Your instance's admin is {admin}.", + "onboarding.page_six.admin": "Ο διαχειριστής του κόμβου σου είναι ο/η {admin}.", "onboarding.page_six.almost_done": "Almost done...", "onboarding.page_six.appetoot": "Bon Appetoot!", "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", @@ -248,13 +249,13 @@ "status.direct": "Direct message @{name}", "status.embed": "Embed", "status.favourite": "Favourite", - "status.load_more": "Load more", + "status.load_more": "Φόρτωσε περισσότερα", "status.media_hidden": "Media hidden", "status.mention": "Mention @{name}", "status.more": "More", "status.mute": "Mute @{name}", "status.mute_conversation": "Mute conversation", - "status.open": "Expand this status", + "status.open": "Διεύρυνε αυτή την κατάσταση", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", "status.reblog": "Boost", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index d8e69fd3c..35c5a86e9 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", @@ -286,7 +287,7 @@ "upload_button.label": "Add media", "upload_form.description": "Describe for the visually impaired", "upload_form.focus": "Crop", - "upload_form.undo": "Undo", + "upload_form.undo": "Delete", "upload_progress.label": "Uploading...", "video.close": "Close video", "video.exit_fullscreen": "Exit full screen", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 1ab6d2aa0..4aa3d80a3 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Bloki @{name}", "account.block_domain": "Kaŝi ĉion de {domain}", "account.blocked": "Blokita", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 41d7db9da..8aac2d77d 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Bloquear", "account.block_domain": "Ocultar todo de {domain}", "account.blocked": "Bloqueado", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 49cdf5630..e927547e3 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokeatu @{name}", "account.block_domain": "{domain}(e)ko guztia ezkutatu", "account.blocked": "Blokeatuta", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 99aba00c3..e19b1cd85 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "مسدودسازی @{name}", "account.block_domain": "پنهانسازی همه چیز از سرور {domain}", "account.blocked": "مسدودشده", @@ -125,17 +126,17 @@ "keyboard_shortcuts.boost": "برای بازبوقیدن", "keyboard_shortcuts.column": "برای برجستهکردن یک نوشته در یکی از ستونها", "keyboard_shortcuts.compose": "برای فعالکردن کادر نوشتهٔ تازه", - "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.description": "توضیح", "keyboard_shortcuts.down": "برای پایینرفتن در فهرست", - "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.enter": "برای گشودن نوشته", "keyboard_shortcuts.favourite": "برای پسندیدن", - "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.heading": "میانبرهای صفحهکلید", "keyboard_shortcuts.hotkey": "میانبر", "keyboard_shortcuts.legend": "برای نمایش این راهنما", "keyboard_shortcuts.mention": "برای نامبردن از نویسنده", "keyboard_shortcuts.reply": "برای پاسخدادن", "keyboard_shortcuts.search": "برای فعالکردن جستجو", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_hidden": "برای نمایش/نهفتن نوشتهٔ پشت هشدار محتوا", "keyboard_shortcuts.toot": "برای آغاز یک بوق تازه", "keyboard_shortcuts.unfocus": "برای برداشتن توجه از نوشتن/جستجو", "keyboard_shortcuts.up": "برای بالا رفتن در فهرست", @@ -211,7 +212,7 @@ "privacy.direct.short": "مستقیم", "privacy.private.long": "تنها به پیگیران نشان بده", "privacy.private.short": "خصوصی", - "privacy.public.long": "در فهرست عمومی نشان بده", + "privacy.public.long": "نمایش در فهرست عمومی", "privacy.public.short": "عمومی", "privacy.unlisted.long": "عمومی، ولی فهرست نکن", "privacy.unlisted.short": "فهرستنشده", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 07d4d9aa5..cfe9c4f33 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Estä @{name}", "account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}", "account.blocked": "Estetty", @@ -29,8 +30,8 @@ "account.unmute": "Poista käyttäjän @{name} mykistys", "account.unmute_notifications": "Poista mykistys käyttäjän @{name} ilmoituksilta", "account.view_full_profile": "Näytä koko profiili", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", + "alert.unexpected.message": "Tapahtui odottamaton virhe.", + "alert.unexpected.title": "Hups!", "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}", "bundle_column_error.body": "Jokin meni vikaan komponenttia ladattaessa.", "bundle_column_error.retry": "Yritä uudestaan", @@ -41,7 +42,7 @@ "column.blocks": "Estetyt käyttäjät", "column.community": "Paikallinen aikajana", "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", + "column.domain_blocks": "Piilotetut verkkotunnukset", "column.favourites": "Suosikit", "column.follow_requests": "Seuraamispyynnöt", "column.home": "Koti", @@ -59,7 +60,7 @@ "column_header.unpin": "Poista kiinnitys", "column_subheading.navigation": "Navigaatio", "column_subheading.settings": "Asetukset", - "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", + "compose_form.direct_message_warning": "Tämä tuuttaus näkyy vain mainituille käyttäjille.", "compose_form.hashtag_warning": "Tämä tuuttaus ei näy hashtag-hauissa, koska se on listaamaton. Hashtagien avulla voi hakea vain julkisia tuuttauksia.", "compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.", "compose_form.lock_disclaimer.lock": "lukittu", @@ -135,7 +136,7 @@ "keyboard_shortcuts.mention": "mainitse julkaisija", "keyboard_shortcuts.reply": "vastaa", "keyboard_shortcuts.search": "siirry hakukenttään", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_hidden": "näytä/piilota sisältövaroituksella merkitty teksti", "keyboard_shortcuts.toot": "ala kirjoittaa uutta tuuttausta", "keyboard_shortcuts.unfocus": "siirry pois tekstikentästä tai hakukentästä", "keyboard_shortcuts.up": "siirry listassa ylöspäin", @@ -158,7 +159,7 @@ "navigation_bar.blocks": "Estetyt käyttäjät", "navigation_bar.community_timeline": "Paikallinen aikajana", "navigation_bar.direct": "Direct messages", - "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.domain_blocks": "Piilotetut verkkotunnukset", "navigation_bar.edit_profile": "Muokkaa profiilia", "navigation_bar.favourites": "Suosikit", "navigation_bar.follow_requests": "Seuraamispyynnöt", @@ -242,10 +243,10 @@ "search_results.total": "{count, number} {count, plural, one {result} other {results}}", "standalone.public_title": "Kurkistus sisälle...", "status.block": "Estä @{name}", - "status.cancel_reblog_private": "Unboost", + "status.cancel_reblog_private": "Peru buustaus", "status.cannot_reblog": "Tätä julkaisua ei voi buustata", "status.delete": "Poista", - "status.direct": "Direct message @{name}", + "status.direct": "Viesti käyttäjälle @{name}", "status.embed": "Upota", "status.favourite": "Tykkää", "status.load_more": "Lataa lisää", @@ -258,7 +259,7 @@ "status.pin": "Kiinnitä profiiliin", "status.pinned": "Kiinnitetty tuuttaus", "status.reblog": "Buustaa", - "status.reblog_private": "Boost to original audience", + "status.reblog_private": "Buustaa alkuperäiselle yleisölle", "status.reblogged_by": "{name} buustasi", "status.reply": "Vastaa", "status.replyAll": "Vastaa ketjuun", @@ -276,7 +277,7 @@ "tabs_bar.home": "Koti", "tabs_bar.local_timeline": "Paikallinen", "tabs_bar.notifications": "Ilmoitukset", - "tabs_bar.search": "Search", + "tabs_bar.search": "Hae", "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", "upload_button.label": "Lisää mediaa", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 16bf4033c..b0bda275c 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Bloquer @{name}", "account.block_domain": "Tout masquer venant de {domain}", "account.blocked": "Bloqué", @@ -187,7 +188,7 @@ "notifications.column_settings.sound": "Émettre un son", "onboarding.done": "Effectué", "onboarding.next": "Suivant", - "onboarding.page_five.public_timelines": "Le fil public global affiche les messages de toutes les personnes suivies par les membres de {domain}. Le fil public local est identique mais se limite aux membres de {domain}.", + "onboarding.page_five.public_timelines": "Le fil public global affiche les messages de toutes les personnes suivies par les membres de {domain}. Le fil public local est identique, mais se limite aux membres de {domain}.", "onboarding.page_four.home": "L’Accueil affiche les messages des personnes que vous suivez.", "onboarding.page_four.notifications": "La colonne de notification vous avertit lors d'une interaction avec vous.", "onboarding.page_one.federation": "Mastodon est un réseau de serveurs indépendants qui se joignent pour former un réseau social plus vaste. Nous appelons ces serveurs des instances.", @@ -225,7 +226,7 @@ "reply_indicator.cancel": "Annuler", "report.forward": "Transférer à {target}", "report.forward_hint": "Le compte provient d'un autre serveur. Envoyez également une copie anonyme du rapport ?", - "report.hint": "Le rapport sera envoyé aux modérateurs de votre instance. Vous pouvez expliquer pourquoi vous signalez ce compte ci-dessous :", + "report.hint": "Le rapport sera envoyé aux modérateurs de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :", "report.placeholder": "Commentaires additionnels", "report.submit": "Envoyer", "report.target": "Signalement", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 652ca31d1..29885b896 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Bloquear @{name}", "account.block_domain": "Ocultar calquer contido de {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 0ffbb14f3..a4bcba8ff 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "חסימת @{name}", "account.block_domain": "להסתיר הכל מהקהילה {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index c41cc3ea1..bd1dfac4c 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokiraj @{name}", "account.block_domain": "Sakrij sve sa {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index a0c186184..5059a45d4 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "@{name} letiltása", "account.block_domain": "Minden elrejtése innen: {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index a0442bad4..7fe723892 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Արգելափակել @{name}֊ին", "account.block_domain": "Թաքցնել ամենը հետեւյալ տիրույթից՝ {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 2fd922544..07b26a0a5 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokir @{name}", "account.block_domain": "Sembunyikan segalanya dari {domain}", "account.blocked": "Terblokir", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index ed45ee11e..a8ab72339 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokusar @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index a7ca62015..9d3486152 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blocca @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Bloccato", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index dbb4562de..1bdf34a81 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "@{name}さんをブロック", "account.block_domain": "{domain}全体を非表示", "account.blocked": "ブロック済み", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 2a2734673..e72a7dff9 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "@{name}을 차단", "account.block_domain": "{domain} 전체를 숨김", "account.blocked": "차단 됨", @@ -29,9 +30,9 @@ "account.unmute": "뮤트 해제", "account.unmute_notifications": "@{name}의 알림 뮤트 해제", "account.view_full_profile": "전체 프로필 보기", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "boost_modal.combo": "다음부터 {combo}를 누르면 이 과정을 건너뛸 수 있습니다.", + "alert.unexpected.message": "예측하지 못한 에러가 발생했습니다.", + "alert.unexpected.title": "앗!", + "boost_modal.combo": "{combo}를 누르면 다음부터 이 과정을 건너뛸 수 있습니다", "bundle_column_error.body": "컴포넌트를 불러오는 과정에서 문제가 발생했습니다.", "bundle_column_error.retry": "다시 시도", "bundle_column_error.title": "네트워크 에러", @@ -40,8 +41,8 @@ "bundle_modal_error.retry": "다시 시도", "column.blocks": "차단 중인 사용자", "column.community": "로컬 타임라인", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", + "column.direct": "다이렉트 메시지", + "column.domain_blocks": "숨겨진 도메인", "column.favourites": "즐겨찾기", "column.follow_requests": "팔로우 요청", "column.home": "홈", @@ -59,17 +60,17 @@ "column_header.unpin": "고정 해제", "column_subheading.navigation": "내비게이션", "column_subheading.settings": "설정", - "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", + "compose_form.direct_message_warning": "이 툿은 멘션 된 유저들에게만 보여집니다.", "compose_form.hashtag_warning": "이 툿은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 툿만이 해시태그로 검색 될 수 있습니다.", "compose_form.lock_disclaimer": "이 계정은 {locked}로 설정 되어 있지 않습니다. 누구나 이 계정을 팔로우 할 수 있으며, 팔로워 공개의 포스팅을 볼 수 있습니다.", "compose_form.lock_disclaimer.lock": "비공개", "compose_form.placeholder": "지금 무엇을 하고 있나요?", "compose_form.publish": "툿", "compose_form.publish_loud": "{publish}!", - "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.sensitive.marked": "미디어가 열람주의로 설정되어 있습니다", + "compose_form.sensitive.unmarked": "미디어가 열람주의로 설정 되어 있지 않습니다", + "compose_form.spoiler.marked": "열람주의가 설정되어 있습니다", + "compose_form.spoiler.unmarked": "열람주의가 설정 되어 있지 않습니다", "compose_form.spoiler_placeholder": "경고", "confirmation_modal.cancel": "취소", "confirmations.block.confirm": "차단", @@ -101,13 +102,13 @@ "emoji_button.symbols": "기호", "emoji_button.travel": "여행과 장소", "empty_column.community": "로컬 타임라인에 아무 것도 없습니다. 아무거나 적어 보세요!", - "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.direct": "아직 다이렉트 메시지가 없습니다. 다이렉트 메시지를 보내거나 받은 경우, 여기에 표시 됩니다.", "empty_column.hashtag": "이 해시태그는 아직 사용되지 않았습니다.", "empty_column.home": "아직 아무도 팔로우 하고 있지 않습니다. {public}를 보러 가거나, 검색하여 다른 사용자를 찾아 보세요.", "empty_column.home.public_timeline": "연합 타임라인", "empty_column.list": "리스트에 아직 아무 것도 없습니다.", - "empty_column.notifications": "아직 알림이 없습니다. 다른 사람과 대화를 시작해 보세요!", - "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 인스턴스 유저를 팔로우 해서 가득 채워보세요!", + "empty_column.notifications": "아직 알림이 없습니다. 다른 사람과 대화를 시작해 보세요.", + "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 인스턴스의 유저를 팔로우 해서 채워보세요", "follow_request.authorize": "허가", "follow_request.reject": "거부", "getting_started.appsshort": "애플리케이션", @@ -135,7 +136,7 @@ "keyboard_shortcuts.mention": "멘션", "keyboard_shortcuts.reply": "답장", "keyboard_shortcuts.search": "검색창에 포커스", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_hidden": "CW로 가려진 텍스트를 표시/비표시", "keyboard_shortcuts.toot": "새 툿 작성", "keyboard_shortcuts.unfocus": "작성창에서 포커스 해제", "keyboard_shortcuts.up": "리스트에서 위로 이동", @@ -157,8 +158,8 @@ "mute_modal.hide_notifications": "이 사용자로부터의 알림을 뮤트하시겠습니까?", "navigation_bar.blocks": "차단한 사용자", "navigation_bar.community_timeline": "로컬 타임라인", - "navigation_bar.direct": "Direct messages", - "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.direct": "다이렉트 메시지", + "navigation_bar.domain_blocks": "숨겨진 도메인", "navigation_bar.edit_profile": "프로필 편집", "navigation_bar.favourites": "즐겨찾기", "navigation_bar.follow_requests": "팔로우 요청", @@ -177,12 +178,12 @@ "notifications.clear": "알림 지우기", "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?", "notifications.column_settings.alert": "데스크탑 알림", - "notifications.column_settings.favourite": "즐겨찾기", - "notifications.column_settings.follow": "새 팔로워", - "notifications.column_settings.mention": "답글", + "notifications.column_settings.favourite": "즐겨찾기:", + "notifications.column_settings.follow": "새 팔로워:", + "notifications.column_settings.mention": "답글:", "notifications.column_settings.push": "푸시 알림", "notifications.column_settings.push_meta": "이 장치", - "notifications.column_settings.reblog": "부스트", + "notifications.column_settings.reblog": "부스트:", "notifications.column_settings.show": "컬럼에 표시", "notifications.column_settings.sound": "효과음 재생", "onboarding.done": "완료", @@ -200,7 +201,7 @@ "onboarding.page_six.apps_available": "iOS、Android 또는 다른 플랫폼에서 사용할 수 있는 {apps}이 있습니다.", "onboarding.page_six.github": "Mastodon는 오픈 소스 소프트웨어입니다. 버그 보고나 기능 추가 요청, 기여는 {github}에서 할 수 있습니다.", "onboarding.page_six.guidelines": "커뮤니티 가이드라인", - "onboarding.page_six.read_guidelines": "{guidelines}을 확인하는 것을 잊지 마세요.", + "onboarding.page_six.read_guidelines": "{domain}의 {guidelines}을 확인하는 것을 잊지 마세요!", "onboarding.page_six.various_app": "다양한 모바일 애플리케이션", "onboarding.page_three.profile": "[프로필 편집] 에서 자기 소개나 이름을 변경할 수 있습니다. 또한 다른 설정도 변경할 수 있습니다.", "onboarding.page_three.search": "검색 바에서 {illustration} 나 {introductions} 와 같이 특정 해시태그가 달린 포스트를 보거나, 사용자를 찾을 수 있습니다.", @@ -242,10 +243,10 @@ "search_results.total": "{count, number}건의 결과", "standalone.public_title": "지금 이런 이야기를 하고 있습니다…", "status.block": "@{name} 차단", - "status.cancel_reblog_private": "Unboost", + "status.cancel_reblog_private": "부스트 취소", "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다", "status.delete": "삭제", - "status.direct": "Direct message @{name}", + "status.direct": "@{name}에게 다이렉트 메시지", "status.embed": "공유하기", "status.favourite": "즐겨찾기", "status.load_more": "더 보기", @@ -258,7 +259,7 @@ "status.pin": "고정", "status.pinned": "고정 된 툿", "status.reblog": "부스트", - "status.reblog_private": "Boost to original audience", + "status.reblog_private": "원래의 수신자들에게 부스트", "status.reblogged_by": "{name}님이 부스트 했습니다", "status.reply": "답장", "status.replyAll": "전원에게 답장", @@ -267,16 +268,16 @@ "status.sensitive_warning": "민감한 미디어", "status.share": "공유", "status.show_less": "숨기기", - "status.show_less_all": "Show less for all", + "status.show_less_all": "모두 접기", "status.show_more": "더 보기", - "status.show_more_all": "Show more for all", + "status.show_more_all": "모두 펼치기", "status.unmute_conversation": "이 대화의 뮤트 해제하기", "status.unpin": "고정 해제", "tabs_bar.federated_timeline": "연합", "tabs_bar.home": "홈", "tabs_bar.local_timeline": "로컬", "tabs_bar.notifications": "알림", - "tabs_bar.search": "Search", + "tabs_bar.search": "검색", "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.", "upload_area.title": "드래그 & 드롭으로 업로드", "upload_button.label": "미디어 추가", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index adc1d19a7..a6bfe36f9 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokkeer @{name}", "account.block_domain": "Negeer alles van {domain}", "account.blocked": "Geblokkeerd", @@ -50,7 +51,7 @@ "column.notifications": "Meldingen", "column.pins": "Vastgezette toots", "column.public": "Globale tijdlijn", - "column_back_button.label": "terug", + "column_back_button.label": "Terug", "column_header.hide_settings": "Instellingen verbergen", "column_header.moveLeft_settings": "Kolom naar links verplaatsen", "column_header.moveRight_settings": "Kolom naar rechts verplaatsen", @@ -61,7 +62,7 @@ "column_subheading.settings": "Instellingen", "compose_form.direct_message_warning": "Deze toot zal alleen zichtbaar zijn voor alle vermelde gebruikers.", "compose_form.hashtag_warning": "Deze toot valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare toots kunnen via hashtags gevonden worden.", - "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en toots zien die je alleen aan volgers hebt gericht.", + "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de toots zien die je alleen aan jouw volgers hebt gericht.", "compose_form.lock_disclaimer.lock": "besloten", "compose_form.placeholder": "Wat wil je kwijt?", "compose_form.publish": "Toot", @@ -76,10 +77,10 @@ "confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?", "confirmations.delete.confirm": "Verwijderen", "confirmations.delete.message": "Weet je het zeker dat je deze toot wilt verwijderen?", - "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.confirm": "Verwijderen", "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?", "confirmations.domain_block.confirm": "Negeer alles van deze server", - "confirmations.domain_block.message": "Weet je het echt, echt zeker dat je alles van {domain} wil negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en gewenst.", + "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wil negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en gepaster.", "confirmations.mute.confirm": "Negeren", "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", "confirmations.unfollow.confirm": "Ontvolgen", @@ -106,13 +107,13 @@ "empty_column.home": "Jij volgt nog niemand. Bezoek {public} of gebruik het zoekvenster om andere mensen te ontmoeten.", "empty_column.home.public_timeline": "de globale tijdlijn", "empty_column.list": "Er is nog niks in deze lijst. Wanneer lijstleden nieuwe toots publiceren, zijn deze hier te zien.", - "empty_column.notifications": "Je hebt nog geen meldingen. Heb interactie met andere mensen om het gesprek aan te gaan.", + "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.", "empty_column.public": "Er is hier helemaal niks! Toot iets in het openbaar of volg mensen van andere servers om het te vullen", "follow_request.authorize": "Goedkeuren", "follow_request.reject": "Afkeuren", "getting_started.appsshort": "Apps", "getting_started.faq": "FAQ", - "getting_started.heading": "Beginnen", + "getting_started.heading": "Aan de slag", "getting_started.open_source_notice": "Mastodon is vrije software. Je kunt bijdragen of problemen melden op GitHub via {github}.", "getting_started.userguide": "Gebruikersgids", "home.column_settings.advanced": "Geavanceerd", @@ -131,7 +132,7 @@ "keyboard_shortcuts.favourite": "om als favoriet te markeren", "keyboard_shortcuts.heading": "Sneltoetsen", "keyboard_shortcuts.hotkey": "Sneltoets", - "keyboard_shortcuts.legend": "om deze legenda weer te geven", + "keyboard_shortcuts.legend": "om deze legenda te tonen", "keyboard_shortcuts.mention": "om de auteur te vermelden", "keyboard_shortcuts.reply": "om te reageren", "keyboard_shortcuts.search": "om het zoekvak te focussen", @@ -187,7 +188,7 @@ "notifications.column_settings.sound": "Geluid afspelen", "onboarding.done": "Klaar", "onboarding.next": "Volgende", - "onboarding.page_five.public_timelines": "De lokale tijdlijn toont openbare toots van iedereen op {domain}. De globale tijdlijn toont openbare toots van iedereen die door gebruikers van {domain} worden gevolgd, dus ook mensen van andere Mastodonservers. Dit zijn de openbare tijdlijnen en vormen een uitstekende manier om nieuwe mensen te ontdekken.", + "onboarding.page_five.public_timelines": "De lokale tijdlijn toont openbare toots van iedereen op {domain}. De globale tijdlijn toont openbare toots van iedereen die door gebruikers van {domain} worden gevolgd, dus ook mensen van andere Mastodonservers. Dit zijn de openbare tijdlijnen en vormen een uitstekende manier om nieuwe mensen te leren kennen.", "onboarding.page_four.home": "Deze tijdlijn laat toots zien van mensen die jij volgt.", "onboarding.page_four.notifications": "De kolom met meldingen toont alle interacties die je met andere Mastodongebruikers hebt.", "onboarding.page_one.federation": "Mastodon is een netwerk van onafhankelijke servers die samen een groot sociaal netwerk vormen.", @@ -231,7 +232,7 @@ "report.target": "Rapporteer {target}", "search.placeholder": "Zoeken", "search_popout.search_format": "Geavanceerd zoeken", - "search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken naar jouw toots, gebooste toots, favorieten en naar toots waarin jij bent vermeldt, en naar gebruikersnamen, weergavenamen en hashtags.", + "search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken in jouw toots, gebooste toots, favorieten en in toots waarin jij bent vermeldt, en tevens naar gebruikersnamen, weergavenamen en hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "toot", "search_popout.tips.text": "Gebruik gewone tekst om te zoeken op weergavenamen, gebruikersnamen en hashtags", @@ -253,7 +254,7 @@ "status.mention": "Vermeld @{name}", "status.more": "Meer", "status.mute": "Negeer @{name}", - "status.mute_conversation": "Negeer conversatie", + "status.mute_conversation": "Negeer gesprek", "status.open": "Toot volledig tonen", "status.pin": "Aan profielpagina vastmaken", "status.pinned": "Vastgemaakte toot", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 0ee6d0722..05dae0630 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokkér @{name}", "account.block_domain": "Skjul alt fra {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index c4cb996cf..ead57d63f 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blocar @{name}", "account.block_domain": "Tot amagar del domeni {domain}", "account.blocked": "Blocat", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 6d6db7c82..120edcb1c 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokuj @{name}", "account.block_domain": "Blokuj wszystko z {domain}", "account.blocked": "Zablokowany", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 7f8690f91..2360c41e7 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Bloquear @{name}", "account.block_domain": "Esconder tudo de {domain}", "account.blocked": "Bloqueado", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index ce816dc41..3ac92dd57 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Bloquear @{name}", "account.block_domain": "Esconder tudo do domínio {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 8eeebaf73..599873439 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Блокировать", "account.block_domain": "Блокировать все с {domain}", "account.blocked": "Заблокирован(а)", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index d69648ccf..1cf7dee80 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokovať @{name}", "account.block_domain": "Ukryť všetko z {domain}", "account.blocked": "Blokovaný/á", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json new file mode 100644 index 000000000..202dc4bd0 --- /dev/null +++ b/app/javascript/mastodon/locales/sl.json @@ -0,0 +1,297 @@ +{ + "account.badges.bot": "Bot", + "account.block": "Blokiraj @{name}", + "account.block_domain": "Skrij vse iz {domain}", + "account.blocked": "Blokirano", + "account.direct": "Neposredno sporočilo @{name}", + "account.disclaimer_full": "Information below may reflect the user's profile incompletely.", + "account.domain_blocked": "Domain hidden", + "account.edit_profile": "Edit profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.follows": "Follows", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval. Click to cancel follow request", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "account.view_full_profile": "View full profile", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.domain_blocks": "Hidden domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toot", + "column.public": "Federated timeline", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.navigation": "Navigation", + "column_subheading.settings": "Settings", + "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "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_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "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.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.", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.appsshort": "Apps", + "getting_started.faq": "FAQ", + "getting_started.heading": "Getting started", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.userguide": "User Guide", + "home.column_settings.advanced": "Advanced", + "home.column_settings.basic": "Basic", + "home.column_settings.filter_regex": "Filter out by regular expressions", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "home.settings": "Column settings", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.direct": "Direct messages", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Favourites", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.info": "Extended information", + "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.mention": "{name} mentioned you", + "notification.reblog": "{name} boosted your status", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.push_meta": "This device", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "onboarding.done": "Done", + "onboarding.next": "Next", + "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.", + "onboarding.page_four.home": "The home timeline shows posts from people you follow.", + "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", + "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", + "onboarding.page_one.welcome": "Welcome to Mastodon!", + "onboarding.page_six.admin": "Your instance's admin is {admin}.", + "onboarding.page_six.almost_done": "Almost done...", + "onboarding.page_six.appetoot": "Bon Appetoot!", + "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.", + "onboarding.page_six.github": "Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.", + "onboarding.page_six.guidelines": "community guidelines", + "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!", + "onboarding.page_six.various_app": "mobile apps", + "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.", + "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.", + "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", + "onboarding.skip": "Skip", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Post to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Post to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not show in public timelines", + "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Report {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "standalone.public_title": "A look inside...", + "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.delete": "Delete", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", + "status.reblogged_by": "{name} boosted", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_toggle": "Click to view", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media", + "upload_form.description": "Describe for the visually impaired", + "upload_form.focus": "Crop", + "upload_form.undo": "Undo", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index b1ea0d179..490b3a51a 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blokiraj korisnika @{name}", "account.block_domain": "Sakrij sve sa domena {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index aa978675f..b331f9f48 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Блокирај корисника @{name}", "account.block_domain": "Сакриј све са домена {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 4efe88a7e..36b200764 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Blockera @{name}", "account.block_domain": "Dölj allt från {domain}", "account.blocked": "Blockerad", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index a56720fee..038ac6abb 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 82b44fe30..8d24395af 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Block @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 056fbfe8f..a377e7b74 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Engelle @{name}", "account.block_domain": "Hide everything from {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 1a7b58789..613d1a00d 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "Заблокувати", "account.block_domain": "Заглушити {domain}", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/whitelist_sl.json b/app/javascript/mastodon/locales/whitelist_sl.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_sl.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index a3a4de0af..073dbe6cb 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "屏蔽 @{name}", "account.block_domain": "隐藏来自 {domain} 的内容", "account.blocked": "Blocked", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 7719e08a6..0c012aa7d 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "封鎖 @{name}", "account.block_domain": "隱藏來自 {domain} 的一切文章", "account.blocked": "封鎖", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 84ff25e03..0f4d04947 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -1,4 +1,5 @@ { + "account.badges.bot": "Bot", "account.block": "封鎖 @{name}", "account.block_domain": "隱藏來自 {domain} 的一切貼文", "account.blocked": "已被封鎖的", diff --git a/app/lib/request.rb b/app/lib/request.rb index fc7d398e0..731bf7687 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -51,16 +51,17 @@ class Request end def headers - (@account ? @headers.merge('Signature' => signature) : @headers).reverse_merge('Accept-Encoding' => 'gzip').without(REQUEST_TARGET) + (@account ? @headers.merge('Signature' => signature) : @headers).without(REQUEST_TARGET) end private def set_common_headers! - @headers[REQUEST_TARGET] = "#{@verb} #{@url.path}" - @headers['User-Agent'] = user_agent - @headers['Host'] = @url.host - @headers['Date'] = Time.now.utc.httpdate + @headers[REQUEST_TARGET] = "#{@verb} #{@url.path}" + @headers['User-Agent'] = user_agent + @headers['Host'] = @url.host + @headers['Date'] = Time.now.utc.httpdate + @headers['Accept-Encoding'] = 'gzip' if @verb != :head end def set_digest! diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb index 7f1ef5191..20ddbca53 100644 --- a/app/models/concerns/remotable.rb +++ b/app/models/concerns/remotable.rb @@ -41,6 +41,9 @@ module Remotable rescue HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, Paperclip::Errors::NotIdentifiedByImageMagickError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e Rails.logger.debug "Error fetching remote #{attachment_name}: #{e}" nil + rescue Paperclip::Error => e + Rails.logger.debug "Error processing remote #{attachment_name}: #{e}" + nil end end diff --git a/app/models/user.rb b/app/models/user.rb index 82d165079..d5ca9be36 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -245,7 +245,7 @@ class User < ApplicationRecord end def web_push_subscription(session) - session.web_push_subscription.nil? ? nil : session.web_push_subscription.as_payload + session.web_push_subscription.nil? ? nil : session.web_push_subscription end def invite_code=(code) diff --git a/app/models/web/push_subscription.rb b/app/models/web/push_subscription.rb index 1736106f7..df549c6d3 100644 --- a/app/models/web/push_subscription.rb +++ b/app/models/web/push_subscription.rb @@ -3,38 +3,51 @@ # # Table name: web_push_subscriptions # -# id :bigint(8) not null, primary key -# endpoint :string not null -# key_p256dh :string not null -# key_auth :string not null -# data :json -# created_at :datetime not null -# updated_at :datetime not null +# id :bigint(8) not null, primary key +# endpoint :string not null +# key_p256dh :string not null +# key_auth :string not null +# data :json +# created_at :datetime not null +# updated_at :datetime not null +# access_token_id :bigint(8) +# user_id :bigint(8) # -require 'webpush' - class Web::PushSubscription < ApplicationRecord + belongs_to :user, optional: true + belongs_to :access_token, class_name: 'Doorkeeper::AccessToken', optional: true + has_one :session_activation def push(notification) - I18n.with_locale(session_activation.user.locale || I18n.default_locale) do + I18n.with_locale(associated_user.locale || I18n.default_locale) do push_payload(message_from(notification), 48.hours.seconds) end end def pushable?(notification) - data&.key?('alerts') && data['alerts'][notification.type.to_s] + data&.key?('alerts') && ActiveModel::Type::Boolean.new.cast(data['alerts'][notification.type.to_s]) end - def as_payload - payload = { id: id, endpoint: endpoint } - payload[:alerts] = data['alerts'] if data&.key?('alerts') - payload + def associated_user + return @associated_user if defined?(@associated_user) + + @associated_user = if user_id.nil? + session_activation.user + else + user + end end - def access_token - find_or_create_access_token.token + def associated_access_token + return @associated_access_token if defined?(@associated_access_token) + + @associated_access_token = if access_token_id.nil? + find_or_create_access_token.token + else + access_token + end end private diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index 1d17e2b0a..eefd853ff 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -2,19 +2,15 @@ class InitialStateSerializer < ActiveModel::Serializer attributes :meta, :compose, :accounts, - :media_attachments, :settings, :push_subscription, + :media_attachments, :settings :max_toot_chars - has_many :custom_emojis, serializer: REST::CustomEmojiSerializer + has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer def max_toot_chars StatusLengthValidator::MAX_CHARS end - def custom_emojis - CustomEmoji.local.where(disabled: false) - end - def meta store = { streaming_api_base_url: Rails.configuration.x.streaming_api_base_url, diff --git a/app/serializers/rest/web_push_subscription_serializer.rb b/app/serializers/rest/web_push_subscription_serializer.rb new file mode 100644 index 000000000..7fd952a56 --- /dev/null +++ b/app/serializers/rest/web_push_subscription_serializer.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class REST::WebPushSubscriptionSerializer < ActiveModel::Serializer + attributes :id, :endpoint, :alerts, :server_key + + def alerts + object.data&.dig('alerts') || {} + end + + def server_key + Rails.configuration.x.vapid_public_key + end +end diff --git a/app/serializers/web/notification_serializer.rb b/app/serializers/web/notification_serializer.rb index e5524fe7a..31c703832 100644 --- a/app/serializers/web/notification_serializer.rb +++ b/app/serializers/web/notification_serializer.rb @@ -54,7 +54,7 @@ class Web::NotificationSerializer < ActiveModel::Serializer def access_token return if actions.empty? - current_push_subscription.access_token + current_push_subscription.associated_access_token end def message diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index ba086449c..6490d2735 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -9,6 +9,7 @@ class NotifyService < BaseService return if recipient.user.nil? || blocked? create_notification + push_notification if @notification.browserable? send_email if email_enabled? rescue ActiveRecord::RecordInvalid return @@ -101,25 +102,27 @@ class NotifyService < BaseService def create_notification @notification.save! - return unless @notification.browserable? + end + + def push_notification + return if @notification.activity.nil? + Redis.current.publish("timeline:#{@recipient.id}", Oj.dump(event: :notification, payload: InlineRenderer.render(@notification, @recipient, :notification))) send_push_notifications end def send_push_notifications - # HACK: Can be caused by quickly unfavouriting a status, since creating - # a favourite and creating a notification are not wrapped in a transaction. - return if @notification.activity.nil? - - sessions_with_subscriptions = @recipient.user.session_activations.where.not(web_push_subscription: nil) - sessions_with_subscriptions_ids = sessions_with_subscriptions.select { |session| session.web_push_subscription.pushable? @notification }.map(&:id) + subscriptions_ids = ::Web::PushSubscription.where(user_id: @recipient.user.id) + .select { |subscription| subscription.pushable?(@notification) } + .map(&:id) - WebPushNotificationWorker.push_bulk(sessions_with_subscriptions_ids) do |session_activation_id| - [session_activation_id, @notification.id] + ::Web::PushNotificationWorker.push_bulk(subscriptions_ids) do |subscription_id| + [subscription_id, @notification.id] end end def send_email + return if @notification.activity.nil? NotificationMailer.public_send(@notification.type, @recipient, @notification).deliver_later end diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml index bbf2139a5..cfdd3a945 100644 --- a/app/views/accounts/show.html.haml +++ b/app/views/accounts/show.html.haml @@ -8,6 +8,7 @@ %meta{ name: 'robots', content: 'noindex' }/ %link{ rel: 'salmon', href: api_salmon_url(@account.id) }/ + %link{ rel: 'alternate', type: 'application/rss+xml', href: account_url(@account, format: 'rss') }/ %link{ rel: 'alternate', type: 'application/atom+xml', href: account_url(@account, format: 'atom') }/ %link{ rel: 'alternate', type: 'application/activity+json', href: ActivityPub::TagManager.instance.uri_for(@account) }/ diff --git a/app/views/tags/_og.html.haml b/app/views/tags/_og.html.haml index 853a499ae..a7c289bcb 100644 --- a/app/views/tags/_og.html.haml +++ b/app/views/tags/_og.html.haml @@ -2,5 +2,5 @@ = opengraph 'og:url', tag_url(@tag) = opengraph 'og:type', 'website' = opengraph 'og:title', "##{@tag.name}" -= opengraph 'og:description', t('about.about_hashtag_html', hashtag: @tag.name) += opengraph 'og:description', strip_tags(t('about.about_hashtag_html', hashtag: @tag.name)) = opengraph 'twitter:card', 'summary' diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index c2202a9eb..2b46e58c7 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -2,6 +2,8 @@ = "##{@tag.name}" - content_for :header_tags do + %link{ rel: 'alternate', type: 'application/rss+xml', href: tag_url(@tag, format: 'rss') }/ + %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) = render 'og' diff --git a/app/workers/web/push_notification_worker.rb b/app/workers/web/push_notification_worker.rb new file mode 100644 index 000000000..4a40e5c8b --- /dev/null +++ b/app/workers/web/push_notification_worker.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class Web::PushNotificationWorker + include Sidekiq::Worker + + sidekiq_options backtrace: true + + def perform(subscription_id, notification_id) + subscription = ::Web::PushSubscription.find(subscription_id) + notification = Notification.find(notification_id) + + subscription.push(notification) unless notification.activity.nil? + rescue Webpush::InvalidSubscription, Webpush::ExpiredSubscription + subscription.destroy! + rescue ActiveRecord::RecordNotFound + true + end +end diff --git a/app/workers/web_push_notification_worker.rb b/app/workers/web_push_notification_worker.rb deleted file mode 100644 index eacea04c3..000000000 --- a/app/workers/web_push_notification_worker.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -class WebPushNotificationWorker - include Sidekiq::Worker - - sidekiq_options backtrace: true - - def perform(session_activation_id, notification_id) - session_activation = SessionActivation.find(session_activation_id) - notification = Notification.find(notification_id) - - return if session_activation.web_push_subscription.nil? || notification.activity.nil? - - session_activation.web_push_subscription.push(notification) - rescue Webpush::InvalidSubscription, Webpush::ExpiredSubscription - # Subscription expiration is not currently implemented in any browser - - session_activation.web_push_subscription.destroy! - session_activation.update!(web_push_subscription: nil) - - true - rescue ActiveRecord::RecordNotFound - true - end -end diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 074f8c410..469553803 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -55,7 +55,7 @@ Doorkeeper.configure do # For more information go to # https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes default_scopes :read - optional_scopes :write, :follow + optional_scopes :write, :follow, :push # Change the way client credentials are retrieved from the request object. # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then diff --git a/config/locales/activerecord.nl.yml b/config/locales/activerecord.nl.yml index 797209665..eeabab34a 100644 --- a/config/locales/activerecord.nl.yml +++ b/config/locales/activerecord.nl.yml @@ -6,7 +6,7 @@ nl: account: attributes: username: - invalid: alleen letters, nummers en laag streepje + invalid: alleen letters, nummers en underscores status: attributes: reblog: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 632bd03b0..194d91cb0 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -53,7 +53,7 @@ ar: unfollow: إلغاء المتابعة admin: account_moderation_notes: - create: إنشاء + create: إترك ملاحظة created_msg: تم إنشاء ملاحظة الإشراف بنجاح ! delete: حذف destroyed_msg: تم تدمير ملاحظة الإشراف بنجاح ! @@ -142,6 +142,7 @@ ar: statuses: المنشورات subscribe: اشترك title: الحسابات + unconfirmed_email: البريد الإلكتروني غير المؤكد undo_silenced: رفع الصمت undo_suspension: إلغاء تعليق الحساب unsubscribe: إلغاء الاشتراك @@ -149,6 +150,8 @@ ar: web: الويب action_logs: actions: + assigned_to_self_report: قام {name} بتعيين التقرير٪ {target} لأنفسهم + change_email_user: غيّر٪ {name} عنوان البريد الإلكتروني للمستخدم٪ {target} confirm_user: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}" create_custom_emoji: "%{name} قام برفع إيموجي جديد %{target}" create_domain_block: "%{name} قام بحجب نطاق %{target}" @@ -164,10 +167,13 @@ ar: enable_user: "%{name} لقد قام بتنشيط تسجيل الدخول للمستخدِم %{target}" memorialize_account: لقد قام %{name} بتحويل حساب %{target} إلى صفحة تذكارية promote_user: "%{name} قام بترقية المستخدم %{target}" + remove_avatar_user: تمت إزالة٪ {name} الصورة الرمزية٪ {target} + reopen_report: تمت إعادة فتح التقرير {name}٪ {target} reset_password_user: "%{name} لقد قام بإعادة تعيين الكلمة السرية الخاصة بـ %{target}" resolve_report: قام %{name} بحل التقرير %{target} silence_account: لقد قام %{name} بكتم حساب %{target} suspend_account: لقد قام %{name} بتعليق حساب %{target} + unassigned_report: "٪ {name} تقرير غير معتمد٪ {target}" unsilence_account: لقد قام %{name} بإلغاء الكتم عن حساب %{target} unsuspend_account: لقد قام %{name} بإلغاء التعليق المفروض على حساب %{target} update_custom_emoji: "%{name} قام بتحديث الإيموجي %{target}" @@ -205,12 +211,15 @@ ar: domain: النطاق new: create: إنشاء حظر + hint: لن تمنع كتلة المجال إنشاء إدخالات حساب في قاعدة البيانات ، ولكنها ستطبق طرق الإشراف المحددة بأثر رجعي وتلقائي على هذه الحسابات. severity: + desc_html: "<strong>Silence</strong> سيجعل مشاركات الحساب غير مرئية لأي شخص لا يتبعها. <strong>Suspend</strong> سيزيل كل محتوى الحساب ووسائطه وبيانات ملفه الشخصي. Use <strong>None</strong> إذا كنت تريد فقط رفض ملفات الوسائط." noop: لا شيء silence: كتم suspend: تعليق title: حجب نطاق جديد reject_media: رفض ملفات الوسائط + reject_media_hint: يزيل ملفات الوسائط المخزنة محليًا ويرفض تنزيل أي ملفات في المستقبل. غير ذي صلة للتعليق severities: noop: لا شيء silence: إخفاء أو كتم @@ -250,35 +259,59 @@ ar: expired: المنتهي صلاحيتها title: التصفية title: الدعوات + report_notes: + created_msg: |- + 41/5000 + تم إنشاء ملاحظة التقرير بنجاح! + destroyed_msg: تم حذف ملاحظة التقرير بنجاح! reports: + account: + note: ملحوظة + report: تقرير action_taken_by: تم اتخاذ الإجراء مِن طرف are_you_sure: هل أنت متأكد ؟ + assign_to_self: عين لي + assigned: تعين رئيس comment: none: لا شيء + created_at: ذكرت id: معرّف ID mark_as_resolved: إعتبار التقرير كمحلول + mark_as_unresolved: علام كغير محلولة + notes: + create: اضف ملاحظة + create_and_resolve: الحل مع ملاحظة + create_and_unresolve: إعادة فتح مع ملاحظة + delete: حذف + placeholder: وصف الإجراءات التي تم اتخاذها أو أي تحديثات أخرى لهذا التقرير … + reopen: إعادة فتح التقرير report: 'التقرير #%{id}' report_contents: المحتويات reported_account: حساب مُبلّغ عنه reported_by: أبلغ عنه من طرف resolved: معالجة + resolved_msg: تم حل تقرير بنجاح! silence_account: كتم و إخفاء الحساب status: الحالة suspend_account: فرض تعليق على الحساب target: الهدف title: التقارير + unassign: إلغاء تعيين unresolved: غير معالجة + updated_at: محدث view: عرض settings: activity_api_enabled: desc_html: عدد المنشورات المحلية و المستخدمين النشطين و التسجيلات الأسبوعية الجديدة title: نشر مُجمل الإحصائيات عن نشاط المستخدمين bootstrap_timeline_accounts: + desc_html: افصل بين أسماء المستخدمين المتعددة بواسطة الفاصلة. استعمل الحسابات المحلية والمفتوحة فقط. الافتراضي عندما تكون فارغة كل المسؤولين المحليين. title: الإشتراكات الإفتراضية للمستخدمين الجدد contact_information: email: البريد الإلكتروني المهني username: الإتصال بالمستخدِم hero: + desc_html: معروض على الصفحة الأولى. لا يقل عن 600 × 100 بكسل. عند عدم التعيين ، تعود الصورة إلى النسخة المصغرة على سبيل المثال title: الصورة الرأسية peers_api_enabled: desc_html: أسماء النطاقات التي إلتقى بها مثيل الخادوم على البيئة الموحَّدة فيديفرس @@ -297,15 +330,23 @@ ar: desc_html: السماح للجميع بإنشاء حساب title: فتح التسجيل show_known_fediverse_at_about_page: + desc_html: عند التثبت ، سوف تظهر toots من جميع fediverse المعروفة على عرض مسبق. وإلا فإنه سيعرض فقط toots المحلية. title: إظهار الفيديفرس الموحَّد في خيط المُعايَنة + show_staff_badge: + desc_html: عرض شارة الموظفين على صفحة المستخدم + title: إظهار شارة الموظفين site_description: + desc_html: فقرة تمهيدية على الصفحة الأولى وفي العلامات الوصفية. يمكنك استخدام علامات HTML ، ولا سيما <code><a></code> و <code><em></code>. title: وصف مثيل الخادوم site_description_extended: + desc_html: مكان جيد لمدونة قواعد السلوك والقواعد والإرشادات وغيرها من الأمور التي تحدد حالتك. يمكنك استخدام علامات HTML title: الوصف المُفصّل للموقع site_terms: + desc_html: يمكنك كتابة سياسة الخصوصية الخاصة بك ، شروط الخدمة أو غيرها من القوانين. يمكنك استخدام علامات HTML title: شروط الخدمة المخصصة site_title: إسم مثيل الخادم thumbnail: + desc_html: يستخدم للعروض السابقة عبر Open Graph و API. 1200x630px موصى به title: الصورة الرمزية المصغرة لمثيل الخادوم timeline_preview: desc_html: عرض الخيط العمومي على صفحة الإستقبال @@ -315,12 +356,16 @@ ar: back_to_account: العودة إلى صفحة الحساب batch: delete: حذف + nsfw_off: ضع علامة انها غير حساسة + nsfw_on: ضع علامة انها حساسة failed_to_execute: خطأ في التفعيل media: title: الوسائط + no_media: لا يوجد وسائط title: منشورات الحساب with_media: بالوسائط subscriptions: + callback_url: عاود الاتصال بالعنوان confirmed: مؤكَّد expires_in: تنتهي مدة صلاحيتها في last_delivery: آخر إيداع @@ -330,6 +375,8 @@ ar: admin_mailer: new_report: body: قام %{reporter} بالإبلاغ عن %{target} + body_remote: أبلغ شخص ما من٪ {domain} عن٪ {target} + subject: تقرير جديد ل%{instance} (#%{id}) application_mailer: notification_preferences: تعديل خيارات البريد الإلكتروني salutation: "%{name}،" @@ -342,6 +389,7 @@ ar: destroyed: تم حذف التطبيق بنجاح invalid_url: إن الرابط المقدم غير صالح regenerate_token: إعادة توليد رمز النفاذ + token_regenerated: تم إعادة إنشاء الرمز الوصول بنجاح warning: كن حذرا مع هذه البيانات. لا تقم أبدا بمشاركتها مع الآخَرين ! your_token: رمز نفاذك auth: @@ -352,6 +400,7 @@ ar: delete_account_html: إن كنت ترغب في حذف حسابك يُمكنك <a href="%{path}">المواصلة هنا</a>. سوف يُطلَبُ منك التأكيد قبل الحذف. didnt_get_confirmation: لم تتلق تعليمات التأكيد ؟ forgot_password: نسيت كلمة المرور ؟ + invalid_reset_password_token: رمز إعادة تعيين كلمة المرور غير صالح أو منتهي الصلاحية. يرجى طلب واحد جديد. login: تسجيل الدخول logout: خروج migrate_account: الإنتقال إلى حساب آخر @@ -368,6 +417,7 @@ ar: security: الهوية set_new_password: إدخال كلمة مرور جديدة authorize_follow: + already_following: أنت تتابع بالفعل هذا الحساب error: يا للأسف، وقع هناك خطأ إثر عملية البحث عن الحساب عن بعد follow: إتبع follow_request: 'لقد قمت بإرسال طلب متابعة إلى :' @@ -410,7 +460,7 @@ ar: archive_takeout: date: التاريخ download: تنزيل نسخة لحسابك - hint_html: بإمكانك طلب نسخة كاملة لـ <strong>كافة تبويقاتك و الوسائط التي قمت بنشرها</strong>. البيانات المُصدَّرة ستكون محفوظة على شكل نسق ActivityPub و باستطاعتك قراءتها بأي برنامج يدعم هذا النسق. + hint_html: بإمكانك طلب نسخة كاملة لـ <strong>كافة تبويقاتك و الوسائط التي قمت بنشرها</strong>. البيانات المُصدَّرة ستكون محفوظة على شكل نسق ActivityPub و باستطاعتك قراءتها بأي برنامج يدعم هذا النسق. يُمكنك طلب نسخة كل 7 أيام. in_progress: عملية جمع نسخة لبيانات حسابك جارية … request: طلب نسخة لحسابك size: الحجم @@ -544,6 +594,9 @@ ar: missing_resource: تعذر العثور على رابط التحويل المطلوب الخاص بحسابك proceed: أكمل المتابعة prompt: 'إنك بصدد متابعة :' + remote_unfollow: + error: '' + title: '' sessions: activity: آخر نشاط browser: المتصفح @@ -581,11 +634,13 @@ ar: windows: ويندوز windows_mobile: ويندوز موبايل windows_phone: ويندوز فون + revoke: '' revoke_success: تم إبطال الجلسة بنجاح title: الجلسات settings: authorized_apps: التطبيقات المرخص لها back: عودة إلى ماستدون + delete: '' development: التطوير edit_profile: تعديل الملف الشخصي export: تصدير البيانات @@ -598,9 +653,18 @@ ar: two_factor_authentication: إثبات الهويّة المزدوج your_apps: تطبيقاتك statuses: + attached: + image: + one: '' + other: '' + video: + one: '' + other: '' + content_warning: '' open_in_web: إفتح في الويب over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها pin_errors: + limit: '' ownership: لا يمكن تدبيس تبويق نشره شخص آخر private: لا يمكن تثبيت تبويق لم يُنشر للعامة reblog: لا يمكن تثبيت ترقية @@ -641,9 +705,19 @@ ar: wrong_code: الرمز الذي أدخلته غير صالح ! تحقق من صحة الوقت على الخادم و الجهاز ؟ user_mailer: backup_ready: + explanation: '' subject: نسخة بيانات حسابك جاهزة للتنزيل title: المغادرة بأرشيف الحساب + welcome: + edit_profile_action: '' + explanation: '' + full_handle: '' + review_preferences_action: '' + subject: '' + tips: نصائح + title: أهلاً بك، %{name} ! users: invalid_email: عنوان البريد الإلكتروني غير صالح invalid_otp_token: الرمز الثنائي غير صالح seamless_external_login: لقد قمت بتسجيل الدخول عبر خدمة خارجية، إنّ إعدادات الكلمة السرية و البريد الإلكتروني غير متوفرة. + signed_in_as: 'تم تسجيل دخولك بصفة :' diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 9d6b79549..2a46945d5 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -49,11 +49,12 @@ ca: reserved_username: El nom d'usuari està reservat roles: admin: Administrador + bot: Bot moderator: Moderador unfollow: Deixa de seguir admin: account_moderation_notes: - create: Crea + create: Crea nota created_msg: La nota de moderació s'ha creat correctament! delete: Suprimeix destroyed_msg: Nota de moderació destruïda amb èxit! @@ -463,7 +464,7 @@ ca: archive_takeout: date: Data download: Descarrega l’arxiu - hint_html: Pots sol·licitar un arxiu dels teus <strong>toots i els fitxers multimèdia pujats</strong>. Les dades exportades tindran el format ActivityPub, llegible per qualsevol programari compatible. + hint_html: Pots sol·licitar un arxiu dels teus <strong>toots i els fitxers multimèdia pujats</strong>. Les dades exportades tindran el format ActivityPub, llegible per qualsevol programari compatible. Pots sol·licitar un arxiu cada 7 dies. in_progress: Compilant el teu arxiu... request: Sol·licita el teu arxiu size: Tamany @@ -830,5 +831,6 @@ ca: users: invalid_email: L'adreça de correu no és correcta invalid_otp_token: El codi de dos factors no és correcte + otp_lost_help_html: Si has perdut l'accés a tots dos pots contactar per %{email} seamless_external_login: Has iniciat sessió via un servei extern per tant els ajustos de contrasenya i correu electrònic no estan disponibles. signed_in_as: 'Sessió iniciada com a:' diff --git a/config/locales/co.yml b/config/locales/co.yml index abef1d36b..637491d6b 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -1,11 +1,11 @@ --- co: about: - about_hashtag_html: Quessi sò statuti pubblichi taggati cù <strong>#%{hashtag}</strong>. Pudete interagisce cù elli sì voi avete un contu in qualche parte di u <em>fediverse</em>. + about_hashtag_html: Quessi sò statuti pubblichi taggati cù <strong>#%{hashtag}</strong>. Pudete interagisce cù elli sì voi avete un contu in qualche parte di u fediverse. about_mastodon_html: Mastodon ghjè una rete suciale custruita incù prutucolli web aperti è lugiziali liberi. Hè decentralizatu cumu l’e-mail. about_this: À prupositu administered_by: 'Amministratu da:' - closed_registrations: Pè avà, l’arregistramenti sò chjosi nant’à st’istanza. Mà pudete truvà un’altr’istanza per fà un contu è avè accessu à listessa reta da quallà! + closed_registrations: Pè avà, l’arregistramenti sò chjosi nant’à st’istanza. Mà pudete truvà un’altr’istanza per fà un contu è avè accessu à listessa reta da quallà. contact: Cuntattu contact_missing: Mancante contact_unavailable: Micca dispunibule @@ -70,6 +70,7 @@ co: title: Mudificà l’Email di %{username} confirm: Cunfirmà confirmed: Cunfirmata + confirming: Cunfirmazione demote: Ritrugradà disable: Disattivà disable_two_factor_authentication: Disattivà l’identificazione à 2 fattori @@ -78,6 +79,7 @@ co: domain: Duminiu edit: Mudificà email: E-mail + email_status: Statu di l’e-mail enable: Attivà enabled: Attivatu feed_url: URL di u flussu @@ -116,6 +118,10 @@ co: push_subscription_expires: Spirata di l’abbunamentu PuSH redownload: Mette à ghjornu i ritratti remove_avatar: Toglie l’avatar + resend_confirmation: + already_confirmed: St’utilizatore hè digià cunfirmatu + send: Rimandà un’e-mail di cunfirmazione + success: L’e-mail di cunfirmazione hè statu mandatu! reset: Reset reset_password: Riinizializà a chjave d’accessu resubscribe: Riabbunassi @@ -175,17 +181,17 @@ co: title: Ghjurnale d’audit custom_emojis: by_domain: Duminiu - copied_msg: Copia lucale di l’emoji creata! + copied_msg: Copia lucale di l’emoji creata copy: Cupià copy_failed_msg: Ùn s’hè micca pussutu creà una copia di l’emoji created_msg: L’emoji hè stata creata! delete: Toglie destroyed_msg: L’emoji hè stata tolta! disable: Disattivà - disabled_msg: L’emoji hè stata disattivata! + disabled_msg: L’emoji hè stata disattivata emoji: Emoji enable: Attivà - enabled_msg: L’emoji hè stata attivata! + enabled_msg: L’emoji hè stata attivata image_hint: PNG di 50Ko o menu listed: Listata new: @@ -380,9 +386,9 @@ co: created: Applicazione creata destroyed: Applicazione sguassata invalid_url: L’URL ch’è stata pruvista ùn hè valida - regenerate_token: Regenerate access token - token_regenerated: Access token successfully regenerated - warning: Be very careful with this data. Never share it with anyone! + regenerate_token: Creà un’altra fiscia d’accessu + token_regenerated: A fiscia d’accessu hè stata rigenerata + warning: Abbadate à quessi dati. Ùn i date à nisunu! your_token: Rigenerà a fiscia d’accessu auth: agreement_html: Arregistrassi vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di l’istanza</a> è <a href="%{terms_path}">e cundizione d’usu</a>. @@ -392,7 +398,7 @@ co: delete_account_html: S’è voi vulete toglie u vostru contu <a href="%{path}">ghjè quì</a>. Duverete cunfirmà a vostra scelta. didnt_get_confirmation: Ùn avete micca ricevutu l’istruzione di cunfirmazione? forgot_password: Chjave scurdata? - invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. + invalid_reset_password_token: U ligame di riinizializazione di a chjave d’accessu hè spiratu o ùn hè micca validu. Pudete dumandà un'altru ligame. login: Cunnettassi logout: Scunnettassi migrate_account: Cambià di contu @@ -409,13 +415,13 @@ co: security: Sicurità set_new_password: Creà una nova chjave d’accessu authorize_follow: - already_following: You are already following this account - error: Peccatu, c’hè statu un prublemu ricercandu u contu. + already_following: Site digià abbunatu·a à stu contu + error: Peccatu, c’hè statu un prublemu ricercandu u contu follow: Siguità follow_request: 'Avete dumandatu di siguità:' following: 'Eccu! Avà seguitate:' post_follow: - close: Or, you can just close this window. + close: O pudete ancu chjude sta finestra. return: Rivultà à u prufile di l’utilizatore web: Andà à l’interfaccia web title: Siguità %{acct} @@ -483,11 +489,11 @@ co: powered_by: mossu da %{link} save_changes: Salvà e mudificazione validation_errors: - one: Qualcosa ùn và bè! Verificate un prublemu quì sottu. - other: Qualcosa ùn và bè! Verificate %{count} prublemi quì sottu. + one: Qualcosa ùn và bè! Verificate u prublemu quì sottu + other: Qualcosa ùn và bè! Verificate %{count} prublemi quì sottu imports: preface: Pudete impurtà certi dati cumu e persone chì seguitate o bluccate nant’à u vostru contu nant’à st’istanza à partesi di fugliali creati nant’à un’altr’istanza. - success: I vostri dati sò stati impurtati è saranu trattati da quì à pocu. + success: I vostri dati sò stati impurtati è saranu trattati da quì à pocu types: blocking: Persone chì bluccate following: Persone chì seguitate @@ -519,14 +525,14 @@ co: landing_strip_signup_html: Pudete ancu <a href="%{sign_up_path}">arrigistravi quì</a>. lists: errors: - limit: Ùn pudete più creà altre liste. + limit: Ùn pudete più creà altre liste media_attachments: validations: images_and_video: Ùn si pò micca aghjunghje un filmettu à un statutu chì hà digià ritratti too_many: Ùn si pò micca aghjunghje più di 4 fugliali migrations: acct: cugnome@duminiu di u novu contu - currently_redirecting: "’U vostru prufile riindiriza tuttu versu à:’" + currently_redirecting: 'U vostru prufile riindiriza tuttu versu à:' proceed: Salvà updated_msg: I paramettri di migrazione sò stati messi à ghjornu! moderation: @@ -602,7 +608,7 @@ co: reblog: title: "%{name} hà spartutu u vostru statutu" remote_follow: - acct: Entrate u vostru cugnome@istanza da induve vulete siguità stu contu. + acct: Entrate u vostru cugnome@istanza da induve vulete siguità stu contu missing_resource: Ùn avemu pussutu à truvà l’indirizzu di ridirezzione proceed: Cuntinuà per siguità prompt: 'Avete da siguità:' @@ -791,11 +797,11 @@ co: disable: Disattivà enable: Attivà enabled: Identificazione à dui fattori attivata - enabled_success: L’identificazione à dui fattori hè stata attivata. + enabled_success: L’identificazione à dui fattori hè stata attivata generate_recovery_codes: Creà codici di ricuperazione instructions_html: "<strong>Scanate stu QR code cù Google Authenticator, Authy o qualcosa cusì nant’à u vostru telefuninu</strong>. St’applicazione hà da creà codici da entrà ogni volta chì vi cunnettate." lost_recovery_codes: I codici di ricuperazione à usu unicu vi permettenu di sempre avè accessu à u vostru contu s’è voi avete persu u vostru telefuninu. S’elli sò ancu persi, pudete creà codici novi quì. I vechji codici ùn marchjeranu più. - manual_instructions: S’ellu ùn hè micca pussibule scanà u QR code, pudete entre sta chjave sicreta:’ + manual_instructions: 'S’ellu ùn hè micca pussibule scanà u QR code, pudete entre sta chjave sicreta:' recovery_codes: Codici di ricuperazione recovery_codes_regenerated: Codici di ricuperazione ricreati recovery_instructions_html: Pudete fà usu di i codici quì sottu per sempre avè accessu à u vostru contu s’ellu hè statu persu u vostru telefuninu. <strong>Guardateli in una piazza sicura</strong>. Per esempiu, stampati è cunservati cù altri ducumenti impurtanti. @@ -811,7 +817,7 @@ co: edit_profile_step: Pudete persunalizà u vostru prufile cù un ritrattu di prufile o di cuprendula, un nome pubblicu persunalizatu, etc. Pudete ancu rende u contu privatu per duvè cunfirmà ogni dumanda d’abbunamentu. explanation: Eccu alcune idee per principià final_action: Principià à pustà - final_step: 'Andemu! Ancu senza abbunati i vostri missaghji pubblichi puderanu esse visti da altre persone, per esempiu nant’a linea lucale è l’hashtag. Pudete ancu prisintavi nant’à u hashtag #introductions!' + final_step: 'Andemu! Ancu senza abbunati i vostri missaghji pubblichi puderanu esse visti da altre persone, per esempiu nant’a linea lucale è l’hashtag. Pudete ancu prisintavi nant’à u hashtag #introductions.' full_handle: U vostru identificatore cumplettu full_handle_hint: Quessu ghjè cio chì direte à i vostri amichi per circavi, abbunassi à u vostru contu da altrò, o mandà missaghji. review_preferences_action: Mudificà e priferenze @@ -820,12 +826,13 @@ co: tip_bridge_html: S’è voi venite di Twitter, pudete truvà i vostri amichi da quallà chì sò nant’à Mastodon cù a <a href="%{bridge_url}">bridge app</a>. Mà ùn marchja chè s’elli l’anu ancu usata! tip_federated_timeline: A linea pubblica glubale mostra i statuti da altre istanze nant’a rete Mastodon, mà ùn hè micca cumpleta perchè ci sò soli i conti à quelli sò abbunati membri di a vostr’istanza. tip_following: Site digià abbunatu·a à l’amministratori di u vostru servore. Per truvà d’altre parsone da siguità, pudete pruvà e linee pubbliche. - tip_local_timeline: A linea pubblica lucale ghjè una vista crunulogica di i statuti di a ghjente nant’à %{instance}. - tip_mobile_webapp: Pudete aghjunghje Mastodon à a pagina d’accolta di u vostru navigatore di telefuninu per riceve nutificazione, cum’un applicazione. + tip_local_timeline: A linea pubblica lucale ghjè una vista crunulogica di i statuti di a ghjente nant’à %{instance}. Quessi sò i vostri cunvicini! + tip_mobile_webapp: Pudete aghjunghje Mastodon à a pagina d’accolta di u vostru navigatore di telefuninu per riceve nutificazione, cum’un applicazione! tips: Cunsiglii title: Benvenutu·a, %{name}! users: - invalid_email: L’indirizzu e-mail ùn hè currettu. - invalid_otp_token: U codice d’identificazione ùn hè currettu. + invalid_email: L’indirizzu e-mail ùn hè currettu + invalid_otp_token: U codice d’identificazione ùn hè currettu + otp_lost_help_html: S’è voi avete persu i dui, pudete cuntattà %{email} seamless_external_login: Site cunnettatu·a dapoi un serviziu esternu, allora i parametri di chjave d’accessu è d’indirizzu e-mail ùn so micca dispunibili. signed_in_as: 'Cunnettatu·a cum’è:' diff --git a/config/locales/de.yml b/config/locales/de.yml index 751f33718..6d5c0fb6d 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -49,11 +49,12 @@ de: reserved_username: Dieser Profilname ist belegt roles: admin: Admin + bot: Bot moderator: Moderator unfollow: Entfolgen admin: account_moderation_notes: - create: Erstellen + create: Notiz hinterlassen created_msg: Moderationsnotiz erfolgreich erstellt! delete: Löschen destroyed_msg: Moderationsnotiz erfolgreich gelöscht! @@ -373,6 +374,7 @@ de: admin_mailer: new_report: body: "%{reporter} hat %{target} gemeldet" + body_remote: Jemand von %{domain} hat %{target} gemeldet subject: Neue Meldung auf %{instance} (#%{id}) application_mailer: notification_preferences: Ändere E-Mail-Einstellungen @@ -462,7 +464,7 @@ de: archive_takeout: date: Datum download: Dein Archiv herunterladen - hint_html: Du kannst ein Archiv deiner <strong>Beiträge und hochgeladenen Medien</strong> anfragen. Die exportierten Daten werden im ActivityPub-Format gespeichert, welches mit jeder Software lesbar ist die das Format unterstützt. + hint_html: Du kannst ein Archiv deiner <strong>Beiträge und hochgeladenen Medien</strong> anfragen. Die exportierten Daten werden im ActivityPub-Format gespeichert, welches mit jeder Software lesbar ist, die das Format unterstützt. Du kannst alle 7 Tage ein neues Archiv anfordern. in_progress: Stelle dein Archiv zusammen... request: Dein Archiv anfragen size: Größe @@ -754,5 +756,6 @@ de: users: invalid_email: Ungültige E-Mail-Adresse invalid_otp_token: Ungültiger Zwei-Faktor-Authentisierungs-Code + otp_lost_help_html: Wenn Sie zu beidem keinen Zugriff mehr haben, kontaktieren sie %{email} seamless_external_login: Du bist angemeldet über einen Drittanbieter-Dienst, weswegen Passwort- und E-Maileinstellungen nicht verfügbar sind. signed_in_as: 'Angemeldet als:' diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml index d5bb70887..2471f857b 100644 --- a/config/locales/devise.co.yml +++ b/config/locales/devise.co.yml @@ -78,5 +78,5 @@ co: not_found: ùn hè micca statu trovu not_locked: ùn era micca chjosu not_saved: - one: Un prublemu hà impeditu a cunservazione di stu (sta) %{resource} + one: 'Un prublemu hà impeditu a cunservazione di stu (sta) %{resource}:' other: "%{count} prublemi anu impeditu a cunservazione di stu (sta) %{resource} :" diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml index f78412f91..8e95a3d94 100644 --- a/config/locales/devise.fa.yml +++ b/config/locales/devise.fa.yml @@ -20,8 +20,17 @@ fa: subject: 'ماستدون: راهنمایی برای تأیید %{instance}' password_change: subject: 'ماستدون: رمزتان عوض شد' + reconfirmation_instructions: + explanation: نشانی تازه را تأیید کنید تا ایمیلتان عوض شود. + extra: اگر شما باعث این تغییر نبودید، لطفاً این ایمیل را نادیده بگیرید. تا زمانی که شما پیوند بالا را باز نکنید، نشانی ایمیل مربوط به حساب شما عوض نخواهد شد. + subject: 'ماستدون: تأیید ایمیل برای %{instance}' + title: تأیید نشانی ایمیل reset_password_instructions: + action: تغییر رمز + explanation: شما رمز تازهای برای حسابتان درخواست کردید. + extra: اگر شما چنین درخواستی نکردید، لطفاً این ایمیل را نادیده بگیرید. تا زمانی که شما پیوند بالا را باز نکنید و رمز تازهای نسازید، رمز شما عوض نخواهد شد. subject: 'ماستدون: راهنمایی برای بازنشانی رمز' + title: بازنشانی رمز unlock_instructions: subject: 'ماستدون: راهنمایی برای بازکردن قفل' omniauth_callbacks: @@ -57,5 +66,5 @@ fa: not_found: پیدا نشد not_locked: قفل نبود not_saved: - one: خطایی نگذاشت که این %{resource} ذخیره شود - other: به خاطر %{count} خطا، این %{resource} ذخیره نشد + one: 'خطایی نگذاشت که این %{resource} ذخیره شود:' + other: 'به خاطر %{count} خطا، این %{resource} ذخیره نشد:' diff --git a/config/locales/doorkeeper.co.yml b/config/locales/doorkeeper.co.yml index 01b082e40..31080d153 100644 --- a/config/locales/doorkeeper.co.yml +++ b/config/locales/doorkeeper.co.yml @@ -29,7 +29,7 @@ co: edit: title: Mudificà l’applicazione form: - error: Uups! V’invitemu à verificà u vostru formulariu per vede s’elli ùn ci sò sbaglii. + error: Uups! V’invitemu à verificà u vostru formulariu per vede s’elli ùn ci sò sbaglii help: native_redirect_uri: Utilizate %{native_redirect_uri} pè e prove lucale redirect_uri: Utilizzate una linea per ogni URI @@ -60,10 +60,10 @@ co: title: C’hè statu un prublemu new: able_to: St’applicazione puderà - prompt: Parmette %{client_name} d’utilizzà u vostru contu? + prompt: L’applicazione %{client_name} hà dumandatu d’avè accessu à u vostru contu title: Permessu riquestu show: - title: Codice d’auturizazione da cupià indè l’applicazione + title: Codice d’auturizazione da cupià indè l’applicazione. authorized_applications: buttons: revoke: Sguassà @@ -83,7 +83,7 @@ co: invalid_grant: L’accunsentu d’auturizazione furnitu ùn hè currettu, hè spiratu, sguassatu, ùn và micca cù l’indirizzu di ridirezzione usatu in a dumanda d’auturizazione, o hè statu emessu per un’altru cliente. invalid_redirect_uri: L’URI di ridirezzione ùn hè curretta. invalid_request: Ci manca un parametru riquestu indè a dumanda, cuntene un parametru ch’ùn esiste micca, o altru sbagliu di forma. - invalid_resource_owner: L’idintificanti di u pruprietariu di a risorsa ùn sò curretti, o u pruprietariu ùn pò micca esse trovu. + invalid_resource_owner: L’idintificanti di u pruprietariu di a risorsa ùn sò curretti, o u pruprietariu ùn pò micca esse trovu invalid_scope: U scopu dumandatu ùn hè currettu, hè scunnisciutu, o altru sbagliu di forma. invalid_token: expired: A marca d’accessu hè spirata @@ -112,7 +112,7 @@ co: applications: Applicazione oauth2_provider: Furnitore OAuth2 application: - title: Auturizazione OAuth riquestata. + title: Auturizazione OAuth riquestata scopes: follow: bluccà, sbluccà, è reghje l’abbunamenti read: leghje l’infurmazione di u vostru contu diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml index 33d544bed..eca1fc675 100644 --- a/config/locales/doorkeeper.en.yml +++ b/config/locales/doorkeeper.en.yml @@ -115,5 +115,6 @@ en: title: OAuth authorization required scopes: follow: follow, block, unblock and unfollow accounts + push: receive push notifications for your account read: read your account's data write: post on your behalf diff --git a/config/locales/doorkeeper.fa.yml b/config/locales/doorkeeper.fa.yml index f3db862ca..7e6a04ea8 100644 --- a/config/locales/doorkeeper.fa.yml +++ b/config/locales/doorkeeper.fa.yml @@ -19,56 +19,56 @@ fa: doorkeeper: applications: buttons: - authorize: Authorize - cancel: Cancel - destroy: Destroy - edit: Edit + authorize: اجازه دادن + cancel: لغو + destroy: پاک کردن + edit: ویرایش submit: Submit confirmations: - destroy: Are you sure? + destroy: آیا مطمئن هستید؟ edit: - title: Edit application + title: ویرایش برنامه form: - error: Whoops! Check your form for possible errors + error: اوخ! ببینید چیزی را اشتباهی در فرم وارد نکردهاید؟ help: - native_redirect_uri: Use %{native_redirect_uri} for local tests - redirect_uri: Use one line per URI - scopes: Separate scopes with spaces. Leave blank to use the default scopes. + native_redirect_uri: برای آزمایشهای محلی %{native_redirect_uri} را به کار ببرید + redirect_uri: هر URI را در یک سطر جدا بنویسید + scopes: دامنهها را با فاصلهٔ خالی از هم جدا کنید. برای بهکاربردن دامنهٔ پیشفرض خالی بگذارید. index: - application: Application - callback_url: Callback URL + application: برنامه + callback_url: نشانی Callback delete: Delete name: Name - new: New application - scopes: Scopes - show: Show - title: Your applications + new: برنامهٔ تازه + scopes: دامنهها + show: نمایش + title: برنامههای شما new: - title: New application + title: برنامهٔ تازه show: actions: Actions - application_id: Client key - callback_urls: Callback URLs - scopes: Scopes - secret: Client secret - title: 'Application: %{name}' + application_id: کلید کلاینت + callback_urls: نشانیهای Callabck + scopes: دامنهها + secret: کد سری کلاینت + title: 'برنامه: %{name}' authorizations: buttons: - authorize: Authorize - deny: Deny + authorize: اجازه دادن + deny: لغو اجازه error: - title: An error has occurred + title: خطایی رخ داد new: - able_to: It will be able to - prompt: Application %{client_name} requests access to your account - title: Authorization required + able_to: اجازه خواهد داشت + prompt: برنامهٔ %{client_name} میخواهد به حساب شما دسترسی داشته باشد + title: نیاز به اجازه دادن show: - title: Copy this authorization code and paste it to the application. + title: این کد مجوز را کپی کرده و در برنامه وارد کنید. authorized_applications: buttons: - revoke: Revoke + revoke: فسخ confirmations: - revoke: Are you sure? + revoke: آیا مطمئن هستید؟ index: application: برنامه created_at: مجازشده از @@ -77,7 +77,7 @@ fa: title: برنامههای مجاز errors: messages: - access_denied: The resource owner or authorization server denied the request. + access_denied: دارندهٔ منبع یا سرور اجازه دهنده درخواست را نپذیرفت. credential_flow_not_configured: Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured. invalid_client: Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method. invalid_grant: The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. @@ -86,34 +86,34 @@ fa: invalid_resource_owner: The provided resource owner credentials are not valid, or resource owner cannot be found invalid_scope: The requested scope is invalid, unknown, or malformed. invalid_token: - expired: The access token expired - revoked: The access token was revoked - unknown: The access token is invalid + expired: کد دسترسی منقضی شده است + revoked: کد دسترسی فسخ شده است + unknown: کد دسترسی معتبر نیست resource_owner_authenticator_not_configured: Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfiged. - server_error: The authorization server encountered an unexpected condition which prevented it from fulfilling the request. - temporarily_unavailable: The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server. + server_error: خطای پیشبینینشدهای برای سرور اجازهدهنده رخ داد که جلوی اجرای این درخواست را گرفت. + temporarily_unavailable: سرور اجازهدهنده به دلیل بار زیاد یا تعمیرات سرور هماینک نمیتواند درخواست شما را بررسی کند. unauthorized_client: The client is not authorized to perform this request using this method. unsupported_grant_type: The authorization grant type is not supported by the authorization server. unsupported_response_type: The authorization server does not support this response type. flash: applications: create: - notice: Application created. + notice: برنامه ساخته شد. destroy: - notice: Application deleted. + notice: برنامه حذف شد. update: - notice: Application updated. + notice: برنامه بهروز شد. authorized_applications: destroy: - notice: Application revoked. + notice: برنامه فسخ شد. layouts: admin: nav: - applications: Applications - oauth2_provider: OAuth2 Provider + applications: برنامهها + oauth2_provider: فراهمکنندهٔ ورود دومرحلهای application: - title: OAuth authorization required + title: درخواست اجازهٔ OAuth scopes: - follow: follow, block, unblock and unfollow accounts - read: read your account's data - write: post on your behalf + follow: پیگیری، مسدودسازی، لغو مسدودسازی، و لغو پیگیری حسابها + read: خواندن اطلاعات حساب شما + write: انتشار مطالب از طرف شما diff --git a/config/locales/el.yml b/config/locales/el.yml index da2b7a64a..823a6f576 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -5,7 +5,7 @@ el: about_mastodon_html: Το Mastodon είναι ένα κοινωνικό δίκτυο που βασίζεται σε ανοιχτά δικτυακά πρωτόκολλα και ελεύθερο λογισμικό ανοιχτού κώδικα. Είναι αποκεντρωμένο όπως το e-mail. about_this: Σχετικά administered_by: 'Διαχειρίζεται από:' - closed_registrations: Αυτή τη στιγμή οι εγγραφές σε αυτό τον διακομιστή είναι κλειστές. Αλλά! Μπορείς να βρεις έναν άλλο διακομιστή για να ανοίξεις λογαριασμό και να έχεις πρόσβαση από εκεί στο ίδιο ακριβώς δίκτυο. + closed_registrations: Αυτή τη στιγμή οι εγγραφές σε αυτό τον κόμβο είναι κλειστές. Αλλά! Μπορείς να βρεις έναν άλλο κόμβο για να ανοίξεις λογαριασμό και να έχεις πρόσβαση από εκεί στο ίδιο ακριβώς δίκτυο. contact: Επικοινωνία contact_missing: Δεν έχει οριστεί contact_unavailable: Μ/Δ @@ -27,7 +27,7 @@ el: generic_description: "%{domain} είναι ένας εξυπηρετητής στο δίκτυο" hosted_on: Το Mastodon φιλοξενείται στο %{domain} learn_more: Μάθε περισσότερα - other_instances: Λίστα διακομιστών + other_instances: Λίστα κόμβων source_code: Πηγαίος κώδικας status_count_after: καταστάσεις status_count_before: Ποιός συνέγραψε @@ -49,6 +49,7 @@ el: reserved_username: Το όνομα χρήστη είναι κατειλημμένο roles: admin: Διαχειριστής + bot: Μποτ (αυτόματος λογαριασμός) moderator: Μεσολαβητής unfollow: Διακοπή παρακολούθησης admin: @@ -70,6 +71,7 @@ el: title: Αλλαγή email για %{username} confirm: Επιβεβαίωση confirmed: Επιβεβαιώθηκε + confirming: Προς επιβεβαίωση demote: Υποβίβαση disable: Απενεργοποίηση disable_two_factor_authentication: Απενεργοποίηση 2FA @@ -78,6 +80,7 @@ el: domain: Τομέας edit: Αλλαγή email: Email + email_status: Κατάσταση email enable: Ενεργοποίηση enabled: Ενεργοποιημένο feed_url: URL ροής @@ -116,6 +119,10 @@ el: push_subscription_expires: Η εγγραφή PuSH λήγει redownload: Ανανέωση αβατάρ remove_avatar: Απομακρυσμένο αβατάρ + resend_confirmation: + already_confirmed: Ήδη επιβεβαιωμένος χρήστης + send: Επανάληψη αποστολής email επιβεβαίωσης + success: Το email επιβεβαίωσης στάλθηκε επιτυχώς! reset: Επαναφορά reset_password: Επαναφορά συνθηματικού resubscribe: Επανεγγραφή @@ -194,6 +201,7 @@ el: shortcode: Σύντομος κωδικός shortcode_hint: Τουλάχιστον 2 χαρακτήρες, μόνο αλφαριθμητικοί και κάτω παύλες title: Προσαρμοσμένα emoji + unlisted: Μη καταχωρημένα update_failed_msg: Αδυναμία ενημέρωσης του emoji updated_msg: Επιτυχής ενημέρωση του Emoji! upload: Ανέβασμα @@ -205,3 +213,42 @@ el: new: create: Δημιουργία αποκλεισμού hint: Ο αποκλεισμός τομέα δεν θα αποτρέψει νέες καταχωρίσεις λογαριασμών στην βάση δεδομένων, αλλά θα εφαρμόσει αναδρομικά και αυτόματα συγκεκριμένες πολιτικές μεσολάβησης σε αυτούς τους λογαριασμούς. + severity: + noop: Κανένα + silence: Σίγαση + settings: + hero: + desc_html: Εμφανίζεται στην μπροστινή σελίδα. Συνίσταται τουλάχιστον 600x100px. Όταν λείπει, χρησιμοποιείται η μικρογραφία του κόμβου + peers_api_enabled: + desc_html: Ονόματα τομέων που αυτός ο κόμβος έχει πετύχει στο fediverse + show_known_fediverse_at_about_page: + title: Εμφάνιση του γνωστού fediverse στην προεπισκόπηση ροής + site_description: + title: Περιγραφή κόμβου + site_description_extended: + desc_html: Ένα καλό μέρος για τον κώδικα δεοντολογίας, τους κανόνες, τις οδηγίες και ό,τι άλλο διαφοροποιεί τον κόμβο σου. Δέχεται και κώδικα HTML + site_title: Όνομα κόμβου + thumbnail: + title: Μικρογραφία κόμβου + timeline_preview: + desc_html: Εμφάνισε τη δημόσια ροή στην αρχική σελίδα + title: Προεπισκόπιση ροής + admin_mailer: + new_report: + subject: Νέα αναφορά για %{instance} (#%{id}) + auth: + agreement_html: Με την εγγραφή σου, συμφωνείς να ακολουθείς <a href="%{rules_path}">τους κανόνες αυτού του κόμβου</a> και <a href="%{terms_path}">τους όρους χρήσης του</a>. + deletes: + warning_html: Μόνο η διαγραφή περιεχομένου από αυτό τον συγκεκριμένο κόμβο είναι εγγυημένη. Το περιεχόμενο που έχει διαμοιραστεί ευρέως είναι πιθανό να αφήσει ίχνη. Όσοι διακομιστές είναι εκτός σύνδεσης και όσοι έχουν διακόψει τη λήψη των ενημερώσεων του κόμβου σου, δε θα ενημερώσουν τις βάσεις δεδομένων τους. + imports: + preface: Μπορείς να εισάγεις τα δεδομένα που έχεις εξάγει από άλλο κόμβο, όπως τη λίστα των ανθρώπων που ακολουθείς ή μπλοκάρεις. + invites: + prompt: Φτιάξε και μοίρασε συνδέσμους με τρίτους για να δώσεις πρόσβαση σε αυτόν τον κόμβο + terms: + title: Όροι Χρήσης και Πολιτική Απορρήτου του κόμβου %{instance} + user_mailer: + welcome: + final_step: 'Ξεκίνα τις δημοσιεύσεις! Ακόμα και χωρίς ακόλουθους τα δημόσια μηνύματά σου μπορεί να τα δουν άλλοι, για παράδειγμα στην τοπική ροή και στις ετικέτες. Ίσως να θέλεις να κάνεις μια εισαγωγή του εαυτού σου με την ετικέτα #introductions.' + full_handle_hint: Αυτό θα εδώ θα πεις στους φίλους σου για να σου μιλήσουν ή να σε ακολουθήσουν από άλλο κόμβο. + tip_federated_timeline: Η συνδυασμένη ροή είναι μια όψη πραγματικού χρόνου στο δίκτυο του Mastodon. Παρόλα αυτά, περιλαμβάνει μόνο όσους ακολουθούν οι γείτονές σου, άρα δεν είναι πλήρης. + tip_local_timeline: Η τοπική ροή είναι η όψη πραγματικού χρόνου των ανθρώπων στον κόμβο %{instance}. Αυτοί είναι οι άμεσοι γείτονές σου! diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 47d591993..0903e3517 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -4,6 +4,7 @@ eo: about_hashtag_html: Ĉi tiuj estas la publikaj mesaĝoj markitaj per <strong>#%{hashtag}</strong>. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse. about_mastodon_html: Mastodon estas socia reto bazita sur malfermitaj retaj protokoloj kaj sur libera malfermitkoda programo. Ĝi estas sencentra kiel retmesaĝoj. about_this: Pri + administered_by: 'Administrata de:' closed_registrations: Registriĝoj estas nuntempe fermitaj en ĉi tiu nodo. Tamen, vi povas trovi alian nodon por fari konton kaj aliri al la sama reto de tie. contact: Kontakti contact_missing: Ne elektita @@ -48,17 +49,26 @@ eo: reserved_username: La uzantnomo estas rezervita roles: admin: Administranto + bot: Roboto moderator: Kontrolanto unfollow: Ne plu sekvi admin: account_moderation_notes: - create: Krei + create: Lasi noton created_msg: Kontrola noto sukcese kreita! delete: Forigi destroyed_msg: Kontrola noto sukcese detruita! accounts: are_you_sure: Ĉu vi certas? + avatar: Profilbildo by_domain: Domajno + change_email: + changed_msg: Konta retadreso sukcese ŝanĝita! + current_email: Nuna retadreso + label: Ŝanĝi retadreson + new_email: Nova retadreso + submit: Ŝanĝi retadreson + title: Ŝanĝi retadreson por %{username} confirm: Konfirmi confirmed: Konfirmita confirming: Konfirmante @@ -108,10 +118,11 @@ eo: public: Publika push_subscription_expires: Eksvalidiĝo de la abono al PuSH redownload: Aktualigi profilbildon + remove_avatar: Forigi profilbildon resend_confirmation: already_confirmed: Ĉi tiu uzanto jam estas konfirmita send: Esend konfirmi retpoŝton - success: Konfirma retpoŝto sukcese sendis + success: Konfirma retmesaĝo sukcese sendita! reset: Restarigi reset_password: Restarigi pasvorton resubscribe: Reaboni @@ -132,6 +143,7 @@ eo: statuses: Mesaĝoj subscribe: Aboni title: Kontoj + unconfirmed_email: Nekonfirmita retadreso undo_silenced: Malfari kaŝon undo_suspension: Malfari haltigon unsubscribe: Malaboni @@ -139,6 +151,8 @@ eo: web: Reto action_logs: actions: + assigned_to_self_report: "%{name} asignis signalon %{target} al si mem" + change_email_user: "%{name} ŝanĝis retadreson de uzanto %{target}" confirm_user: "%{name} konfirmis retadreson de uzanto %{target}" create_custom_emoji: "%{name} alŝutis novan emoĝion %{target}" create_domain_block: "%{name} blokis domajnon %{target}" @@ -154,10 +168,13 @@ eo: enable_user: "%{name} ebligis ensaluton por uzanto %{target}" memorialize_account: "%{name} ŝanĝis la konton de %{target} al memora paĝo" promote_user: "%{name} plirangigis uzanton %{target}" + remove_avatar_user: "%{name} forigis profilbildon de %{target}" + reopen_report: "%{name} remalfermis signalon %{target}" reset_password_user: "%{name} restarigis pasvorton de uzanto %{target}" - resolve_report: "%{name} flankmetis signalon %{target}" + resolve_report: "%{name} solvis signalon %{target}" silence_account: "%{name} kaŝis la konton de %{target}" suspend_account: "%{name} haltigis la konton de %{target}" + unassigned_report: "%{name} malasignis signalon %{target}" unsilence_account: "%{name} malkaŝis la konton de %{target}" unsuspend_account: "%{name} malhaltigis la konton de %{target}" update_custom_emoji: "%{name} ĝisdatigis emoĝion %{target}" @@ -243,24 +260,44 @@ eo: expired: Eksvalida title: Filtri title: Invitoj + report_notes: + created_msg: Signala noto sukcese kreita! + destroyed_msg: Signala noto sukcese forigita! reports: + account: + note: noto + report: signalo action_taken_by: Ago farita de are_you_sure: Ĉu vi certas? + assign_to_self: Asigni al mi + assigned: Asignita kontrolanto comment: none: Nenio + created_at: Signalita id: ID - mark_as_resolved: Marki kiel solvita + mark_as_resolved: Marki solvita + mark_as_unresolved: Marki nesolvita + notes: + create: Aldoni noton + create_and_resolve: Solvi per noto + create_and_unresolve: Remalfermi per noto + delete: Forigi + placeholder: Priskribu faritajn agojn, aŭ ajnan novan informon pri tiu signalo… + reopen: Remalfermi signalon report: 'Signalo #%{id}' report_contents: Enhavo reported_account: Signalita konto reported_by: Signalita de resolved: Solvita + resolved_msg: Signalo sukcese solvita! silence_account: Kaŝi konton status: Mesaĝoj suspend_account: Haltigi konton target: Celo title: Signaloj + unassign: Malasigni unresolved: Nesolvita + updated_at: Ĝisdatigita view: Vidi settings: activity_api_enabled: @@ -318,8 +355,8 @@ eo: back_to_account: Reveni al konta paĝo batch: delete: Forigi - nsfw_off: Malŝalti NSFW - nsfw_on: Ŝalti NSFW + nsfw_off: Marki ne tikla + nsfw_on: Marki tikla failed_to_execute: Ekigo malsukcesa media: title: Aŭdovidaĵoj @@ -337,6 +374,7 @@ eo: admin_mailer: new_report: body: "%{reporter} signalis %{target}" + body_remote: Iu de %{domain} signalis %{target} subject: Nova signalo por %{instance} (#%{id}) application_mailer: notification_preferences: Ŝanĝi retmesaĝajn preferojn @@ -378,6 +416,7 @@ eo: security: Sekureco set_new_password: Elekti novan pasvorton authorize_follow: + already_following: Vi jam sekvas tiun konton error: Bedaŭrinde, estis eraro en la serĉado de la fora konto follow: Sekvi follow_request: 'Vi sendis peton de sekvado al:' @@ -427,7 +466,7 @@ eo: archive_takeout: date: Dato download: Elŝuti vian arkivon - hint_html: Vi povas peti arkivon de viaj <strong>mesaĝoj kaj alŝutitaj aŭdovidaĵoj</strong>. La eksportitaj datumoj estos en la formato ActivityPub, legebla de ajna konformema programo. + hint_html: Vi povas peti arkivon de viaj <strong>mesaĝoj kaj alŝutitaj aŭdovidaĵoj</strong>. La eksportitaj datumoj estos en la formato ActivityPub, legebla de ajna konformema programo. Vi povas peti arkivon ĉiuseptage. in_progress: Kunmetado de via arkivo… request: Peti vian arkivon size: Grandeco @@ -472,6 +511,7 @@ eo: '21600': 6 horoj '3600': 1 horo '43200': 12 horoj + '604800': 1 semajno '86400': 1 tago expires_in_prompt: Neniam generate: Krei @@ -575,6 +615,10 @@ eo: missing_resource: La URL de plusendado ne estis trovita proceed: Daŭrigi por eksekvi prompt: 'Vi eksekvos:' + remote_unfollow: + error: Eraro + title: Titolo + unfollowed: Ne plu sekvita sessions: activity: Lasta ago browser: Retumilo @@ -641,6 +685,9 @@ eo: one: "%{count} video" other: "%{count} videoj" content_warning: 'Enhava averto: %{warning}' + disallowed_hashtags: + one: 'enhavas malpermesitan kradvorton: %{tags}' + other: 'enhavis malpermesitan kradvorton: %{tags}' open_in_web: Malfermi retumile over_character_limit: limo de %{max} signoj transpasita pin_errors: @@ -665,6 +712,7 @@ eo: terms: title: Uzkondiĉoj kaj privateca politiko de %{instance} themes: + contrast: Forta kontrasto default: Mastodon time: formats: @@ -711,5 +759,6 @@ eo: users: invalid_email: La retadreso estas nevalida invalid_otp_token: Nevalida kodo de dufaktora aŭtentigo + otp_lost_help_html: Se vi perdas aliron al ambaŭ, vi povas kontakti %{email} seamless_external_login: Vi estas ensalutinta per ekstera servo, do pasvortaj kaj retadresaj agordoj ne estas disponeblaj. signed_in_as: 'Ensalutinta kiel:' diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 5255e0e38..1a8372d63 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -4,6 +4,7 @@ fa: about_hashtag_html: اینها نوشتههای عمومی هستند که برچسب (هشتگ) <strong>#%{hashtag}</strong> را دارند. اگر شما روی هر سروری حساب داشته باشید میتوانید به این نوشتهها واکنش نشان دهید. about_mastodon_html: ماستدون (Mastodon) یک شبکهٔ اجتماعی است که بر اساس پروتکلهای آزاد وب و نرمافزارهای آزاد و کدباز ساخته شده است. این شبکه مانند ایمیل غیرمتمرکز است. about_this: درباره + administered_by: 'با مدیریت:' closed_registrations: ثبتنام روی این سرور هماینک فعال نیست. اما شما میتوانید سرور دیگری بیابید و با حسابی که آنجا میسازید دقیقاً به همین شبکه دسترسی داشته باشید. contact: تماس contact_missing: تعیین نشده @@ -52,13 +53,21 @@ fa: unfollow: پایان پیگیری admin: account_moderation_notes: - create: نوشتن + create: افزودن یادداشت created_msg: یادداشت مدیر با موفقیت ساخته شد! delete: پاک کردن destroyed_msg: یادداشت مدیر با موفقیت پاک شد! accounts: are_you_sure: آیا مطمئن هستید؟ + avatar: تصویر نمایه by_domain: دامین + change_email: + changed_msg: نشانی ایمیل این حساب با موفقیت تغییر کرد! + current_email: ایمیل کنونی + label: تغییر نشانی ایمیل + new_email: ایمیل تازه + submit: تغییر ایمیل + title: تغییر ایمیل برای %{username} confirm: تأیید confirmed: تأیید شد confirming: تأیید @@ -91,7 +100,7 @@ fa: all: همه silenced: بیصدا شده suspended: معلق شده - title: مدیریت + title: وضعیت moderation_notes: یادداشت مدیر most_recent_activity: آخرین فعالیتها most_recent_ip: آخرین IP ها @@ -108,10 +117,11 @@ fa: public: عمومی push_subscription_expires: عضویت از راه PuSH منقضی شد redownload: بهروزرسانی تصویر نمایه + remove_avatar: حذف تصویر نمایه resend_confirmation: already_confirmed: این کاربر قبلا تایید شده است send: ایمیل تایید را دوباره بفرستید - success: ایمیل تایید با موفقیت ارسال شد + success: ایمیل تایید با موفقیت ارسال شد! reset: بازنشانی reset_password: بازنشانی رمز resubscribe: اشتراک دوباره @@ -132,6 +142,7 @@ fa: statuses: نوشتهها subscribe: اشتراک title: حسابها + unconfirmed_email: ایمیل تأییدنشده undo_silenced: واگردانی بیصداکردن undo_suspension: واگردانی تعلیق unsubscribe: لغو اشتراک @@ -139,6 +150,8 @@ fa: web: وب action_logs: actions: + assigned_to_self_report: "%{name} رسیدگی به گزارش %{target} را به عهده گرفت" + change_email_user: "%{name} نشانی ایمیل کاربر %{target} را تغییر داد" confirm_user: "%{name} نشانی ایمیل کاربر %{target} را تأیید کرد" create_custom_emoji: "%{name} شکلک تازهٔ %{target} را بارگذاشت" create_domain_block: "%{name} دامین %{target} را مسدود کرد" @@ -154,10 +167,13 @@ fa: enable_user: "%{name} ورود را برای کاربر %{target} فعال کرد" memorialize_account: "%{name} حساب کاربر %{target} را تبدیل به صفحهٔ یادمان کرد" promote_user: "%{name} کاربر %{target} را ترفیع داد" + remove_avatar_user: "%{name} تصویر نمایهٔ کاربر %{target} را حذف کرد" + reopen_report: "%{name} گزارش %{target} را دوباره به جریان انداخت" reset_password_user: "%{name} رمز کاربر %{target} را بازنشاند" - resolve_report: "%{name} گزارش %{target} را نادیده گرفت" + resolve_report: "%{name} گزارش %{target} را رفع کرد" silence_account: "%{name} حساب کاربر %{target} را خاموش (بیصدا) کرد" suspend_account: "%{name} حساب کاربر %{target} را تعلیق کرد" + unassigned_report: "%{name} بررسی گزارش %{target} را متوقف کرد" unsilence_account: "%{name} حساب کاربر %{target} را روشن (باصدا) کرد" unsuspend_account: "%{name} حساب کاربر %{target} را از تعلیق خارج کرد" update_custom_emoji: "%{name} شکلک %{target} را بهروز کرد" @@ -243,32 +259,61 @@ fa: expired: منقضیشده title: فیلتر title: دعوتها + report_notes: + created_msg: یادداشت گزارش با موفقیت ساخته شد! + destroyed_msg: یادداشت گزارش با موفقیت حذف شد! reports: + account: + note: یادداشت + report: گزارش action_taken_by: انجامدهنده are_you_sure: آیا مطمئن هستید؟ + assign_to_self: به عهدهٔ من بگذار + assigned: مدیر عهدهدار comment: none: خالی + created_at: گزارششده id: شناسه mark_as_resolved: علامتگذاری به عنوان حلشده + mark_as_unresolved: علامتگذاری به عنوان حلنشده + notes: + create: افزودن یادداشت + create_and_resolve: حل کردن با یادداشت + create_and_unresolve: دوباره گشودن با یادداشت + delete: حذف + placeholder: کارهایی را که در این باره انجام شده، یا هر بهروزرسانی دیگری را بنویسید… + reopen: دوباره به جریان بیندازید report: 'گزارش #%{id}' report_contents: محتوا reported_account: حساب گزارششده reported_by: گزارش از طرف resolved: حلشده + resolved_msg: گزارش با موفقیت حل شد! silence_account: بیصدا کردن حساب status: نوشته suspend_account: معلقکردن حساب target: هدف title: گزارشها + unassign: پسگرفتن مسئولیت unresolved: حلنشده + updated_at: بهروز شد view: نمایش settings: + activity_api_enabled: + desc_html: تعداد بوقهای محلی، کاربران فعال، و کاربران تازه در هر هفته + title: انتشار آمار تجمیعی دربارهٔ فعالیت کاربران bootstrap_timeline_accounts: desc_html: نامهای کاربری را با ویرگول از هم جدا کنید. تنها حسابهای محلی و قفلنشده کار میکنند. اگر اینجا را خالی بگذارید، به طور پیشفرض همهٔ مدیرهای این سرور پیگرفته خواهند شد. title: پیگیریهای پیشفرض برای کاربران تازه contact_information: email: ایمیل کاری username: نام کاربری + hero: + desc_html: در صفحهٔ آغازین نمایش مییابد. دستکم ۶۰۰×۱۰۰ پیکسل توصیه میشود. اگر تعیین نشود، با تصویر بندانگشتی سرور جایگزین خواهد شد + title: تصویر سربرگ + peers_api_enabled: + desc_html: دامینهایی که این سرور به آنها برخورده است + title: انتشار فهرست سرورهای یافتهشده registrations: closed_message: desc_html: وقتی امکان ثبت نام روی سرور فعال نباشد در صفحهٔ اصلی نمایش مییابد<br>میتوانید HTML بنویسید @@ -282,6 +327,9 @@ fa: open: desc_html: همه بتوانند حساب باز کنند title: امکان ثبت نام + show_known_fediverse_at_about_page: + desc_html: اگر انتخاب شود، بوقهای همهٔ سرورهای دیگر نیز در پیشنمایش این سرور نمایش مییابد. وگرنه فقط بوقهای محلی نشان داده میشوند. + title: نمایش سرورهای دیگر در پیشنمایش این سرور show_staff_badge: desc_html: نمایش علامت همکار روی صفحهٔ کاربر title: نمایش علامت همکار @@ -306,8 +354,8 @@ fa: back_to_account: بازگشت به صفحهٔ حساب batch: delete: پاککردن - nsfw_off: NSFW خاموش - nsfw_on: NSFW روشن + nsfw_off: علامتزدن به عنوان غیرحساس + nsfw_on: علامتزدن به عنوان حساس failed_to_execute: اجرا نشد media: title: رسانه @@ -321,15 +369,19 @@ fa: last_delivery: آخرین ارسال title: WebSub topic: موضوع - title: مدیریت + title: مدیریت سرور admin_mailer: new_report: body: کاربر %{reporter} کاربر %{target} را گزارش داد + body_remote: کسی از %{domain} گزارش %{target} را فرستاده subject: گزارش تازهای برای %{instance} (#%{id}) application_mailer: + notification_preferences: تغییر ترجیحات ایمیل salutation: "%{name}،" settings: 'تغییر تنظیمات ایمیل: %{link}' view: 'نمایش:' + view_profile: دیدن نمایه + view_status: دیدن نوشتهها applications: created: برنامه با موفقیت ساخته شد destroyed: برنامه با موفقیت پاک شد @@ -340,6 +392,8 @@ fa: your_token: کد دسترسی شما auth: agreement_html: پیش از عضو شدن باید <a href="%{rules_path}">قوانین این سرور</a> و <a href="%{terms_path}">شرایط استفادهٔ</a> ما را بپذیرید. + change_password: رمز + confirm_email: تأیید ایمیل delete_account: پاککردن حساب delete_account_html: اگر میخواهید حساب خود را پاک کنید، از <a href="%{path}">اینجا</a> پیش بروید. از شما درخواست تأیید خواهد شد. didnt_get_confirmation: راهنمایی برای تأیید را دریافت نکردید؟ @@ -349,12 +403,19 @@ fa: logout: خروج migrate_account: نقل مکان به یک حساب دیگر migrate_account_html: اگر میخواهید این حساب را به حساب دیگری منتقل کنید، <a href="%{path}">اینجا را کلیک کنید</a>. + or: یا + or_log_in_with: یا ورود به وسیلهٔ + providers: + cas: CAS + saml: SAML register: عضو شوید + register_elsewhere: ثبت نام روی یک سرور دیگر resend_confirmation: راهنمایی برای تأیید را دوباره بفرست reset_password: بازنشانی رمز security: امنیت set_new_password: تعیین رمز تازه authorize_follow: + already_following: شما همین الان هم این حساب را پیمیگیرید error: متأسفانه حین یافتن آن حساب خطایی رخ داد follow: پی بگیرید follow_request: 'شما درخواست پیگیری فرستادهاید به:' @@ -399,6 +460,13 @@ fa: title: این صفحه درست نیست noscript_html: برای استفاده از نسخهٔ تحت وب ماستدون، لطفاً جاوااسکریپت را فعال کنید. یا به جایش میتوانید <a href="https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md">یک اپ ماستدون</a> را بهکار ببرید. exports: + archive_takeout: + date: تاریخ + download: بایگانی خود را باربگیرید + hint_html: شما میتوانید بایگانی <strong>بوقها و پروندههای بارگذاریشدهٔ</strong> خود را درخواست کنید. دادههای برونبریشده در قالب ActivityPub خواهند بود و همهٔ نرمافزارهای سازگار خواهند توانست آن را بخوانند. شما هر ۷ روز میتوانید یک بار برای چنین بایگانیای درخواست دهید. + in_progress: در حال ساختن بایگانی شما... + request: درخواست بایگانی دادههایتان + size: اندازه blocks: حسابهای مسدودشده csv: CSV follows: حسابهای پیگرفته @@ -440,6 +508,7 @@ fa: '21600': ۶ ساعت '3600': ۱ ساعت '43200': ۱۲ ساعت + '604800': ۱ هفته '86400': ۱ روز expires_in_prompt: هیچ وقت generate: ساختن @@ -467,32 +536,41 @@ fa: proceed: ذخیره updated_msg: تنظیمات نقل مکان حساب شما با موفقیت بهروز شد! moderation: - title: مدیریت + title: مدیریت کاربران notification_mailer: digest: - body: 'خلاصهای از آنچه از زمان آخرین بازدید شما در %{since} روی %{instance} رخ داد :' + action: دیدن همهٔ اعلانها + body: خلاصهای از پیغامهایی که از زمان آخرین بازدید شما در %{since} فرستاده شد mention: "%{name} اینجا از شما نام برد:" new_followers_summary: - one: شما یک پیگیر تازه دارید! ای ول! - other: شما %{count} پیگیر تازه دارید! چه عالی! + one: در ضمن، وقتی که نبودید یک پیگیر تازه پیدا کردید! ای ول! + other: در ضمن، وقتی که نبودید %{count} پیگیر تازه پیدا کردید! چه عالی! subject: one: "یک اعلان تازه از زمان آخرین بازدید شما \U0001F418" other: "%{count} اعلان تازه از زمان آخرین بازدید شما \U0001F418" + title: در مدتی که نبودید… favourite: body: "%{name} این نوشتهٔ شما را پسندید:" subject: "%{name} نوشتهٔ شما را پسندید" + title: پسندیدهشدن تازه follow: body: "%{name} هماینک پیگیر شماست!" subject: "%{name} هماینک پیگیر شماست" + title: پیگیر تازه follow_request: + action: مدیریت درخواستهای پیگیری body: "%{name} میخواهد پیگیر نوشتههای شما باشد" subject: 'منتظر پیگیری: %{name}' + title: درخواست پیگیری تازه mention: + action: پاسخ body: "%{name} در اینجا از شما نام برد:" subject: "%{name} از شما نام برد" + title: نامبردهشدن تازه reblog: body: "%{name} نوشتهٔ شما را بازبوقید:" subject: "%{name} نوشتهٔ شما را بازبوقید" + title: بازبوق تازه number: human: decimal_units: @@ -505,7 +583,9 @@ fa: trillion: T unit: '' pagination: + newer: تازهتر next: بعدی + older: قدیمیتر prev: قبلی truncate: "…" preferences: @@ -532,6 +612,10 @@ fa: missing_resource: نشانی اینترنتی برای رسیدن به حساب شما پیدا نشد proceed: درخواست پیگیری prompt: 'شما قرار است این حساب را پیگیری کنید:' + remote_unfollow: + error: خطا + title: عنوان + unfollowed: پایان پیگیری sessions: activity: آخرین کنش browser: مرورگر @@ -540,12 +624,14 @@ fa: blackberry: Blackberry chrome: Chrome edge: Microsoft Edge + electron: Electron firefox: Firefox generic: مرورگر ناشناخته ie: Internet Explorer micro_messenger: MicroMessenger nokia: Nokia S40 Ovi Browser opera: Opera + otter: Otter phantom_js: PhantomJS qq: QQ Browser safari: Safari @@ -575,7 +661,7 @@ fa: authorized_apps: برنامههای مجاز back: بازگشت به ماستدون delete: پاککردن حساب - development: Development + development: فرابری edit_profile: ویرایش نمایه export: برونسپاری دادهها followers: پیگیران مورد تأیید @@ -587,6 +673,18 @@ fa: two_factor_authentication: ورود دومرحلهای your_apps: برنامهٔ شما statuses: + attached: + description: 'پیوستشده: %{attached}' + image: + one: "%{count} تصویر" + other: "%{count} تصویر" + video: + one: "%{count} ویدیو" + other: "%{count} ویدیو" + content_warning: 'هشدا محتوا: %{warning}' + disallowed_hashtags: + one: 'دارای هشتگ غیرمجاز: %{tags}' + other: 'دارای هشتگهای غیرمجاز: %{tags}' open_in_web: بازکردن در وب over_character_limit: از حد مجاز %{max} حرف فراتر رفتید pin_errors: @@ -611,6 +709,7 @@ fa: terms: title: شرایط استفاده و سیاست رازداری %{instance} themes: + contrast: کنتراست بالا default: ماستدون time: formats: @@ -628,10 +727,35 @@ fa: manual_instructions: 'اگر نمیتوانید کدها را اسکن کنید و باید آنها را دستی وارد کنید، متن کد امنیتی اینجاست:' recovery_codes: پشتیبانگیری از کدهای بازیابی recovery_codes_regenerated: کدهای بازیابی با موفقیت ساخته شدند - recovery_instructions_html: اگر تلفن خود را گم کردید، میتوانید با یکی از کدهای بازیابی زیر کنترل حساب خود را به دست بگیرید. <strong>این کدها را در جای امنی نگه دارید.</strong> مثلاً آنها را چاپ کنید و کنار سایر مدارک مهم خود قرار دهید + recovery_instructions_html: اگر تلفن خود را گم کردید، میتوانید با یکی از کدهای بازیابی زیر کنترل حساب خود را به دست بگیرید. <strong>این کدها را در جای امنی نگه دارید.</strong> مثلاً آنها را چاپ کنید و کنار سایر مدارک مهم خود قرار دهید. setup: راه اندازی wrong_code: کدی که وارد کردید نامعتبر بود! آیا ساعت سرور و ساعت دستگاه شما درست تنظیم شدهاند؟ + user_mailer: + backup_ready: + explanation: شما یک نسخهٔ پشتیبان کامل از حساب خود را درخواست کردید. این پشتیبان الان آمادهٔ بارگیری است! + subject: بایگانی شما آمادهٔ دریافت است + title: گرفتن بایگانی + welcome: + edit_profile_action: تنظیم نمایه + edit_profile_step: 'شما میتوانید نمایهٔ خود را به دلخواه خود تغییر دهید: میتوانید تصویر نمایه، تصویر پسزمینه، نام، و چیزهای دیگری را تعیین کنید. اگر بخواهید، میتوانید حساب خود را خصوصی کنید تا فقط کسانی که شما اجازه میدهید بتوانند پیگیر حساب شما شوند.' + explanation: نکتههایی که برای آغاز کار به شما کمک میکنند + final_action: چیزی منتشر کنید + final_step: 'چیزی بنویسید! حتی اگر الان کسی پیگیر شما نباشد، دیگران نوشتههای عمومی شما را میبینند، مثلاً در فهرست نوشتههای محلی و در هشتگها. شاید بخواهید با هشتگ #آشنایی خودتان را معرفی کنید.' + full_handle: نام کاربری کامل شما + full_handle_hint: این چیزی است که باید به دوستان خود بگویید تا بتوانند به شما پیغام بفرستند یا از سرورهای دیگر پیگیر شما شوند. + review_preferences_action: تغییر ترجیحات + review_preferences_step: با رفتن به صفحهٔ ترجیحات میتوانید چیزهای گوناگونی را تنظیم کنید. مثلاً این که چه ایمیلهای آگاهسازیای به شما فرستاده شود، یا حریم خصوصی پیشفرض نوشتههایتان چه باشد. اگر بیماری سفر (حالت تهوع بر اثر دیدن اجسام متحرک) ندارید، میتوانید پخش خودکار ویدیوها را فعال کنید. + subject: به ماستدون خوش آمدید + tip_bridge_html: اگر پیش از این کاربر توییتر بودید، میتوانید دوستان توییتری خود را که در ماستدون هستند به کمک <a href="%{bridge_url}">bridge app</a> پیدا کنید. البته این فقط وقتی کار میکند که آنها هم این اپ را به کار برده باشند! + tip_federated_timeline: "«فهرست نوشتههای همهجا» نمایی از کل شبکهٔ بزرگ ماستدون به شما میدهد. البته این فهرست فقط افردای را نشان میدهد که همسروریهای شما آنها را پیگیری میکنند، و بنابراین ممکن است کامل نباشد." + tip_following: شما به طور پیشفرض مدیر(های) سرور خود را پی میگیرید. برای یافتن افراد جالب دیگر، فهرست «نوشتههای محلی» و «نوشتههای همهجا» را ببینید. + tip_local_timeline: فهرست نوشتههای محلی نمایی کلی از کاربران روی %{instance} را ارائه میدهد. اینها همسایههای شما هستند! + tip_mobile_webapp: اگر مرورگر موبایل شما امکان گذاشتن ماستدون روی صفحهٔ اصلی موبایل را به شما میدهد، این یعنی میتوانید اعلانهای خودکار ماستدون را دریافت کنید. با این کار ماستدون خیلی شبیه یک اپ معمولی موبایل میشود! + tips: نکتهها + title: خوش آمدید، کاربر %{name}! users: invalid_email: نشانی ایمیل نامعتبر است invalid_otp_token: کد ورود دومرحلهای نامعتبر است + otp_lost_help_html: اگر شما دسترسی به هیچکدامشان ندارید، باید با ایمیل %{email} تماس بگیرید + seamless_external_login: شما با یک سرویس خارج از مجموعه وارد شدهاید، به همین دلیل تنظیمات ایمیل و رمز برای شما در دسترس نیست. signed_in_as: 'واردشده به نام:' diff --git a/config/locales/fi.yml b/config/locales/fi.yml index fca58cc0f..68a239ba3 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -4,6 +4,7 @@ fi: about_hashtag_html: Nämä ovat hashtagilla <strong>#%{hashtag}</strong> merkittyjä julkisia tuuttauksia. Voit vastata niihin, jos sinulla on tili jossain päin fediversumia. about_mastodon_html: Mastodon on sosiaalinen verkosto. Se on toteutettu avoimilla verkkoprotokollilla ja vapailla, avoimen lähdekoodin ohjelmistoilla, ja se toimii hajautetusti samaan tapaan kuin sähköposti. about_this: Tietoja tästä palvelimesta + administered_by: 'Ylläpitäjä:' closed_registrations: Tähän instanssiin ei voi tällä hetkellä rekisteröityä. Voit kuitenkin luoda tilin johonkin toiseen instanssiin ja käyttää samaa verkostoa sitä kautta. contact: Ota yhteyttä contact_missing: Ei asetettu @@ -58,26 +59,34 @@ fi: destroyed_msg: Moderointimerkinnän poisto onnistui! accounts: are_you_sure: Oletko varma? - by_domain: Verkko-osoite + avatar: Profiilikuva + by_domain: Verkkotunnus + change_email: + changed_msg: Tilin sähköposti vaihdettu onnistuneesti! + current_email: Nykyinen sähköposti + label: Vaihda sähköposti + new_email: Uusi sähköposti + submit: Vaihda sähköposti + title: Vaihda sähköposti käyttäjälle %{username} confirm: Vahvista confirmed: Vahvistettu - confirming: Vahvistavat + confirming: Vahvistetaan demote: Alenna disable: Poista käytöstä disable_two_factor_authentication: Poista 2FA käytöstä disabled: Poistettu käytöstä - display_name: Näyttönimi - domain: Verkko-osoite + display_name: Nimimerkki + domain: Verkkotunnus edit: Muokkaa email: Sähköposti email_status: Sähköpostin tila enable: Ota käyttöön enabled: Käytössä - feed_url: Syötteen URL + feed_url: Syötteen osoite followers: Seuraajat - followers_url: Seuraajien URL + followers_url: Seuraajien osoite follows: Seuraa - inbox_url: Saapuvan postilaatikon URL + inbox_url: Saapuvan postilaatikon osoite ip: IP location: all: Kaikki @@ -100,18 +109,19 @@ fi: alphabetic: Aakkosjärjestys most_recent: Uusin title: Järjestys - outbox_url: Lähtevän postilaatikon URL + outbox_url: Lähtevän postilaatikon osoite perform_full_suspension: Siirrä kokonaan jäähylle - profile_url: Profiilin URL + profile_url: Profiilin osoite promote: Ylennä protocol: Protokolla public: Julkinen push_subscription_expires: PuSH-tilaus vanhenee redownload: Päivitä profiilikuva + remove_avatar: Poista profiilikuva resend_confirmation: already_confirmed: Tämä käyttäjä on jo vahvistettu send: Lähetä varmistusviesti uudelleen - success: Vahvistusviesti lähetettiin onnistuneesti + success: Vahvistusviesti onnistuneesti lähetetty! reset: Palauta reset_password: Palauta salasana resubscribe: Tilaa uudelleen @@ -122,16 +132,17 @@ fi: staff: Henkilöstö user: Käyttäjä salmon_url: Salmon-URL - search: Haku - shared_inbox_url: Jaetun saapuvan postilaatikon URL + search: Hae + shared_inbox_url: Jaetun saapuvan postilaatikon osoite show: - created_reports: Tilin luomat raportit + created_reports: Tämän tilin luomat raportit report: raportti targeted_reports: Tästä tilistä tehdyt raportit silence: Hiljennä statuses: Tilat subscribe: Tilaa title: Tilit + unconfirmed_email: Sähköpostia ei vahvistettu undo_silenced: Peru hiljennys undo_suspension: Peru jäähy unsubscribe: Lopeta tilaus @@ -139,6 +150,8 @@ fi: web: Web action_logs: actions: + assigned_to_self_report: "%{name} otti raportin %{target} tehtäväkseen" + change_email_user: "%{name} vaihtoi käyttäjän %{target} sähköpostiosoitteen" confirm_user: "%{name} vahvisti käyttäjän %{target} sähköpostiosoitteen" create_custom_emoji: "%{name} lähetti uuden emojin %{target}" create_domain_block: "%{name} esti verkkotunnuksen %{target}" @@ -154,6 +167,8 @@ fi: enable_user: "%{name} salli sisäänkirjautumisen käyttäjälle %{target}" memorialize_account: "%{name} muutti käyttäjän %{target} tilin muistosivuksi" promote_user: "%{name} ylensi käyttäjän %{target}" + remove_avatar_user: "%{name} poisti käyttäjän %{target} profiilikuvan" + reopen_report: "%{name} avasi uudelleen raportin %{target}" reset_password_user: "%{name} palautti käyttäjän %{target} salasanan" resolve_report: "%{name} hylkäsi raportin %{target}" silence_account: "%{name} hiljensi käyttäjän %{target}" @@ -172,7 +187,7 @@ fi: delete: Poista destroyed_msg: Emojon poisto onnistui! disable: Poista käytöstä - disabled_msg: Emojin käytöstäpoisto onnistui + disabled_msg: Emojin poisto käytöstä onnistui emoji: Emoji enable: Ota käyttöön enabled_msg: Emojin käyttöönotto onnistui @@ -243,24 +258,42 @@ fi: expired: Vanhentunut title: Suodata title: Kutsut + report_notes: + created_msg: Muistiinpano onnistuneesti lisätty raporttiin! + destroyed_msg: Muistiinpano onnistuneesti poistettu raportista! reports: + account: + note: muistiinpano + report: raportti action_taken_by: Toimenpiteen tekijä are_you_sure: Oletko varma? + assign_to_self: Ota tehtäväksi comment: none: Ei mitään + created_at: Raportoitu id: Tunniste mark_as_resolved: Merkitse ratkaistuksi + mark_as_unresolved: Merkitse ratkaisemattomaksi + notes: + create: Lisää muistiinpano + create_and_resolve: Ratkaise ja lisää muistiinpano + create_and_unresolve: Avaa uudelleen ja lisää muistiinpano + delete: Poista + placeholder: Kuvaile mitä toimia on tehty tai muita päivityksiä tähän raporttiin… + reopen: Avaa raportti uudestaan report: Raportti nro %{id} report_contents: Sisältö reported_account: Raportoitu tili reported_by: Raportoija resolved: Ratkaistut + resolved_msg: Raportti onnistuneesti ratkaistu! silence_account: Hiljennä tili status: Tila suspend_account: Siirrä tili jäähylle target: Kohde title: Raportit unresolved: Ratkaisemattomat + updated_at: Päivitetty view: Näytä settings: activity_api_enabled: @@ -337,6 +370,7 @@ fi: admin_mailer: new_report: body: "%{reporter} on raportoinut kohteen %{target}" + body_remote: Joku osoitteesta %{domain} on raportoinut kohteen %{target} subject: Uusi raportti instanssista %{instance} (nro %{id}) application_mailer: notification_preferences: Muuta sähköpostiasetuksia @@ -378,6 +412,7 @@ fi: security: Tunnukset set_new_password: Aseta uusi salasana authorize_follow: + already_following: Sinä seuraat jo tätä tiliä error: Valitettavasti etätilin haussa tapahtui virhe follow: Seuraa follow_request: 'Olet lähettänyt seuraamispyynnön käyttäjälle:' @@ -470,6 +505,7 @@ fi: '21600': 6 tuntia '3600': 1 tunti '43200': 12 tuntia + '604800': 1 viikko '86400': 1 vuorokausi expires_in_prompt: Ei koskaan generate: Luo @@ -573,6 +609,8 @@ fi: missing_resource: Vaadittavaa uudelleenohjaus-URL:ää tiliisi ei löytynyt proceed: Siirry seuraamaan prompt: 'Olet aikeissa seurata:' + remote_unfollow: + error: Virhe sessions: activity: Viimeisin toiminta browser: Selain @@ -639,6 +677,9 @@ fi: one: "%{count} video" other: "%{count} videota" content_warning: 'Sisältövaroitus: %{warning}' + disallowed_hashtags: + one: 'sisälsi aihetunnisteen jota ei sallita: %{tags}' + other: 'sisälsi aihetunnisteet joita ei sallita: %{tags}' open_in_web: Avaa selaimessa over_character_limit: merkkimäärän rajoitus %{max} ylitetty pin_errors: @@ -709,5 +750,6 @@ fi: users: invalid_email: Virheellinen sähköpostiosoite invalid_otp_token: Virheellinen kaksivaiheisen todentamisen koodi + otp_lost_help_html: Jos sinulla ei ole pääsyä kumpaankaan, voit ottaa yhteyttä osoitteeseen %{email} seamless_external_login: Olet kirjautunut ulkoisen palvelun kautta, joten salasana- ja sähköpostiasetukset eivät ole käytettävissä. signed_in_as: 'Kirjautunut henkilönä:' diff --git a/config/locales/fr.yml b/config/locales/fr.yml index e15d52f12..48843981b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -49,11 +49,12 @@ fr: reserved_username: Ce nom d’utilisateur⋅ice est réservé roles: admin: Admin + bot: Robot moderator: Modérateur·trice unfollow: Ne plus suivre admin: account_moderation_notes: - create: Créer + create: Créer une note created_msg: Note de modération créée avec succès ! delete: Supprimer destroyed_msg: Note de modération supprimée avec succès ! @@ -373,6 +374,7 @@ fr: admin_mailer: new_report: body: "%{reporter} a signalé %{target}" + body_remote: Quelqu'un de %{domain} a signalé %{target} subject: Nouveau signalement sur %{instance} (#%{id}) application_mailer: notification_preferences: Modifier les préférences de courriel @@ -462,7 +464,7 @@ fr: archive_takeout: date: Date download: Télécharger votre archive - hint_html: Vous pouvez demander une archive de vos <strong>pouets et médias téléversés</strong>. Les données exportées seront au format ActivityPub, lisible par tout logiciel compatible. + hint_html: Vous pouvez demander une archive de vos <strong>pouets et médias téléversés</strong>. Les données exportées seront au format ActivityPub, lisible par tout logiciel compatible. Vous pouvez demander une archive tous les 7 jours. in_progress: Élaboration de votre archive.... request: Demandez vos archives size: Taille @@ -630,7 +632,7 @@ fr: micro_messenger: MicroMessenger nokia: Nokia S40 Ovi Browser opera: Opera - otter: Autre + otter: Otter phantom_js: PhantomJS qq: QQ Browser safari: Safari @@ -752,5 +754,6 @@ fr: users: invalid_email: L’adresse courriel est invalide invalid_otp_token: Le code d’authentification à deux facteurs est invalide + otp_lost_help_html: Si vous perdez accès aux deux, vous pouvez contacter %{email} seamless_external_login: Vous êtes connecté via un service externe, donc les paramètres concernant le mot de passe et le courriel ne sont pas disponibles. signed_in_as: 'Connecté·e en tant que :' diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 432da19f6..a33eb1251 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -49,11 +49,12 @@ gl: reserved_username: O nome de usuaria está reservado roles: admin: Admin + bot: Bot moderator: Mod unfollow: Deixar de seguir admin: account_moderation_notes: - create: Crear + create: Deixar nota created_msg: Nota a moderación creada con éxito! delete: Eliminar destroyed_msg: Nota a moderación destruída con éxito! @@ -463,7 +464,7 @@ gl: archive_takeout: date: Data download: Descargue o seu ficheiro - hint_html: Pode solicitar un ficheiro cos <strong>seus toots ficheiros de medios</strong>. Os datos estarán en formato ActivityPub e son compatibles con calquer software que o cumpla. + hint_html: Pode solicitar un ficheiro cos <strong>seus toots ficheiros de medios</strong>. Os datos estarán en formato ActivityPub e son compatibles con calquer software que o cumpla. Pode solicitar un ficheiro cada 7 días. in_progress: Xerando o seu ficheiro... request: Solicite o ficheiro size: Tamaño @@ -832,5 +833,6 @@ gl: users: invalid_email: O enderezo de correo non é válido invalid_otp_token: Código de doble-factor non válido + otp_lost_help_html: Si perde o acceso a ambos, pode contactar con %{email} seamless_external_login: Está conectado a través de un servizo externo, polo que os axustes de contrasinal e correo-e non están dispoñibles. signed_in_as: 'Rexistrada como:' diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 9186d4578..978645dbd 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -119,7 +119,7 @@ ja: redownload: アバターの更新 remove_avatar: アイコンを削除 resend_confirmation: - already_confirmed: メールアドレスは確認済みです。 + already_confirmed: メールアドレスは確認済みです send: 確認メールを再送 success: 確認メールを再送信しました! reset: リセット @@ -463,7 +463,7 @@ ja: archive_takeout: date: 日時 download: ダウンロード - hint_html: "<strong>トゥートとメディア</strong>のアーカイブをリクエストできます。 データはActivityPub形式で、対応しているソフトウェアで読み込むことができます。" + hint_html: "<strong>トゥートとメディア</strong>のアーカイブをリクエストできます。 データはActivityPub形式で、対応しているソフトウェアで読み込むことができます。7日毎にアーカイブをリクエストできます。" in_progress: 準備中... request: アーカイブをリクエスト size: 容量 @@ -843,5 +843,6 @@ ja: users: invalid_email: メールアドレスが無効です invalid_otp_token: 二段階認証コードが間違っています + otp_lost_help_html: どちらも使用できない場合、%{email} に連絡を取ると解決できるかもしれません seamless_external_login: あなたは外部サービスを介してログインしているため、パスワードとメールアドレスの設定は利用できません。 signed_in_as: '下記でログイン中:' diff --git a/config/locales/ko.yml b/config/locales/ko.yml index d2583ba82..62ed72b7d 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -19,12 +19,12 @@ ko: humane_approach_body: 다른 SNS의 실패를 교훈삼아, Mastodon은 소셜미디어가 잘못 사용되는 것을 막기 위하여 윤리적인 설계를 추구합니다. humane_approach_title: 보다 배려를 의식한 설계를 추구 not_a_product_body: Mastodon은 이익을 추구하는 SNS가 아닙니다. 그러므로 광고와 데이터의 수집 및 분석이 존재하지 않고, 유저를 구속하지도 않습니다. - not_a_product_title: 여러분은 사람이며, 상품이 아닙니다. + not_a_product_title: 여러분은 사람이며, 상품이 아닙니다 real_conversation_body: 자유롭게 사용할 수 있는 500문자의 메세지와 미디어 경고 내용을 바탕으로, 자기자신을 자유롭게 표현할 수 있습니다. real_conversation_title: 진정한 커뮤니케이션을 위하여 within_reach_body: 개발자 친화적인 API에 의해서 실현된 iOS나 Android, 그 외의 여러 Platform들 덕분에 어디서든 친구들과 자유롭게 메세지를 주고 받을 수 있습니다. within_reach_title: 언제나 유저의 곁에서 - generic_description: "%{domain} 은 Mastodon의 인스턴스 입니다." + generic_description: "%{domain} 은 네트워크에 있는 한 서버입니다" hosted_on: "%{domain}에서 호스팅 되는 마스토돈" learn_more: 자세히 other_instances: 다른 인스턴스 @@ -53,7 +53,7 @@ ko: unfollow: 팔로우 해제 admin: account_moderation_notes: - create: 작성하기 + create: 모더레이션 노트 작성하기 created_msg: 모더레이션 기록이 성공적으로 작성되었습니다! delete: 삭제 destroyed_msg: 모더레이션 기록이 성공적으로 삭제되었습니다! @@ -119,9 +119,9 @@ ko: redownload: 아바타 업데이트 remove_avatar: 아바타 지우기 resend_confirmation: - already_confirmed: 이 사용자는 이미 확인되었습니다. + already_confirmed: 이 사용자는 이미 확인되었습니다 send: 다시 확인 이메일 - success: 확인 이메일이 전송되었습니다. + success: 확인 이메일이 전송되었습니다! reset: 초기화 reset_password: 비밀번호 초기화 resubscribe: 다시 구독 @@ -279,9 +279,9 @@ ko: mark_as_resolved: 해결 완료 처리 mark_as_unresolved: 미해결로 표시 notes: - create: 노트 추가 - create_and_resolve: 노트를 작성하고 해결됨으로 표시 - create_and_unresolve: 노트 작성과 함께 미해결로 표시 + create: 기록 추가 + create_and_resolve: 기록을 작성하고 해결됨으로 표시 + create_and_unresolve: 기록 작성과 함께 미해결로 표시 delete: 삭제 placeholder: 이 리포트에 대한 조치, 다른 업데이트 사항에 대해 설명합니다… reopen: 리포트 다시 열기 @@ -375,6 +375,7 @@ ko: admin_mailer: new_report: body: "%{reporter} 가 %{target} 를 신고했습니다" + body_remote: "%{domain}의 누군가가 %{target}을 신고했습니다" subject: "%{instance} 에 새 신고 등록됨 (#%{id})" application_mailer: notification_preferences: 메일 설정 변경 @@ -464,7 +465,7 @@ ko: archive_takeout: date: 날짜 download: 아카이브 다운로드 - hint_html: 당신의 <strong>툿과 업로드 된 미디어</strong>의 아카이브를 요청할 수 있습니다. 내보내지는 데이터는 ActivityPub 포맷입니다. 호환 되는 모든 소프트웨어에서 읽을 수 있습니다. + hint_html: 당신의 <strong>툿과 업로드 된 미디어</strong>의 아카이브를 요청할 수 있습니다. 내보내지는 데이터는 ActivityPub 포맷입니다. 호환 되는 모든 소프트웨어에서 읽을 수 있습니다. 7일마다 새로운 아카이브를 요청할 수 있습니다. in_progress: 당신의 아카이브를 컴파일 중입니다… request: 아카이브 요청하기 size: 크기 @@ -683,6 +684,9 @@ ko: one: "%{count} 영상" other: "%{count} 영상" content_warning: '열람 주의: %{warning}' + disallowed_hashtags: + one: '허용 되지 않은 해시태그를 포함하고 있습니다: %{tags}' + other: '허용되지 않은 해시태그를 포함하고 있습니다: %{tags}' open_in_web: Web으로 열기 over_character_limit: 최대 %{max}자까지 입력할 수 있습니다 pin_errors: @@ -706,6 +710,9 @@ ko: sensitive_content: 민감한 컨텐츠 terms: title: "%{instance} 이용약관과 개인정보 취급 방침" + themes: + contrast: 고대비 + default: 마스토돈 time: formats: default: "%Y년 %m월 %d일 %H:%M" @@ -724,10 +731,10 @@ ko: recovery_codes_regenerated: 복구 코드가 다시 생성되었습니다 recovery_instructions_html: 휴대전화를 분실한 경우, 아래 복구 코드 중 하나를 사용해 계정에 접근할 수 있습니다. <strong>복구 코드는 안전하게 보관해 주십시오.</strong> 이 코드를 인쇄해 중요한 서류와 함께 보관하는 것도 좋습니다. setup: 초기 설정 - wrong_code: 코드가 올바르지 않습니다. 서버와 휴대전화 간의 시간이 일치하는지 확인해 주십시오. + wrong_code: 코드가 올바르지 않습니다. 서버와 휴대전화 간의 시각이 일치하나요? user_mailer: backup_ready: - explanation: 당신이 요청한 계정의 풀 백업이 이제 다운로드 가능합니다. + explanation: 당신이 요청한 계정의 풀 백업이 이제 다운로드 가능합니다! subject: 당신의 아카이브를 다운로드 가능합니다 title: 아카이브 테이크 아웃 welcome: @@ -751,5 +758,6 @@ ko: users: invalid_email: 메일 주소가 올바르지 않습니다 invalid_otp_token: 2단계 인증 코드가 올바르지 않습니다 + otp_lost_help_html: 만약 양쪽 모두를 잃어버렸다면 %{email}을 통해 복구할 수 있습니다 seamless_external_login: 외부 서비스를 이용해 로그인 했습니다, 패스워드와 이메일 설정을 할 수 없습니다. signed_in_as: '다음과 같이 로그인 중:' diff --git a/config/locales/nl.yml b/config/locales/nl.yml index fdc1145ac..14d1ba2b1 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -5,10 +5,10 @@ nl: about_mastodon_html: Mastodon is een sociaal netwerk dat gebruikt maakt van open webprotocollen en vrije software. Het is net zoals e-mail gedecentraliseerd. about_this: Over deze server administered_by: 'Beheerd door:' - closed_registrations: Registreren op deze server is momenteel uitgeschakeld. + closed_registrations: Registreren op deze server is momenteel niet mogelijk. Je kunt echter een andere server vinden om zo toegang te krijgen tot het netwerk. contact: Contact contact_missing: Niet ingesteld - contact_unavailable: N/A + contact_unavailable: n.v.t description_headline: Wat is %{domain}? domain_count_after: andere servers domain_count_before: Verbonden met @@ -16,11 +16,11 @@ nl: <h3>Een goede plek voor richtlijnen</h3> <p>De uitgebreide omschrijving is nog niet ingevuld.</p> features: - humane_approach_body: Na van de fouten van andere netwerken te hebben geleerd, tracht Mastodon ethische ontwerpkeuzes te maken om misbruik van social media te voorkomen. + humane_approach_body: Mastodon heeft van de fouten van andere sociale netwerken geleerd en probeert aan de hand van ethische ontwerpkeuzes misbruik van sociale media te voorkomen. humane_approach_title: Een meer menselijke aanpak - not_a_product_body: Mastodon is geen commercieel netwerk. Dus geen advertenties, geen datamining en geen besloten systemen. Er is geen centrale organisatie die alles bepaald. + not_a_product_body: Mastodon is geen commercieel netwerk. Dus geen advertenties, geen datamining en geen besloten systemen. Er is geen centrale organisatie die alles bepaalt. not_a_product_title: Jij bent een persoon, geen product - real_conversation_body: Met 500 karakters tot jouw beschikking, en ondersteuning voor tekst- en media-waarschuwingen, kan je jezelf uiten zoals jij dat wil. + real_conversation_body: Met 500 tekens tot jouw beschikking en ondersteuning voor tekst- en media-waarschuwingen, kan je jezelf uiten zoals jij dat wil. real_conversation_title: Voor echte gesprekken gemaakt within_reach_body: Meerdere apps voor iOS, Android en andere platformen, met dank aan het ontwikkelaarsvriendelijke API-systeem, zorgen ervoor dat je overal op de hoogte blijft. within_reach_title: Altijd binnen bereik @@ -41,19 +41,20 @@ nl: media: Media moved_html: "%{name} is verhuisd naar %{new_profile_link}:" nothing_here: Hier is niets! - people_followed_by: Mensen die %{name} volgt + people_followed_by: Mensen die %{name} volgen people_who_follow: Mensen die %{name} volgen posts: Toots - posts_with_replies: Toots met reacties + posts_with_replies: Toots en reacties remote_follow: Extern volgen reserved_username: Deze gebruikersnaam is gereserveerd roles: admin: Beheerder - moderator: Mod + bot: Bot + moderator: Moderator unfollow: Ontvolgen admin: account_moderation_notes: - create: Aanmaken + create: Laat een opmerking achter created_msg: Aanmaken van opmerking voor moderatoren geslaagd! delete: Verwijderen destroyed_msg: Verwijderen van opmerking voor moderatoren geslaagd! @@ -64,10 +65,10 @@ nl: change_email: changed_msg: E-mailadres van account succesvol veranderd! current_email: Huidig e-mailadres - label: E-mailadres veranderen + label: E-mailadres wijzigen new_email: Nieuw e-mailadres submit: E-mailadres veranderen - title: E-mailadres veranderen voor %{username} + title: E-mailadres wijzigen voor %{username} confirm: Bevestigen confirmed: Bevestigd confirming: Bevestiging @@ -93,9 +94,9 @@ nl: local: Lokaal remote: Extern title: Locatie - login_status: Aanmeldstatus + login_status: Login status media_attachments: Mediabijlagen - memorialize: Verander naar in memoriam + memorialize: In gedenkpagina veranderen moderation: all: Alles silenced: Genegeerd @@ -112,7 +113,7 @@ nl: outbox_url: Outbox-URL perform_full_suspension: Volledig opschorten profile_url: Profiel-URL - promote: Promoten + promote: Promoveren protocol: Protocol public: Openbaar push_subscription_expires: PuSH-abonnement verloopt op @@ -125,7 +126,7 @@ nl: reset: Opnieuw reset_password: Wachtwoord opnieuw instellen resubscribe: Opnieuw abonneren - role: Permissies + role: Bevoegdheden roles: admin: Beheerder moderator: Moderator @@ -165,7 +166,7 @@ nl: disable_user: Aanmelden voor %{target} is door %{name} uitgeschakeld enable_custom_emoji: Emoji %{target} is door %{name} ingeschakeld enable_user: Inloggen voor %{target} is door %{name} ingeschakeld - memorialize_account: Account %{target} is door %{name} in een in-memoriampagina veranderd + memorialize_account: Account %{target} is door %{name} in een gedenkpagina veranderd promote_user: Gebruiker %{target} is door %{name} gepromoveerd remove_avatar_user: "%{name} verwijderde de avatar van %{target}" reopen_report: "%{name} heeft gerapporteerde toot %{target} heropend" @@ -224,7 +225,7 @@ nl: noop: Geen silence: Negeren suspend: Opschorten - severity: Strengheid + severity: Zwaarte show: affected_accounts: one: Eén account in de database aangepast @@ -463,7 +464,7 @@ nl: archive_takeout: date: Datum download: Jouw archief downloaden - hint_html: Je kunt een archief opvragen van jouw <strong>toots en geüploade media</strong>. De geëxporteerde gegevens zijn in ActivityPub-formaat, dat door hiervoor geschikte software valt uit te lezen. + hint_html: Je kunt een archief opvragen van jouw <strong>toots en geüploade media</strong>. De geëxporteerde gegevens zijn in ActivityPub-formaat, dat door hiervoor geschikte software valt uit te lezen. Je kunt elke 7 dagen een kopie van je archief aanvragen. in_progress: Jouw archief wordt samengesteld... request: Jouw archief opvragen size: Omvang @@ -830,5 +831,6 @@ nl: users: invalid_email: E-mailadres is ongeldig invalid_otp_token: Ongeldige tweestaps-aanmeldcode + otp_lost_help_html: Als je toegang tot beiden kwijt bent geraakt, neem dan contact op via %{email} seamless_external_login: Je bent ingelogd via een externe dienst, daarom zijn wachtwoorden en e-mailinstellingen niet beschikbaar. signed_in_as: 'Ingelogd als:' diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index e959ee19f..268a8f02a 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -53,7 +53,7 @@ pt-BR: unfollow: Deixar de seguir admin: account_moderation_notes: - create: Criar + create: Criar uma advertência created_msg: Nota de moderação criada com sucesso! delete: Excluir destroyed_msg: Nota de moderação excluída com sucesso! @@ -373,6 +373,7 @@ pt-BR: admin_mailer: new_report: body: "%{reporter} denunciou %{target}" + body_remote: Alguém da instância %{domain} reportou %{target} subject: Nova denúncia sobre %{instance} (#%{id}) application_mailer: notification_preferences: Mudar preferências de e-mail @@ -462,7 +463,7 @@ pt-BR: archive_takeout: date: Data download: Baixe o seu arquivo - hint_html: Você pode pedir um arquivo dos seus <strong>toots e mídia enviada</strong>. Os dados exportados estarão no formato ActivityPub, que podem ser lidos por qualquer software compatível. + hint_html: Você pode pedir um arquivo dos seus <strong>toots e mídia enviada</strong>. Os dados exportados estarão no formato ActivityPub, que podem ser lidos por qualquer software compatível. Você pode pedir um arquivo a cada 7 dias. in_progress: Preparando seu arquivo... request: Solicitar o seu arquivo size: Tamanho @@ -713,75 +714,75 @@ pt-BR: <li><em>Informação básica de conta</em>: Se você se registrar nesse servidor, podemos pedir que você utilize um nome de usuário, um e-mail e uma senha. Você também pode adicionar informações extras como um nome de exibição e biografia; enviar uma imagem de perfil e imagem de cabeçalho. O nome de usuário, nome de exibição, biografia, imagem de perfil e imagem de cabeçalho são sempre listadas publicamente.</li> <li><em>Posts, informação de seguidores e outras informações públicas</em>: A lista de pessoas que você segue é listada publicamente, o mesmo é verdade para quem te segue. Quando você envia uma mensagem, a data e o horário são armazenados, assim como a aplicação que você usou para enviar a mensagem. Mensagens podem conter mídias anexadas, como imagens e vídeos. Posts públicos e não-listados estão disponíveis publicamente. Quando você destaca um post no seu perfil, isso também é uma informação pública. Seus posts são entregues aos seus seguidores e em alguns casos isso significa que eles são enviados para servidores diferentes e cópias são armazenadas nesses servidores. Quando você remove posts, essa informação também é entregue aos seus seguidores. O ato de compartilhar ou favoritar um outro post é sempre público.<li> <li><em>Mensagens diretas e posts somente para seguidores</em>: Todos os posts são armazenados e processados no servidor. Posts somente para seguidores são entregues aos seus seguidores e usuários que são mencionados neles; mensagens diretas são entregues somente aos usuários mencionados nelas. Em alguns casos isso significa que as mensagens são entregues para servidores diferentes e cópias são armazenadas nesses servidores. Nós fazemos esforços substanciais para limitar o acesso dessas mensagens somente para as pessoas autorizadas, mas outros servidores podem não fazer o mesmo. É importante portanto revisar os servidores à qual seus seguidores pertencem. Você pode usar uma opção para aprovar ou rejeitar novos seguidores manualmente nas configurações. <em>Por favor tenha em mente que os operadores do servidor e de qualquer servidores do destinatário podem ver tais mensagens</em>, e que os destinatários podem fazer capturas de tela, copiar ou de outra maneira compartilhar as mensagens. <em>Não compartilhe informação confidencial pelo Mastodon.</em></li> - <li><em>IPs and other metadata</em>: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.</li> + <li><em>IPs e outros metadados</em>: Quando você faz se autentica, nos guardamos o endereço de IP que você usou ao se autenticar e o nome do seu navegador da internet. Todas as sessões autenticadas são disponíveis para serem analisadas e revogadas nas configurações. O último endereço de IP usado é guardado por até 12 meses. Nós também podemos reter históricos do servidor que incluem o endereço de IP de todas as requisições ao nosso servidor.</li> </ul> <hr class="spacer" /> - <h3 id="use">What do we use your information for?</h3> + <h3 id="use">Para que usamos os seus dados?</h3> - <p>Any of the information we collect from you may be used in the following ways:</p> + <p>Toda informação que coletamos de você pode ser usada das seguintes maneiras:</p> <ul> - <li>To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.</li> - <li>To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.</li> - <li>The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.</li> + <li>Para prover a funcionalidade básica do Mastodon. Você só pode interagir com o conteúdo de outras pessoas e postar seu próprio conteúdo estando autenticado. Por exemplo, você pode seguir outras pessoas para ver seus posts combinados na sua linha do tempo personalizada.</li> + <li>Para auxiliar na moderação da comunidade, por exemplo ao comparar o seu endereço de IP com outros endereços de IP conhecidos para determinar evasão de banimento e outras violações.</li> + <li>O endereço de email que você prover pode ser usado para lhe enviar informação, notificação sobre outras pessoas interagindo com o seu conteúdo ou lhe enviando mensagens e para responder a questões ou outros pedidos.</li> </ul> <hr class="spacer" /> - <h3 id="protect">How do we protect your information?</h3> + <h3 id="protect">Como protegemos as suas informações?</h3> - <p>We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL, and your password is hashed using a strong one-way algorithm. You may enable two-factor authentication to further secure access to your account.</p> + <p>Nós implementamos diversas medidas de segurança para manter a segurança das suas informações pessoais quando você as acessa ou as envia. Entre outras coisas, sua sessão do navegador, bem como o tráfego entre as aplicações e a API são asseguradas usando SSL e a sua senha é guardada usando um algoritmo forte de encriptação de mão única. Você pode ativar autenticação em dois fatores como forma de aumentar a segurança no acesso à sua conta.</p> <hr class="spacer" /> - <h3 id="data-retention">What is our data retention policy?</h3> + <h3 id="data-retention">Qual é a nossa política de retenção de dados?</h3> - <p>We will make a good faith effort to:</p> + <p>Nós fazemos esforços substanciais para:</p> <ul> - <li>Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.</li> - <li>Retain the IP addresses associated with registered users no more than 12 months.</li> + <li>Reter o histórico do servidor contendo os endereços de IP de todas as requisições feitas à esse servidor, e com respeito a quanto tempo esses logs são retidos, não mais que 90 dias.</li> + <li>Reter o endereço de IP associado com usuários registrados não mais que 12 meses.</li> </ul> - <p>You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.</p> + <p>Você pode pedir e fazer o download de um arquivo de todo o conteúdo da sua conta, incluindo as suas mensagens, suas mídias anexadas, imagem de perfil e imagem de topo.</p> - <p>You may irreversibly delete your account at any time.</p> + <p>Você pode remover irreversivelmente a sua conta a qualquer momento.</p> <hr class="spacer"/> - <h3 id="cookies">Do we use cookies?</h3> + <h3 id="cookies">Nós usamos cookies?</h3> - <p>Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.</p> + <p>Sim. Cookies são pequenos arquivos que um site ou serviço transfere ao seu disco rígido do seu computador através do seu navegador da web (se você permitir). Esses cookies permitem ao site conhecer seu navegador e, se você tiver uma conta registrada, associá-lo a sua conta.</p> - <p>We use cookies to understand and save your preferences for future visits.</p> + <p>Nós usamos cookies para compreender e salvar suas preferências para visitas futuras.</p> <hr class="spacer" /> - <h3 id="disclose">Do we disclose any information to outside parties?</h3> + <h3 id="disclose">Nós compartilhamos qualquer informação para terceiros?</h3> - <p>We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety.</p> + <p>Nós não vendemos, trocamos ou transferimos de qualquer maneira informação que pode lhe identificar à terceiros. Isso não inclui terceiros que podemos nos auxiliam a operar o nosso site, realizar nossos negócios ou lhe prestar serviços, contanto que esses terceiros se comprometam a manter essa informação confidencial. Nós podemos também divulgar informação quando acreditamos que é apropriado para obedecer a lei, para fazer cumprir nossas políticas ou proteger nossos direitos, propriedade ou segurança ou o direito, propriedade e segurança de outrem.</p> - <p>Your public content may be downloaded by other servers in the network. Your public and followers-only posts are delivered to the servers where your followers reside, and direct messages are delivered to the servers of the recipients, in so far as those followers or recipients reside on a different server than this.</p> + <p>Seu conteúdo público pode ser descarregado por outros servidores na rede. Suas mensagens públicas e somente para seus seguidores são entregues aos servidores onde seus seguidores resides e as suas mensagens diretas são entregues ao servidor dos usuários mencionados nelas, contanto que esses seguidores ou usuários residam em um servidor diferente deste.</p> - <p>When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your favourites. Applications can never access your e-mail address or password.</p> + <p>Quando você autoriza uma aplicação a usar sua conta, dependendo do escopo de permissões que você aprovar, a aplicação pode acessar sua informação pública, a lista de usuários que você segue, seus seguidores, suas listas, suas mensagens e suas mensagens favoritas. Aplicações nunca podem acessar o seu endereço de e-mail ou senha.</p> <hr class="spacer" /> - <h3 id="coppa">Children's Online Privacy Protection Act Compliance</h3> + <h3 id="coppa">Conformidade com a COPPA (Children's Online Privacy Protection Act)</h3> - <p>Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) do not use this site.</p> + <p>Nosso site, produto e serviços são direcionados à pessoas que tem ao menos 13 anos de idade. Se esse servidor está hospedado nos EUA e você tem menos de 13 anos, de acordo com os requerimentos da COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) não use este site.</p> <hr class="spacer" /> - <h3 id="changes">Changes to our Privacy Policy</h3> + <h3 id="changes">Mudanças à nossa política de privacidade</h3> - <p>If we decide to change our privacy policy, we will post those changes on this page.</p> + <p>Se decidirmos mudar nossa política de privacidade, nós iremos disponibilizar as mudanças nesta página.</p> - <p>This document is CC-BY-SA. It was last updated March 7, 2018.</p> + <p>Este documento é CC-BY-SA. Ele foi atualizado pela última vez em 7 de março de 2018.</p> - <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p> + <p>Adaptado originalmente a partir da <a href="https://github.com/discourse/discourse">política de privacidade Discourse</a>.</p> title: "%{instance} Termos de Serviço e Política de Privacidade" time: formats: @@ -828,5 +829,6 @@ pt-BR: users: invalid_email: O endereço de e-mail é inválido invalid_otp_token: Código de autenticação inválido + otp_lost_help_html: Se você perder o acesso à ambos, você pode entrar em contato com %{email} seamless_external_login: Você está logado usando um serviço externo, então configurações de e-mail e password não estão disponíveis. signed_in_as: 'Acesso como:' diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 28cfa8ab7..ff0332c18 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -4,6 +4,7 @@ ar: hints: defaults: avatar: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير 2MB. سيتم تصغيره إلى 400x400px + bot: يُعلِم أنّ هذا الحساب لا يمثل شخصًا digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة display_name: one: <span class="name-counter">1</span> حرف باقي @@ -19,7 +20,7 @@ ar: imports: data: ملف CSV تم تصديره مِن مثيل خادوم ماستدون آخر sessions: - otp: قم بإدخال رمز المصادقة بخطوتين مِن هاتفك أو إستخدم أحد رموز النفاذ الإحتياطية. + otp: 'قم بإدخال رمز المصادقة بخطوتين الذي قام بتوليده تطبيق جهازك أو إستخدم أحد رموز النفاذ الإحتياطية :' user: filtered_languages: سوف يتم تصفية و إخفاء اللغات المختارة من خيوطك العمومية labels: @@ -29,6 +30,7 @@ ar: value: المحتوى defaults: avatar: الصورة الرمزية + bot: إنّ هذا الحساب روبوت آلي confirm_new_password: تأكيد كلمة السر الجديدة confirm_password: تأكيد كلمة السر current_password: كلمة السر الحالية diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 1b04da90a..21d466918 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -4,6 +4,7 @@ ca: hints: defaults: avatar: PNG, GIF o JPG. Màxim 2MB. S'escalarà a 400x400px + bot: Informa a tothom que el compte no representa a una persona digest: Només s'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència display_name: one: <span class="name-counter">1</span> càracter restant @@ -19,7 +20,7 @@ ca: imports: data: Fitxer CSV exportat des de una altra instància de Mastodon sessions: - otp: Introdueix el codi de dos factors des del teu telèfon o utilitza un dels teus codis de recuperació. + otp: 'Introdueix el codi de dos factors generat per el teu telèfon o utilitza un dels teus codis de recuperació:' user: filtered_languages: Les llengües seleccionades s'eliminaran de les línies de temps públiques labels: @@ -29,6 +30,7 @@ ca: value: Contingut defaults: avatar: Avatar + bot: Aquest compte és un bot confirm_new_password: Confirma la contrasenya nova confirm_password: Confirma la contrasenya current_password: Contrasenya actual diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 21404897b..8d2470435 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -4,6 +4,7 @@ co: hints: defaults: avatar: Furmatu PNG, GIF o JPG. 2Mo o menu. Sarà ridottu à 400x400px + bot: Avisa a ghjente chì stu contu ùn riprisenta micca una parsona digest: Solu mandatu dopu à una longa perioda d’inattività, è solu s’elli ci sò novi missaghji diretti display_name: one: Ci ferma <span class="name-counter">1</span> caratteru @@ -19,16 +20,17 @@ co: imports: data: Un fugliale CSV da un’altr’istanza di Mastodon sessions: - otp: Entrate u codice d’identificazione à dui fattori nant’à u vostru telefuninu, o unu di i vostri codici di ricuperazione. + otp: 'Entrate u codice d’identificazione à dui fattori nant’à u vostru telefuninu, o unu di i vostri codici di ricuperazione:' user: - filtered_languages: Ùn viderete micca e lingue selezziunate nant’à e linee pubbliche. + filtered_languages: Ùn viderete micca e lingue selezziunate nant’à e linee pubbliche labels: account: fields: name: Label - value: Content + value: Cuntinutu defaults: avatar: Ritrattu di prufile + bot: Stu contu hè un bot confirm_new_password: Cunfirmà a nova chjave d’accessu confirm_password: Cunfirmà a chjave d’accessu current_password: Chjave d’accessu attuale diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index a9d650a26..1bf1cbf78 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -4,6 +4,7 @@ de: hints: defaults: avatar: PNG, GIF oder JPG. Maximal 2 MB. Wird auf 400×400 px herunterskaliert + bot: Warnt Besucher das dieser Nutzer keine echte Person darstellt digest: Wenn du lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen in deiner Abwesenheit zugeschickt display_name: one: <span class="name-counter">1</span> Zeichen verbleibt @@ -19,7 +20,7 @@ de: imports: data: CSV-Datei, die aus einer anderen Mastodon-Instanz exportiert wurde sessions: - otp: Gib den Zwei-Faktor-Authentisierungs-Code von deinem Telefon ein oder benutze einen deiner Wiederherstellungscodes. + otp: 'Gib den Zwei-Faktor-Authentisierungscode von deinem Telefon ein oder benutze einen deiner Wiederherstellungscodes:' user: filtered_languages: Ausgewählte Sprachen werden aus deinen öffentlichen Zeitleisten gefiltert labels: @@ -29,6 +30,7 @@ de: value: Inhalt defaults: avatar: Profilbild + bot: Dies ist ein bot Benutzer confirm_new_password: Neues Passwort bestätigen confirm_password: Passwort bestätigen current_password: Derzeitiges Passwort diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 41a0c26aa..9ff9ebad4 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -4,10 +4,12 @@ eo: hints: defaults: avatar: Formato PNG, GIF aŭ JPG. Ĝis 2MB. Estos malgrandigita al 400x400px + bot: Atentigas homojn, ke la konto ne reprezentas homon digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto display_name: one: <span class="name-counter">1</span> signo restas other: <span class="name-counter">%{count}</span> signoj restas + fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo header: Formato PNG, GIF aŭ JPG. Ĝis 2MB. Estos malgrandigita al 700x335px locked: Vi devos aprobi ĉiun peton de sekvado mane note: @@ -18,12 +20,17 @@ eo: imports: data: CSV-dosiero el alia nodo de Mastodon sessions: - otp: Enmetu la kodon de dufaktora aŭtentigo el via telefono aŭ uzu unu el la realiraj kodoj. + otp: 'Enmetu la kodon de dufaktora aŭtentigo el via telefono aŭ uzu unu el viaj realiraj kodoj:' user: filtered_languages: Markitaj lingvoj estos elfiltritaj de publikaj tempolinioj por vi labels: + account: + fields: + name: Etikedo + value: Enhavo defaults: avatar: Profilbildo + bot: Tio estas robota konto confirm_new_password: Konfirmi novan pasvorton confirm_password: Konfirmi pasvorton current_password: Nuna pasvorto @@ -31,6 +38,7 @@ eo: display_name: Publika nomo email: Retadreso expires_in: Eksvalidiĝas post + fields: Profilaj metadatumoj filtered_languages: Filtritaj lingvoj header: Fonbildo locale: Lingvo diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index ddb13ae43..c492e5d9a 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -3,11 +3,12 @@ fa: simple_form: hints: defaults: - avatar: یکی از قالبهای PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۱۲۰×۱۲۰ پیکسل تبدیل خواهد شد - digest: پس از مدت طولانی عدم فعالیت فرستاده میشود، شامل خلاصهای از مواردی که در نبودتان از شما نام برده شده + avatar: یکی از قالبهای PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۴۰۰×۴۰۰ پیکسل تبدیل خواهد شد + digest: تنها وقتی فرستاده میشود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصیای نوشته شده باشد display_name: one: <span class="name-counter">1</span> حرف باقی مانده other: <span class="name-counter">%{count}</span> حرف باقی مانده + fields: شما میتوانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالبهای PNG یا GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۳۳۵×۷۰۰ پیکسل تبدیل خواهد شد locked: باید پیگیران تازه را خودتان تأیید کنید. حریم خصوصی پیشفرض نوشتهها را روی پیگیران تنظیم میکند note: @@ -18,10 +19,14 @@ fa: imports: data: پروندهٔ CSV که از سرور ماستدون دیگری برونسپاری شده sessions: - otp: کد تأیید دومرحلهای را از تلفن خود وارد کنید یا یکی از کدهای بازیابی را به کار ببرید. + otp: 'کد تأیید دومرحلهای که اپ روی تلفن شما ساخته را وارد کنید یا یکی از کدهای بازیابی را به کار ببرید:' user: filtered_languages: زبانهای انتخابشده از فهرست عمومی نوشتههایی که میبینید حذف میشوند labels: + account: + fields: + name: برچسب + value: محتوا defaults: avatar: تصویر نمایه confirm_new_password: تأیید رمز تازه @@ -31,6 +36,7 @@ fa: display_name: نمایش به نام email: نشانی ایمیل expires_in: تاریخ انقضا + fields: اطلاعات تکمیلی نمایه filtered_languages: زبانهای فیلترشده header: تصویر زمینه locale: زبان @@ -45,6 +51,7 @@ fa: setting_default_privacy: حریم خصوصی نوشتهها setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن setting_delete_modal: پیش از پاک کردن یک نوشته پیغام تأیید نشان بده + setting_display_sensitive_media: همیشه تصویرهای علامتزدهشده به عنوان حساس را نمایش بده setting_noindex: درخواست از موتورهای جستجو برای لغو فهرستسازی setting_reduce_motion: کاستن از حرکت در پویانماییها setting_system_font_ui: بهکاربردن قلم پیشفرض سیستم @@ -53,6 +60,7 @@ fa: severity: شدت type: نوع درونریزی username: نام کاربری (تنها حروف انگلیسی) + username_or_email: نام کاربری یا ایمیل interactions: must_be_follower: مسدودکردن اعلانهای همه به جز پیگیران must_be_following: مسدودکردن اعلانهای کسانی که شما پی نمیگیرید diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index f48e9ab23..b7b97395a 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -8,6 +8,7 @@ fi: display_name: one: <span class="name-counter">1</span> merkki jäljellä other: <span class="name-counter">%{count}</span> merkkiä jäljellä + fields: Sinulla voi olla korkeintaan 4 asiaa profiilissasi taulukossa header: PNG, GIF tai JPG. Enintään 2 Mt. Skaalataan kokoon 700 x 335 px locked: Sinun täytyy hyväksyä seuraajat manuaalisesti note: @@ -22,6 +23,9 @@ fi: user: filtered_languages: Valitut kielet suodatetaan pois julkisilta aikajanoilta labels: + account: + fields: + value: Sisältö defaults: avatar: Profiilikuva confirm_new_password: Vahvista uusi salasana @@ -31,6 +35,7 @@ fi: display_name: Nimimerkki email: Sähköpostiosoite expires_in: Vanhenee + fields: Profiilin metadata filtered_languages: Suodatetut kielet header: Otsakekuva locale: Kieli @@ -38,7 +43,7 @@ fi: max_uses: Käyttökertoja enintään new_password: Uusi salasana note: Kuvaus - otp_attempt: Kaksivaiheisen tunnistautumisen koodi + otp_attempt: Kaksivaiheisen tunnistuksen koodi password: Salasana setting_auto_play_gif: Toista GIF-animaatiot automaattisesti setting_boost_modal: Kysy vahvistusta ennen buustausta diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 88e1b8873..1c5a7b191 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -4,6 +4,7 @@ fr: hints: defaults: avatar: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à 400x400px + bot: Avertit que ce compte ne représente pas une personne digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence display_name: one: <span class="name-counter">1</span> caractère restant @@ -19,7 +20,7 @@ fr: imports: data: Un fichier CSV généré par une autre instance de Mastodon sessions: - otp: Entrez le code d’authentification à deux facteurs depuis votre téléphone ou utilisez un de vos codes de récupération. + otp: 'Entrez le code d’authentification à deux facteurs généré par votre téléphone ou utilisez un de vos codes de récupération :' user: filtered_languages: Les langues sélectionnées seront filtrées hors de vos fils publics pour vous labels: @@ -29,6 +30,7 @@ fr: value: Contenu defaults: avatar: Image de profil + bot: Ceci est un robot confirm_new_password: Confirmation du nouveau mot de passe confirm_password: Confirmation du mot de passe current_password: Mot de passe actuel diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 72633c759..461b8080d 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -3,13 +3,14 @@ gl: simple_form: hints: defaults: - avatar: PNG, GIF ou JPG. Como moito 2MB. Será reducida ate 400x400px + avatar: PNG, GIF ou JPG. Máximo 2MB. Será reducida a 400x400px + bot: Avisa as usuarias de que a conta non representa a unha persoa digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe personal na súa ausencia display_name: one: <span class="name-counter">1</span> caracter restante other: <span class="name-counter">%{count}</span> caracteres restantes fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa - header: PNG, GIF ou JPG. Como moito 2MB. Será reducida a 700x335px + header: PNG, GIF ou JPG. Máximo 2MB. Será reducida a 700x335px locked: Require que vostede aprove as seguidoras de xeito manual note: one: <span class="note-counter">1</span> caracter restante @@ -19,7 +20,7 @@ gl: imports: data: Ficheiro CSV exportado desde outra instancia Mastodon sessions: - otp: Introduza o código de Doble-Factor desde o seu teléfono ou utilice un dos seus códigos de recuperación. + otp: Introduza o código de doble-factor xerado no aplicativo do seu móbil ou utilice un dos seus códigos de recuperación. user: filtered_languages: Os idiomas marcados filtraranse das liñas temporais públicas para vostede labels: @@ -29,6 +30,7 @@ gl: value: Contido defaults: avatar: Avatar + bot: Esta conta é de un bot confirm_new_password: Confirme o novo contrasinal confirm_password: Confirme o contrasinal current_password: Contrasinal actual diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 9e4d40405..adc9a0c2d 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -4,6 +4,7 @@ ja: hints: defaults: avatar: 2MBまでのPNGやGIF、JPGが利用可能です。400x400pxまで縮小されます + bot: アカウントが個人を表すものではないことを表示します digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます display_name: あと<span class="name-counter">%{count}</span>文字入力できます。 fields: プロフィールに表として4つまでの項目を表示することができます @@ -15,7 +16,7 @@ ja: imports: data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい sessions: - otp: 携帯電話に表示された2段階認証コードを入力するか、生成したリカバリーコードを使用してください。 + otp: '携帯電話のアプリで生成された二段階認証コードを入力するか、リカバリーコードを使用してください:' user: filtered_languages: 選択した言語があなたの公開タイムラインから取り除かれます labels: @@ -25,6 +26,7 @@ ja: value: 内容 defaults: avatar: アイコン + bot: これは BOT アカウントです confirm_new_password: 新しいパスワード(確認用) confirm_password: パスワード(確認用) current_password: 現在のパスワード diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index ec42adfd7..fec5e7ec4 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -4,7 +4,8 @@ nl: hints: defaults: avatar: PNG, GIF of JPG. Maximaal 2MB. Wordt teruggeschaald naar 400x400px - digest: Wordt alleen na een lange periode van inactiviteit verzonden en alleen wanneer je tijdens jouw afwezigheid persoonlijke berichten ontvangt + bot: Waarschuwt mensen dat dit account geen echt persoon is + digest: Wordt alleen na een lange periode van inactiviteit verzonden en alleen wanneer je tijdens jouw afwezigheid persoonlijke berichten hebt ontvangen display_name: one: <span class="name-counter">1</span> teken over other: <span class="name-counter">%{count}</span> tekens over @@ -19,9 +20,9 @@ nl: imports: data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd sessions: - otp: Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcode's. + otp: Voer de tweestaps-aanmeldcode vanaf jouw mobiele telefoon in of gebruik een van jouw herstelcodes. user: - filtered_languages: De geselecteerde talen worden uit de lokale en globale tijdlijn verwijderd + filtered_languages: Geselecteerde talen worden uit de lokale en globale tijdlijn verwijderd labels: account: fields: @@ -29,6 +30,7 @@ nl: value: Inhoud defaults: avatar: Avatar + bot: Dit is een bot-account confirm_new_password: Nieuw wachtwoord bevestigen confirm_password: Wachtwoord bevestigen current_password: Huidig wachtwoord @@ -37,11 +39,11 @@ nl: email: E-mailadres expires_in: Vervalt na fields: Metadata profiel - filtered_languages: Talen filteren + filtered_languages: Gefilterde talen header: Omslagfoto locale: Taal locked: Maak account besloten - max_uses: Max aantal keer te gebruiken + max_uses: Max. aantal keer te gebruiken new_password: Nieuwe wachtwoord note: Bio otp_attempt: Tweestaps-aanmeldcode @@ -59,7 +61,7 @@ nl: setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging severity: Zwaarte type: Importtype - username: gebruikersnaam + username: Gebruikersnaam username_or_email: Gebruikersnaam of e-mailadres interactions: must_be_follower: Meldingen van mensen die jou niet volgen blokkeren diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index cae1f671d..0479c4c72 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -4,6 +4,7 @@ pt-BR: hints: defaults: avatar: PNG, GIF or JPG. Arquivos de até 2MB. Eles serão diminuídos para 400x400px + bot: Informa usuários que a conta não representa uma pessoa digest: Enviado após um longo período de inatividade com um resumo das menções que você recebeu em sua ausência display_name: one: <span class="name-counter">1</span> caracter restante @@ -19,7 +20,7 @@ pt-BR: imports: data: Arquivo CSV exportado de outra instância do Mastodon sessions: - otp: Insira o código de autenticação do seu celular ou use um dos códigos de recuperação. + otp: 'Insira o código de autenticação gerado pelo app no seu celular ou use um dos códigos de recuperação:' user: filtered_languages: Selecione os idiomas que devem ser removidos de suas timelines públicas labels: @@ -29,6 +30,7 @@ pt-BR: value: Conteúdo defaults: avatar: Avatar + bot: Essa é a conta de um robô confirm_new_password: Confirmar nova senha confirm_password: Confirmar senha current_password: Senha atual diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index b8ee5892d..639e4fdd5 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -4,12 +4,13 @@ ru: hints: defaults: avatar: PNG, GIF или JPG. Максимально 2MB. Будет уменьшено до 400x400px - digest: Отсылается после долгого периода неактивности с общей информацией упоминаний, полученных в Ваше отсутствие + digest: Отсылается лишь после длительной неактивности, если Вы в это время получали личные сообщения display_name: few: Осталось <span class="name-counter">%{count}</span> символа many: Осталось <span class="name-counter">%{count}</span> символов one: Остался <span class="name-counter">1</span> символ other: Осталось <span class="name-counter">%{count}</span> символов + fields: В профиле можно отобразить до 4 пунктов как таблицу header: PNG, GIF или JPG. Максимально 2MB. Будет уменьшено до 700x335px locked: Потребует от Вас ручного подтверждения подписчиков, изменит приватность постов по умолчанию на "только для подписчиков" note: @@ -22,10 +23,14 @@ ru: imports: data: Файл CSV, экспортированный с другого узла Mastodon sessions: - otp: Введите код двухфакторной аутентификации или используйте один из Ваших кодов восстановления. + otp: 'Введите код двухфакторной аутентификации, сгенерированный в мобильном приложении, или используйте один из Ваших кодов восстановления:' user: filtered_languages: Выбранные языки будут убраны из Ваших публичных лет. labels: + account: + fields: + name: Пункт + value: Значение defaults: avatar: Аватар confirm_new_password: Повторите новый пароль @@ -35,6 +40,7 @@ ru: display_name: Показываемое имя email: Адрес e-mail expires_in: Срок действия + fields: Метаданные профиля filtered_languages: Фильтруемые языки header: Заголовок locale: Язык diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 134e62ee3..9abbeb0e8 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -4,6 +4,7 @@ sk: hints: defaults: avatar: PNG, GIF alebo JPG. Maximálne 2MB. Bude zmenšený na 400x400px + bot: Varuje užívateľov, že daný účet nerepreyentuje ozajstného človeka digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak ste obdŕžali nejaké osobné správy kým ste boli preč display_name: one: Ostáva ti <span class="name-counter">1</span> znak @@ -14,12 +15,12 @@ sk: note: one: Ostáva vám <span class="note-counter">1</span> znak other: Ostáva ti <span class="note-counter">%{count}</span> znakov - setting_noindex: Ovplyvňuje profil a správy tak, že ich nebude možné nájsť vyhľadávaním - setting_theme: Toto ovplyvní ako bude Mastodon vyzerať pri prihlásení z hociktorého zariadenia. + setting_noindex: Ovplyvňuje verejný profil a statusy + setting_theme: Toto ovplyvňuje ako Mastodon vyzerá pri prihlásení z hociakého zariadenia. imports: data: CSV súbor vyexportovaný z inej Mastodon inštancie sessions: - otp: Napíš sem dvoj-faktorový kód z telefónu, alebo použite jeden z vašich obnovovacích kódov. + otp: 'Napíš sem dvoj-faktorový kód z telefónu, alebo použi jeden z tvojích obnovovacích kódov:' user: filtered_languages: Zaškrtnuté jazyky budú pre teba vynechané nebudú z verejnej časovej osi labels: @@ -29,6 +30,7 @@ sk: value: Obsah defaults: avatar: Avatar + bot: Toto je automatizovaný bot účet confirm_new_password: Znovu tvoje nové heslo, pre potvrdenie confirm_password: Potvrď heslo current_password: Súčasné heslo @@ -55,11 +57,11 @@ sk: setting_noindex: Nezaraďuj príspevky do indexu pre vyhľadávče setting_reduce_motion: Redukovať pohyb v animáciách setting_system_font_ui: Použiť základné systémové písmo - setting_theme: Vzhľad + setting_theme: Vzhľad stránky setting_unfollow_modal: Zobrazovať potvrdzovacie okno pred skončením sledovania iného používateľa severity: Závažnosť type: Typ importu - username: Užívateľské meno + username: Užívateľská prezývka username_or_email: Prezívka, alebo Email interactions: must_be_follower: Blokovať notifikácie pod používateľov, ktorí ťa nesledujú diff --git a/config/locales/sk.yml b/config/locales/sk.yml index c8bad4d95..74974d42e 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -53,7 +53,7 @@ sk: unfollow: Prestať sledovať admin: account_moderation_notes: - create: Vytvoriť + create: Zanechaj poznámku created_msg: Poznámka moderátora bola úspešne vytvorená! delete: Zmazať destroyed_msg: Poznámka moderátora bola úspešne zmazaná! @@ -173,6 +173,7 @@ sk: resolve_report: "%{name} vyriešili nahlásenie užívateľa %{target}" silence_account: "%{name} utíšil/a účet %{target}" suspend_account: "%{name} zablokoval/a účet používateľa %{target}" + unassigned_report: "%{name} odobral/a report od %{target}" unsilence_account: "%{name} zrušil/a utíšenie účtu používateľa %{target}" unsuspend_account: "%{name} zrušil/a blokovanie účtu používateľa %{target}" update_custom_emoji: "%{name} aktualizoval/a emoji %{target}" @@ -372,6 +373,7 @@ sk: admin_mailer: new_report: body: "%{reporter} nahlásil %{target}" + body_remote: Niekto z %{domain} nahlásil %{target} subject: Nový report pre %{instance} (#%{id}) application_mailer: notification_preferences: Zmeniť e-mailové voľby @@ -460,7 +462,7 @@ sk: archive_takeout: date: Dátum download: Stiahni si svoj archív - hint_html: Môžeš si opýtať <strong>archív svojích príspevkov a nahratých médií</strong>. Exportované dáta budú v ActivityPub formáte, čítateľné hociakým kompatibilným softvérom. + hint_html: Môžeš si opýtať <strong>archív svojích príspevkov a nahratých médií</strong>. Exportované dáta budú v ActivityPub formáte, čítateľné hociakým kompatibilným softvérom. Archív si je možné vyžiadať každých sedem dní. in_progress: Balím tvoj archív... request: Vyžiadaj si tvoj archív size: Veľkosť diff --git a/config/locales/sl.yml b/config/locales/sl.yml new file mode 100644 index 000000000..9e84dfcb9 --- /dev/null +++ b/config/locales/sl.yml @@ -0,0 +1,47 @@ +--- +sl: + about: + about_mastodon_html: Mastodon je socialno omrežje, ki temelji na odprtih spletnih protokolih in prosti ter odprtokodni programski opremi. Je decentraliziran, kot e-pošta. + administered_by: 'Upravlja:' + closed_registrations: Registracije so trenutno zaprte na tem vozlišču. Vendar! Tukaj lahko najdete druga vozlišča, na katerih se prijavite in dostopate do istega omrežja od tam. + contact: Kontakt + contact_missing: Ni nastavljeno + contact_unavailable: Ni na voljo + description_headline: Kaj je %{domain}? + domain_count_after: ostala vozlišča + domain_count_before: Povezan z + extended_description_html: | + <h3>Dober prostor za pravila</h3> + <p>Razširjen opis še ni bil nastavljen.</p> + features: + humane_approach_title: Bolj human pristop + not_a_product_title: Ti si oseba, ne izdelek + real_conversation_title: Zgrajen za pravi pogovor + learn_more: Spoznaj več + other_instances: Seznam vozlišč + source_code: Izvorna koda + status_count_after: statusi + status_count_before: Kdo je avtor + user_count_after: uporabniki + user_count_before: Dom za + what_is_mastodon: Kaj je Mastodon? + accounts: + follow: Sledi + followers: Sledilci + media: Medij + moved_html: "%{name} se je prestavil na %{new_profile_link}:" + nothing_here: Nič ni tukaj! + people_followed_by: Ljudje, ki jim sledi %{name} + people_who_follow: Ljudje, ki sledijo %{name} + remote_follow: Oddaljeno sledenje + reserved_username: Uporabniško ime je zasedeno + roles: + admin: Skrbnik + admin: + account_moderation_notes: + create: Pusti sporočilo + delete: Izbriši + accounts: + are_you_sure: Ali si prepričan? + avatar: Avatar + by_domain: Domena diff --git a/config/routes.rb b/config/routes.rb index 0554ae601..86aaea9ab 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -324,6 +324,10 @@ Rails.application.routes.draw do resources :lists, only: [:index, :create, :show, :update, :destroy] do resource :accounts, only: [:show, :create, :destroy], controller: 'lists/accounts' end + + namespace :push do + resource :subscription, only: [:create, :update, :destroy] + end end namespace :web do diff --git a/db/migrate/20180510214435_add_access_token_id_to_web_push_subscriptions.rb b/db/migrate/20180510214435_add_access_token_id_to_web_push_subscriptions.rb new file mode 100644 index 000000000..94ef8e0f5 --- /dev/null +++ b/db/migrate/20180510214435_add_access_token_id_to_web_push_subscriptions.rb @@ -0,0 +1,6 @@ +class AddAccessTokenIdToWebPushSubscriptions < ActiveRecord::Migration[5.2] + def change + add_reference :web_push_subscriptions, :access_token, null: true, default: nil, foreign_key: { on_delete: :cascade, to_table: :oauth_access_tokens }, index: false + add_reference :web_push_subscriptions, :user, null: true, default: nil, foreign_key: { on_delete: :cascade }, index: false + end +end diff --git a/db/migrate/20180510230049_migrate_web_push_subscriptions.rb b/db/migrate/20180510230049_migrate_web_push_subscriptions.rb new file mode 100644 index 000000000..6de1bed79 --- /dev/null +++ b/db/migrate/20180510230049_migrate_web_push_subscriptions.rb @@ -0,0 +1,13 @@ +class MigrateWebPushSubscriptions < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def up + add_index :web_push_subscriptions, :user_id, algorithm: :concurrently + add_index :web_push_subscriptions, :access_token_id, algorithm: :concurrently + end + + def down + remove_index :web_push_subscriptions, :user_id + remove_index :web_push_subscriptions, :access_token_id + end +end diff --git a/db/schema.rb b/db/schema.rb index b7a807427..2b3dab0d2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_05_06_221944) do +ActiveRecord::Schema.define(version: 2018_05_10_230049) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -560,6 +560,10 @@ ActiveRecord::Schema.define(version: 2018_05_06_221944) do t.json "data" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "access_token_id" + t.bigint "user_id" + t.index ["access_token_id"], name: "index_web_push_subscriptions_on_access_token_id" + t.index ["user_id"], name: "index_web_push_subscriptions_on_user_id" end create_table "web_settings", force: :cascade do |t| @@ -629,5 +633,7 @@ ActiveRecord::Schema.define(version: 2018_05_06_221944) do add_foreign_key "subscriptions", "accounts", name: "fk_9847d1cbb5", on_delete: :cascade add_foreign_key "users", "accounts", name: "fk_50500f500d", on_delete: :cascade add_foreign_key "users", "invites", on_delete: :nullify + add_foreign_key "web_push_subscriptions", "oauth_access_tokens", column: "access_token_id", on_delete: :cascade + add_foreign_key "web_push_subscriptions", "users", on_delete: :cascade add_foreign_key "web_settings", "users", name: "fk_11910667b2", on_delete: :cascade end diff --git a/spec/controllers/api/v1/push/subscriptions_controller_spec.rb b/spec/controllers/api/v1/push/subscriptions_controller_spec.rb new file mode 100644 index 000000000..01146294f --- /dev/null +++ b/spec/controllers/api/v1/push/subscriptions_controller_spec.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Api::V1::Push::SubscriptionsController do + render_views + + let(:user) { Fabricate(:user) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'push') } + + before do + allow(controller).to receive(:doorkeeper_token) { token } + end + + let(:create_payload) do + { + subscription: { + endpoint: 'https://fcm.googleapis.com/fcm/send/fiuH06a27qE:APA91bHnSiGcLwdaxdyqVXNDR9w1NlztsHb6lyt5WDKOC_Z_Q8BlFxQoR8tWFSXUIDdkyw0EdvxTu63iqamSaqVSevW5LfoFwojws8XYDXv_NRRLH6vo2CdgiN4jgHv5VLt2A8ah6lUX', + keys: { + p256dh: 'BEm_a0bdPDhf0SOsrnB2-ategf1hHoCnpXgQsFj5JCkcoMrMt2WHoPfEYOYPzOIs9mZE8ZUaD7VA5vouy0kEkr8=', + auth: 'eH_C8rq2raXqlcBVDa1gLg==', + }, + } + }.with_indifferent_access + end + + let(:alerts_payload) do + { + data: { + alerts: { + follow: true, + favourite: false, + reblog: true, + mention: false, + } + } + }.with_indifferent_access + end + + describe 'POST #create' do + it 'saves push subscriptions' do + post :create, params: create_payload + + push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) + + expect(push_subscription.endpoint).to eq(create_payload[:subscription][:endpoint]) + expect(push_subscription.key_p256dh).to eq(create_payload[:subscription][:keys][:p256dh]) + expect(push_subscription.key_auth).to eq(create_payload[:subscription][:keys][:auth]) + expect(push_subscription.user_id).to eq user.id + expect(push_subscription.access_token_id).to eq token.id + end + + it 'replaces old subscription on repeat calls' do + post :create, params: create_payload + post :create, params: create_payload + + expect(Web::PushSubscription.where(endpoint: create_payload[:subscription][:endpoint]).count).to eq 1 + end + end + + describe 'PUT #update' do + it 'changes alert settings' do + post :create, params: create_payload + put :update, params: alerts_payload + + push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) + + expect(push_subscription.data.dig('alerts', 'follow')).to eq(alerts_payload[:data][:alerts][:follow].to_s) + expect(push_subscription.data.dig('alerts', 'favourite')).to eq(alerts_payload[:data][:alerts][:favourite].to_s) + expect(push_subscription.data.dig('alerts', 'reblog')).to eq(alerts_payload[:data][:alerts][:reblog].to_s) + expect(push_subscription.data.dig('alerts', 'mention')).to eq(alerts_payload[:data][:alerts][:mention].to_s) + end + end + + describe 'DELETE #destroy' do + it 'removes the subscription' do + post :create, params: create_payload + delete :destroy + + expect(Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint])).to be_nil + end + end +end diff --git a/spec/controllers/api/web/push_subscriptions_controller_spec.rb b/spec/controllers/api/web/push_subscriptions_controller_spec.rb index bbf94c5c6..381cdeab9 100644 --- a/spec/controllers/api/web/push_subscriptions_controller_spec.rb +++ b/spec/controllers/api/web/push_subscriptions_controller_spec.rb @@ -59,10 +59,10 @@ describe Api::Web::PushSubscriptionsController do push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) - expect(push_subscription.data['follow']).to eq(alerts_payload[:data][:follow]) - expect(push_subscription.data['favourite']).to eq(alerts_payload[:data][:favourite]) - expect(push_subscription.data['reblog']).to eq(alerts_payload[:data][:reblog]) - expect(push_subscription.data['mention']).to eq(alerts_payload[:data][:mention]) + expect(push_subscription.data['alerts']['follow']).to eq(alerts_payload[:data][:alerts][:follow].to_s) + expect(push_subscription.data['alerts']['favourite']).to eq(alerts_payload[:data][:alerts][:favourite].to_s) + expect(push_subscription.data['alerts']['reblog']).to eq(alerts_payload[:data][:alerts][:reblog].to_s) + expect(push_subscription.data['alerts']['mention']).to eq(alerts_payload[:data][:alerts][:mention].to_s) end end end @@ -81,10 +81,10 @@ describe Api::Web::PushSubscriptionsController do push_subscription = Web::PushSubscription.find_by(endpoint: create_payload[:subscription][:endpoint]) - expect(push_subscription.data['follow']).to eq(alerts_payload[:data][:follow]) - expect(push_subscription.data['favourite']).to eq(alerts_payload[:data][:favourite]) - expect(push_subscription.data['reblog']).to eq(alerts_payload[:data][:reblog]) - expect(push_subscription.data['mention']).to eq(alerts_payload[:data][:mention]) + expect(push_subscription.data['alerts']['follow']).to eq(alerts_payload[:data][:alerts][:follow].to_s) + expect(push_subscription.data['alerts']['favourite']).to eq(alerts_payload[:data][:alerts][:favourite].to_s) + expect(push_subscription.data['alerts']['reblog']).to eq(alerts_payload[:data][:alerts][:reblog].to_s) + expect(push_subscription.data['alerts']['mention']).to eq(alerts_payload[:data][:alerts][:mention].to_s) end end end diff --git a/spec/controllers/invites_controller_spec.rb b/spec/controllers/invites_controller_spec.rb new file mode 100644 index 000000000..c5c6cb651 --- /dev/null +++ b/spec/controllers/invites_controller_spec.rb @@ -0,0 +1,67 @@ +require 'rails_helper' + +describe InvitesController do + render_views + + before do + sign_in user + end + + describe 'GET #index' do + subject { get :index } + + let!(:invite) { Fabricate(:invite, user: user) } + + context 'when user is a staff' do + let(:user) { Fabricate(:user, moderator: true, admin: false) } + + it 'renders index page' do + expect(subject).to render_template :index + expect(assigns(:invites)).to include invite + expect(assigns(:invites).count).to eq 1 + end + end + + context 'when user is not a staff' do + let(:user) { Fabricate(:user, moderator: false, admin: false) } + + it 'returns 403' do + expect(subject).to have_http_status 403 + end + end + end + + describe 'POST #create' do + subject { post :create, params: { invite: { max_uses: '10', expires_in: 1800 } } } + + context 'when user is an admin' do + let(:user) { Fabricate(:user, moderator: false, admin: true) } + + it 'succeeds to create a invite' do + expect{ subject }.to change { Invite.count }.by(1) + expect(subject).to redirect_to invites_path + expect(Invite.last).to have_attributes(user_id: user.id, max_uses: 10) + end + end + + context 'when user is not an admin' do + let(:user) { Fabricate(:user, moderator: true, admin: false) } + + it 'returns 403' do + expect(subject).to have_http_status 403 + end + end + end + + describe 'DELETE #create' do + subject { delete :destroy, params: { id: invite.id } } + + let!(:invite) { Fabricate(:invite, user: user, expires_at: nil) } + let(:user) { Fabricate(:user, moderator: false, admin: true) } + + it 'expires invite' do + expect(subject).to redirect_to invites_path + expect(invite.reload).to be_expired + end + end +end diff --git a/spec/models/web/push_subscription_spec.rb b/spec/models/web/push_subscription_spec.rb index 574da55ac..c6665611c 100644 --- a/spec/models/web/push_subscription_spec.rb +++ b/spec/models/web/push_subscription_spec.rb @@ -2,20 +2,8 @@ require 'rails_helper' RSpec.describe Web::PushSubscription, type: :model do let(:alerts) { { mention: true, reblog: false, follow: true, follow_request: false, favourite: true } } - let(:payload_no_alerts) { Web::PushSubscription.new(id: 1, endpoint: 'a', key_p256dh: 'c', key_auth: 'd').as_payload } - let(:payload_alerts) { Web::PushSubscription.new(id: 1, endpoint: 'a', key_p256dh: 'c', key_auth: 'd', data: { alerts: alerts }).as_payload } let(:push_subscription) { Web::PushSubscription.new(data: { alerts: alerts }) } - describe '#as_payload' do - it 'only returns id and endpoint' do - expect(payload_no_alerts.keys).to eq [:id, :endpoint] - end - - it 'returns alerts if set' do - expect(payload_alerts.keys).to eq [:id, :endpoint, :alerts] - end - end - describe '#pushable?' do it 'obeys alert settings' do expect(push_subscription.send(:pushable?, Notification.new(activity_type: 'Mention'))).to eq true |