diff --git a/app/controllers/api/web/base_controller.rb b/app/controllers/api/web/base_controller.rb new file mode 100644 index 000000000..8da549b3a --- /dev/null +++ b/app/controllers/api/web/base_controller.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class Api::Web::BaseController < Api::BaseController + protect_from_forgery with: :exception + + rescue_from ActionController::InvalidAuthenticityToken do + render json: { error: "Can't verify CSRF token authenticity." }, status: 422 + end +end diff --git a/app/controllers/api/web/embeds_controller.rb b/app/controllers/api/web/embeds_controller.rb index 2ed516161..f2fe74b17 100644 --- a/app/controllers/api/web/embeds_controller.rb +++ b/app/controllers/api/web/embeds_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Api::Web::EmbedsController < Api::BaseController +class Api::Web::EmbedsController < Api::Web::BaseController respond_to :json before_action :require_user! diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb index c611031ab..249e7c186 100644 --- a/app/controllers/api/web/push_subscriptions_controller.rb +++ b/app/controllers/api/web/push_subscriptions_controller.rb @@ -1,10 +1,9 @@ # frozen_string_literal: true -class Api::Web::PushSubscriptionsController < Api::BaseController +class Api::Web::PushSubscriptionsController < Api::Web::BaseController respond_to :json before_action :require_user! - protect_from_forgery with: :exception def create active_session = current_session diff --git a/app/controllers/api/web/settings_controller.rb b/app/controllers/api/web/settings_controller.rb index f6739d506..e3178bf48 100644 --- a/app/controllers/api/web/settings_controller.rb +++ b/app/controllers/api/web/settings_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Api::Web::SettingsController < Api::BaseController +class Api::Web::SettingsController < Api::Web::BaseController respond_to :json before_action :require_user! diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index a8ec0dcc9..6e331dd2d 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -2,7 +2,9 @@ class HomeController < ApplicationController before_action :authenticate_user! + before_action :set_pack + before_action :set_referrer_policy_header before_action :set_initial_state_json def index @@ -67,4 +69,8 @@ class HomeController < ApplicationController about_path end end + + def set_referrer_policy_header + response.headers['Referrer-Policy'] = 'origin' + end end diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 17fbaa62c..3237a15b9 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -13,6 +13,7 @@ class StatusesController < ApplicationController before_action :set_link_headers before_action :check_account_suspension before_action :redirect_to_original, only: [:show] + before_action :set_referrer_policy_header, only: [:show] before_action :set_cache_headers def show @@ -83,4 +84,9 @@ class StatusesController < ApplicationController def redirect_to_original redirect_to ::TagManager.instance.url_for(@status.reblog) if @status.reblog? end + + def set_referrer_policy_header + return if @status.public_visibility? || @status.unlisted_visibility? + response.headers['Referrer-Policy'] = 'origin' + end end diff --git a/app/controllers/stream_entries_controller.rb b/app/controllers/stream_entries_controller.rb index e2ea45c83..44e9c0bb8 100644 --- a/app/controllers/stream_entries_controller.rb +++ b/app/controllers/stream_entries_controller.rb @@ -16,8 +16,7 @@ class StreamEntriesController < ApplicationController respond_to do |format| format.html do use_pack 'public' - @ancestors = @stream_entry.activity.reply? ? cache_collection(@stream_entry.activity.ancestors(current_account), Status) : [] - @descendants = cache_collection(@stream_entry.activity.descendants(current_account), Status) + redirect_to short_account_status_url(params[:account_username], @stream_entry.activity) if @type == 'status' end format.atom do diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 59aa6f98d..eee9c6928 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -145,6 +145,8 @@ export function submitCompose() { if (response.data.in_reply_to_id === null && response.data.visibility === 'public') { insertIfOnline('community'); insertIfOnline('public'); + } else if (response.data.visibility === 'direct') { + insertIfOnline('direct'); } }).catch(function (error) { dispatch(submitComposeFail(error)); @@ -446,11 +448,12 @@ export function changeComposeVisibility(value) { }; }; -export function insertEmojiCompose(position, emoji) { +export function insertEmojiCompose(position, emoji, needsSpace) { return { type: COMPOSE_EMOJI_INSERT, position, emoji, + needsSpace, }; }; diff --git a/app/javascript/mastodon/actions/push_notifications/registerer.js b/app/javascript/mastodon/actions/push_notifications/registerer.js index f17d929a6..60b215f02 100644 --- a/app/javascript/mastodon/actions/push_notifications/registerer.js +++ b/app/javascript/mastodon/actions/push_notifications/registerer.js @@ -36,7 +36,7 @@ const subscribe = (registration) => const unsubscribe = ({ registration, subscription }) => subscription ? subscription.unsubscribe().then(() => registration) : registration; -const sendSubscriptionToBackend = (getState, subscription) => { +const sendSubscriptionToBackend = (subscription) => { const params = { subscription }; if (me) { @@ -46,7 +46,7 @@ const sendSubscriptionToBackend = (getState, subscription) => { } } - return api(getState).post('/api/web/push_subscriptions', params).then(response => response.data); + return api().post('/api/web/push_subscriptions', params).then(response => response.data); }; // Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload @@ -85,13 +85,13 @@ export function register () { } else { // Something went wrong, try to subscribe again return unsubscribe({ registration, subscription }).then(subscribe).then( - subscription => sendSubscriptionToBackend(getState, subscription)); + subscription => sendSubscriptionToBackend(subscription)); } } // No subscription, try to subscribe return subscribe(registration).then( - subscription => sendSubscriptionToBackend(getState, subscription)); + subscription => sendSubscriptionToBackend(subscription)); }) .then(subscription => { // If we got a PushSubscription (and not a subscription object from the backend) @@ -134,7 +134,7 @@ export function saveSettings() { const alerts = state.get('alerts'); const data = { alerts }; - api(getState).put(`/api/web/push_subscriptions/${subscription.get('id')}`, { + api().put(`/api/web/push_subscriptions/${subscription.get('id')}`, { data, }).then(() => { if (me) { diff --git a/app/javascript/mastodon/actions/settings.js b/app/javascript/mastodon/actions/settings.js index 5634a11ef..6bf85e464 100644 --- a/app/javascript/mastodon/actions/settings.js +++ b/app/javascript/mastodon/actions/settings.js @@ -24,7 +24,7 @@ const debouncedSave = debounce((dispatch, getState) => { const data = getState().get('settings').filter((_, path) => path !== 'saved').toJS(); - api(getState).put('/api/web/settings', { data }) + api().put('/api/web/settings', { data }) .then(() => dispatch({ type: SETTING_SAVE })) .catch(error => dispatch(showAlertForError(error))); }, 5000, { trailing: true }); diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js index f76510cdb..14215ab6d 100644 --- a/app/javascript/mastodon/actions/streaming.js +++ b/app/javascript/mastodon/actions/streaming.js @@ -46,4 +46,5 @@ export const connectCommunityStream = () => connectTimelineStream('community', ' export const connectMediaStream = () => connectTimelineStream('community', 'public:local'); export const connectPublicStream = () => connectTimelineStream('public', 'public'); export const connectHashtagStream = (tag) => connectTimelineStream(`hashtag:${tag}`, `hashtag&tag=${tag}`); +export const connectDirectStream = () => connectTimelineStream('direct', 'direct'); export const connectListStream = (id) => connectTimelineStream(`list:${id}`, `list&list=${id}`); diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index 5be07126d..eca847ee7 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -87,6 +87,7 @@ export function expandTimeline(timelineId, path, params = {}) { export const expandHomeTimeline = ({ maxId } = {}) => expandTimeline('home', '/api/v1/timelines/home', { max_id: maxId }); export const expandPublicTimeline = ({ maxId } = {}) => expandTimeline('public', '/api/v1/timelines/public', { max_id: maxId }); export const expandCommunityTimeline = ({ maxId } = {}) => expandTimeline('community', '/api/v1/timelines/public', { local: true, max_id: maxId }); +export const expandDirectTimeline = ({ maxId } = {}) => expandTimeline('direct', '/api/v1/timelines/direct', { max_id: maxId }); export const expandAccountTimeline = (accountId, { maxId, withReplies } = {}) => expandTimeline(`account:${accountId}${withReplies ? ':with_replies' : ''}`, `/api/v1/accounts/${accountId}/statuses`, { exclude_replies: !withReplies, max_id: maxId }); export const expandAccountFeaturedTimeline = accountId => expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true }); export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true }); diff --git a/app/javascript/mastodon/compare_id.js b/app/javascript/mastodon/compare_id.js new file mode 100644 index 000000000..aaff66481 --- /dev/null +++ b/app/javascript/mastodon/compare_id.js @@ -0,0 +1,10 @@ +export default function compareId(id1, id2) { + if (id1 === id2) { + return 0; + } + if (id1.length === id2.length) { + return id1 > id2 ? 1 : -1; + } else { + return id1.length > id2.length ? 1 : -1; + } +} diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index ee07106f7..fd6858d05 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -34,7 +34,7 @@ export default class ScrollableList extends PureComponent { }; state = { - lastMouseMove: null, + fullscreen: null, }; intersectionObserverWrapper = new IntersectionObserverWrapper(); @@ -43,7 +43,6 @@ export default class ScrollableList extends PureComponent { if (this.node) { const { scrollTop, scrollHeight, clientHeight } = this.node; const offset = scrollHeight - scrollTop - clientHeight; - this._oldScrollPosition = scrollHeight - scrollTop; if (400 > offset && this.props.onLoadMore && !this.props.isLoading) { this.props.onLoadMore(); @@ -59,14 +58,6 @@ export default class ScrollableList extends PureComponent { trailing: true, }); - handleMouseMove = throttle(() => { - this._lastMouseMove = new Date(); - }, 300); - - handleMouseLeave = () => { - this._lastMouseMove = null; - } - componentDidMount () { this.attachScrollListener(); this.attachIntersectionObserver(); @@ -76,21 +67,26 @@ export default class ScrollableList extends PureComponent { this.handleScroll(); } - componentDidUpdate (prevProps) { + getSnapshotBeforeUpdate (prevProps) { const someItemInserted = React.Children.count(prevProps.children) > 0 && React.Children.count(prevProps.children) < React.Children.count(this.props.children) && this.getFirstChildKey(prevProps) !== this.getFirstChildKey(this.props); + if (someItemInserted && this.node.scrollTop > 0) { + return this.node.scrollHeight - this.node.scrollTop; + } else { + return null; + } + } + componentDidUpdate (prevProps, prevState, snapshot) { // Reset the scroll position when a new child comes in in order not to // jerk the scrollbar around if you're already scrolled down the page. - if (someItemInserted && this._oldScrollPosition && this.node.scrollTop > 0) { - const newScrollTop = this.node.scrollHeight - this._oldScrollPosition; + if (snapshot !== null) { + const newScrollTop = this.node.scrollHeight - snapshot; if (this.node.scrollTop !== newScrollTop) { this.node.scrollTop = newScrollTop; } - } else { - this._oldScrollPosition = this.node.scrollHeight - this.node.scrollTop; } } @@ -143,10 +139,6 @@ export default class ScrollableList extends PureComponent { this.props.onLoadMore(); } - _recentlyMoved () { - return this._lastMouseMove !== null && ((new Date()) - this._lastMouseMove < 600); - } - render () { const { children, scrollKey, trackScroll, shouldUpdateScroll, isLoading, hasMore, prepend, emptyMessage, onLoadMore } = this.props; const { fullscreen } = this.state; @@ -157,7 +149,7 @@ export default class ScrollableList extends PureComponent { if (isLoading || childrenCount > 0 || !emptyMessage) { scrollableArea = ( -
Pidennettyä kuvausta ei ole vielä asetettu.
+Pidempää kuvausta ei ole vielä laadittu.
features: - humane_approach_body: Muiden verkostojen virheistä oppien, Mastodon pyrkii tekemään eettisiä valintoja suunnittelussa taistellakseen sosiaalisen median väärinkäyttöä vastaan. - humane_approach_title: Humaanimpi lähestymistapa - not_a_product_body: Mastodon ei ole kaupallinen verkosto. Ei mainoksia, ei tiedonlouhintaa, ei suljettuja sisäpiirejä. Mastodonissa ei ole keskitettyä auktoriteettiä. + humane_approach_body: Mastodonissa otetaan oppia muiden verkostojen virheistä, ja sen suunnittelussa pyritään toimimaan eettisesti ja ehkäisemään sosiaalisen median väärinkäyttöä. + humane_approach_title: Ihmisläheisempi ote + not_a_product_body: Mastodon ei ole kaupallinen verkosto. Ei mainoksia, ei tiedonlouhintaa, ei suljettuja protokollia. Mastodonissa ei ole keskusjohtoa. not_a_product_title: Olet henkilö, et tuote - real_conversation_title: Rakennettu oikealle keskustelulle - within_reach_body: Kehittäjäystävällisen rajapintaekosysteemin ansiosta useita appeja Androidille, iOS:lle ja muille alustoille, jotka mahdollistavat yhteydenpidon ystäviesi kanssa missä vain. + real_conversation_body: 'Voit ilmaista itseäsi niin kuin itse haluat: tilaa on 500 merkkiä, ja sisältövaroituksia voi tehdä monin tavoin.' + real_conversation_title: Tehty oikeaa keskustelua varten + within_reach_body: Rajapintoja on tarjolla moniin eri kehitysympäristöihin, minkä ansiosta iOS:lle, Androidille ja muille alustoille on saatavana useita eri sovelluksia. Näin voit pitää yhteyttä ystäviisi missä vain. within_reach_title: Aina lähellä + generic_description: "%{domain} on yksi verkostoon kuuluvista palvelimista" + hosted_on: Mastodon palvelimella %{domain} learn_more: Lisätietoja other_instances: Muut palvelimet source_code: Lähdekoodi status_count_after: statusta - status_count_before: Ovat luoneet + status_count_before: He ovat luoneet user_count_after: käyttäjälle user_count_before: Koti what_is_mastodon: Mikä on Mastodon? @@ -33,161 +37,681 @@ fi: follow: Seuraa followers: Seuraajat following: Seuratut + media: Media + moved_html: "%{name} on muuttanut osoitteeseen %{new_profile_link}:" nothing_here: Täällä ei ole mitään! - people_followed_by: Henkilöitä joita %{name} seuraa - people_who_follow: Henkilöt jotka seuraa %{name} - posts: Postaukset + people_followed_by: Henkilöt, joita %{name} seuraa + people_who_follow: Käyttäjän %{name} seuraajat + posts: Tuuttaukset + posts_with_replies: Tuuttaukset ja vastaukset remote_follow: Etäseuranta reserved_username: Käyttäjänimi on varattu roles: admin: Ylläpitäjä + moderator: Moderaattori unfollow: Lopeta seuraaminen admin: account_moderation_notes: account: Moderaattori create: Luo created_at: Päiväys - created_msg: Moderointimerkintä luotu onnistuneesti! + created_msg: Moderointimerkinnän luonti onnistui! delete: Poista - destroyed_msg: Moderointimerkintä tuhottu onnistuneesti! + destroyed_msg: Moderointimerkinnän poisto onnistui! accounts: are_you_sure: Oletko varma? - confirm: Hyväksy - confirmed: Hyväksytty + by_domain: Verkko-osoite + confirm: Vahvista + confirmed: Vahvistettu + 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 edit: Muokkaa email: Sähköposti + enable: Ota käyttöön + enabled: Käytössä + feed_url: Syötteen URL followers: Seuraajat - followers_url: Seuraajat URL + followers_url: Seuraajien URL + follows: Seuraa + inbox_url: Saapuvan postilaatikon URL + ip: IP + location: + all: Kaikki + local: Paikalliset + remote: Etätilit + title: Sijainti + login_status: Sisäänkirjautumisen tila + media_attachments: Medialiitteet + memorialize: Muuta muistosivuksi + moderation: + all: Kaikki + silenced: Hiljennetty + suspended: Jäähyllä + title: Moderointi + moderation_notes: Moderointimerkinnät + most_recent_activity: Viimeisin toiminta + most_recent_ip: Viimeisin IP + not_subscribed: Ei tilaaja + order: + alphabetic: Aakkosjärjestys + most_recent: Uusin + title: Järjestys + outbox_url: Lähtevän postilaatikon URL + perform_full_suspension: Siirrä kokonaan jäähylle + profile_url: Profiilin URL + promote: Ylennä + protocol: Protokolla + public: Julkinen + push_subscription_expires: PuSH-tilaus vanhenee + redownload: Päivitä profiilikuva + reset: Palauta + reset_password: Palauta salasana + resubscribe: Tilaa uudelleen + role: Oikeudet + roles: + admin: Ylläpitäjä + moderator: Moderaattori + staff: Henkilöstö + user: Käyttäjä + salmon_url: Salmon-URL + search: Haku + shared_inbox_url: Jaetun saapuvan postilaatikon URL + show: + created_reports: Tilin luomat raportit + report: raportti + targeted_reports: Tästä tilistä tehdyt raportit + silence: Hiljennä + statuses: Tilat + subscribe: Tilaa + title: Tilit + undo_silenced: Peru hiljennys + undo_suspension: Peru jäähy + unsubscribe: Lopeta tilaus + username: Käyttäjänimi + web: Web + action_logs: + actions: + 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}" + create_email_domain_block: "%{name} lisäsi sähköpostiverkkotunnuksen %{target} estolistalle" + demote_user: "%{name} alensi käyttäjän %{target}" + destroy_domain_block: "%{name} poisti verkkotunnuksen %{target} eston" + destroy_email_domain_block: "%{name} lisäsi sähköpostiverkkotunnuksen %{target} sallittujen listalle" + destroy_status: "%{name} poisti käyttäjän %{target} tilan" + disable_2fa_user: "%{name} poisti käyttäjältä %{target} kaksivaiheisen todentamisen vaatimuksen" + disable_custom_emoji: "%{name} poisti emojin %{target} käytöstä" + disable_user: "%{name} poisti sisäänkirjautumisen käytöstä käyttäjältä %{target}" + enable_custom_emoji: "%{name} salli emojin %{target} käyttöön" + 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}" + 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}" + suspend_account: "%{name} siirsi käyttäjän %{target} jäähylle" + unsilence_account: "%{name} poisti käyttäjän %{target} hiljennyksen" + unsuspend_account: "%{name} perui käyttäjän %{target} jäähyn" + update_custom_emoji: "%{name} päivitti emojin %{target}" + update_status: "%{name} päivitti käyttäjän %{target} tilan" + title: Auditointiloki + custom_emojis: + by_domain: Verkkotunnus + copied_msg: Emojin paikallisen kopion luonti onnistui + copy: Kopioi + copy_failed_msg: Emojista ei voitu tehdä paikallista kopiota + created_msg: Emojin luonti onnistui! + delete: Poista + destroyed_msg: Emojon poisto onnistui! + disable: Poista käytöstä + disabled_msg: Emojin käytöstäpoisto onnistui + emoji: Emoji + enable: Ota käyttöön + enabled_msg: Emojin käyttöönotto onnistui + image_hint: PNG enintään 50 kt + listed: Listassa + new: + title: Lisää uusi mukautettu emoji + overwrite: Kirjoita yli + shortcode: Lyhennekoodi + shortcode_hint: Vähintään kaksi merkkiä, vain kirjaimia, numeroita ja alaviivoja + title: Mukautetut emojit + unlisted: Ei listassa + update_failed_msg: Emojin päivitys epäonnistui + updated_msg: Emojin päivitys onnistui! + upload: Lähetä + domain_blocks: + add_new: Lisää uusi + created_msg: Verkkotunnuksen estoa käsitellään + destroyed_msg: Verkkotunnuksen esto on peruttu + domain: Verkkotunnus + new: + create: Luo esto + hint: Verkkotunnuksen esto ei estä tilien luomista ja lisäämistä tietokantaan, mutta se soveltaa näihin tileihin automaattisesti määrättyjä moderointitoimia tilin luomisen jälkeen. + severity: + desc_html: "Hiljennys estää tilin julkaisuja näkymästä muille kuin tilin seuraajille. Jäähy poistaa tilin kaiken sisällön, median ja profiilitiedot. Jos haluat vain hylätä mediatiedostot, valitse Ei mitään." + noop: Ei mitään + silence: Hiljennys + suspend: Jäähy + title: Uusi verkkotunnuksen esto + reject_media: Hylkää mediatiedostot + reject_media_hint: Poistaa paikallisesti tallennetut mediatiedostot eikä lataa niitä enää jatkossa. Ei merkitystä jäähyn kohdalla + severities: + noop: Ei mitään + silence: Hiljennys + suspend: Jäähy + severity: Vakavuus + show: + affected_accounts: + one: Vaikuttaa yhteen tiliin tietokannassa + other: Vaikuttaa %{count} tiliin tietokannassa + retroactive: + silence: Peru kaikkien tässä verkkotunnuksessa jo olemassa olevien tilien hiljennys + suspend: Peru kaikkien tässä verkkotunnuksessa jo olemassa olevien tilien jäähy + title: Peru verkkotunnuksen %{domain} esto + undo: Peru + title: Verkkotunnusten estot + undo: Peru + email_domain_blocks: + add_new: Lisää uusi + created_msg: Sähköpostiverkkotunnuksen lisäys estolistalle onnistui + delete: Poista + destroyed_msg: Sähköpostiverkkotunnuksen poisto estolistalta onnistui + domain: Verkkotunnus + new: + create: Lisää verkkotunnus + title: Uusi sähköpostiestolistan merkintä + title: Sähköpostiestolista + instances: + account_count: Tiedossa olevat tilit + domain_name: Verkkotunnus + reset: Palauta + search: Hae + title: Tiedossa olevat instanssit + invites: + filter: + all: Kaikki + available: Saatavilla + expired: Vanhentunut + title: Suodata + title: Kutsut + reports: + action_taken_by: Toimenpiteen tekijä + are_you_sure: Oletko varma? + comment: + label: Kommentti + none: Ei mitään + delete: Poista + id: Tunniste + mark_as_resolved: Merkitse ratkaistuksi + nsfw: + 'false': Peru medialiitteiden piilotus + 'true': Piilota medialiitteet + report: Raportti nro %{id} + report_contents: Sisältö + reported_account: Raportoitu tili + reported_by: Raportoija + resolved: Ratkaistut + silence_account: Hiljennä tili + status: Tila + suspend_account: Siirrä tili jäähylle + target: Kohde + title: Raportit + unresolved: Ratkaisemattomat + view: Näytä + settings: + activity_api_enabled: + desc_html: Paikallisesti julkaistujen tilojen, aktiivisten käyttäjien ja uusien rekisteröintien määrät viikoittain + title: Julkaise koostetilastoja käyttäjien aktiivisuudesta + bootstrap_timeline_accounts: + desc_html: Erota käyttäjänimet pilkulla. Vain paikalliset ja lukitsemattomat tilit toimivat. Jos kenttä jätetään tyhjäksi, oletusarvona ovat kaikki paikalliset ylläpitäjät. + title: Uudet käyttäjät seuraavat oletuksena seuraavia tilejä + contact_information: + email: Työsähköposti + username: Yhteyshenkilön käyttäjänimi + hero: + desc_html: Näytetään etusivulla. Suosituskoko vähintään 600x100 pikseliä. Jos kuvaa ei aseteta, käytetään instanssin pikkukuvaa + title: Sankarin kuva + peers_api_enabled: + desc_html: Verkkotunnukset, jotka tämä instanssi on kohdannut fediversumissa + title: Julkaise löydettyjen instanssien luettelo + registrations: + closed_message: + desc_html: Näytetään etusivulla, kun rekisteröinti on suljettu. HTML-tagit käytössä + title: Viesti, kun rekisteröinti on suljettu + deletion: + desc_html: Salli jokaisen poistaa oma tilinsä + title: Avoin tilin poisto + min_invite_role: + disabled: Ei kukaan + title: Salli kutsut käyttäjältä + open: + desc_html: Salli kenen tahansa luoda tili + title: Avoin rekisteröinti + show_known_fediverse_at_about_page: + desc_html: Kun tämä on valittu, esikatselussa näytetään tuuttaukset kaikkialta tunnetusta fediversumista. Muutoin näytetään vain paikalliset tuuttaukset. + title: Näytä aikajanan esikatselussa koko tunnettu fediversumi + show_staff_badge: + desc_html: Näytä käyttäjäsivulla henkilöstömerkki + title: Näytä henkilöstömerkki + site_description: + desc_html: Esittelykappale etusivulla ja metatunnisteissa. HTML-tagit käytössä, tärkeimmät ovat<a>
ja <em>
.
+ title: Instanssin kuvaus
+ site_description_extended:
+ desc_html: Hyvä paikka käytösohjeille, säännöille, ohjeistuksille ja muille instanssin muista erottaville asioille. HTML-tagit käytössä
+ title: Omavalintaiset laajat tiedot
+ site_terms:
+ desc_html: Tähän voi kirjoittaa instanssin tietosuojakäytännöstä, käyttöehdoista ja sen sellaisista asioista. HTML-tagit käytössä
+ title: Omavalintaiset käyttöehdot
+ site_title: Instanssin nimi
+ thumbnail:
+ desc_html: Käytetään esikatseluissa OpenGraphin ja API:n kautta. Suosituskoko 1200x630 pikseliä
+ title: Instanssin pikkukuva
+ timeline_preview:
+ desc_html: Näytä julkinen aikajana aloitussivulla
+ title: Aikajanan esikatselu
+ title: Sivuston asetukset
+ statuses:
+ back_to_account: Takaisin tilin sivulle
+ batch:
+ delete: Poista
+ nsfw_off: NSFW POIS
+ nsfw_on: NSFW PÄÄLLÄ
+ execute: Suorita
+ failed_to_execute: Suoritus epäonnistui
+ media:
+ hide: Piilota media
+ show: Näytä media
+ title: Media
+ no_media: Ei mediaa
+ title: Tilin tilat
+ with_media: Sisältää mediaa
+ subscriptions:
+ callback_url: Paluu-URL
+ confirmed: Vahvistettu
+ expires_in: Vanhenee
+ last_delivery: Viimeisin toimitus
+ title: WebSub
+ topic: Aihe
+ title: Ylläpito
+ admin_mailer:
+ new_report:
+ body: "%{reporter} on raportoinut kohteen %{target}"
+ subject: Uusi raportti instanssista %{instance} (nro %{id})
application_mailer:
- settings: 'Muokkaa sähköpostiasetuksia: %{link}'
- view: 'Katso:'
+ notification_preferences: Muuta sähköpostiasetuksia
+ salutation: "%{name},"
+ settings: 'Muuta sähköpostiasetuksia: %{link}'
+ view: 'Näytä:'
+ view_profile: Näytä profiili
+ view_status: Näytä tila
applications:
- invalid_url: Annettu URL on väärä
+ created: Sovelluksen luonti onnistui
+ destroyed: Sovelluksen poisto onnistui
+ invalid_url: Annettu URL on virheellinen
+ regenerate_token: Luo pääsytunnus uudelleen
+ token_regenerated: Pääsytunnuksen uudelleenluonti onnistui
+ warning: Säilytä tietoa hyvin. Älä milloinkaan jaa sitä muille!
+ your_token: Pääsytunnus
auth:
- didnt_get_confirmation: Etkö saanut varmennusohjeita?
+ agreement_html: Rekisteröityessäsi sitoudut noudattamaan instanssin sääntöjä ja käyttöehtoja.
+ change_password: Salasana
+ confirm_email: Vahvista sähköpostiosoite
+ delete_account: Poista tili
+ delete_account_html: Jos haluat poistaa tilisi, paina tästä. Poisto on vahvistettava.
+ didnt_get_confirmation: Etkö saanut vahvistusohjeita?
forgot_password: Unohditko salasanasi?
+ invalid_reset_password_token: Salasananpalautustunnus on virheellinen tai vanhentunut. Pyydä uusi.
login: Kirjaudu sisään
logout: Kirjaudu ulos
+ migrate_account: Muuta toiseen tiliin
+ migrate_account_html: Jos haluat ohjata tämän tilin toiseen tiliin, voit asettaa toisen tilin tästä.
+ or: tai
+ or_log_in_with: Tai käytä kirjautumiseen
+ providers:
+ cas: CAS
+ saml: SAML
register: Rekisteröidy
- resend_confirmation: Lähetä varmennusohjeet uudestaan
+ register_elsewhere: Rekisteröidy toiselle palvelimelle
+ resend_confirmation: Lähetä vahvistusohjeet uudestaan
reset_password: Palauta salasana
security: Tunnukset
set_new_password: Aseta uusi salasana
authorize_follow:
- error: Valitettavasti tapahtui virhe etätilin haussa.
+ error: Valitettavasti etätilin haussa tapahtui virhe
follow: Seuraa
- title: Seuraa %{acct}
+ follow_request: 'Olet lähettänyt seuraamispyynnön käyttäjälle:'
+ following: 'Onnistui! Seuraat käyttäjää:'
+ post_follow:
+ close: Tai voit sulkea tämän ikkunan.
+ return: Palaa käyttäjän profiiliin
+ web: Siirry verkkosivulle
+ title: Seuraa käyttäjää %{acct}
datetime:
distance_in_words:
- about_x_hours: "%{count}t"
- about_x_months: "%{count}kk"
- about_x_years: "%{count}v"
- almost_x_years: "%{count}v"
- half_a_minute: Juuri nyt
- less_than_x_minutes: "%{count}m"
- less_than_x_seconds: Juuri nyt
- over_x_years: "%{count}v"
- x_days: "%{count}pv"
- x_minutes: "%{count}m"
- x_months: "%{count}kk"
- x_seconds: "%{count}s"
+ about_x_hours: "%{count} h"
+ about_x_months: "%{count} kk"
+ about_x_years: "%{count} v"
+ almost_x_years: "%{count} v"
+ half_a_minute: Nyt
+ less_than_x_minutes: "%{count} m"
+ less_than_x_seconds: Nyt
+ over_x_years: "%{count} v"
+ x_days: "%{count} pv"
+ x_minutes: "%{count} m"
+ x_months: "%{count} kk"
+ x_seconds: "%{count} s"
+ deletes:
+ bad_password_msg: Hyvä yritys, hakkerit! Väärä salasana
+ confirm_password: Tunnistaudu syöttämällä nykyinen salasanasi
+ description_html: Tämä poistaa pysyvästi ja peruuttamattomasti kaiken tilisi sisällön ja poistaa tilin käytöstä. Käyttäjänimesi pysyy varattuna, jotta identiteettiäsi ei myöhemmin varasteta.
+ proceed: Poista tili
+ success_msg: Tilin poisto onnistui
+ warning_html: Sisällön poistaminen taataan vain tämän instanssin osalta. Jos sisältöä on jaettu paljon, siitä todennäköisesti jää jälkiä. Palvelimet, joihin ei saada yhteyttä tai jotka ovat lopettaneet päivitystesi tilaamisen, eivät päivitä tietokantojaan.
+ warning_title: Sisällön saatavuustieto levitetty
+ errors:
+ '403': Sinulla ei ole lupaa nähdä tätä sivua.
+ '404': Etsimääsi sivua ei ole olemassa.
+ '410': Etsimääsi sivua ei ole enää olemassa.
+ '422':
+ content: Turvallisuusvahvistus epäonnistui. Oletko estänyt evästeet?
+ title: Turvallisuusvahvistus epäonnistui
+ '429': Rajoitettu
+ '500':
+ content: Valitettavasti jokin meni pieleen meidän päässämme.
+ title: Sivu ei ole oikein
+ noscript_html: Mastodon-selainsovelluksen käyttöön vaaditaan JavaScript. Voit vaihtoehtoisesti kokeilla jotakin omalle käyttöjärjestelmällesi tehtyä Mastodonsovellusta.
exports:
- blocks: Estosi
+ archive_takeout:
+ date: Päiväys
+ download: Lataa arkisto
+ hint_html: Voit pyytää arkistoa omista tuuttauksistasi ja mediastasi. Vientitiedot ovat ActivityPub-muodossa, ja ne voi lukea millä tahansa yhteensopivalla ohjelmalla.
+ in_progress: Arkistoa kootaan...
+ request: Pyydä arkisto
+ size: Koko
+ blocks: Estot
csv: CSV
follows: Seurattavat
- storage: Mediasi
+ mutes: Mykistetyt
+ storage: Media-arkisto
+ followers:
+ domain: Verkkotunnus
+ explanation_html: Jos haluat olla varma tilapäivitystesi yksityisyydestä, sinun täytyy tietää, ketkä seuraavat sinua. Yksityiset tilapäivityksesi lähetetään kaikkiin niihin instansseihin, joissa sinulla on seuraajia. Jos et luota siihen, että näiden instanssien ylläpitäjät tai ohjelmisto kunnioittavat yksityisyyttäsi, käy läpi seuraajaluettelosi ja poista tarvittaessa käyttäjiä.
+ followers_count: Seuraajien määrä
+ lock_link: Lukitse tili
+ purge: Poista seuraajista
+ success:
+ one: Estetään kevyesti seuraajia yhdestä verkkotunnuksesta...
+ other: Estetään kevyesti seuraajia %{count} verkkotunnuksesta...
+ true_privacy_html: Muista, että kunnollinen yksityisyys voidaan varmistaa vain päästä päähän -salauksella.
+ unlocked_warning_html: Kuka tahansa voi seurata sinua ja nähdä saman tien yksityiset tilapäivityksesi. %{lock_link}, niin voit tarkastaa ja torjua seuraajia.
+ unlocked_warning_title: Tiliäsi ei ole lukittu
generic:
- changes_saved_msg: Muutokset onnistuneesti tallennettu!
- powered_by: powered by %{link}
+ changes_saved_msg: Muutosten tallennus onnistui!
+ powered_by: voimanlähteenä %{link}
save_changes: Tallenna muutokset
validation_errors:
- one: Jokin ei ole viellä oikein! Katso virhe alapuolelta.
- other: Jokin ei ole viellä oikein! Katso %{count} virhettä alapuolelta.
+ one: Kaikki ei ole aivan oikein! Tarkasta alla oleva virhe
+ other: Kaikki ei ole aivan oikein! Tarkasta alla olevat %{count} virhettä
imports:
- preface: Voit tuoda tiettyä dataa kaikista ihmisistä joita seuraat tai estät tilillesi tälle palvelimelle tiedostoista, jotka on luotu toisella palvelimella.
- success: Datasi on onnistuneesti ladattu ja käsitellään pian
+ preface: Voit tuoda toisesta instanssista viemiäsi tietoja, kuten esimerkiksi seuraamiesi tai estämiesi henkilöiden listan.
+ success: Tietojen lähettäminen onnistui, ja ne käsitellään kohtapuoliin
types:
- blocking: Estetyt lista
- following: Seuratut lista
+ blocking: Estettyjen lista
+ following: Seurattujen lista
+ muting: Mykistettyjen lista
upload: Lähetä
- landing_strip_html: "%{name} on käyttäjä domainilla %{link_to_root_path}. Voit seurata tai vuorovaikuttaa heidän kanssaan jos sinulla on tili yleisessä verkossa."
- landing_strip_signup_html: Jos sinulla ei ole tiliä, voit rekisteröityä täällä.
+ in_memoriam_html: Muistoissamme.
+ invites:
+ delete: Poista käytöstä
+ expired: Vanhentunut
+ expires_in:
+ '1800': 30 minuuttia
+ '21600': 6 tuntia
+ '3600': 1 tunti
+ '43200': 12 tuntia
+ '86400': 1 vuorokausi
+ expires_in_prompt: Ei koskaan
+ generate: Luo
+ max_uses:
+ one: kertakäyttöinen
+ other: "%{count} käyttökertaa"
+ max_uses_prompt: Ei rajoitusta
+ prompt: Luo linkkejä ja jaa niiden avulla muille pääsyoikeus tähän instanssiin
+ table:
+ expires_at: Vanhenee
+ uses: Käytetty
+ title: Kutsu ihmisiä
+ landing_strip_html: "%{name} on käyttäjänä palvelimella %{link_to_root_path}. Voit seurata heitä tai pitää heihin yhteyttä, jos sinulla on tili missä tahansa fediversumin kolkassa."
+ landing_strip_signup_html: Jos sinulla ei ole tiliä, voit rekisteröityä tätä kautta.
+ lists:
+ errors:
+ limit: Sinulla on jo suurin sallittu määrä listoja
+ media_attachments:
+ validations:
+ images_and_video: Videota ei voi liittää tilapäivitykseen, jossa on jo kuvia
+ too_many: Tiedostoja voi liittää enintään 4
+ migrations:
+ acct: uuden tilin käyttäjätunnus@verkkotunnus
+ currently_redirecting: 'Profiiliisi on asetettu uudelleenohjaus:'
+ proceed: Tallenna
+ updated_msg: Tilinsiirtoasetusten päivitys onnistui!
+ moderation:
+ title: Moderointi
notification_mailer:
digest:
- body: 'Tässä on pieni yhteenveto palvelimelta %{instance} viimeksi kun olit paikalla %{since}:'
+ action: Näytä kaikki ilmoitukset
+ body: Tässä lyhyt yhteenveto viime käyntisi (%{since}) jälkeen tulleista viesteistä
mention: "%{name} mainitsi sinut:"
new_followers_summary:
- one: Olet myös saanut yhden uuden seuraajan poissaollessasi! Jee!
- other: Olet saanut %{count} uutta seuraajaa poissaollessasi! Loistavaa!
+ one: Olet myös saanut yhden uuden seuraajan! Juhuu!
+ other: Olet myös saanut %{count} uutta seuraajaa! Aivan mahtavaa!
subject:
- one: "1 uusi ilmoitus viimeisen käyntisi jälkeen \U0001F418"
- other: "%{count} uutta ilmoitusta viimeisen käyntisi jälkeen \U0001F418"
+ one: "1 uusi ilmoitus viime käyntisi jälkeen \U0001F418"
+ other: "%{count} uutta ilmoitusta viime käyntisi jälkeen \U0001F418"
+ title: Poissaollessasi…
favourite:
- body: 'Statuksestasi tykkäsi %{name}:'
- subject: "%{name} tykkäsi sinun statuksestasi"
+ body: "%{name} tykkäsi tilastasi:"
+ subject: "%{name} tykkäsi tilastasi"
+ title: Uusi tykkäys
follow:
body: "%{name} seuraa nyt sinua!"
subject: "%{name} seuraa nyt sinua"
+ title: Uusi seuraaja
follow_request:
- body: "%{name} on pyytänyt seurata sinua"
- subject: 'Odottava seuraus pyyntö: %{name}'
+ action: Hallinnoi seuraamispyyntöjä
+ body: "%{name} haluaa seurata sinua"
+ subject: 'Odottava seuraamispyyntö: %{name}'
+ title: Uusi seuraamispyyntö
mention:
- body: 'Sinut mainitsi %{name} postauksessa:'
- subject: Sinut mainitsi %{name}
+ action: Vastaa
+ body: "%{name} mainitsi sinut:"
+ subject: "%{name} mainitsi sinut"
+ title: Uusi maininta
reblog:
- body: 'Sinun statustasi boostasi %{name}:'
- subject: "%{name} boostasi statustasi"
+ body: "%{name} buustasi tilaasi:"
+ subject: "%{name} boostasi tilaasi"
+ title: Uusi buustaus
number:
human:
decimal_units:
- format: "%n%u"
+ format: "%n %u"
units:
- billion: B
+ billion: Mrd
million: M
- quadrillion: Q
- thousand: K
- trillion: T
+ quadrillion: Brd
+ thousand: k
+ trillion: B
unit: ''
pagination:
+ newer: Uudemmat
next: Seuraava
+ older: Vanhemmat
prev: Edellinen
+ truncate: "…"
+ preferences:
+ languages: Kielet
+ other: Muut
+ publishing: Julkaiseminen
+ web: Web
+ push_notifications:
+ favourite:
+ title: "%{name} tykkäsi tilastasi"
+ follow:
+ title: "%{name} seuraa nyt sinua"
+ group:
+ title: "%{count} ilmoitusta"
+ mention:
+ action_boost: Buustaa
+ action_expand: Näytä lisää
+ action_favourite: Tykkää
+ title: "%{nimi} mainitsi sinut"
+ reblog:
+ title: "%{name} buustasi tilaasi"
remote_follow:
- acct: Syötä sinun käyttäjänimesi@domain jos haluat seurata palvelimelta
- missing_resource: Ei löydetty tarvittavaa uudelleenohjaavaa URL-linkkiä tilillesi
- proceed: Siirry seuraamiseen
- prompt: 'Sinä aiot seurata:'
+ acct: Syötä se käyttäjätunnus@verkkotunnus, josta haluat seurata
+ missing_resource: Vaadittavaa uudelleenohjaus-URL:ää tiliisi ei löytynyt
+ proceed: Siirry seuraamaan
+ prompt: 'Olet aikeissa seurata:'
+ sessions:
+ activity: Viimeisin toiminta
+ browser: Selain
+ browsers:
+ alipay: Alipay
+ blackberry: Blackberry
+ chrome: Chrome
+ edge: Microsoft Edge
+ electron: Electron
+ firefox: Firefox
+ generic: Tuntematon selain
+ ie: Internet Explorer
+ micro_messenger: MicroMessenger
+ nokia: Nokia S40 Ovi -selain
+ opera: Opera
+ otter: Otter
+ phantom_js: PhantomJS
+ qq: QQ Browser
+ safari: Safari
+ uc_browser: UCBrowser
+ weibo: Weibo
+ current_session: Nykyinen istunto
+ description: "%{selain}, %{platform}"
+ explanation: Nämä verkkoselaimet ovat tällä hetkellä kirjautuneet Mastodon-tilillesi.
+ ip: IP
+ platforms:
+ adobe_air: Adobe Air
+ android: Android
+ blackberry: Blackberry
+ chrome_os: ChromeOS
+ firefox_os: Firefox OS
+ ios: iOS
+ linux: Linux
+ mac: Mac
+ other: tuntematon järjestelmä
+ windows: Windows
+ windows_mobile: Windows Mobile
+ windows_phone: Windows Phone
+ revoke: Hylkää
+ revoke_success: Istunnon hylkäys onnistui
+ title: Istunnot
settings:
- authorized_apps: Valtuutetut ohjelmat
+ authorized_apps: Valtuutetut sovellukset
back: Takaisin Mastodoniin
+ delete: Tilin poisto
+ development: Kehittäminen
edit_profile: Muokkaa profiilia
- export: Vie dataa
- import: Tuo dataa
+ export: Vie tietoja
+ followers: Valtuutetut seuraajat
+ import: Tuo
+ migrate: Tilin muutto muualle
+ notifications: Ilmoitukset
preferences: Ominaisuudet
settings: Asetukset
- two_factor_authentication: Kaksivaiheinen tunnistus
+ two_factor_authentication: Kaksivaiheinen todentaminen
+ your_apps: Omat sovellukset
statuses:
- open_in_web: Avaa webissä
- over_character_limit: sallittu kirjanmäärä %{max} ylitetty
+ attached:
+ description: 'Liitetty: %{attached}'
+ image:
+ one: "%{count} kuva"
+ other: "%{count} kuvaa"
+ video:
+ one: "%{count} video"
+ other: "%{count} videota"
+ content_warning: 'Sisältövaroitus: %{warning}'
+ open_in_web: Avaa selaimessa
+ over_character_limit: merkkimäärän rajoitus %{max} ylitetty
+ pin_errors:
+ limit: Olet jo kiinnittänyt suurimman mahdollisen määrän tuuttauksia
+ ownership: Muiden tuuttauksia ei voi kiinnittää
+ private: Piilotettua tuuttausta ei voi kiinnittää
+ reblog: Buustausta ei voi kiinnittää
show_more: Näytä lisää
+ title: "%{name}: ”%{quote}”"
visibilities:
- private: Näytä vain seuraajille
+ private: Vain seuraajille
+ private_long: Näytä vain seuraajille
public: Julkinen
- unlisted: Julkinen, mutta älä näytä julkisella aikajanalla
+ public_long: Kaikki voivat nähdä
+ unlisted: Listaamaton julkinen
+ unlisted_long: Kaikki voivat nähdä, mutta ei näytetä julkisilla aikajanoilla
stream_entries:
- click_to_show: Klikkaa näyttääksesi
- reblogged: boosted
- sensitive_content: Herkkä materiaali
+ click_to_show: Katso napsauttamalla
+ pinned: Kiinnitetty tuuttaus
+ reblogged: buustasi
+ sensitive_content: Arkaluontoista sisältöä
+ terms:
+ title: "%{instance}, käyttöehdot ja tietosuojakäytäntö"
+ themes:
+ default: Mastodon
time:
formats:
- default: "%b %d, %Y, %H:%M"
+ default: "%d.%m.%Y klo %H.%M"
two_factor_authentication:
- description_html: Jos otat käyttöön kaksivaiheisen tunnistuksen, kirjautumiseen vaaditaan puhelin, joka voi luoda tokeneita kirjautumista varten.
+ code_hint: Vahvista syöttämällä todentamissovelluksen generoima koodi
+ description_html: Jos otat käyttöön kaksivaiheisen todentamisen, kirjautumiseen vaaditaan puhelin, jolla voidaan luoda kirjautumistunnuksia.
disable: Poista käytöstä
enable: Ota käyttöön
- instructions_html: "Skannaa tämä QR-koodi Google Authenticator- tai vastaavaan sovellukseen puhelimellasi. Tästä hetkestä lähtien ohjelma luo koodin, mikä sinun tarvitsee syöttää sisäänkirjautuessa."
+ enabled: Kaksivaiheinen todentaminen käytössä
+ enabled_success: Kaksivaiheisen todentamisen käyttöönotto onnistui
+ generate_recovery_codes: Luo palautuskoodit
+ instructions_html: "Lue tämä QR-koodi puhelimen Google Authenticator- tai vastaavalla TOTP-sovelluksella. Sen jälkeen sovellus luo tunnuksia, joita tarvitset sisäänkirjautuessasi."
+ lost_recovery_codes: Palautuskoodien avulla voit käyttää tiliä, jos menetät puhelimesi. Jos olet hukannut palautuskoodit, voit luoda uudet tästä. Vanhat palautuskoodit poistetaan käytöstä.
+ manual_instructions: 'Jos et voi lukea QR-koodia ja haluat syöttää sen käsin, tässä on salainen koodi tekstinä:'
+ recovery_codes: Varapalautuskoodit
+ recovery_codes_regenerated: Uusien palautuskoodien luonti onnistui
+ recovery_instructions_html: Jos menetät puhelimesi, voit kirjautua tilillesi jollakin alla olevista palautuskoodeista. Pidä palautuskoodit hyvässä tallessa. Voit esimerkiksi tulostaa ne ja säilyttää muiden tärkeiden papereiden joukossa.
+ setup: Ota käyttöön
+ wrong_code: Annettu koodi oli virheellinen! Ovatko palvelimen aika ja laitteen aika oikein?
+ user_mailer:
+ backup_ready:
+ explanation: Pyysit täydellistä varmuuskopiota Mastodon-tilistäsi. Voit nyt ladata sen!
+ subject: Arkisto on valmiina ladattavaksi
+ title: Arkiston tallennus
+ welcome:
+ edit_profile_action: Aseta profiili
+ edit_profile_step: Voit mukauttaa profiiliasi lataamalla profiilikuvan ja otsakekuvan, muuttamalla näyttönimeäsi ym. Jos haluat hyväksyä uudet seuraajat ennen kuin he voivat seurata sinua, voit lukita tilisi.
+ explanation: Näillä vinkeillä pääset alkuun
+ final_action: Ala julkaista
+ final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, monet voivat nähdä julkiset viestisi esimerkiksi paikallisella aikajanalla ja hashtagien avulla. Kannattaa esittäytyä! Käytä hashtagia #introductions. (Jos haluat esittäytyä myös suomeksi, se kannattaa tehdä erillisessä tuuttauksessa ja käyttää hashtagia #esittely.)'
+ full_handle: Koko käyttäjätunnuksesi
+ full_handle_hint: Kerro tämä ystävillesi, niin he voivat lähettää sinulle viestejä tai löytää sinut toisen instanssin kautta.
+ review_preferences_action: Muuta asetuksia
+ review_preferences_step: Käy tarkistamassa, että asetukset ovat haluamallasi tavalla. Voit valita, missä tilanteissa haluat saada sähköpostia, mikä on julkaisujesi oletusnäkyvyys jne. Jos et saa helposti pahoinvointia, voit valita, että GIF-animaatiot toistetaan automaattisesti.
+ subject: Tervetuloa Mastodoniin
+ tip_bridge_html: Jos tulet Twitteristä, voit etsiä ystäviäsi Mastodonista siltasovelluksen avulla. Se kuitenkin löytää heidät vain, jos hekin käyttävät sitä!
+ tip_federated_timeline: Yleinen aikajana näyttää sisältöä koko Mastodon-verkostosta. Siinä näkyvät kuitenkin vain ne henkilöt, joita oman instanssisi käyttäjät seuraavat. Siinä ei siis näytetä aivan kaikkea.
+ tip_following: Oletusarvoisesti seuraat oman palvelimesi ylläpitäjiä. Etsi lisää kiinnostavia ihmisiä paikalliselta ja yleiseltä aikajanalta.
+ tip_local_timeline: Paikallinen aikajana näyttää instanssin %{instance} käyttäjien julkaisut. He ovat naapureitasi!
+ tip_mobile_webapp: Jos voit lisätä Mastodonin mobiiliselaimen kautta aloitusnäytöllesi, voit vastaanottaa push-ilmoituksia. Toiminta vastaa monin tavoin tavanomaista sovellusta!
+ tips: Vinkkejä
+ title: Tervetuloa mukaan, %name}!
users:
- invalid_email: Virheellinen sähköposti
- invalid_otp_token: Virheellinen kaksivaihetunnistuskoodi
+ invalid_email: Virheellinen sähköpostiosoite
+ invalid_otp_token: Virheellinen kaksivaiheisen todentamisen koodi
+ 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/ja.yml b/config/locales/ja.yml
index 5f23dd47b..01fb9657f 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -18,7 +18,7 @@ ja:
features:
humane_approach_body: 他の SNS の失敗から学び、Mastodon はソーシャルメディアが誤った使い方をされることの無いように倫理的な設計を目指しています。
humane_approach_title: より思いやりのある設計
- not_a_product_body: Mastodon は営利的な SNS ではありません。広告や、データの収集・解析は無く、またユーザーの囲い込みもありません。
+ not_a_product_body: Mastodon は営利的な SNS ではありません。広告や、データの収集・解析は無く、またユーザーの囲い込みもありません。ここには中央権力はありません。
not_a_product_title: あなたは人間であり、商品ではありません
real_conversation_body: 好きなように書ける500文字までの投稿や、文章やメディアの内容に警告をつけられる機能で、思い通りに自分自身を表現することができます。
real_conversation_title: 本当のコミュニケーションのために
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index a71f48758..4fba2c0c1 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -63,6 +63,13 @@ pl:
are_you_sure: Jesteś tego pewien?
avatar: Awatar
by_domain: Domena
+ change_email:
+ changed_msg: Pomyślnie zmieniono adres e-mail konta!
+ current_email: Obecny adres e-mail
+ label: Zmień adres e-mail
+ new_email: Nowy adres e-mail
+ submit: Zmień adres e-mail
+ title: Zmień adres e-mail dla %{username}
confirm: Potwierdź
confirmed: Potwierdzono
demote: Degraduj
@@ -131,6 +138,7 @@ pl:
statuses: Wpisy
subscribe: Subskrybuj
title: Konta
+ unconfirmed_email: Niepotwierdzony adres e-mail
undo_silenced: Cofnij wyciszenie
undo_suspension: Cofnij zawieszenie
unsubscribe: Przestań subskrybować
@@ -139,6 +147,7 @@ pl:
action_logs:
actions:
assigned_to_self_report: "%{name} przypisał sobie zgłoszenie %{target}"
+ change_email_user: "%{name} zmienił adres-email użytkownika %{target}"
confirm_user: "%{name} potwierdził adres e-mail użytkownika %{target}"
create_custom_emoji: "%{name} dodał nowe emoji %{target}"
create_domain_block: "%{name} zablokował domenę %{target}"
@@ -251,6 +260,16 @@ pl:
created_msg: Pomyslnie utworzono notatkę moderacyjną.
destroyed_msg: Pomyślnie usunięto notatkę moderacyjną.
reports:
+ account:
+ created_reports: Zgłoszenia utworzone z tego konta
+ moderation:
+ silenced: Wyciszone
+ suspended: Zawieszone
+ title: Moderacja
+ moderation_notes: Notatki moderacyjne
+ note: notatka
+ report: zgłoszenie
+ targeted_reports: Zgłoszenia dotycząće tego konta
action_taken_by: Działanie podjęte przez
are_you_sure: Czy na pewno?
assign_to_self: Przypisz do siebie
@@ -258,18 +277,24 @@ pl:
comment:
label: Komentarz do zgłoszenia
none: Brak
+ created_at: Zgłoszono
delete: Usuń
+ history: Historia moderacji
id: ID
mark_as_resolved: Oznacz jako rozwiązane
mark_as_unresolved: Oznacz jako nierozwiązane
notes:
create: Utwórz notatkę
create_and_resolve: Rozwiąż i pozostaw notatkę
+ create_and_unresolve: Cofnij rozwiązanie i pozostaw notatkę
delete: Usuń
label: Notatki
+ new_label: Dodaj notatkę moderacyjną
+ placeholder: Opisz wykonane akcje i inne szczegóły dotyczące tego zgłoszenia…
nsfw:
'false': Nie oznaczaj jako NSFW
'true': Oznaczaj jako NSFW
+ reopen: Otwórz ponownie
report: 'Zgłoszenie #%{id}'
report_contents: Zawartość
reported_account: Zgłoszone konto
@@ -617,6 +642,10 @@ pl:
missing_resource: Nie udało się znaleźć adresu przekierowania z Twojej domeny
proceed: Śledź
prompt: 'Zamierzasz śledzić:'
+ remote_unfollow:
+ error: Błąd
+ title: Tytuł
+ unfollowed: Przestałeś śledzić
sessions:
activity: Ostatnia aktywność
browser: Przeglądarka
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index 17862f916..41a0c26aa 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -14,7 +14,7 @@ eo:
one: 1 signo restas
other: %{count} signoj restas
setting_noindex: Influas vian publikan profilon kaj mesaĝajn paĝojn
- setting_theme: Influas kiel Mastodon aspektas kiam vi ensalutis en ajna aparato.
+ setting_theme: Influas kiel Mastodon aspektas post ensaluto de ajna aparato.
imports:
data: CSV-dosiero el alia nodo de Mastodon
sessions:
@@ -45,7 +45,7 @@ eo:
setting_default_privacy: Mesaĝa videbleco
setting_default_sensitive: Ĉiam marki aŭdovidaĵojn tiklaj
setting_delete_modal: Montri fenestron por konfirmi antaŭ ol forigi mesaĝon
- setting_display_sensitive_media: Ĉiam montri aŭdovidaĵon markitajn tiklaj
+ setting_display_sensitive_media: Ĉiam montri aŭdovidaĵojn markitajn tiklaj
setting_noindex: Ellistiĝi de retserĉila indeksado
setting_reduce_motion: Malrapidigi animaciojn
setting_system_font_ui: Uzi la dekomencan tiparon de la sistemo
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index 34605c4f6..f48e9ab23 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -3,64 +3,68 @@ fi:
simple_form:
hints:
defaults:
- avatar: PNG, GIF tai JPG. Korkeintaan 2MB. Skaalataan kokoon 400x400px
- digest: Lähetetään vain pitkän poissaolon jälkeen, ja vain jos olet vastaanottanut yksityisviestejä poissaolosi aikana
- display_name: Korkeintaan 30 merkkiä
- header: PNG, GIF tai JPG. Korkeintaan 2MB. Skaalataan kokoon 700x335px
- locked: Vaatii sinua manuaalisesti hyväksymään seuraajat
- note: Korkeintaan 160 merkkiä
- setting_noindex: Vaikuttaa julkiseen profiiliisi ja statuspäivityksiisi
- setting_theme: Vaikuttaa siihen, miltä Mastodon näyttää kun olet kirjautuneena milllä tahansa laitteella.
+ avatar: PNG, GIF tai JPG. Enintään 2 Mt. Skaalataan kokoon 400 x 400 px
+ digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana
+ display_name:
+ one: 1 merkki jäljellä
+ other: %{count} merkkiä jäljellä
+ header: PNG, GIF tai JPG. Enintään 2 Mt. Skaalataan kokoon 700 x 335 px
+ locked: Sinun täytyy hyväksyä seuraajat manuaalisesti
+ note:
+ one: 1 merkki jäljellä
+ other: %{count} merkkiä jäljellä
+ setting_noindex: Vaikuttaa julkiseen profiiliisi ja tilasivuihisi
+ setting_theme: Vaikuttaa Mastodonin ulkoasuun millä tahansa laitteella kirjauduttaessa.
imports:
- data: CSV tiedosto, joka on tuotu toiselta Mastodon-palvelimelta
+ data: Toisesta Mastodon-instanssista tuotu CSV-tiedosto
sessions:
- otp: Syötä kaksivaiheisen tunnistuksen koodi puhelimestasi tai käytä yhtä palautuskoodeistasi.
+ otp: Syötä puhelimeen saamasi kaksivaiheisen tunnistautumisen koodi tai käytä palautuskoodia.
user:
- filtered_languages: Valitut kielet suodatetaan julkisilta aikajanoilta
+ filtered_languages: Valitut kielet suodatetaan pois julkisilta aikajanoilta
labels:
defaults:
avatar: Profiilikuva
- confirm_new_password: Varmista uusi salasana
- confirm_password: Varmista salasana
+ confirm_new_password: Vahvista uusi salasana
+ confirm_password: Vahvista salasana
current_password: Nykyinen salasana
- data: Data
+ data: Tiedot
display_name: Nimimerkki
email: Sähköpostiosoite
- expires_in: Vanhentuu
+ expires_in: Vanhenee
filtered_languages: Suodatetut kielet
header: Otsakekuva
locale: Kieli
- locked: Tee tilistä yksityinen
- max_uses: Max käyttökerrat
+ locked: Lukitse tili
+ max_uses: Käyttökertoja enintään
new_password: Uusi salasana
note: Kuvaus
- otp_attempt: Kaksivaiheinen koodi
+ otp_attempt: Kaksivaiheisen tunnistautumisen koodi
password: Salasana
- setting_auto_play_gif: Animoitujen GIFfien automaattitoisto
- setting_boost_modal: Näytä vahvistusikkuna ennen boostausta
- setting_default_privacy: Julkaisun yksityisyys
+ setting_auto_play_gif: Toista GIF-animaatiot automaattisesti
+ setting_boost_modal: Kysy vahvistusta ennen buustausta
+ setting_default_privacy: Julkaisun näkyvyys
setting_default_sensitive: Merkitse media aina arkaluontoiseksi
- setting_delete_modal: Näytä vahvistusikkuna ennen töötin poistamista
+ setting_delete_modal: Kysy vahvistusta ennen tuuttauksen poistamista
setting_display_sensitive_media: Näytä aina arkaluontoiseksi merkitty media
setting_noindex: Jättäydy pois hakukoneindeksoinnista
- setting_reduce_motion: Vähennä liikettä animaatioissa
- setting_system_font_ui: Käytä käyttöjärjestelmän oletusfonttia
+ setting_reduce_motion: Vähennä animaatioiden liikettä
+ setting_system_font_ui: Käytä järjestelmän oletusfonttia
setting_theme: Sivuston teema
- setting_unfollow_modal: Näytä vahvistusikkuna ennen seuraamisen lopettamista
- severity: Vakavuusaste
- type: Tuontityyppi
+ setting_unfollow_modal: Kysy vahvistusta, ennen kuin lopetat seuraamisen
+ severity: Vakavuus
+ type: Tietojen laji
username: Käyttäjänimi
username_or_email: Käyttäjänimi tai sähköposti
interactions:
must_be_follower: Estä ilmoitukset käyttäjiltä, jotka eivät seuraa sinua
must_be_following: Estä ilmoitukset käyttäjiltä, joita et seuraa
- must_be_following_dm: Estä suorat viestit ihmisiltä, joita et seuraa
+ must_be_following_dm: Estä suorat viestit käyttäjiltä, joita et seuraa
notification_emails:
- digest: Lähetä koosteviestejä sähköpostilla
- favourite: Lähetä sähköposti, kun joku tykkää statuksestasi
+ digest: Lähetä koosteviestejä sähköpostitse
+ favourite: Lähetä sähköposti, kun joku tykkää tilastasi
follow: Lähetä sähköposti, kun joku seuraa sinua
follow_request: Lähetä sähköposti, kun joku pyytää seurata sinua
- mention: Lähetä sähköposti, kun joku mainitsee sinut
+ mention: Lähetä sähköposti, kun sinut mainitaan
reblog: Lähetä sähköposti, kun joku buustaa julkaisusi
'no': Ei
required:
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 4f9594e6f..325cb2691 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -10,6 +10,7 @@ pl:
many: Pozostało %{count} znaków
one: Pozostał 1 znak
other: Pozostało %{count} znaków
+ fields: Możesz ustawić maksymalnie 4 niestandardowe pola wyświetlane jako tabela na Twoim profilu
header: PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie zmniejszony do 700x335px
locked: Musisz akceptować prośby o śledzenie
note:
@@ -26,6 +27,10 @@ pl:
user:
filtered_languages: Wpisy w wybranych językach nie będą wyświetlać się na publicznych osiach czasu
labels:
+ account:
+ fields:
+ name: Nazwa
+ value: Zawartość
defaults:
avatar: Awatar
confirm_new_password: Potwierdź nowe hasło
@@ -35,6 +40,7 @@ pl:
display_name: Widoczna nazwa
email: Adres e-mail
expires_in: Wygaśnie po
+ fields: Metadane profilu
filtered_languages: Filtrowane języki
header: Nagłówek
locale: Język
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 7d4241bac..e504c9774 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -6,21 +6,21 @@ sk:
avatar: PNG, GIF alebo JPG. Maximálne 2MB. Bude zmenšený na 400x400px
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 vám 1 znak
- other: Ostáva vám %{count} znakov
+ one: Ostáva ti 1 znak
+ other: Ostáva ti %{count} znakov
header: PNG, GIF alebo JPG. Maximálne 2MB. Bude zmenšený na 700x335px
locked: Musíte manuálne schváliť sledujúcich
note:
one: Ostáva vám 1 znak
- other: Ostáva vám %{count}znakov
- setting_noindex: Ovplyvňuje profil a správy tak, že ich nebude možné nájsť vyhľadávaním
- setting_theme: Ovplyvní ako bude Mastodon vyzerať pri prihlásení z hociktorého zariadenia.
+ other: Ostáva ti %{count} 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.
imports:
data: CSV súbor vyexportovaný z inej Mastodon inštancie
sessions:
- otp: Vložte 2FA 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žite jeden z vašich obnovovacích kódov.
user:
- filtered_languages: Zaškrtnuté jazyky vám nebudú zobrazené vo verejnej časovej osi
+ filtered_languages: Zaškrtnuté jazyky budú pre teba vynechané nebudú z verejnej časovej osi
labels:
defaults:
avatar: Avatar
@@ -53,7 +53,7 @@ sk:
setting_unfollow_modal: Zobrazovať potvrdzovacie okno pred skončením sledovania iného používateľa
severity: Závažnosť
type: Typ importu
- username: Používateľské meno
+ username: Užívateľské meno
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/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml
index da0292a90..6b890b036 100644
--- a/config/locales/simple_form.zh-HK.yml
+++ b/config/locales/simple_form.zh-HK.yml
@@ -6,6 +6,7 @@ zh-HK:
avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 2MB,會縮裁成 400x400px
digest: 僅在你長時間未登錄,且收到了私信時發送
display_name: 最多 30 個字元
+ fields: 個人資料頁可顯示多至 4 個項目
header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 2MB,會縮裁成 700x335px
locked: 你必須人手核准每個用戶對你的關注請求,而你的文章私隱會被預設為「只有關注你的人能看」
note: 最多 160 個字元
@@ -18,6 +19,10 @@ zh-HK:
user:
filtered_languages: 下面被選擇的語言的文章將不會出現在你的公共時間軸上。
labels:
+ account:
+ fields:
+ name: 標籤
+ value: 內容
defaults:
avatar: 個人頭像
confirm_new_password: 確認新密碼
@@ -27,6 +32,7 @@ zh-HK:
display_name: 顯示名稱
email: 電郵地址
expires_in: 失效時間
+ fields: 資料
filtered_languages: 封鎖下面語言的文章
header: 個人頁面頂部
locale: 語言
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 2ee25b372..25e672604 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -149,15 +149,15 @@ sk:
enable_custom_emoji: "%{name} povolil emoji %{target}"
enable_user: "%{name} povolil prihlásenie pre používateľa %{target}"
memorialize_account: '%{name} zmenil účet %{target} na stránku "Navždy budeme spomínať"'
- promote_user: "%{name} povýšil používateľa %{target}"
- reset_password_user: "%{name} resetoval heslo pre používateľa %{target}"
- resolve_report: "%{name} zamietol nahlásenie %{target}"
- silence_account: "%{name} stíšil účet %{target}"
- suspend_account: "%{name} suspendoval účet používateľa %{target}"
- unsilence_account: "%{name} zrušil stíšenie účtu používateľa %{target}"
- unsuspend_account: "%{name} zrušil suspendáciu účtu používateľa %{target}"
- update_custom_emoji: "%{name} aktualizoval emoji %{target}"
- update_status: "%{name} aktualizoval status %{target}"
+ promote_user: "%{name} povýšil/a používateľa %{target}"
+ reset_password_user: "%{name} resetoval/a heslo pre používateľa %{target}"
+ resolve_report: "%{name} zamietli nahlásenie %{target}"
+ silence_account: "%{name} utíšil/a účet %{target}"
+ suspend_account: "%{name} zablokoval/a účet používateľa %{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}"
+ update_status: "%{name} aktualizoval/a status pre %{target}"
title: Kontrólny záznam
custom_emojis:
by_domain: Doména
@@ -358,7 +358,7 @@ sk:
warning: Na tieto údaje dávajte ohromný pozor. Nikdy ich s nikým nezďieľajte!
your_token: Váš prístupový token
auth:
- agreement_html: V rámci registrácie súhlasíte, že sa budete riadiť 1 pravidlami tejto instancie 2 a taktiež 3 našími servisnými podmienkami 4.
+ agreement_html: V rámci registrácie súhlasíš, že sa budeš riadiť pravidlami tejto instancie, a taktiež našími servisnými podmienkami .
change_password: Heslo
confirm_email: Potvrdiť email
delete_account: Vymazať účet
@@ -366,8 +366,8 @@ sk:
didnt_get_confirmation: Neobdŕžali ste kroky pre potvrdenie?
forgot_password: Zabudli ste heslo?
invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítajte si nový.
- login: Prihlásenie
- logout: Odhlásiť sa
+ login: Prihlás sa
+ logout: Odhlás sa
migrate_account: Presunúť sa na iný účet
migrate_account_html: Pokiaľ si želáte presmerovať tento účet na nejaký iný, môžete tak urobiť tu.
or: alebo
@@ -375,7 +375,7 @@ sk:
providers:
cas: CAS
saml: SAML
- register: Zaregistrovať sa
+ register: Zaregistruj sa
register_elsewhere: Zaregistruj sa na inom serveri
resend_confirmation: Poslať potvrdzujúce pokyny znovu
reset_password: Resetovať heslo
@@ -677,6 +677,7 @@ sk:
full_handle: Adresa tvojho profilu v celom formáte
full_handle_hint: Toto je čo musíš dať vedieť svojím priateľom aby ti mohli posielať správy, alebo ťa následovať z inej instancie.
review_preferences_action: Zmeniť nastavenia
+ review_preferences_step: Daj si záležať na svojích nastaveniach, napríklad že aké emailové notifikácie chceš dostávať, alebo pod aký level súkromia sa tvoje príspevky majú sami automaticky zaradiť. Pokiaľ nemáš malátnosť z pohybu, môžeš si zvoliť aj automatické spúšťanie GIF animácií.
subject: Vitaj na Mastodone
tip_bridge_html: Ak prichádzaš z Twitteru, môžeš svojích priateľov nájsť na Mastodone pomocou tzv. mostíkovej aplikácie. Ale tá funguje iba ak ju aj oni niekedy použili!
tip_federated_timeline: Federovaná os zobrazuje sieť Mastodonu až po jej hranice. Ale zahŕňa iba ľúdí ktorých ostatní okolo teba sledujú, takže predsa nieje úplne celistvá.
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 5c1feabfc..964ff5811 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -4,6 +4,7 @@ zh-HK:
about_hashtag_html: 這些是包含「#%{hashtag}」標籤的公開文章。只要你有任何 Mastodon 服務站、或者聯盟網站的用戶,便可以與他們互動。
about_mastodon_html: Mastodon(萬象)是自由、開源的社交網絡。服務站各自獨立而互連,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的網絡交流。
about_this: 關於本服務站
+ administered_by: 管理者:
closed_registrations: 本服務站暫時停止接受登記。
contact: 聯絡
contact_missing: 未設定
@@ -60,7 +61,15 @@ zh-HK:
destroyed_msg: 管理記錄已被刪除
accounts:
are_you_sure: 你確定嗎?
+ avatar: 頭像
by_domain: 域名
+ change_email:
+ changed_msg: 帳號電郵更新成功!
+ current_email: 現時電郵
+ label: 改變電郵
+ new_email: 新的電郵
+ submit: 改變電郵
+ title: 改變 %{username} 的電郵
confirm: 確定
confirmed: 已確定
demote: 降任
@@ -108,6 +117,7 @@ zh-HK:
public: 公共
push_subscription_expires: PuSH 訂閱過期
redownload: 更新頭像
+ remove_avatar: 取消頭像
reset: 重設
reset_password: 重設密碼
resubscribe: 重新訂閱
@@ -128,6 +138,7 @@ zh-HK:
statuses: 文章
subscribe: 訂閱
title: 用戶
+ unconfirmed_email: 未確認的電郵
undo_silenced: 解除靜音
undo_suspension: 解除停權
unsubscribe: 取消訂閱
@@ -135,6 +146,8 @@ zh-HK:
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}"
@@ -150,10 +163,13 @@ zh-HK:
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}"
@@ -238,29 +254,60 @@ zh-HK:
expired: 已失效
title: 篩選
title: 邀請用戶
+ report_notes:
+ created_msg: 舉報筆記已建立。
+ destroyed_msg: 舉報筆記已刪除。
reports:
+ account:
+ created_reports: 由此帳號發出的舉報
+ moderation:
+ silenced: 被靜音的
+ suspended: 被停權的
+ title: 管理操作
+ moderation_notes: 管理筆記
+ note: 筆記
+ report: 舉報
+ targeted_reports: 關於此帳號的舉報
action_taken_by: 操作執行者
are_you_sure: 你確認嗎?
+ assign_to_self: 指派給自己
+ assigned: 指派負責人
comment:
label: 詳細解釋
none: 沒有
+ created_at: 日期
delete: 刪除
+ history: 執行紀錄
id: ID
mark_as_resolved: 標示為「已處理」
+ mark_as_unresolved: 標示為「未處理」
+ notes:
+ create: 建立筆記
+ create_and_resolve: 建立筆記並標示為「已處理」
+ create_and_unresolve: 建立筆記並標示為「未處理」
+ delete: 刪除
+ label: 管理筆記
+ new_label: 建立管理筆記
+ placeholder: 記錄已執行的動作,或其他更新
nsfw:
'false': 取消 NSFW 標記
'true': 添加 NSFW 標記
+ reopen: 重開舉報
report: '舉報 #%{id}'
report_contents: 舉報內容
reported_account: 舉報用戶
reported_by: 舉報者
resolved: 已處理
+ resolved_msg: 舉報已處理。
silence_account: 將用戶靜音
status: 狀態
+ statuses: 被舉報的文章
suspend_account: 將用戶停權
target: 對象
title: 舉報
+ unassign: 取消指派
unresolved: 未處理
+ updated_at: 更新
view: 檢視
settings:
activity_api_enabled:
@@ -381,6 +428,7 @@ zh-HK:
security: 登入資訊
set_new_password: 設定新密碼
authorize_follow:
+ already_following: 你已經關注了這個帳號
error: 對不起,尋找這個跨站用戶的過程發生錯誤
follow: 關注
follow_request: 關注請求已發送给:
@@ -473,6 +521,7 @@ zh-HK:
'21600': 6 小時後
'3600': 1 小時後
'43200': 12 小時後
+ '604800': 1 週後
'86400': 1 天後
expires_in_prompt: 永不過期
generate: 生成邀請連結
@@ -574,6 +623,10 @@ zh-HK:
missing_resource: 無法找到你用戶的轉接網址
proceed: 下一步
prompt: 你希望關注︰
+ remote_unfollow:
+ error: 錯誤
+ title: 標題
+ unfollowed: 取消關注
sessions:
activity: 最近活動
browser: 瀏覽器
@@ -593,7 +646,7 @@ zh-HK:
safari: Safari
uc_browser: UC瀏覽器
weibo: 新浪微博
- current_session: 目前的 session
+ current_session: 目前的作業階段
description: "%{platform} 上的 %{browser}"
explanation: 這些是現在正登入於你的 Mastodon 帳號的瀏覽器。
ip: IP 位址
@@ -611,8 +664,8 @@ zh-HK:
windows_mobile: Windows Mobile
windows_phone: Windows Phone
revoke: 取消
- revoke_success: Session 取消成功。
- title: Session
+ revoke_success: 作業階段取消成功。
+ title: 作業階段
settings:
authorized_apps: 授權應用程式
back: 回到 Mastodon
@@ -677,6 +730,10 @@ zh-HK:
setup: 設定
wrong_code: 你輸入的認證碼並不正確!可能伺服器時間和你手機不一致,請檢查你手機的時鐘,或與本站管理員聯絡。
user_mailer:
+ backup_ready:
+ explanation: 你要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載。
+ subject: 你的備份檔已可供下載
+ title: 檔案匯出
welcome:
edit_profile_action: 設定個人資料
edit_profile_step: 你可以設定你的個人資料,包括上傳頭像、橫幅圖片、更改顯示名稱等等。如果你想在新的關注者關注你之前對他們進行審核,你也可以選擇為你的帳戶設為「私人」。
diff --git a/docker-compose.yml b/docker-compose.yml
index 836cb00b8..8058326dc 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -40,7 +40,7 @@ services:
- external_network
- internal_network
ports:
- - "3000:3000"
+ - "127.0.0.1:3000:3000"
depends_on:
- db
- redis
@@ -60,7 +60,7 @@ services:
- external_network
- internal_network
ports:
- - "4000:4000"
+ - "127.0.0.1:4000:4000"
depends_on:
- db
- redis
diff --git a/package.json b/package.json
index 491a487d2..d861f1723 100644
--- a/package.json
+++ b/package.json
@@ -84,8 +84,8 @@
"prop-types": "^15.5.10",
"punycode": "^2.1.0",
"rails-ujs": "^5.1.2",
- "react": "^16.2.0",
- "react-dom": "^16.2.0",
+ "react": "^16.3.0",
+ "react-dom": "^16.3.0",
"react-hotkeys": "^0.10.0",
"react-immutable-proptypes": "^2.1.0",
"react-immutable-pure-component": "^1.1.1",
diff --git a/spec/controllers/stream_entries_controller_spec.rb b/spec/controllers/stream_entries_controller_spec.rb
index f81e2be7b..665c5b747 100644
--- a/spec/controllers/stream_entries_controller_spec.rb
+++ b/spec/controllers/stream_entries_controller_spec.rb
@@ -66,16 +66,12 @@ RSpec.describe StreamEntriesController, type: :controller do
describe 'GET #show' do
include_examples 'before_action', :show
- it 'renders with HTML' do
- ancestor = Fabricate(:status)
- status = Fabricate(:status, in_reply_to_id: ancestor.id)
- descendant = Fabricate(:status, in_reply_to_id: status.id)
+ it 'redirects to status page' do
+ status = Fabricate(:status)
get :show, params: { account_username: status.account.username, id: status.stream_entry.id }
- expect(assigns(:ancestors)).to eq [ancestor]
- expect(assigns(:descendants)).to eq [descendant]
- expect(response).to have_http_status(:success)
+ expect(response).to redirect_to(short_account_status_url(status.account, status))
end
it 'returns http success with Atom' do
diff --git a/streaming/index.js b/streaming/index.js
index d08b9cd87..48bab8078 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -329,52 +329,53 @@ const startWorker = (workerId) => {
// Only messages that may require filtering are statuses, since notifications
// are already personalized and deletes do not matter
- if (needsFiltering && event === 'update') {
- pgPool.connect((err, client, done) => {
- if (err) {
- log.error(err);
- return;
- }
-
- const unpackedPayload = payload;
- const targetAccountIds = [unpackedPayload.account.id].concat(unpackedPayload.mentions.map(item => item.id));
- const accountDomain = unpackedPayload.account.acct.split('@')[1];
-
- if (Array.isArray(req.filteredLanguages) && req.filteredLanguages.indexOf(unpackedPayload.language) !== -1) {
- log.silly(req.requestId, `Message ${unpackedPayload.id} filtered by language (${unpackedPayload.language})`);
- done();
- return;
- }
-
- if (req.accountId) {
- const queries = [
- client.query(`SELECT 1 FROM blocks WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) OR (account_id = $2 AND target_account_id = $1) UNION SELECT 1 FROM mutes WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, [req.accountId, unpackedPayload.account.id].concat(targetAccountIds)),
- ];
-
- if (accountDomain) {
- queries.push(client.query('SELECT 1 FROM account_domain_blocks WHERE account_id = $1 AND domain = $2', [req.accountId, accountDomain]));
- }
-
- Promise.all(queries).then(values => {
- done();
-
- if (values[0].rows.length > 0 || (values.length > 1 && values[1].rows.length > 0)) {
- return;
- }
-
- transmit();
- }).catch(err => {
- done();
- log.error(err);
- });
- } else {
- done();
- transmit();
- }
- });
- } else {
+ if (!needsFiltering || event !== 'update') {
transmit();
+ return;
}
+
+ const unpackedPayload = payload;
+ const targetAccountIds = [unpackedPayload.account.id].concat(unpackedPayload.mentions.map(item => item.id));
+ const accountDomain = unpackedPayload.account.acct.split('@')[1];
+
+ if (Array.isArray(req.filteredLanguages) && req.filteredLanguages.indexOf(unpackedPayload.language) !== -1) {
+ log.silly(req.requestId, `Message ${unpackedPayload.id} filtered by language (${unpackedPayload.language})`);
+ return;
+ }
+
+ // When the account is not logged in, it is not necessary to confirm the block or mute
+ if (!req.accountId) {
+ transmit();
+ return;
+ }
+
+ pgPool.connect((err, client, done) => {
+ if (err) {
+ log.error(err);
+ return;
+ }
+
+ const queries = [
+ client.query(`SELECT 1 FROM blocks WHERE (account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})) OR (account_id = $2 AND target_account_id = $1) UNION SELECT 1 FROM mutes WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 2)})`, [req.accountId, unpackedPayload.account.id].concat(targetAccountIds)),
+ ];
+
+ if (accountDomain) {
+ queries.push(client.query('SELECT 1 FROM account_domain_blocks WHERE account_id = $1 AND domain = $2', [req.accountId, accountDomain]));
+ }
+
+ Promise.all(queries).then(values => {
+ done();
+
+ if (values[0].rows.length > 0 || (values.length > 1 && values[1].rows.length > 0)) {
+ return;
+ }
+
+ transmit();
+ }).catch(err => {
+ done();
+ log.error(err);
+ });
+ });
};
subscribe(`${redisPrefix}${id}`, listener);
diff --git a/yarn.lock b/yarn.lock
index 03915eafe..ea54790c3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5998,9 +5998,9 @@ rc@^1.1.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-dom@^16.2.0:
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
+react-dom@^16.3.0:
+ version "16.3.2"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.3.2.tgz#cb90f107e09536d683d84ed5d4888e9640e0e4df"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.1.0"
@@ -6184,9 +6184,9 @@ react-transition-group@^2.2.0:
prop-types "^15.5.8"
warning "^3.0.0"
-react@^16.2.0:
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
+react@^16.3.0:
+ version "16.3.2"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.1.0"