1
0

Merge commit '5acec087caed4a2fdf0fd8ed11f891222496f321' into glitch-soc/merge-upstream

This commit is contained in:
Claire 2024-09-05 20:36:25 +02:00
commit 1a0ef0c526
64 changed files with 660 additions and 665 deletions

View File

@ -7,6 +7,7 @@
':prConcurrentLimitNone', // Remove limit for open PRs at any time.
':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour.
],
rebaseWhen: 'conflicted',
minimumReleaseAge: '3', // Wait 3 days after the package has been published before upgrading it
// packageRules order is important, they are applied from top to bottom and are merged,
// meaning the most important ones must be at the bottom, for example grouping rules

View File

@ -1,6 +1,6 @@
# This configuration was generated by
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-offense-counts --no-auto-gen-timestamp`
# using RuboCop version 1.65.0.
# using RuboCop version 1.66.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
@ -35,7 +35,6 @@ Rails/OutputSafety:
# Configuration parameters: AllowedVars.
Style/FetchEnvVar:
Exclude:
- 'app/lib/redis_configuration.rb'
- 'app/lib/translation_service.rb'
- 'config/environments/production.rb'
- 'config/initializers/2_limited_federation_mode.rb'
@ -44,7 +43,6 @@ Style/FetchEnvVar:
- 'config/initializers/devise.rb'
- 'config/initializers/paperclip.rb'
- 'config/initializers/vapid.rb'
- 'lib/mastodon/redis_config.rb'
- 'lib/tasks/repo.rake'
# This cop supports safe autocorrection (--autocorrect).
@ -93,7 +91,6 @@ Style/OptionalBooleanParameter:
- 'app/services/fetch_resource_service.rb'
- 'app/workers/domain_block_worker.rb'
- 'app/workers/unfollow_follow_worker.rb'
- 'lib/mastodon/redis_config.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.

View File

@ -12,7 +12,7 @@ ARG BUILDPLATFORM=${BUILDPLATFORM}
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.x"]
# renovate: datasource=docker depName=docker.io/ruby
ARG RUBY_VERSION="3.3.4"
ARG RUBY_VERSION="3.3.5"
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
# renovate: datasource=node-version depName=node
ARG NODE_MAJOR_VERSION="20"

View File

@ -584,7 +584,7 @@ GEM
ostruct (0.6.0)
ox (2.14.18)
parallel (1.26.3)
parser (3.3.4.2)
parser (3.3.5.0)
ast (~> 2.4.1)
racc
parslet (2.0.0)
@ -698,8 +698,7 @@ GEM
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.3.6)
strscan
rexml (3.3.7)
rotp (6.3.0)
rouge (4.3.0)
rpam2 (4.0.2)
@ -735,18 +734,17 @@ GEM
rspec-mocks (~> 3.0)
sidekiq (>= 5, < 8)
rspec-support (3.13.1)
rubocop (1.65.1)
rubocop (1.66.1)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.4, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.31.1, < 2.0)
rubocop-ast (>= 1.32.2, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.32.1)
rubocop-ast (1.32.3)
parser (>= 3.3.1.0)
rubocop-capybara (2.21.0)
rubocop (~> 1.41)
@ -826,7 +824,6 @@ GEM
stringio (3.1.1)
strong_migrations (2.0.0)
activerecord (>= 6.1)
strscan (3.1.0)
swd (1.3.0)
activesupport (>= 3)
attr_required (>= 0.0.5)

View File

@ -170,7 +170,7 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
return (
<HotKeys handlers={handlers}>
<div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex={0}>
<div className={classNames('conversation focusable muted', { unread })} tabIndex={0}>
<div className='conversation__avatar' onClick={handleClick} role='presentation'>
<AvatarComposite accounts={accounts} size={48} />
</div>

View File

@ -95,6 +95,8 @@
"block_modal.title": "أتريد حظر هذا المستخدم؟",
"block_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيهم إليه.",
"boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة",
"boost_modal.reblog": "أتريد إعادة نشر المنشور؟",
"boost_modal.undo_reblog": "أتريد إلغاء إعادة نشر المنشور؟",
"bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ",
"bundle_column_error.error.body": "لا يمكن تقديم الصفحة المطلوبة. قد يكون بسبب خطأ في التعليمات البرمجية، أو مشكلة توافق المتصفح.",
"bundle_column_error.error.title": "أوه لا!",
@ -230,7 +232,7 @@
"domain_pill.who_they_are": "بما أن المعرفات تقول من هو الشخص ومكان وجوده، يمكنك التفاعل مع الناس عبر الويب الاجتماعي لل <button>منصات التي تعمل ب ActivityPub</button>.",
"domain_pill.who_you_are": "بما أن معرفك يقول من أنت ومكان وجوده، يمكن للناس التفاعل معك عبر الويب الاجتماعي لل <button>منصات التي تعمل ب ActivityPub</button>.",
"domain_pill.your_handle": "عنوانك الكامل:",
"domain_pill.your_server": نزلك الرقمي، حيث تعيش جميع مشاركاتك. لا تحب هذا؟ إنقل الخوادم في أي وقت واخضر متابعينك أيضًا.",
"domain_pill.your_server": وطِنك الرقمي، حيث توجد فيه كافة منشوراتك. ألا يعجبك المكان؟ يمكنك الانتقال بين الخوادم في أي وقت واصطحاب متابعيك أيضاً.",
"domain_pill.your_username": "معرفك الفريد على هذا الخادم. من الممكن العثور على مستخدمين بنفس إسم المستخدم على خوادم مختلفة.",
"embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
"embed.preview": "إليك ما سيبدو عليه:",
@ -290,7 +292,7 @@
"filter_modal.added.review_and_configure": "لمراجعة وزيادة تكوين فئة عوامل التصفية هذه، انتقل إلى {settings_link}.",
"filter_modal.added.review_and_configure_title": "إعدادات التصفية",
"filter_modal.added.settings_link": "صفحة الإعدادات",
"filter_modal.added.short_explanation": "تمت إضافة هذه المشاركة إلى فئة الفلاتر التالية: {title}.",
"filter_modal.added.short_explanation": "تمت إضافة هذا المنشور إلى فئة عوامل التصفية التالية: {title}.",
"filter_modal.added.title": "تمت إضافة عامل التصفية!",
"filter_modal.select_filter.context_mismatch": "لا ينطبق على هذا السياق",
"filter_modal.select_filter.expired": "منتهية الصلاحيّة",
@ -348,6 +350,9 @@
"hashtag.follow": "اتبع الوسم",
"hashtag.unfollow": "ألغِ متابعة الوسم",
"hashtags.and_other": "…و {count, plural, zero {} one {# واحد آخر} two {# اثنان آخران} few {# آخرون} many {# آخَرًا}other {# آخرون}}",
"hints.profiles.see_more_followers": "عرض المزيد من المتابعين على {domain}",
"hints.profiles.see_more_posts": "عرض المزيد من المنشورات من {domain}",
"hints.threads.see_more": "اطلع على المزيد من الردود على {domain}",
"home.column_settings.show_reblogs": "اعرض المعاد نشرها",
"home.column_settings.show_replies": "اعرض الردود",
"home.hide_announcements": "إخفاء الإعلانات",
@ -356,8 +361,10 @@
"home.pending_critical_update.title": "تحديث أمان حرج متوفر!",
"home.show_announcements": "إظهار الإعلانات",
"ignore_notifications_modal.disclaimer": "لا يمكن لـ Mastodon إبلاغ المستخدمين بأنك قد تجاهلت إشعاراتهم. تجاهل الإشعارات لن يمنع إرسال الرسائل نفسها.",
"ignore_notifications_modal.filter_instead": "تصفيتها بدلا من ذلك",
"ignore_notifications_modal.ignore": "تجاهل الإشعارات",
"ignore_notifications_modal.limited_accounts_title": "تجاهل الإشعارات من الحسابات التي هي تحت الإشراف؟",
"ignore_notifications_modal.new_accounts_title": "تجاهل الإشعارات الصادرة من الحسابات الجديدة؟",
"interaction_modal.description.favourite": "بفضل حساب على ماستدون، يمكنك إضافة هذا المنشور إلى مفضلتك لإبلاغ الناشر عن تقديرك وكذا للاحتفاظ بالمنشور إلى وقت لاحق.",
"interaction_modal.description.follow": "بفضل حساب في ماستدون، يمكنك متابعة {name} وتلقي منشوراته في موجزات خيطك الرئيس.",
"interaction_modal.description.reblog": "مع حساب في ماستدون، يمكنك تعزيز هذا المنشور ومشاركته مع مُتابِعيك.",
@ -447,6 +454,7 @@
"mute_modal.you_wont_see_mentions": "لن تر المنشورات التي يُشار فيها إليه.",
"mute_modal.you_wont_see_posts": "سيكون بإمكانه رؤية منشوراتك، لكنك لن ترى منشوراته.",
"navigation_bar.about": "عن",
"navigation_bar.administration": "الإدارة",
"navigation_bar.advanced_interface": "افتحه في واجهة الويب المتقدمة",
"navigation_bar.blocks": "الحسابات المحجوبة",
"navigation_bar.bookmarks": "الفواصل المرجعية",
@ -463,6 +471,7 @@
"navigation_bar.follows_and_followers": "المتابِعون والمتابَعون",
"navigation_bar.lists": "القوائم",
"navigation_bar.logout": "خروج",
"navigation_bar.moderation": "الإشراف",
"navigation_bar.mutes": "الحسابات المكتومة",
"navigation_bar.opened_in_classic_interface": "تُفتَح المنشورات والحسابات وغيرها من الصفحات الخاصة بشكل مبدئي على واجهة الويب التقليدية.",
"navigation_bar.personal": "شخصي",
@ -484,7 +493,7 @@
"notification.mention": "إشارة",
"notification.moderation-warning.learn_more": "اعرف المزيد",
"notification.moderation_warning": "لقد تلقيت تحذيرًا بالإشراف",
"notification.moderation_warning.action_delete_statuses": "تم إزالة بعض مشاركاتك.",
"notification.moderation_warning.action_delete_statuses": "تم حذف بعض من منشوراتك.",
"notification.moderation_warning.action_disable": "تم تعطيل حسابك.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "بعض من منشوراتك تم تصنيفها على أنها حساسة.",
"notification.moderation_warning.action_none": "لقد تلقى حسابك تحذيرا بالإشراف.",
@ -502,12 +511,15 @@
"notification.status": "{name} نشر للتو",
"notification.update": "عدّلَ {name} منشورًا",
"notification_requests.accept": "موافقة",
"notification_requests.confirm_accept_multiple.title": "قبول طلبات الإشعار؟",
"notification_requests.confirm_dismiss_multiple.title": "تجاهل طلبات الإشعار؟",
"notification_requests.dismiss": "تخطي",
"notification_requests.edit_selection": "تعديل",
"notification_requests.exit_selection": "تمّ",
"notification_requests.explainer_for_limited_account": "تم تصفية الإشعارات من هذا الحساب لأن الحساب تم تقييده من قبل مشرف.",
"notification_requests.notifications_from": "إشعارات من {name}",
"notification_requests.title": "الإشعارات المصفاة",
"notification_requests.view": "عرض الإشعارات",
"notifications.clear": "مسح الإشعارات",
"notifications.clear_confirmation": "متأكد من أنك تود مسح جميع الإشعارات الخاصة بك و المتلقاة إلى حد الآن ؟",
"notifications.clear_title": "أترغب في مسح الإشعارات؟",
@ -520,7 +532,7 @@
"notifications.column_settings.filter_bar.advanced": "عرض جميع الفئات",
"notifications.column_settings.filter_bar.category": "شريط التصفية السريعة",
"notifications.column_settings.follow": "متابعُون جُدُد:",
"notifications.column_settings.follow_request": "الطلبات الجديد لِمتابَعتك:",
"notifications.column_settings.follow_request": "الطلبات الجديدة لِمتابَعتك:",
"notifications.column_settings.mention": "الإشارات:",
"notifications.column_settings.poll": "نتائج استطلاع الرأي:",
"notifications.column_settings.push": "الإشعارات",
@ -747,7 +759,7 @@
"status.history.edited": "عدله {name} {date}",
"status.load_more": "حمّل المزيد",
"status.media.open": "اضغط للفتح",
"status.media.show": "اضغط للإظهار",
"status.media.show": "اضغط لإظهاره",
"status.media_hidden": "وسائط مخفية",
"status.mention": "أذكُر @{name}",
"status.more": "المزيد",

View File

@ -356,6 +356,7 @@
"hints.profiles.follows_may_be_missing": "Les abonnements pour ce profil peuvent être manquants.",
"hints.profiles.posts_may_be_missing": "Certains messages de ce profil peuvent être manquants.",
"hints.profiles.see_more_followers": "Afficher plus d'abonné·e·s sur {domain}",
"hints.profiles.see_more_follows": "Afficher plus d'abonné·e·s sur {domain}",
"hints.profiles.see_more_posts": "Voir plus de messages sur {domain}",
"hints.threads.replies_may_be_missing": "Les réponses provenant des autres serveurs pourraient être manquantes.",
"hints.threads.see_more": "Afficher plus de réponses sur {domain}",

View File

@ -356,6 +356,7 @@
"hints.profiles.follows_may_be_missing": "Les abonnements pour ce profil peuvent être manquants.",
"hints.profiles.posts_may_be_missing": "Certains messages de ce profil peuvent être manquants.",
"hints.profiles.see_more_followers": "Afficher plus d'abonné·e·s sur {domain}",
"hints.profiles.see_more_follows": "Afficher plus d'abonné·e·s sur {domain}",
"hints.profiles.see_more_posts": "Voir plus de messages sur {domain}",
"hints.threads.replies_may_be_missing": "Les réponses provenant des autres serveurs pourraient être manquantes.",
"hints.threads.see_more": "Afficher plus de réponses sur {domain}",

View File

@ -43,7 +43,7 @@
"account.in_memoriam": "Em Memória.",
"account.joined_short": "Juntou-se a",
"account.languages": "Alterar línguas subscritas",
"account.link_verified_on": "A posse desta ligação foi verificada em {date}",
"account.link_verified_on": "O proprietário desta hiperligação foi verificado em {date}",
"account.locked_info": "Esta conta é privada. O proprietário revê manualmente quem o pode seguir.",
"account.media": "Média",
"account.mention": "Mencionar @{name}",
@ -154,15 +154,15 @@
"compose_form.lock_disclaimer": "A sua conta não é {locked}. Qualquer pessoa pode segui-lo e ver as publicações direcionadas apenas a seguidores.",
"compose_form.lock_disclaimer.lock": "fechada",
"compose_form.placeholder": "Em que está a pensar?",
"compose_form.poll.duration": "Duração do inquérito",
"compose_form.poll.duration": "Duração da sondagem",
"compose_form.poll.multiple": "Escolha múltipla",
"compose_form.poll.option_placeholder": "Opção {number}",
"compose_form.poll.single": "Escolha uma",
"compose_form.poll.switch_to_multiple": "Alterar o inquérito para permitir várias respostas",
"compose_form.poll.switch_to_single": "Alterar o inquérito para permitir uma única resposta",
"compose_form.poll.switch_to_multiple": "Alterar a sondagem para permitir várias respostas",
"compose_form.poll.switch_to_single": "Alterar a sondagem para permitir uma única resposta",
"compose_form.poll.type": "Estilo",
"compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar",
"compose_form.publish_form": "Nova publicação",
"compose_form.reply": "Responder",
"compose_form.save_changes": "Atualizar",
"compose_form.spoiler.marked": "Texto escondido atrás de aviso",
@ -189,7 +189,7 @@
"confirmations.redraft.message": "Tem a certeza de que quer eliminar e reescrever esta publicação? Os favoritos e partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.",
"confirmations.redraft.title": "Eliminar e reescrever publicação?",
"confirmations.reply.confirm": "Responder",
"confirmations.reply.message": "Responder agora irá reescrever a mensagem que está a compor actualmente. Tem a certeza que quer continuar?",
"confirmations.reply.message": "Se responder agora, a mensagem que está a escrever será substituída. Tem a certeza que pretende continuar?",
"confirmations.reply.title": "Sobrescrever publicação?",
"confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?",
@ -206,14 +206,14 @@
"directory.federated": "Do fediverso conhecido",
"directory.local": "Apenas de {domain}",
"directory.new_arrivals": "Recém chegados",
"directory.recently_active": "Com actividade recente",
"directory.recently_active": "Recentemente ativo",
"disabled_account_banner.account_settings": "Definições da conta",
"disabled_account_banner.text": "A sua conta {disabledAccount} está presentemente desativada.",
"dismissable_banner.community_timeline": "Estas são as publicações públicas mais recentes de pessoas cujas contas são hospedadas por {domain}.",
"dismissable_banner.dismiss": "Descartar",
"dismissable_banner.explore_links": "Essas histórias de notícias estão, no momento, a ser faladas por pessoas neste e noutros servidores da rede descentralizada.",
"dismissable_banner.explore_statuses": "Estas são publicações de toda a rede social que estão a ganhar popularidade atualmente. As mensagens mais recentes com mais partilhas e favoritos obtêm uma classificação mais elevada.",
"dismissable_banner.explore_tags": "Estas #etiquetas estão presentemente a ganhar atenção entre as pessoas neste e noutros servidores da rede descentralizada.",
"dismissable_banner.explore_tags": "Estas são hashtags que estão a ganhar força na rede social atualmente. As hashtags que são utilizadas por mais pessoas diferentes têm uma classificação mais elevada.",
"dismissable_banner.public_timeline": "Estas são as publicações públicas mais recentes de pessoas na rede social que as pessoas em {domain} seguem.",
"domain_block_modal.block": "Bloquear servidor",
"domain_block_modal.block_account_instead": "Bloquear @{name} em alternativa",
@ -238,7 +238,7 @@
"domain_pill.your_username": "O seu identificador único neste servidor. É possível encontrar utilizadores com o mesmo nome de utilizador em diferentes servidores.",
"embed.instructions": "Incorpore esta publicação no seu site copiando o código abaixo.",
"embed.preview": "Podes ver aqui como irá ficar:",
"emoji_button.activity": "Actividade",
"emoji_button.activity": "Atividade",
"emoji_button.clear": "Limpar",
"emoji_button.custom": "Personalizar",
"emoji_button.flags": "Bandeiras",
@ -246,7 +246,7 @@
"emoji_button.label": "Inserir Emoji",
"emoji_button.nature": "Natureza",
"emoji_button.not_found": "Nenhum emoji correspondente encontrado",
"emoji_button.objects": "Objectos",
"emoji_button.objects": "Objetos",
"emoji_button.people": "Pessoas",
"emoji_button.recent": "Utilizados regularmente",
"emoji_button.search": "Pesquisar...",
@ -258,24 +258,24 @@
"empty_column.account_timeline": "Sem publicações por aqui!",
"empty_column.account_unavailable": "Perfil indisponível",
"empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.",
"empty_column.bookmarked_statuses": "Ainda não adicionou nenhuma publicação aos itens salvos. Quando adicionar, eles serão exibidos aqui.",
"empty_column.bookmarked_statuses": "Ainda não tem nenhuma publicação marcada. Quando marcar uma, ela aparecerá aqui.",
"empty_column.community": "A cronologia local está vazia. Escreve algo público para começar!",
"empty_column.direct": "Ainda não tem qualquer menção privada. Quando enviar ou receber uma, ela irá aparecer aqui.",
"empty_column.domain_blocks": "Ainda não há qualquer domínio escondido.",
"empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!",
"empty_column.explore_statuses": "Nada é tendência neste momento. Volte mais tarde!",
"empty_column.favourited_statuses": "Ainda não assinalou qualquer publicação como favorita. Quando o fizer, aparecerá aqui.",
"empty_column.favourites": "Ainda ninguém assinalou esta publicação como favorita. Quando alguém o fizer, aparecerá aqui.",
"empty_column.follow_requests": "Ainda não tens nenhum pedido de seguidor. Quando receberes algum, ele irá aparecer aqui.",
"empty_column.followed_tags": "Ainda não segue nenhuma hashtag. Quando o fizer, ela aparecerá aqui.",
"empty_column.hashtag": "Não foram encontradas publicações com essa #etiqueta.",
"empty_column.home": "Ainda não segues qualquer utilizador. Visita {public} ou utiliza a pesquisa para procurar outros utilizadores.",
"empty_column.home": "A sua linha cronológica inicial está vazia! Siga mais pessoas para a preencher.",
"empty_column.list": "Ainda não existem publicações nesta lista. Quando membros desta lista fizerem novas publicações, elas aparecerão aqui.",
"empty_column.lists": "Ainda não tem qualquer lista. Quando criar uma, ela irá aparecer aqui.",
"empty_column.mutes": "Ainda não silenciaste qualquer utilizador.",
"empty_column.notification_requests": "Tudo limpo! Não há nada aqui. Quando você receber novas notificações, elas aparecerão aqui conforme as suas configurações.",
"empty_column.notifications": "Não tens notificações. Interage com outros utilizadores para iniciar uma conversa.",
"empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para veres aqui os conteúdos públicos",
"error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a uma compatilidade com o seu navegador, esta página não pôde ser apresentada correctamente.",
"error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a um problema de compatibilidade do navegador, esta página não pôde ser apresentada corretamente.",
"error.unexpected_crash.explanation_addons": "Esta página não pôde ser exibida corretamente. Este erro provavelmente é causado por um complemento do navegador ou ferramentas de tradução automática.",
"error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, pode usar o Mastodon através de um navegador diferente ou uma aplicação nativa.",
"error.unexpected_crash.next_steps_addons": "Tente desabilitá-los e atualizar a página. Se isso não ajudar, você ainda poderá usar o Mastodon por meio de um navegador diferente ou de um aplicativo nativo.",
@ -355,10 +355,10 @@
"hashtags.and_other": "…e {count, plural, other {mais #}}",
"hints.profiles.followers_may_be_missing": "Podem faltar seguidores neste perfil.",
"hints.profiles.follows_may_be_missing": "O número de perfis seguidos por este perfil pode faltar.",
"hints.profiles.posts_may_be_missing": "Podem faltar alguns posts deste perfil.",
"hints.profiles.posts_may_be_missing": "Podem faltar algumas publicações deste perfil.",
"hints.profiles.see_more_followers": "Ver mais seguidores no {domain}",
"hints.profiles.see_more_follows": "Veja mais perfis seguidos em {domain}",
"hints.profiles.see_more_posts": "Ver mais posts em {domain}",
"hints.profiles.see_more_posts": "Ver mais publicações em {domain}",
"home.column_settings.show_reblogs": "Mostrar impulsos",
"home.column_settings.show_replies": "Mostrar respostas",
"home.hide_announcements": "Ocultar comunicações",
@ -406,7 +406,7 @@
"keyboard_shortcuts.my_profile": "para abrir o teu perfil",
"keyboard_shortcuts.notifications": "para abrir a coluna das notificações",
"keyboard_shortcuts.open_media": "para abrir media",
"keyboard_shortcuts.pinned": "para abrir a lista dos toots fixados",
"keyboard_shortcuts.pinned": "Abrir lista de publicações fixadas",
"keyboard_shortcuts.profile": "para abrir o perfil do autor",
"keyboard_shortcuts.reply": "para responder",
"keyboard_shortcuts.requests": "para abrir a lista dos pedidos de seguidor",
@ -475,7 +475,7 @@
"navigation_bar.mutes": "Utilizadores silenciados",
"navigation_bar.opened_in_classic_interface": "Por norma, publicações, contas, e outras páginas específicas são abertas na interface web clássica.",
"navigation_bar.personal": "Pessoal",
"navigation_bar.pins": "Toots afixados",
"navigation_bar.pins": "Publicações fixadas",
"navigation_bar.preferences": "Preferências",
"navigation_bar.public_timeline": "Cronologia federada",
"navigation_bar.search": "Pesquisar",
@ -504,8 +504,8 @@
"notification.moderation_warning.action_sensitive": "As suas publicações serão, a partir de agora, assinaladas como sensíveis.",
"notification.moderation_warning.action_silence": "A sua conta foi limitada.",
"notification.moderation_warning.action_suspend": "A sua conta foi suspensa.",
"notification.own_poll": "A sua votação terminou",
"notification.poll": "Uma votação em que participaste chegou ao fim",
"notification.own_poll": "A sua sondagem terminou",
"notification.poll": "Terminou uma sondagem em que votou",
"notification.reblog": "{name} reforçou a tua publicação",
"notification.relationships_severance_event": "Perdeu as ligações com {name}",
"notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que já não pode receber atualizações dele ou interagir com ele.",
@ -536,7 +536,7 @@
"notifications.column_settings.follow": "Novos seguidores:",
"notifications.column_settings.follow_request": "Novos pedidos de seguidor:",
"notifications.column_settings.mention": "Menções:",
"notifications.column_settings.poll": "Resultados do inquérito:",
"notifications.column_settings.poll": "Resultados da sondagem:",
"notifications.column_settings.push": "Notificações Push",
"notifications.column_settings.reblog": "Reforços:",
"notifications.column_settings.show": "Mostrar na coluna",
@ -550,7 +550,7 @@
"notifications.filter.favourites": "Favoritos",
"notifications.filter.follows": "Seguidores",
"notifications.filter.mentions": "Menções",
"notifications.filter.polls": "Resultados do inquérito",
"notifications.filter.polls": "Resultados da sondagem",
"notifications.filter.statuses": "Atualizações de pessoas que você segue",
"notifications.grant_permission": "Conceder permissão.",
"notifications.group": "{count} notificações",
@ -573,7 +573,7 @@
"notifications_permission_banner.title": "Nunca perca nada",
"onboarding.action.back": "Voltar atrás",
"onboarding.actions.back": "Voltar atrás",
"onboarding.actions.go_to_explore": "Veja as tendências atuais",
"onboarding.actions.go_to_explore": "Ver tendências atuais",
"onboarding.actions.go_to_home": "Ir para a sua página inicial",
"onboarding.compose.template": "Olá #Mastodon!",
"onboarding.follows.empty": "Infelizmente, não é possível mostrar resultados neste momento. Pode tentar utilizar a pesquisa ou navegar na página \"Explorar\" para encontrar pessoas para seguir ou tentar novamente mais tarde.",
@ -599,7 +599,7 @@
"onboarding.start.title": "Conseguiu!",
"onboarding.steps.follow_people.body": "Seguir pessoas interessantes é o propósito do Mastodon. ",
"onboarding.steps.follow_people.title": "Personalize o seu feed",
"onboarding.steps.publish_status.body": "Diga olá ao mundo com texto, fotos, vídeos ou votos {emoji}",
"onboarding.steps.publish_status.body": "Diga olá ao mundo com texto, fotos, vídeos ou sondagens {emoji}",
"onboarding.steps.publish_status.title": "Faça a sua primeira publicação",
"onboarding.steps.setup_profile.body": "Promova as suas interações para ter um perfil preenchido. ",
"onboarding.steps.setup_profile.title": "Personalize o seu perfil",
@ -608,19 +608,19 @@
"onboarding.tips.2fa": "<strong>Sabia?</strong> Pode proteger a sua conta ativando a autenticação em duas etapas nas configurações de conta. Funciona com qualquer aplicativo TOTP à sua escolha, sem necessitar de um número de telefone!",
"onboarding.tips.accounts_from_other_servers": "<strong>Sabia?</strong> Como o Mastodon é descentralizado, alguns perfis que encontra estarão hospedados noutros servidores que não os seus. E ainda assim pode interagir com eles perfeitamente! O servidor deles está na segunda metade do nome de utilizador!",
"onboarding.tips.migration": "<strong>Sabia?</strong> Se sentir que o {domain} não é um bom servidor para si, no futuro pode mudar para outro servidor Mastodon sem perder os seus seguidores. Pode até mesmo hospedar o seu próprio servidor!",
"onboarding.tips.verification": "<strong>Sabia que?</strong> Pode fazer a verificação do seu site, adicionando o link do seu perfil à primeira página do seu site, como também pode adicionar o seu site ao seu perfil? Sem taxas ou documentos!",
"onboarding.tips.verification": "<strong>Sabia que?</strong> Pode verificar a sua conta colocando uma hiperligação para o seu perfil Mastodon no seu próprio site e adicionando o site ao seu perfil. Sem taxas ou documentos!",
"password_confirmation.exceeds_maxlength": "A confirmação da palavra-passe excedeu o tamanho máximo ",
"password_confirmation.mismatching": "A confirmação da palavra-passe não corresponde",
"picture_in_picture.restore": "Colocá-lo de volta",
"poll.closed": "Fechado",
"poll.refresh": "Recarregar",
"poll.refresh": "Atualizar",
"poll.reveal": "Ver resultados",
"poll.total_people": "{count, plural, one {# pessoa} other {# pessoas}}",
"poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
"poll.vote": "Votar",
"poll.voted": "Votaste nesta resposta",
"poll.voted": "Votou nesta resposta",
"poll.votes": "{votes, plural, one {# voto } other {# votos}}",
"poll_button.add_poll": "Adicionar votação",
"poll_button.add_poll": "Adicionar uma sondagem",
"poll_button.remove_poll": "Remover sondagem",
"privacy.change": "Ajustar a privacidade da publicação",
"privacy.direct.long": "Todos os mencionados na publicação",
@ -635,7 +635,7 @@
"privacy_policy.last_updated": "Última atualização em {date}",
"privacy_policy.title": "Política de privacidade",
"recommended": "Recomendado",
"refresh": "Actualizar",
"refresh": "Atualizar",
"regeneration_indicator.label": "A carregar…",
"regeneration_indicator.sublabel": "A tua página inicial está a ser preparada!",
"relative_time.days": "{number}d",
@ -677,7 +677,7 @@
"report.reasons.other": "É outra coisa",
"report.reasons.other_description": "O problema não se encaixa nas outras categorias",
"report.reasons.spam": "É spam",
"report.reasons.spam_description": "Hiperligações maliciosas, contactos falsos, ou respostas repetitivas",
"report.reasons.spam_description": "Hiperligações maliciosas, contactos falsos ou respostas repetitivas",
"report.reasons.violation": "Viola as regras do servidor",
"report.reasons.violation_description": "Está ciente de que infringe regras específicas",
"report.rules.subtitle": "Selecione tudo o que se aplicar",
@ -733,8 +733,8 @@
"sign_in_banner.create_account": "Criar conta",
"sign_in_banner.follow_anyone": "Siga alguém no fediverso e veja tudo em ordem cronológica. Sem algoritmos, anúncios ou clickbait à vista.",
"sign_in_banner.mastodon_is": "O Mastodon é a melhor maneira de acompanhar o que está a acontecer.",
"sign_in_banner.sign_in": "Iniciar Sessão",
"sign_in_banner.sso_redirect": "Inicie Sessão ou Registe-se",
"sign_in_banner.sign_in": "Iniciar sessão",
"sign_in_banner.sso_redirect": "Inicie sessão ou registe-se",
"status.admin_account": "Abrir a interface de moderação para @{name}",
"status.admin_domain": "Abrir interface de moderação para {domain}",
"status.admin_status": "Abrir esta publicação na interface de moderação",
@ -742,7 +742,7 @@
"status.bookmark": "Guardar nos marcadores",
"status.cancel_reblog_private": "Deixar de reforçar",
"status.cannot_reblog": "Não é possível partilhar esta publicação",
"status.copy": "Copiar ligação para a publicação",
"status.copy": "Copiar hiperligação para a publicação",
"status.delete": "Eliminar",
"status.detailed_status": "Vista pormenorizada da conversa",
"status.direct": "Mencionar @{name} em privado",
@ -801,15 +801,15 @@
"time_remaining.moments": "Momentos restantes",
"time_remaining.seconds": "{número, plural, um {# second} outro {# seconds}} faltam",
"trends.counter_by_accounts": "{count, plural, one {{counter} pessoa} other {{counter} pessoas}} {days, plural, one {no último dia} other {nos últimos {days} dias}}",
"trends.trending_now": "Em alta neste momento",
"trends.trending_now": "Tendências atuais",
"ui.beforeunload": "O teu rascunho será perdido se abandonares o Mastodon.",
"units.short.billion": "{count}MM",
"units.short.million": "{count}M",
"units.short.thousand": "{count}m",
"upload_area.title": "Arraste e solte para enviar",
"upload_button.label": "Juntar imagens, um vídeo, ou um ficheiro de som",
"upload_error.limit": "Limite máximo do ficheiro a carregar excedido.",
"upload_error.poll": "O carregamento de ficheiros não é permitido em sondagens.",
"upload_area.title": "Arrastar e largar para enviar",
"upload_button.label": "Adicionar imagens, um vídeo ou um ficheiro de som",
"upload_error.limit": "Limite de envio de ficheiros excedido.",
"upload_error.poll": "Não é permitido o envio de ficheiros em sondagens.",
"upload_form.audio_description": "Descreva para pessoas com diminuição da acuidade auditiva",
"upload_form.description": "Descreva para pessoas com diminuição da acuidade visual",
"upload_form.edit": "Editar",
@ -820,7 +820,7 @@
"upload_modal.applying": "A aplicar…",
"upload_modal.choose_image": "Escolher imagem",
"upload_modal.description_placeholder": "Grave e cabisbaixo, o filho justo zelava pela querida mãe doente",
"upload_modal.detect_text": "Detectar texto na imagem",
"upload_modal.detect_text": "Detetar texto na imagem",
"upload_modal.edit_media": "Editar media",
"upload_modal.hint": "Clique ou arraste o círculo na pré-visualização para escolher o ponto focal que será sempre visível em todas as miniaturas.",
"upload_modal.preparing_ocr": "A preparar o reconhecimento de caracteres (OCR)…",

View File

@ -2789,7 +2789,7 @@ $ui-header-logo-wordmark-width: 99px;
}
.column {
width: 350px;
width: 400px;
position: relative;
box-sizing: border-box;
display: flex;
@ -2822,7 +2822,7 @@ $ui-header-logo-wordmark-width: 99px;
}
.drawer {
width: 300px;
width: 350px;
box-sizing: border-box;
display: flex;
flex-direction: column;
@ -6437,7 +6437,7 @@ a.status-card {
}
.dialog-option .poll__input {
border-color: $inverted-text-color;
border-color: $darker-text-color;
color: $ui-secondary-color;
display: inline-flex;
align-items: center;
@ -6451,13 +6451,13 @@ a.status-card {
&:active,
&:focus,
&:hover {
border-color: lighten($inverted-text-color, 15%);
border-color: $valid-value-color;
border-width: 4px;
}
&.active {
border-color: $inverted-text-color;
background: $inverted-text-color;
border-color: $valid-value-color;
background: $valid-value-color;
}
}
@ -8522,22 +8522,6 @@ noscript {
word-break: break-word;
}
}
&--unread {
background: lighten($ui-base-color, 2%);
&:focus {
background: lighten($ui-base-color, 4%);
}
.conversation__content__info {
font-weight: 700;
}
.conversation__content__relative-time {
color: $primary-text-color;
}
}
}
.announcements {
@ -8732,7 +8716,8 @@ noscript {
}
.notification,
.status__wrapper {
.status__wrapper,
.conversation {
position: relative;
&.unread {
@ -10931,6 +10916,7 @@ noscript {
}
.content-warning {
box-sizing: border-box;
background: rgba($ui-highlight-color, 0.05);
color: $secondary-text-color;
border-top: 1px solid;

View File

@ -28,22 +28,18 @@ class AnnualReport::Archetype < AnnualReport::Source
end
def polls_count
@polls_count ||= base_scope.where.not(poll_id: nil).count
@polls_count ||= report_statuses.where.not(poll_id: nil).count
end
def reblogs_count
@reblogs_count ||= base_scope.where.not(reblog_of_id: nil).count
@reblogs_count ||= report_statuses.where.not(reblog_of_id: nil).count
end
def replies_count
@replies_count ||= base_scope.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count
@replies_count ||= report_statuses.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count
end
def standalone_count
@standalone_count ||= base_scope.without_replies.without_reblogs.count
end
def base_scope
@account.statuses.where(id: year_as_snowflake_range)
@standalone_count ||= report_statuses.without_replies.without_reblogs.count
end
end

View File

@ -17,6 +17,6 @@ class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source
private
def commonly_interacted_with_accounts
@account.statuses.reorder(nil).where(id: year_as_snowflake_range).where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('in_reply_to_account_id, count(*) AS total'))
report_statuses.where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('in_reply_to_account_id, count(*) AS total'))
end
end

View File

@ -17,6 +17,6 @@ class AnnualReport::MostRebloggedAccounts < AnnualReport::Source
private
def most_reblogged_accounts
@account.statuses.reorder(nil).where(id: year_as_snowflake_range).where.not(reblog_of_id: nil).joins(reblog: :account).group('accounts.id').having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('accounts.id, count(*) as total'))
report_statuses.where.not(reblog_of_id: nil).joins(reblog: :account).group('accounts.id').having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('accounts.id, count(*) as total'))
end
end

View File

@ -17,6 +17,6 @@ class AnnualReport::MostUsedApps < AnnualReport::Source
private
def most_used_apps
@account.statuses.reorder(nil).where(id: year_as_snowflake_range).joins(:application).group('oauth_applications.name').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('oauth_applications.name, count(*) as total'))
report_statuses.joins(:application).group('oauth_applications.name').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('oauth_applications.name, count(*) as total'))
end
end

View File

@ -17,7 +17,7 @@ class AnnualReport::Percentiles < AnnualReport::Source
end
def statuses_created
@statuses_created ||= @account.statuses.where(id: year_as_snowflake_range).count
@statuses_created ||= report_statuses.count
end
def total_with_fewer_followers

View File

@ -10,6 +10,13 @@ class AnnualReport::Source
protected
def report_statuses
@account
.statuses
.where(id: year_as_snowflake_range)
.reorder(nil)
end
def year_as_snowflake_range
(beginning_snowflake_id..ending_snowflake_id)
end

View File

@ -17,7 +17,7 @@ class AnnualReport::TimeSeries < AnnualReport::Source
private
def statuses_per_month
@statuses_per_month ||= @account.statuses.reorder(nil).where(id: year_as_snowflake_range).group(:period).pluck(Arel.sql("date_part('month', created_at)::int AS period, count(*)")).to_h
@statuses_per_month ||= report_statuses.group(:period).pluck(Arel.sql("date_part('month', created_at)::int AS period, count(*)")).to_h
end
def following_per_month

View File

@ -17,6 +17,6 @@ class AnnualReport::TopHashtags < AnnualReport::Source
private
def top_hashtags
Tag.joins(:statuses).where(statuses: { id: @account.statuses.where(id: year_as_snowflake_range).reorder(nil).select(:id) }).group(:id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('COALESCE(tags.display_name, tags.name), count(*) AS total'))
Tag.joins(:statuses).where(statuses: { id: report_statuses.select(:id) }).group(:id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('COALESCE(tags.display_name, tags.name), count(*) AS total'))
end
end

View File

@ -16,6 +16,6 @@ class AnnualReport::TopStatuses < AnnualReport::Source
end
def base_scope
@account.statuses.public_visibility.joins(:status_stat).where(id: year_as_snowflake_range).reorder(nil)
report_statuses.public_visibility.joins(:status_stat)
end
end

View File

@ -4,17 +4,11 @@ class AnnualReport::TypeDistribution < AnnualReport::Source
def generate
{
type_distribution: {
total: base_scope.count,
reblogs: base_scope.where.not(reblog_of_id: nil).count,
replies: base_scope.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count,
standalone: base_scope.without_replies.without_reblogs.count,
total: report_statuses.count,
reblogs: report_statuses.where.not(reblog_of_id: nil).count,
replies: report_statuses.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count,
standalone: report_statuses.without_replies.without_reblogs.count,
},
}
end
private
def base_scope
@account.statuses.where(id: year_as_snowflake_range)
end
end

View File

@ -12,7 +12,7 @@ class ApplicationMailer < ActionMailer::Base
protected
def locale_for_account(account, &block)
I18n.with_locale(account.user_locale || I18n.locale || I18n.default_locale, &block)
I18n.with_locale(account.user_locale || I18n.default_locale, &block)
end
def set_autoreply_headers!

View File

@ -33,7 +33,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -43,7 +43,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -53,7 +53,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -63,7 +63,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -73,7 +73,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -83,7 +83,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -93,7 +93,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -103,7 +103,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: default_devise_subject
end
end
@ -114,7 +114,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: I18n.t('devise.mailer.webauthn_credential.added.subject')
end
end
@ -125,7 +125,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
I18n.with_locale(locale) do
I18n.with_locale(locale(use_current_locale: true)) do
mail subject: I18n.t('devise.mailer.webauthn_credential.deleted.subject')
end
end
@ -219,7 +219,7 @@ class UserMailer < Devise::Mailer
@instance = Rails.configuration.x.local_domain
end
def locale
@resource.locale.presence || I18n.locale || I18n.default_locale
def locale(use_current_locale: false)
@resource.locale.presence || (use_current_locale && I18n.locale) || I18n.default_locale
end
end

View File

@ -1,4 +1,4 @@
%tr
%tr{ id: dom_id(invite) }
%td
.input-copy
.input-copy__wrapper

View File

@ -7,7 +7,7 @@
.applications-list
- @applications.each do |application|
.applications-list__item
.applications-list__item{ id: dom_id(application) }
- if application.website.present?
= link_to application.name, application.website, target: '_blank', rel: 'noopener noreferrer', class: 'announcements-list__item__title'
- else

View File

@ -23,7 +23,7 @@
= f.input :mode,
as: :radio_buttons,
collection_wrapper_tag: 'ul',
collection: Import::MODES,
collection: Form::Import::MODES,
item_wrapper_tag: 'li',
label_method: ->(mode) { safe_join([I18n.t("imports.modes.#{mode}"), content_tag(:span, I18n.t("imports.modes.#{mode}_long"), class: 'hint')]) }

View File

@ -6,7 +6,7 @@ pt-PT:
expires_at: Prazo
options: Escolhas
user:
agreement: Acordo de serviço
agreement: Contrato de prestação de serviço
email: Endereço de correio electrónico
locale: Região
password: Palavra-passe
@ -19,7 +19,7 @@ pt-PT:
account:
attributes:
username:
invalid: apenas letras, números e underscores
invalid: deve conter apenas letras, números e traços inferiores
reserved: está reservado
admin/webhook:
attributes:
@ -43,15 +43,15 @@ pt-PT:
blocked: usa um fornecedor de e-mail que não é permitido
unreachable: não parece existir
role_id:
elevated: não pode ser maior que o da sua função atual
elevated: não pode ser superior à sua função atual
user_role:
attributes:
permissions_as_keys:
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
elevated: não pode incluir permissões que a sua função atual não possua
own_role: não pode ser alterado com a sua função atual
position:
elevated: não pode ser maior que o da sua função atual
elevated: não pode ser superior à sua função atual
own_role: não pode ser alterado com a sua função atual
webhook:
attributes:

View File

@ -906,6 +906,7 @@ ar:
moderation:
title: الحالة
newest: الأحدث
reset: إعادة التعيين
review: حالة المراجعة
search: البحث
title: الوسوم
@ -985,6 +986,7 @@ ar:
other: مستخدَم من قِبل %{count} شخص خلال الأسبوع الماضي
two: مستخدَم من قِبل %{count} شخصين خلال الأسبوع الماضي
zero: مستخدَم من قِبل %{count} شخص خلال الأسبوع الماضي
title: التوصيات والرائجة
trending: المتداولة
warning_presets:
add_new: إضافة واحد جديد
@ -1141,8 +1143,10 @@ ar:
security: الأمان
set_new_password: إدخال كلمة مرور جديدة
setup:
email_below_hint_html: قم بفحص مجلد البريد المزعج الخاص بك، أو قم بطلب آخر. يمكنك تصحيح عنوان بريدك الإلكتروني إن كان خاطئا.
email_settings_hint_html: انقر على الرابط الذي أرسلناه لك للتحقق من %{email}. سننتظر هنا.
link_not_received: ألم تحصل على رابط؟
new_confirmation_instructions_sent: سوف تتلقى رسالة بريد إلكتروني جديدة مع رابط التأكيد في غضون بضع دقائق!
title: تحقَّق من بريدك الوارِد
sign_in:
preamble_html: قم بتسجيل الدخول باستخدام بيانات الاعتماد الخاصة بك على <strong>%{domain}</strong>. إن استُضيف حسابك على خادم مختلف عن هذا الخادم، لن تتمكن من الولوج هنا.
@ -1153,7 +1157,9 @@ ar:
title: دعنا نجهّز %{domain}.
status:
account_status: حالة الحساب
confirming: في انتظار اكتمال تأكيد البريد الإلكتروني.
functional: حسابك يعمل بشكل كامل.
pending: إن طلبك قيد المراجعة من قبل فريقنا. قد يستغرق هذا بعض الوقت. سوف تتلقى بريدا إلكترونيا إذا تمت الموافقة على طلبك.
redirecting_to: حسابك غير نشط لأنه تم تحويله حاليا إلى %{acct}.
self_destruct: نظرًا لإغلاق %{domain}، ستحصل فقط على وصول محدود إلى حسابك.
view_strikes: عرض العقوبات السابقة المُطَبَّقة ضد حسابك
@ -1196,6 +1202,9 @@ ar:
before: 'يرجى قراءة هذه الملاحظات بتأنّي قبل المواصلة:'
caches: قد يبقى المحتوى الذي تم تخزينه مؤقتًا مِن طرف الخوادم الأخرى
data_removal: سوف تُحذَف منشوراتك والبيانات الأخرى نهائيا
email_change_html: بإمكانك <a href="%{path}">تغيير عنوان بريدك الإلكتروني</a> دون أن يُحذف حسابك
email_contact_html: إن لم تتلقّ أي شيء ، يمكنك مراسلة <a href="mailto:%{email}">%{email}</a> لطلب المساعدة
email_reconfirmation_html: إن لم تتلقّ الرسالة الإلكترونية للتأكيد ، بإمكانك <a href="%{path}">إعادة طلبها ثانيةً</a>
irreversible: لن يكون بإمكانك استرجاع أو إعادة تنشيط حسابك
more_details_html: للمزيد مِن التفاصيل ، يرجى الإطلاع على <a href="%{terms_path}">سياسة الخصوصية</a>.
username_available: سيصبح اسم مستخدمك متوفرا ثانية
@ -1448,7 +1457,7 @@ ar:
two: "%{count} استخدامات"
zero: "%{count} استخدامات"
max_uses_prompt: بلا حدود
prompt: توليد و مشاركة روابط للسماح للآخَرين بالنفاذ إلى مثيل الخادم هذا
prompt: توليد و مشاركة روابط للسماح للآخَرين النفاذ إلى هذا الخادم
table:
expires_at: تنتهي مدة صلاحيتها في
uses: عدد الاستخدامات
@ -1460,6 +1469,7 @@ ar:
authentication_methods:
otp: تطبيق المصادقة الثنائية
password: كلمة المرور
sign_in_token: رمز الأمان للبريد الإلكتروني
webauthn: مفاتيح الأمان
description_html: إذا رأيت النشاط الذي لا تتعرف عليه، فكر في تغيير كلمة المرور الخاصة بك وتفعيل المصادقة ذات العاملين.
empty: لا يوجد سجل مصادقة متاح
@ -1553,6 +1563,7 @@ ar:
update:
subject: قام %{name} بتحرير منشور
notifications:
administration_emails: إشعارات البريد الإلكتروني الإدارية
email_events_hint: 'اختر الأحداث التي تريد أن تصِلَك اشعارات عنها:'
number:
human:
@ -1811,13 +1822,13 @@ ar:
keep_media: الاحتفاظ بالمنشورات ذات وسائط مرفقة
keep_media_hint: لن تُحذف أي من منشوراتك التي تحتوي على وسائط مرفقة
keep_pinned: الاحتفاظ بالمنشورات المثبتة
keep_pinned_hint: لم تقوم بحذف أي من مشاركتك المثبتة
keep_pinned_hint: لن تحذف أي من منشوراتك المثبتة
keep_polls: الاحتفاظ باستطلاعات الرأي
keep_polls_hint: لم تقم بحذف أي من استطلاعاتك
keep_self_bookmark: احتفظ بالمنشورات التي أدرجتها في الفواصل المرجعية
keep_self_bookmark_hint: لم تقم بحذف مشاركاتك الخاصة إذا قمت بوضع علامة مرجعية عليها
keep_self_bookmark_hint: لن تحذف منشوراتك الخاصة إذا قمت بوضع علامة مرجعية عليها
keep_self_fav: احتفظ بالمنشورات التي أدرجتها في المفضلة
keep_self_fav_hint: لم تقم بحذف مشاركاتك الخاصة إذا كنت قد فضلتهم
keep_self_fav_hint: لن تحذف منشوراتك الخاصة إذا كنت قد فضلتها
min_age:
'1209600': أسبوعان
'15778476': 6 أشهر
@ -1828,9 +1839,9 @@ ar:
'63113904': سنتان
'7889238': 3 أشهر
min_age_label: عتبة العمر
min_favs: إبقاء المشاركات المفضلة أكثر من
min_favs: إبقاء المنشورات المفضلة على الأقل
min_favs_hint: لن تُحذف أي من منشوراتك التي تلقّت على الأقل هذا العدد من المفضلات. اتركه فارغاً لحذف المنشورات مهما كان عدد المفضلات التي تلقتها
min_reblogs: إبقاء المنشورات المعاد نشرها أكثر من
min_reblogs: إبقاء المنشورات المعاد نشرها على الأقل
min_reblogs_hint: لن تُحذف أي من منشوراتك التي أعيد مشاركتها أكثر من هذا العدد من المرات. اتركه فارغاً لحذف المنشورات بغض النظر عن عدد إعادات النشر
stream_entries:
sensitive_content: محتوى حساس

View File

@ -2,117 +2,117 @@
pt-PT:
devise:
confirmations:
confirmed: O seu endereço correio electrónico foi correctamente confirmado.
send_instructions: Vais receber um e-mail com as instruções para confirmar o teu endereço de e-mail dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeu o e-mail.
send_paranoid_instructions: Se o teu endereço de e-mail já existir na nossa base de dados, vais receber um e-mail com as instruções de confirmação dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeu o e-mail.
confirmed: O seu endereço de e-mail foi corretamente confirmado.
send_instructions: Irá receber um e-mail com instruções sobre como confirmar o seu endereço de e-mail dentro de alguns minutos. Verifique a sua pasta de spam se não recebeu este e-mail.
send_paranoid_instructions: Se o seu endereço de e-mail existir na nossa base de dados, receberá um e-mail com instruções sobre como confirmar o seu endereço de e-mail dentro de alguns minutos. Verifique a sua pasta de spam se não recebeu este e-mail.
failure:
already_authenticated: A tua sessão já está aberta.
inactive: A tua conta ainda não está ativada.
already_authenticated: Já tem sessão iniciada.
inactive: A sua conta ainda não está ativada.
invalid: "%{authentication_keys} ou palavra-passe inválida."
last_attempt: Tem só mais uma tentativa antes da sua conta ser bloqueada.
locked: A tua conta está bloqueada.
locked: A sua conta está bloqueada.
not_found_in_database: "%{authentication_keys} ou palavra-passe inválida."
omniauth_user_creation_failure: Erro ao criar uma conta para esta identidade.
pending: A sua conta está ainda a aguardar revisão.
timeout: A tua sessão expirou. Por favor, entra de novo para continuares.
unauthenticated: Precisas de entrar na tua conta ou de te registares antes de continuar.
unconfirmed: Tens de confirmar o teu endereço de e-mail antes de continuar.
timeout: A sua sessão expirou. Inicie sessão novamente para continuar.
unauthenticated: É necessário iniciar sessão ou registar-se antes de continuar.
unconfirmed: Tem de confirmar o seu endereço de e-mail antes de continuar.
mailer:
confirmation_instructions:
action: Verificar o endereço de e-mail
action_with_app: Confirmar e regressar a %{app}
explanation: Criou uma conta em %{host} com este endereço de e-mail. Está a um clique de ativá-la. Se não foi você que fez este registo, por favor ignore esta mensagem.
explanation: Foi criada uma conta em %{host} com este endereço de e-mail. Está a um clique de ativá-la. Se não foi você que fez este registo, por favor ignore esta mensagem.
explanation_when_pending: Candidatou-se com um convite para %{host} com este endereço de e-mail. Logo que confirme o seu endereço de e-mail, iremos rever a sua candidatura. Pode iniciar sessão para alterar os seus dados ou eliminar a sua conta, mas não poderá aceder à maioria das funções até que a sua conta seja aprovada. Se a sua inscrição for indeferida, os seus dados serão eliminados, pelo que não será necessária qualquer ação adicional da sua parte. Se não solicitou este convite, queira ignorar este e-mail.
extra_html: Por favor leia as <a href="%{terms_path}">regras da instância</a> e os <a href="%{policy_path}">nossos termos de serviço</a>.
subject: 'Mastodon: Instruções de confirmação %{instance}'
extra_html: Por favor leia as <a href="%{terms_path}">regras do servidor</a> e os <a href="%{policy_path}">nossos termos de serviço</a>.
subject: 'Mastodon: instruções de confirmação para %{instance}'
title: Verificar o endereço de e-mail
email_changed:
explanation: 'O e-mail associado à sua conta será alterado para:'
extra: Se não alterou o seu e-mail, é possível que alguém tenha conseguido aceder à sua conta. Por favor altere a sua palavra-passe imediatamente ou entra em contacto com um administrador da instância se tiver ficado sem acesso à sua conta.
subject: 'Mastodon: E-mail alterado'
extra: Se não alterou o seu e-mail, é possível que alguém tenha conseguido aceder à sua conta. Por favor altere a sua palavra-passe imediatamente ou entre em contacto com um administrador do servidor se tiver ficado sem acesso à sua conta.
subject: 'Mastodon: e-mail alterado'
title: Novo endereço de e-mail
password_change:
explanation: A palavra-passe da tua conta foi alterada.
extra: Se não alterou a sua palavra-passe, é possível que alguém tenha conseguido aceder à sua conta. Por favor altere a sua palavra-passe imediatamente ou entre em contacto com um administrador da instância se tiver ficado sem acesso à sua conta.
explanation: A palavra-passe da sua conta foi alterada.
extra: Se não alterou a sua palavra-passe, é possível que alguém tenha conseguido aceder à sua conta. Por favor altere a sua palavra-passe imediatamente ou entre em contacto com um administrador do servidor se tiver ficado sem acesso à sua conta.
subject: 'Mastodon: palavra-passe alterada'
title: Palavra-passe alterada
reconfirmation_instructions:
explanation: Confirme o seu novo endereço para alterar o e-mail.
extra: Se esta mudança não foi iniciada por si, queira ignorar este e-mail. O endereço de correio electrónico da sua conta do Mastodon não irá mudar enquanto não aceder à hiperligação acima.
subject: 'Mastodon: Confirmação de e-mail %{instance}'
extra: Se esta alteração não foi iniciada por si, ignore este e-mail. O endereço de e-mail da conta Mastodon não será alterado até aceder à hiperligação acima.
subject: 'Mastodon: confirmação de e-mail para %{instance}'
title: Validar o endereço de e-mail
reset_password_instructions:
action: Alterar palavra-passe
explanation: Pediste a alteração da palavra-passe da tua conta.
extra: Se não fez este pedido, queira ignorar este e-mail. A sua palavra-passe não irá mudar se não aceder à hiperligação acima e criar uma nova.
subject: 'Mastodon: Instruções para redefinir a palavra-passe'
explanation: Solicitou uma nova palavra-passe para a sua conta.
extra: Se não solicitou esta alteração, ignore este e-mail. A sua palavra-passe não será alterada até aceder à hiperligação acima e criar uma nova.
subject: 'Mastodon: instruções para redefinir a palavra-passe'
title: Solicitar nova palavra-passe
two_factor_disabled:
explanation: O acesso agora é possível usando apenas o endereço de correio eletrónico e palavra-passe.
subject: 'Mastodon: Autenticação de duas etapas desativada'
explanation: O início de sessão é agora possível utilizando apenas o endereço de e-mail e a palavra-passe.
subject: 'Mastodon: autenticação de duas etapas desativada'
subtitle: A autenticação de dois fatores foi desativada para a sua conta.
title: 2FA desativado
two_factor_enabled:
explanation: Um token gerado pelo aplicativo TOTP emparelhado será necessário para login.
subject: 'Mastodon: Autenticação em duas etapas ativada'
subtitle: A autenticação de dois fatores foi habilitada para sua conta.
explanation: Para iniciar sessão, será necessário um token gerado pela aplicação TOTP emparelhada.
subject: 'Mastodon: autenticação em duas etapas ativada'
subtitle: A autenticação de dois fatores foi ativada para a sua conta.
title: 2FA ativado
two_factor_recovery_codes_changed:
explanation: Os códigos de recuperação anteriores foram invalidados e novos foram gerados.
subject: 'Mastodon: Gerados novos códigos de recuperação em duas etapas'
subtitle: Os códigos de recuperação anteriores foram invalidados e novos foram gerados.
explanation: Os códigos de recuperação anteriores foram invalidados e foram gerados novos códigos.
subject: 'Mastodon: gerados novos códigos de recuperação em duas etapas'
subtitle: Os códigos de recuperação anteriores foram invalidados e foram gerados novos códigos.
title: Códigos de recuperação 2FA alterados
unlock_instructions:
subject: 'Mastodon: Instruções para desbloquear a tua conta'
subject: 'Mastodon: instruções para desbloquear'
webauthn_credential:
added:
explanation: A seguinte chave de segurança foi adicionada à sua conta
subject: 'Mastodon: Nova chave de segurança'
subject: 'Mastodon: nova chave de segurança'
title: Foi adicionada uma nova chave de segurança
deleted:
explanation: A seguinte chave de segurança foi eliminada da sua conta
subject: 'Mastodon: Chave de segurança eliminada'
subject: 'Mastodon: chave de segurança eliminada'
title: Uma das suas chaves de segurança foi eliminada
webauthn_disabled:
explanation: A autenticação com chaves de segurança foi desativada para sua conta.
extra: O login agora é possível usando apenas o token gerado pelo aplicativo TOTP emparelhado.
subject: 'Mastodon: Autenticação com chave de segurança desativada'
extra: O início de sessão é agora possível utilizando apenas o token gerado pela aplicação TOTP emparelhada.
subject: 'Mastodon: autenticação com chave de segurança desativada'
title: Chaves de segurança desativadas
webauthn_enabled:
explanation: A autenticação da chave de segurança foi habilitada para sua conta.
extra: Sua chave de segurança agora pode ser usada para login.
subject: 'Mastodon: Autenticação com chave de segurança ativada'
explanation: A autenticação por chave de segurança foi ativada para a sua conta.
extra: A sua chave de segurança pode agora ser utilizada para iniciar sessão.
subject: 'Mastodon: autenticação com chave de segurança ativada'
title: Chaves de segurança ativadas
omniauth_callbacks:
failure: Não foi possível autenticar %{kind} porque "%{reason}".
success: Autenticado correctamente na conta %{kind}.
passwords:
no_token: Não pode aceder a esta página se não vier através da ligação enviada por e-mail para alteração da sua palavra-passe. Se de facto usou essa ligação para chegar até aqui, queira garantir de que usou o endereço URL completo.
send_instructions: Vai receber um e-mail com instruções para alterar a palavra-passe dentro de alguns minutos.
send_paranoid_instructions: Se o seu endereço de e-mail existir na nossa base de dados, dentro de alguns minutos irá receber uma ligação para recuperar a palavra-passe.
updated: A tua palavra-passe foi alterada. Estás agora autenticado na tua conta.
no_token: Não pode aceder a esta página se não vier através da hiperligação enviada por e-mail para alteração da sua palavra-passe. Se de facto usou essa hiperligação para chegar até aqui, verifique se usou o endereço URL completo.
send_instructions: Se o seu endereço de e-mail existir na nossa base de dados, receberá uma hiperligação de recuperação da palavra-passe no seu endereço de e-mail dentro de alguns minutos. Verifique a sua pasta de spam se não recebeu esta mensagem de correio eletrónico.
send_paranoid_instructions: Se o seu endereço de e-mail existir na nossa base de dados, receberá uma hiperligação de recuperação da palavra-passe no seu endereço de e-mail dentro de alguns minutos. Verifique a sua pasta de spam se não recebeu esta mensagem de correio eletrónico.
updated: A sua palavra-passe foi alterada com sucesso. Está agora autenticado.
updated_not_active: A tua palavra-passe foi alterada.
registrations:
destroyed: Adeus! A tua conta foi cancelada. Esperamos ver-te em breve.
signed_up: Seja bem-vindo! A sua conta foi correctamente registada.
signed_up_but_inactive: A tua conta foi registada. No entanto ainda não está activa.
signed_up_but_locked: A sua conta foi correctamente registada. Contudo, não pudemos iniciar sessão porque a sua conta está bloqueada.
signed_up_but_pending: Foi enviada uma hiperligação de confirmação para o seu correio electrónico. Só depois de clicar na hiperligação avaliaremos a sua inscrição. Será notificado caso a sua conta seja aprovada.
signed_up_but_unconfirmed: Foi enviada uma hiperligação de confirmação para o seu correio electrónico. Queira usar essa hiperligação para activar a sua conta.
update_needs_confirmation: Solicitou uma alteração da informação da sua conta, mas para tal é necessário confirmá-la. Queira ver o seu correio electrónico e seguir a hiperligação para a confirmar. Se não encontrar essa mensagem, veja se está na pasta de lixo electrónico.
updated: A sua conta foi correctamente actualizada.
destroyed: Adeus! A sua conta foi cancelada com sucesso. Esperamos voltar a vê-lo em breve.
signed_up: Bem-vindo! A sua conta foi registada com sucesso.
signed_up_but_inactive: Registou-se com sucesso. No entanto, não foi possível iniciar sessão porque a sua conta ainda não está ativada.
signed_up_but_locked: Registou-se com sucesso. No entanto, não foi possível iniciar sessão porque a sua conta está bloqueada.
signed_up_but_pending: Foi enviada uma mensagem com uma hiperligação de confirmação para o seu endereço de e-mail. Depois de clicar na hiperligação, analisaremos a sua candidatura. Será notificado se for aprovado.
signed_up_but_unconfirmed: Foi enviada para o seu endereço de e-mail uma mensagem com uma hiperligação de confirmação. Siga a hiperligação para ativar a sua conta. Verifique a sua pasta de spam se não recebeu esta mensagem de e-mail.
update_needs_confirmation: Atualizou a sua conta com sucesso, mas temos de verificar o seu novo endereço de e-mail. Verifique o seu e-mail e siga a hiperligação de confirmação para confirmar o seu novo endereço de e-mail. Verifique a sua pasta de spam se não recebeu esta mensagem de correio eletrónico.
updated: A sua conta foi corretamente atualizada.
sessions:
already_signed_out: Sessão encerrada.
signed_in: Sessão iniciada.
signed_out: Sessão encerrada.
unlocks:
send_instructions: Dentro de alguns momentos, irá receber um e-mail com instruções para desbloquear a sua conta. Consulte a sua pasta de lixo electrónico se não o encontrar.
send_paranoid_instructions: Se a sua conta existir, dentro de momentos irá receber um e-mail com instruções para a desbloquear. Consulte a sua pasta de lixo electrónico se não o encontrar.
unlocked: A sua conta foi correctamente desbloqueada. Queira iniciar uma nova sessão para continuar.
send_instructions: Receberá um e-mail com instruções sobre como desbloquear a sua conta dentro de alguns minutos. Verifique a sua pasta de spam se não recebeu este e-mail.
send_paranoid_instructions: Se a sua conta existir, receberá um e-mail com instruções sobre como a desbloquear dentro de alguns minutos. Verifique a sua pasta de spam se não recebeu este e-mail.
unlocked: A sua conta foi desbloqueada com sucesso. Inicie sessão para continuar.
errors:
messages:
already_confirmed: já confirmado, por favor tente iniciar sessão
confirmation_period_expired: tem de ser confirmado durante %{period}, por favor tenta outra vez
confirmation_period_expired: tem de ser confirmado dentro de %{period}, por favor tente outra vez
expired: expirou, por favor tente outra vez
not_found: não encontrado
not_locked: não estava bloqueada

View File

@ -4,9 +4,9 @@ pt-PT:
attributes:
doorkeeper/application:
name: Nome da aplicação
redirect_uri: URI de redireccionamento
redirect_uri: URI de redirecionamento
scopes: Âmbitos
website: Página na teia da aplicação
website: Site da aplicação
errors:
models:
doorkeeper/application:
@ -31,11 +31,11 @@ pt-PT:
form:
error: Ups! Verifique que o formulário não tem erros
help:
native_redirect_uri: Usa %{native_redirect_uri} para testes locais
redirect_uri: Utiliza uma linha por URI
scopes: Separe as esferas de acção com espaços. Deixe em branco para usar autorizações predefinidas.
native_redirect_uri: Usar %{native_redirect_uri} para testes locais
redirect_uri: Usar uma linha por URI
scopes: Separe os âmbitos de aplicação com espaços. Deixe em branco para utilizar os âmbitos de aplicação predefinidos.
index:
application: Aplicações
application: Aplicação
callback_url: URL de retorno
delete: Eliminar
empty: Não tem aplicações.
@ -48,31 +48,31 @@ pt-PT:
title: Nova aplicação
show:
actions: Ações
application_id: Id de Aplicação
callback_urls: Callback urls
scopes: Autorizações
application_id: Chave da aplicação
callback_urls: URLs de retorno
scopes: Âmbitos
secret: Segredo
title: 'Aplicação: %{name}'
authorizations:
buttons:
authorize: Autorize
deny: Não autorize
authorize: Autorizar
deny: Negar
error:
title: Ocorreu um erro
new:
prompt_html: "%{client_name} pretende ter permissão para aceder à sua conta. É uma aplicação de terceiros. <strong>Se não confia nesta aplicação, então não deve autorizá-la.</strong>"
review_permissions: Rever permissões
title: Autorização é necessária
title: Autorização necessária
show:
title: Copiar o código desta autorização e colar na aplicação.
title: Copie este código de autorização e cole-o na aplicação.
authorized_applications:
buttons:
revoke: Revogar
confirmations:
revoke: Tens a certeza?
revoke: Tem a certeza?
index:
authorized_at: Autorizado em %{date}
description_html: Estas são aplicações que podem aceder à sua conta utilizando a API. Se encontrar aqui aplicativos que não reconhece, ou um aplicativo está com mau funcionamento, pode revogar o seu acesso.
description_html: Estas são as aplicações que podem aceder à sua conta utilizando a API. Se houver aplicações que não reconhece aqui, ou se uma aplicação estiver a comportar-se mal, pode revogar o seu acesso.
last_used_at: Última utilização em %{date}
never_used: Nunca utilizado
scopes: Permissões
@ -81,15 +81,15 @@ pt-PT:
errors:
messages:
access_denied: O proprietário do recurso ou servidor de autorização negou o pedido.
credential_flow_not_configured: As credenciais da palavra-passe do proprietário do recurso falhou devido a que Doorkeeper.configure.resource_owner_from_credentials não foram configuradas.
invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação incluído ou método de autenticação não suportado.
credential_flow_not_configured: Falha no fluxo de credenciais da palavra-passe do proprietário do recurso porque Doorkeeper.configure.resource_owner_from_credentials não está configurado.
invalid_client: A autenticação do cliente falhou devido a cliente desconhecido, sem autenticação de cliente incluída ou método de autenticação não suportado.
invalid_code_challenge_method: O método de validação do código tem de ser S256, o método simples não é suportado.
invalid_grant: A concessão de autorização fornecida é inválida, expirou, foi revogada, não corresponde à URI de redirecionamento usada no pedido de autorização ou foi emitida para outro cliente.
invalid_redirect_uri: A URI de redirecionamento incluída não é válida.
invalid_request:
missing_param: 'Parâmetro requerido em falta: %{value}.'
request_not_authorized: O pedido precisa ser autorizado. O parâmetro requerido para autorização da solicitação está ausente ou é inválido.
unknown: A solicitação não possui um parâmetro requerido, inclui um valor de parâmetro não suportado ou tem outro tipo de formato incorreto.
request_not_authorized: O pedido tem de ser autorizado. O parâmetro necessário para autorizar o pedido está em falta ou é inválido.
unknown: O pedido não tem um parâmetro obrigatório, inclui um valor de parâmetro não suportado ou está mal formado.
invalid_resource_owner: As credenciais do proprietário do recurso não são válidas ou o proprietário do recurso não pode ser encontrado
invalid_scope: O âmbito solicitado é inválido, desconhecido ou tem um formato incorreto.
invalid_token:
@ -98,7 +98,7 @@ pt-PT:
unknown: O token de acesso é inválido
resource_owner_authenticator_not_configured: A procura pelo proprietário do recurso falhou porque Doorkeeper.configure.resource_owner_authenticator não foi configurado.
server_error: O servidor de autorização encontrou uma condição inesperada que impediu o cumprimento do pedido .
temporarily_unavailable: O servidor de autorização não é capaz de lidar com o pedido devido a uma sobrecarga ou mantenimento do servidor.
temporarily_unavailable: O servidor de autorização não pode atualmente tratar o pedido devido a uma sobrecarga temporária ou à manutenção do servidor.
unauthorized_client: O cliente não está autorizado a realizar esta solicitação usando este método.
unsupported_grant_type: O tipo de concessão de autorização não é suportado pelo servidor de autorização.
unsupported_response_type: O servidor de autorização não suporta este tipo de resposta.
@ -125,12 +125,12 @@ pt-PT:
admin/reports: Administração de denúncias
all: Acesso total à sua conta Mastodon
blocks: Bloqueios
bookmarks: Itens Salvos
bookmarks: Marcadores
conversations: Conversas
crypto: Encriptação ponta-a-ponta
crypto: Encriptação ponta a ponta
favourites: Favoritos
filters: Filtros
follow: A seguir, a silenciar, e a bloquear
follow: A seguir, a silenciar e a bloquear
follows: Seguidores
lists: Listas
media: Anexos de media
@ -139,7 +139,7 @@ pt-PT:
profile: O seu perfil Mastodon
push: Notificações push
reports: Denúncias
search: Pesquisa
search: Pesquisar
statuses: Publicações
layouts:
admin:
@ -165,14 +165,14 @@ pt-PT:
admin:write:email_domain_blocks: executar ações de moderação no bloqueio de domínios de e-mail
admin:write:ip_blocks: executar ações de moderação no bloqueio de IPs
admin:write:reports: executar ações de moderação em denúncias
crypto: usa encriptação ponta-a-ponta
follow: siga, bloqueie, desbloqueie, e deixa de seguir contas
profile: apenas ler as informações do perfil da sua conta
crypto: usar encriptação ponta a ponta
follow: alterar relações de conta
profile: ler apenas as informações do perfil da sua conta
push: receber as suas notificações push
read: tenha acesso aos dados da tua conta
read: ler todos os dados da sua conta
read:accounts: ver as informações da conta
read:blocks: ver os seus bloqueios
read:bookmarks: ver os seus favoritos
read:bookmarks: ver os seus marcadores
read:favourites: ver os seus favoritos
read:filters: ver os seus filtros
read:follows: ver quem você segue
@ -181,18 +181,18 @@ pt-PT:
read:notifications: ver as suas notificações
read:reports: ver as suas denúncias
read:search: pesquisar em seu nome
read:statuses: ver todos os estados
write: publique por ti
write:accounts: modificar o seu perfil
read:statuses: ver todas as publicações
write: alterar todos os dados da sua conta
write:accounts: alterar o seu perfil
write:blocks: bloquear contas e domínios
write:bookmarks: estado dos favoritos
write:bookmarks: marcar publicações
write:conversations: silenciar e eliminar conversas
write:favourites: assinalar como favoritas
write:favourites: favoritar publicações
write:filters: criar filtros
write:follows: seguir pessoas
write:lists: criar listas
write:media: carregar arquivos de media
write:media: enviar ficheiros de media
write:mutes: silenciar pessoas e conversas
write:notifications: limpar as suas notificações
write:reports: denunciar outras pessoas
write:statuses: publicar estado
write:statuses: publicar publicações

View File

@ -343,7 +343,7 @@ gl:
title: Emoticonas personalizadas
uncategorized: Sen categoría
unlist: Non listar
unlisted: Sen listar
unlisted: Fóra das listas
update_failed_msg: Non foi posíbel actualizar a emoticona
updated_msg: Actualizouse a emoticona de xeito correcto!
upload: Subir
@ -1756,7 +1756,7 @@ gl:
private_long: Mostrar só as seguidoras
public: Público
public_long: Visible para calquera
unlisted: Sen listar
unlisted: Fóra das listas
unlisted_long: Visible para calquera, pero non en cronoloxías públicas
statuses_cleanup:
enabled: Borrar automáticamente publicacións antigas

View File

@ -12,8 +12,8 @@ pt-PT:
one: Seguidor
other: Seguidores
following: A seguir
instance_actor_flash: Esta conta é um actor virtual usado para representar a própria instância e não um utilizador individual. É usada para motivos de federação e não deve ser suspenso.
last_active: última vez activo
instance_actor_flash: Esta conta é um ator virtual utilizado para representar o servidor em si e não um utilizador individual. É utilizada para efeitos de federação e não deve ser suspensa.
last_active: última atividade
link_verified_on: A posse desta hiperligação foi verificada em %{date}
nothing_here: Não há nada aqui!
pin_errors:
@ -25,19 +25,19 @@ pt-PT:
admin:
account_actions:
action: Executar acção
title: Executar acção de moderação em %{acct}
title: Executar ação de moderação em %{acct}
account_moderation_notes:
create: Deixar uma nota
created_msg: Nota de moderação correctamente criada!
created_msg: Nota de moderação criada com sucesso!
destroyed_msg: Nota de moderação destruída!
accounts:
approve: Aprovar
approved_msg: Inscrição de %{username} aprovada correctamente
approved_msg: Inscrição de %{username} aprovada com sucesso
are_you_sure: Tens a certeza?
avatar: Imagem de perfil
by_domain: Domínio
change_email:
changed_msg: Endereço de correio electrónico alterado!
changed_msg: E-mail alterado com sucesso!
current_email: E-mail atual
label: Alterar e-mail
new_email: Novo e-mail
@ -57,12 +57,12 @@ pt-PT:
demote: Despromoveu
destroyed_msg: Os dados de %{username} estão agora em fila de espera para serem eliminados de imediato
disable: Congelar
disable_two_factor_authentication: Desactivar autenticação por dois factores (2FA)
disable_two_factor_authentication: Desativar autenticação por dois fatores (2FA)
disabled: Congelada
display_name: Nome a mostrar
domain: Domínio
edit: Editar
email: Correio electrónico
email: E-mail
email_status: Estado do e-mail
enable: Descongelar
enabled: Ativado
@ -86,7 +86,7 @@ pt-PT:
memorialized: Em memória
memorialized_msg: Conta %{username} transformada com sucesso em memorial
moderation:
active: Activo
active: Ativo
all: Todos
disabled: Desativado
pending: Pendente
@ -94,7 +94,7 @@ pt-PT:
suspended: Supensos
title: Moderação
moderation_notes: Notas de moderação
most_recent_activity: Actividade mais recente
most_recent_activity: Atividade mais recente
most_recent_ip: IP mais recente
no_account_selected: Nenhuma conta foi alterada porque nenhuma foi selecionada
no_limits_imposed: Sem limites impostos
@ -111,9 +111,9 @@ pt-PT:
public: Público
push_subscription_expires: A Inscrição PuSH expira
redownload: Atualizar perfil
redownloaded_msg: Perfil de %{username} correctamente actualizado a partir da origem
redownloaded_msg: Perfil de %{username} atualizado a partir da origem com sucesso
reject: Rejeitar
rejected_msg: Inscrição de %{username} correctamente rejeitada
rejected_msg: Inscrição de %{username} rejeitada com sucesso
remote_suspension_irreversible: Os dados desta conta foram eliminados irreversivelmente.
remote_suspension_reversible_hint_html: A conta foi suspensa no servidor de origem e os seus dados serão totalmente eliminados em %{date}. Até lá, o servidor de origem poderá recuperar esta conta sem quaisquer efeitos negativos. Se desejar eliminar todos os dados desta conta imediatamente, pode fazê-lo em baixo.
remove_avatar: Remover a imagem de perfil
@ -152,7 +152,7 @@ pt-PT:
title: Contas
unblock_email: Desbloquear endereço de e-mail
unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado
unconfirmed_email: Correio electrónico por confirmar
unconfirmed_email: E-mail por confirmar
undo_sensitized: Desmarcar como problemático
undo_silenced: Desfazer silenciar
undo_suspension: Desfazer supensão
@ -226,7 +226,7 @@ pt-PT:
create_account_warning_html: "%{name} enviou um aviso para %{target}"
create_announcement_html: "%{name} criou o novo anúncio %{target}"
create_custom_emoji_html: "%{name} carregou o novo emoji %{target}"
create_domain_allow_html: "%{name} habilitou a federação com o domínio %{target}"
create_domain_allow_html: "%{name} permitiu a federação com o domínio %{target}"
create_domain_block_html: "%{name} bloqueou o domínio %{target}"
create_ip_block_html: "%{name} criou regra para o IP %{target}"
create_unavailable_domain_html: "%{name} parou a entrega ao domínio %{target}"
@ -244,7 +244,7 @@ pt-PT:
disable_2fa_user_html: "%{name} desativou o requerimento de autenticação em dois passos para o utilizador %{target}"
disable_custom_emoji_html: "%{name} desabilitou o emoji %{target}"
disable_user_html: "%{name} desativou o acesso para o utilizador %{target}"
enable_custom_emoji_html: "%{name} habilitou o emoji %{target}"
enable_custom_emoji_html: "%{name} ativou o emoji %{target}"
enable_user_html: "%{name} ativou o acesso para o utilizador %{target}"
memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial"
promote_user_html: "%{name} promoveu o utilizador %{target}"
@ -276,22 +276,22 @@ pt-PT:
title: Registo de auditoria
unavailable_instance: "(nome de domínio indisponível)"
announcements:
destroyed_msg: Comunicado correctamente eliminado!
destroyed_msg: Comunicado eliminado com sucesso!
edit:
title: Editar comunicado
empty: Nenhum comunicado encontrado.
live: Em directo
live: Em direto
new:
create: Criar comunicado
title: Novo comunicado
publish: Publicar
published_msg: Comunicado correctamente publicado!
published_msg: Comunicado publicado com sucesso!
scheduled_for: Agendado para %{time}
scheduled_msg: Comunicado agendado para publicação!
title: Comunicados
unpublish: Anular publicação
unpublished_msg: Comunicado correctamente retirado de publicação!
updated_msg: Comunicado correctamente actualizado!
unpublished_msg: Comunicado corretamente retirado de publicação!
updated_msg: Comunicado atualizado com sucesso!
critical_update_pending: Atualização crítica pendente
custom_emojis:
assign_category: Atribuir categoria
@ -319,16 +319,16 @@ pt-PT:
not_permitted: Não está autorizado a executar esta ação
overwrite: Escrever por cima
shortcode: Código de atalho
shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underscores
shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e traços inferiores
title: Emojis personalizados
uncategorized: Não categorizados
unlist: Não listar
unlisted: Não inventariado
update_failed_msg: Não foi possível atualizar esse emoji
updated_msg: Emoji correctamente actualizado!
updated_msg: Emoji atualizado com sucesso!
upload: Enviar
dashboard:
active_users: utilizadores activos
active_users: utilizadores ativos
interactions: interações
media_storage: Armazenamento de media
new_users: novos utilizadores
@ -350,8 +350,8 @@ pt-PT:
sources: Origem de inscrições
space: Utilização do espaço
title: Painel de controlo
top_languages: Principais idiomas activos
top_servers: Servidores mais activos
top_languages: Principais idiomas ativos
top_servers: Servidores mais ativos
website: Página na teia
disputes:
appeals:
@ -359,7 +359,7 @@ pt-PT:
title: Recursos
domain_allows:
add_new: Permitir federação com o domínio
created_msg: Permissão correctamente atribuída para federação
created_msg: O domínio foi autorizado com êxito para a federação
destroyed_msg: Revogada a permissão de federação para o domínio
export: Exportar
import: Importar
@ -385,14 +385,14 @@ pt-PT:
import: Importar
new:
create: Criar bloqueio
hint: O bloqueio por domínio não vai prevenir a criação de contas na base de dados, mas irá retroactiva e automaticamente aplicar certos métodos de moderação nessas contas.
hint: O bloqueio do domínio não impedirá a criação de registos de contas na base de dados, mas aplicará retroativamente e automaticamente métodos de moderação específicos a essas contas.
severity:
desc_html: "<strong>Limitar</strong> tornará as mensagens das contas neste domínio invisíveis a qualquer pessoa que não as esteja a seguir. <strong>Suspender</strong> removerá do seu servidor todo o conteúdo, media, e dados de perfil das contas deste domínio. Utilize <strong>Nenhum</strong> se apenas quiser rejeitar ficheiros media."
noop: Nenhum
silence: Limitar
suspend: Suspender
title: Novo bloqueio de domínio
no_domain_block_selected: Nenhum bloqueio de domínio foi alterado, pois nenhum foi seleccionado
no_domain_block_selected: Nenhum bloqueio de domínio foi alterado pois nenhum foi selecionado
not_permitted: Não está autorizado a executar esta ação
obfuscate: Ofuscar nome de domínio
obfuscate_hint: Ofuscar parcialmente o nome de domínio na lista, caso estejam definidas limitações na publicação da lista de domínios
@ -527,7 +527,7 @@ pt-PT:
title: Convites
ip_blocks:
add_new: Criar regra
created_msg: Nova regra de IP correctamente adicionada
created_msg: Nova regra de IP corretamente adicionada
delete: Eliminar
expires_in:
'1209600': 2 semanas
@ -547,15 +547,15 @@ pt-PT:
delete: Eliminar
description_html: Um <strong>repetidor de federação</strong> é um servidor intermediário que troca grandes volumes de publicações públicas entre instâncias que o subscrevem e publicam. <strong>Ele pode ajudar pequenas e medias instâncias a descobrir conteúdo do fediverso</strong> que, de outro modo, exigiria que os utilizadores locais seguissem manualmente outras pessoas em instâncias remotas.
disable: Desativar
disabled: Desactivado
enable: Activar
disabled: Desativado
enable: Ativar
enable_hint: Uma vez ativado, a tua instância irá assinar todas as publicações deste repetidor e irá começar a enviar as suas publicações públicas para lá.
enabled: Ativado
inbox_url: URL do repetidor
pending: À espera da aprovação do repetidor
save_and_enable: Guardar e ativar
setup: Configurar uma ligação ao repetidor
signatures_not_enabled: Os repetidores não funcionarão correctamente enquanto o modo seguro ou o modo de lista branca estiverem activados
signatures_not_enabled: Os repetidores não funcionarão corretamente enquanto o modo seguro ou o modo de lista branca estiverem ativados
status: Estado
title: Retransmissores
report_notes:
@ -618,27 +618,27 @@ pt-PT:
reported_by: Denunciado por
reported_with_application: Reportado com a aplicação
resolved: Resolvido
resolved_msg: Denúncia correctamente resolvida!
resolved_msg: Denúncia resolvida com sucesso!
skip_to_actions: Passar para as ações
status: Estado
statuses: Conteúdo denunciado
statuses_description_html: O conteúdo ofensivo será citado na comunicação com a conta denunciada
summary:
action_preambles:
delete_html: 'Você está prestes a <strong>remover</strong> algumas das publicações de <strong>@%{acct}</strong>. Isto irá:'
mark_as_sensitive_html: 'Você está prestes a <strong>marcar</strong> alguns dos posts de <strong>@%{acct}</strong>como <strong>sensível</strong>. Isto irá:'
silence_html: 'Você está prestes a <strong>limitar a conta do</strong> <strong>@%{acct}</strong>. Isto irá:'
suspend_html: 'Você está prestes a <strong>suspender a conta de</strong> <strong>@%{acct}</strong>. Isto irá:'
delete_html: 'Está prestes a <strong>remover</strong> algumas das publicações de <strong>@%{acct}</strong>. Isto irá:'
mark_as_sensitive_html: 'Está prestes a <strong>marcar</strong> algumas das publicações de <strong>@%{acct}</strong>como <strong>sensível</strong>. Isto irá:'
silence_html: 'Está prestes a <strong>limitar a conta de</strong> <strong>@%{acct}</strong>. Isto irá:'
suspend_html: 'Está prestes a <strong>suspender a conta de</strong> <strong>@%{acct}</strong>. Isto irá:'
actions:
delete_html: Excluir as publicações ofensivas
mark_as_sensitive_html: Marcar a mídia dos posts ofensivos como sensível
silence_html: Limitar firmemente o alcance de <strong>@%{acct}</strong>, tornando seus perfis e conteúdos apenas visíveis para pessoas que já os estão seguindo ou olhando manualmente no perfil
suspend_html: Suspender <strong>@%{acct}</strong>, tornando seu perfil e conteúdo inacessíveis e impossível de interagir com
suspend_html: Suspender <strong>@%{acct}</strong>, tornando seu perfil e conteúdo inacessíveis e impossível de interagir
close_report: 'Marcar relatório #%{id} como resolvido'
close_reports_html: Marcar <strong>todos os</strong> relatórios contra <strong>@%{acct}</strong> como resolvidos
delete_data_html: Excluir <strong>@%{acct}</strong>perfil e conteúdo 30 dias a menos que sejam dessuspensos
close_reports_html: Marcar <strong>todas as</strong> denúncias contra <strong>@%{acct}</strong> como resolvidas
delete_data_html: Eliminar o perfil de <strong>@%{acct}</strong> e conteúdos daqui a 30 dias, a menos que entretanto sejam suspensos
preview_preamble_html: "<strong>@%{acct}</strong> receberá um aviso com o seguinte conteúdo:"
record_strike_html: Registre um ataque contra <strong>@%{acct}</strong> para ajudá-lo a escalar futuras violações desta conta
record_strike_html: Registar um ataque contra <strong>@%{acct}</strong> para ajudar a escalar futuras violações desta conta
warning_placeholder: Argumentos adicionais opcionais para a acção de moderação.
target_origin: Origem da conta denunciada
title: Denúncias
@ -693,7 +693,7 @@ pt-PT:
manage_settings: Gerir Configurações
manage_settings_description: Permite aos utilizadores alterar as configurações do sítio na teia
manage_taxonomies: Gerir Taxonomias
manage_taxonomies_description: 'Permite aos utilizadores avaliar o conteúdo em alta e atualizar as configurações de #etiquetas'
manage_taxonomies_description: Permite aos utilizadores rever o conteúdo em tendência e atualizar as configurações de hashtag
manage_user_access: Gerir Acesso de Utilizador
manage_users: Gerir Utilizadores
manage_users_description: Permite aos utilizadores ver os detalhes de outros utilizadores e executar ações de moderação contra eles
@ -743,13 +743,13 @@ pt-PT:
publish_discovered_servers: Publicar servidores descobertos
publish_statistics: Publicar estatísticas
title: Descobrir
trends: Em alta
trends: Tendências
domain_blocks:
all: Para toda a gente
disabled: Para ninguém
users: Para utilizadores locais que se encontrem autenticados
registrations:
moderation_recommandation: Por favor, certifique-se de que você tem uma equipe de moderação adequada e reativa antes de abrir os registros para todos!
moderation_recommandation: Certifique-se de que dispõe de uma equipa de moderação adequada e reativa antes de abrir as inscrições a todos!
preamble: Controle quem pode criar uma conta no seu servidor.
title: Inscrições
registrations_mode:
@ -757,7 +757,7 @@ pt-PT:
approved: Registo sujeito a aprovação
none: Ninguém se pode registar
open: Qualquer pessoa se pode registar
warning_hint: Recomendamos o uso de "Aprovação necessária para se cadastrar", a menos que você esteja confiante de que sua equipe de moderação pode lidar com spam e registros maliciosos em tempo hábil.
warning_hint: Recomendamos a utilização de “É necessária aprovação para o registo”, a menos que esteja confiante de que a sua equipa de moderação pode tratar o spam e os registos maliciosos de forma atempada.
security:
authorized_fetch: Exigir autenticação de servidores federados
authorized_fetch_hint: Exigir autenticação de servidores federados permite uma aplicação mais rigorosa de bloqueios tanto ao nível do utilizador como do servidor. No entanto, isso é feito à custa de uma diminuição de desempenho, reduz o alcance das suas respostas e pode introduzir problemas de compatibilidade com alguns serviços federados. Além disso, isso não impede os atores mais empenhados de aceder às suas publicações e contas públicas.
@ -766,7 +766,7 @@ pt-PT:
title: Definições do servidor
site_uploads:
delete: Eliminar arquivo carregado
destroyed_msg: Envio de sítio na teia correctamente eliminado!
destroyed_msg: Envio do site eliminado com sucesso!
software_updates:
critical_update: Crítico — por favor, atualize rapidamente
documentation_link: Saber mais
@ -800,7 +800,7 @@ pt-PT:
reblogs: Re-publicacões
status_changed: Publicação alterada
title: Estado das contas
trending: Em alta
trending: Em tendência
visibility: Visibilidade
with_media: Com media
strikes:
@ -823,7 +823,7 @@ pt-PT:
elasticsearch_health_yellow:
message_html: O cluster elasticsearch não está de boa saúde (estado amarelo), pode querer investigar o motivo
elasticsearch_index_mismatch:
message_html: Os mapeamentos elasticsearch estão desatualizados. Por favor, execute <code>tootctl search deploy --only=%{value}</code>
message_html: Os mapeamentos de índice Elasticsearch estão desatualizados. Execute <code>tootctl search deploy --only=%{value}</code>
elasticsearch_preset:
action: Ver a documentação
message_html: O seu cluster elasticsearch tem mais de um nó, mas o Mastodon não está configurado para os usar.
@ -831,9 +831,9 @@ pt-PT:
action: Ver documentação
message_html: O seu cluster elasticsearch tem apenas um nó, <code>ES_PRESET</code> deve ser configurado para <code>single_node_cluster</code>.
elasticsearch_reset_chewy:
message_html: O seu índice de sistema elasticsearch está desatualizado devido a uma mudança de configuração. Por favor, execute <code>tootctl search deploy --reset-chewy</code> para o atualizar.
message_html: O seu índice de sistema Elasticsearch está desatualizado devido a uma mudança de configuração. Execute <code>tootctl search deploy --reset-chewy</code> para o atualizar.
elasticsearch_running_check:
message_html: Não foi possível conectar ao Elasticsearch. Por favor, verifique se está em execução, ou desabilite a pesquisa de texto completo
message_html: Não foi possível conectar ao Elasticsearch. Verifique se está em execução ou desative a pesquisa de texto completo
elasticsearch_version_check:
message_html: 'Versão de Elasticsearch incompatível: %{value}'
version_comparison: A versão de Elasticsearch %{running_version} está em execução. No entanto, é obrigatória a versão %{required_version}
@ -872,14 +872,14 @@ pt-PT:
review: Estado da revisão
search: Pesquisar
title: Hashtags
updated_msg: 'Definições de #etiquetas correctamente actualizadas'
updated_msg: 'Definições de #etiquetas atualizadas com sucesso'
title: Administração
trends:
allow: Permitir
approved: Aprovado
disallow: Não permitir
links:
allow: Permitir ligação
allow: Permitir hiperligação
allow_provider: Permitir editor
description_html: Estas são as ligações que presentemente estão a ser muito partilhadas por contas visíveis pelo seu servidor. Estas podem ajudar os seus utilizador a descobrir o que está a acontecer no mundo. Nenhuma ligação é exibida publicamente até que o editor a aprove. Também pode permitir ou rejeitar ligações em avulso.
disallow: Não permitir ligação
@ -890,15 +890,15 @@ pt-PT:
shared_by_over_week:
one: Partilhado por uma pessoa na última semana
other: Partilhado por %{count} pessoas na última semana
title: Ligações em alta
title: Hiperligações em tendência
usage_comparison: Partilhado %{today} vezes hoje, em comparação com %{yesterday} ontem
not_allowed_to_trend: Não permitido para tendência
only_allowed: Apenas permitidos
pending_review: Pendente de revisão
preview_card_providers:
allowed: Ligações deste editor poderão vir a ficar em alta
allowed: As hiperligações deste editor podem ser tendência
description_html: Estes são os domínios a partir dos quais ligações são frequentemente partilhadas no seu servidor. As suas ligações não serão colocadas em alta a menos que o seu domínio de origem seja aprovado. A sua aprovação (ou rejeição) estende-se a subdomínios.
rejected: Ligações deste editor não serão postas em alta
rejected: As hiperligações deste editor não podem ser tendência
title: Editores
rejected: Rejeitado
statuses:
@ -907,18 +907,18 @@ pt-PT:
description_html: Estas são publicações que o seu servidor conhece e que atualmente estão a ser frequentemente partilhadas e adicionadas aos favoritos. Isto pode ajudar os seus utilizadores, novos e retornados, a encontrar mais pessoas para seguir. Nenhuma publicação será exibida publicamente até que aprove o autor, e o autor permita que a sua conta seja sugerida a outros. Você também pode permitir ou rejeitar publicações individualmente.
disallow: Não permitir publicação
disallow_account: Não permitir autor
no_status_selected: Nenhuma publicação em alta foi alterada, pois nenhuma foi selecionada
no_status_selected: Não foram alteradas quaisquer publicações de tendências, uma vez que nenhuma foi selecionada
not_discoverable: O autor optou por não permitir que a sua conta seja sugerida a outros
shared_by:
one: Partilhado ou adicionado aos marcadores uma vez
other: Partilhado e adicionado aos marcadores %{friendly_count} vezes
title: Publicações em alta
title: Publicações em tendência
tags:
current_score: Pontuação atual %{score}
dashboard:
tag_accounts_measure: utilizadores únicos
tag_languages_dimension: Idiomas mais populares
tag_servers_dimension: Topo de servidores
tag_servers_dimension: Servidores mais populares
tag_servers_measure: servidores diferentes
tag_uses_measure: utilizações totais
description_html: 'Estas são as #etiquetas que aparecem atualmente com frequência em publicações visíveis pelo seu servidor. Isto pode ajudar os seus utilizadores a descobrir o que está ser mais falado no momento. Nenhuma #etiqueta será exibida publicamente até que a aprove.'
@ -928,15 +928,16 @@ pt-PT:
not_trendable: Não aparecerá nas tendências
not_usable: Não pode ser utilizada
peaked_on_and_decaying: Máximo em %{date}, agora a decair
title: Etiquetas em alta
trendable: Pode aparecer em alta
trending_rank: 'Em alta #%{rank}'
title: Etiquetas em tendência
trendable: Pode aparecer nas tendências
trending_rank: 'Tendência #%{rank}'
usable: Pode ser utilizada
usage_comparison: Utilizada %{today} vezes hoje, em comparação com %{yesterday} ontem
used_by_over_week:
one: Utilizada por uma pessoa na última semana
other: Utilizada por %{count} pessoas na última semana
trending: Em alta
title: Recomendações e tendências
trending: Em tendência
warning_presets:
add_new: Adicionar novo
delete: Eliminar
@ -946,13 +947,13 @@ pt-PT:
webhooks:
add_new: Adicionar endpoint
delete: Eliminar
description_html: Um <strong>webhook</strong> possibilita que o Mastodon envie <strong>notificações em tempo real</strong> de eventos seleccionados, para uma aplicação sua, de modo que esta possa <strong>espoletar ações automaticamente</strong>.
description_html: Um <strong>webhook</strong> possibilita que o Mastodon envie <strong>notificações em tempo real</strong> de eventos selecionados, para uma aplicação sua, de modo que esta possa <strong>despoletar ações automaticamente</strong>.
disable: Desativar
disabled: Desativado
edit: Editar endpoint
empty: Não tem ainda qualquer endpoint de webhook configurado.
enable: Ativar
enabled: Activo
enabled: Ativo
enabled_events:
one: 1 evento ativado
other: "%{count} eventos ativados"
@ -993,18 +994,18 @@ pt-PT:
body: Foram lançadas novas versões do Mastodon, talvez queira atualizar!
subject: Estão disponíveis novas versões do Mastodon para %{instance}!
new_trends:
body: 'Os seguintes itens precisam ser revistos antes de poderem ser exibidos publicamente:'
body: 'Os seguintes itens necessitam de uma revisão antes de poderem ser apresentados publicamente:'
new_trending_links:
title: Ligações em alta
title: Hiperligações em tendência
new_trending_statuses:
title: Publicações em alta
title: Publicações em tendência
new_trending_tags:
title: Etiquetas em alta
title: Etiquetas em tendência
subject: Novas tendências para revisão em %{instance}
aliases:
add_new: Criar pseudónimo
created_msg: Criou com sucesso um novo pseudónimo. Pode agora iniciar a migração da conta antiga.
deleted_msg: O pseudónimo foi correctamente eliminado. Não será mais possível migrar a partir dessa conta.
deleted_msg: O pseudónimo foi removido com êxito. Deixará de ser possível passar dessa conta para esta.
empty: Não tem pseudónimos.
hint_html: Se quiser mudar de outra conta para esta, pode criar aqui um pseudónimo, que é necessário antes de poder prosseguir com a migração de seguidores da conta antiga para esta. Esta ação por si só é <strong>inofensiva e reversível</strong>. <strong>A migração da conta é iniciada a partir da conta antiga</strong>.
remove: Desvincular pseudónimo
@ -1026,8 +1027,8 @@ pt-PT:
view_profile: Ver perfil
view_status: Ver publicação
applications:
created: Aplicação correctamente criada
destroyed: Aplicação correctamente eliminada
created: Aplicação criada com sucesso
destroyed: Aplicação eliminada com sucesso
logout: Sair
regenerate_token: Regenerar token de acesso
token_regenerated: Token de acesso regenerado com sucesso
@ -1036,7 +1037,7 @@ pt-PT:
auth:
apply_for_account: Solicitar uma conta
captcha_confirmation:
help_html: Se tiver problemas a resolver o CAPTCHA, pode entrar em contacto conosco através de %{email} e poderemos ajudá-lo.
help_html: Se tiver problemas a resolver o CAPTCHA, pode entrar em contacto connosco através de %{email} e poderemos ajudá-lo.
hint_html: Só mais uma coisa! Precisamos confirmar que você é um humano (isto para que possamos evitar spam!). Resolva o CAPTCHA abaixo e clique em "Continuar".
title: Verificação de segurança
confirmations:
@ -1138,7 +1139,7 @@ pt-PT:
confirm_password: Insira sua palavra-passe atual para verificar a sua identidade
confirm_username: Insira seu nome de utilizador para confirmar o procedimento
proceed: Eliminar conta
success_msg: A sua conta foi correctamente eliminada
success_msg: A sua conta foi eliminada com sucesso
warning:
before: 'Antes de continuar, por favor leia cuidadosamente estas notas:'
caches: O conteúdo que foi armazenado em cache por outras instâncias pode perdurar
@ -1335,11 +1336,11 @@ pt-PT:
muting: Importando contas silenciadas
type: Tipo de importação
type_groups:
constructive: Seguidores e Marcadores
constructive: Seguidores e marcadores
destructive: Bloqueios e silenciamentos
types:
blocking: Lista de bloqueio
bookmarks: Itens salvos
bookmarks: Marcadores
domain_blocking: Lista de domínios bloqueados
following: Lista de pessoas que estás a seguir
lists: Listas
@ -1395,7 +1396,7 @@ pt-PT:
acct: Mudou-se para
cancel: Cancelar redirecionamento
cancel_explanation: Cancelar o redirecionamento irá reativar a sua conta atual, mas não trará de volta os seguidores que foram migrados para essa conta.
cancelled_msg: Cancelou correctamente o redireccionamento.
cancelled_msg: Cancelou corretamente o redirecionamento.
errors:
already_moved: é a mesma conta para a qual já migrou
missing_also_known_as: não é um pseudónimo dessa conta
@ -1405,13 +1406,13 @@ pt-PT:
followers_count: Seguidores no momento da migração
incoming_migrations: A migrar de uma conta diferente
incoming_migrations_html: Para migrar de outra conta para esta, primeiro você precisa <a href="%{path}">criar um pseudónimo</a>.
moved_msg: A sua conta está agora a ser redireccionada para %{acct} e os seus seguidores estão a ser transferidos.
moved_msg: A sua conta está agora a ser redirecionada para %{acct} e os seus seguidores estão a ser transferidos.
not_redirecting: A sua conta não está atualmente a ser redirecionada para nenhuma outra conta.
on_cooldown: Migrou recentemente a sua conta. Esta função ficará disponível novamente em %{count} dias.
past_migrations: Migrações anteriores
proceed_with_move: Migrar seguidores
redirected_msg: A sua conta está agora a ser redireccionada para %{acct}.
redirecting_to: A sua conta está a ser redireccionada para %{acct}.
redirected_msg: A sua conta está agora a ser redirecionada para %{acct}.
redirecting_to: A sua conta está a ser redirecionada para %{acct}.
set_redirect: Definir redirecionamento
warning:
backreference_required: A nova conta deve primeiro ser configurada para que esta seja referenciada
@ -1419,7 +1420,7 @@ pt-PT:
cooldown: Após a migração, há um período de tempo de espera durante o qual não poderá voltar a migrar
disabled_account: Posteriormente, a sua conta atual não será totalmente utilizável. No entanto, continuará a ter acesso à exportação de dados, bem como à reativação.
followers: Esta ação irá migrar todos os seguidores da conta atual para a nova conta
only_redirect_html: Em alternativa, pode <a href="%{path}">apenas colocar um redireccionamento no seu perfil</a>.
only_redirect_html: Em alternativa, pode <a href="%{path}">apenas colocar um redirecionamento no seu perfil</a>.
other_data: Nenhum outro dado será migrado automaticamente
redirect: O perfil da sua conta atual será atualizado com um aviso de redirecionamento e será excluído das pesquisas
moderation:
@ -1546,7 +1547,7 @@ pt-PT:
remove_selected_follows: Deixar de seguir os utilizadores selecionados
status: Estado da conta
remote_follow:
missing_resource: Não foi possível encontrar o URL de redireccionamento para a sua conta
missing_resource: Não foi possível encontrar o URL de redirecionamento para a sua conta
reports:
errors:
invalid_rules: não faz referência a regras válidas
@ -1639,7 +1640,7 @@ pt-PT:
user_domain_block: Bloqueou %{target_name}
lost_followers: Seguidores perdidos
lost_follows: Pessoas que segue perdidas
preamble: Pode perder seguidores e pessoas que segue quando bloqueia um domínio ou quando os seus moderadores decidem suspender um servidor remoto. Quando isso acontecer, poderá descarregar listas de relações cessadas, para serem inspeccionadas e possivelmente importadas para outro servidor.
preamble: Pode perder seguidores e pessoas que segue quando bloqueia um domínio ou quando os seus moderadores decidem suspender um servidor remoto. Quando isso acontecer, poderá descarregar listas de relações cortadas, para serem inspecionadas e possivelmente importadas para outro servidor.
purged: Informações sobre este servidor foram purgadas pelos administradores do seu servidor.
type: Evento
statuses:
@ -1706,8 +1707,8 @@ pt-PT:
keep_pinned_hint: Não apagar nenhuma das suas publicações afixadas
keep_polls: Manter sondagens
keep_polls_hint: Não apaga nenhuma das suas sondagens
keep_self_bookmark: Manter as publicações que guardou
keep_self_bookmark_hint: Não apaga as suas próprias publicações se as tiver guardado
keep_self_bookmark: Manter as publicações que marcou
keep_self_bookmark_hint: Não elimina as suas próprias publicações se as tiver nos marcadores
keep_self_fav: Manter as publicações que marcou
keep_self_fav_hint: Não apaga as suas próprias publicações se as tiver marcado
min_age:
@ -1852,8 +1853,8 @@ pt-PT:
one: "%{people} pessoa nos últimos 2 dias"
other: "%{people} pessoas nos últimos 2 dias"
hashtags_subtitle: Explore o que está em tendência desde os últimos 2 dias
hashtags_title: Trending hashtags
hashtags_view_more: Ver mais hashtags em alta
hashtags_title: Etiquetas em tendência
hashtags_view_more: Ver mais etiquetas em tendência
post_action: Compor
post_step: Diga olá para o mundo com texto, fotos, vídeos ou enquetes.
post_title: Faça a sua primeira publicação
@ -1874,7 +1875,7 @@ pt-PT:
extra_instructions_html: <strong>Dica:</strong> A ligação no seu site pode ser invisível. A parte importante é <code>rel="me"</code> que impede a personificação em sites com conteúdo gerado pelo utilizador. Pode até utilizar uma etiqueta <code>link</code> no cabeçalho da página ao invés de <code>a</code>, mas o HTML deve ser acessível sem executar JavaScript.
here_is_how: Veja como
hint_html: "<strong>Verificar a sua identidade no Mastodon é para todos.</strong> Baseado em normas públicas da web, agora e para sempre gratuitas. Tudo o que precisa é de um site pessoal pelo qual as pessoas o reconheçam. Quando coloca no seu perfil uma ligação para esse site, vamos verificar que o site tem uma ligação de volta para o seu perfil e mostrar um indicador visual."
instructions_html: Copie e cole o código abaixo no HTML do seu site. Em seguida, adicione o endereço do seu site em um dos campos extras no seu perfil, na aba "Editar perfil" e salve as alterações.
instructions_html: Copie e cole o código abaixo no HTML do seu site. Em seguida, adicione o endereço do seu site num dos campos extras no seu perfil, na aba "Editar perfil" e guarde as alterações.
verification: Verificação
verified_links: As suas ligações verificadas
webauthn_credentials:

View File

@ -206,7 +206,7 @@ ar:
setting_aggregate_reblogs: جمّع المنشورات المعاد نشرها في الخيوط الزمنية
setting_always_send_emails: ارسل إشعارات البريد الإلكتروني دائماً
setting_auto_play_gif: تشغيل تلقائي لِوَسائط جيف المتحركة
setting_boost_modal: إظهار مربع حوار التأكيد قبل إعادة مشاركة أي منشور
setting_boost_modal: إظهار مربع حوار التأكيد قبل إعادة نشر أي منشور
setting_default_language: لغة النشر
setting_default_privacy: خصوصية المنشور
setting_default_sensitive: اعتبر الوسائط دائما كمحتوى حساس

View File

@ -52,7 +52,7 @@ pt-PT:
locale: O idioma da interface de utilizador, e-mails e notificações push
password: Use pelo menos 8 caracteres
phrase: Será correspondido independentemente da capitalização ou do aviso de conteúdo duma publicação
scopes: Quais as API a que será concedido acesso. Se escolher uma abrangência de nível superior, não precisará de as seleccionar individualmente.
scopes: Quais as API a que a aplicação terá permissão para aceder. Se selecionar um âmbito de nível superior, não precisa de selecionar âmbitos individuais.
setting_aggregate_reblogs: Não mostrar novos reforços de publicações recentemente reforçadas (só afecta publicações acabadas de reforçar)
setting_always_send_emails: Normalmente as notificações por e-mail não serão enviadas quando estiver a utilizar ativamente o Mastodon
setting_default_sensitive: Media problemática oculta por padrão, pode ser revelada com um clique
@ -81,7 +81,7 @@ pt-PT:
backups_retention_period: Os utilizadores têm a possibilidade de gerar arquivos das suas mensagens para descarregar mais tarde. Quando definido para um valor positivo, estes arquivos serão automaticamente eliminados do seu armazenamento após o número de dias especificado.
bootstrap_timeline_accounts: Estas contas serão destacadas no topo das recomendações aos novos utilizadores.
closed_registrations_message: Apresentado quando as inscrições estiverem encerradas
content_cache_retention_period: Todas as publicações de outros servidores (incluindo boosts e respostas) serão eliminadas após o número de dias especificado, independentemente de qualquer interação do utilizador local com essas publicações. Isto inclui publicações em que um utilizador local as tenha marcado como favoritas ou adicionado aos items salvos. As menções privadas entre utilizadores de instâncias diferentes também se perderão e serão impossíveis de restaurar. A utilização desta definição destina-se a instâncias para fins especiais e quebra muitas expectativas dos utilizadores quando implementada para utilização geral.
content_cache_retention_period: Todas as publicações de outros servidores (incluindo boosts e respostas) serão eliminadas após o número de dias especificado, independentemente de qualquer interação do utilizador local com essas publicações. Isto inclui publicações em que um utilizador local as tenha marcado ou favoritado. As menções privadas entre utilizadores de instâncias diferentes também se perderão e serão impossíveis de restaurar. A utilização desta definição destina-se a instâncias para fins especiais e quebra muitas expectativas dos utilizadores quando implementada para utilização geral.
custom_css: Pode aplicar estilos personalizados na versão web do Mastodon.
favicon: WEBP, PNG, GIF ou JPG. Substitui o ícone de favorito padrão do Mastodon por um ícone personalizado.
mascot: Sobrepõe-se à ilustração na interface web avançada.
@ -99,9 +99,9 @@ pt-PT:
theme: Tema que os visitantes e os novos utilizadores veem.
thumbnail: Uma imagem de cerca de 2:1, apresentada ao lado da informação do seu servidor.
timeline_preview: Os visitantes sem sessão iniciada poderão consultar as publicações públicas mais recentes disponíveis no servidor.
trendable_by_default: Ignorar a revisão manual do conteúdo em alta. Elementos em avulso poderão ainda assim ser retirados das tendências mesmo após a sua apresentação.
trends: As publicações em alta mostram quais as publicações, etiquetas e notícias que estão a ganhar destaque no seu servidor.
trends_as_landing_page: Mostrar conteúdo de tendências para usuários logados e visitantes em vez de uma descrição deste servidor. Requer que as tendências sejam ativadas.
trendable_by_default: Ignorar a revisão manual do conteúdo de tendências. Os itens individuais ainda podem ser removidos das tendências após a apresentação.
trends: As tendências mostram quais as publicações, etiquetas e notícias que estão a ganhar destaque no seu servidor.
trends_as_landing_page: Mostrar conteúdo de tendências a utilizadores e visitantes com sessão terminada em vez de uma descrição deste servidor. Requer que as tendências estejam ativadas.
form_challenge:
current_password: Está a entrar numa área segura
imports:
@ -129,7 +129,7 @@ pt-PT:
tag:
name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis
user:
chosen_languages: Quando seleccionado, só serão mostradas nas cronologias públicas as publicações nos idiomas escolhidos
chosen_languages: Quando selecionado, só serão mostradas nas cronologias públicas as publicações nos idiomas escolhidos
role: A função controla que permissões o utilizador tem
user_role:
color: Cor a ser utilizada para a função em toda a interface de utilizador, como RGB no formato hexadecimal
@ -222,7 +222,7 @@ pt-PT:
setting_reduce_motion: Reduz movimento em animações
setting_system_font_ui: Usar o tipo de letra padrão do sistema
setting_theme: Tema do sítio
setting_trends: Mostrar o que está hoje em alta
setting_trends: Mostrar as tendências de hoje
setting_unfollow_modal: Solicitar confirmação antes de deixar de seguir alguém
setting_use_blurhash: Mostrar gradientes coloridos para medias ocultas
setting_use_pending_items: Modo lento
@ -253,7 +253,7 @@ pt-PT:
mascot: Mascote personalizada (legado)
media_cache_retention_period: Período de retenção de ficheiros de media em cache
peers_api_enabled: Publicar lista de servidores descobertos na API
profile_directory: Habilitar diretório de perfis
profile_directory: Ativar o diretório de perfis
registrations_mode: Quem se pode inscrever
require_invite_text: Requerer uma razão para entrar
show_domain_blocks: Mostrar domínios bloqueados
@ -268,8 +268,8 @@ pt-PT:
theme: Tema predefinido
thumbnail: Miniatura do servidor
timeline_preview: Permitir acesso não autenticado às cronologias públicas
trendable_by_default: Permitir publicações em alta sem revisão prévia
trends: Activar publicações em alta
trendable_by_default: Permitir tendências sem revisão prévia
trends: Ativar tendências
trends_as_landing_page: Usar tendências como página inicial
interactions:
must_be_follower: Bloquear notificações de não-seguidores
@ -303,7 +303,7 @@ pt-PT:
label: Está disponível uma nova versão do Mastodon
none: Nunca notificar atualizações (não recomendado)
patch: Notificar sobre atualizações de correções de problemas
trending_tag: Uma nova publicação em alta requer avaliação
trending_tag: Uma nova publicação em tendência requer revisão
rule:
hint: Informação Adicional
text: Regra
@ -313,7 +313,7 @@ pt-PT:
tag:
listable: Permitir que esta etiqueta apareça em pesquisas e no diretório de perfis
name: Etiqueta
trendable: Permitir que esta etiqueta apareça em alta
trendable: Permitir que esta etiqueta apareça nas tendências
usable: Permitir que as publicações usem esta hashtag localmente
user:
role: Cargo

View File

@ -63,30 +63,44 @@ class Mastodon::RedisConfiguration
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))
return { url:, driver: } if url
if name.present? && sentinels.present?
host = name
sentinel_options = setup_sentinels(prefix, default_user: user, default_password: password)
if sentinel_options.present?
host = sentinel_options[:name]
port = nil
db ||= 0
else
sentinels = nil
end
url = construct_uri(host, port, db, user, password)
if url.present?
{ url:, driver:, name:, sentinels: }
{ url:, driver: }.merge(sentinel_options)
else
# Fall back to base config. This has defaults for the URL
# so this cannot lead to an endless loop.
# Fall back to base config, which has defaults for the URL
# so this cannot lead to endless recursion.
base
end
end
def setup_sentinels(prefix, default_user: nil, default_password: nil)
name = ENV.fetch("#{prefix}SENTINEL_MASTER", nil)
sentinel_port = ENV.fetch("#{prefix}SENTINEL_PORT", 26_379)
sentinel_list = ENV.fetch("#{prefix}SENTINELS", nil)
sentinel_username = ENV.fetch("#{prefix}SENTINEL_USERNAME", default_user)
sentinel_password = ENV.fetch("#{prefix}SENTINEL_PASSWORD", default_password)
sentinels = parse_sentinels(sentinel_list, default_port: sentinel_port)
if name.present? && sentinels.present?
{ name:, sentinels:, sentinel_username:, sentinel_password: }
else
{}
end
end
def construct_uri(host, port, db, user, password)
return nil if host.blank?
@ -96,10 +110,10 @@ class Mastodon::RedisConfiguration
end.normalize.to_str
end
def parse_sentinels(sentinels_string)
def parse_sentinels(sentinels_string, default_port: 26_379)
(sentinels_string || '').split(',').map do |sentinel|
host, port = sentinel.split(':')
port = port.present? ? port.to_i : 26_379
port = (port || default_port).to_i
{ host: host, port: port }
end.presence
end

View File

@ -48,7 +48,7 @@ RSpec.describe Admin::AccountsController do
end
def accounts_table_rows
Nokogiri::Slop(response.body).css('table.accounts-table tr')
response.parsed_body.css('table.accounts-table tr')
end
end

View File

@ -64,7 +64,7 @@ RSpec.describe Admin::ExportDomainBlocksController do
end
def batch_table_rows
Nokogiri::Slop(response.body).css('body div.batch-table__row')
response.parsed_body.css('body div.batch-table__row')
end
end

View File

@ -35,7 +35,7 @@ RSpec.describe Admin::InstancesController do
end
def instance_directory_links
Nokogiri::Slop(response.body).css('div.directory__tag a')
response.parsed_body.css('div.directory__tag a')
end
end

View File

@ -342,7 +342,7 @@ RSpec.describe Auth::RegistrationsController do
end
def username_error_text
Nokogiri::Slop(response.body).css('.user_account_username .error').text
response.parsed_body.css('.user_account_username .error').text
end
end

View File

@ -1,84 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe InvitesController do
render_views
let(:user) { Fabricate(:user) }
before do
sign_in user
end
describe 'GET #index' do
before do
Fabricate(:invite, user: user)
end
context 'when everyone can invite' do
before do
UserRole.everyone.update(permissions: UserRole.everyone.permissions | UserRole::FLAGS[:invite_users])
get :index
end
it 'returns http success' do
expect(response).to have_http_status(:success)
end
it 'returns private cache control headers' do
expect(response.headers['Cache-Control']).to include('private, no-store')
end
end
context 'when not everyone can invite' do
before do
UserRole.everyone.update(permissions: UserRole.everyone.permissions & ~UserRole::FLAGS[:invite_users])
get :index
end
it 'returns http forbidden' do
expect(response).to have_http_status(403)
end
end
end
describe 'POST #create' do
subject { post :create, params: { invite: { max_uses: '10', expires_in: 1800 } } }
context 'when everyone can invite' do
before do
UserRole.everyone.update(permissions: UserRole.everyone.permissions | UserRole::FLAGS[:invite_users])
end
it 'succeeds to create a invite' do
expect { subject }.to change(Invite, :count).by(1)
expect(subject).to redirect_to invites_path
expect(Invite.last).to have_attributes(user_id: user.id, max_uses: 10)
end
end
context 'when not everyone can invite' do
before do
UserRole.everyone.update(permissions: UserRole.everyone.permissions & ~UserRole::FLAGS[:invite_users])
end
it 'returns http forbidden' do
expect(subject).to have_http_status(403)
end
end
end
describe 'DELETE #destroy' do
subject { delete :destroy, params: { id: invite.id } }
let(:invite) { Fabricate(:invite, user: user, expires_at: nil) }
it 'expires invite and redirects' do
expect { subject }
.to(change { invite.reload.expired? }.to(true))
expect(response)
.to redirect_to invites_path
end
end
end

View File

@ -100,13 +100,31 @@ RSpec.describe Mastodon::RedisConfiguration do
expect(subject[:url]).to eq 'redis://:testpass1@mainsentinel/0'
end
it 'uses the redis password to authenticate with sentinels' do
expect(subject[:sentinel_password]).to eq 'testpass1'
end
it 'includes the sentinel master name and list of sentinels' do
expect(subject[:name]).to eq 'mainsentinel'
expect(subject[:sentinels]).to contain_exactly({ host: '192.168.0.1', port: 3000 }, { host: '192.168.0.2', port: 4000 })
end
context "when giving dedicated credentials in `#{prefix}REDIS_SENTINEL_USERNAME` and `#{prefix}REDIS_SENTINEL_PASSWORD`" do
around do |example|
ClimateControl.modify "#{prefix}REDIS_SENTINEL_USERNAME": 'sentinel_user', "#{prefix}REDIS_SENTINEL_PASSWORD": 'sentinel_pass1' do
example.run
end
end
it 'uses the credential to authenticate with sentinels' do
expect(subject[:sentinel_username]).to eq 'sentinel_user'
expect(subject[:sentinel_password]).to eq 'sentinel_pass1'
end
end
end
context 'when giving sentinels without port numbers' do
context "when no default port is given via `#{prefix}REDIS_SENTINEL_PORT`" do
around do |example|
ClimateControl.modify "#{prefix}REDIS_SENTINELS": '192.168.0.1,192.168.0.2', "#{prefix}REDIS_SENTINEL_MASTER": 'mainsentinel' do
example.run
@ -117,6 +135,31 @@ RSpec.describe Mastodon::RedisConfiguration do
expect(subject[:sentinels]).to contain_exactly({ host: '192.168.0.1', port: 26_379 }, { host: '192.168.0.2', port: 26_379 })
end
end
context 'when adding port numbers to some, but not all sentinels' do
around do |example|
ClimateControl.modify "#{prefix}REDIS_SENTINELS": '192.168.0.1:5678,192.168.0.2', "#{prefix}REDIS_SENTINEL_MASTER": 'mainsentinel' do
example.run
end
end
it 'uses the given port number when available and the default otherwise' do
expect(subject[:sentinels]).to contain_exactly({ host: '192.168.0.1', port: 5678 }, { host: '192.168.0.2', port: 26_379 })
end
end
context "when a default port is given via `#{prefix}REDIS_SENTINEL_PORT`" do
around do |example|
ClimateControl.modify "#{prefix}REDIS_SENTINEL_PORT": '1234', "#{prefix}REDIS_SENTINELS": '192.168.0.1,192.168.0.2', "#{prefix}REDIS_SENTINEL_MASTER": 'mainsentinel' do
example.run
end
end
it 'uses the given port number' do
expect(subject[:sentinels]).to contain_exactly({ host: '192.168.0.1', port: 1234 }, { host: '192.168.0.2', port: 1234 })
end
end
end
end
describe '#base' do
@ -128,8 +171,6 @@ RSpec.describe Mastodon::RedisConfiguration do
url: 'redis://localhost:6379/0',
driver: :hiredis,
namespace: nil,
name: nil,
sentinels: nil,
})
end
end
@ -162,8 +203,6 @@ RSpec.describe Mastodon::RedisConfiguration do
url: 'redis://:testpass@redis.example.com:3333/3',
driver: :hiredis,
namespace: nil,
name: nil,
sentinels: nil,
})
end
end
@ -192,8 +231,6 @@ RSpec.describe Mastodon::RedisConfiguration do
namespace: 'cache',
expires_in: 10.minutes,
connect_timeout: 5,
name: nil,
sentinels: nil,
pool: {
size: 5,
timeout: 5,

View File

@ -723,6 +723,30 @@ RSpec.describe Account do
end
end
describe '#prepare_contents' do
subject { Fabricate.build :account, domain: domain, note: ' padded note ', display_name: ' padded name ' }
context 'with local account' do
let(:domain) { nil }
it 'strips values' do
expect { subject.valid? }
.to change(subject, :note).to('padded note')
.and(change(subject, :display_name).to('padded name'))
end
end
context 'with remote account' do
let(:domain) { 'host.example' }
it 'preserves values' do
expect { subject.valid? }
.to not_change(subject, :note)
.and(not_change(subject, :display_name))
end
end
end
describe 'Normalizations' do
describe 'username' do
it { is_expected.to normalize(:username).from(" \u3000bob \t \u00a0 \n ").to('bob') }

View File

@ -64,14 +64,7 @@ RSpec.describe Announcement do
end
describe 'Validations' do
describe 'text' do
it 'validates presence of attribute' do
record = Fabricate.build(:announcement, text: nil)
expect(record).to_not be_valid
expect(record.errors[:text]).to be_present
end
end
it { is_expected.to validate_presence_of(:text) }
describe 'ends_at' do
it 'validates presence when starts_at is present' do

View File

@ -4,17 +4,8 @@ require 'rails_helper'
RSpec.describe Block do
describe 'validations' do
it 'is invalid without an account' do
block = Fabricate.build(:block, account: nil)
block.valid?
expect(block).to model_have_error_on_field(:account)
end
it 'is invalid without a target_account' do
block = Fabricate.build(:block, target_account: nil)
block.valid?
expect(block).to model_have_error_on_field(:target_account)
end
it { is_expected.to belong_to(:account).required }
it { is_expected.to belong_to(:target_account).required }
end
it 'removes blocking cache after creation' do

View File

@ -4,11 +4,6 @@ require 'rails_helper'
RSpec.describe CustomEmojiCategory do
describe 'validations' do
it 'validates name presence' do
record = described_class.new(name: nil)
expect(record).to_not be_valid
expect(record).to model_have_error_on_field(:name)
end
it { is_expected.to validate_presence_of(:name) }
end
end

View File

@ -4,19 +4,8 @@ require 'rails_helper'
RSpec.describe CustomFilter do
describe 'Validations' do
it 'requires presence of title' do
record = described_class.new(title: '')
record.valid?
expect(record).to model_have_error_on_field(:title)
end
it 'requires presence of context' do
record = described_class.new(context: nil)
record.valid?
expect(record).to model_have_error_on_field(:context)
end
it { is_expected.to validate_presence_of(:title) }
it { is_expected.to validate_presence_of(:context) }
it 'requires non-empty of context' do
record = described_class.new(context: [])

View File

@ -4,11 +4,7 @@ require 'rails_helper'
RSpec.describe DomainAllow do
describe 'Validations' do
it 'is invalid without a domain' do
domain_allow = Fabricate.build(:domain_allow, domain: nil)
domain_allow.valid?
expect(domain_allow).to model_have_error_on_field(:domain)
end
it { is_expected.to validate_presence_of(:domain) }
it 'is invalid if the same normalized domain already exists' do
_domain_allow = Fabricate(:domain_allow, domain: 'にゃん')

View File

@ -4,11 +4,7 @@ require 'rails_helper'
RSpec.describe DomainBlock do
describe 'validations' do
it 'is invalid without a domain' do
domain_block = Fabricate.build(:domain_block, domain: nil)
domain_block.valid?
expect(domain_block).to model_have_error_on_field(:domain)
end
it { is_expected.to validate_presence_of(:domain) }
it 'is invalid if the same normalized domain already exists' do
_domain_block = Fabricate(:domain_block, domain: 'にゃん')

View File

@ -9,17 +9,8 @@ RSpec.describe Follow do
describe 'validations' do
subject { described_class.new(account: alice, target_account: bob, rate_limit: true) }
it 'is invalid without an account' do
follow = Fabricate.build(:follow, account: nil)
follow.valid?
expect(follow).to model_have_error_on_field(:account)
end
it 'is invalid without a target_account' do
follow = Fabricate.build(:follow, target_account: nil)
follow.valid?
expect(follow).to model_have_error_on_field(:target_account)
end
it { is_expected.to belong_to(:account).required }
it { is_expected.to belong_to(:target_account).required }
it 'is invalid if account already follows too many people' do
alice.update(following_count: FollowLimitValidator::LIMIT)

View File

@ -3,19 +3,8 @@
require 'rails_helper'
RSpec.describe Import do
let(:account) { Fabricate(:account) }
let(:type) { 'following' }
let(:data) { attachment_fixture('imports.txt') }
describe 'validations' do
it 'is invalid without an type' do
import = described_class.create(account: account, data: data)
expect(import).to model_have_error_on_field(:type)
end
it 'is invalid without a data' do
import = described_class.create(account: account, type: type)
expect(import).to model_have_error_on_field(:data)
end
describe 'Validations' do
it { is_expected.to validate_presence_of(:type) }
it { is_expected.to validate_presence_of(:data) }
end
end

View File

@ -4,19 +4,8 @@ require 'rails_helper'
RSpec.describe IpBlock do
describe 'validations' do
it 'validates ip presence', :aggregate_failures do
ip_block = described_class.new(ip: nil, severity: :no_access)
expect(ip_block).to_not be_valid
expect(ip_block).to model_have_error_on_field(:ip)
end
it 'validates severity presence', :aggregate_failures do
ip_block = described_class.new(ip: '127.0.0.1', severity: nil)
expect(ip_block).to_not be_valid
expect(ip_block).to model_have_error_on_field(:severity)
end
it { is_expected.to validate_presence_of(:ip) }
it { is_expected.to validate_presence_of(:severity) }
it 'validates ip uniqueness', :aggregate_failures do
described_class.create!(ip: '127.0.0.1', severity: :no_access)

View File

@ -3,14 +3,7 @@
require 'rails_helper'
RSpec.describe Marker do
describe 'validations' do
describe 'timeline' do
it 'must be included in valid list' do
record = described_class.new(timeline: 'not real timeline')
expect(record).to_not be_valid
expect(record).to model_have_error_on_field(:timeline)
end
end
describe 'Validations' do
it { is_expected.to validate_inclusion_of(:timeline).in_array(described_class::TIMELINES) }
end
end

View File

@ -257,12 +257,7 @@ RSpec.describe MediaAttachment, :attachment_processing do
end
end
it 'is invalid without file' do
media = described_class.new
expect(media.valid?).to be false
expect(media).to model_have_error_on_field(:file)
end
it { is_expected.to validate_presence_of(:file) }
describe 'size limit validation' do
it 'rejects video files that are too large' do

View File

@ -4,16 +4,7 @@ require 'rails_helper'
RSpec.describe Mention do
describe 'validations' do
it 'is invalid without an account' do
mention = Fabricate.build(:mention, account: nil)
mention.valid?
expect(mention).to model_have_error_on_field(:account)
end
it 'is invalid without a status' do
mention = Fabricate.build(:mention, status: nil)
mention.valid?
expect(mention).to model_have_error_on_field(:status)
end
it { is_expected.to belong_to(:account).required }
it { is_expected.to belong_to(:status).required }
end
end

View File

@ -32,12 +32,9 @@ RSpec.describe Poll do
describe 'validations' do
context 'when not valid' do
let(:poll) { Fabricate.build(:poll, expires_at: nil) }
subject { Fabricate.build(:poll) }
it 'is invalid without an expire date' do
poll.valid?
expect(poll).to model_have_error_on_field(:expires_at)
end
it { is_expected.to validate_presence_of(:expires_at) }
end
end
end

View File

@ -32,11 +32,7 @@ RSpec.describe User do
end
describe 'validations' do
it 'is invalid without an account' do
user = Fabricate.build(:user, account: nil)
user.valid?
expect(user).to model_have_error_on_field(:account)
end
it { is_expected.to belong_to(:account).required }
it 'is invalid without a valid email' do
user = Fabricate.build(:user, email: 'john@')

View File

@ -4,37 +4,10 @@ require 'rails_helper'
RSpec.describe WebauthnCredential do
describe 'validations' do
it 'is invalid without an external id' do
webauthn_credential = Fabricate.build(:webauthn_credential, external_id: nil)
webauthn_credential.valid?
expect(webauthn_credential).to model_have_error_on_field(:external_id)
end
it 'is invalid without a public key' do
webauthn_credential = Fabricate.build(:webauthn_credential, public_key: nil)
webauthn_credential.valid?
expect(webauthn_credential).to model_have_error_on_field(:public_key)
end
it 'is invalid without a nickname' do
webauthn_credential = Fabricate.build(:webauthn_credential, nickname: nil)
webauthn_credential.valid?
expect(webauthn_credential).to model_have_error_on_field(:nickname)
end
it 'is invalid without a sign_count' do
webauthn_credential = Fabricate.build(:webauthn_credential, sign_count: nil)
webauthn_credential.valid?
expect(webauthn_credential).to model_have_error_on_field(:sign_count)
end
it { is_expected.to validate_presence_of(:external_id) }
it { is_expected.to validate_presence_of(:public_key) }
it { is_expected.to validate_presence_of(:nickname) }
it { is_expected.to validate_presence_of(:sign_count) }
it 'is invalid if already exist a webauthn credential with the same external id' do
Fabricate(:webauthn_credential, external_id: '_Typ0ygudDnk9YUVWLQayw')

View File

@ -6,12 +6,7 @@ RSpec.describe Webhook do
let(:webhook) { Fabricate(:webhook) }
describe 'Validations' do
it 'requires presence of events' do
record = described_class.new(events: nil)
record.valid?
expect(record).to model_have_error_on_field(:events)
end
it { is_expected.to validate_presence_of(:events) }
it 'requires non-empty events value' do
record = described_class.new(events: [])

View File

@ -18,14 +18,16 @@ RSpec.describe 'The account show page' do
end
def head_link_icons
head_section.css('link[rel=icon]')
response
.parsed_body
.search('html head link[rel=icon]')
end
def head_meta_content(property)
head_section.meta("[@property='#{property}']")[:content]
end
def head_section
Nokogiri::Slop(response.body).html.head
response
.parsed_body
.search("html head meta[property='#{property}']")
.attr('content')
.text
end
end

View File

@ -4,11 +4,6 @@ require 'rails_helper'
RSpec.describe 'Instance actor endpoint' do
describe 'GET /actor' do
before do
integration_session.https! # TODO: Move to global rails_helper for all request specs?
host! Rails.configuration.x.local_domain # TODO: Move to global rails_helper for all request specs?
end
let!(:original_federation_mode) { Rails.configuration.x.limited_federation_mode }
shared_examples 'instance actor endpoint' do

View File

@ -0,0 +1,31 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe 'Invites' do
let(:user) { Fabricate(:user) }
before { sign_in user }
context 'when not everyone can invite' do
before { UserRole.everyone.update(permissions: UserRole.everyone.permissions & ~UserRole::FLAGS[:invite_users]) }
describe 'GET /invites' do
it 'returns http forbidden' do
get invites_path
expect(response)
.to have_http_status(403)
end
end
describe 'POST /invites' do
it 'returns http forbidden' do
post invites_path, params: { invite: { max_users: '10', expires_in: 1800 } }
expect(response)
.to have_http_status(403)
end
end
end
end

View File

@ -0,0 +1,14 @@
# frozen_string_literal: true
RSpec::Matchers.define :have_private_cache_control do
match do |page|
page.response_headers['Cache-Control'] == 'private, no-store'
end
failure_message do |page|
<<~ERROR
Expected page to have `Cache-Control` header with `private, no-store` but it has:
#{page.response_headers['Cache-Control']}
ERROR
end
end

View File

@ -0,0 +1,86 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe 'Invites' do
include ActionView::RecordIdentifier
let(:user) { Fabricate :user }
before do
host! 'localhost:3000' # TODO: Move into before for all system specs?
sign_in user
end
describe 'Viewing invites' do
it 'Lists existing user invites' do
invite = Fabricate :invite, user: user
visit invites_path
within css_id(invite) do
expect(page)
.to have_content(invite.uses)
.and have_private_cache_control
expect(copyable_field.value)
.to eq(public_invite_url(invite_code: invite.code))
end
end
end
describe 'Creating a new invite' do
it 'Saves the invite for the user' do
visit invites_path
fill_invite_form
expect { submit_form }
.to change(user.invites, :count).by(1)
end
end
describe 'Deleting an existing invite' do
it 'Expires the invite' do
invite = Fabricate :invite, user: user
visit invites_path
expect { delete_invite(invite) }
.to change { invite.reload.expired? }.to(true)
within css_id(invite) do
expect(page).to have_content I18n.t('invites.expired')
end
end
end
private
def css_id(record)
"##{dom_id(record)}" # TODO: Extract to system spec helper?
end
def copyable_field
within '.input-copy' do
find(:field, type: :text, readonly: true)
end
end
def submit_form
click_on I18n.t('invites.generate')
end
def delete_invite(invite)
within css_id(invite) do
click_on I18n.t('invites.delete')
end
end
def fill_invite_form
select I18n.t('invites.max_uses', count: 100),
from: I18n.t('simple_form.labels.defaults.max_uses')
select I18n.t("invites.expires_in.#{30.minutes.to_i}"),
from: I18n.t('simple_form.labels.defaults.expires_in')
check I18n.t('simple_form.labels.defaults.autofollow')
end
end

View File

@ -6,11 +6,14 @@ RSpec.describe 'Tags' do
describe 'Viewing a tag' do
let(:tag) { Fabricate(:tag, name: 'test') }
before { sign_in Fabricate(:user) }
it 'visits the tag page and renders the web app' do
visit tag_path(tag)
expect(page)
.to have_css('noscript', text: /Mastodon/)
.and have_private_cache_control
end
end
end

110
yarn.lock
View File

@ -6727,26 +6727,26 @@ __metadata:
languageName: node
linkType: hard
"cssnano-preset-default@npm:^7.0.5":
version: 7.0.5
resolution: "cssnano-preset-default@npm:7.0.5"
"cssnano-preset-default@npm:^7.0.6":
version: 7.0.6
resolution: "cssnano-preset-default@npm:7.0.6"
dependencies:
browserslist: "npm:^4.23.3"
css-declaration-sorter: "npm:^7.2.0"
cssnano-utils: "npm:^5.0.0"
postcss-calc: "npm:^10.0.1"
postcss-calc: "npm:^10.0.2"
postcss-colormin: "npm:^7.0.2"
postcss-convert-values: "npm:^7.0.3"
postcss-discard-comments: "npm:^7.0.2"
postcss-convert-values: "npm:^7.0.4"
postcss-discard-comments: "npm:^7.0.3"
postcss-discard-duplicates: "npm:^7.0.1"
postcss-discard-empty: "npm:^7.0.0"
postcss-discard-overridden: "npm:^7.0.0"
postcss-merge-longhand: "npm:^7.0.3"
postcss-merge-rules: "npm:^7.0.3"
postcss-merge-longhand: "npm:^7.0.4"
postcss-merge-rules: "npm:^7.0.4"
postcss-minify-font-values: "npm:^7.0.0"
postcss-minify-gradients: "npm:^7.0.0"
postcss-minify-params: "npm:^7.0.2"
postcss-minify-selectors: "npm:^7.0.3"
postcss-minify-selectors: "npm:^7.0.4"
postcss-normalize-charset: "npm:^7.0.0"
postcss-normalize-display-values: "npm:^7.0.0"
postcss-normalize-positions: "npm:^7.0.0"
@ -6760,10 +6760,10 @@ __metadata:
postcss-reduce-initial: "npm:^7.0.2"
postcss-reduce-transforms: "npm:^7.0.0"
postcss-svgo: "npm:^7.0.1"
postcss-unique-selectors: "npm:^7.0.2"
postcss-unique-selectors: "npm:^7.0.3"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/ffa7c6fa16c6ad98b7732fc563de74d492e6ad6d243a9f00431c0cbdbc576bcd49226d2695d881465d32dea0a2916add40ac10e7560dd7b5de9fd0fa25ee081b
checksum: 10c0/5c827a9f6b35475267af0512d55f569994b8334eb06565498daa2070ef52f0cdd2013f5efc1cbc0b4664370f491b0080f93c8ee56a7730d38fdf451fb65b030c
languageName: node
linkType: hard
@ -6777,14 +6777,14 @@ __metadata:
linkType: hard
"cssnano@npm:^7.0.0":
version: 7.0.5
resolution: "cssnano@npm:7.0.5"
version: 7.0.6
resolution: "cssnano@npm:7.0.6"
dependencies:
cssnano-preset-default: "npm:^7.0.5"
cssnano-preset-default: "npm:^7.0.6"
lilconfig: "npm:^3.1.2"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/cb43ed964787dca33efb44d8f4fea8a49c495db44d1d12940493f0dd5d63db78e01c5b140fe42b480b332733602a25f4c85186d00977eb3070b29f7422761985
checksum: 10c0/19ff09931a1531e7c0c0d8928da554d99213aa0bb1f3b93cc6b4987727d60a8cd5537b113a5cf4f95cc1db65bba3f2b35476bd63bb57e7469d4eab73e07d736d
languageName: node
linkType: hard
@ -13302,15 +13302,15 @@ __metadata:
languageName: node
linkType: hard
"postcss-calc@npm:^10.0.1":
version: 10.0.1
resolution: "postcss-calc@npm:10.0.1"
"postcss-calc@npm:^10.0.2":
version: 10.0.2
resolution: "postcss-calc@npm:10.0.2"
dependencies:
postcss-selector-parser: "npm:^6.1.1"
postcss-selector-parser: "npm:^6.1.2"
postcss-value-parser: "npm:^4.2.0"
peerDependencies:
postcss: ^8.4.38
checksum: 10c0/5e38cc6f082f87e82067497b41684410784223ecd3701bf52242ea9f2f467f1fad6b5a561f8aa3be307d89435b4060f58aeb27c4064003586daf653cc4d91fef
checksum: 10c0/f57c9db7a7a2f3a0cdf45990089c051248d995bb2b9d1bd1fcd1634507851e92ea85bbc71a3594e359e9e9287ba0a820c90d6d292126a4b735cda364a86ce9cf
languageName: node
linkType: hard
@ -13378,15 +13378,15 @@ __metadata:
languageName: node
linkType: hard
"postcss-convert-values@npm:^7.0.3":
version: 7.0.3
resolution: "postcss-convert-values@npm:7.0.3"
"postcss-convert-values@npm:^7.0.4":
version: 7.0.4
resolution: "postcss-convert-values@npm:7.0.4"
dependencies:
browserslist: "npm:^4.23.3"
postcss-value-parser: "npm:^4.2.0"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/dbb6278bd8d8b11e448933d823426c883bff3f6abeaa23c7530cc4668b9da6f714e073840f280273f8a14022c3a99eb461ec732f7539e062b32f5281e1be6526
checksum: 10c0/9839b29f7c638672115c9fef5ed7df016aa43ea9dd42a4a2ace16e6a49c75246d2c19f3e03a6409ed3bc7c2fa4de6203bf5789cef8268c76618326b68e3bc591
languageName: node
linkType: hard
@ -13444,14 +13444,14 @@ __metadata:
languageName: node
linkType: hard
"postcss-discard-comments@npm:^7.0.2":
version: 7.0.2
resolution: "postcss-discard-comments@npm:7.0.2"
"postcss-discard-comments@npm:^7.0.3":
version: 7.0.3
resolution: "postcss-discard-comments@npm:7.0.3"
dependencies:
postcss-selector-parser: "npm:^6.1.1"
postcss-selector-parser: "npm:^6.1.2"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/c01632e643b6ec1f61ad59efe06a9e8dfc7fcedeb1551ae48fc33fa801353f6222e31954286cd97171c694f34c2b4c7f7a2213fd0f913e37c34d0353258ed234
checksum: 10c0/7700c8fb9a83c6ea5cc784267b9afd6e2968fda0358d583af5913baa28dfc91b0f2a4bd0b2bd62a86ebcb8dadb2547e287beae25b5a097e21c1f723367ccf112
languageName: node
linkType: hard
@ -13596,29 +13596,29 @@ __metadata:
languageName: node
linkType: hard
"postcss-merge-longhand@npm:^7.0.3":
version: 7.0.3
resolution: "postcss-merge-longhand@npm:7.0.3"
"postcss-merge-longhand@npm:^7.0.4":
version: 7.0.4
resolution: "postcss-merge-longhand@npm:7.0.4"
dependencies:
postcss-value-parser: "npm:^4.2.0"
stylehacks: "npm:^7.0.3"
stylehacks: "npm:^7.0.4"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/b968c3d16f3edc6075b20219a1165c089dc454a6a42951dcdfc94adb932fb96ef7bcd465c6cd21b0e5b55ac08921355ddbbbc7cdcf87a345e4bef8b3cdd2e7e9
checksum: 10c0/6f50f7775dd361f83daf1acb3e0001d700ed2b7b9bea02df172143adc7fa196ce9209c9e482010ce36fd704512433b62692c5ab2eef5226db71ea3e694654dc7
languageName: node
linkType: hard
"postcss-merge-rules@npm:^7.0.3":
version: 7.0.3
resolution: "postcss-merge-rules@npm:7.0.3"
"postcss-merge-rules@npm:^7.0.4":
version: 7.0.4
resolution: "postcss-merge-rules@npm:7.0.4"
dependencies:
browserslist: "npm:^4.23.3"
caniuse-api: "npm:^3.0.0"
cssnano-utils: "npm:^5.0.0"
postcss-selector-parser: "npm:^6.1.1"
postcss-selector-parser: "npm:^6.1.2"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/3cd20484ab6d15c62eded408248d5eeaba52a573935943f933865680e070a0e75b3a7447802c575bc86e1fae667cf51d9d5766537835d9b8c090337b5adf928e
checksum: 10c0/fffdcef4ada68e92ab8e6dc34a3b9aa2b87188cd4d08f5ba0ff2aff7e3e3c7f086830748ff64db091b5ccb9ac59ac37cfaab1268ed3efb50ab9c4f3714eb5f6d
languageName: node
linkType: hard
@ -13659,15 +13659,15 @@ __metadata:
languageName: node
linkType: hard
"postcss-minify-selectors@npm:^7.0.3":
version: 7.0.3
resolution: "postcss-minify-selectors@npm:7.0.3"
"postcss-minify-selectors@npm:^7.0.4":
version: 7.0.4
resolution: "postcss-minify-selectors@npm:7.0.4"
dependencies:
cssesc: "npm:^3.0.0"
postcss-selector-parser: "npm:^6.1.1"
postcss-selector-parser: "npm:^6.1.2"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/5211f63a1672f646a1bab57bd8eac0816d42adacb5e286ad5e6e342a795bb0d086bd6044a1b338311ca28f33f2c1833165ee611eaa671287379821ba3c5d68ad
checksum: 10c0/212b8f3d62eb2a27ed57d4e76b75b0886806ddb9e2497c0bb79308fa75dabaaaa4ed2b97734896e87603272d05231fd74aee2c256a48d77aa468b5b64cc7866a
languageName: node
linkType: hard
@ -14028,7 +14028,7 @@ __metadata:
languageName: node
linkType: hard
"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.0, postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2":
"postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.1.0, postcss-selector-parser@npm:^6.1.2":
version: 6.1.2
resolution: "postcss-selector-parser@npm:6.1.2"
dependencies:
@ -14050,14 +14050,14 @@ __metadata:
languageName: node
linkType: hard
"postcss-unique-selectors@npm:^7.0.2":
version: 7.0.2
resolution: "postcss-unique-selectors@npm:7.0.2"
"postcss-unique-selectors@npm:^7.0.3":
version: 7.0.3
resolution: "postcss-unique-selectors@npm:7.0.3"
dependencies:
postcss-selector-parser: "npm:^6.1.1"
postcss-selector-parser: "npm:^6.1.2"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/cc54c57cd1c5a6e3e166ec63cc036d9e2df80b05e508d9ce754ca4193bf8c1bfcc16b3c6f0d81b8352a3282201d249b90bb87abacfcfb9065c9e3705ea5d110e
checksum: 10c0/2eb90eb0745d1e29d411ea5108f1cd9737de5b8f739cabc717074872bc4015950c9963f870b23b33b9ef45e7887eecfe5560cffee56616d4e0b8d0fac4f7cb10
languageName: node
linkType: hard
@ -16575,15 +16575,15 @@ __metadata:
languageName: node
linkType: hard
"stylehacks@npm:^7.0.3":
version: 7.0.3
resolution: "stylehacks@npm:7.0.3"
"stylehacks@npm:^7.0.4":
version: 7.0.4
resolution: "stylehacks@npm:7.0.4"
dependencies:
browserslist: "npm:^4.23.3"
postcss-selector-parser: "npm:^6.1.1"
postcss-selector-parser: "npm:^6.1.2"
peerDependencies:
postcss: ^8.4.31
checksum: 10c0/5030334b06ef705b5700444dab120b540b09159e935e75b60f25bd56db1d85f0d11755f0b0f64ce3f12c5a72ff1b6f57fea49c26d18eb0de2334d6a143b94f8d
checksum: 10c0/b4d0b280ba274503ecc04111cc11c713e0d65db079fbcd8b42d6350be1cca20e28611eddee93b419aa208176a0d3a5fff83d83ef958d1876713809b6a2787c0c
languageName: node
linkType: hard