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

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

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

View File

@ -7,6 +7,7 @@
':prConcurrentLimitNone', // Remove limit for open PRs at any time. ':prConcurrentLimitNone', // Remove limit for open PRs at any time.
':prHourlyLimit2', // Rate limit PR creation to a maximum of two per hour. ':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 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, // 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 // meaning the most important ones must be at the bottom, for example grouping rules

View File

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

View File

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

View File

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

View File

@ -170,7 +170,7 @@ export const Conversation = ({ conversation, scrollKey, onMoveUp, onMoveDown })
return ( return (
<HotKeys handlers={handlers}> <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'> <div className='conversation__avatar' onClick={handleClick} role='presentation'>
<AvatarComposite accounts={accounts} size={48} /> <AvatarComposite accounts={accounts} size={48} />
</div> </div>

View File

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

View File

@ -356,6 +356,7 @@
"hints.profiles.follows_may_be_missing": "Les abonnements pour ce profil peuvent être manquants.", "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.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_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.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.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}", "hints.threads.see_more": "Afficher plus de réponses sur {domain}",

View File

@ -356,6 +356,7 @@
"hints.profiles.follows_may_be_missing": "Les abonnements pour ce profil peuvent être manquants.", "hints.profiles.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.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_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.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.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}", "hints.threads.see_more": "Afficher plus de réponses sur {domain}",

View File

@ -43,7 +43,7 @@
"account.in_memoriam": "Em Memória.", "account.in_memoriam": "Em Memória.",
"account.joined_short": "Juntou-se a", "account.joined_short": "Juntou-se a",
"account.languages": "Alterar línguas subscritas", "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.locked_info": "Esta conta é privada. O proprietário revê manualmente quem o pode seguir.",
"account.media": "Média", "account.media": "Média",
"account.mention": "Mencionar @{name}", "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": "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.lock_disclaimer.lock": "fechada",
"compose_form.placeholder": "Em que está a pensar?", "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.multiple": "Escolha múltipla",
"compose_form.poll.option_placeholder": "Opção {number}", "compose_form.poll.option_placeholder": "Opção {number}",
"compose_form.poll.single": "Escolha uma", "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_multiple": "Alterar a sondagem 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_single": "Alterar a sondagem para permitir uma única resposta",
"compose_form.poll.type": "Estilo", "compose_form.poll.type": "Estilo",
"compose_form.publish": "Publicar", "compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar", "compose_form.publish_form": "Nova publicação",
"compose_form.reply": "Responder", "compose_form.reply": "Responder",
"compose_form.save_changes": "Atualizar", "compose_form.save_changes": "Atualizar",
"compose_form.spoiler.marked": "Texto escondido atrás de aviso", "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.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.redraft.title": "Eliminar e reescrever publicação?",
"confirmations.reply.confirm": "Responder", "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.reply.title": "Sobrescrever publicação?",
"confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?",
@ -206,14 +206,14 @@
"directory.federated": "Do fediverso conhecido", "directory.federated": "Do fediverso conhecido",
"directory.local": "Apenas de {domain}", "directory.local": "Apenas de {domain}",
"directory.new_arrivals": "Recém chegados", "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.account_settings": "Definições da conta",
"disabled_account_banner.text": "A sua conta {disabledAccount} está presentemente desativada.", "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.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.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_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_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.", "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": "Bloquear servidor",
"domain_block_modal.block_account_instead": "Bloquear @{name} em alternativa", "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.", "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.instructions": "Incorpore esta publicação no seu site copiando o código abaixo.",
"embed.preview": "Podes ver aqui como irá ficar:", "embed.preview": "Podes ver aqui como irá ficar:",
"emoji_button.activity": "Actividade", "emoji_button.activity": "Atividade",
"emoji_button.clear": "Limpar", "emoji_button.clear": "Limpar",
"emoji_button.custom": "Personalizar", "emoji_button.custom": "Personalizar",
"emoji_button.flags": "Bandeiras", "emoji_button.flags": "Bandeiras",
@ -246,7 +246,7 @@
"emoji_button.label": "Inserir Emoji", "emoji_button.label": "Inserir Emoji",
"emoji_button.nature": "Natureza", "emoji_button.nature": "Natureza",
"emoji_button.not_found": "Nenhum emoji correspondente encontrado", "emoji_button.not_found": "Nenhum emoji correspondente encontrado",
"emoji_button.objects": "Objectos", "emoji_button.objects": "Objetos",
"emoji_button.people": "Pessoas", "emoji_button.people": "Pessoas",
"emoji_button.recent": "Utilizados regularmente", "emoji_button.recent": "Utilizados regularmente",
"emoji_button.search": "Pesquisar...", "emoji_button.search": "Pesquisar...",
@ -258,24 +258,24 @@
"empty_column.account_timeline": "Sem publicações por aqui!", "empty_column.account_timeline": "Sem publicações por aqui!",
"empty_column.account_unavailable": "Perfil indisponível", "empty_column.account_unavailable": "Perfil indisponível",
"empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.", "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.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.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.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.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.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.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.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.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.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.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.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.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.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", "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.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": "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.", "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 #}}", "hashtags.and_other": "…e {count, plural, other {mais #}}",
"hints.profiles.followers_may_be_missing": "Podem faltar seguidores neste perfil.", "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.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_followers": "Ver mais seguidores no {domain}",
"hints.profiles.see_more_follows": "Veja mais perfis seguidos em {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_reblogs": "Mostrar impulsos",
"home.column_settings.show_replies": "Mostrar respostas", "home.column_settings.show_replies": "Mostrar respostas",
"home.hide_announcements": "Ocultar comunicações", "home.hide_announcements": "Ocultar comunicações",
@ -406,7 +406,7 @@
"keyboard_shortcuts.my_profile": "para abrir o teu perfil", "keyboard_shortcuts.my_profile": "para abrir o teu perfil",
"keyboard_shortcuts.notifications": "para abrir a coluna das notificações", "keyboard_shortcuts.notifications": "para abrir a coluna das notificações",
"keyboard_shortcuts.open_media": "para abrir media", "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.profile": "para abrir o perfil do autor",
"keyboard_shortcuts.reply": "para responder", "keyboard_shortcuts.reply": "para responder",
"keyboard_shortcuts.requests": "para abrir a lista dos pedidos de seguidor", "keyboard_shortcuts.requests": "para abrir a lista dos pedidos de seguidor",
@ -475,7 +475,7 @@
"navigation_bar.mutes": "Utilizadores silenciados", "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.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.personal": "Pessoal",
"navigation_bar.pins": "Toots afixados", "navigation_bar.pins": "Publicações fixadas",
"navigation_bar.preferences": "Preferências", "navigation_bar.preferences": "Preferências",
"navigation_bar.public_timeline": "Cronologia federada", "navigation_bar.public_timeline": "Cronologia federada",
"navigation_bar.search": "Pesquisar", "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_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_silence": "A sua conta foi limitada.",
"notification.moderation_warning.action_suspend": "A sua conta foi suspensa.", "notification.moderation_warning.action_suspend": "A sua conta foi suspensa.",
"notification.own_poll": "A sua votação terminou", "notification.own_poll": "A sua sondagem terminou",
"notification.poll": "Uma votação em que participaste chegou ao fim", "notification.poll": "Terminou uma sondagem em que votou",
"notification.reblog": "{name} reforçou a tua publicação", "notification.reblog": "{name} reforçou a tua publicação",
"notification.relationships_severance_event": "Perdeu as ligações com {name}", "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.", "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": "Novos seguidores:",
"notifications.column_settings.follow_request": "Novos pedidos de seguidor:", "notifications.column_settings.follow_request": "Novos pedidos de seguidor:",
"notifications.column_settings.mention": "Menções:", "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.push": "Notificações Push",
"notifications.column_settings.reblog": "Reforços:", "notifications.column_settings.reblog": "Reforços:",
"notifications.column_settings.show": "Mostrar na coluna", "notifications.column_settings.show": "Mostrar na coluna",
@ -550,7 +550,7 @@
"notifications.filter.favourites": "Favoritos", "notifications.filter.favourites": "Favoritos",
"notifications.filter.follows": "Seguidores", "notifications.filter.follows": "Seguidores",
"notifications.filter.mentions": "Menções", "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.filter.statuses": "Atualizações de pessoas que você segue",
"notifications.grant_permission": "Conceder permissão.", "notifications.grant_permission": "Conceder permissão.",
"notifications.group": "{count} notificações", "notifications.group": "{count} notificações",
@ -573,7 +573,7 @@
"notifications_permission_banner.title": "Nunca perca nada", "notifications_permission_banner.title": "Nunca perca nada",
"onboarding.action.back": "Voltar atrás", "onboarding.action.back": "Voltar atrás",
"onboarding.actions.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.actions.go_to_home": "Ir para a sua página inicial",
"onboarding.compose.template": "Olá #Mastodon!", "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.", "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.start.title": "Conseguiu!",
"onboarding.steps.follow_people.body": "Seguir pessoas interessantes é o propósito do Mastodon. ", "onboarding.steps.follow_people.body": "Seguir pessoas interessantes é o propósito do Mastodon. ",
"onboarding.steps.follow_people.title": "Personalize o seu feed", "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.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.body": "Promova as suas interações para ter um perfil preenchido. ",
"onboarding.steps.setup_profile.title": "Personalize o seu perfil", "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.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.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.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.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", "password_confirmation.mismatching": "A confirmação da palavra-passe não corresponde",
"picture_in_picture.restore": "Colocá-lo de volta", "picture_in_picture.restore": "Colocá-lo de volta",
"poll.closed": "Fechado", "poll.closed": "Fechado",
"poll.refresh": "Recarregar", "poll.refresh": "Atualizar",
"poll.reveal": "Ver resultados", "poll.reveal": "Ver resultados",
"poll.total_people": "{count, plural, one {# pessoa} other {# pessoas}}", "poll.total_people": "{count, plural, one {# pessoa} other {# pessoas}}",
"poll.total_votes": "{count, plural, one {# voto} other {# votos}}", "poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
"poll.vote": "Votar", "poll.vote": "Votar",
"poll.voted": "Votaste nesta resposta", "poll.voted": "Votou nesta resposta",
"poll.votes": "{votes, plural, one {# voto } other {# votos}}", "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", "poll_button.remove_poll": "Remover sondagem",
"privacy.change": "Ajustar a privacidade da publicação", "privacy.change": "Ajustar a privacidade da publicação",
"privacy.direct.long": "Todos os mencionados na 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.last_updated": "Última atualização em {date}",
"privacy_policy.title": "Política de privacidade", "privacy_policy.title": "Política de privacidade",
"recommended": "Recomendado", "recommended": "Recomendado",
"refresh": "Actualizar", "refresh": "Atualizar",
"regeneration_indicator.label": "A carregar…", "regeneration_indicator.label": "A carregar…",
"regeneration_indicator.sublabel": "A tua página inicial está a ser preparada!", "regeneration_indicator.sublabel": "A tua página inicial está a ser preparada!",
"relative_time.days": "{number}d", "relative_time.days": "{number}d",
@ -677,7 +677,7 @@
"report.reasons.other": "É outra coisa", "report.reasons.other": "É outra coisa",
"report.reasons.other_description": "O problema não se encaixa nas outras categorias", "report.reasons.other_description": "O problema não se encaixa nas outras categorias",
"report.reasons.spam": "É spam", "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": "Viola as regras do servidor",
"report.reasons.violation_description": "Está ciente de que infringe regras específicas", "report.reasons.violation_description": "Está ciente de que infringe regras específicas",
"report.rules.subtitle": "Selecione tudo o que se aplicar", "report.rules.subtitle": "Selecione tudo o que se aplicar",
@ -733,8 +733,8 @@
"sign_in_banner.create_account": "Criar conta", "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.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.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.sign_in": "Iniciar sessão",
"sign_in_banner.sso_redirect": "Inicie Sessão ou Registe-se", "sign_in_banner.sso_redirect": "Inicie sessão ou registe-se",
"status.admin_account": "Abrir a interface de moderação para @{name}", "status.admin_account": "Abrir a interface de moderação para @{name}",
"status.admin_domain": "Abrir interface de moderação para {domain}", "status.admin_domain": "Abrir interface de moderação para {domain}",
"status.admin_status": "Abrir esta publicação na interface de moderação", "status.admin_status": "Abrir esta publicação na interface de moderação",
@ -742,7 +742,7 @@
"status.bookmark": "Guardar nos marcadores", "status.bookmark": "Guardar nos marcadores",
"status.cancel_reblog_private": "Deixar de reforçar", "status.cancel_reblog_private": "Deixar de reforçar",
"status.cannot_reblog": "Não é possível partilhar esta publicação", "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.delete": "Eliminar",
"status.detailed_status": "Vista pormenorizada da conversa", "status.detailed_status": "Vista pormenorizada da conversa",
"status.direct": "Mencionar @{name} em privado", "status.direct": "Mencionar @{name} em privado",
@ -801,15 +801,15 @@
"time_remaining.moments": "Momentos restantes", "time_remaining.moments": "Momentos restantes",
"time_remaining.seconds": "{número, plural, um {# second} outro {# seconds}} faltam", "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.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.", "ui.beforeunload": "O teu rascunho será perdido se abandonares o Mastodon.",
"units.short.billion": "{count}MM", "units.short.billion": "{count}MM",
"units.short.million": "{count}M", "units.short.million": "{count}M",
"units.short.thousand": "{count}m", "units.short.thousand": "{count}m",
"upload_area.title": "Arraste e solte para enviar", "upload_area.title": "Arrastar e largar para enviar",
"upload_button.label": "Juntar imagens, um vídeo, ou um ficheiro de som", "upload_button.label": "Adicionar imagens, um vídeo ou um ficheiro de som",
"upload_error.limit": "Limite máximo do ficheiro a carregar excedido.", "upload_error.limit": "Limite de envio de ficheiros excedido.",
"upload_error.poll": "O carregamento de ficheiros não é permitido em sondagens.", "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.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.description": "Descreva para pessoas com diminuição da acuidade visual",
"upload_form.edit": "Editar", "upload_form.edit": "Editar",
@ -820,7 +820,7 @@
"upload_modal.applying": "A aplicar…", "upload_modal.applying": "A aplicar…",
"upload_modal.choose_image": "Escolher imagem", "upload_modal.choose_image": "Escolher imagem",
"upload_modal.description_placeholder": "Grave e cabisbaixo, o filho justo zelava pela querida mãe doente", "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.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.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)…", "upload_modal.preparing_ocr": "A preparar o reconhecimento de caracteres (OCR)…",

View File

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

View File

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

View File

@ -17,6 +17,6 @@ class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source
private private
def commonly_interacted_with_accounts 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
end end

View File

@ -17,6 +17,6 @@ class AnnualReport::MostRebloggedAccounts < AnnualReport::Source
private private
def most_reblogged_accounts 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
end end

View File

@ -17,6 +17,6 @@ class AnnualReport::MostUsedApps < AnnualReport::Source
private private
def most_used_apps 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
end end

View File

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

View File

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

View File

@ -17,7 +17,7 @@ class AnnualReport::TimeSeries < AnnualReport::Source
private private
def statuses_per_month 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 end
def following_per_month def following_per_month

View File

@ -17,6 +17,6 @@ class AnnualReport::TopHashtags < AnnualReport::Source
private private
def top_hashtags 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
end end

View File

@ -16,6 +16,6 @@ class AnnualReport::TopStatuses < AnnualReport::Source
end end
def base_scope 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
end end

View File

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

View File

@ -12,7 +12,7 @@ class ApplicationMailer < ActionMailer::Base
protected protected
def locale_for_account(account, &block) 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 end
def set_autoreply_headers! def set_autoreply_headers!

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,117 +2,117 @@
pt-PT: pt-PT:
devise: devise:
confirmations: confirmations:
confirmed: O seu endereço correio electrónico foi correctamente confirmado. confirmed: O seu endereço de e-mail foi corretamente 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_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 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. 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: failure:
already_authenticated: A tua sessão já está aberta. already_authenticated: Já tem sessão iniciada.
inactive: A tua conta ainda não está ativada. inactive: A sua conta ainda não está ativada.
invalid: "%{authentication_keys} ou palavra-passe inválida." invalid: "%{authentication_keys} ou palavra-passe inválida."
last_attempt: Tem só mais uma tentativa antes da sua conta ser bloqueada. 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." not_found_in_database: "%{authentication_keys} ou palavra-passe inválida."
omniauth_user_creation_failure: Erro ao criar uma conta para esta identidade. omniauth_user_creation_failure: Erro ao criar uma conta para esta identidade.
pending: A sua conta está ainda a aguardar revisão. pending: A sua conta está ainda a aguardar revisão.
timeout: A tua sessão expirou. Por favor, entra de novo para continuares. timeout: A sua sessão expirou. Inicie sessão novamente para continuar.
unauthenticated: Precisas de entrar na tua conta ou de te registares antes de continuar. unauthenticated: É necessário iniciar sessão ou registar-se antes de continuar.
unconfirmed: Tens de confirmar o teu endereço de e-mail antes de continuar. unconfirmed: Tem de confirmar o seu endereço de e-mail antes de continuar.
mailer: mailer:
confirmation_instructions: confirmation_instructions:
action: Verificar o endereço de e-mail action: Verificar o endereço de e-mail
action_with_app: Confirmar e regressar a %{app} 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. 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>. 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 %{instance}' subject: 'Mastodon: instruções de confirmação para %{instance}'
title: Verificar o endereço de e-mail title: Verificar o endereço de e-mail
email_changed: email_changed:
explanation: 'O e-mail associado à sua conta será alterado para:' 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. 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' subject: 'Mastodon: e-mail alterado'
title: Novo endereço de e-mail title: Novo endereço de e-mail
password_change: password_change:
explanation: A palavra-passe da tua conta foi alterada. 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 da instância se tiver ficado sem acesso à sua conta. 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' subject: 'Mastodon: palavra-passe alterada'
title: Palavra-passe alterada title: Palavra-passe alterada
reconfirmation_instructions: reconfirmation_instructions:
explanation: Confirme o seu novo endereço para alterar o e-mail. 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. 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 %{instance}' subject: 'Mastodon: confirmação de e-mail para %{instance}'
title: Validar o endereço de e-mail title: Validar o endereço de e-mail
reset_password_instructions: reset_password_instructions:
action: Alterar palavra-passe action: Alterar palavra-passe
explanation: Pediste a alteração da palavra-passe da tua conta. explanation: Solicitou uma nova palavra-passe para a sua 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. 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' subject: 'Mastodon: instruções para redefinir a palavra-passe'
title: Solicitar nova palavra-passe title: Solicitar nova palavra-passe
two_factor_disabled: two_factor_disabled:
explanation: O acesso agora é possível usando apenas o endereço de correio eletrónico e palavra-passe. 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' subject: 'Mastodon: autenticação de duas etapas desativada'
subtitle: A autenticação de dois fatores foi desativada para a sua conta. subtitle: A autenticação de dois fatores foi desativada para a sua conta.
title: 2FA desativado title: 2FA desativado
two_factor_enabled: two_factor_enabled:
explanation: Um token gerado pelo aplicativo TOTP emparelhado será necessário para login. explanation: Para iniciar sessão, será necessário um token gerado pela aplicação TOTP emparelhada.
subject: 'Mastodon: Autenticação em duas etapas ativada' subject: 'Mastodon: autenticação em duas etapas ativada'
subtitle: A autenticação de dois fatores foi habilitada para sua conta. subtitle: A autenticação de dois fatores foi ativada para a sua conta.
title: 2FA ativado title: 2FA ativado
two_factor_recovery_codes_changed: two_factor_recovery_codes_changed:
explanation: 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' 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. subtitle: Os códigos de recuperação anteriores foram invalidados e foram gerados novos códigos.
title: Códigos de recuperação 2FA alterados title: Códigos de recuperação 2FA alterados
unlock_instructions: unlock_instructions:
subject: 'Mastodon: Instruções para desbloquear a tua conta' subject: 'Mastodon: instruções para desbloquear'
webauthn_credential: webauthn_credential:
added: added:
explanation: A seguinte chave de segurança foi adicionada à sua conta 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 title: Foi adicionada uma nova chave de segurança
deleted: deleted:
explanation: A seguinte chave de segurança foi eliminada da sua conta 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 title: Uma das suas chaves de segurança foi eliminada
webauthn_disabled: webauthn_disabled:
explanation: A autenticação com chaves de segurança foi desativada para sua conta. 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. 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' subject: 'Mastodon: autenticação com chave de segurança desativada'
title: Chaves de segurança desativadas title: Chaves de segurança desativadas
webauthn_enabled: webauthn_enabled:
explanation: A autenticação da chave de segurança foi habilitada para sua conta. explanation: A autenticação por chave de segurança foi ativada para a sua conta.
extra: Sua chave de segurança agora pode ser usada para login. 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' subject: 'Mastodon: autenticação com chave de segurança ativada'
title: Chaves de segurança ativadas title: Chaves de segurança ativadas
omniauth_callbacks: omniauth_callbacks:
failure: Não foi possível autenticar %{kind} porque "%{reason}". failure: Não foi possível autenticar %{kind} porque "%{reason}".
success: Autenticado correctamente na conta %{kind}. success: Autenticado correctamente na conta %{kind}.
passwords: 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. 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: Vai receber um e-mail com instruções para alterar a palavra-passe dentro de alguns minutos. 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, dentro de alguns minutos irá receber uma ligação para recuperar a palavra-passe. 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 tua palavra-passe foi alterada. Estás agora autenticado na tua conta. updated: A sua palavra-passe foi alterada com sucesso. Está agora autenticado.
updated_not_active: A tua palavra-passe foi alterada. updated_not_active: A tua palavra-passe foi alterada.
registrations: registrations:
destroyed: Adeus! A tua conta foi cancelada. Esperamos ver-te em breve. destroyed: Adeus! A sua conta foi cancelada com sucesso. Esperamos voltar a vê-lo em breve.
signed_up: Seja bem-vindo! A sua conta foi correctamente registada. signed_up: Bem-vindo! A sua conta foi registada com sucesso.
signed_up_but_inactive: A tua conta foi registada. No entanto ainda não está activa. 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: A sua conta foi correctamente registada. Contudo, não pudemos iniciar sessão porque a sua conta está bloqueada. 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 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_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 uma hiperligação de confirmação para o seu correio electrónico. Queira usar essa hiperligação para activar a sua conta. 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: 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. 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 correctamente actualizada. updated: A sua conta foi corretamente atualizada.
sessions: sessions:
already_signed_out: Sessão encerrada. already_signed_out: Sessão encerrada.
signed_in: Sessão iniciada. signed_in: Sessão iniciada.
signed_out: Sessão encerrada. signed_out: Sessão encerrada.
unlocks: 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_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, 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. 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 correctamente desbloqueada. Queira iniciar uma nova sessão para continuar. unlocked: A sua conta foi desbloqueada com sucesso. Inicie sessão para continuar.
errors: errors:
messages: messages:
already_confirmed: já confirmado, por favor tente iniciar sessão 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 expired: expirou, por favor tente outra vez
not_found: não encontrado not_found: não encontrado
not_locked: não estava bloqueada not_locked: não estava bloqueada

View File

@ -4,9 +4,9 @@ pt-PT:
attributes: attributes:
doorkeeper/application: doorkeeper/application:
name: Nome da aplicação name: Nome da aplicação
redirect_uri: URI de redireccionamento redirect_uri: URI de redirecionamento
scopes: Âmbitos scopes: Âmbitos
website: Página na teia da aplicação website: Site da aplicação
errors: errors:
models: models:
doorkeeper/application: doorkeeper/application:
@ -31,11 +31,11 @@ pt-PT:
form: form:
error: Ups! Verifique que o formulário não tem erros error: Ups! Verifique que o formulário não tem erros
help: help:
native_redirect_uri: Usa %{native_redirect_uri} para testes locais native_redirect_uri: Usar %{native_redirect_uri} para testes locais
redirect_uri: Utiliza uma linha por URI redirect_uri: Usar uma linha por URI
scopes: Separe as esferas de acção com espaços. Deixe em branco para usar autorizações predefinidas. scopes: Separe os âmbitos de aplicação com espaços. Deixe em branco para utilizar os âmbitos de aplicação predefinidos.
index: index:
application: Aplicações application: Aplicação
callback_url: URL de retorno callback_url: URL de retorno
delete: Eliminar delete: Eliminar
empty: Não tem aplicações. empty: Não tem aplicações.
@ -48,31 +48,31 @@ pt-PT:
title: Nova aplicação title: Nova aplicação
show: show:
actions: Ações actions: Ações
application_id: Id de Aplicação application_id: Chave da aplicação
callback_urls: Callback urls callback_urls: URLs de retorno
scopes: Autorizações scopes: Âmbitos
secret: Segredo secret: Segredo
title: 'Aplicação: %{name}' title: 'Aplicação: %{name}'
authorizations: authorizations:
buttons: buttons:
authorize: Autorize authorize: Autorizar
deny: Não autorize deny: Negar
error: error:
title: Ocorreu um erro title: Ocorreu um erro
new: 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>" 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 review_permissions: Rever permissões
title: Autorização é necessária title: Autorização necessária
show: 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: authorized_applications:
buttons: buttons:
revoke: Revogar revoke: Revogar
confirmations: confirmations:
revoke: Tens a certeza? revoke: Tem a certeza?
index: index:
authorized_at: Autorizado em %{date} 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} last_used_at: Última utilização em %{date}
never_used: Nunca utilizado never_used: Nunca utilizado
scopes: Permissões scopes: Permissões
@ -81,15 +81,15 @@ pt-PT:
errors: errors:
messages: messages:
access_denied: O proprietário do recurso ou servidor de autorização negou o pedido. 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. 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: 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. 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_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_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_redirect_uri: A URI de redirecionamento incluída não é válida.
invalid_request: invalid_request:
missing_param: 'Parâmetro requerido em falta: %{value}.' 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. 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: 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. 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_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_scope: O âmbito solicitado é inválido, desconhecido ou tem um formato incorreto.
invalid_token: invalid_token:
@ -98,7 +98,7 @@ pt-PT:
unknown: O token de acesso é inválido 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. 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 . 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. 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_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. 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 admin/reports: Administração de denúncias
all: Acesso total à sua conta Mastodon all: Acesso total à sua conta Mastodon
blocks: Bloqueios blocks: Bloqueios
bookmarks: Itens Salvos bookmarks: Marcadores
conversations: Conversas conversations: Conversas
crypto: Encriptação ponta-a-ponta crypto: Encriptação ponta a ponta
favourites: Favoritos favourites: Favoritos
filters: Filtros filters: Filtros
follow: A seguir, a silenciar, e a bloquear follow: A seguir, a silenciar e a bloquear
follows: Seguidores follows: Seguidores
lists: Listas lists: Listas
media: Anexos de media media: Anexos de media
@ -139,7 +139,7 @@ pt-PT:
profile: O seu perfil Mastodon profile: O seu perfil Mastodon
push: Notificações push push: Notificações push
reports: Denúncias reports: Denúncias
search: Pesquisa search: Pesquisar
statuses: Publicações statuses: Publicações
layouts: layouts:
admin: 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: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:ip_blocks: executar ações de moderação no bloqueio de IPs
admin:write:reports: executar ações de moderação em denúncias admin:write:reports: executar ações de moderação em denúncias
crypto: usa encriptação ponta-a-ponta crypto: usar encriptação ponta a ponta
follow: siga, bloqueie, desbloqueie, e deixa de seguir contas follow: alterar relações de conta
profile: apenas ler as informações do perfil da sua conta profile: ler apenas as informações do perfil da sua conta
push: receber as suas notificações push 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:accounts: ver as informações da conta
read:blocks: ver os seus bloqueios 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:favourites: ver os seus favoritos
read:filters: ver os seus filtros read:filters: ver os seus filtros
read:follows: ver quem você segue read:follows: ver quem você segue
@ -181,18 +181,18 @@ pt-PT:
read:notifications: ver as suas notificações read:notifications: ver as suas notificações
read:reports: ver as suas denúncias read:reports: ver as suas denúncias
read:search: pesquisar em seu nome read:search: pesquisar em seu nome
read:statuses: ver todos os estados read:statuses: ver todas as publicações
write: publique por ti write: alterar todos os dados da sua conta
write:accounts: modificar o seu perfil write:accounts: alterar o seu perfil
write:blocks: bloquear contas e domínios write:blocks: bloquear contas e domínios
write:bookmarks: estado dos favoritos write:bookmarks: marcar publicações
write:conversations: silenciar e eliminar conversas write:conversations: silenciar e eliminar conversas
write:favourites: assinalar como favoritas write:favourites: favoritar publicações
write:filters: criar filtros write:filters: criar filtros
write:follows: seguir pessoas write:follows: seguir pessoas
write:lists: criar listas write:lists: criar listas
write:media: carregar arquivos de media write:media: enviar ficheiros de media
write:mutes: silenciar pessoas e conversas write:mutes: silenciar pessoas e conversas
write:notifications: limpar as suas notificações write:notifications: limpar as suas notificações
write:reports: denunciar outras pessoas write:reports: denunciar outras pessoas
write:statuses: publicar estado write:statuses: publicar publicações

View File

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

View File

@ -12,8 +12,8 @@ pt-PT:
one: Seguidor one: Seguidor
other: Seguidores other: Seguidores
following: A seguir 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. 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 vez activo last_active: última atividade
link_verified_on: A posse desta hiperligação foi verificada em %{date} link_verified_on: A posse desta hiperligação foi verificada em %{date}
nothing_here: Não há nada aqui! nothing_here: Não há nada aqui!
pin_errors: pin_errors:
@ -25,19 +25,19 @@ pt-PT:
admin: admin:
account_actions: account_actions:
action: Executar acção 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: account_moderation_notes:
create: Deixar uma nota 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! destroyed_msg: Nota de moderação destruída!
accounts: accounts:
approve: Aprovar 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? are_you_sure: Tens a certeza?
avatar: Imagem de perfil avatar: Imagem de perfil
by_domain: Domínio by_domain: Domínio
change_email: change_email:
changed_msg: Endereço de correio electrónico alterado! changed_msg: E-mail alterado com sucesso!
current_email: E-mail atual current_email: E-mail atual
label: Alterar e-mail label: Alterar e-mail
new_email: Novo e-mail new_email: Novo e-mail
@ -57,12 +57,12 @@ pt-PT:
demote: Despromoveu demote: Despromoveu
destroyed_msg: Os dados de %{username} estão agora em fila de espera para serem eliminados de imediato destroyed_msg: Os dados de %{username} estão agora em fila de espera para serem eliminados de imediato
disable: Congelar 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 disabled: Congelada
display_name: Nome a mostrar display_name: Nome a mostrar
domain: Domínio domain: Domínio
edit: Editar edit: Editar
email: Correio electrónico email: E-mail
email_status: Estado do e-mail email_status: Estado do e-mail
enable: Descongelar enable: Descongelar
enabled: Ativado enabled: Ativado
@ -86,7 +86,7 @@ pt-PT:
memorialized: Em memória memorialized: Em memória
memorialized_msg: Conta %{username} transformada com sucesso em memorial memorialized_msg: Conta %{username} transformada com sucesso em memorial
moderation: moderation:
active: Activo active: Ativo
all: Todos all: Todos
disabled: Desativado disabled: Desativado
pending: Pendente pending: Pendente
@ -94,7 +94,7 @@ pt-PT:
suspended: Supensos suspended: Supensos
title: Moderação title: Moderação
moderation_notes: Notas de 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 most_recent_ip: IP mais recente
no_account_selected: Nenhuma conta foi alterada porque nenhuma foi selecionada no_account_selected: Nenhuma conta foi alterada porque nenhuma foi selecionada
no_limits_imposed: Sem limites impostos no_limits_imposed: Sem limites impostos
@ -111,9 +111,9 @@ pt-PT:
public: Público public: Público
push_subscription_expires: A Inscrição PuSH expira push_subscription_expires: A Inscrição PuSH expira
redownload: Atualizar perfil 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 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_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. 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 remove_avatar: Remover a imagem de perfil
@ -152,7 +152,7 @@ pt-PT:
title: Contas title: Contas
unblock_email: Desbloquear endereço de e-mail unblock_email: Desbloquear endereço de e-mail
unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado 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_sensitized: Desmarcar como problemático
undo_silenced: Desfazer silenciar undo_silenced: Desfazer silenciar
undo_suspension: Desfazer supensão undo_suspension: Desfazer supensão
@ -226,7 +226,7 @@ pt-PT:
create_account_warning_html: "%{name} enviou um aviso para %{target}" create_account_warning_html: "%{name} enviou um aviso para %{target}"
create_announcement_html: "%{name} criou o novo anúncio %{target}" create_announcement_html: "%{name} criou o novo anúncio %{target}"
create_custom_emoji_html: "%{name} carregou o novo emoji %{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_domain_block_html: "%{name} bloqueou o domínio %{target}"
create_ip_block_html: "%{name} criou regra para o IP %{target}" create_ip_block_html: "%{name} criou regra para o IP %{target}"
create_unavailable_domain_html: "%{name} parou a entrega ao domínio %{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_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_custom_emoji_html: "%{name} desabilitou o emoji %{target}"
disable_user_html: "%{name} desativou o acesso para o utilizador %{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}" enable_user_html: "%{name} ativou o acesso para o utilizador %{target}"
memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial" memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial"
promote_user_html: "%{name} promoveu o utilizador %{target}" promote_user_html: "%{name} promoveu o utilizador %{target}"
@ -276,22 +276,22 @@ pt-PT:
title: Registo de auditoria title: Registo de auditoria
unavailable_instance: "(nome de domínio indisponível)" unavailable_instance: "(nome de domínio indisponível)"
announcements: announcements:
destroyed_msg: Comunicado correctamente eliminado! destroyed_msg: Comunicado eliminado com sucesso!
edit: edit:
title: Editar comunicado title: Editar comunicado
empty: Nenhum comunicado encontrado. empty: Nenhum comunicado encontrado.
live: Em directo live: Em direto
new: new:
create: Criar comunicado create: Criar comunicado
title: Novo comunicado title: Novo comunicado
publish: Publicar publish: Publicar
published_msg: Comunicado correctamente publicado! published_msg: Comunicado publicado com sucesso!
scheduled_for: Agendado para %{time} scheduled_for: Agendado para %{time}
scheduled_msg: Comunicado agendado para publicação! scheduled_msg: Comunicado agendado para publicação!
title: Comunicados title: Comunicados
unpublish: Anular publicação unpublish: Anular publicação
unpublished_msg: Comunicado correctamente retirado de publicação! unpublished_msg: Comunicado corretamente retirado de publicação!
updated_msg: Comunicado correctamente actualizado! updated_msg: Comunicado atualizado com sucesso!
critical_update_pending: Atualização crítica pendente critical_update_pending: Atualização crítica pendente
custom_emojis: custom_emojis:
assign_category: Atribuir categoria assign_category: Atribuir categoria
@ -319,16 +319,16 @@ pt-PT:
not_permitted: Não está autorizado a executar esta ação not_permitted: Não está autorizado a executar esta ação
overwrite: Escrever por cima overwrite: Escrever por cima
shortcode: Código de atalho 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 title: Emojis personalizados
uncategorized: Não categorizados uncategorized: Não categorizados
unlist: Não listar unlist: Não listar
unlisted: Não inventariado unlisted: Não inventariado
update_failed_msg: Não foi possível atualizar esse emoji update_failed_msg: Não foi possível atualizar esse emoji
updated_msg: Emoji correctamente actualizado! updated_msg: Emoji atualizado com sucesso!
upload: Enviar upload: Enviar
dashboard: dashboard:
active_users: utilizadores activos active_users: utilizadores ativos
interactions: interações interactions: interações
media_storage: Armazenamento de media media_storage: Armazenamento de media
new_users: novos utilizadores new_users: novos utilizadores
@ -350,8 +350,8 @@ pt-PT:
sources: Origem de inscrições sources: Origem de inscrições
space: Utilização do espaço space: Utilização do espaço
title: Painel de controlo title: Painel de controlo
top_languages: Principais idiomas activos top_languages: Principais idiomas ativos
top_servers: Servidores mais activos top_servers: Servidores mais ativos
website: Página na teia website: Página na teia
disputes: disputes:
appeals: appeals:
@ -359,7 +359,7 @@ pt-PT:
title: Recursos title: Recursos
domain_allows: domain_allows:
add_new: Permitir federação com o domínio 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 destroyed_msg: Revogada a permissão de federação para o domínio
export: Exportar export: Exportar
import: Importar import: Importar
@ -385,14 +385,14 @@ pt-PT:
import: Importar import: Importar
new: new:
create: Criar bloqueio 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: 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." 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 noop: Nenhum
silence: Limitar silence: Limitar
suspend: Suspender suspend: Suspender
title: Novo bloqueio de domínio 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 not_permitted: Não está autorizado a executar esta ação
obfuscate: Ofuscar nome de domínio 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 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 title: Convites
ip_blocks: ip_blocks:
add_new: Criar regra add_new: Criar regra
created_msg: Nova regra de IP correctamente adicionada created_msg: Nova regra de IP corretamente adicionada
delete: Eliminar delete: Eliminar
expires_in: expires_in:
'1209600': 2 semanas '1209600': 2 semanas
@ -547,15 +547,15 @@ pt-PT:
delete: Eliminar 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. 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 disable: Desativar
disabled: Desactivado disabled: Desativado
enable: Activar 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á. 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 enabled: Ativado
inbox_url: URL do repetidor inbox_url: URL do repetidor
pending: À espera da aprovação do repetidor pending: À espera da aprovação do repetidor
save_and_enable: Guardar e ativar save_and_enable: Guardar e ativar
setup: Configurar uma ligação ao repetidor 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 status: Estado
title: Retransmissores title: Retransmissores
report_notes: report_notes:
@ -618,27 +618,27 @@ pt-PT:
reported_by: Denunciado por reported_by: Denunciado por
reported_with_application: Reportado com a aplicação reported_with_application: Reportado com a aplicação
resolved: Resolvido resolved: Resolvido
resolved_msg: Denúncia correctamente resolvida! resolved_msg: Denúncia resolvida com sucesso!
skip_to_actions: Passar para as ações skip_to_actions: Passar para as ações
status: Estado status: Estado
statuses: Conteúdo denunciado statuses: Conteúdo denunciado
statuses_description_html: O conteúdo ofensivo será citado na comunicação com a conta denunciada statuses_description_html: O conteúdo ofensivo será citado na comunicação com a conta denunciada
summary: summary:
action_preambles: action_preambles:
delete_html: 'Você está prestes a <strong>remover</strong> algumas das publicações de <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: 'Você está prestes a <strong>marcar</strong> alguns dos posts de <strong>@%{acct}</strong>como <strong>sensível</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: 'Você está prestes a <strong>limitar a conta do</strong> <strong>@%{acct}</strong>. Isto irá:' silence_html: 'Está prestes a <strong>limitar a conta de</strong> <strong>@%{acct}</strong>. Isto irá:'
suspend_html: 'Você está prestes a <strong>suspender 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: actions:
delete_html: Excluir as publicações ofensivas delete_html: Excluir as publicações ofensivas
mark_as_sensitive_html: Marcar a mídia dos posts ofensivos como sensível 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 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_report: 'Marcar relatório #%{id} como resolvido'
close_reports_html: Marcar <strong>todos os</strong> relatórios contra <strong>@%{acct}</strong> como resolvidos close_reports_html: Marcar <strong>todas as</strong> denúncias contra <strong>@%{acct}</strong> como resolvidas
delete_data_html: Excluir <strong>@%{acct}</strong>perfil e conteúdo 30 dias a menos que sejam dessuspensos 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:" 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. warning_placeholder: Argumentos adicionais opcionais para a acção de moderação.
target_origin: Origem da conta denunciada target_origin: Origem da conta denunciada
title: Denúncias title: Denúncias
@ -693,7 +693,7 @@ pt-PT:
manage_settings: Gerir Configurações manage_settings: Gerir Configurações
manage_settings_description: Permite aos utilizadores alterar as configurações do sítio na teia manage_settings_description: Permite aos utilizadores alterar as configurações do sítio na teia
manage_taxonomies: Gerir Taxonomias 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_user_access: Gerir Acesso de Utilizador
manage_users: Gerir Utilizadores 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 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_discovered_servers: Publicar servidores descobertos
publish_statistics: Publicar estatísticas publish_statistics: Publicar estatísticas
title: Descobrir title: Descobrir
trends: Em alta trends: Tendências
domain_blocks: domain_blocks:
all: Para toda a gente all: Para toda a gente
disabled: Para ninguém disabled: Para ninguém
users: Para utilizadores locais que se encontrem autenticados users: Para utilizadores locais que se encontrem autenticados
registrations: 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. preamble: Controle quem pode criar uma conta no seu servidor.
title: Inscrições title: Inscrições
registrations_mode: registrations_mode:
@ -757,7 +757,7 @@ pt-PT:
approved: Registo sujeito a aprovação approved: Registo sujeito a aprovação
none: Ninguém se pode registar none: Ninguém se pode registar
open: Qualquer pessoa 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: security:
authorized_fetch: Exigir autenticação de servidores federados 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. 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 title: Definições do servidor
site_uploads: site_uploads:
delete: Eliminar arquivo carregado delete: Eliminar arquivo carregado
destroyed_msg: Envio de sítio na teia correctamente eliminado! destroyed_msg: Envio do site eliminado com sucesso!
software_updates: software_updates:
critical_update: Crítico — por favor, atualize rapidamente critical_update: Crítico — por favor, atualize rapidamente
documentation_link: Saber mais documentation_link: Saber mais
@ -800,7 +800,7 @@ pt-PT:
reblogs: Re-publicacões reblogs: Re-publicacões
status_changed: Publicação alterada status_changed: Publicação alterada
title: Estado das contas title: Estado das contas
trending: Em alta trending: Em tendência
visibility: Visibilidade visibility: Visibilidade
with_media: Com media with_media: Com media
strikes: strikes:
@ -823,7 +823,7 @@ pt-PT:
elasticsearch_health_yellow: elasticsearch_health_yellow:
message_html: O cluster elasticsearch não está de boa saúde (estado amarelo), pode querer investigar o motivo message_html: O cluster elasticsearch não está de boa saúde (estado amarelo), pode querer investigar o motivo
elasticsearch_index_mismatch: 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: elasticsearch_preset:
action: Ver a documentação 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. 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 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>. 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: 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: 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: elasticsearch_version_check:
message_html: 'Versão de Elasticsearch incompatível: %{value}' 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} 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 review: Estado da revisão
search: Pesquisar search: Pesquisar
title: Hashtags title: Hashtags
updated_msg: 'Definições de #etiquetas correctamente actualizadas' updated_msg: 'Definições de #etiquetas atualizadas com sucesso'
title: Administração title: Administração
trends: trends:
allow: Permitir allow: Permitir
approved: Aprovado approved: Aprovado
disallow: Não permitir disallow: Não permitir
links: links:
allow: Permitir ligação allow: Permitir hiperligação
allow_provider: Permitir editor 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. 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 disallow: Não permitir ligação
@ -890,15 +890,15 @@ pt-PT:
shared_by_over_week: shared_by_over_week:
one: Partilhado por uma pessoa na última semana one: Partilhado por uma pessoa na última semana
other: Partilhado por %{count} pessoas 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 usage_comparison: Partilhado %{today} vezes hoje, em comparação com %{yesterday} ontem
not_allowed_to_trend: Não permitido para tendência not_allowed_to_trend: Não permitido para tendência
only_allowed: Apenas permitidos only_allowed: Apenas permitidos
pending_review: Pendente de revisão pending_review: Pendente de revisão
preview_card_providers: 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. 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 title: Editores
rejected: Rejeitado rejected: Rejeitado
statuses: 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. 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: Não permitir publicação
disallow_account: Não permitir autor 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 not_discoverable: O autor optou por não permitir que a sua conta seja sugerida a outros
shared_by: shared_by:
one: Partilhado ou adicionado aos marcadores uma vez one: Partilhado ou adicionado aos marcadores uma vez
other: Partilhado e adicionado aos marcadores %{friendly_count} vezes other: Partilhado e adicionado aos marcadores %{friendly_count} vezes
title: Publicações em alta title: Publicações em tendência
tags: tags:
current_score: Pontuação atual %{score} current_score: Pontuação atual %{score}
dashboard: dashboard:
tag_accounts_measure: utilizadores únicos tag_accounts_measure: utilizadores únicos
tag_languages_dimension: Idiomas mais populares tag_languages_dimension: Idiomas mais populares
tag_servers_dimension: Topo de servidores tag_servers_dimension: Servidores mais populares
tag_servers_measure: servidores diferentes tag_servers_measure: servidores diferentes
tag_uses_measure: utilizações totais 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.' 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_trendable: Não aparecerá nas tendências
not_usable: Não pode ser utilizada not_usable: Não pode ser utilizada
peaked_on_and_decaying: Máximo em %{date}, agora a decair peaked_on_and_decaying: Máximo em %{date}, agora a decair
title: Etiquetas em alta title: Etiquetas em tendência
trendable: Pode aparecer em alta trendable: Pode aparecer nas tendências
trending_rank: 'Em alta #%{rank}' trending_rank: 'Tendência #%{rank}'
usable: Pode ser utilizada usable: Pode ser utilizada
usage_comparison: Utilizada %{today} vezes hoje, em comparação com %{yesterday} ontem usage_comparison: Utilizada %{today} vezes hoje, em comparação com %{yesterday} ontem
used_by_over_week: used_by_over_week:
one: Utilizada por uma pessoa na última semana one: Utilizada por uma pessoa na última semana
other: Utilizada por %{count} pessoas 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: warning_presets:
add_new: Adicionar novo add_new: Adicionar novo
delete: Eliminar delete: Eliminar
@ -946,13 +947,13 @@ pt-PT:
webhooks: webhooks:
add_new: Adicionar endpoint add_new: Adicionar endpoint
delete: Eliminar 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 disable: Desativar
disabled: Desativado disabled: Desativado
edit: Editar endpoint edit: Editar endpoint
empty: Não tem ainda qualquer endpoint de webhook configurado. empty: Não tem ainda qualquer endpoint de webhook configurado.
enable: Ativar enable: Ativar
enabled: Activo enabled: Ativo
enabled_events: enabled_events:
one: 1 evento ativado one: 1 evento ativado
other: "%{count} eventos ativados" other: "%{count} eventos ativados"
@ -993,18 +994,18 @@ pt-PT:
body: Foram lançadas novas versões do Mastodon, talvez queira atualizar! body: Foram lançadas novas versões do Mastodon, talvez queira atualizar!
subject: Estão disponíveis novas versões do Mastodon para %{instance}! subject: Estão disponíveis novas versões do Mastodon para %{instance}!
new_trends: 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: new_trending_links:
title: Ligações em alta title: Hiperligações em tendência
new_trending_statuses: new_trending_statuses:
title: Publicações em alta title: Publicações em tendência
new_trending_tags: new_trending_tags:
title: Etiquetas em alta title: Etiquetas em tendência
subject: Novas tendências para revisão em %{instance} subject: Novas tendências para revisão em %{instance}
aliases: aliases:
add_new: Criar pseudónimo add_new: Criar pseudónimo
created_msg: Criou com sucesso um novo pseudónimo. Pode agora iniciar a migração da conta antiga. 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. 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>. 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 remove: Desvincular pseudónimo
@ -1026,8 +1027,8 @@ pt-PT:
view_profile: Ver perfil view_profile: Ver perfil
view_status: Ver publicação view_status: Ver publicação
applications: applications:
created: Aplicação correctamente criada created: Aplicação criada com sucesso
destroyed: Aplicação correctamente eliminada destroyed: Aplicação eliminada com sucesso
logout: Sair logout: Sair
regenerate_token: Regenerar token de acesso regenerate_token: Regenerar token de acesso
token_regenerated: Token de acesso regenerado com sucesso token_regenerated: Token de acesso regenerado com sucesso
@ -1036,7 +1037,7 @@ pt-PT:
auth: auth:
apply_for_account: Solicitar uma conta apply_for_account: Solicitar uma conta
captcha_confirmation: 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". 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 title: Verificação de segurança
confirmations: confirmations:
@ -1138,7 +1139,7 @@ pt-PT:
confirm_password: Insira sua palavra-passe atual para verificar a sua identidade confirm_password: Insira sua palavra-passe atual para verificar a sua identidade
confirm_username: Insira seu nome de utilizador para confirmar o procedimento confirm_username: Insira seu nome de utilizador para confirmar o procedimento
proceed: Eliminar conta proceed: Eliminar conta
success_msg: A sua conta foi correctamente eliminada success_msg: A sua conta foi eliminada com sucesso
warning: warning:
before: 'Antes de continuar, por favor leia cuidadosamente estas notas:' 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 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 muting: Importando contas silenciadas
type: Tipo de importação type: Tipo de importação
type_groups: type_groups:
constructive: Seguidores e Marcadores constructive: Seguidores e marcadores
destructive: Bloqueios e silenciamentos destructive: Bloqueios e silenciamentos
types: types:
blocking: Lista de bloqueio blocking: Lista de bloqueio
bookmarks: Itens salvos bookmarks: Marcadores
domain_blocking: Lista de domínios bloqueados domain_blocking: Lista de domínios bloqueados
following: Lista de pessoas que estás a seguir following: Lista de pessoas que estás a seguir
lists: Listas lists: Listas
@ -1395,7 +1396,7 @@ pt-PT:
acct: Mudou-se para acct: Mudou-se para
cancel: Cancelar redirecionamento 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. 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: errors:
already_moved: é a mesma conta para a qual já migrou already_moved: é a mesma conta para a qual já migrou
missing_also_known_as: não é um pseudónimo dessa conta 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 followers_count: Seguidores no momento da migração
incoming_migrations: A migrar de uma conta diferente 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>. 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. 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. on_cooldown: Migrou recentemente a sua conta. Esta função ficará disponível novamente em %{count} dias.
past_migrations: Migrações anteriores past_migrations: Migrações anteriores
proceed_with_move: Migrar seguidores proceed_with_move: Migrar seguidores
redirected_msg: A sua conta está agora 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 redireccionada para %{acct}. redirecting_to: A sua conta está a ser redirecionada para %{acct}.
set_redirect: Definir redirecionamento set_redirect: Definir redirecionamento
warning: warning:
backreference_required: A nova conta deve primeiro ser configurada para que esta seja referenciada 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 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. 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 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 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 redirect: O perfil da sua conta atual será atualizado com um aviso de redirecionamento e será excluído das pesquisas
moderation: moderation:
@ -1546,7 +1547,7 @@ pt-PT:
remove_selected_follows: Deixar de seguir os utilizadores selecionados remove_selected_follows: Deixar de seguir os utilizadores selecionados
status: Estado da conta status: Estado da conta
remote_follow: 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: reports:
errors: errors:
invalid_rules: não faz referência a regras válidas invalid_rules: não faz referência a regras válidas
@ -1639,7 +1640,7 @@ pt-PT:
user_domain_block: Bloqueou %{target_name} user_domain_block: Bloqueou %{target_name}
lost_followers: Seguidores perdidos lost_followers: Seguidores perdidos
lost_follows: Pessoas que segue perdidas 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. purged: Informações sobre este servidor foram purgadas pelos administradores do seu servidor.
type: Evento type: Evento
statuses: statuses:
@ -1706,8 +1707,8 @@ pt-PT:
keep_pinned_hint: Não apagar nenhuma das suas publicações afixadas keep_pinned_hint: Não apagar nenhuma das suas publicações afixadas
keep_polls: Manter sondagens keep_polls: Manter sondagens
keep_polls_hint: Não apaga nenhuma das suas sondagens keep_polls_hint: Não apaga nenhuma das suas sondagens
keep_self_bookmark: Manter as publicações que guardou keep_self_bookmark: Manter as publicações que marcou
keep_self_bookmark_hint: Não apaga as suas próprias publicações se as tiver guardado 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: Manter as publicações que marcou
keep_self_fav_hint: Não apaga as suas próprias publicações se as tiver marcado keep_self_fav_hint: Não apaga as suas próprias publicações se as tiver marcado
min_age: min_age:
@ -1852,8 +1853,8 @@ pt-PT:
one: "%{people} pessoa nos últimos 2 dias" one: "%{people} pessoa nos últimos 2 dias"
other: "%{people} pessoas 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_subtitle: Explore o que está em tendência desde os últimos 2 dias
hashtags_title: Trending hashtags hashtags_title: Etiquetas em tendência
hashtags_view_more: Ver mais hashtags em alta hashtags_view_more: Ver mais etiquetas em tendência
post_action: Compor post_action: Compor
post_step: Diga olá para o mundo com texto, fotos, vídeos ou enquetes. post_step: Diga olá para o mundo com texto, fotos, vídeos ou enquetes.
post_title: Faça a sua primeira publicação 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. 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 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." 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 verification: Verificação
verified_links: As suas ligações verificadas verified_links: As suas ligações verificadas
webauthn_credentials: webauthn_credentials:

View File

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

View File

@ -52,7 +52,7 @@ pt-PT:
locale: O idioma da interface de utilizador, e-mails e notificações push locale: O idioma da interface de utilizador, e-mails e notificações push
password: Use pelo menos 8 caracteres password: Use pelo menos 8 caracteres
phrase: Será correspondido independentemente da capitalização ou do aviso de conteúdo duma publicação 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_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_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 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. 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. 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 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. 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. 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. 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. 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. 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. 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. 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 publicações em alta mostram quais as publicações, etiquetas e notícias que estão a ganhar destaque no seu servidor. 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 para usuários logados e visitantes em vez de uma descrição deste servidor. Requer que as tendências sejam ativadas. 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: form_challenge:
current_password: Está a entrar numa área segura current_password: Está a entrar numa área segura
imports: imports:
@ -129,7 +129,7 @@ pt-PT:
tag: tag:
name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis
user: 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 role: A função controla que permissões o utilizador tem
user_role: user_role:
color: Cor a ser utilizada para a função em toda a interface de utilizador, como RGB no formato hexadecimal 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_reduce_motion: Reduz movimento em animações
setting_system_font_ui: Usar o tipo de letra padrão do sistema setting_system_font_ui: Usar o tipo de letra padrão do sistema
setting_theme: Tema do sítio 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_unfollow_modal: Solicitar confirmação antes de deixar de seguir alguém
setting_use_blurhash: Mostrar gradientes coloridos para medias ocultas setting_use_blurhash: Mostrar gradientes coloridos para medias ocultas
setting_use_pending_items: Modo lento setting_use_pending_items: Modo lento
@ -253,7 +253,7 @@ pt-PT:
mascot: Mascote personalizada (legado) mascot: Mascote personalizada (legado)
media_cache_retention_period: Período de retenção de ficheiros de media em cache 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 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 registrations_mode: Quem se pode inscrever
require_invite_text: Requerer uma razão para entrar require_invite_text: Requerer uma razão para entrar
show_domain_blocks: Mostrar domínios bloqueados show_domain_blocks: Mostrar domínios bloqueados
@ -268,8 +268,8 @@ pt-PT:
theme: Tema predefinido theme: Tema predefinido
thumbnail: Miniatura do servidor thumbnail: Miniatura do servidor
timeline_preview: Permitir acesso não autenticado às cronologias públicas timeline_preview: Permitir acesso não autenticado às cronologias públicas
trendable_by_default: Permitir publicações em alta sem revisão prévia trendable_by_default: Permitir tendências sem revisão prévia
trends: Activar publicações em alta trends: Ativar tendências
trends_as_landing_page: Usar tendências como página inicial trends_as_landing_page: Usar tendências como página inicial
interactions: interactions:
must_be_follower: Bloquear notificações de não-seguidores 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 label: Está disponível uma nova versão do Mastodon
none: Nunca notificar atualizações (não recomendado) none: Nunca notificar atualizações (não recomendado)
patch: Notificar sobre atualizações de correções de problemas 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: rule:
hint: Informação Adicional hint: Informação Adicional
text: Regra text: Regra
@ -313,7 +313,7 @@ pt-PT:
tag: tag:
listable: Permitir que esta etiqueta apareça em pesquisas e no diretório de perfis listable: Permitir que esta etiqueta apareça em pesquisas e no diretório de perfis
name: Etiqueta 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 usable: Permitir que as publicações usem esta hashtag localmente
user: user:
role: Cargo role: Cargo

View File

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

View File

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

View File

@ -64,7 +64,7 @@ RSpec.describe Admin::ExportDomainBlocksController do
end end
def batch_table_rows 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
end end

View File

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

View File

@ -342,7 +342,7 @@ RSpec.describe Auth::RegistrationsController do
end end
def username_error_text 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
end end

View File

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

View File

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

View File

@ -723,6 +723,30 @@ RSpec.describe Account do
end end
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 'Normalizations' do
describe 'username' do describe 'username' do
it { is_expected.to normalize(:username).from(" \u3000bob \t \u00a0 \n ").to('bob') } it { is_expected.to normalize(:username).from(" \u3000bob \t \u00a0 \n ").to('bob') }

View File

@ -64,14 +64,7 @@ RSpec.describe Announcement do
end end
describe 'Validations' do describe 'Validations' do
describe 'text' do it { is_expected.to validate_presence_of(:text) }
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
describe 'ends_at' do describe 'ends_at' do
it 'validates presence when starts_at is present' do it 'validates presence when starts_at is present' do

View File

@ -4,17 +4,8 @@ require 'rails_helper'
RSpec.describe Block do RSpec.describe Block do
describe 'validations' do describe 'validations' do
it 'is invalid without an account' do it { is_expected.to belong_to(:account).required }
block = Fabricate.build(:block, account: nil) it { is_expected.to belong_to(:target_account).required }
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
end end
it 'removes blocking cache after creation' do it 'removes blocking cache after creation' do

View File

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

View File

@ -4,19 +4,8 @@ require 'rails_helper'
RSpec.describe CustomFilter do RSpec.describe CustomFilter do
describe 'Validations' do describe 'Validations' do
it 'requires presence of title' do it { is_expected.to validate_presence_of(:title) }
record = described_class.new(title: '') it { is_expected.to validate_presence_of(:context) }
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 'requires non-empty of context' do it 'requires non-empty of context' do
record = described_class.new(context: []) record = described_class.new(context: [])

View File

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

View File

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

View File

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

View File

@ -3,19 +3,8 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe Import do RSpec.describe Import do
let(:account) { Fabricate(:account) } describe 'Validations' do
let(:type) { 'following' } it { is_expected.to validate_presence_of(:type) }
let(:data) { attachment_fixture('imports.txt') } it { is_expected.to validate_presence_of(:data) }
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
end end
end end

View File

@ -4,19 +4,8 @@ require 'rails_helper'
RSpec.describe IpBlock do RSpec.describe IpBlock do
describe 'validations' do describe 'validations' do
it 'validates ip presence', :aggregate_failures do it { is_expected.to validate_presence_of(:ip) }
ip_block = described_class.new(ip: nil, severity: :no_access) it { is_expected.to validate_presence_of(:severity) }
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 'validates ip uniqueness', :aggregate_failures do it 'validates ip uniqueness', :aggregate_failures do
described_class.create!(ip: '127.0.0.1', severity: :no_access) described_class.create!(ip: '127.0.0.1', severity: :no_access)

View File

@ -3,14 +3,7 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe Marker do RSpec.describe Marker do
describe 'validations' do describe 'Validations' do
describe 'timeline' do it { is_expected.to validate_inclusion_of(:timeline).in_array(described_class::TIMELINES) }
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
end end
end end

View File

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

View File

@ -4,16 +4,7 @@ require 'rails_helper'
RSpec.describe Mention do RSpec.describe Mention do
describe 'validations' do describe 'validations' do
it 'is invalid without an account' do it { is_expected.to belong_to(:account).required }
mention = Fabricate.build(:mention, account: nil) it { is_expected.to belong_to(:status).required }
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
end end
end end

View File

@ -32,12 +32,9 @@ RSpec.describe Poll do
describe 'validations' do describe 'validations' do
context 'when not valid' 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 it { is_expected.to validate_presence_of(:expires_at) }
poll.valid?
expect(poll).to model_have_error_on_field(:expires_at)
end
end end
end end
end end

View File

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

View File

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

View File

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

View File

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

View File

@ -4,11 +4,6 @@ require 'rails_helper'
RSpec.describe 'Instance actor endpoint' do RSpec.describe 'Instance actor endpoint' do
describe 'GET /actor' 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 } let!(:original_federation_mode) { Rails.configuration.x.limited_federation_mode }
shared_examples 'instance actor endpoint' do shared_examples 'instance actor endpoint' do

View File

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

View File

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

View File

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

View File

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

110
yarn.lock
View File

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