diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index f1945f8a648083..137bebc599d9bb 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -70,7 +70,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.4.0 + image: libretranslate/libretranslate:v1.4.1 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local diff --git a/.env.test b/.env.test index def5fbd8d37279..e247a2e952ebcf 100644 --- a/.env.test +++ b/.env.test @@ -1,5 +1,5 @@ -# Node.js -NODE_ENV=tests +# In test, compile the NodeJS code as if we are in production +NODE_ENV=production # Federation LOCAL_DOMAIN=cb6e6126.ngrok.io LOCAL_HTTPS=true diff --git a/.haml-lint.yml b/.haml-lint.yml index d1ed30b260c06a..8cfcaec8d93fec 100644 --- a/.haml-lint.yml +++ b/.haml-lint.yml @@ -12,3 +12,5 @@ linters: enabled: true MiddleDot: enabled: true + LineLength: + max: 320 diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml index abf4295585bf89..1328a52f02a748 100644 --- a/.haml-lint_todo.yml +++ b/.haml-lint_todo.yml @@ -1,17 +1,33 @@ # This configuration was generated by # `haml-lint --auto-gen-config` -# on 2023-10-25 08:29:48 -0400 using Haml-Lint version 0.51.0. +# on 2023-10-26 09:32:34 -0400 using Haml-Lint version 0.51.0. # The point is for the user to remove these configuration records # one by one as the lints are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of Haml-Lint, may require this file to be generated again. linters: - # Offense count: 945 + # Offense count: 16 LineLength: - enabled: false + exclude: + - 'app/views/admin/account_actions/new.html.haml' + - 'app/views/admin/accounts/index.html.haml' + - 'app/views/admin/ip_blocks/new.html.haml' + - 'app/views/admin/roles/_form.html.haml' + - 'app/views/admin/settings/discovery/show.html.haml' + - 'app/views/auth/registrations/edit.html.haml' + - 'app/views/auth/registrations/new.html.haml' + - 'app/views/filters/_filter_fields.html.haml' + - 'app/views/media/player.html.haml' + - 'app/views/settings/applications/_fields.html.haml' + - 'app/views/settings/imports/index.html.haml' + - 'app/views/settings/preferences/appearance/show.html.haml' + - 'app/views/settings/preferences/notifications/show.html.haml' + - 'app/views/settings/preferences/other/show.html.haml' + - 'app/views/settings/preferences/reaching/show.html.haml' + - 'app/views/settings/profiles/show.html.haml' - # Offense count: 10 + # Offense count: 9 RuboCop: exclude: - 'app/views/admin/accounts/_buttons.html.haml' diff --git a/.rubocop.yml b/.rubocop.yml index 786a724f0c5ce6..aa503162db33e3 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -27,7 +27,7 @@ AllCops: - 'node_modules/**/*' - 'Vagrantfile' - 'vendor/**/*' - - 'lib/json_ld/*' # Generated files + - 'config/initializers/json_ld*' # Generated files - 'lib/mastodon/migration_helpers.rb' # Vendored from GitLab - 'lib/templates/**/*' diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index bb4638ad28c362..566663f0052632 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -130,11 +130,6 @@ RSpec/InstanceVariable: RSpec/LetSetup: Exclude: - - 'spec/controllers/admin/accounts_controller_spec.rb' - - 'spec/controllers/admin/action_logs_controller_spec.rb' - - 'spec/controllers/admin/instances_controller_spec.rb' - - 'spec/controllers/admin/reports/actions_controller_spec.rb' - - 'spec/controllers/admin/statuses_controller_spec.rb' - 'spec/controllers/api/v1/accounts/statuses_controller_spec.rb' - 'spec/controllers/api/v1/filters_controller_spec.rb' - 'spec/controllers/api/v2/admin/accounts_controller_spec.rb' diff --git a/Gemfile b/Gemfile index a01f35f07f0f4d..139c3fb5f713d0 100644 --- a/Gemfile +++ b/Gemfile @@ -23,7 +23,7 @@ gem 'blurhash', '~> 0.1' gem 'active_model_serializers', '~> 0.10' gem 'addressable', '~> 2.8' -gem 'bootsnap', '~> 1.16.0', require: false +gem 'bootsnap', '~> 1.17.0', require: false gem 'browser' gem 'charlock_holmes', '~> 0.7.7' gem 'chewy', '~> 7.3' @@ -88,7 +88,7 @@ gem 'simple-navigation', '~> 4.4' gem 'simple_form', '~> 5.2' gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie' gem 'stoplight', '~> 3.0.1' -gem 'strong_migrations', '~> 0.8' +gem 'strong_migrations', '1.3.0' gem 'tty-prompt', '~> 0.23', require: false gem 'twitter-text', '~> 3.1.0' gem 'tzinfo-data', '~> 1.2023' diff --git a/Gemfile.lock b/Gemfile.lock index 7d6b2e9f43b912..348deaab5c1af8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -171,7 +171,7 @@ GEM binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) blurhash (0.1.7) - bootsnap (1.16.0) + bootsnap (1.17.0) msgpack (~> 1.2) brakeman (6.0.1) browser (5.3.1) @@ -455,7 +455,7 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.4) minitest (5.20.0) - msgpack (1.7.1) + msgpack (1.7.2) multi_json (1.15.0) multipart-post (2.3.0) mutex_m (0.1.2) @@ -631,7 +631,7 @@ GEM rspec-support (~> 3.12.0) rspec-github (2.4.0) rspec-core (~> 3.0) - rspec-mocks (3.12.5) + rspec-mocks (3.12.6) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-rails (6.0.3) @@ -644,7 +644,7 @@ GEM rspec-support (~> 3.12) rspec-retry (0.6.2) rspec-core (> 3.3) - rspec-sidekiq (4.0.1) + rspec-sidekiq (4.1.0) rspec-core (~> 3.0) rspec-expectations (~> 3.0) rspec-mocks (~> 3.0) @@ -742,7 +742,7 @@ GEM stoplight (3.0.2) redlock (~> 1.0) stringio (3.0.8) - strong_migrations (0.8.0) + strong_migrations (1.3.0) activerecord (>= 5.2) swd (1.3.0) activesupport (>= 3) @@ -835,7 +835,7 @@ DEPENDENCIES better_errors (~> 2.9) binding_of_caller (~> 1.0) blurhash (~> 0.1) - bootsnap (~> 1.16.0) + bootsnap (~> 1.17.0) brakeman (~> 6.0) browser bundler-audit (~> 0.9) @@ -945,7 +945,7 @@ DEPENDENCIES sprockets-rails (~> 3.4) stackprof stoplight (~> 3.0.1) - strong_migrations (~> 0.8) + strong_migrations (= 1.3.0) test-prof thor (~> 1.2) tty-prompt (~> 0.23) diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index edacbd5adc14fa..96e53274e489e7 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -33,7 +33,7 @@ def create # Disallow accidentally downgrading a domain block if existing_domain_block.present? && !@domain_block.stricter_than?(existing_domain_block) - @domain_block.save + @domain_block.validate flash.now[:alert] = I18n.t('admin.domain_blocks.existing_domain_block_html', name: existing_domain_block.domain, unblock_url: admin_domain_block_path(existing_domain_block)).html_safe @domain_block.errors.delete(:domain) return render :new diff --git a/app/controllers/concerns/cache_concern.rb b/app/controllers/concerns/cache_concern.rb index 55ebe1bd649cb9..2dfe5e263af05a 100644 --- a/app/controllers/concerns/cache_concern.rb +++ b/app/controllers/concerns/cache_concern.rb @@ -92,18 +92,10 @@ def serialize_record(record) arguments end - if Rails.gem_version >= Gem::Version.new('7.0') - def attributes_for_database(record) - attributes = record.attributes_for_database - attributes.transform_values! { |attr| attr.is_a?(::ActiveModel::Type::Binary::Data) ? attr.to_s : attr } - attributes - end - else - def attributes_for_database(record) - attributes = record.instance_variable_get(:@attributes).send(:attributes).transform_values(&:value_for_database) - attributes.transform_values! { |attr| attr.is_a?(::ActiveModel::Type::Binary::Data) ? attr.to_s : attr } - attributes - end + def attributes_for_database(record) + attributes = record.attributes_for_database + attributes.transform_values! { |attr| attr.is_a?(::ActiveModel::Type::Binary::Data) ? attr.to_s : attr } + attributes end def deserialize_record(class_name, attributes_from_database, new_record = false) # rubocop:disable Style/OptionalBooleanParameter diff --git a/app/javascript/mastodon/components/autosuggest_textarea.jsx b/app/javascript/mastodon/components/autosuggest_textarea.jsx index 230e4f65721077..4d173af59d47c9 100644 --- a/app/javascript/mastodon/components/autosuggest_textarea.jsx +++ b/app/javascript/mastodon/components/autosuggest_textarea.jsx @@ -1,9 +1,9 @@ import PropTypes from 'prop-types'; +import { useCallback, useRef, useState, useEffect, forwardRef } from 'react'; import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; import Textarea from 'react-textarea-autosize'; @@ -37,54 +37,46 @@ const textAtCursorMatchesToken = (str, caretPosition) => { } }; -export default class AutosuggestTextarea extends ImmutablePureComponent { - - static propTypes = { - value: PropTypes.string, - suggestions: ImmutablePropTypes.list, - disabled: PropTypes.bool, - placeholder: PropTypes.string, - onSuggestionSelected: PropTypes.func.isRequired, - onSuggestionsClearRequested: PropTypes.func.isRequired, - onSuggestionsFetchRequested: PropTypes.func.isRequired, - onChange: PropTypes.func.isRequired, - onKeyUp: PropTypes.func, - onKeyDown: PropTypes.func, - onPaste: PropTypes.func.isRequired, - autoFocus: PropTypes.bool, - lang: PropTypes.string, - }; - - static defaultProps = { - autoFocus: true, - }; - - state = { - suggestionsHidden: true, - focused: false, - selectedSuggestion: 0, - lastToken: null, - tokenStart: 0, - }; - - onChange = (e) => { +const AutosuggestTextarea = forwardRef(({ + value, + suggestions, + disabled, + placeholder, + onSuggestionSelected, + onSuggestionsClearRequested, + onSuggestionsFetchRequested, + onChange, + onKeyUp, + onKeyDown, + onPaste, + onFocus, + autoFocus = true, + lang, + children, +}, textareaRef) => { + + const [suggestionsHidden, setSuggestionsHidden] = useState(true); + const [selectedSuggestion, setSelectedSuggestion] = useState(0); + const lastTokenRef = useRef(null); + const tokenStartRef = useRef(0); + + const handleChange = useCallback((e) => { const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart); - if (token !== null && this.state.lastToken !== token) { - this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart }); - this.props.onSuggestionsFetchRequested(token); + if (token !== null && lastTokenRef.current !== token) { + tokenStartRef.current = tokenStart; + lastTokenRef.current = token; + setSelectedSuggestion(0); + onSuggestionsFetchRequested(token); } else if (token === null) { - this.setState({ lastToken: null }); - this.props.onSuggestionsClearRequested(); + lastTokenRef.current = null; + onSuggestionsClearRequested(); } - this.props.onChange(e); - }; - - onKeyDown = (e) => { - const { suggestions, disabled } = this.props; - const { selectedSuggestion, suggestionsHidden } = this.state; + onChange(e); + }, [onSuggestionsFetchRequested, onSuggestionsClearRequested, onChange, setSelectedSuggestion]); + const handleKeyDown = useCallback((e) => { if (disabled) { e.preventDefault(); return; @@ -102,80 +94,75 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { document.querySelector('.ui').parentElement.focus(); } else { e.preventDefault(); - this.setState({ suggestionsHidden: true }); + setSuggestionsHidden(true); } break; case 'ArrowDown': if (suggestions.size > 0 && !suggestionsHidden) { e.preventDefault(); - this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) }); + setSelectedSuggestion(Math.min(selectedSuggestion + 1, suggestions.size - 1)); } break; case 'ArrowUp': if (suggestions.size > 0 && !suggestionsHidden) { e.preventDefault(); - this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) }); + setSelectedSuggestion(Math.max(selectedSuggestion - 1, 0)); } break; case 'Enter': case 'Tab': // Select suggestion - if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) { + if (lastTokenRef.current !== null && suggestions.size > 0 && !suggestionsHidden) { e.preventDefault(); e.stopPropagation(); - this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion)); + onSuggestionSelected(tokenStartRef.current, lastTokenRef.current, suggestions.get(selectedSuggestion)); } break; } - if (e.defaultPrevented || !this.props.onKeyDown) { + if (e.defaultPrevented || !onKeyDown) { return; } - this.props.onKeyDown(e); - }; + onKeyDown(e); + }, [disabled, suggestions, suggestionsHidden, selectedSuggestion, setSelectedSuggestion, setSuggestionsHidden, onSuggestionSelected, onKeyDown]); - onBlur = () => { - this.setState({ suggestionsHidden: true, focused: false }); - }; + const handleBlur = useCallback(() => { + setSuggestionsHidden(true); + }, [setSuggestionsHidden]); - onFocus = (e) => { - this.setState({ focused: true }); - if (this.props.onFocus) { - this.props.onFocus(e); + const handleFocus = useCallback((e) => { + if (onFocus) { + onFocus(e); } - }; + }, [onFocus]); - onSuggestionClick = (e) => { - const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index')); + const handleSuggestionClick = useCallback((e) => { + const suggestion = suggestions.get(e.currentTarget.getAttribute('data-index')); e.preventDefault(); - this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion); - this.textarea.focus(); - }; + onSuggestionSelected(tokenStartRef.current, lastTokenRef.current, suggestion); + textareaRef.current?.focus(); + }, [suggestions, onSuggestionSelected, textareaRef]); - UNSAFE_componentWillReceiveProps (nextProps) { - if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) { - this.setState({ suggestionsHidden: false }); - } - } - - setTextarea = (c) => { - this.textarea = c; - }; - - onPaste = (e) => { + const handlePaste = useCallback((e) => { if (e.clipboardData && e.clipboardData.files.length === 1) { - this.props.onPaste(e.clipboardData.files); + onPaste(e.clipboardData.files); e.preventDefault(); } - }; + }, [onPaste]); + + // Show the suggestions again whenever they change and the textarea is focused + useEffect(() => { + if (suggestions.size > 0 && textareaRef.current === document.activeElement) { + setSuggestionsHidden(false); + } + }, [suggestions, textareaRef, setSuggestionsHidden]); - renderSuggestion = (suggestion, i) => { - const { selectedSuggestion } = this.state; + const renderSuggestion = (suggestion, i) => { let inner, key; if (suggestion.type === 'emoji') { @@ -190,50 +177,64 @@ export default class AutosuggestTextarea extends ImmutablePureComponent { } return ( -
tootctl search deploy --only=%{value}
elasticsearch_preset:
- action: Lihat dokumentasi
- message_html: Kelompok Elasticsearch anda mempunyai lebih daripada satu nod, tetapi Mastodon tidak dikonfigurasikan untuk menggunakannya.
+ action: Lihat pendokumenan
+ message_html: Kelompok Elasticsearch anda mempunyai lebih daripada satu nod, tetapi Mastodon tidak ditatarajah untuk menggunakannya.
elasticsearch_preset_single_node:
- action: Lihat dokumentasi
+ action: Lihat pendokumenan
message_html: Kelompok Elasticsearch anda hanya mempunyai satu nod, ES_PRESET
hendaklah ditetapkan kepada single_node_cluster
.
elasticsearch_reset_chewy:
message_html: Indeks sistem Elasticsearch anda sudah lapuk kerana perubahan tetapan. Sila jalankan tootctl search deploy --reset-chewy
untuk mengemas kininya.
@@ -824,6 +842,12 @@ ms:
message_html: Anda belum menentukan sebarang peraturan server.
sidekiq_process_check:
message_html: Tiada proses Sidekiq berjalan untuk baris gilir %{value}. Sila semak konfigurasi Sidekiq anda
+ software_version_critical_check:
+ action: Lihat kemas kini yang tersedia
+ message_html: Kemas kini kritikal Mastodon telah tersedia, sila kemas kini secepat yang mungkin.
+ software_version_patch_check:
+ action: Lihat kemas kini yang tersedia
+ message_html: Kemas kini pembetulan pepijat Mastodon telah tersedia.
upload_check_privacy_error:
action: Semak di sini untuk maklumat lanjut
message_html: "Server web anda salah konfigurasi. Privasi pengguna anda berisiko"
@@ -933,6 +957,9 @@ ms:
body: "%{target} sedang merayu keputusan penyederhanaan sebanyak %{action_taken_by} dari %{date}, iaitu %{type}. Mereka tulis:"
next_steps: Anda boleh meluluskan rayuan untuk membuat asal keputusan penyederhanaan atau mengabaikannya.
subject: "%{username} sedang merayu keputusan penyederhanaan pada %{instance}"
+ new_critical_software_updates:
+ body: Versi kritikal baharu Mastodon telah dikeluarkan, anda mungkin ingin mengemas kini secepat yang mungkin!
+ subject: Kemas kini kritikal Mastodon telah tersedia untuk %{instance}!
new_pending_account:
body: Butiran akaun baharu ada di bawah. Anda boleh meluluskan atau menolak aplikasi ini.
subject: Akaun baharu disediakan untuk semakan pada %{instance} (%{username})
@@ -940,6 +967,9 @@ ms:
body: "%{reporter} telah melaporkan %{target}"
body_remote: Seseorang daripada %{domain} telah melaporkan %{target}
subject: Laporan baharu untuk %{instance} (#%{id})
+ new_software_updates:
+ body: Versi baharu Mastodon telah dikeluarkan, anda mungkin mahu mengemas kini!
+ subject: Versi baharu Mastodon telah tersedia untuk %{instance}!
new_trends:
body: 'Item berikut memerlukan semakan sebelum boleh dipaparkan secara terbuka:'
new_trending_links:
@@ -1053,6 +1083,7 @@ ms:
functional: Akaun anda beroperasi sepenuhnya.
pending: Permohonan anda sedang menunggu semakan oleh kakitangan kami. Ini mungkin mengambil sedikit masa. Anda akan menerima e-mel sekiranya permohonan anda diluluskan.
redirecting_to: Akaun anda tidak aktif kerana ia sedang mengubah hala ke %{acct}.
+ self_destruct: Memandangkan %{domain} akan ditutup, anda hanya akan mendapat capaian terhad kepada akaun anda.
view_strikes: Lihat pelanggaran yang lepas terhadap akaun anda
too_fast: Borang diserahkan terlalu cepat, cuba lagi.
use_security_key: Gunakan kunci keselamatan
@@ -1504,6 +1535,9 @@ ms:
over_daily_limit: Anda telah melebihi had %{limit} pos berjadual untuk hari ini
over_total_limit: Anda telah melebihi had %{limit} pos berjadual
too_soon: Tarikh yang dijadualkan mestilah pada masa hadapan
+ self_destruct:
+ lead_html: Malangnya, %{domain} akan ditutup secara kekal. Jika anda mempunyai akaun di situ, anda tidak akan dapat terus menggunakannya, tetapi anda masih boleh meminta sandaran data anda.
+ title: Pelayan ini akan ditutup
sessions:
activity: Aktiviti terakhir
browser: Pelayar
@@ -1666,9 +1700,10 @@ ms:
default: "%b %d, %Y, %H:%M"
month: "%b %Y"
time: "%H:%M"
+ with_time_zone: "%d %b %Y, %H:%M %Z"
translation:
errors:
- quota_exceeded: Kuota penggunaan seluruh server untuk perkhidmatan terjemahan telah melebihi.
+ quota_exceeded: Kuota penggunaan seluruh pelayan untuk perkhidmatan terjemahan telah berlebihan.
too_many_requests: Terdapat terlalu banyak permintaan kepada perkhidmatan terjemahan baru-baru ini.
two_factor_authentication:
add: Tambah
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index d8a1c8865687e0..2a8a59d76414d5 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -1041,14 +1041,14 @@ nl:
hint_html: Nog maar één ding! Je moet bevestigen dat je een mens bent (dit is om de spam buiten de deur te houden!). Los de onderstaande CAPTCHA op en klik op "Doorgaan".
title: Veiligheidscontrole
confirmations:
- awaiting_review: Je e-mailadres is bevestigd! De %{domain}-medewerkers zijn nu bezig met het bekijken van jouw registratie. Je ontvangt een e-mailbericht als ze jouw account goedkeuren!
+ awaiting_review: Je e-mailadres is bevestigd! De medewerkers van %{domain} zijn nu bezig met het beoordelen van jouw registratie. Je ontvangt een e-mailbericht wanneer ze jouw account goedkeuren!
awaiting_review_title: Je registratie wordt beoordeeld
- clicking_this_link: klik op deze koppeling
- login_link: aanmelden
+ clicking_this_link: op deze link te klikken
+ login_link: inloggen
proceed_to_login_html: Je kunt nu verder gaan naar %{login_link}.
redirect_to_app_html: Je zou omgeleid moeten zijn naar de %{app_name} app. Als dat niet is gebeurd, probeer dan %{clicking_this_link} of keer handmatig terug naar de app.
registration_complete: Je registratie op %{domain} is nu voltooid!
- welcome_title: Welkom, %{name}!
+ welcome_title: Welkom %{name}!
wrong_email_hint: Als dat e-mailadres niet correct is, kun je het wijzigen in je accountinstellingen.
delete_account: Account verwijderen
delete_account_html: Wanneer je jouw account graag wilt verwijderen, kun je dat hier doen. We vragen jou daar om een bevestiging.
@@ -1581,8 +1581,8 @@ nl:
over_total_limit: Je hebt de limiet van %{limit} in te plannen berichten overschreden
too_soon: De datum voor het ingeplande bericht moet in de toekomst liggen
self_destruct:
- lead_html: Helaas gaat %{domain} permanent afsluiten. Als u daar een account had, kunt u deze niet meer gebruiken, maar u kunt nog steeds een back-up van uw gegevens opvragen.
- title: Deze server gaat afsluiten
+ lead_html: Helaas gaat %{domain} permanent sluiten. Als je daar een account had, kun je deze niet meer gebruiken, maar je kunt nog steeds een back-up van je gegevens opvragen.
+ title: Deze server gaat sluiten
sessions:
activity: Laatst actief
browser: Webbrowser
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 8145002e5679c6..83c2638b516f93 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -474,6 +474,9 @@ oc:
warning: Mèfi ! Agachatz de partejar aquela donada amb degun !
your_token: Vòstre geton d’accès
auth:
+ confirmations:
+ clicking_this_link: en clicant aqueste ligam
+ welcome_title: La benvenguda %{name} !
delete_account: Suprimir lo compte
delete_account_html: Se volètz suprimir vòstre compte, podètz o far aquí. Vos demandarem que confirmetz.
description:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 08df6e7fc9f369..e02cad0395cfcf 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -1077,6 +1077,14 @@ pl:
hint_html: Jeszcze jedno! Potrzebujemy potwierdzić twoje człowieczeństwo, żeby ograniczyć spam. Rozwiąż poniższą CAPTCHA-ę i naciśnij "Kontynuuj".
title: Kontrola bezpieczeństwa
confirmations:
+ awaiting_review: Twój adres e-mail został potwierdzony! Administracja %{domain} sprawdza Twoją rejestrację. Otrzymasz e-mail w momencie, gdy zaakceptują Twoje konto!
+ awaiting_review_title: Twoja rejestracja jest obecnie sprawdzana
+ clicking_this_link: kliknąć ten link
+ login_link: zaloguj się
+ proceed_to_login_html: Teraz możesz przejść do %{login_link}.
+ redirect_to_app_html: Powinieneś zostać przekierowany do aplikacji %{app_name}. Jeśli tak się nie stało, spróbuj %{clicking_this_link} lub ręcznie wróć do aplikacji.
+ registration_complete: Twoja rejestracja na %{domain} została zakończona!
+ welcome_title: Witaj, %{name}!
wrong_email_hint: Jeśli ten adres e-mail nie jest poprawny, możesz go zmienić w ustawieniach konta.
delete_account: Usunięcie konta
delete_account_html: Jeżeli chcesz usunąć konto, przejdź tutaj. Otrzymasz prośbę o potwierdzenie.
diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml
index d8d47fee611fd2..581a66807f54f3 100644
--- a/config/locales/simple_form.he.yml
+++ b/config/locales/simple_form.he.yml
@@ -180,9 +180,9 @@ he:
bot: זהו חשבון מסוג בוט
chosen_languages: סינון שפות
confirm_new_password: אישור סיסמא חדשה
- confirm_password: אישור סיסמא
+ confirm_password: אישור סיסמה
context: סינון לפי הקשר
- current_password: סיסמא נוכחית
+ current_password: סיסמה נוכחית
data: מידע
display_name: שם להצגה
email: כתובת דוא"ל
@@ -194,10 +194,10 @@ he:
irreversible: הסרה במקום הסתרה
locale: שפה
max_uses: מספר מרבי של שימושים
- new_password: סיסמא חדשה
+ new_password: סיסמה חדשה
note: אודות
otp_attempt: קוד אימות דו-שלבי
- password: סיסמא
+ password: סיסמה
phrase: מילת מפתח או ביטוי
setting_advanced_layout: אפשר ממשק ווב מתקדם
setting_aggregate_reblogs: קבץ הדהודים זהים
diff --git a/config/locales/simple_form.ms.yml b/config/locales/simple_form.ms.yml
index c0d47ace0a14a5..79929cec5dfa07 100644
--- a/config/locales/simple_form.ms.yml
+++ b/config/locales/simple_form.ms.yml
@@ -6,10 +6,10 @@ ms:
discoverable: Siaran awam dan profil anda mungkin dipaparkan atau disyorkan dalam pelbagai kawasan Mastodon dan profil anda mungkin dicadangkan kepada pengguna lain.
display_name: Nama penuh anda atau nama anda yang menyeronokkan.
fields: Halaman utama anda, kata ganti nama, umur, apa sahaja yang anda mahukan.
- indexable: Pos awam anda mungkin muncul dalam hasil carian di Mastodon. Orang yang telah berinteraksi dengan pos anda mungkin boleh mencarinya tanpa mengira.
+ indexable: Kiriman awam anda mungkin muncul dalam hasil carian di Mastodon. Orang yang telah berinteraksi dengan kiriman anda mungkin boleh mencarinya.
note: 'Anda boleh @menyebut orang lain atau #hashtags.'
- show_collections: Orang akan dapat menyemak imbas mengikut dan pengikut anda. Orang yang anda ikuti akan melihat bahawa anda mengikuti mereka tanpa mengira.
- unlocked: Orang akan dapat mengikuti anda tanpa meminta kelulusan. Nyahtanda jika anda ingin menyemak permintaan ikuti dan pilih sama ada untuk menerima atau menolak pengikut baharu.
+ show_collections: Orang akan dapat menyemak imbas ikutan dan pengikut anda. Orang yang anda ikuti akan melihat bahawa anda tetap mengikuti mereka.
+ unlocked: Orang akan dapat mengikuti anda tanpa meminta kelulusan. Nyahtanda jika anda ingin menyemak permintaan ikutan dan pilih sama ada untuk menerima atau menolak pengikut baharu.
account_alias:
acct: Tentukan namapengguna@domain akaun yang ingin anda alihkan daripada
account_migration:
@@ -144,7 +144,7 @@ ms:
fields:
name: Label
value: Kandungan
- indexable: Sertakan pos awam dalam hasil carian
+ indexable: Termasuk kiriman awam dalam hasil carian
show_collections: Tunjukkan ikutan dan pengikut pada profil
unlocked: Terima pengikut baharu secara automatik
account_alias:
@@ -291,6 +291,12 @@ ms:
pending_account: Akaun baru memerlukan semakan
reblog: Seorang menggalakan hantaran anda
report: Laporan baru telah dihantar
+ software_updates:
+ all: Beritahu mengenai semua kemas kini
+ critical: Beritahu mengenai kemas kini kritikal sahaja
+ label: Versi baharu Mastodon kini tersedia
+ none: Tidak pernah memberitahu mengenai kemas kini (tidak disarankan)
+ patch: Beritahu mengenai kemas kini pembetulan pepijat
trending_tag: Trend baru memerlukan semakan
rule:
text: Peraturan
@@ -317,6 +323,7 @@ ms:
url: URL titik akhir
'no': Tidak
not_recommended: Tidak disyorkan
+ overridden: Ditindih
recommended: Disyorkan
required:
mark: "*"
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 00c696f6fd2f12..77ddfd6e2baedc 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -401,9 +401,11 @@ sl:
cancel: Prekliči
confirm: Suspendiraj
permanent_action: Z razveljavitvijo suzpenza ne boste obnovili nobenih podatkov ali razmerij.
+ preamble_html: Suspendirali boste %{domain} in njene poddomene.
remove_all_data: S tem boste odstranili celotno vsebino, medijske vsebine ter podatke iz profila za rčune te domene na vašem strežniku.
stop_communication: Vaš strežnik bo prenehal komunicirati s temi strežniki.
title: Potrdi domenski blok za %{domain}
+ undo_relationships: To bo prekinilo vse odnose sledenja med računi na teh strežnikih in na vašem strežniku.
created_msg: Domenski blok se sedaj obdeluje
destroyed_msg: Domenski blok je bil razveljavljen
domain: Domena
@@ -554,6 +556,7 @@ sl:
total_reported: Prijave o njih
total_storage: Predstavnostne priloge
totals_time_period_hint_html: Spodaj prikazani seštevki vključujejo podatke za celotno obdobje.
+ unknown_instance: Trenutno ne obstaja zapis te domene na tem strežniku.
invites:
deactivate_all: Onemogoči vse
filter:
@@ -767,6 +770,9 @@ sl:
branding:
preamble: Blagovna znamka vašega strežnika ga loči od drugih strežnikov v omrežju. Podatki se lahko prikžejo prek številnih okolij, kot so spletni vmesnik Mastodona, domorodni programi, predogledi povezav na drugih spletiščih, aplikacije za sporočanje itn. Zatorej je najbolje, da te podatke ohranite jasne, kratke in pomenljive.
title: Blagovne znamke
+ captcha_enabled:
+ desc_html: To se zanaša na zunanje skripte hCaptcha in lahko predstavlja tveganje za varnost in zasebnost. Poleg tega to lahko nekaterim ljudem (posebno invalidom) občutno oteži dostopnost registracijskega postopka. Zato svetujemo, da razmislite o drugih ukrepih, kot je na primer registracija na podlagi odobritve ali povabila.
+ title: Od novih uporabnikov zahtevaj reševanje CAPTCHA za potrditev računov
content_retention:
preamble: Nazdor nad hrambo vsebine uporabnikov v Mastodonu.
title: Hramba vsebin
@@ -795,13 +801,17 @@ sl:
none: Nihče se ne more prijaviti
open: Vsakdo se lahko prijavi
security:
+ authorized_fetch: Od drugih strežnikov v federaciji zahtevaj overitev pristnosti
+ authorized_fetch_hint: Zahtevanje overitve pristnosti od drugih strežnikov v federaciji omogoči strožje uveljavljanje uporabniških in strežniških blokad. Vendar je cena za to počasnejše delovanje, zmanjšanje dosega vaših odgovorov in morebitne težave z združljivostjo z nekaterimi storitvami v federaciji. Poleg tega to odločenim akterjem ne bo preprečilo pridobivanja vaših javnih objav in računov.
authorized_fetch_overridden_hint: Trenutno ne morete spremeniti te nastavitve, ker jo preglasi okoljska spremenljivka.
+ federation_authentication: Izvršba overitve pristnosti v federaciji
title: Nastavitve strežnika
site_uploads:
delete: Izbriši naloženo datoteko
destroyed_msg: Prenos na strežnik uspešno izbrisan!
software_updates:
critical_update: Kritično — čim prej posodobite
+ description: Vašo namestitev Mastodona je priporočeno vedno imeti posodobljeno in tako koristiti najnovejše popravke ter zmožnosti. Poleg tega je včasih nujno čim prej posodobiti Mastodon in se s tem izogniti varnostnim težavam. Zato Mastodon vsakih 30 minut preverja razpoložljivost posodobitev in vas o njih obvešča glede na vaše nastavitve obveščanja po e-pošti.
documentation_link: Več o tem
release_notes: Opombe ob izdaji
title: Razpoložljive posodobitve
@@ -851,10 +861,20 @@ sl:
system_checks:
database_schema_check:
message_html: Na čakanju so migracije zbirke podatkov. Prosimo, izvedite jih, da zagotovite, da se program vede pričakovano
+ elasticsearch_health_red:
+ message_html: Z gručo Elasticsearch ni vse v redu (rdeče stanje), zmožnosti iskanja niso na voljo
+ elasticsearch_health_yellow:
+ message_html: Z gručo Elasticsearch ni vse v redu (rumeno stanje), priporočeno je ugotoviti razlog
+ elasticsearch_index_mismatch:
+ message_html: Preslikave kazala Elasticsearch so zastarele. Poženite tootctl search deploy --only=%{value}
elasticsearch_preset:
action: Glejte dokumentacijo
+ message_html: Vaša gruča Elasticsearch vsebuje več kot eno vozlišče, vendar Mastodon ni nastavljen, da bi jih uporabljal.
elasticsearch_preset_single_node:
action: Glejte dokumentacijo
+ message_html: Vaša gruča Elasticsearch vsebuje samo eno vozlišče, ES_PRESET
bi moralo biti nastavljeno na single_node_cluster
.
+ elasticsearch_reset_chewy:
+ message_html: Sistemsko kazalo Elasticsearch je zastarelo zaradi spremembe nastavitve. Za posodobitev poženite tootctl search deploy --reset-chewy
.
elasticsearch_running_check:
message_html: Povezava z Elasticsearch ni uspela. Preverite, da deluje, ali onemogočite iskanje po vsem besedilu
elasticsearch_version_check:
@@ -867,6 +887,7 @@ sl:
message_html: Noben proces Sidekiq ne poteka za %{value} vrst. Preglejte svojo prilagoditev Sidekiq
software_version_critical_check:
action: Glejte razpoložljive posodobitve
+ message_html: Na voljo je kritična posodobitev Mastodona. Posodobite čim prej.
software_version_patch_check:
action: Glejte razpoložljive posodobitve
message_html: Na voljo je posodobitev Mastodona s popravki hroščev.
@@ -991,6 +1012,9 @@ sl:
body: "%{target} se pritožuje na moderatorsko odločitev %{action_taken_by} z dne %{date}, ki je bila %{type}. Zapisal/a je:"
next_steps: Pritožbi lahko ugodite in s tem razveljavite moderatorsko odločitev ali pa jo prezrete.
subject: "%{username} se je pritožil na moderatorsko odločitev na %{instance}"
+ new_critical_software_updates:
+ body: Izdane so bile nove kritične različice Mastodona. Priporočena je čimprejšnja posodobitev.
+ subject: Za %{instance} so na voljo kritične posodobitve Mastodona!
new_pending_account:
body: Podrobnosti o novem računu so navedene spodaj. To aplikacijo lahko odobrite ali zavrnete.
subject: Nov račun za pregled na %{instance} (%{username})
@@ -998,6 +1022,9 @@ sl:
body: "%{reporter} je prijavil %{target}"
body_remote: Nekdo iz %{domain} je prijavil %{target}
subject: Nove prijave za %{instance} (#%{id})
+ new_software_updates:
+ body: Izdane so bile nove različice Mastodona. Priporočena je posodobitev.
+ subject: Za %{instance} so na voljo nove različice Mastodona.
new_trends:
body: 'Naslednji elementi potrebujejo pregled, preden jih je možno javno prikazati:'
new_trending_links:
@@ -1046,8 +1073,18 @@ sl:
auth:
apply_for_account: Zaprosite za račun
captcha_confirmation:
+ help_html: Če imate težave pri reševanju CAPTCHA, lahko prek %{email} stopite v stik z nami in pomagali vam bomo.
+ hint_html: Samo še nekaj. Moramo se prepričati, da ste človek (to nam pomaga pri preprečevanju neželenih vsebin). Rešite spodnji CAPTCHA in kliknite »Nadaljuj«.
title: Varnostno preverjanje
confirmations:
+ awaiting_review: Vaš e-poštni naslov je potrjen. Skrbniki %{domain} bodo pregledali vašo prijavo. Če odobrijo vaš račun, boste o tem prejeli e-pošto.
+ awaiting_review_title: Vaša prijava se pregleduje
+ clicking_this_link: s klikom na to povezavo
+ login_link: prijavo
+ proceed_to_login_html: Sedaj lahko nadaljujete na %{login_link}.
+ redirect_to_app_html: Morali bi biti preusmerjeni na aplikacijo %{app_name}. Če se to ni zgodilo, poskusite %{clicking_this_link} ali pa se ročno vrnite na aplikacijo.
+ registration_complete: Vaša prijava na %{domain} je sedaj zaključena.
+ welcome_title: Pozdravljeni, %{name}!
wrong_email_hint: Če ta e-poštni naslov ni pravilen, ga lahko spremenite v nastavitvah računa.
delete_account: Izbriši račun
delete_account_html: Če želite izbrisati svoj račun, lahko nadaljujete tukaj. Prosili vas bomo za potrditev.
@@ -1083,7 +1120,9 @@ sl:
rules:
accept: Sprejmi
back: Nazaj
+ invited_by: "%{domain} se lahko pridružite zahvaljujoč povabilu, ki ste ga prejeli od:"
preamble: Slednje določajo in njihovo spoštovanje zagotavljajo moderatorji %{domain}.
+ preamble_invited: Preden nadaljujete, si preberite osnovna pravila, ki so jih postavili moderatorji na %{domain}.
title: Nekaj osnovnih pravil.
title_invited: Ste povabljeni.
security: Varnost
@@ -1107,6 +1146,7 @@ sl:
functional: Vaš račun je polno opravilen.
pending: Naše osebje preverja vašo prijavo. To lahko traja nekaj časa. Če bo vaša prijava odobrena, boste prejeli e-pošto.
redirecting_to: Vaš račun ni dejaven, ker trenutno preusmerja na račun %{acct}.
+ self_destruct: Ker se %{domain} zapira, boste imeli omejen dostop da svojega računa.
view_strikes: Pokaži pretekle ukrepe proti mojemu računu
too_fast: Obrazec oddan prehitro, poskusite znova.
use_security_key: Uporabi varnostni ključ
@@ -1188,6 +1228,7 @@ sl:
invalid_domain: ni veljavno ime domene
edit_profile:
basic_information: Osnovni podatki
+ hint_html: "Prilagodite, kaj ljudje vidijo na vašem javnem profilu in poleg vaših objav. Drugi vam bodo raje sledili nazaj in z vami klepetali, če boste imeli izpolnjen profil in nastavljeno profilno sliko."
other: Drugo
errors:
'400': Zahteva, ki ste jo oddali, je neveljavna ali nepravilno oblikovana.
@@ -1322,6 +1363,20 @@ sl:
merge_long: Ohrani obstoječe zapise in dodaj nove
overwrite: Prepiši
overwrite_long: Zamenjaj trenutne zapise z novimi
+ overwrite_preambles:
+ blocking_html: Svoj seznam blokiranih računov boste nadomestili z največ %{total_items} računi iz %{filename}.
+ bookmarks_html: Svoje zaznamke boste nadomestili z največ %{total_items} objavami iz %{filename}.
+ domain_blocking_html: Svoj seznam blokiranih domen boste nadomestili z največ %{total_items} domenami iz %{filename}.
+ following_html: "Začeli boste slediti največ %{total_items} računom iz %{filename} in prenehali slediti vsem ostalim."
+ lists_html: Svoje sezname boste nadomestili z vsebino datoteke %{filename}. Največ %{total_items} računov bo dodanih na nove sezname.
+ muting_html: Svoj seznam utišanih računov boste nadomestili z največ %{total_items} računi iz %{filename}.
+ preambles:
+ blocking_html: "Blokirali boste največ %{total_items} računov iz %{filename}."
+ bookmarks_html: "Med zaznamke boste dodali boste največ %{total_items} objav iz %{filename}."
+ domain_blocking_html: "Blokirali boste največ %{total_items} domen iz %{filename}."
+ following_html: "Začeli boste slediti največ %{total_items} računom iz %{filename}."
+ lists_html: Dodali boste največ %{total_items} računov iz %{filename} na svoje sezname. Po potrebi bodo ustvarjeni novi seznami.
+ muting_html: "Utišali boste največ %{total_items} računov iz %{filename}."
preface: Podatke, ki ste jih izvozili iz drugega strežnika, lahko uvozite. Na primer seznam oseb, ki jih spremljate ali blokirate.
recent_imports: Nedavni uvozi
states:
@@ -1393,6 +1448,7 @@ sl:
unsubscribe:
action: Da, odjavi me
complete: Odjavljeni
+ confirmation_html: Ali se res želite odjaviti od prejemanja %{type} za Mastodon na %{domain} na svojo e-pošto %{email}? Kadarkoli se lahko znova prijavite iz svojih nastavitev e-poštnih obvestil.
emails:
notification_emails:
favourite: e-sporočil z obvestili o priljubljenosti
@@ -1400,6 +1456,7 @@ sl:
follow_request: e-sporočil o zahtevah za sledenje
mention: e-sporočil z obvestili o omembah
reblog: e-sporočil z obvestili o izpostavljanju
+ resubscribe_html: Če ste se odjavili po pomoti, se lahko znova prijavite iz svojih nastavitev e-poštnih obvestil.
success_html: Nič več ne boste prejemali %{type} za Mastodon na %{domain} na svoj e-naslov %{email}.
title: Odjavi od naročnine
media_attachments:
@@ -1526,9 +1583,13 @@ sl:
posting_defaults: Privzete nastavitev objavljanja
public_timelines: Javne časovnice
privacy:
+ hint_html: "Prilagodite, kako lahko drugi najdejo vaš profil in vaše objave. V Mastodonu obstaja več zmožnosti, ki vam pomagajo doseči širše občinstvo, če so omogočene. Vzemite si čas in preverite, ali te nastavitve ustrezajo vašemu namenu uporabe."
privacy: Zasebnost
+ privacy_hint_html: Nadzorujte, koliko informacij želite razkriti drugim. Ljudje lahko zanimive profile in aplikacije odkrijejo z brskanjem po seznamih sledenih in ko vidijo katere programe drugi uporabljajo za objavljanje. Morda pa bi to želeli skriti in varovati zasebnost.
reach: Dosegljivost
+ reach_hint_html: Nadzorujte, ali želite, da vas drugi ljudje najdejo in vam pričnejo slediti. Ali želite, da se vaše objave prikažejo na strani Razišči? Ali želite, da vas drugi ljudje vidijo med predlogi za sledenje? Ali želite nove sledilce odobriti samodejno, ali vsakega posebej odobriti ročno?
search: Iskanje
+ search_hint_html: Nadzorujte, kako želite, da vas najdejo. Ali želite, da vas ljudje najdejo po javnih objavah? Ali želite, da ljudje, ki niso na Mastodonu, lahko najdejo vaš profil med iskanjem po spletu? Vedite, da javnih objav in podatkov ni mogoče povsem izvzeti iz podatkovnih zbirk vseh spletnih iskalnikov.
title: Zasebnost in dosegljivost
privacy_policy:
title: Pravilnik o zasebnosti
@@ -1571,6 +1632,9 @@ sl:
over_daily_limit: Za ta dan ste presegli omejitev %{limit} načrtovanih objav
over_total_limit: Presegli ste omejitev %{limit} načrtovanih objav
too_soon: Načrtovani datum mora biti v prihodnosti
+ self_destruct:
+ lead_html: Na žalost se %{domain} za vedno zapira. Če ste tu imeli svoj račun, ga v prihodnje ne boste mogli več uporabljati. Zahtevate lahko kopijo svojih podatkov.
+ title: Ta strežnik se zapira
sessions:
activity: Zadnja dejavnost
browser: Brskalnik
@@ -1752,6 +1816,10 @@ sl:
month: "%b %Y"
time: "%H:%M"
with_time_zone: "%d. %b. %Y %H:%M %Z"
+ translation:
+ errors:
+ quota_exceeded: Kvota uporabe prevajalne storitve za ta strežnik je bila presežena.
+ too_many_requests: V zadnjem času je prevajalna storitev prejela preveč zahtevkov.
two_factor_authentication:
add: Dodaj
disable: Onemogoči
@@ -1837,7 +1905,9 @@ sl:
seamless_external_login: Prijavljeni ste prek zunanje storitve, tako da nastavitve gesla in e-pošte niso na voljo.
signed_in_as: 'Vpisani kot:'
verification:
+ extra_instructions_html: Nasvet: Povezava na vaši spletni strani je lahko nevidna. Pomembni del je atribut rel="me"
, ki preprečuje lažno predstavljanje na spletnih straneh z uporabniško ustvarjeno vsebino. Namesto oznake a
lahko uporabite tudi oznako link
znotraj glave (head
) spletne strani, vendar mora biti HTML dosegljiv brez izvajanja skript JavaScript.
here_is_how: Kako to poteka
+ hint_html: "Vsakdo lahko potrdi svojo istovetnost na Mastodonu. To temelji na odprtih spletnih standardih in je sedaj in za vedno brezplačno. Potrebujete le osebno spletno stran, po kateri vas ljudje prepoznajo. Ko na svoj profil dodate povezavo na to osebno spletno stran, bo Mastodon preveril, ali na njej obstaja povezava nazaj na profil. Če ta obstaja, bo to vidno na profiu."
instructions_html: Spodnjo kodo kopirajte in prilepite v HTML svojega spletnega mesta. Nato dodajte naslov svoje spletne strani v eno od dodatnih polj v svojem profilu v zavihku »Uredi profil« in shranite spremembe.
verification: Potrditev
verified_links: Vaše preverjene povezave
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 74810b147a5b8e..e4fb811ce318dd 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -1035,6 +1035,14 @@ sq:
hint_html: Edhe një gjë tjetër! Na duhet të ripohoni se jeni qenie njerëzore (që të mbajmë larg mesazhe të padëshiruar!). Zgjidhni CAPTCHA-n më poshtë dhe klikoni mbi “Vazhdo”.
title: Kontroll sigurie
confirmations:
+ awaiting_review: Adresa juaj email u ripohua! Ekipi i %{domain} stani po bën regjistrimin tuaj. Nëse e miratojnë llogarinë tuaj, do të merrni një email!
+ awaiting_review_title: Regjistrimi juaj po merret në shqyrtim
+ clicking_this_link: duke klikuar këtë lidhje
+ login_link: hyni
+ proceed_to_login_html: Tani mund të vazhdoni të %{login_link}.
+ redirect_to_app_html: Duhet të ishit ridrejtuar te aplikacioni %{app_name}. Nëse s’ndodhi, provoni %{clicking_this_link}, ose të ktheheni dorazi te aplikacioni.
+ registration_complete: Tanimë është plotësuar regjistrimi juaj në %{domain}!
+ welcome_title: Mirë se vini, %{name}!
wrong_email_hint: Nëse ajo adresë email s’është e saktë, mund ta ndryshoni te rregullimet e llogarisë.
delete_account: Fshije llogarinë
delete_account_html: Nëse dëshironi të fshihni llogarinë tuaj, mund ta bëni që këtu. Do t’ju kërkohet ta ripohoni.
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 1d84f8a6af0b3d..a6ee12ba2794f6 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -1044,6 +1044,8 @@ sv:
awaiting_review_title: Din registrering är under granskning
clicking_this_link: klicka på denna länk
login_link: logga in
+ proceed_to_login_html: Du kan nu fortsätta med att %{login_link}.
+ redirect_to_app_html: Du borde ha omdirigerats till appen %{app_name}. Om det inte hände, försök att %{clicking_this_link} eller återgå manuellt till appen.
registration_complete: Din registrering på %{domain} är nu slutförd!
welcome_title: Välkommen %{name}!
wrong_email_hint: Om e-postadressen inte är rätt, kan du ändra den i kontoinställningarna.
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 79ec13571d57c4..ec8f6c1395a966 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -1023,6 +1023,14 @@ vi:
hint_html: Còn một xíu nữa! Chúng tôi cần xác minh bạn là con người (để chúng tôi có thể ngăn chặn thư rác!). Nhập CAPTCHA bên dưới và nhấn "Tiếp tục".
title: Kiểm tra an toàn
confirmations:
+ awaiting_review: Đã xác minh email của bạn! Kiểm duyệt viên %{domain} đang xem xét đăng ký của bạn. Bạn sẽ nhận được một email nếu tài khoản của bạn được duyệt!
+ awaiting_review_title: Đăng ký của bạn đang chờ duyệt
+ clicking_this_link: nhấn vào link này
+ login_link: đăng nhập
+ proceed_to_login_html: Bạn có thể tiếp tục %{login_link}.
+ redirect_to_app_html: Bạn đã có thể chuyển tiếp tới %{app_name}. Nếu không có gì xảy ra, thử %{clicking_this_link} hoặc tự quay lại app.
+ registration_complete: Hoàn tất đăng ký trên %{domain}!
+ welcome_title: Chào mừng, %{name}!
wrong_email_hint: Nếu địa chỉ email đó không chính xác, bạn có thể thay đổi nó trong cài đặt tài khoản.
delete_account: Xóa tài khoản
delete_account_html: Nếu bạn muốn xóa tài khoản của mình, hãy yêu cầu tại đây. Bạn sẽ được yêu cầu xác nhận.
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 9d75f50a50560e..7bcc133964f06b 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -1027,7 +1027,7 @@ zh-TW:
confirmations:
awaiting_review: 已驗證您的電子郵件!%{domain} 的管理員正在審核您的註冊申請。若您的帳號通過審核,您將收到電子郵件通知。
awaiting_review_title: 我們正在審核您的註冊申請
- clicking_this_link: 點擊這個連結
+ clicking_this_link: 點擊此連結
login_link: 登入
proceed_to_login_html: 您現在可以前往 %{login_link}。
redirect_to_app_html: 您應被重新導向至 %{app_name} 應用程式。如尚未重新導向,請嘗試 %{clicking_this_link} 或手動回到應用程式。
diff --git a/config/webpack/rules/node_modules.js b/config/webpack/rules/node_modules.js
index 89c9d422d3ee2a..8dbf92adb7603c 100644
--- a/config/webpack/rules/node_modules.js
+++ b/config/webpack/rules/node_modules.js
@@ -4,11 +4,7 @@ const { settings, env } = require('../configuration');
module.exports = {
test: /\.(js|mjs)$/,
- include: /node_modules/,
- exclude: [
- /@babel(?:\/|\\{1,2})runtime/,
- /tesseract.js/,
- ],
+ include: /node_modules\/@hello-pangea/,
use: [
{
loader: 'babel-loader',
diff --git a/config/webpack/tests.js b/config/webpack/tests.js
deleted file mode 100644
index e6a8f1c2a95f12..00000000000000
--- a/config/webpack/tests.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// Note: You must restart bin/webpack-dev-server for changes to take effect
-
-const { merge } = require('webpack-merge');
-
-const sharedConfig = require('./shared');
-
-module.exports = merge(sharedConfig, {
- mode: 'production',
-});
diff --git a/package.json b/package.json
index 0e9dd358945212..c02c00bdddf1eb 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,6 @@
"@reduxjs/toolkit": "^1.9.5",
"@renchap/compression-webpack-plugin": "^6.1.4",
"@svgr/webpack": "^5.5.0",
- "abortcontroller-polyfill": "^1.7.5",
"arrow-key-navigation": "^1.2.0",
"async-mutex": "^0.4.0",
"autoprefixer": "^10.4.14",
diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb
index 782e460a4276fd..b57ec671416164 100644
--- a/spec/controllers/admin/accounts_controller_spec.rb
+++ b/spec/controllers/admin/accounts_controller_spec.rb
@@ -285,7 +285,10 @@
let(:current_user) { Fabricate(:user, role: role) }
let(:account) { Fabricate(:account, suspended: true) }
- let!(:email_block) { Fabricate(:canonical_email_block, reference_account: account) }
+
+ before do
+ _email_block = Fabricate(:canonical_email_block, reference_account: account)
+ end
context 'when user is admin' do
let(:role) { UserRole.find_by(name: 'Admin') }
diff --git a/spec/controllers/admin/action_logs_controller_spec.rb b/spec/controllers/admin/action_logs_controller_spec.rb
index 044ddf2c420c5b..b7854469dd9093 100644
--- a/spec/controllers/admin/action_logs_controller_spec.rb
+++ b/spec/controllers/admin/action_logs_controller_spec.rb
@@ -8,8 +8,8 @@
# Action logs typically cause issues when their targets are not in the database
let!(:account) { Fabricate(:account) }
- let!(:orphaned_logs) do
- %w(
+ before do
+ _orphaned_logs = %w(
Account User UserRole Report DomainBlock DomainAllow
EmailDomainBlock UnavailableDomain Status AccountWarning
Announcement IpBlock Instance CustomEmoji CanonicalEmailBlock Appeal
diff --git a/spec/controllers/admin/instances_controller_spec.rb b/spec/controllers/admin/instances_controller_spec.rb
index 5fed5d98d2a43d..74d69d1aaa1c08 100644
--- a/spec/controllers/admin/instances_controller_spec.rb
+++ b/spec/controllers/admin/instances_controller_spec.rb
@@ -8,10 +8,10 @@
let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
let!(:account_popular_main) { Fabricate(:account, domain: 'popular') }
- let!(:account_popular_other) { Fabricate(:account, domain: 'popular') }
- let!(:account_less_popular) { Fabricate(:account, domain: 'less.popular') }
before do
+ _account_less_popular = Fabricate(:account, domain: 'less.popular')
+ _account_popular_other = Fabricate(:account, domain: 'popular')
sign_in current_user, scope: :user
end
diff --git a/spec/controllers/admin/reports/actions_controller_spec.rb b/spec/controllers/admin/reports/actions_controller_spec.rb
index 1f3951516d9480..06d4b31f54e469 100644
--- a/spec/controllers/admin/reports/actions_controller_spec.rb
+++ b/spec/controllers/admin/reports/actions_controller_spec.rb
@@ -54,13 +54,16 @@
describe 'POST #create' do
let(:target_account) { Fabricate(:account) }
let(:statuses) { [Fabricate(:status, account: target_account), Fabricate(:status, account: target_account)] }
- let!(:media) { Fabricate(:media_attachment, account: target_account, status: statuses[0]) }
let(:report) { Fabricate(:report, target_account: target_account, status_ids: statuses.map(&:id)) }
let(:text) { 'hello' }
let(:common_params) do
{ report_id: report.id, text: text }
end
+ before do
+ _media = Fabricate(:media_attachment, account: target_account, status: statuses[0])
+ end
+
shared_examples 'common behavior' do
it 'closes the report and redirects' do
expect { subject }.to mark_report_action_taken.and create_target_account_strike
@@ -122,14 +125,17 @@ def create_target_account_strike
let(:action) { 'mark_as_sensitive' }
let(:statuses) { [media_attached_status, media_attached_deleted_status] }
- let!(:status) { Fabricate(:status, account: target_account) }
let(:media_attached_status) { Fabricate(:status, account: target_account) }
- let!(:media_attachment) { Fabricate(:media_attachment, account: target_account, status: media_attached_status) }
let(:media_attached_deleted_status) { Fabricate(:status, account: target_account, deleted_at: 1.day.ago) }
- let!(:media_attachment2) { Fabricate(:media_attachment, account: target_account, status: media_attached_deleted_status) }
let(:last_media_attached_status) { Fabricate(:status, account: target_account) }
- let!(:last_media_attachment) { Fabricate(:media_attachment, account: target_account, status: last_media_attached_status) }
- let!(:last_status) { Fabricate(:status, account: target_account) }
+
+ before do
+ _last_media_attachment = Fabricate(:media_attachment, account: target_account, status: last_media_attached_status)
+ _last_status = Fabricate(:status, account: target_account)
+ _media_attachment = Fabricate(:media_attachment, account: target_account, status: media_attached_status)
+ _media_attachment2 = Fabricate(:media_attachment, account: target_account, status: media_attached_deleted_status)
+ _status = Fabricate(:status, account: target_account)
+ end
it_behaves_like 'common behavior'
diff --git a/spec/controllers/admin/statuses_controller_spec.rb b/spec/controllers/admin/statuses_controller_spec.rb
index 9befdf978f9822..dc5e28e9727147 100644
--- a/spec/controllers/admin/statuses_controller_spec.rb
+++ b/spec/controllers/admin/statuses_controller_spec.rb
@@ -9,13 +9,14 @@
let(:account) { Fabricate(:account) }
let!(:status) { Fabricate(:status, account: account) }
let(:media_attached_status) { Fabricate(:status, account: account, sensitive: !sensitive) }
- let!(:media_attachment) { Fabricate(:media_attachment, account: account, status: media_attached_status) }
let(:last_media_attached_status) { Fabricate(:status, account: account, sensitive: !sensitive) }
- let!(:last_media_attachment) { Fabricate(:media_attachment, account: account, status: last_media_attached_status) }
- let!(:last_status) { Fabricate(:status, account: account) }
let(:sensitive) { true }
before do
+ _last_media_attachment = Fabricate(:media_attachment, account: account, status: last_media_attached_status)
+ _last_status = Fabricate(:status, account: account)
+ _media_attachment = Fabricate(:media_attachment, account: account, status: media_attached_status)
+
sign_in user, scope: :user
end
diff --git a/spec/features/admin/domain_blocks_spec.rb b/spec/features/admin/domain_blocks_spec.rb
index 0d7b90c21cd5d2..4379ac91dbabb5 100644
--- a/spec/features/admin/domain_blocks_spec.rb
+++ b/spec/features/admin/domain_blocks_spec.rb
@@ -4,6 +4,7 @@
describe 'blocking domains through the moderation interface' do
before do
+ allow(DomainBlockWorker).to receive(:perform_async).and_return(true)
sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
end
@@ -16,6 +17,7 @@
click_button I18n.t('admin.domain_blocks.new.create')
expect(DomainBlock.exists?(domain: 'example.com', severity: 'silence')).to be true
+ expect(DomainBlockWorker).to have_received(:perform_async)
end
end
@@ -27,13 +29,15 @@
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('admin.domain_blocks.new.create')
- # It presents a confirmation screen
+ # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
+ expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming creates a block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm')
expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be true
+ expect(DomainBlockWorker).to have_received(:perform_async)
end
end
@@ -47,13 +51,15 @@
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('admin.domain_blocks.new.create')
- # It presents a confirmation screen
+ # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
+ expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming updates the block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm')
expect(domain_block.reload.severity).to eq 'suspend'
+ expect(DomainBlockWorker).to have_received(:perform_async)
end
end
@@ -67,13 +73,15 @@
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('admin.domain_blocks.new.create')
- # It presents a confirmation screen
+ # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'subdomain.example.com'))
+ expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming creates the block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm')
expect(DomainBlock.where(domain: 'subdomain.example.com', severity: 'suspend')).to exist
+ expect(DomainBlockWorker).to have_received(:perform_async)
# And leaves the previous block alone
expect(domain_block.reload.severity).to eq 'silence'
@@ -90,11 +98,13 @@
select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity'
click_button I18n.t('generic.save_changes')
- # It presents a confirmation screen
+ # It doesn't immediately block but presents a confirmation screen
expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com'))
+ expect(DomainBlockWorker).to_not have_received(:perform_async)
# Confirming updates the block
click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm')
+ expect(DomainBlockWorker).to have_received(:perform_async)
expect(domain_block.reload.severity).to eq 'suspend'
end
diff --git a/yarn.lock b/yarn.lock
index b3aea91e1eeb93..750a4fb7eb1aba 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2525,9 +2525,9 @@
"@types/react" "*"
"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.9.11", "@types/react@^18.0.26", "@types/react@^18.2.7":
- version "18.2.31"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.31.tgz#74ae2630e4aa9af599584157abd3b95d96fb9b40"
- integrity sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==
+ version "18.2.33"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.33.tgz#055356243dc4350a9ee6c6a2c07c5cae12e38877"
+ integrity sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
@@ -2917,11 +2917,6 @@ abort-controller@^3.0.0:
dependencies:
event-target-shim "^5.0.0"
-abortcontroller-polyfill@^1.7.5:
- version "1.7.5"
- resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed"
- integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==
-
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
@@ -3423,9 +3418,9 @@ axe-core@^4.6.2:
integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==
axios@^1.4.0:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f"
- integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102"
+ integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
@@ -4424,9 +4419,9 @@ core-js@^2.5.0:
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.30.2:
- version "3.33.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.1.tgz#ef3766cfa382482d0a2c2bc5cb52c6d88805da52"
- integrity sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==
+ version "3.33.2"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.2.tgz#312bbf6996a3a517c04c99b9909cdd27138d1ceb"
+ integrity sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==
core-util-is@~1.0.0:
version "1.0.3"
@@ -10095,9 +10090,9 @@ punycode@1.4.1, punycode@^1.2.4, punycode@^1.4.1:
integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==
punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
- integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
pure-rand@^6.0.0:
version "6.0.2"