mirror of
https://git.kescher.at/CatCatNya/catstodon.git
synced 2024-11-21 19:28:06 +01:00
Merge commit '5acec087caed4a2fdf0fd8ed11f891222496f321' into glitch-soc/merge-upstream
This commit is contained in:
commit
1a0ef0c526
64 changed files with 660 additions and 665 deletions
1
.github/renovate.json5
vendored
1
.github/renovate.json5
vendored
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
|
|
13
Gemfile.lock
13
Gemfile.lock
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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": "المزيد",
|
||||
|
|
|
@ -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}",
|
||||
|
|
|
@ -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}",
|
||||
|
|
|
@ -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)…",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
%tr
|
||||
%tr{ id: dom_id(invite) }
|
||||
%td
|
||||
.input-copy
|
||||
.input-copy__wrapper
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')]) }
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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: محتوى حساس
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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: اعتبر الوسائط دائما كمحتوى حساس
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -57,36 +57,50 @@ class Mastodon::RedisConfiguration
|
|||
def setup_config(prefix: nil, defaults: {})
|
||||
prefix = "#{prefix}REDIS_"
|
||||
|
||||
url = ENV.fetch("#{prefix}URL", nil)
|
||||
user = ENV.fetch("#{prefix}USER", nil)
|
||||
password = ENV.fetch("#{prefix}PASSWORD", nil)
|
||||
host = ENV.fetch("#{prefix}HOST", defaults[:host])
|
||||
port = ENV.fetch("#{prefix}PORT", defaults[:port])
|
||||
db = ENV.fetch("#{prefix}DB", defaults[:db])
|
||||
name = ENV.fetch("#{prefix}SENTINEL_MASTER", nil)
|
||||
sentinels = parse_sentinels(ENV.fetch("#{prefix}SENTINELS", nil))
|
||||
url = ENV.fetch("#{prefix}URL", nil)
|
||||
user = ENV.fetch("#{prefix}USER", nil)
|
||||
password = ENV.fetch("#{prefix}PASSWORD", nil)
|
||||
host = ENV.fetch("#{prefix}HOST", defaults[:host])
|
||||
port = ENV.fetch("#{prefix}PORT", defaults[:port])
|
||||
db = ENV.fetch("#{prefix}DB", defaults[:db])
|
||||
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
|
@ -100,21 +100,64 @@ 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
|
||||
around do |example|
|
||||
ClimateControl.modify "#{prefix}REDIS_SENTINELS": '192.168.0.1,192.168.0.2', "#{prefix}REDIS_SENTINEL_MASTER": 'mainsentinel' do
|
||||
example.run
|
||||
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
|
||||
end
|
||||
end
|
||||
|
||||
it 'uses the default sentinel port' 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
|
||||
|
||||
it 'uses the default sentinel port' do
|
||||
expect(subject[:sentinels]).to contain_exactly({ host: '192.168.0.1', port: 26_379 }, { host: '192.168.0.2', port: 26_379 })
|
||||
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
|
||||
|
@ -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,
|
||||
|
|
|
@ -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') }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: [])
|
||||
|
|
|
@ -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: 'にゃん')
|
||||
|
|
|
@ -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: 'にゃん')
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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@')
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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: [])
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
31
spec/requests/invites_spec.rb
Normal file
31
spec/requests/invites_spec.rb
Normal 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
|
14
spec/support/matchers/private_cache_control.rb
Normal file
14
spec/support/matchers/private_cache_control.rb
Normal 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
|
86
spec/system/invites_spec.rb
Normal file
86
spec/system/invites_spec.rb
Normal 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
|
|
@ -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
110
yarn.lock
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue