1
0
mirror of https://github.com/funamitech/mastodon synced 2024-11-27 06:18:53 +09:00

Merge pull request #2835 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes up to fe04291af4
This commit is contained in:
Claire 2024-09-04 23:01:53 +02:00 committed by GitHub
commit 5a1d7db309
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
485 changed files with 1195 additions and 802 deletions

View File

@ -11,5 +11,8 @@ RUN apt-get update && \
export DEBIAN_FRONTEND=noninteractive && \
apt-get -y install --no-install-recommends libicu-dev libidn11-dev ffmpeg imagemagick libvips42 libpam-dev
# Disable download prompt for Corepack
ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
# Move welcome message to where VS Code expects it
COPY .devcontainer/welcome-message.txt /usr/local/etc/vscode-dev-containers/first-run-notice.txt

View File

@ -39,7 +39,7 @@
},
"onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
"postCreateCommand": "COREPACK_ENABLE_DOWNLOAD_PROMPT=0 bin/setup",
"postCreateCommand": "bin/setup",
"waitFor": "postCreateCommand",
"customizations": {

View File

@ -1 +1 @@
3.3.4
3.3.5

View File

@ -100,17 +100,17 @@ GEM
attr_required (1.0.2)
awrence (1.2.1)
aws-eventstream (1.3.0)
aws-partitions (1.969.0)
aws-sdk-core (3.202.1)
aws-partitions (1.970.0)
aws-sdk-core (3.203.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.9)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.88.0)
aws-sdk-core (~> 3, >= 3.201.0)
aws-sdk-kms (1.89.0)
aws-sdk-core (~> 3, >= 3.203.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.159.0)
aws-sdk-core (~> 3, >= 3.201.0)
aws-sdk-s3 (1.160.0)
aws-sdk-core (~> 3, >= 3.203.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.9.1)
@ -790,7 +790,7 @@ GEM
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
semantic_range (3.0.0)
shoulda-matchers (6.3.1)
shoulda-matchers (6.4.0)
activesupport (>= 5.2.0)
sidekiq (6.5.12)
connection_pool (>= 2.2.5, < 3)
@ -837,7 +837,7 @@ GEM
unicode-display_width (>= 1.1.1, < 3)
terrapin (1.0.1)
climate_control
test-prof (1.4.1)
test-prof (1.4.2)
thor (1.3.2)
tilt (2.4.0)
timeout (0.4.1)

View File

@ -77,6 +77,8 @@ class Api::V2Alpha::NotificationsController < Api::BaseController
end
def load_grouped_notifications
return [] if @notifications.empty?
MastodonOTELTracer.in_span('Api::V2Alpha::NotificationsController#load_grouped_notifications') do
NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types])
end

View File

@ -18,7 +18,7 @@ import {
selectSettingsNotificationsQuickFilterActive,
selectSettingsNotificationsShows,
} from 'flavours/glitch/selectors/settings';
import type { AppDispatch } from 'flavours/glitch/store';
import type { AppDispatch, RootState } from 'flavours/glitch/store';
import {
createAppAsyncThunk,
createDataLoadingThunk,
@ -32,6 +32,14 @@ function excludeAllTypesExcept(filter: string) {
return allNotificationTypes.filter((item) => item !== filter);
}
function getExcludedTypes(state: RootState) {
const activeFilter = selectSettingsNotificationsQuickFilterActive(state);
return activeFilter === 'all'
? selectSettingsNotificationsExcludedTypes(state)
: excludeAllTypesExcept(activeFilter);
}
function dispatchAssociatedRecords(
dispatch: AppDispatch,
notifications: ApiNotificationGroupJSON[] | ApiNotificationJSON[],
@ -62,17 +70,8 @@ function dispatchAssociatedRecords(
export const fetchNotifications = createDataLoadingThunk(
'notificationGroups/fetch',
async (_params, { getState }) => {
const activeFilter =
selectSettingsNotificationsQuickFilterActive(getState());
return apiFetchNotifications({
exclude_types:
activeFilter === 'all'
? selectSettingsNotificationsExcludedTypes(getState())
: excludeAllTypesExcept(activeFilter),
});
},
async (_params, { getState }) =>
apiFetchNotifications({ exclude_types: getExcludedTypes(getState()) }),
({ notifications, accounts, statuses }, { dispatch }) => {
dispatch(importFetchedAccounts(accounts));
dispatch(importFetchedStatuses(statuses));
@ -92,9 +91,11 @@ export const fetchNotifications = createDataLoadingThunk(
export const fetchNotificationsGap = createDataLoadingThunk(
'notificationGroups/fetchGap',
async (params: { gap: NotificationGap }) =>
apiFetchNotifications({ max_id: params.gap.maxId }),
async (params: { gap: NotificationGap }, { getState }) =>
apiFetchNotifications({
max_id: params.gap.maxId,
exclude_types: getExcludedTypes(getState()),
}),
({ notifications, accounts, statuses }, { dispatch }) => {
dispatch(importFetchedAccounts(accounts));
dispatch(importFetchedStatuses(statuses));
@ -109,6 +110,7 @@ export const pollRecentNotifications = createDataLoadingThunk(
async (_params, { getState }) => {
return apiFetchNotifications({
max_id: undefined,
exclude_types: getExcludedTypes(getState()),
// In slow mode, we don't want to include notifications that duplicate the already-displayed ones
since_id: usePendingItems
? getState().notificationGroups.groups.find(
@ -183,7 +185,6 @@ export const setNotificationsFilter = createAppAsyncThunk(
path: ['notifications', 'quickFilter', 'active'],
value: filterType,
});
// dispatch(expandNotifications({ forceLoad: true }));
void dispatch(fetchNotifications());
dispatch(saveSettings());
},

View File

@ -42,19 +42,11 @@ export const NotificationAdminReport: React.FC<{
if (!account || !targetAccount) return null;
const domain = account.acct.split('@')[1];
const values = {
name: (
<bdi
dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }}
/>
),
target: (
<bdi
dangerouslySetInnerHTML={{
__html: targetAccount.get('display_name_html'),
}}
/>
),
name: <bdi>{domain ?? `@${account.acct}`}</bdi>,
target: <bdi>@{targetAccount.acct}</bdi>,
category: intl.formatMessage(messages[report.category]),
count: report.status_ids.length,
};

View File

@ -18,7 +18,7 @@ import {
selectSettingsNotificationsQuickFilterActive,
selectSettingsNotificationsShows,
} from 'mastodon/selectors/settings';
import type { AppDispatch } from 'mastodon/store';
import type { AppDispatch, RootState } from 'mastodon/store';
import {
createAppAsyncThunk,
createDataLoadingThunk,
@ -32,6 +32,14 @@ function excludeAllTypesExcept(filter: string) {
return allNotificationTypes.filter((item) => item !== filter);
}
function getExcludedTypes(state: RootState) {
const activeFilter = selectSettingsNotificationsQuickFilterActive(state);
return activeFilter === 'all'
? selectSettingsNotificationsExcludedTypes(state)
: excludeAllTypesExcept(activeFilter);
}
function dispatchAssociatedRecords(
dispatch: AppDispatch,
notifications: ApiNotificationGroupJSON[] | ApiNotificationJSON[],
@ -62,17 +70,8 @@ function dispatchAssociatedRecords(
export const fetchNotifications = createDataLoadingThunk(
'notificationGroups/fetch',
async (_params, { getState }) => {
const activeFilter =
selectSettingsNotificationsQuickFilterActive(getState());
return apiFetchNotifications({
exclude_types:
activeFilter === 'all'
? selectSettingsNotificationsExcludedTypes(getState())
: excludeAllTypesExcept(activeFilter),
});
},
async (_params, { getState }) =>
apiFetchNotifications({ exclude_types: getExcludedTypes(getState()) }),
({ notifications, accounts, statuses }, { dispatch }) => {
dispatch(importFetchedAccounts(accounts));
dispatch(importFetchedStatuses(statuses));
@ -92,9 +91,11 @@ export const fetchNotifications = createDataLoadingThunk(
export const fetchNotificationsGap = createDataLoadingThunk(
'notificationGroups/fetchGap',
async (params: { gap: NotificationGap }) =>
apiFetchNotifications({ max_id: params.gap.maxId }),
async (params: { gap: NotificationGap }, { getState }) =>
apiFetchNotifications({
max_id: params.gap.maxId,
exclude_types: getExcludedTypes(getState()),
}),
({ notifications, accounts, statuses }, { dispatch }) => {
dispatch(importFetchedAccounts(accounts));
dispatch(importFetchedStatuses(statuses));
@ -109,6 +110,7 @@ export const pollRecentNotifications = createDataLoadingThunk(
async (_params, { getState }) => {
return apiFetchNotifications({
max_id: undefined,
exclude_types: getExcludedTypes(getState()),
// In slow mode, we don't want to include notifications that duplicate the already-displayed ones
since_id: usePendingItems
? getState().notificationGroups.groups.find(
@ -183,7 +185,6 @@ export const setNotificationsFilter = createAppAsyncThunk(
path: ['notifications', 'quickFilter', 'active'],
value: filterType,
});
// dispatch(expandNotifications({ forceLoad: true }));
void dispatch(fetchNotifications());
dispatch(saveSettings());
},

View File

@ -42,19 +42,11 @@ export const NotificationAdminReport: React.FC<{
if (!account || !targetAccount) return null;
const domain = account.acct.split('@')[1];
const values = {
name: (
<bdi
dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }}
/>
),
target: (
<bdi
dangerouslySetInnerHTML={{
__html: targetAccount.get('display_name_html'),
}}
/>
),
name: <bdi>{domain ?? `@${account.acct}`}</bdi>,
target: <bdi>@{targetAccount.acct}</bdi>,
category: intl.formatMessage(messages[report.category]),
count: report.status_ids.length,
};

View File

@ -524,7 +524,9 @@
"notification.moderation_warning.action_silence": "Sua conta foi limitada.",
"notification.moderation_warning.action_suspend": "Sua conta foi suspensa.",
"notification.own_poll": "Sua enquete terminou",
"notification.poll": "Uma enquete que você votou terminou",
"notification.reblog": "{name} deu boost no teu toot",
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# outra} other {# outras}}</a> impulsionaram a publicação",
"notification.relationships_severance_event": "Conexões perdidas com {name}",
"notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que você não pode mais receber atualizações deles ou interagir com eles.",
"notification.relationships_severance_event.domain_block": "An admin from {from} has blocked {target}, including {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.",
@ -533,16 +535,32 @@
"notification.status": "{name} acabou de tootar",
"notification.update": "{name} editou uma publicação",
"notification_requests.accept": "Aceitar",
"notification_requests.accept_multiple": "{count, plural, one {Aceite # pedido…} other {Aceite # pedidos…}}",
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceite # pedido} other {Aceite # pedidos}}",
"notification_requests.confirm_accept_multiple.message": "Você está prestes a aceitar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Tem certeza de que deseja continuar?",
"notification_requests.confirm_accept_multiple.title": "Aceitar solicitações de notificação?",
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Dispensar pedido} other {Dispensar pedidos}}",
"notification_requests.confirm_dismiss_multiple.message": "Você está prestes a descartar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Você não será capaz de acessar facilmente{count, plural, one {} other {}} novamente. Tem certeza de que deseja continuar?",
"notification_requests.confirm_dismiss_multiple.title": "Descartar solicitações de notificação?",
"notification_requests.dismiss": "Rejeitar",
"notification_requests.dismiss_multiple": "{count, plural, one {Dispensar # pedido…} other {Dispensar # pedidos…}}",
"notification_requests.edit_selection": "Editar",
"notification_requests.exit_selection": "Concluído",
"notification_requests.explainer_for_limited_account": "As notificações desta conta foram filtradas porque a conta foi limitada por um moderador.",
"notification_requests.explainer_for_limited_remote_account": "As notificações desta conta foram filtradas porque a conta ou o seu servidor foi limitado por um moderador.",
"notification_requests.maximize": "Maximizar",
"notification_requests.minimize_banner": "Minimizar banner de notificações filtradas",
"notification_requests.notifications_from": "Notificações de {name}",
"notification_requests.title": "Notificações filtradas",
"notification_requests.view": "Ver notificações",
"notifications.clear": "Limpar notificações",
"notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?",
"notifications.clear_title": "Limpar notificações?",
"notifications.column_settings.admin.report": "Novas denúncias:",
"notifications.column_settings.admin.sign_up": "Novas inscrições:",
"notifications.column_settings.alert": "Notificações no computador",
"notifications.column_settings.beta.category": "Recursos experimentais",
"notifications.column_settings.beta.grouping": "Agrupar notificações",
"notifications.column_settings.favourite": "Favoritos:",
"notifications.column_settings.filter_bar.advanced": "Exibir todas as categorias",
"notifications.column_settings.filter_bar.category": "Barra de filtro rápido",
@ -574,6 +592,11 @@
"notifications.policy.accept": "Aceitar",
"notifications.policy.accept_hint": "Mostrar nas notificações",
"notifications.policy.drop": "Ignorar",
"notifications.policy.drop_hint": "Envie para o void, para nunca mais ser visto novamente",
"notifications.policy.filter": "Filtrar",
"notifications.policy.filter_hint": "Enviar para caixa de notificações filtradas",
"notifications.policy.filter_limited_accounts_hint": "Limitado pelos moderadores do servidor",
"notifications.policy.filter_limited_accounts_title": "Contas moderadas",
"notifications.policy.filter_new_accounts.hint": "Created within the past {days, plural, one {one day} other {# days}}",
"notifications.policy.filter_new_accounts_title": "Novas contas",
"notifications.policy.filter_not_followers_hint": "Including people who have been following you fewer than {days, plural, one {one day} other {# days}}",
@ -582,6 +605,7 @@
"notifications.policy.filter_not_following_title": "Pessoas que você não segue",
"notifications.policy.filter_private_mentions_hint": "Filtrado, a menos que respondido em sua própria menção ou se você segue o remetente",
"notifications.policy.filter_private_mentions_title": "Menções privadas não solicitadas",
"notifications.policy.title": "Gerenciar notificações de…",
"notifications_permission_banner.enable": "Ativar notificações no computador",
"notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no computador. Você pode controlar precisamente quais tipos de interações geram notificações no computador através do botão {icon}.",
"notifications_permission_banner.title": "Nunca perca nada",
@ -708,9 +732,13 @@
"report.unfollow_explanation": "Você está seguindo esta conta. Para não ver as publicações dela em sua página inicial, deixe de segui-la.",
"report_notification.attached_statuses": "{count, plural, one {{count} publicação anexada} other {{count} publicações anexadas}}",
"report_notification.categories.legal": "Legal",
"report_notification.categories.legal_sentence": "conteúdo ilegal",
"report_notification.categories.other": "Outro",
"report_notification.categories.other_sentence": "outro",
"report_notification.categories.spam": "Spam",
"report_notification.categories.spam_sentence": "spam",
"report_notification.categories.violation": "Violação de regra",
"report_notification.categories.violation_sentence": "violação de regra",
"report_notification.open": "Abrir denúncia",
"search.no_recent_searches": "Nenhuma busca recente",
"search.placeholder": "Pesquisar",

View File

@ -11,6 +11,16 @@ class AnnualReport::Source
protected
def year_as_snowflake_range
(Mastodon::Snowflake.id_at(DateTime.new(year, 1, 1))..Mastodon::Snowflake.id_at(DateTime.new(year, 12, 31)))
(beginning_snowflake_id..ending_snowflake_id)
end
private
def beginning_snowflake_id
Mastodon::Snowflake.id_at DateTime.new(year).beginning_of_year
end
def ending_snowflake_id
Mastodon::Snowflake.id_at DateTime.new(year).end_of_year
end
end

View File

@ -145,15 +145,15 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
end
def without_self_fav_scope
Status.where('NOT EXISTS (SELECT 1 FROM favourites fav WHERE fav.account_id = statuses.account_id AND fav.status_id = statuses.id)')
Status.where.not(self_status_reference_exists(Favourite))
end
def without_self_bookmark_scope
Status.where('NOT EXISTS (SELECT 1 FROM bookmarks bookmark WHERE bookmark.account_id = statuses.account_id AND bookmark.status_id = statuses.id)')
Status.where.not(self_status_reference_exists(Bookmark))
end
def without_pinned_scope
Status.where('NOT EXISTS (SELECT 1 FROM status_pins pin WHERE pin.account_id = statuses.account_id AND pin.status_id = statuses.id)')
Status.where.not(self_status_reference_exists(StatusPin))
end
def without_media_scope
@ -174,4 +174,13 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
def account_statuses
Status.where(account_id: account_id)
end
def self_status_reference_exists(model)
model
.where(model.arel_table[:account_id].eq Status.arel_table[:account_id])
.where(model.arel_table[:status_id].eq Status.arel_table[:id])
.select(1)
.arel
.exists
end
end

View File

@ -22,6 +22,7 @@ Rails.application.config.middleware.insert_before 0, Rack::Cors do
expose: %w(Link X-RateLimit-Reset X-RateLimit-Limit X-RateLimit-Remaining X-Request-Id),
methods: %i(post put delete get patch options)
resource '/oauth/token', methods: [:post]
resource '/oauth/revoke', methods: [:post]
end
end
end

View File

@ -32,7 +32,7 @@ pt-BR:
import:
attributes:
data:
malformed: está incorreto
malformed: está malformado
status:
attributes:
reblog:
@ -43,16 +43,16 @@ pt-BR:
blocked: usa provedor de e-mail não permitido
unreachable: parece não existir
role_id:
elevated: não pode ser maior que seu cargo atual
elevated: não pode maior que sua função atual
user_role:
attributes:
permissions_as_keys:
dangerous: incluir permissões que não são seguras para o cargo base
elevated: não pode incluir permissões que o seu cargo atual não possui
own_role: não pode ser alterado com seu cargo atual
dangerous: incluir permissões que não são seguras para a função base
elevated: não pode incluir permissões que a sua função atual não possui
own_role: não pode ser alterado com sua função atual
position:
elevated: não pode ser maior do que seu cargo atual
own_role: não pode ser alterado com seu cargo atual
elevated: não pode ser maior do que sua função atual
own_role: não pode ser alterado com sua função atual
webhook:
attributes:
events:

View File

@ -14,7 +14,7 @@ pt-BR:
not_found_in_database: "%{authentication_keys} ou senha inválida."
omniauth_user_creation_failure: Erro ao criar uma conta para esta identidade.
pending: Sua conta está sendo revisada.
timeout: Sua sessão expirou. Por favor, entre novamente para continuar.
timeout: Sua sessão expirou. Faça login novamente para continuar.
unauthenticated: Você precisa entrar ou criar uma conta antes de continuar.
unconfirmed: Você precisa confirmar o seu endereço de e-mail antes de continuar.
mailer:
@ -48,12 +48,12 @@ pt-BR:
subject: 'Mastodon: Instruções para alterar senha'
title: Redefinir senha
two_factor_disabled:
explanation: O login agora é possível usando apenas o endereço de e-mail e senha.
explanation: O login agora é possível usando apenas o endereço eletrônico e senha.
subject: 'Mastodon: Autenticação de dois fatores desativada'
subtitle: A autenticação de dois fatores foi desativada.
title: 2FA desativada
two_factor_enabled:
explanation: Será necessário um código gerado pelo aplicativo de autenticação para fazer login.
explanation: Será necessário um código gerado pelo aplicativo de autenticação TOTP para fazer login.
subject: 'Mastodon: Autenticação de dois fatores ativada'
subtitle: A autenticação de dois fatores foi ativada para sua conta.
title: 2FA ativada
@ -75,11 +75,11 @@ pt-BR:
title: Uma das suas chaves de segurança foi excluída
webauthn_disabled:
explanation: A autenticação por chaves de segurança foi desativada para sua conta.
extra: O login agora é possível usando o código gerado por um aplicativo de autenticação de dois fatores.
extra: Agora você pode fazer login usando apenas o código gerado pelo aplicativo de autenticação TOTP.
subject: 'Mastodon: Autenticação por chaves de segurança desativada'
title: Chaves de segurança desativadas
webauthn_enabled:
explanation: Autenticação por chave de segurança foi ativada para sua conta.
explanation: A autenticação por chave de segurança foi ativada para sua conta.
extra: Sua chave de segurança agora pode ser usada para login.
subject: 'Mastodon: Autenticação por chaves de segurança ativada'
title: Chaves de segurança ativadas

View File

@ -60,8 +60,8 @@ pt-BR:
error:
title: Ocorreu um erro
new:
prompt_html: O %{client_name} gostaria de ter permissão para acessar sua conta. É uma aplicação de terceiros. <strong>Se você não confia, então você não deve autorizá-lo.</strong>
review_permissions: Revisar permissões
prompt_html: O %{client_name} gostaria de ter permissão para acessar sua conta. Trata-se de uma aplicação de terceiros. <strong>Se você não confia nesta aplicação, então você não deve autorizá-la.</strong>
review_permissions: Rever permissões
title: Autorização necessária
show:
title: Copie este código de autorização e cole no aplicativo.
@ -72,8 +72,8 @@ pt-BR:
revoke: Você tem certeza?
index:
authorized_at: Autorizado em %{date}
description_html: Estas são as aplicações que podem acessar sua conta usando a API. Se houver aplicativos que você não reconhece ou com mau funcionamento, você pode revogar seu acesso.
last_used_at: Última vez usado em %{date}
description_html: Estas são as aplicações que podem acessar sua conta usando a API. Se houver aplicações que você não reconhece ou que não funcionem corretamente, você pode revogar os acessos.
last_used_at: Usado pela última vez em %{date}
never_used: Nunca usado
scopes: Permissões
superapp: Interno
@ -83,6 +83,7 @@ pt-BR:
access_denied: O proprietário do recurso ou servidor de autorização recusou a solicitação.
credential_flow_not_configured: Fluxo das Credenciais de Senha do Proprietário do Recurso falhou porque Doorkeeper.configure.resource_owner_from_credentials não foi configurado.
invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação foi incluído ou o método de autenticação não é suportado.
invalid_code_challenge_method: O método de desafio de código deve ser S256; o método 'plain' não é suportado.
invalid_grant: A garantia de autorização está inválida, expirou ou foi revogada, não é equivalente ao link de redirecionamento usado na solicitação de autorização ou foi emitido por outro cliente.
invalid_redirect_uri: O link de redirecionamento é inválido.
invalid_request:
@ -114,23 +115,23 @@ pt-BR:
notice: Aplicativo revogado.
grouped_scopes:
access:
read: Acesso somente para leitura
read: Acesso somente leitura
read/write: Acesso de leitura e escrita
write: Acesso somente para escrita
write: Acesso somente escrita
title:
accounts: Contas
admin/accounts: Administração de contas
admin/all: Todas as funções administrativas
admin/reports: Controle de denúncias
admin/reports: Administração de denúncias
all: Acesso total à sua conta Mastodon
blocks: Bloqueios
bookmarks: Salvos
conversations: Conversas
crypto: Criptografia de ponta a ponta
favourites: Favoritas
favourites: Favoritos
filters: Filtros
follow: Seguidores, Silenciados e Bloqueados
follows: Seguidores
follow: Seguimentos, Silenciamentos e Bloqueios
follows: Seguidos
lists: Listas
media: Mídias anexadas
mutes: Silenciados
@ -151,17 +152,17 @@ pt-BR:
admin:read: ler todos os dados no servidor
admin:read:accounts: ler informações sensíveis de todas as contas
admin:read:canonical_email_blocks: ler informações sensíveis de todos os blocos de e-mail canônicos
admin:read:domain_allows: ler informações sensíveis de todos os domínios (URL) permitidos
admin:read:domain_blocks: ler informações sensíveis de todos os domínios (URL) bloqueados
admin:read:email_domain_blocks: ler informações sensíveis de todos os e-mails de domínios bloqueados
admin:read:domain_allows: ler informações sensíveis de todos os domínios permitidos
admin:read:domain_blocks: ler informações sensíveis de todos os domínios bloqueados
admin:read:email_domain_blocks: ler informações sensíveis de todos os domínios de e-mail bloqueados
admin:read:ip_blocks: ler informações sensíveis de todos os endereços de IP bloqueados
admin:read:reports: ler informações sensíveis de todas as denúncias e contas denunciadas
admin:write: alterar todos os dados no servidor
admin:write:accounts: executar ações de moderação em contas
admin:write:canonical_email_blocks: executar ações de moderação em blocos canônicos de e-mail
admin:write:domain_allows: executar ações de moderação em domínios (URL) permitidos
admin:write:domain_blocks: executar ações de moderação em domínios (URL) bloqueados
admin:write:email_domain_blocks: executar ações de moderação em blocos de e-mail bloqueados
admin:write:domain_allows: executar ações de moderação em domínios permitidos
admin:write:domain_blocks: executar ações de moderação em domínios bloqueados
admin:write:email_domain_blocks: executar ações de moderação em domínios de e-mail bloqueados
admin:write:ip_blocks: executar ações de moderação em IPs bloqueados
admin:write:reports: executar ações de moderação em denúncias
crypto: usar criptografia de ponta-a-ponta
@ -172,7 +173,7 @@ pt-BR:
read:accounts: ver informações das contas
read:blocks: ver seus bloqueados
read:bookmarks: ver seus salvos
read:favourites: veja suas favoritas
read:favourites: veja seus favoritos
read:filters: ver seus filtros
read:follows: ver quem você segue
read:lists: ver suas listas

View File

@ -182,14 +182,17 @@ en-GB:
create_custom_emoji: Create Custom Emoji
create_domain_allow: Create Domain Allow
create_domain_block: Create Domain Block
create_email_domain_block: Create Email Domain Block
create_ip_block: Create IP rule
create_unavailable_domain: Create Unavailable Domain
create_user_role: Create Role
demote_user: Demote User
destroy_announcement: Delete Announcement
destroy_canonical_email_block: Delete Email Block
destroy_custom_emoji: Delete Custom Emoji
destroy_domain_allow: Delete Domain Allow
destroy_domain_block: Delete Domain Block
destroy_email_domain_block: Delete Email Domain Block
destroy_instance: Purge Domain
destroy_ip_block: Delete IP rule
destroy_status: Delete Post
@ -197,8 +200,10 @@ en-GB:
destroy_user_role: Destroy Role
disable_2fa_user: Disable 2FA
disable_custom_emoji: Disable Custom Emoji
disable_sign_in_token_auth_user: Disable Email Token Authentication for User
disable_user: Disable User
enable_custom_emoji: Enable Custom Emoji
enable_sign_in_token_auth_user: Enable Email Token Authentication for User
enable_user: Enable User
memorialize_account: Memorialise Account
promote_user: Promote User
@ -228,20 +233,26 @@ en-GB:
approve_appeal_html: "%{name} approved moderation decision appeal from %{target}"
approve_user_html: "%{name} approved sign-up from %{target}"
assigned_to_self_report_html: "%{name} assigned report %{target} to themselves"
change_email_user_html: "%{name} changed the email address of user %{target}"
change_role_user_html: "%{name} changed role of %{target}"
confirm_user_html: "%{name} confirmed email address of user %{target}"
create_account_warning_html: "%{name} sent a warning to %{target}"
create_announcement_html: "%{name} created new announcement %{target}"
create_canonical_email_block_html: "%{name} blocked email with the hash %{target}"
create_custom_emoji_html: "%{name} uploaded new emoji %{target}"
create_domain_allow_html: "%{name} allowed federation with domain %{target}"
create_domain_block_html: "%{name} blocked domain %{target}"
create_email_domain_block_html: "%{name} blocked email domain %{target}"
create_ip_block_html: "%{name} created rule for IP %{target}"
create_unavailable_domain_html: "%{name} stopped delivery to domain %{target}"
create_user_role_html: "%{name} created %{target} role"
demote_user_html: "%{name} demoted user %{target}"
destroy_announcement_html: "%{name} deleted announcement %{target}"
destroy_canonical_email_block_html: "%{name} unblocked email with the hash %{target}"
destroy_custom_emoji_html: "%{name} deleted emoji %{target}"
destroy_domain_allow_html: "%{name} disallowed federation with domain %{target}"
destroy_domain_block_html: "%{name} unblocked domain %{target}"
destroy_email_domain_block_html: "%{name} unblocked email domain %{target}"
destroy_instance_html: "%{name} purged domain %{target}"
destroy_ip_block_html: "%{name} deleted rule for IP %{target}"
destroy_status_html: "%{name} removed post by %{target}"
@ -249,8 +260,10 @@ en-GB:
destroy_user_role_html: "%{name} deleted %{target} role"
disable_2fa_user_html: "%{name} disabled two factor requirement for user %{target}"
disable_custom_emoji_html: "%{name} disabled emoji %{target}"
disable_sign_in_token_auth_user_html: "%{name} disabled email token authentication for %{target}"
disable_user_html: "%{name} disabled login for user %{target}"
enable_custom_emoji_html: "%{name} enabled emoji %{target}"
enable_sign_in_token_auth_user_html: "%{name} enabled email token authentication for %{target}"
enable_user_html: "%{name} enabled login for user %{target}"
memorialize_account_html: "%{name} turned %{target}'s account into a memoriam page"
promote_user_html: "%{name} promoted user %{target}"
@ -258,6 +271,7 @@ en-GB:
reject_user_html: "%{name} rejected sign-up from %{target}"
remove_avatar_user_html: "%{name} removed %{target}'s avatar"
reopen_report_html: "%{name} reopened report %{target}"
resend_user_html: "%{name} resent confirmation email for %{target}"
reset_password_user_html: "%{name} reset password of user %{target}"
resolve_report_html: "%{name} resolved report %{target}"
sensitive_account_html: "%{name} marked %{target}'s media as sensitive"
@ -418,6 +432,7 @@ en-GB:
attempts_over_week:
one: "%{count} attempt over the last week"
other: "%{count} sign-up attempts over the last week"
created_msg: Successfully blocked email domain
delete: Delete
dns:
types:
@ -426,8 +441,12 @@ en-GB:
new:
create: Add domain
resolve: Resolve domain
title: Block new email domain
no_email_domain_block_selected: No email domain blocks were changed as none were selected
not_permitted: Not permitted
resolved_dns_records_hint_html: The domain name resolves to the following MX domains, which are ultimately responsible for accepting email. Blocking an MX domain will block sign-ups from any email address which uses the same MX domain, even if the visible domain name is different. <strong>Be careful not to block major email providers.</strong>
resolved_through_html: Resolved through %{domain}
title: Blocked email domains
export_domain_allows:
new:
title: Import domain allows
@ -581,6 +600,7 @@ en-GB:
resolve_description_html: No action will be taken against the reported account, no strike recorded, and the report will be closed.
silence_description_html: The account will be visible only to those who already follow it or manually look it up, severely limiting its reach. Can always be reverted. Closes all reports against this account.
suspend_description_html: The account and all its contents will be inaccessible and eventually deleted, and interacting with it will be impossible. Reversible within 30 days. Closes all reports against this account.
actions_description_html: Decide which action to take to resolve this report. If you take a punitive action against the reported account, an email notification will be sent to them, except when the <strong>Spam</strong> category is selected.
actions_description_remote_html: Decide which action to take to resolve this report. This will only affect how <strong>your</strong> server communicates with this remote account and handle its content.
add_to_report: Add more to report
already_suspended_badges:
@ -645,6 +665,7 @@ en-GB:
delete_data_html: Delete <strong>@%{acct}</strong>'s profile and contents 30 days from now unless they get unsuspended in the meantime
preview_preamble_html: "<strong>@%{acct}</strong> will receive a warning with the following contents:"
record_strike_html: Record a strike against <strong>@%{acct}</strong> to help you escalate on future violations from this account
send_email_html: Send <strong>@%{acct}</strong> a warning email
warning_placeholder: Optional additional reasoning for the moderation action.
target_origin: Origin of reported account
title: Reports
@ -684,6 +705,7 @@ en-GB:
manage_appeals: Manage Appeals
manage_appeals_description: Allows users to review appeals against moderation actions
manage_blocks: Manage Blocks
manage_blocks_description: Allows users to block email providers and IP addresses
manage_custom_emojis: Manage Custom Emojis
manage_custom_emojis_description: Allows users to manage custom emojis on the server
manage_federation: Manage Federation

View File

@ -58,6 +58,7 @@ fr-CA:
demote: Rétrograder
destroyed_msg: Les données de %{username} sont maintenant en file dattente pour être supprimées imminemment
disable: Geler
disable_sign_in_token_auth: Désactiver le jeton d'authentification par e-mail
disable_two_factor_authentication: Désactiver lauthentification à deux facteurs
disabled: Gelé
display_name: Nom affiché
@ -66,6 +67,7 @@ fr-CA:
email: Courriel
email_status: État du courriel
enable: Dégeler
enable_sign_in_token_auth: Activer le jeton d'authentification par e-mail
enabled: Activé
enabled_msg: Le compte de %{username} a été dégelé avec succès
followers: Abonné·e·s
@ -195,8 +197,10 @@ fr-CA:
destroy_user_role: Détruire le rôle
disable_2fa_user: Désactiver lA2F
disable_custom_emoji: Désactiver les émojis personnalisés
disable_sign_in_token_auth_user: Désactiver le jeton d'authentification par e-mail pour l'utilisateur
disable_user: Désactiver le compte
enable_custom_emoji: Activer les émojis personnalisées
enable_sign_in_token_auth_user: Activer le jeton d'authentification par e-mail pour l'utilisateur
enable_user: Activer lutilisateur
memorialize_account: Ériger en mémorial
promote_user: Promouvoir lutilisateur
@ -219,18 +223,22 @@ fr-CA:
update_custom_emoji: Mettre à jour les émojis personnalisés
update_domain_block: Mettre à jour le blocage de domaine
update_ip_block: Mettre à jour la règle IP
update_report: Mettre à jour le rapport
update_status: Mettre à jour le message
update_user_role: Mettre à jour le rôle
actions:
approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}"
approve_user_html: "%{name} a approuvé linscription de %{target}"
assigned_to_self_report_html: "%{name} sest assigné·e le signalement de %{target}"
change_email_user_html: "%{name} a changé l'adresse e-mail de l'utilisateur \n%{target}"
change_role_user_html: "%{name} a changé le rôle de %{target}"
confirm_user_html: "%{name} a confirmé l'adresse e-mail de l'utilisateur %{target}"
create_account_warning_html: "%{name} a envoyé un avertissement à %{target}"
create_announcement_html: "%{name} a créé une nouvelle annonce %{target}"
create_custom_emoji_html: "%{name} a téléversé un nouvel émoji %{target}"
create_domain_allow_html: "%{name} a autorisé la fédération avec le domaine %{target}"
create_domain_block_html: "%{name} a bloqué le domaine %{target}"
create_email_domain_block_html: "%{name} a bloqué le domaine d'e-mail %{target}"
create_ip_block_html: "%{name} a créé une règle pour l'IP %{target}"
create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}"
create_user_role_html: "%{name} a créé le rôle %{target}"
@ -239,6 +247,7 @@ fr-CA:
destroy_custom_emoji_html: "%{name} a supprimé l'émoji %{target}"
destroy_domain_allow_html: "%{name} a rejeté la fédération avec le domaine %{target}"
destroy_domain_block_html: "%{name} a débloqué le domaine %{target}"
destroy_email_domain_block_html: "%{name} a débloqué le domaine d'e-mail %{target}"
destroy_instance_html: "%{name} a purgé le domaine %{target}"
destroy_ip_block_html: "%{name} a supprimé la règle pour l'IP %{target}"
destroy_status_html: "%{name} a supprimé le message de %{target}"
@ -276,6 +285,7 @@ fr-CA:
filter_by_action: Filtrer par action
filter_by_user: Filtrer par utilisateur·ice
title: Journal daudit
unavailable_instance: "(nom de domaine indisponible)"
announcements:
destroyed_msg: Annonce supprimée avec succès !
edit:
@ -413,6 +423,7 @@ fr-CA:
attempts_over_week:
one: "%{count} tentative au cours de la dernière semaine"
other: "%{count} tentatives au cours de la dernière semaine"
created_msg: Domaine d'e-mail bloqué avec succès
delete: Supprimer
dns:
types:
@ -914,6 +925,10 @@ fr-CA:
statuses:
allow: Autoriser le message
allow_account: Autoriser l'auteur·rice
confirm_allow: Êtes-vous sûr de vouloir autoriser les statuts sélectionnés ?
confirm_allow_account: Êtes-vous sûr de vouloir autoriser les comptes sélectionnés ?
confirm_disallow: Êtes-vous sûr de vouloir rejeter les statuts sélectionnés ?
confirm_disallow_account: Êtes-vous sûr de vouloir rejeter les comptes sélectionnés ?
description_html: Voici les messages dont votre serveur a connaissance qui sont beaucoup partagés et mis en favoris en ce moment. Cela peut aider vos utilisateur⋅rice⋅s, néophytes comme aguerri⋅e⋅s, à trouver plus de comptes à suivre. Aucun message n'est publiquement affiché tant que vous n'en avez pas approuvé l'auteur⋅rice, et seulement si icellui permet que son compte soit suggéré aux autres. Vous pouvez également autoriser ou rejeter les messages individuellement.
disallow: Proscrire le message
disallow_account: Proscrire l'auteur·rice
@ -1896,6 +1911,7 @@ fr-CA:
invalid_otp_token: Le code dauthentification à deux facteurs est invalide
otp_lost_help_html: Si vous perdez accès aux deux, vous pouvez contacter %{email}
rate_limited: Trop de tentatives d'authentification, réessayez plus tard.
seamless_external_login: Vous êtes connectés sur un service externe, de fait les paramètres de mot de passe et d'e-mail ne sont pas disponibles.
signed_in_as: 'Connecté·e en tant que:'
verification:
extra_instructions_html: <strong>Astuce:</strong> Le lien sur votre site Web peut être invisible. La partie importante est <code>rel="me"</code> qui évite dautres liens provenant de contenu générés par des utilisateurs tiers d'être pris en compte. Vous pouvez même utiliser une balise <code>link</code> dans len-tête de la page au lieu de <code>a</code>, mais le HTML doit être accessible sans avoir besoin dexécuter du JavaScript.

View File

@ -58,6 +58,7 @@ fr:
demote: Rétrograder
destroyed_msg: Les données de %{username} sont maintenant en file dattente pour être supprimées imminemment
disable: Geler
disable_sign_in_token_auth: Désactiver le jeton d'authentification par e-mail
disable_two_factor_authentication: Désactiver lauthentification à deux facteurs
disabled: Gelé
display_name: Nom affiché
@ -66,6 +67,7 @@ fr:
email: Adresse de courriel
email_status: État du courriel
enable: Dégeler
enable_sign_in_token_auth: Activer le jeton d'authentification par e-mail
enabled: Activé
enabled_msg: Le compte de %{username} a été dégelé avec succès
followers: Abonné·e·s
@ -195,8 +197,10 @@ fr:
destroy_user_role: Détruire le rôle
disable_2fa_user: Désactiver lA2F
disable_custom_emoji: Désactiver les émojis personnalisés
disable_sign_in_token_auth_user: Désactiver le jeton d'authentification par e-mail pour l'utilisateur
disable_user: Désactiver le compte
enable_custom_emoji: Activer les émojis personnalisées
enable_sign_in_token_auth_user: Activer le jeton d'authentification par e-mail pour l'utilisateur
enable_user: Activer le compte
memorialize_account: Ériger en mémorial
promote_user: Promouvoir le compte
@ -219,18 +223,22 @@ fr:
update_custom_emoji: Mettre à jour les émojis personnalisés
update_domain_block: Mettre à jour le blocage de domaine
update_ip_block: Mettre à jour la règle IP
update_report: Mettre à jour le rapport
update_status: Mettre à jour le message
update_user_role: Mettre à jour le rôle
actions:
approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}"
approve_user_html: "%{name} a approuvé linscription de %{target}"
assigned_to_self_report_html: "%{name} sest assigné·e le signalement de %{target}"
change_email_user_html: "%{name} a changé l'adresse e-mail de l'utilisateur \n%{target}"
change_role_user_html: "%{name} a changé le rôle de %{target}"
confirm_user_html: "%{name} a confirmé l'adresse e-mail de l'utilisateur %{target}"
create_account_warning_html: "%{name} a envoyé un avertissement à %{target}"
create_announcement_html: "%{name} a créé une nouvelle annonce %{target}"
create_custom_emoji_html: "%{name} a téléversé un nouvel émoji %{target}"
create_domain_allow_html: "%{name} a autorisé la fédération avec le domaine %{target}"
create_domain_block_html: "%{name} a bloqué le domaine %{target}"
create_email_domain_block_html: "%{name} a bloqué le domaine d'e-mail %{target}"
create_ip_block_html: "%{name} a créé une règle pour l'IP %{target}"
create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}"
create_user_role_html: "%{name} a créé le rôle %{target}"
@ -239,6 +247,7 @@ fr:
destroy_custom_emoji_html: "%{name} a supprimé l'émoji %{target}"
destroy_domain_allow_html: "%{name} a rejeté la fédération avec le domaine %{target}"
destroy_domain_block_html: "%{name} a débloqué le domaine %{target}"
destroy_email_domain_block_html: "%{name} a débloqué le domaine d'e-mail %{target}"
destroy_instance_html: "%{name} a purgé le domaine %{target}"
destroy_ip_block_html: "%{name} a supprimé la règle pour l'IP %{target}"
destroy_status_html: "%{name} a supprimé le message de %{target}"
@ -276,6 +285,7 @@ fr:
filter_by_action: Filtrer par action
filter_by_user: Filtrer par utilisateur·ice
title: Journal daudit
unavailable_instance: "(nom de domaine indisponible)"
announcements:
destroyed_msg: Annonce supprimée avec succès !
edit:
@ -413,6 +423,7 @@ fr:
attempts_over_week:
one: "%{count} tentative au cours de la dernière semaine"
other: "%{count} tentatives au cours de la dernière semaine"
created_msg: Domaine d'e-mail bloqué avec succès
delete: Supprimer
dns:
types:
@ -914,6 +925,10 @@ fr:
statuses:
allow: Autoriser le message
allow_account: Autoriser l'auteur·rice
confirm_allow: Êtes-vous sûr de vouloir autoriser les statuts sélectionnés ?
confirm_allow_account: Êtes-vous sûr de vouloir autoriser les comptes sélectionnés ?
confirm_disallow: Êtes-vous sûr de vouloir rejeter les statuts sélectionnés ?
confirm_disallow_account: Êtes-vous sûr de vouloir rejeter les comptes sélectionnés ?
description_html: Voici les messages dont votre serveur a connaissance qui sont beaucoup partagés et mis en favoris en ce moment. Cela peut aider vos utilisateur⋅rice⋅s, néophytes comme aguerri⋅e⋅s, à trouver plus de comptes à suivre. Aucun message n'est publiquement affiché tant que vous n'en avez pas approuvé l'auteur⋅rice, et seulement si icellui permet que son compte soit suggéré aux autres. Vous pouvez également autoriser ou rejeter les messages individuellement.
disallow: Proscrire le message
disallow_account: Proscrire l'auteur·rice
@ -1896,6 +1911,7 @@ fr:
invalid_otp_token: Le code dauthentification à deux facteurs est invalide
otp_lost_help_html: Si vous perdez accès aux deux, vous pouvez contacter %{email}
rate_limited: Trop de tentatives d'authentification, réessayez plus tard.
seamless_external_login: Vous êtes connectés sur un service externe, de fait les paramètres de mot de passe et d'e-mail ne sont pas disponibles.
signed_in_as: 'Connecté·e en tant que:'
verification:
extra_instructions_html: <strong>Astuce :</strong> Le lien sur votre site Web peut être invisible. La partie importante est <code>rel="me"</code> qui évite que soient pris en compte dautres liens provenant de contenu générés par des utilisateurs tiers. Vous pouvez même utiliser une balise <code>link</code> dans len-tête de la page au lieu de <code>a</code>, mais le HTML doit être accessible sans avoir besoin dexécuter du JavaScript.

View File

@ -1506,6 +1506,7 @@ he:
media_attachments:
validations:
images_and_video: לא ניתן להוסיף וידאו להודעה שכבר מכילה תמונות
not_found: קובץ %{ids} לא נמצא, או שהוצמד כבר להודעה אחרת
not_ready: לא ניתן להצמיד קבצים שהעלאתם לא הסתיימה. נסה/י שוב בעוד רגע!
too_many: לא ניתן להוסיף יותר מארבעה קבצים
migrations:

View File

@ -1454,6 +1454,7 @@ hu:
media_attachments:
validations:
images_and_video: Nem csatolhatsz videót olyan bejegyzéshez, amelyhez már csatoltál képet
not_found: A(z) %{ids} média nem található, vagy már egy másik bejegyzéshez lett csatolva
not_ready: Nem lehet olyan fájlt csatolni, melynek még nem fejeződött be a feldolgozása. Próbáld kicsit később!
too_many: Maximum négy fájlt csatolhatsz
migrations:

View File

@ -1458,6 +1458,7 @@ is:
media_attachments:
validations:
images_and_video: Ekki er hægt að hengja myndskeið við færslu sem þegar inniheldur myndir
not_found: Myndefnið %{ids} fannst ekki eða er þegar hengt við aðra færslu
not_ready: Ekki er hægt að hengja við skrár sem ekki er búið að vinna til fulls. Prófaðu aftur eftir augnablik!
too_many: Ekki er hægt að hengja við fleiri en 4 skrár
migrations:

View File

@ -830,7 +830,7 @@ ko:
sensitive: "%{name} 님이 %{target}의 계정을 민감함으로 표시했습니다"
silence: "%{name} 님이 %{target}의 계정을 제한시켰습니다"
suspend: "%{name} 님이 %{target}의 계정을 정지시켰습니다"
appeal_approved: 이의제기됨
appeal_approved: 이의 받아들여짐
appeal_pending: 이의제기 대기중
appeal_rejected: 이의 제기 거절됨
system_checks:

View File

@ -1454,6 +1454,7 @@ nn:
media_attachments:
validations:
images_and_video: Kan ikkje leggja ved video til status som allereie inneheld bilete
not_found: Media %{ids} vart ikkje funne eller er allereie kopla til eit anna innlegg
not_ready: Kan ikke legge til filer som ikke er ferdigbehandlet. Prøv igjen om et øyeblikk!
too_many: Kan ikkje leggja til meir enn 4 filer
migrations:

View File

@ -4,7 +4,7 @@ pt-BR:
about_mastodon_html: 'A rede social do futuro: Sem anúncios, sem vigilância corporativa, com design ético e muita descentralização! Possua seus próprios dados com o Mastodon!'
contact_missing: Não definido
contact_unavailable: Não disponível
hosted_on: Servidor Mastodon em %{domain}
hosted_on: Mastodon hospedado em %{domain}
title: Sobre
accounts:
follow: Seguir
@ -31,6 +31,7 @@ pt-BR:
created_msg: Nota de moderação criada!
destroyed_msg: Nota de moderação excluída!
accounts:
add_email_domain_block: Bloquear domínio de email
approve: Aprovar
approved_msg: O registro de %{username} foi aprovado
are_you_sure: Você tem certeza?
@ -44,10 +45,10 @@ pt-BR:
submit: Alterar e-mail
title: Alterar e-mail para %{username}
change_role:
changed_msg: Cargo alterado!
label: Alterar cargo
no_role: Sem cargo
title: Alterar cargo para %{username}
changed_msg: Função alterada com sucesso!
label: Alterar função
no_role: Nenhuma função
title: Alterar função para %{username}
confirm: Confirmar
confirmed: Confirmado
confirming: Confirmando
@ -57,6 +58,7 @@ pt-BR:
demote: Rebaixar
destroyed_msg: Os dados de %{username} estão na fila para serem excluídos em breve
disable: Congelar
disable_sign_in_token_auth: Desativar autenticação via token por email
disable_two_factor_authentication: Desativar autenticação de dois fatores
disabled: Congelada
display_name: Nome de exibição
@ -65,6 +67,7 @@ pt-BR:
email: E-mail
email_status: Estado do e-mail
enable: Descongelar
enable_sign_in_token_auth: Ativar autenticação via token por email
enabled: Ativada
enabled_msg: A conta de %{username} foi descongelada
followers: Seguidores
@ -129,6 +132,7 @@ pt-BR:
resubscribe: Reinscrever-se
role: Cargo
search: Buscar
search_same_email_domain: Outros usuários com o mesmo domínio de e-mail
search_same_ip: Outros usuários com o mesmo IP
security: Segurança
security_measures:
@ -169,21 +173,26 @@ pt-BR:
approve_appeal: Aprovar revisão
approve_user: Aprovar usuário
assigned_to_self_report: Atribuir denúncia
change_email_user: Alterar o Email para o usuário
change_role_user: Alterar cargo do usuário
confirm_user: Confirmar usuário
create_account_warning: Criar aviso
create_announcement: Criar anúncio
create_canonical_email_block: Criar bloqueio de Email
create_custom_emoji: Criar emoji personalizado
create_domain_allow: Permitir domínio
create_domain_block: Bloquear domínio
create_email_domain_block: Criar Bloqueio de Domínio de Email
create_ip_block: Criar regra de IP
create_unavailable_domain: Criar domínio indisponível
create_user_role: Criar cargo
demote_user: Rebaixar usuário
destroy_announcement: Excluir anúncio
destroy_canonical_email_block: Deletar bloqueio de Email
destroy_custom_emoji: Excluir emoji personalizado
destroy_domain_allow: Excluir domínio permitido
destroy_domain_block: Desbloquear domínio
destroy_email_domain_block: Deletar bloqueio de domínio Email
destroy_instance: Limpar domínio
destroy_ip_block: Excluir regra de IP
destroy_status: Excluir publicação
@ -191,8 +200,10 @@ pt-BR:
destroy_user_role: Destruir cargo
disable_2fa_user: Desativar autenticação de dois fatores
disable_custom_emoji: Desativar emoji personalizado
disable_sign_in_token_auth_user: Desativar autenticação via Token de Email para Usuário
disable_user: Desativar usuário
enable_custom_emoji: Ativar emoji personalizado
enable_sign_in_token_auth_user: Desativar autenticação via token por e-mail para o usuário
enable_user: Ativar usuário
memorialize_account: Converter conta em memorial
promote_user: Promover usuário
@ -215,6 +226,7 @@ pt-BR:
update_custom_emoji: Editar Emoji Personalizado
update_domain_block: Atualizar bloqueio de domínio
update_ip_block: Atualizar regra de IP
update_report: Atualizar Relatório
update_status: Editar Status
update_user_role: Atualizar cargo
actions:
@ -223,19 +235,24 @@ pt-BR:
assigned_to_self_report_html: "%{name} atribuiu a denúncia %{target} para si"
change_email_user_html: "%{name} alterou o endereço de e-mail do usuário %{target}"
change_role_user_html: "%{name} alterou o cargo de %{target}"
confirm_user_html: "%{name} confirmou o endereço de e-mail do usuário %{target}"
create_account_warning_html: "%{name} enviou um aviso para %{target}"
create_announcement_html: "%{name} criou o novo anúncio %{target}"
create_canonical_email_block_html: "%{name} bloqueou o endereço de e-mail com o hash %{target}"
create_custom_emoji_html: "%{name} enviou o novo emoji %{target}"
create_domain_allow_html: "%{name} permitiu federação com domínio %{target}"
create_domain_block_html: "%{name} bloqueou o domínio %{target}"
create_email_domain_block_html: "%{name} bloqueou o domínio de e-mail %{target}"
create_ip_block_html: "%{name} criou a regra para o IP %{target}"
create_unavailable_domain_html: "%{name} parou a entrega ao domínio %{target}"
create_user_role_html: "%{name} criou o cargo %{target}"
demote_user_html: "%{name} rebaixou o usuário %{target}"
destroy_announcement_html: "%{name} excluiu o anúncio %{target}"
destroy_canonical_email_block_html: "%{name} desbloqueou o endereço e-mail com o hash %{target}"
destroy_custom_emoji_html: "%{name} apagou o emoji %{target}"
destroy_domain_allow_html: "%{name} bloqueou federação com domínio %{target}"
destroy_domain_block_html: "%{name} desbloqueou o domínio %{target}"
destroy_email_domain_block_html: "%{name} desbloqueou o domínio de e-mail %{target}"
destroy_instance_html: "%{name} limpou o domínio %{target}"
destroy_ip_block_html: "%{name} excluiu a regra para o IP %{target}"
destroy_status_html: "%{name} removeu a publicação de %{target}"
@ -243,8 +260,10 @@ pt-BR:
destroy_user_role_html: "%{name} excluiu o cargo %{target}"
disable_2fa_user_html: "%{name} desativou a exigência da autenticação de dois fatores para o usuário %{target}"
disable_custom_emoji_html: "%{name} desativou o emoji %{target}"
disable_sign_in_token_auth_user_html: "%{name} desativou a autenticação via token por e-mail para %{target}"
disable_user_html: "%{name} desativou o login para %{target}"
enable_custom_emoji_html: "%{name} ativou o emoji %{target}"
enable_sign_in_token_auth_user_html: "%{name} ativou a autenticação via token por e-mail para %{target}"
enable_user_html: "%{name} ativou o login para %{target}"
memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial"
promote_user_html: "%{name} promoveu o usuário %{target}"
@ -252,6 +271,7 @@ pt-BR:
reject_user_html: "%{name} rejeitou a inscrição de %{target}"
remove_avatar_user_html: "%{name} removeu a imagem de perfil de %{target}"
reopen_report_html: "%{name} reabriu a denúncia %{target}"
resend_user_html: "%{name} reenviou um e-mail de confirmação para %{target}"
reset_password_user_html: "%{name} redefiniu a senha de %{target}"
resolve_report_html: "%{name} resolveu a denúncia %{target}"
sensitive_account_html: "%{name} marcou a mídia de %{target} como sensível"
@ -412,6 +432,7 @@ pt-BR:
attempts_over_week:
one: "%{count} tentativa na última semana"
other: "%{count} tentativas de inscrição na última semana"
created_msg: Domínio de e-mail bloqueado com sucesso
delete: Excluir
dns:
types:
@ -420,8 +441,11 @@ pt-BR:
new:
create: Adicionar domínio
resolve: Resolver domínio
title: Bloquear novo domínio de e-mail
not_permitted: Não permitido
resolved_dns_records_hint_html: O nome de domínio é associado aos seguintes domínios MX, que são responsáveis por aceitar e-mails. Ao bloquear um domínio MX, você bloqueará as inscrições de qualquer endereço de e-mail que use o mesmo domínio MX, mesmo que o nome de domínio visível seja diferente. <strong>Tenha cuidado para não bloquear os principais provedores de e-mail.</strong>
resolved_through_html: Resolvido através de %{domain}
title: Domínios de e-mail bloqueados
export_domain_allows:
new:
title: Importar domínios permitidos
@ -446,6 +470,9 @@ pt-BR:
title: Recomendações de contas
unsuppress: Restaurar recomendação de contas
instances:
audit_log:
title: Logs de auditoria recentes
view_all: Ver todos os logs de auditoria
availability:
description_html:
one: Se a entrega ao domínio falhar em <strong>%{count} dia</strong> sem sucesso, nenhuma tentativa de entrega será feita a menos que uma entrega <em>do</em> domínio seja recebida.
@ -572,6 +599,7 @@ pt-BR:
resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, nenhuma violação será guardada e a denúncia será encerrada.
silence_description_html: A conta ficará visível apenas para aqueles que já a seguem ou que a procuram manualmente, limitando severamente seu alcance. Pode ser revertido a qualquer momento. Fecha todas as denúncias desta conta.
suspend_description_html: A conta e todo o seu conteúdo ficará inacessível e, eventualmente, excluído e interagir com ela será impossível. Reversível dentro de 30 dias. Encerra todas as denúncias contra esta conta.
actions_description_html: Decida qual ação tomar para responder a essa denúncia. Se você tomar uma ação punitiva contra a conta denunciada, uma notificação por e-mail será enviada ao usuário, exceto quando a categoria <strong>Spam</strong> for selecionada.
actions_description_remote_html: Decida quais medidas tomará para resolver esta denúncia. Isso só afetará como <strong>seu servidor</strong> se comunica com esta conta remota e manipula seu conteúdo.
add_to_report: Adicionar mais à denúncia
already_suspended_badges:
@ -613,6 +641,7 @@ pt-BR:
report: 'Denúncia #%{id}'
reported_account: Conta denunciada
reported_by: Denunciada por
reported_with_application: Denunciado pelo aplicativo
resolved: Resolvido
resolved_msg: Denúncia resolvida!
skip_to_actions: Pular para ações
@ -635,6 +664,7 @@ pt-BR:
delete_data_html: Exclua o perfil e o conteúdo de <strong>@%{acct}</strong> daqui a 30 dias, a menos que a suspensão seja desfeita nesse meio tempo
preview_preamble_html: "<strong>@%{acct}</strong> receberá um aviso com o seguinte conteúdo:"
record_strike_html: Registre uma ação contra <strong>@%{acct}</strong> para te ajudar em futuras violações desta conta
send_email_html: Enviar <strong>@%{acct}</strong> um e-mail de alerta
warning_placeholder: Argumentos adicionais para a ação de moderação.
target_origin: Origem da conta denunciada
title: Denúncias
@ -674,6 +704,7 @@ pt-BR:
manage_appeals: Gerenciar revisões
manage_appeals_description: Permite aos usuários visualizar as revisões das decisões da moderação
manage_blocks: Gerenciar Bloqueios
manage_blocks_description: Permite aos usuários bloquear provedores de e-mail e endereços IP
manage_custom_emojis: Gerenciar Emojis Personalizados
manage_custom_emojis_description: Permite aos usuários gerenciar emojis personalizados no servidor
manage_federation: Gerenciar Federação
@ -691,6 +722,7 @@ pt-BR:
manage_taxonomies: Gerenciar taxonomias
manage_taxonomies_description: Permite aos usuários rever o conteúdo em alta e atualizar as configurações de hashtag
manage_user_access: Gerenciar Acesso de Usuário
manage_user_access_description: Permite aos usuários desativar a autenticação de dois fatores de outros usuários, alterar seu endereço de e-mail e redefinir sua senha
manage_users: Gerenciar usuários
manage_users_description: Permite aos usuários ver os detalhes de outros usuários e executar ações de moderação contra eles
manage_webhooks: Gerenciar Webhooks
@ -765,6 +797,7 @@ pt-BR:
destroyed_msg: Upload do site excluído com sucesso!
software_updates:
critical_update: Crítico — por favor, atualize rapidamente
description: É recomendável que você mantenha a instalação do Mastodon atualizada para se beneficiar das correções e das novas funcionalidades. Além disso, às vezes é imprescindível atualizar o Mastodon rapidamente para evitar problemas de segurança. Por esses motivos, o Mastodon verifica se há atualizações a cada 30 minutos e notificará você de acordo com as suas preferências de notificação por e-mail.
documentation_link: Saiba mais
release_notes: Notas de lançamento
title: Atualizações disponíveis
@ -851,16 +884,39 @@ pt-BR:
action: Confira aqui para mais informações
message_html: "<strong>Seu armazenamento de objetos está mal configurado. A privacidade de seus usuários está em risco.</strong>"
tags:
moderation:
not_trendable: Fora de moda
not_usable: Não utilizável
pending_review: Revisão pendente
review_requested: Revisão solicitada
reviewed: Revisado
title: Status
trendable: Tendências
unreviewed: Não revisado
usable: Utilizável
name: Nome
newest: Mais recente
oldest: Mais antigos
open: Visualizar Publicamente
reset: Reinicializar
review: Status da revisão
search: Buscar
title: Hashtags
updated_msg: Configurações de hashtag atualizadas
title: Administração
trends:
allow: Permitir
approved: Aprovado
confirm_allow: Você tem certeza que deseja permitir as tags selecionadas?
confirm_disallow: Você tem certeza de que deseja vetar as tags selecionadas?
disallow: Impedir
links:
allow: Permitir link
allow_provider: Permitir editor
confirm_allow: Tem certeza que deseja permitir os links selecionados?
confirm_allow_provider: Tem certeza que deseja permitir os provedores selecionados?
confirm_disallow: Tem certeza que deseja vetar os links selecionados?
confirm_disallow_provider: Tem certeza que deseja vetar os provedores selecionados?
description_html: Estes são links que estão sendo compartilhados por contas que seu servidor vê. Você pode ajudar seus usuários a descobrir o que está acontecendo no mundo. Nenhum link é exibido publicamente até que você aprove o editor. Você também pode permitir ou rejeitar links individuais.
disallow: Proibir link
disallow_provider: Proibir autor
@ -884,6 +940,10 @@ pt-BR:
statuses:
allow: Permitir publicação
allow_account: Permitir autor
confirm_allow: Tem certeza que deseja permitir os status selecionados?
confirm_allow_account: Tem certeza que deseja permitir as contas selecionadas?
confirm_disallow: Tem certeza que deseja vetar os status selecionados?
confirm_disallow_account: Tem certeza que deseja vetar as contas selecionadas?
description_html: Estes são as publicações que seu servidor sabe que estão sendo muito compartilhadas e favorecidas no momento. Isso pode ajudar seus usuários, novos e atuais, a encontrar mais pessoas para seguir. Nenhuma publicação é exibida publicamente até que você aprove o autor e o autor permitir que sua conta seja sugerida a outros. Você também pode permitir ou rejeitar publicações individuais.
disallow: Proibir publicação
disallow_account: Proibir autor
@ -916,6 +976,7 @@ pt-BR:
used_by_over_week:
one: Usado por uma pessoa na última semana
other: Usado por %{count} pessoas na última semana
title: Recomendações e tendências
trending: Em alta
warning_presets:
add_new: Adicionar novo
@ -1000,7 +1061,9 @@ pt-BR:
guide_link_text: Todos podem contribuir.
sensitive_content: Conteúdo sensível
application_mailer:
notification_preferences: Alterar preferências de e-mail
salutation: "%{name},"
settings: 'Alterar preferências de e-mail: %{link}'
unsubscribe: Desinscrever
view: 'Ver:'
view_profile: Ver perfil
@ -1020,6 +1083,7 @@ pt-BR:
hint_html: Só mais uma coisa! Precisamos confirmar que você é um humano (isso é para que possamos evitar o spam!). Resolva o CAPTCHA abaixo e clique em "Continuar".
title: Verificação de segurança
confirmations:
awaiting_review: Seu endereço de e-mail está confirmado! A equipe %{domain} está agora revisando a sua inscrição. Você receberá um e-mail se a sua conta for aprovada!
awaiting_review_title: Seu cadastro está sendo analisado
clicking_this_link: clicar este link
login_link: entrar
@ -1027,6 +1091,7 @@ pt-BR:
redirect_to_app_html: Você deveria ter sido redirecionado para o aplicativo <strong>%{app_name}</strong>. Se isso não aconteceu, tente %{clicking_this_link} ou volte manualmente para o aplicativo.
registration_complete: Seu cadastro no %{domain} foi concluído!
welcome_title: Boas vindas, %{name}!
wrong_email_hint: Se esse endereço de e-mail não estiver correto, você pode alterá-lo nas configurações da conta.
delete_account: Excluir conta
delete_account_html: Se você deseja excluir sua conta, você pode <a href="%{path}">fazer isso aqui</a>. Uma confirmação será solicitada.
description:
@ -1047,6 +1112,7 @@ pt-BR:
or_log_in_with: Ou entre com
privacy_policy_agreement_html: Eu li e concordo com a <a href="%{privacy_policy_path}" target="_blank">política de privacidade</a>
progress:
confirm: Confirmar e-mail
details: Suas informações
review: Nossa avaliação
rules: Aceitar regras
@ -1068,8 +1134,10 @@ pt-BR:
security: Segurança
set_new_password: Definir uma nova senha
setup:
email_below_hint_html: Verifique a sua pasta de spam, ou solicite outra. Você pode corrigir o seu endereço de e-mail se estiver errado.
email_settings_hint_html: Clique no link que te enviamos para verificar %{email}. Esperaremos aqui.
link_not_received: Não recebeu um link?
new_confirmation_instructions_sent: Você receberá um novo e-mail com o link de confirmação em alguns minutos!
title: Verifique sua caixa de entrada
sign_in:
preamble_html: Entre com suas credenciais de domínios ( <strong>%{domain}</strong> ) . Se sua conta estiver hospedada em um servidor diferente, você não deve conseguir acessar este conteúdo.
@ -1080,7 +1148,9 @@ pt-BR:
title: Então vamos lá criar uma conta em %{domain}.
status:
account_status: Status da conta
confirming: Confirmação por e-mail pendente.
functional: Sua conta está totalmente operacional.
pending: Sua inscrição está aguardando revisão pela nossa equipe. Isto pode levar algum tempo. Você receberá um e-mail se sua inscrição for aprovada.
redirecting_to: Sua conta está inativa porque atualmente está redirecionando para %{acct}.
self_destruct: Como %{domain} está se encerrando, você só terá acesso limitado à sua conta.
view_strikes: Veja os avisos anteriores em relação à sua conta
@ -1123,6 +1193,9 @@ pt-BR:
before: 'Antes de prosseguir, leia com cuidado:'
caches: Conteúdo que foi armazenado em cache por outros servidores pode continuar a existir
data_removal: Suas publicações e outros dados serão removidos permanentemente
email_change_html: Você pode <a href="%{path}">alterar seu endereço de e-mail</a> sem excluir sua conta
email_contact_html: Se ainda não chegar, você pode enviar um e-mail para <a href="mailto:%{email}">%{email}</a> para obter ajuda
email_reconfirmation_html: Se você não recebeu o e-mail de confirmação, você pode <a href="%{path}">solicitá-lo novamente</a>
irreversible: Você não conseguirá restaurar ou reativar a sua conta
more_details_html: Para mais detalhes, consulte a <a href="%{terms_path}">Política de Privacidade</a>.
username_available: Seu nome de usuário ficará disponível novamente
@ -1355,6 +1428,7 @@ pt-BR:
authentication_methods:
otp: autenticação de dois fatores
password: senha
sign_in_token: código de segurança do e-mail
webauthn: chaves de segurança
description_html: Se você vir atividades suspeitas ou não reconhecidas, considere alterar sua senha e ativar a autenticação de dois fatores.
empty: Sem histórico de autenticação disponível
@ -1365,10 +1439,14 @@ pt-BR:
unsubscribe:
action: Sim, cancelar subscrição
complete: Desinscrito
confirmation_html: Tem certeza que deseja cancelar a assinatura de %{type} para Mastodon no %{domain} para o seu endereço de e-mail %{email}? Você sempre pode se inscrever novamente nas <a href="%{settings_path}">configurações de notificação de email</a>.
resubscribe_html: Se você cancelou sua inscrição por engano, você pode se inscrever novamente em suas <a href="%{settings_path}"> configurações de notificações por e-mail</a>.
success_html: Você não mais receberá %{type} no Mastodon em %{domain} ao seu endereço de e-mail %{email}.
title: Cancelar inscrição
media_attachments:
validations:
images_and_video: Não foi possível anexar um vídeo a uma publicação que já contém imagens
not_found: Mídia %{ids} não encontrada ou já anexada a outra publicação
not_ready: Não é possível anexar arquivos que não terminaram de ser processados. Tente novamente daqui a pouco!
too_many: Não foi possível anexar mais de 4 imagens
migrations:
@ -1445,6 +1523,8 @@ pt-BR:
update:
subject: "%{name} editou uma publicação"
notifications:
administration_emails: Notificações de e-mail do administrador
email_events: Eventos para notificações por e-mail
email_events_hint: 'Selecione os eventos que deseja receber notificações:'
number:
human:
@ -1603,6 +1683,7 @@ pt-BR:
import: Importar
import_and_export: Importar e exportar
migrate: Migração de conta
notifications: Notificações por e-mail
preferences: Preferências
profile: Perfil
relationships: Seguindo e seguidores
@ -1849,6 +1930,7 @@ pt-BR:
invalid_otp_token: Código de dois fatores inválido
otp_lost_help_html: Se você perder o acesso à ambos, você pode entrar em contato com %{email}
rate_limited: Muitas tentativas de autenticação; tente novamente mais tarde.
seamless_external_login: Você está logado através de um serviço externo, portanto as configurações de senha e e-mail não estão disponíveis.
signed_in_as: 'Entrou como:'
verification:
extra_instructions_html: <strong>Dica:</strong> O link do seu site não precisa ser visível. O importante é a parte <code>rel="me"</code>, que impede a personificação em sites com conteúdo gerado pelo usuário. Você pode até usar uma tag <code>link</code> no cabeçalho da página ao invés de uma tag <code>a</code>, mas é importante que o HTML esteja acessível sem executar JavaScript.

View File

@ -211,6 +211,7 @@ pt-BR:
setting_default_privacy: Privacidade dos toots
setting_default_sensitive: Sempre marcar mídia como sensível
setting_delete_modal: Solicitar confirmação antes de excluir toot
setting_disable_hover_cards: Desativar visualização de perfil ao passar o mouse por cima
setting_disable_swiping: Desabilitar movimentos deslizantes
setting_display_media: Exibição das mídias
setting_display_media_default: Padrão
@ -242,11 +243,13 @@ pt-BR:
warn: Ocultar com um aviso
form_admin_settings:
activity_api_enabled: Publicar estatísticas agregadas sobre atividade de usuários na API
app_icon: Ícone do aplicativo
backups_retention_period: Período de retenção do arquivo de usuário
bootstrap_timeline_accounts: Sempre recomendar essas contas para novos usuários
closed_registrations_message: Mensagem personalizada quando inscrições não estão disponíveis
content_cache_retention_period: Período de retenção de conteúdo remoto
custom_css: CSS personalizável
favicon: Favicon
mascot: Mascote personalizado (legado)
media_cache_retention_period: Período de retenção do cachê de mídia
peers_api_enabled: Publicar lista de instâncias de servidor descobertas na API
@ -311,6 +314,7 @@ pt-BR:
listable: Permitir que esta hashtag apareça em pesquisas e sugestões
name: Hashtag
trendable: Permitir que esta hashtag fique em alta
usable: Permitir que as publicações usem esta hashtag localmente
user:
role: Cargo
time_zone: Fuso horário

View File

@ -1454,6 +1454,7 @@ tr:
media_attachments:
validations:
images_and_video: Zaten resim içeren bir duruma video eklenemez
not_found: "%{ids} medya dosyaları bulunamadı veya başka bir gönderiye zaten eklenmiş"
not_ready: İşlemi tamamlanmamış dosyalar eklenemez. Birazdan tekrar deneyin!
too_many: 4'ten fazla dosya eklenemiyor
migrations:

View File

@ -1,26 +1,25 @@
# frozen_string_literal: true
class Mastodon::RedisConfiguration
DEFAULTS = {
host: 'localhost',
port: 6379,
db: 0,
}.freeze
def base
@base ||= {
url: setup_base_redis_url,
driver: driver,
namespace: base_namespace,
}
@base ||= setup_config(prefix: nil, defaults: DEFAULTS)
.merge(namespace: base_namespace)
end
def sidekiq
@sidekiq ||= {
url: setup_prefixed_redis_url(:sidekiq),
driver: driver,
namespace: sidekiq_namespace,
}
@sidekiq ||= setup_config(prefix: 'SIDEKIQ_')
.merge(namespace: sidekiq_namespace)
end
def cache
@cache ||= {
url: setup_prefixed_redis_url(:cache),
driver: driver,
@cache ||= setup_config(prefix: 'CACHE_')
.merge({
namespace: cache_namespace,
expires_in: 10.minutes,
connect_timeout: 5,
@ -28,7 +27,7 @@ class Mastodon::RedisConfiguration
size: Sidekiq.server? ? Sidekiq[:concurrency] : Integer(ENV['MAX_THREADS'] || 5),
timeout: 5,
},
}
})
end
private
@ -55,42 +54,53 @@ class Mastodon::RedisConfiguration
namespace ? "#{namespace}_cache" : 'cache'
end
def setup_base_redis_url
url = ENV.fetch('REDIS_URL', nil)
return url if url.present?
def setup_config(prefix: nil, defaults: {})
prefix = "#{prefix}REDIS_"
user = ENV.fetch('REDIS_USER', '')
password = ENV.fetch('REDIS_PASSWORD', '')
host = ENV.fetch('REDIS_HOST', 'localhost')
port = ENV.fetch('REDIS_PORT', 6379)
db = ENV.fetch('REDIS_DB', 0)
url = ENV.fetch("#{prefix}URL", nil)
user = ENV.fetch("#{prefix}USER", nil)
password = ENV.fetch("#{prefix}PASSWORD", nil)
host = ENV.fetch("#{prefix}HOST", defaults[:host])
port = ENV.fetch("#{prefix}PORT", defaults[:port])
db = ENV.fetch("#{prefix}DB", defaults[:db])
name = ENV.fetch("#{prefix}SENTINEL_MASTER", nil)
sentinels = parse_sentinels(ENV.fetch("#{prefix}SENTINELS", nil))
construct_uri(host, port, db, user, password)
return { url:, driver: } if url
if name.present? && sentinels.present?
host = name
port = nil
db ||= 0
else
sentinels = nil
end
def setup_prefixed_redis_url(prefix)
prefix = "#{prefix.to_s.upcase}_"
url = ENV.fetch("#{prefix}REDIS_URL", nil)
url = construct_uri(host, port, db, user, password)
return url if url.present?
user = ENV.fetch("#{prefix}REDIS_USER", nil)
password = ENV.fetch("#{prefix}REDIS_PASSWORD", nil)
host = ENV.fetch("#{prefix}REDIS_HOST", nil)
port = ENV.fetch("#{prefix}REDIS_PORT", nil)
db = ENV.fetch("#{prefix}REDIS_DB", nil)
if host.nil?
base[:url]
if url.present?
{ url:, driver:, name:, sentinels: }
else
construct_uri(host, port, db, user, password)
# Fall back to base config. This has defaults for the URL
# so this cannot lead to an endless loop.
base
end
end
def construct_uri(host, port, db, user, password)
return nil if host.blank?
Addressable::URI.parse("redis://#{host}:#{port}/#{db}").tap do |uri|
uri.user = user if user.present?
uri.password = password if password.present?
end.normalize.to_str
end
def parse_sentinels(sentinels_string)
(sentinels_string || '').split(',').map do |sentinel|
host, port = sentinel.split(':')
port = port.present? ? port.to_i : 26_379
{ host: host, port: port }
end.presence
end
end

View File

@ -178,9 +178,9 @@
"eslint-define-config": "^2.0.0",
"eslint-import-resolver-typescript": "^3.5.5",
"eslint-plugin-formatjs": "^4.10.1",
"eslint-plugin-import": "~2.29.0",
"eslint-plugin-import": "~2.30.0",
"eslint-plugin-jsdoc": "^50.0.0",
"eslint-plugin-jsx-a11y": "~6.9.0",
"eslint-plugin-jsx-a11y": "~6.10.0",
"eslint-plugin-promise": "~7.1.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe AccountsIndex do
RSpec.describe AccountsIndex do
describe 'Searching the index' do
before do
mock_elasticsearch_response(described_class, raw_response)

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe PublicStatusesIndex do
RSpec.describe PublicStatusesIndex do
describe 'Searching the index' do
before do
mock_elasticsearch_response(described_class, raw_response)

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe StatusesIndex do
RSpec.describe StatusesIndex do
describe 'Searching the index' do
before do
mock_elasticsearch_response(described_class, raw_response)

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe TagsIndex do
RSpec.describe TagsIndex do
describe 'Searching the index' do
before do
mock_elasticsearch_response(described_class, raw_response)

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Rack::Attack, type: :request do
RSpec.describe Rack::Attack, type: :request do
def app
Rails.application
end

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe ActivityPub::ClaimsController do
RSpec.describe ActivityPub::ClaimsController do
let(:account) { Fabricate(:account) }
describe 'POST #create' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::AccountActionsController do
RSpec.describe Admin::AccountActionsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::ActionLogsController do
RSpec.describe Admin::ActionLogsController do
render_views
# Action logs typically cause issues when their targets are not in the database

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::BaseController do
RSpec.describe Admin::BaseController do
controller do
def success
authorize :dashboard, :index?

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::CustomEmojisController do
RSpec.describe Admin::CustomEmojisController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::DashboardController do
RSpec.describe Admin::DashboardController do
render_views
describe 'GET #index' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::FollowRecommendationsController do
RSpec.describe Admin::FollowRecommendationsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::InvitesController do
RSpec.describe Admin::InvitesController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::IpBlocksController do
RSpec.describe Admin::IpBlocksController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::RelationshipsController do
RSpec.describe Admin::RelationshipsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::RelaysController do
RSpec.describe Admin::RelaysController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::ReportNotesController do
RSpec.describe Admin::ReportNotesController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::Reports::ActionsController do
RSpec.describe Admin::Reports::ActionsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::ReportsController do
RSpec.describe Admin::ReportsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::RolesController do
RSpec.describe Admin::RolesController do
render_views
let(:permissions) { UserRole::Flags::NONE }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::RulesController do
RSpec.describe Admin::RulesController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::SiteUploadsController do
RSpec.describe Admin::SiteUploadsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::StatusesController do
RSpec.describe Admin::StatusesController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::Trends::Links::PreviewCardProvidersController do
RSpec.describe Admin::Trends::Links::PreviewCardProvidersController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::Trends::LinksController do
RSpec.describe Admin::Trends::LinksController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::Trends::StatusesController do
RSpec.describe Admin::Trends::StatusesController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::Trends::TagsController do
RSpec.describe Admin::Trends::TagsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::Users::RolesController do
RSpec.describe Admin::Users::RolesController do
render_views
let(:current_role) { UserRole.create(name: 'Foo', permissions: UserRole::FLAGS[:manage_roles], position: 10) }

View File

@ -3,7 +3,7 @@
require 'rails_helper'
require 'webauthn/fake_client'
describe Admin::Users::TwoFactorAuthenticationsController do
RSpec.describe Admin::Users::TwoFactorAuthenticationsController do
render_views
let(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::WarningPresetsController do
RSpec.describe Admin::WarningPresetsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::Webhooks::SecretsController do
RSpec.describe Admin::Webhooks::SecretsController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Admin::WebhooksController do
RSpec.describe Admin::WebhooksController do
render_views
let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Api::BaseController do
RSpec.describe Api::BaseController do
controller do
def success
head 200

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Api::Web::PushSubscriptionsController do
RSpec.describe Api::Web::PushSubscriptionsController do
render_views
let(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe ApplicationController do
RSpec.describe ApplicationController do
controller do
def success
head 200

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Auth::ChallengesController do
RSpec.describe Auth::ChallengesController do
render_views
let(:password) { 'foobar12345' }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Auth::ConfirmationsController do
RSpec.describe Auth::ConfirmationsController do
render_views
describe 'GET #new' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Auth::PasswordsController do
RSpec.describe Auth::PasswordsController do
include Devise::Test::ControllerHelpers
describe 'GET #new' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Auth::SetupController do
RSpec.describe Auth::SetupController do
render_views
describe 'GET #show' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe AuthorizeInteractionsController do
RSpec.describe AuthorizeInteractionsController do
render_views
describe 'GET #show' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe AccountControllerConcern do
RSpec.describe AccountControllerConcern do
controller(ApplicationController) do
include AccountControllerConcern

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Api::ErrorHandling do
RSpec.describe Api::ErrorHandling do
before do
stub_const('FakeService', Class.new)
end

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Api::RateLimitHeaders do
RSpec.describe Api::RateLimitHeaders do
controller(ApplicationController) do
include Api::RateLimitHeaders

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Localized do
RSpec.describe Localized do
controller(ApplicationController) do
include Localized

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::ExportControllerConcern do
RSpec.describe Settings::ExportControllerConcern do
controller(ApplicationController) do
include Settings::ExportControllerConcern

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe UserTrackingConcern do
RSpec.describe UserTrackingConcern do
controller(ApplicationController) do
include UserTrackingConcern

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Filters::StatusesController do
RSpec.describe Filters::StatusesController do
render_views
describe 'GET #index' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe FiltersController do
RSpec.describe FiltersController do
render_views
describe 'GET #index' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe FollowerAccountsController do
RSpec.describe FollowerAccountsController do
render_views
let(:alice) { Fabricate(:account, username: 'alice') }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe FollowingAccountsController do
RSpec.describe FollowingAccountsController do
render_views
let(:alice) { Fabricate(:account, username: 'alice') }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe InvitesController do
RSpec.describe InvitesController do
render_views
let(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Oauth::AuthorizedApplicationsController do
RSpec.describe Oauth::AuthorizedApplicationsController do
render_views
describe 'GET #index' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe RelationshipsController do
RSpec.describe RelationshipsController do
render_views
let(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::AliasesController do
RSpec.describe Settings::AliasesController do
render_views
let!(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::ApplicationsController do
RSpec.describe Settings::ApplicationsController do
render_views
let!(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::DeletesController do
RSpec.describe Settings::DeletesController do
render_views
describe 'GET #show' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::ExportsController do
RSpec.describe Settings::ExportsController do
render_views
describe 'GET #show' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::FeaturedTagsController do
RSpec.describe Settings::FeaturedTagsController do
render_views
shared_examples 'authenticate user' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::LoginActivitiesController do
RSpec.describe Settings::LoginActivitiesController do
render_views
let!(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::Migration::RedirectsController do
RSpec.describe Settings::Migration::RedirectsController do
render_views
let!(:user) { Fabricate(:user, password: 'testtest') }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::MigrationsController do
RSpec.describe Settings::MigrationsController do
render_views
shared_examples 'authenticate user' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::PicturesController do
RSpec.describe Settings::PicturesController do
render_views
let!(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::Preferences::AppearanceController do
RSpec.describe Settings::Preferences::AppearanceController do
render_views
let!(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::Preferences::BaseController do
RSpec.describe Settings::Preferences::BaseController do
describe 'after_update_redirect_path' do
it 'raises error when called' do
expect { described_class.new.send(:after_update_redirect_path) }.to raise_error(/Override/)

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::Preferences::NotificationsController do
RSpec.describe Settings::Preferences::NotificationsController do
render_views
let(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::Preferences::OtherController do
RSpec.describe Settings::Preferences::OtherController do
render_views
let(:user) { Fabricate(:user, chosen_languages: []) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::SessionsController do
RSpec.describe Settings::SessionsController do
render_views
let(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::TwoFactorAuthentication::ConfirmationsController do
RSpec.describe Settings::TwoFactorAuthentication::ConfirmationsController do
render_views
shared_examples 'renders :new' do

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::TwoFactorAuthentication::OtpAuthenticationController do
RSpec.describe Settings::TwoFactorAuthentication::OtpAuthenticationController do
render_views
let(:user) { Fabricate(:user) }

View File

@ -2,7 +2,7 @@
require 'rails_helper'
describe Settings::TwoFactorAuthentication::RecoveryCodesController do
RSpec.describe Settings::TwoFactorAuthentication::RecoveryCodesController do
render_views
describe 'POST #create' do

View File

@ -3,7 +3,7 @@
require 'rails_helper'
require 'webauthn/fake_client'
describe Settings::TwoFactorAuthentication::WebauthnCredentialsController do
RSpec.describe Settings::TwoFactorAuthentication::WebauthnCredentialsController do
render_views
let(:user) { Fabricate(:user) }

Some files were not shown because too many files have changed in this diff Show More