diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js
index eb42115b7..fe4ed5d77 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.js
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js
@@ -16,7 +16,7 @@ const NavigationPanel = () => (
-
+
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index 2d0136992..9a901f12a 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -13,7 +13,7 @@ import { debounce } from 'lodash';
import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose';
import { expandHomeTimeline } from '../../actions/timelines';
import { expandNotifications } from '../../actions/notifications';
-import { fetchFilters } from '../../actions/filters';
+import { fetchRules } from '../../actions/rules';
import { clearHeight } from '../../actions/height_cache';
import { focusApp, unfocusApp, changeLayout } from 'mastodon/actions/app';
import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'mastodon/actions/markers';
@@ -367,7 +367,8 @@ class UI extends React.PureComponent {
this.props.dispatch(fetchMarkers());
this.props.dispatch(expandHomeTimeline());
this.props.dispatch(expandNotifications());
- setTimeout(() => this.props.dispatch(fetchFilters()), 500);
+
+ setTimeout(() => this.props.dispatch(fetchRules()), 3000);
this.hotkeys.__mousetrap__.stopCallback = (e, element) => {
return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName);
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index 8d47e479a..4f90e955f 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -91,7 +91,7 @@ export const fileNameFromURL = str => {
const pathname = url.pathname;
const index = pathname.lastIndexOf('/');
- return pathname.substring(index + 1);
+ return pathname.slice(index + 1);
};
export default @injectIntl
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index 1307bf23e..51d023c8e 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -28,5 +28,6 @@ export const showTrends = getMeta('trends');
export const title = getMeta('title');
export const cropImages = getMeta('crop_images');
export const disableSwiping = getMeta('disable_swiping');
+export const languages = initialState && initialState.languages;
export default initialState;
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index 088b5ff36..52cb08217 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -1,112 +1,114 @@
{
- "account.account_note_header": "Note",
- "account.add_or_remove_from_list": "Add or Remove from lists",
+ "account.account_note_header": "Nota",
+ "account.add_or_remove_from_list": "Voeg by of verwyder van lyste",
"account.badges.bot": "Bot",
- "account.badges.group": "Group",
- "account.block": "Block @{name}",
- "account.block_domain": "Block domain {domain}",
- "account.blocked": "Blocked",
- "account.browse_more_on_origin_server": "Browse more on the original profile",
- "account.cancel_follow_request": "Cancel follow request",
- "account.direct": "Direct message @{name}",
+ "account.badges.group": "Groep",
+ "account.block": "Blok @{name}",
+ "account.block_domain": "Blokeer alles van {domain}",
+ "account.blocked": "Geblok",
+ "account.browse_more_on_origin_server": "Snuffel rond op oorspronklike profiel",
+ "account.cancel_follow_request": "Kanselleer volgversoek",
+ "account.direct": "Stuur direkte boodskap aan @{name}",
"account.disable_notifications": "Stop notifying me when @{name} posts",
"account.domain_blocked": "Domain blocked",
- "account.edit_profile": "Edit profile",
- "account.enable_notifications": "Notify me when @{name} posts",
- "account.endorse": "Feature on profile",
- "account.follow": "Follow",
- "account.followers": "Followers",
- "account.followers.empty": "No one follows this user yet.",
+ "account.edit_profile": "Redigeer profiel",
+ "account.enable_notifications": "Stel my in kennis wanneer @{name} plasings maak",
+ "account.endorse": "Beklemtoon op profiel",
+ "account.follow": "Volg",
+ "account.followers": "Volgelinge",
+ "account.followers.empty": "Niemand volg tans hierdie gebruiker nie.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
"account.following": "Following",
"account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.follows.empty": "This user doesn't follow anyone yet.",
- "account.follows_you": "Follows you",
- "account.hide_reblogs": "Hide boosts from @{name}",
- "account.joined": "Joined {date}",
- "account.link_verified_on": "Ownership of this link was checked on {date}",
- "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+ "account.follows.empty": "Die gebruiker volg nie tans iemand nie.",
+ "account.follows_you": "Volg jou",
+ "account.hide_reblogs": "Versteek hupstoot vanaf @{name}",
+ "account.joined": "{date} aangesluit",
+ "account.link_verified_on": "Eienaarskap van die skakel was getoets op {date}",
+ "account.locked_info": "Die rekening se privaatheidstatus is gesluit. Die eienaar hersien handmatig wie hom/haar kan volg.",
"account.media": "Media",
- "account.mention": "Mention @{name}",
- "account.moved_to": "{name} has moved to:",
- "account.mute": "Mute @{name}",
- "account.mute_notifications": "Mute notifications from @{name}",
- "account.muted": "Muted",
+ "account.mention": "Noem @{name}",
+ "account.moved_to": "{name} is geskuif na:",
+ "account.mute": "Demp @{name}",
+ "account.mute_notifications": "Demp kennisgewings van @{name}",
+ "account.muted": "Gedemp",
"account.posts": "Toots",
"account.posts_with_replies": "Toots and replies",
- "account.report": "Report @{name}",
+ "account.report": "Rapporteer @{name}",
"account.requested": "Awaiting approval",
- "account.share": "Share @{name}'s profile",
- "account.show_reblogs": "Show boosts from @{name}",
+ "account.share": "Deel @{name} se profiel",
+ "account.show_reblogs": "Wys hupstote vanaf @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
- "account.unblock": "Unblock @{name}",
- "account.unblock_domain": "Unblock domain {domain}",
- "account.unblock_short": "Unblock",
- "account.unendorse": "Don't feature on profile",
- "account.unfollow": "Unfollow",
- "account.unmute": "Unmute @{name}",
- "account.unmute_notifications": "Unmute notifications from @{name}",
- "account.unmute_short": "Unmute",
+ "account.unblock": "Ontblok @{name}",
+ "account.unblock_domain": "Ontblok domein {domain}",
+ "account.unblock_short": "Ontblok",
+ "account.unendorse": "Moenie beklemtoon op profiel nie",
+ "account.unfollow": "Ontvolg",
+ "account.unmute": "Ontdemp @{name}",
+ "account.unmute_notifications": "Ontdemp kennisgewings vanaf @{name}",
+ "account.unmute_short": "Ontdemp",
"account_note.placeholder": "Click to add a note",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
+ "admin.dashboard.retention.average": "Gemiddeld",
"admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+ "admin.dashboard.retention.cohort_size": "Nuwe gebruikers",
+ "alert.rate_limited.message": "Probeer asb. weer na {retry_time, time, medium}.",
"alert.rate_limited.title": "Rate limited",
"alert.unexpected.message": "An unexpected error occurred.",
"alert.unexpected.title": "Oops!",
- "announcement.announcement": "Announcement",
+ "announcement.announcement": "Aankondiging",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} per week",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.body": "Something went wrong while loading this component.",
- "bundle_column_error.retry": "Try again",
- "bundle_column_error.title": "Network error",
+ "bundle_column_error.retry": "Probeer weer",
+ "bundle_column_error.title": "Netwerk fout",
"bundle_modal_error.close": "Close",
- "bundle_modal_error.message": "Something went wrong while loading this component.",
- "bundle_modal_error.retry": "Try again",
+ "bundle_modal_error.message": "Iets het verkeerd gegaan terwyl hierdie komponent besig was om te laai.",
+ "bundle_modal_error.retry": "Probeer weer",
"column.blocks": "Blocked users",
- "column.bookmarks": "Bookmarks",
- "column.community": "Local timeline",
- "column.direct": "Direct messages",
- "column.directory": "Browse profiles",
- "column.domain_blocks": "Blocked domains",
- "column.favourites": "Favourites",
- "column.follow_requests": "Follow requests",
- "column.home": "Home",
- "column.lists": "Lists",
- "column.mutes": "Muted users",
- "column.notifications": "Notifications",
+ "column.bookmarks": "Boekmerke",
+ "column.community": "Plaaslike tydlyn",
+ "column.direct": "Direkte boodskappe",
+ "column.directory": "Blaai deur profiele",
+ "column.domain_blocks": "Geblokte domeine",
+ "column.favourites": "Gunstelinge",
+ "column.follow_requests": "Volgversoeke",
+ "column.home": "Tuis",
+ "column.lists": "Lyste",
+ "column.mutes": "Gedempte gebruikers",
+ "column.notifications": "Kennisgewings",
"column.pins": "Pinned toot",
- "column.public": "Federated timeline",
- "column_back_button.label": "Back",
- "column_header.hide_settings": "Hide settings",
- "column_header.moveLeft_settings": "Move column to the left",
- "column_header.moveRight_settings": "Move column to the right",
- "column_header.pin": "Pin",
- "column_header.show_settings": "Show settings",
- "column_header.unpin": "Unpin",
- "column_subheading.settings": "Settings",
- "community.column_settings.local_only": "Local only",
+ "column.public": "Gefedereerde tydlyn",
+ "column_back_button.label": "Terug",
+ "column_header.hide_settings": "Versteek instellings",
+ "column_header.moveLeft_settings": "Skuif kolom na links",
+ "column_header.moveRight_settings": "Skuif kolom na regs",
+ "column_header.pin": "Pen vas",
+ "column_header.show_settings": "Wys instellings",
+ "column_header.unpin": "Ontpen",
+ "column_subheading.settings": "Instellings",
+ "community.column_settings.local_only": "Slegs plaaslik",
"community.column_settings.media_only": "Media only",
- "community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
- "compose_form.direct_message_warning_learn_more": "Learn more",
+ "community.column_settings.remote_only": "Slegs afgeleë",
+ "compose.language.change": "Verander taal",
+ "compose.language.search": "Soek tale...",
+ "compose_form.direct_message_warning_learn_more": "Leer meer",
+ "compose_form.encryption_warning": "Plasings op Mastodon het nie end-tot-end enkripsie nie. Moet nie enige sensitiewe inligting oor Mastodon deel nie.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
- "compose_form.lock_disclaimer.lock": "locked",
+ "compose_form.lock_disclaimer.lock": "gesluit",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.poll.add_option": "Add a choice",
- "compose_form.poll.duration": "Poll duration",
- "compose_form.poll.option_placeholder": "Choice {number}",
- "compose_form.poll.remove_option": "Remove this choice",
- "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
- "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.poll.add_option": "Voeg 'n keuse by",
+ "compose_form.poll.duration": "Duur van peiling",
+ "compose_form.poll.option_placeholder": "Keuse {number}",
+ "compose_form.poll.remove_option": "Verwyder hierdie keuse",
+ "compose_form.poll.switch_to_multiple": "Verander die peiling na verskeie keuses",
+ "compose_form.poll.switch_to_single": "Verander die peiling na 'n enkel keuse",
+ "compose_form.publish": "Publisheer",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "Stoor veranderinge",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Maak skoon",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -166,7 +169,7 @@
"empty_column.blocks": "You haven't blocked any users yet.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
- "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+ "empty_column.direct": "Jy het nog nie direkte boodskappe nie. Wanneer jy een stuur of ontvang, sal dit hier verskyn.",
"empty_column.domain_blocks": "There are no blocked domains yet.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "to focus the compose textarea",
"keyboard_shortcuts.description": "Description",
- "keyboard_shortcuts.direct": "to open direct messages column",
+ "keyboard_shortcuts.direct": "om direkte boodskappe kolom oop te maak",
"keyboard_shortcuts.down": "to move down in the list",
"keyboard_shortcuts.enter": "to open status",
"keyboard_shortcuts.favourite": "to favourite",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Vertoon profiel in elkgeval",
+ "limited_account_hint.title": "Hierdie profiel is deur moderators van jou bediener versteek.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "Local timeline",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "Direct messages",
+ "navigation_bar.direct": "Direkte boodskappe",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Edit profile",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Adjust status privacy",
"privacy.direct.long": "Visible for mentioned users only",
- "privacy.direct.short": "Direct",
+ "privacy.direct.short": "Slegs genoemde persone",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 6580f5d44..406868d65 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -2,8 +2,8 @@
"account.account_note_header": "مُلاحظة",
"account.add_or_remove_from_list": "الإضافة أو الإزالة من القائمة",
"account.badges.bot": "روبوت",
- "account.badges.group": "مجموعة",
- "account.block": "حظر @{name}",
+ "account.badges.group": "فريق",
+ "account.block": "احجب @{name}",
"account.block_domain": "حظر اسم النِّطاق {domain}",
"account.blocked": "محظور",
"account.browse_more_on_origin_server": "تصفح المزيد في الملف الشخصي الأصلي",
@@ -11,14 +11,14 @@
"account.direct": "مراسلة @{name} بشكل مباشر",
"account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}",
"account.domain_blocked": "اسم النِّطاق محظور",
- "account.edit_profile": "تحرير الملف الشخصي",
+ "account.edit_profile": "تعديل الملف الشخصي",
"account.enable_notifications": "أشعرني عندما ينشر @{name}",
"account.endorse": "أوصِ به على صفحتك الشخصية",
- "account.follow": "المُتابعة",
- "account.followers": "المُتابِعون",
- "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم حتى الآن.",
- "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two{مُتابعانِ اِثنان} few{{counter} مُتابِعين} many{{counter} مُتابِعًا} other {{counter} مُتابع}}",
- "account.following": "Following",
+ "account.follow": "متابعة",
+ "account.followers": "مُتابِعون",
+ "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
+ "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}",
+ "account.following": "الإشتراكات",
"account.following_counter": "{count, plural, zero{لا يُتابِع} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}",
"account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
"account.follows_you": "يُتابِعُك",
@@ -35,18 +35,18 @@
"account.posts": "منشورات",
"account.posts_with_replies": "المنشورات والرُدود",
"account.report": "الإبلاغ عن @{name}",
- "account.requested": "في اِنتظر القُبول. اِنقُر لإلغاء طلب المُتابعة",
+ "account.requested": "في انتظار القبول. اضغط لإلغاء طلب المُتابعة",
"account.share": "مُشاركة الملف الشخصي لـ @{name}",
"account.show_reblogs": "عرض مشاركات @{name}",
- "account.statuses_counter": "{count, plural, zero {لَا تَبويقات} one {تَبويقةٌ واحدة} two {تَبويقَتانِ اِثنتان} few {{counter} تَبويقات} many {{counter} تَبويقتًا} other {{counter} تَبويقة}}",
+ "account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}",
"account.unblock": "إلغاء الحَظر عن @{name}",
"account.unblock_domain": "إلغاء الحَظر عن النِّطاق {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "ألغ الحجب",
"account.unendorse": "لا تُرَوِّج لهُ في الملف الشخصي",
"account.unfollow": "إلغاء المُتابعة",
"account.unmute": "إلغاء الكَتم عن @{name}",
"account.unmute_notifications": "إلغاء كَتم الإشعارات عن @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "إلغاء الكتم",
"account_note.placeholder": "اضغط لإضافة مُلاحظة",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
@@ -70,17 +70,17 @@
"column.blocks": "المُستَخدِمون المَحظورون",
"column.bookmarks": "الفواصل المرجعية",
"column.community": "الخيط الزمني المحلي",
- "column.direct": "الرسائل المباشرة",
+ "column.direct": "الرسائل المباشِرة",
"column.directory": "تَصَفُّحُ المَلفات الشخصية",
- "column.domain_blocks": "النِّطاقَاتُ المَحظُورَة",
+ "column.domain_blocks": "النطاقات المحظورة",
"column.favourites": "المُفَضَّلَة",
- "column.follow_requests": "طَلَبَاتُ المُتَابَعَة",
+ "column.follow_requests": "طلبات المتابعة",
"column.home": "الرئيسية",
"column.lists": "القوائم",
"column.mutes": "المُستَخدِمون المَكتومون",
- "column.notifications": "الإشعارَات",
+ "column.notifications": "الإشعارات",
"column.pins": "المنشورات المُثَبَّتَة",
- "column.public": "الخَطُّ الزَّمَنِيُّ المُوَحَّد",
+ "column.public": "الخيط الزمني المُوَحَّد",
"column_back_button.label": "العودة",
"column_header.hide_settings": "إخفاء الإعدادات",
"column_header.moveLeft_settings": "نقل العامود إلى اليسار",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "المحلي فقط",
"community.column_settings.media_only": "الوسائط فقط",
"community.column_settings.remote_only": "عن بُعد فقط",
- "compose_form.direct_message_warning": "سوف تُرسَل هذه التَّبويقة فقط للمُستَخدِمين المَذكورين.",
+ "compose.language.change": "تغيير اللغة",
+ "compose.language.search": "البحث عن لغة…",
"compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد",
+ "compose_form.encryption_warning": "إنّ المنشورات على ماستدون ليست مشفرة من النهاية إلى النهاية. لا تشارك أي معلومات حساسة عبر ماستدون.",
"compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير مُدرَج. فقط المنشورات العامة يُمكن البحث عنها بواسطة الوسم.",
"compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).",
"compose_form.lock_disclaimer.lock": "مُقفَل",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "إزالة هذا الخيار",
"compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة",
"compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
- "compose_form.publish": "تبويق",
+ "compose_form.publish": "انشر",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "احفظ التعديلات",
"compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
@@ -130,7 +132,7 @@
"confirmations.mute.confirm": "أكتم",
"confirmations.mute.explanation": "هذا سيخفي المنشورات عنهم وتلك المشار فيها إليهم، لكنه سيسمح لهم برؤية منشوراتك ومتابعتك.",
"confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟",
- "confirmations.redraft.confirm": "إزالة و إعادة الصياغة",
+ "confirmations.redraft.confirm": "إزالة وإعادة الصياغة",
"confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.",
"confirmations.reply.confirm": "رد",
"confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟",
@@ -147,12 +149,13 @@
"embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
"embed.preview": "هكذا ما سوف يبدو عليه:",
"emoji_button.activity": "الأنشطة",
+ "emoji_button.clear": "امسح",
"emoji_button.custom": "مخصص",
"emoji_button.flags": "الأعلام",
"emoji_button.food": "الطعام والشراب",
"emoji_button.label": "أدرج إيموجي",
"emoji_button.nature": "الطبيعة",
- "emoji_button.not_found": "لا إيموجو!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "لا توجد هناك وجوه تعبيرية مطابقة",
"emoji_button.objects": "أشياء",
"emoji_button.people": "الناس",
"emoji_button.recent": "الشائعة الاستخدام",
@@ -168,7 +171,7 @@
"empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!",
"empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.",
"empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "ليس هناك ما هو متداوَل الآن. عد في وقت لاحق!",
"empty_column.favourited_statuses": "ليس لديك أية منشورات مفضلة بعد. عندما ستقوم بالإعجاب بواحدة، ستظهر هنا.",
"empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
"empty_column.follow_recommendations": "يبدو أنه لا يمكن إنشاء أي اقتراحات لك. يمكنك البحث عن أشخاص قد تعرفهم أو استكشاف الوسوم الرائجة.",
@@ -264,6 +267,8 @@
"lightbox.expand": "توسيع مربع عرض الصور",
"lightbox.next": "التالي",
"lightbox.previous": "العودة",
+ "limited_account_hint.action": "إظهار الملف التعريفي على أي حال",
+ "limited_account_hint.title": "أخف مشرف الخادم هذا الملف التعريفي.",
"lists.account.add": "أضف إلى القائمة",
"lists.account.remove": "احذف من القائمة",
"lists.delete": "احذف القائمة",
@@ -278,8 +283,8 @@
"lists.search": "إبحث في قائمة الحسابات التي تُتابِعها",
"lists.subheading": "قوائمك",
"load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}",
- "loading_indicator.label": "تحميل...",
- "media_gallery.toggle_visible": "عرض / إخفاء",
+ "loading_indicator.label": "جارٍ التحميل…",
+ "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}",
"missing_indicator.label": "غير موجود",
"missing_indicator.sublabel": "تعذر العثور على هذا المورد",
"mute_modal.duration": "المدة",
@@ -288,13 +293,13 @@
"navigation_bar.apps": "تطبيقات الأجهزة المحمولة",
"navigation_bar.blocks": "الحسابات المحجوبة",
"navigation_bar.bookmarks": "الفواصل المرجعية",
- "navigation_bar.community_timeline": "الخيط العام المحلي",
- "navigation_bar.compose": "لتحرير منشور جديد",
+ "navigation_bar.community_timeline": "الخيط المحلي",
+ "navigation_bar.compose": "تحرير منشور جديد",
"navigation_bar.direct": "الرسائل المباشِرة",
"navigation_bar.discover": "اكتشف",
- "navigation_bar.domain_blocks": "النطاقات المخفية",
+ "navigation_bar.domain_blocks": "النطاقات المحظورة",
"navigation_bar.edit_profile": "عدّل الملف التعريفي",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "استكشف",
"navigation_bar.favourites": "المفضلة",
"navigation_bar.filters": "الكلمات المكتومة",
"navigation_bar.follow_requests": "طلبات المتابعة",
@@ -309,16 +314,16 @@
"navigation_bar.preferences": "التفضيلات",
"navigation_bar.public_timeline": "الخيط العام الموحد",
"navigation_bar.security": "الأمان",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "أنشأ {name} حسابًا",
"notification.favourite": "أُعجِب {name} بمنشورك",
"notification.follow": "{name} يتابعك",
"notification.follow_request": "لقد طلب {name} متابعتك",
"notification.mention": "{name} ذكرك",
"notification.own_poll": "انتهى استطلاعك للرأي",
- "notification.poll": "لقد إنتها تصويت شاركت فيه",
+ "notification.poll": "لقد انتهى استطلاع رأي شاركتَ فيه",
"notification.reblog": "قام {name} بمشاركة منشورك",
"notification.status": "{name} نشر للتو",
- "notification.update": "{name} edited a post",
+ "notification.update": "عدّلَ {name} منشورًا",
"notifications.clear": "امسح الإخطارات",
"notifications.clear_confirmation": "أمتأكد من أنك تود مسح جل الإخطارات الخاصة بك و المتلقاة إلى حد الآن ؟",
"notifications.column_settings.admin.sign_up": "التسجيلات الجديدة:",
@@ -366,13 +371,13 @@
"poll_button.add_poll": "إضافة استطلاع للرأي",
"poll_button.remove_poll": "إزالة استطلاع الرأي",
"privacy.change": "اضبط خصوصية المنشور",
- "privacy.direct.long": "أنشر إلى المستخدمين المشار إليهم فقط",
- "privacy.direct.short": "مباشر",
+ "privacy.direct.long": "مرئي للمستخدمين المذكورين فقط",
+ "privacy.direct.short": "الأشخاص المشار إليهم فقط",
"privacy.private.long": "أنشر لمتابعيك فقط",
- "privacy.private.short": "لمتابعيك فقط",
- "privacy.public.long": "أنشر على الخيوط العامة",
+ "privacy.private.short": "للمتابِعين فقط",
+ "privacy.public.long": "مرئي للكل",
"privacy.public.short": "للعامة",
- "privacy.unlisted.long": "لا تقم بإدراجه على الخيوط العامة",
+ "privacy.unlisted.long": "مرئي للجميع، ولكن مِن دون ميزات الاكتشاف",
"privacy.unlisted.short": "غير مدرج",
"refresh": "أنعِش",
"regeneration_indicator.label": "جارٍ التحميل…",
@@ -394,8 +399,8 @@
"report.categories.other": "أخرى",
"report.categories.spam": "مزعج",
"report.categories.violation": "المحتوى ينتهك شرطا أو عدة شروط استخدام للخادم",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.subtitle": "اختر أفضل تطابق",
+ "report.category.title": "وضح لنا ما أمر {type}",
"report.category.title_account": "ملف تعريفي",
"report.category.title_status": "منشور",
"report.close": "تم",
@@ -408,19 +413,19 @@
"report.placeholder": "تعليقات إضافية",
"report.reasons.dislike": "لايعجبني",
"report.reasons.dislike_description": "ألا ترغب برؤيته",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.other": "شيء آخر",
+ "report.reasons.other_description": "لا تندرج هذه المشكلة ضمن فئات أخرى",
+ "report.reasons.spam": "إنها رسالة مزعجة",
+ "report.reasons.spam_description": "روابط خبيثة أو تفاعل كاذب أو ردود متكررة",
"report.reasons.violation": "ينتهك قواعد الخادم",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
+ "report.reasons.violation_description": "تعلم أنه ينتهك قواعد محددة",
+ "report.rules.subtitle": "اختر كل ما ينطبق",
"report.rules.title": "ما هي القواعد المنتهكة؟",
- "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.subtitle": "اختر كل ما ينطبق",
"report.statuses.title": "هل توجد مشاركات تدعم صحة هذا البلاغ؟",
"report.submit": "إرسال",
"report.target": "ابلغ عن {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action": "يمكنك هنا التحكم في ما يعرض لك على ماستدون:",
"report.thanks.take_action_actionable": "في أثناء مراجعتنا للبلاغ، يمكنك اتخاذ إجراء ضد @{name}:",
"report.thanks.title": "هل ترغب في مشاهدة هذا؟",
"report.thanks.title_actionable": "شُكرًا لَكَ على الإبلاغ، سَوفَ نَنظُرُ فِي هَذَا الأمر.",
@@ -456,8 +461,8 @@
"status.embed": "إدماج",
"status.favourite": "أضف إلى المفضلة",
"status.filtered": "مُصفّى",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "أنشأه {name} {date}",
+ "status.history.edited": "عدله {name} {date}",
"status.load_more": "حمّل المزيد",
"status.media_hidden": "الصورة مستترة",
"status.mention": "أذكُر @{name}",
@@ -470,7 +475,7 @@
"status.read_more": "اقرأ المزيد",
"status.reblog": "رَقِّي",
"status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي",
- "status.reblogged_by": "رقّاه {name}",
+ "status.reblogged_by": "شارَكَه {name}",
"status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
"status.redraft": "إزالة و إعادة الصياغة",
"status.remove_bookmark": "احذفه مِن الفواصل المرجعية",
@@ -507,14 +512,15 @@
"trends.trending_now": "المتداولة الآن",
"ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
"units.short.billion": "{count} مليار",
- "units.short.million": "{count} مليون",
- "units.short.thousand": "{count} ألف",
+ "units.short.million": "{count} مليون",
+ "units.short.thousand": "{count} ألف",
"upload_area.title": "اسحب ثم أفلت للرفع",
"upload_button.label": "إضافة وسائط",
"upload_error.limit": "لقد تم بلوغ الحد الأقصى المسموح به لإرسال الملفات.",
"upload_error.poll": "لا يمكن إدراج ملفات في استطلاعات الرأي.",
"upload_form.audio_description": "وصف للأشخاص ذي قِصر السمع",
"upload_form.description": "وصف للمعاقين بصريا",
+ "upload_form.description_missing": "لم يُضف وصف",
"upload_form.edit": "تعديل",
"upload_form.thumbnail": "غيّر الصورة المصغرة",
"upload_form.undo": "حذف",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 14e46e458..0f18f7376 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -92,9 +92,11 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Namái multimedia",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "Esti barritu namái va unviase a los usuarios mentaos.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Saber más",
- "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "¿En qué pienses?",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Desaniciar esta escoyeta",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Barritar",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Empotra esti estáu nun sitiu web copiando'l códigu d'embaxo.",
"embed.preview": "Asina ye cómo va vese:",
"emoji_button.activity": "Actividaes",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Banderes",
"emoji_button.food": "Comida y bébora",
@@ -166,11 +169,11 @@
"empty_column.blocks": "Entá nun bloquiesti a nengún usuariu.",
"empty_column.bookmarked_statuses": "Entá nun tienes nengún barritu en Marcadores. Cuando amiestes unu, va amosase equí.",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
- "empty_column.direct": "Entá nun tienes nuengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí.",
+ "empty_column.direct": "Entá nun tienes nengún mensaxe direutu. Cuando unvies o recibas dalgún, apaez equí.",
"empty_column.domain_blocks": "Entá nun hai dominios anubríos.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Entá nun tienes nengún barritu en Favoritos. Cuando amiestes unu, va amosase equí.",
- "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+ "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
"empty_column.follow_requests": "Entá nun tienes nenguna solicitú de siguimientu. Cuando recibas una, va amosase equí.",
"empty_column.hashtag": "Entá nun hai nada nesta etiqueta.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "Enfocar l'área de composición",
"keyboard_shortcuts.description": "Descripción",
- "keyboard_shortcuts.direct": "Abrir la columna de los mensaxes direutos",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "pa baxar na llista",
"keyboard_shortcuts.enter": "p'abrir estaos",
"keyboard_shortcuts.favourite": "p'amestar a Favoritos",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Siguiente",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Amestar a la llista",
"lists.account.remove": "Desaniciar de la llista",
"lists.delete": "Desaniciar la llista",
@@ -289,7 +294,7 @@
"navigation_bar.blocks": "Usuarios bloquiaos",
"navigation_bar.bookmarks": "Marcadores",
"navigation_bar.community_timeline": "Llinia temporal llocal",
- "navigation_bar.compose": "Compose new toot",
+ "navigation_bar.compose": "Compose new post",
"navigation_bar.direct": "Mensaxes direutos",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Dominios anubríos",
@@ -369,10 +374,10 @@
"privacy.direct.long": "Post to mentioned users only",
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
- "privacy.private.short": "Namái siguidores",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Nun apaez nes llinies temporales públiques",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Nun llistar",
"refresh": "Refresh",
"regeneration_indicator.label": "Cargando…",
@@ -404,7 +409,7 @@
"report.forward_hint": "La cuenta ye d'otru sirvidor. ¿Quies unviar ellí tamién una copia anónima del informe?",
"report.mute": "Mute",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.next": "Siguiente",
"report.placeholder": "Comentarios adicionales",
"report.reasons.dislike": "I don't like it",
"report.reasons.dislike_description": "It is not something you want to see",
@@ -412,7 +417,7 @@
"report.reasons.other_description": "The issue does not fit into other categories",
"report.reasons.spam": "It's spam",
"report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation": "Incumple les regles del sirvidor",
"report.reasons.violation_description": "You are aware that it breaks specific rules",
"report.rules.subtitle": "Select all that apply",
"report.rules.title": "Which rules are being violated?",
@@ -420,7 +425,7 @@
"report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Unviar",
"report.target": "Report {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action": "Equí tan les opciones pa controlar qué ver en Mastodon:",
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
"report.thanks.title": "Don't want to see this?",
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
@@ -502,7 +507,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
"timeline_hint.resources.followers": "Followers",
"timeline_hint.resources.follows": "Follows",
- "timeline_hint.resources.statuses": "Older toots",
+ "timeline_hint.resources.statuses": "Older posts",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
"trends.trending_now": "Trending now",
"ui.beforeunload": "El borrador va perdese si coles de Mastodon.",
@@ -515,6 +520,7 @@
"upload_error.poll": "La xuba de ficheros nun ta permitida con encuestes.",
"upload_form.audio_description": "Descripción pa persones con perda auditiva",
"upload_form.description": "Descripción pa discapacitaos visuales",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Desaniciar",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index e65681394..69f4796ff 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -70,7 +70,7 @@
"column.blocks": "Блокирани потребители",
"column.bookmarks": "Отметки",
"column.community": "Локална емисия",
- "column.direct": "Директни съобщения",
+ "column.direct": "Direct messages",
"column.directory": "Преглед на профили",
"column.domain_blocks": "Hidden domains",
"column.favourites": "Любими",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Само локално",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Само дистанционно",
- "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Още информация",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Тази публикация няма да бъде изброена под нито един хаштаг, тъй като е скрита. Само публични публикации могат да се търсят по хаштаг.",
"compose_form.lock_disclaimer": "Вашият акаунт не е {locked}. Всеки може да ви последва, за да прегледа вашите публикации само за последователи.",
"compose_form.lock_disclaimer.lock": "заключено",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Премахване на този избор",
"compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора",
"compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор",
- "compose_form.publish": "Раздумай",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Ето как ще изглежда:",
"emoji_button.activity": "Дейност",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Персонализирано",
"emoji_button.flags": "Знамена",
"emoji_button.food": "Храна и напитки",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Не сте блокирали потребители все още.",
"empty_column.bookmarked_statuses": "Все още нямате отметнати публикации. Когато отметнете някоя, тя ще се покаже тук.",
"empty_column.community": "Локалната емисия е празна. Напишете нещо публично, за да започнете!",
- "empty_column.direct": "Все още нямате директни съобщения. Когато изпратите или получите някое, то ще се покаже тук.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Все още нямате любими публикации. Когато поставите някоя в любими, тя ще се покаже тук.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "за фокусиране на текстовото пространство за композиране",
"keyboard_shortcuts.description": "Описание",
- "keyboard_shortcuts.direct": "за отваряне на колона за директни съобщения",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "за придвижване надолу в списъка",
"keyboard_shortcuts.enter": "to open status",
"keyboard_shortcuts.favourite": "за поставяне в любими",
@@ -264,6 +267,8 @@
"lightbox.expand": "Разгъване на полето за преглед на изображение",
"lightbox.next": "Напред",
"lightbox.previous": "Назад",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Добавяне към списък",
"lists.account.remove": "Премахване от списък",
"lists.delete": "Изтриване на списък",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Отметки",
"navigation_bar.community_timeline": "Локална емисия",
"navigation_bar.compose": "Композиране на нова публикация",
- "navigation_bar.direct": "Директни съобщения",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Откриване",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Редактирай профил",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Премахване на анкета",
"privacy.change": "Adjust status privacy",
"privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "Директно",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
- "privacy.private.short": "Само за последователи",
- "privacy.public.long": "Post to public timelines",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Публично",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Скрито",
"refresh": "Опресняване",
"regeneration_indicator.label": "Зареждане…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Качването на файлове не е позволено с анкети.",
"upload_form.audio_description": "Опишете за хора със загуба на слуха",
"upload_form.description": "Опишете за хора със зрителни увреждания",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Редакция",
"upload_form.thumbnail": "Промяна на миниизображението",
"upload_form.undo": "Отмяна",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 3542c4e46..912a7eb7e 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -70,7 +70,7 @@
"column.blocks": "যাদের ব্লক করা হয়েছে",
"column.bookmarks": "বুকমার্ক",
"column.community": "স্থানীয় সময়সারি",
- "column.direct": "সরাসরি লেখা",
+ "column.direct": "Direct messages",
"column.directory": "প্রোফাইল ব্রাউজ করুন",
"column.domain_blocks": "লুকোনো ডোমেনগুলি",
"column.favourites": "পছন্দের গুলো",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "শুধুমাত্র স্থানীয়",
"community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও",
"community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
- "compose_form.direct_message_warning": "শুধুমাত্র যাদেরকে উল্লেখ করা হয়েছে তাদেরকেই এই টুটটি পাঠানো হবে ।",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "আরো জানুন",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "কোনো হ্যাশট্যাগের ভেতরে এই টুটটি থাকবেনা কারণ এটি তালিকাবহির্ভূত। শুধুমাত্র প্রকাশ্য ঠোটগুলো হ্যাশট্যাগের ভেতরে খুঁজে পাওয়া যাবে।",
"compose_form.lock_disclaimer": "আপনার নিবন্ধনে তালা দেওয়া নেই, যে কেও আপনাকে অনুসরণ করতে পারবে এবং অনুশারকদের জন্য লেখা দেখতে পারবে।",
"compose_form.lock_disclaimer.lock": "তালা দেওয়া",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন",
"compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
"compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
- "compose_form.publish": "টুট",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে",
@@ -147,6 +149,7 @@
"embed.instructions": "এই লেখাটি আপনার ওয়েবসাইটে যুক্ত করতে নিচের কোডটি বেবহার করুন।",
"embed.preview": "সেটা দেখতে এরকম হবে:",
"emoji_button.activity": "কার্যকলাপ",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "প্রথা",
"emoji_button.flags": "পতাকা",
"emoji_button.food": "খাদ্য ও পানীয়",
@@ -166,7 +169,7 @@
"empty_column.blocks": "আপনি কোনো ব্যবহারকারীদের ব্লক করেন নি।",
"empty_column.bookmarked_statuses": "আপনার কাছে এখনও কোনও বুকমার্কড টুট নেই। আপনি যখন একটি বুকমার্ক করেন, এটি এখানে প্রদর্শিত হবে।",
"empty_column.community": "স্থানীয় সময়রেখাতে কিছু নেই। প্রকাশ্যভাবে কিছু লিখে লেখালেখির উদ্বোধন করে ফেলুন!",
- "empty_column.direct": "আপনার কাছে সরাসরি পাঠানো কোনো লেখা নেই। যদি কেও পাঠায়, সেটা এখানে দেখা যাবে।",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "এখনও কোনও লুকানো ডোমেন নেই।",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "আপনার পছন্দের কোনো টুট এখনো নেই। আপনি কোনো লেখা পছন্দের হিসেবে চিহ্নিত করলে এখানে পাওয়া যাবে।",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "কোনো কলামএ কোনো লেখা ফোকাস করতে",
"keyboard_shortcuts.compose": "লেখা সম্পদনার জায়গায় ফোকাস করতে",
"keyboard_shortcuts.description": "বিবরণ",
- "keyboard_shortcuts.direct": "সরাসরি পাঠানো লেখা দেখতে",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "তালিকার ভেতরে নিচে যেতে",
"keyboard_shortcuts.enter": "অবস্থা দেখতে",
"keyboard_shortcuts.favourite": "পছন্দের দেখতে",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "পরবর্তী",
"lightbox.previous": "পূর্ববর্তী",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "তালিকাতে যুক্ত করতে",
"lists.account.remove": "তালিকা থেকে বাদ দিতে",
"lists.delete": "তালিকা মুছে ফেলতে",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "বুকমার্ক",
"navigation_bar.community_timeline": "স্থানীয় সময়রেখা",
"navigation_bar.compose": "নতুন টুট লিখুন",
- "navigation_bar.direct": "সরাসরি লেখাগুলি",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "ঘুরে দেখুন",
"navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি",
"navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "নির্বাচন বাদ দিতে",
"privacy.change": "লেখার গোপনীয়তা অবস্থা ঠিক করতে",
"privacy.direct.long": "শুধুমাত্র উল্লেখিত ব্যবহারকারীদের কাছে লিখতে",
- "privacy.direct.short": "সরাসরি",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "শুধুমাত্র আপনার অনুসরণকারীদের লিখতে",
- "privacy.private.short": "শুধুমাত্র অনুসরণকারীদের জন্য",
- "privacy.public.long": "সর্বজনীন প্রকাশ্য সময়রেখাতে লিখতে",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "সর্বজনীন প্রকাশ্য",
- "privacy.unlisted.long": "সর্বজনীন প্রকাশ্য সময়রেখাতে না দেখাতে",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "প্রকাশ্য নয়",
"refresh": "সতেজ করা",
"regeneration_indicator.label": "আসছে…",
@@ -515,6 +520,7 @@
"upload_error.poll": "নির্বাচনক্ষেত্রে কোনো ফাইল যুক্ত করা যাবেনা।",
"upload_form.audio_description": "শ্রবণশক্তি লোকদের জন্য বর্ণনা করুন",
"upload_form.description": "যারা দেখতে পায়না তাদের জন্য এটা বর্ণনা করতে",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "সম্পাদন",
"upload_form.thumbnail": "থাম্বনেল পরিবর্তন করুন",
"upload_form.undo": "মুছে ফেলতে",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 51b78f777..c5559a277 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -41,7 +41,7 @@
"account.statuses_counter": "{count, plural, one {{counter} Toud} other {{counter} Toud}}",
"account.unblock": "Diverzañ @{name}",
"account.unblock_domain": "Diverzañ an domani {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Distankañ",
"account.unendorse": "Paouez da lakaat war-wel war ar profil",
"account.unfollow": "Diheuliañ",
"account.unmute": "Diguzhat @{name}",
@@ -70,7 +70,7 @@
"column.blocks": "Implijer·ezed·ien berzet",
"column.bookmarks": "Sinedoù",
"column.community": "Red-amzer lec'hel",
- "column.direct": "Kemennadoù prevez",
+ "column.direct": "Direct messages",
"column.directory": "Mont a-dreuz ar profiloù",
"column.domain_blocks": "Domani berzet",
"column.favourites": "Muiañ-karet",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Nemet lec'hel",
"community.column_settings.media_only": "Nemet Mediaoù",
"community.column_settings.remote_only": "Nemet a-bell",
- "compose_form.direct_message_warning": "An toud-mañ a vo kaset nemet d'an implijer·ezed·ien meneget.",
+ "compose.language.change": "Cheñch yezh",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Ne vo ket lakaet an toud-mañ er rolloù gerioù-klik dre mard eo anlistennet. N'eus nemet an toudoù foran a c'hall bezañ klasket dre c'her-klik.",
"compose_form.lock_disclaimer": "N'eo ket {locked} ho kont. An holl a c'hal heuliañ ac'hanoc'h evit gwelout ho toudoù prevez.",
"compose_form.lock_disclaimer.lock": "prennet",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Lemel an dibab-mañ",
"compose_form.poll.switch_to_multiple": "Kemmañ ar sontadeg evit aotren meur a zibab",
"compose_form.poll.switch_to_single": "Kemmañ ar sontadeg evit aotren un dibab hepken",
- "compose_form.publish": "Toudañ",
+ "compose_form.publish": "Embann",
"compose_form.publish_loud": "{publish} !",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Merkañ ar media evel kizidik",
@@ -147,6 +149,7 @@
"embed.instructions": "Enkorfit ar statud war ho lec'hienn en ur eilañ ar c'hod dindan.",
"embed.preview": "Setu penaos e vo diskouezet:",
"emoji_button.activity": "Obererezh",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Kempennet",
"emoji_button.flags": "Bannieloù",
"emoji_button.food": "Boued hag Evaj",
@@ -166,7 +169,7 @@
"empty_column.blocks": "N'eus ket bet berzet implijer·ez ganeoc'h c'hoazh.",
"empty_column.bookmarked_statuses": "N'ho peus toud ebet enrollet en ho sinedoù c'hoazh. Pa vo ouzhpennet unan ganeoc'h e teuio war wel amañ.",
"empty_column.community": "Goulo eo ar red-amzer lec'hel. Skrivit'ta un dra evit lakaat tan dezhi !",
- "empty_column.direct": "N'ho peus kemennad prevez ebet c'hoazh. Pa vo resevet pe kaset unan ganeoc'h e teuio war wel amañ.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "N'eus domani kuzh ebet c'hoazh.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "N'ho peus toud muiañ-karet ebet c'hoazh. Pa vo lakaet unan ganeoc'h e vo diskouezet amañ.",
@@ -187,12 +190,12 @@
"error.unexpected_crash.next_steps_addons": "Klaskit azbevaat ar bajenn. Ma n'ez a ket en-dro e c'hallit klask ober gant Mastodon dre ur merdeer disheñvel pe dre an arload genidik.",
"errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
"errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
+ "explore.search_results": "Disoc'hoù an enklask",
+ "explore.suggested_follows": "Evidoc'h",
+ "explore.title": "Ergerzhit",
+ "explore.trending_links": "Keleier",
"explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.trending_tags": "Gerioù-klik",
"follow_recommendations.done": "Graet",
"follow_recommendations.heading": "Heuliit tud e plijfe deoc'h lenn toudoù! Setu un tamm alioù.",
"follow_recommendations.lead": "Toudoù eus tud heuliet ganeoc'h a zeuio war wel en un urzh amzeroniezhel war ho red degemer. N'ho peus ket aon ober fazioù, gallout a rit paouez heuliañ tud ken aes n'eus forzh pegoulz!",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Fokus ar bann",
"keyboard_shortcuts.compose": "Fokus an takad testenn",
"keyboard_shortcuts.description": "Deskrivadur",
- "keyboard_shortcuts.direct": "Digeriñ bann ar c'hemennadennoù prevez",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "Diskennañ er roll",
"keyboard_shortcuts.enter": "evit digeriñ un toud",
"keyboard_shortcuts.favourite": "Lakaat an toud evel muiañ-karet",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ledanaat boest hewel ar skeudenn",
"lightbox.next": "Da-heul",
"lightbox.previous": "A-raok",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Ouzhpennañ d'al listenn",
"lists.account.remove": "Lemel kuit eus al listenn",
"lists.delete": "Dilemel al listenn",
@@ -294,7 +299,7 @@
"navigation_bar.discover": "Dizoleiñ",
"navigation_bar.domain_blocks": "Domanioù kuzhet",
"navigation_bar.edit_profile": "Aozañ ar profil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Ergerzhit",
"navigation_bar.favourites": "Ar re vuiañ-karet",
"navigation_bar.filters": "Gerioù kuzhet",
"navigation_bar.follow_requests": "Pedadoù heuliañ",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Dilemel ar sontadeg",
"privacy.change": "Kemmañ gwelidigezh ar statud",
"privacy.direct.long": "Embann evit an implijer·ezed·ien meneget hepken",
- "privacy.direct.short": "War-eeun",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Embann evit ar re a heuilh ac'hanon hepken",
- "privacy.private.short": "Ar re a heuilh ac'hanon hepken",
- "privacy.public.long": "Embann war ar redoù-amzer foran",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "Na embann war ar redoù-amzer foran",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Anlistennet",
"refresh": "Freskaat",
"regeneration_indicator.label": "O kargañ…",
@@ -389,16 +394,16 @@
"relative_time.seconds": "{number}eil",
"relative_time.today": "hiziv",
"reply_indicator.cancel": "Nullañ",
- "report.block": "Block",
+ "report.block": "Stankañ",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Other",
"report.categories.spam": "Spam",
"report.categories.violation": "Content violates one or more server rules",
"report.category.subtitle": "Choose the best match",
"report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
+ "report.category.title_account": "profil",
"report.category.title_status": "post",
- "report.close": "Done",
+ "report.close": "Graet",
"report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Treuzkas da: {target}",
"report.forward_hint": "War ur servijer all emañ ar c'hont-se. Kas dezhañ un adskrid disanv eus an danevell ivez?",
@@ -450,7 +455,7 @@
"status.delete": "Dilemel",
"status.detailed_status": "Gwel kaozeadenn munudek",
"status.direct": "Kas ur c'hemennad prevez da @{name}",
- "status.edit": "Edit",
+ "status.edit": "Aozañ",
"status.edited": "Edited {date}",
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
"status.embed": "Enframmañ",
@@ -515,6 +520,7 @@
"upload_error.poll": "Pellgargañ restroù n'eo ket aotreet gant sontadegoù.",
"upload_form.audio_description": "Diskrivañ evit tud a zo kollet o c'hlev",
"upload_form.description": "Diskrivañ evit tud a zo kollet o gweled",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Aozañ",
"upload_form.thumbnail": "Kemmañ ar velvenn",
"upload_form.undo": "Dilemel",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 055732cfd..5490bb6b7 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -1,77 +1,77 @@
{
"account.account_note_header": "Nota",
- "account.add_or_remove_from_list": "Afegir o Treure de les llistes",
+ "account.add_or_remove_from_list": "Afegeix o elimina de les llistes",
"account.badges.bot": "Bot",
"account.badges.group": "Grup",
"account.block": "Bloqueja @{name}",
- "account.block_domain": "Amaga-ho tot de {domain}",
+ "account.block_domain": "Bloqueja el domini {domain}",
"account.blocked": "Bloquejat",
"account.browse_more_on_origin_server": "Navega més en el perfil original",
"account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
- "account.direct": "Missatge directe @{name}",
- "account.disable_notifications": "Deixa de notificar-me les publicacions de @{name}",
+ "account.direct": "Envia missatge directe a @{name}",
+ "account.disable_notifications": "No em notifiquis les publicacions de @{name}",
"account.domain_blocked": "Domini bloquejat",
"account.edit_profile": "Edita el perfil",
"account.enable_notifications": "Notifica’m les publicacions de @{name}",
"account.endorse": "Recomana en el teu perfil",
"account.follow": "Segueix",
"account.followers": "Seguidors",
- "account.followers.empty": "Encara ningú no segueix aquest usuari.",
+ "account.followers.empty": "Ningú segueix aquest usuari encara.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
"account.following": "Seguint",
"account.following_counter": "{count, plural, other {{counter} Seguint}}",
- "account.follows.empty": "Aquest usuari encara no segueix a ningú.",
+ "account.follows.empty": "Aquest usuari encara no segueix ningú.",
"account.follows_you": "Et segueix",
"account.hide_reblogs": "Amaga els impulsos de @{name}",
- "account.joined": "Unit des de {date}",
+ "account.joined": "Membre des de {date}",
"account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}",
"account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.",
- "account.media": "Mèdia",
- "account.mention": "Esmenta @{name}",
- "account.moved_to": "{name} s'ha mogut a:",
+ "account.media": "Multimèdia",
+ "account.mention": "Menciona @{name}",
+ "account.moved_to": "{name} s'ha traslladat a:",
"account.mute": "Silencia @{name}",
- "account.mute_notifications": "Notificacions silenciades de @{name}",
+ "account.mute_notifications": "Silencia les notificacions de @{name}",
"account.muted": "Silenciat",
"account.posts": "Publicacions",
"account.posts_with_replies": "Publicacions i respostes",
- "account.report": "Informar sobre @{name}",
- "account.requested": "Esperant aprovació. Clic per a cancel·lar la petició de seguiment",
+ "account.report": "Informa sobre @{name}",
+ "account.requested": "Esperant aprovació. Fes clic per cancel·lar la petició de seguiment",
"account.share": "Comparteix el perfil de @{name}",
"account.show_reblogs": "Mostra els impulsos de @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
+ "account.statuses_counter": "{count, plural, one {{counter} Publicació} other {{counter} Publicacions}}",
"account.unblock": "Desbloqueja @{name}",
"account.unblock_domain": "Desbloqueja el domini {domain}",
- "account.unblock_short": "Desbloqueja",
+ "account.unblock_short": "Desbloquejar",
"account.unendorse": "No recomanar en el perfil",
- "account.unfollow": "Deixa de seguir",
- "account.unmute": "Treure silenci de @{name}",
+ "account.unfollow": "Deixar de seguir",
+ "account.unmute": "Deixar de silenciar @{name}",
"account.unmute_notifications": "Activar notificacions de @{name}",
"account.unmute_short": "Deixa de silenciar",
"account_note.placeholder": "Fes clic per afegir una nota",
- "admin.dashboard.daily_retention": "Ràtio de retenció per dia després del registre",
- "admin.dashboard.monthly_retention": "Ràtio de retenció per mes després del registre",
+ "admin.dashboard.daily_retention": "Ràtio de retenció d'usuaris nous, per dia, després del registre",
+ "admin.dashboard.monthly_retention": "Ràtio de retenció d'usuaris nous, per mes, després del registre",
"admin.dashboard.retention.average": "Mitjana",
- "admin.dashboard.retention.cohort": "Registres mes",
+ "admin.dashboard.retention.cohort": "Mes del registre",
"admin.dashboard.retention.cohort_size": "Nous usuaris",
- "alert.rate_limited.message": "Si us plau prova-ho després de {retry_time, time, medium}.",
+ "alert.rate_limited.message": "Si us plau, torna-ho a provar després de {retry_time, time, medium}.",
"alert.rate_limited.title": "Límit de freqüència",
"alert.unexpected.message": "S'ha produït un error inesperat.",
"alert.unexpected.title": "Vaja!",
"announcement.announcement": "Anunci",
"attachments_list.unprocessed": "(sense processar)",
"autosuggest_hashtag.per_week": "{count} per setmana",
- "boost_modal.combo": "Pots prémer {combo} per saltar-te això el proper cop",
+ "boost_modal.combo": "Pots prémer {combo} per evitar-ho el pròxim cop",
"bundle_column_error.body": "S'ha produït un error en carregar aquest component.",
- "bundle_column_error.retry": "Torna-ho a provar",
+ "bundle_column_error.retry": "Tornar-ho a provar",
"bundle_column_error.title": "Error de connexió",
"bundle_modal_error.close": "Tanca",
"bundle_modal_error.message": "S'ha produït un error en carregar aquest component.",
- "bundle_modal_error.retry": "Torna-ho a provar",
+ "bundle_modal_error.retry": "Tornar-ho a provar",
"column.blocks": "Usuaris bloquejats",
"column.bookmarks": "Marcadors",
"column.community": "Línia de temps local",
"column.direct": "Missatges directes",
- "column.directory": "Navega els perfils",
+ "column.directory": "Navegar pels perfils",
"column.domain_blocks": "Dominis bloquejats",
"column.favourites": "Favorits",
"column.follow_requests": "Peticions per a seguir-te",
@@ -92,61 +92,64 @@
"community.column_settings.local_only": "Només local",
"community.column_settings.media_only": "Només multimèdia",
"community.column_settings.remote_only": "Només remot",
- "compose_form.direct_message_warning": "Aquesta publicació només serà enviat als usuaris esmentats.",
- "compose_form.direct_message_warning_learn_more": "Aprèn més",
- "compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta ja que no està llistada. Només les publicacions públiques poden ser cercades per etiqueta.",
- "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges només a seguidors.",
+ "compose.language.change": "Canvia d'idioma",
+ "compose.language.search": "Cerca idiomes...",
+ "compose_form.direct_message_warning_learn_more": "Més informació",
+ "compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
+ "compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta, ja que no està llistada. Només les publicacions públiques es poden cercar per etiqueta.",
+ "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure les publicacions de només per a seguidors.",
"compose_form.lock_disclaimer.lock": "bloquejat",
- "compose_form.placeholder": "En què penses?",
+ "compose_form.placeholder": "Què et passa pel cap?",
"compose_form.poll.add_option": "Afegir una opció",
"compose_form.poll.duration": "Durada de l'enquesta",
"compose_form.poll.option_placeholder": "Opció {number}",
"compose_form.poll.remove_option": "Elimina aquesta opció",
"compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
- "compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció",
- "compose_form.publish": "Publicar",
+ "compose_form.poll.switch_to_single": "Canvia l’enquesta per permetre una única opció",
+ "compose_form.publish": "Publica-ho",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Desa els canvis",
- "compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}",
- "compose_form.sensitive.marked": "{count, plural, one {Mèdia està marcat com a sensible} other {Mèdia estan marcats com a sensible}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Mèdia no està marcada com a sensible} other {Mèdia no estan marcats com a sensibles}}",
- "compose_form.spoiler.marked": "Treu l'avís de contingut",
+ "compose_form.sensitive.hide": "{count, plural, one {Marca contingut com a sensible} other {Marca contingut com a sensible}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Contingut marcat com a sensible} other {Contingut marcat com a sensible}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Contingut no marcat com a sensible} other {Contingut no marcat com a sensible}}",
+ "compose_form.spoiler.marked": "Elimina l'avís de contingut",
"compose_form.spoiler.unmarked": "Afegeix avís de contingut",
"compose_form.spoiler_placeholder": "Escriu l'avís aquí",
"confirmation_modal.cancel": "Cancel·la",
"confirmations.block.block_and_report": "Bloqueja i informa",
"confirmations.block.confirm": "Bloqueja",
- "confirmations.block.message": "Estàs segur que vols bloquejar a {name}?",
+ "confirmations.block.message": "Segur que vols bloquejar a {name}?",
"confirmations.delete.confirm": "Suprimeix",
- "confirmations.delete.message": "Estàs segur que vols suprimir aquesta publicació?",
+ "confirmations.delete.message": "Segur que vols eliminar la publicació?",
"confirmations.delete_list.confirm": "Suprimeix",
- "confirmations.delete_list.message": "Estàs segur que vols suprimir permanentment aquesta llista?",
+ "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?",
"confirmations.discard_edit_media.confirm": "Descarta",
- "confirmations.discard_edit_media.message": "Tens canvis no desats de la descripciò de mèdia o previsualització, els vols descartar?",
+ "confirmations.discard_edit_media.message": "Tens canvis no desats en la descripció del contingut o en la previsualització, els vols descartar?",
"confirmations.domain_block.confirm": "Bloqueja el domini sencer",
- "confirmations.domain_block.message": "Estàs segur, realment segur que vols bloquejar totalment {domain}? En la majoria dels casos bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs contingut d’aquest domini en cap de les línies de temps ni en les notificacions. Els teus seguidors d’aquest domini seran eliminats.",
+ "confirmations.domain_block.message": "N'estàs segur del tot que vols bloquejar totalment {domain}? En la majoria dels casos, bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs el contingut d’aquest domini en cap de les línies de temps ni en les notificacions. Els teus seguidors d’aquest domini s'elimiran.",
"confirmations.logout.confirm": "Tancar sessió",
"confirmations.logout.message": "Segur que vols tancar la sessió?",
"confirmations.mute.confirm": "Silencia",
- "confirmations.mute.explanation": "Això amagarà les seves publicacions i les que els mencionen però encara els permetrà veure les teves i seguir-te.",
- "confirmations.mute.message": "Estàs segur que vols silenciar {name}?",
- "confirmations.redraft.confirm": "Esborrar i refer",
- "confirmations.redraft.message": "Estàs segur que vols esborrar aquesta publicació i tornar a redactar-la? Perdràs tots els impulsos i favorits, i les respostes a la publicació original es quedaran orfes.",
+ "confirmations.mute.explanation": "Això amagarà les seves publicacions i les que els mencionen, però encara els permetrà veure les teves i seguir-te.",
+ "confirmations.mute.message": "Segur que vols silenciar {name}?",
+ "confirmations.redraft.confirm": "Esborra'l i reescriure-lo",
+ "confirmations.redraft.message": "Segur que vols esborrar aquesta publicació i tornar-la a escriure? Perdràs tots els impulsos i els favorits, i les respostes a la publicació original es quedaran orfes.",
"confirmations.reply.confirm": "Respon",
- "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?",
+ "confirmations.reply.message": "Si respons ara, sobreescriuràs el missatge que estàs editant. Segur que vols continuar?",
"confirmations.unfollow.confirm": "Deixa de seguir",
- "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?",
+ "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?",
"conversation.delete": "Elimina la conversa",
"conversation.mark_as_read": "Marca com a llegida",
- "conversation.open": "Veure conversa",
+ "conversation.open": "Mostra la conversa",
"conversation.with": "Amb {names}",
"directory.federated": "Del fedivers conegut",
"directory.local": "Només de {domain}",
"directory.new_arrivals": "Arribades noves",
"directory.recently_active": "Recentment actius",
- "embed.instructions": "Incrusta aquest tut al lloc web copiant el codi a continuació.",
+ "embed.instructions": "Incrusta aquesta publicació a la teva pàgina web copiant el codi següent.",
"embed.preview": "Aquí està quin aspecte tindrà:",
"emoji_button.activity": "Activitat",
+ "emoji_button.clear": "Neteja",
"emoji_button.custom": "Personalitzat",
"emoji_button.flags": "Banderes",
"emoji_button.food": "Menjar i beure",
@@ -159,32 +162,32 @@
"emoji_button.search": "Cerca...",
"emoji_button.search_results": "Resultats de la cerca",
"emoji_button.symbols": "Símbols",
- "emoji_button.travel": "Viatges i Llocs",
+ "emoji_button.travel": "Viatges i llocs",
"empty_column.account_suspended": "Compte suspès",
"empty_column.account_timeline": "No hi ha publicacions aquí!",
"empty_column.account_unavailable": "Perfil no disponible",
"empty_column.blocks": "Encara no has bloquejat cap usuari.",
- "empty_column.bookmarked_statuses": "Encara no tens desada a marcadors cap publicació. Quan desis una apareixerà aquí.",
- "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per a fer rodar la pilota!",
- "empty_column.direct": "Encara no tens missatges directes. Quan enviïs o rebis un, es mostrarà aquí.",
+ "empty_column.bookmarked_statuses": "Encara no has marcat com publicació com a preferida. Quan en marquis una apareixerà aquí.",
+ "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!",
+ "empty_column.direct": "Encara no tens missatges directes. Quan n'enviïs o en rebis, es mostraran aquí.",
"empty_column.domain_blocks": "Encara no hi ha dominis bloquejats.",
- "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Verifica-ho més tard!",
- "empty_column.favourited_statuses": "Encara no has afavorit cap publicació. Quan ho facis, apareixerà aquí.",
- "empty_column.favourites": "Ningú no ha afavorit aquesta publicació encara. Quan algú ho faci, apareixerà aquí.",
- "empty_column.follow_recommendations": "Sembla que no es poden generar sugerencies per a tu. Pots provar d'emprar la cerca per a trobar gent que voldries conèixer o explorar les etiquetes en tendència.",
+ "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!",
+ "empty_column.favourited_statuses": "Encara no has marcat cap publicació com a preferida. Quan les marquis, apareixeran aquí.",
+ "empty_column.favourites": "Encara ningú no ha marcat aquesta publicació com a preferida. Quan algú ho faci, apareixerà aquí.",
+ "empty_column.follow_recommendations": "Sembla que no s'han pogut generar suggeriments per a tu. Pots provar d'usar la cerca per trobar persones que vulguis conèixer o explorar les etiquetes en tendència.",
"empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan en rebis una, apareixerà aquí.",
"empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
- "empty_column.home": "La teva línia de temps és buida! Segueix més gent per a emplenar-la. {suggestions}",
- "empty_column.home.suggestions": "Mira algunes sugerencies",
+ "empty_column.home": "La teva línia de temps és buida! Segueix més gent per omplir-la. {suggestions}",
+ "empty_column.home.suggestions": "Mira algunes suggeriments",
"empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin noves publicacions, apareixeran aquí.",
- "empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.",
+ "empty_column.lists": "Encara no tens cap llista. Quan en creïs una, apareixerà aquí.",
"empty_column.mutes": "Encara no has silenciat cap usuari.",
- "empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.",
- "empty_column.public": "No hi ha res aquí! Escriu públicament alguna cosa o manualment segueix usuaris d'altres servidors per a omplir-ho",
- "error.unexpected_crash.explanation": "A causa d'un bug en el nostre codi o un problema de compatibilitat del navegador, aquesta pàgina podria no ser mostrada correctament.",
- "error.unexpected_crash.explanation_addons": "Aquesta pàgina podria no mostrar-se correctament. Aquest error és possiblement causat per una extensió del navegador o per eienes automàtiques de traducció.",
- "error.unexpected_crash.next_steps": "Prova recarregant la pàgina. Si això no ajuda, encara podries ser capaç d'utilitzar Mastodon a través d'un navegador diferent o amb una aplicació nativa.",
- "error.unexpected_crash.next_steps_addons": "Prova de desactivar-les i refrescant la pàgina. Si això no ajuda, encara pots ser capaç d’utilitzar Mastodon amb un altre navegador o aplicació nativa.",
+ "empty_column.notifications": "Encara no tens notificacions. Quan altres persones interactuïn amb tu, les veuràs aquí.",
+ "empty_column.public": "Aquí no hi ha res! Escriu públicament alguna cosa o segueix manualment usuaris d'altres servidors per omplir-ho",
+ "error.unexpected_crash.explanation": "A causa d'un error en el nostre codi o d'un problema de compatibilitat amb el navegador, aquesta pàgina no s'ha pogut mostrar correctament.",
+ "error.unexpected_crash.explanation_addons": "Aquesta pàgina no s'ha pogut mostrar correctament. És probable que aquest error sigui causat per un complement del navegador o per eines de traducció automàtica.",
+ "error.unexpected_crash.next_steps": "Prova d'actualitzar la pàgina. Si això no serveix, és possible que encara puguis fer servir Mastodon a través d'un navegador diferent o amb una aplicació nativa.",
+ "error.unexpected_crash.next_steps_addons": "Prova de desactivar-los i actualitza la pàgina. Si això no serveix, és possible que encara puguis fer servir Mastodon amb un altre navegador o una aplicació nativa.",
"errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace al porta-retalls",
"errors.unexpected_crash.report_issue": "Informa d'un problema",
"explore.search_results": "Resultats de la cerca",
@@ -198,16 +201,16 @@
"follow_recommendations.lead": "Les publicacions del usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps Inici. No tinguis por en cometre errors, pots fàcilment deixar de seguir-los en qualsevol moment!",
"follow_request.authorize": "Autoritza",
"follow_request.reject": "Rebutja",
- "follow_requests.unlocked_explanation": "Tot i que el teu compte no està bloquejat, el personal de {domain} ha pensat que és possible que vulguis revisar les sol·licituds de seguiment d’aquests comptes de forma manual.",
+ "follow_requests.unlocked_explanation": "Tot i que el teu compte no està bloquejat, el personal de {domain} ha pensat que és possible que vulguis revisar les sol·licituds de seguiment d’aquests comptes manualment.",
"generic.saved": "Desat",
"getting_started.developers": "Desenvolupadors",
"getting_started.directory": "Directori de perfils",
"getting_started.documentation": "Documentació",
- "getting_started.heading": "Primeres passes",
- "getting_started.invite": "Convida gent",
+ "getting_started.heading": "Primers passos",
+ "getting_started.invite": "Convidar gent",
"getting_started.open_source_notice": "Mastodon és un programari de codi obert. Pots contribuir-hi o informar de problemes a GitHub a {github}.",
"getting_started.security": "Configuració del compte",
- "getting_started.terms": "Termes del servei",
+ "getting_started.terms": "Condicions de servei",
"hashtag.column_header.tag_mode.all": "i {additional}",
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "sense {additional}",
@@ -225,38 +228,38 @@
"intervals.full.days": "{number, plural, one {# dia} other {# dies}}",
"intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
"intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
- "keyboard_shortcuts.back": "Navegar enrere",
+ "keyboard_shortcuts.back": "Anar enrere",
"keyboard_shortcuts.blocked": "Obre la llista d'usuaris bloquejats",
- "keyboard_shortcuts.boost": "Impulsa publicació",
- "keyboard_shortcuts.column": "Centra columna",
- "keyboard_shortcuts.compose": "Centra l'àrea de composició de text",
+ "keyboard_shortcuts.boost": "Impulsa la publicació",
+ "keyboard_shortcuts.column": "Centra la columna",
+ "keyboard_shortcuts.compose": "Centra l'àrea de composició del text",
"keyboard_shortcuts.description": "Descripció",
- "keyboard_shortcuts.direct": "Obre la columna de missatges directes",
- "keyboard_shortcuts.down": "Baixar en la llista",
- "keyboard_shortcuts.enter": "Obre publicació",
- "keyboard_shortcuts.favourite": "Afavorir publicació",
- "keyboard_shortcuts.favourites": "Obre la llista de favorits",
+ "keyboard_shortcuts.direct": "per obrir la columna de missatges directes",
+ "keyboard_shortcuts.down": "Mou-lo avall en la llista",
+ "keyboard_shortcuts.enter": "Obrir publicació",
+ "keyboard_shortcuts.favourite": "Afavoreix la publicació",
+ "keyboard_shortcuts.favourites": "Obre la llista de preferits",
"keyboard_shortcuts.federated": "Obre la línia de temps federada",
"keyboard_shortcuts.heading": "Dreceres de teclat",
- "keyboard_shortcuts.home": "Obre la línia de temps Inici",
+ "keyboard_shortcuts.home": "Obre la línia de temps de l'Inici",
"keyboard_shortcuts.hotkey": "Tecla d'accés directe",
"keyboard_shortcuts.legend": "Mostra aquesta llegenda",
"keyboard_shortcuts.local": "Obre la línia de temps local",
- "keyboard_shortcuts.mention": "Esmenta l'autor",
+ "keyboard_shortcuts.mention": "Mencionar l'autor",
"keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats",
"keyboard_shortcuts.my_profile": "Obre el teu perfil",
"keyboard_shortcuts.notifications": "Obre la columna de notificacions",
- "keyboard_shortcuts.open_media": "Obre mèdia",
- "keyboard_shortcuts.pinned": "Obre la llista de publicacions fixades",
+ "keyboard_shortcuts.open_media": "Obre multimèdia",
+ "keyboard_shortcuts.pinned": "Obrir la llista de publicacions fixades",
"keyboard_shortcuts.profile": "Obre el perfil de l'autor",
- "keyboard_shortcuts.reply": "Respon publicació",
- "keyboard_shortcuts.requests": "Obre la llista de sol·licituds de seguiment",
+ "keyboard_shortcuts.reply": "Respon a la publicació",
+ "keyboard_shortcuts.requests": "Obre la llista de les sol·licituds de seguiment",
"keyboard_shortcuts.search": "Centra la barra de cerca",
"keyboard_shortcuts.spoilers": "Mostra/amaga el camp CW",
- "keyboard_shortcuts.start": "Obre la columna \"Primeres passes\"",
+ "keyboard_shortcuts.start": "Obre la columna \"Primers passos\"",
"keyboard_shortcuts.toggle_hidden": "Mostra/oculta el text marcat com a sensible",
"keyboard_shortcuts.toggle_sensitivity": "Mostra/amaga contingut multimèdia",
- "keyboard_shortcuts.toot": "per a començar un tut nou de trinca",
+ "keyboard_shortcuts.toot": "Iniciar una publicació nova",
"keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca",
"keyboard_shortcuts.up": "Moure amunt en la llista",
"lightbox.close": "Tanca",
@@ -264,42 +267,44 @@
"lightbox.expand": "Amplia el quadre de visualització de l’imatge",
"lightbox.next": "Següent",
"lightbox.previous": "Anterior",
- "lists.account.add": "Afegir a la llista",
- "lists.account.remove": "Treure de la llista",
- "lists.delete": "Esborrar llista",
- "lists.edit": "Editar llista",
- "lists.edit.submit": "Canvi de títol",
- "lists.new.create": "Afegir llista",
- "lists.new.title_placeholder": "Nou títol de llista",
- "lists.replies_policy.followed": "Qualsevol usuari seguit",
+ "limited_account_hint.action": "Mostra el perfil",
+ "limited_account_hint.title": "Aquest perfil ha estat amagat pels moderadors del servidor.",
+ "lists.account.add": "Afegeix a la llista",
+ "lists.account.remove": "Elimina de la llista",
+ "lists.delete": "Esborra la llista",
+ "lists.edit": "Edita la llista",
+ "lists.edit.submit": "Canvia de títol",
+ "lists.new.create": "Afegeix llista",
+ "lists.new.title_placeholder": "Nou títol de la llista",
+ "lists.replies_policy.followed": "Qualsevol usuari que segueixis",
"lists.replies_policy.list": "Membres de la llista",
"lists.replies_policy.none": "Ningú",
"lists.replies_policy.title": "Mostra respostes a:",
- "lists.search": "Cercar entre les persones que segueixes",
+ "lists.search": "Cerca entre les persones que segueixes",
"lists.subheading": "Les teves llistes",
"load_pending": "{count, plural, one {# element nou} other {# elements nous}}",
"loading_indicator.label": "Carregant...",
"media_gallery.toggle_visible": "{number, plural, one {Amaga imatge} other {Amaga imatges}}",
- "missing_indicator.label": "No trobat",
- "missing_indicator.sublabel": "Aquest recurs no pot ser trobat",
+ "missing_indicator.label": "No s'ha trobat",
+ "missing_indicator.sublabel": "Aquest recurs no s'ha trobat",
"mute_modal.duration": "Durada",
- "mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?",
+ "mute_modal.hide_notifications": "Amagar les notificacions d'aquest usuari?",
"mute_modal.indefinite": "Indefinit",
"navigation_bar.apps": "Aplicacions mòbils",
"navigation_bar.blocks": "Usuaris bloquejats",
"navigation_bar.bookmarks": "Marcadors",
- "navigation_bar.community_timeline": "Línia de temps Local",
- "navigation_bar.compose": "Redacta una nova publicació",
+ "navigation_bar.community_timeline": "Línia de temps local",
+ "navigation_bar.compose": "Redactar una nova publicació",
"navigation_bar.direct": "Missatges directes",
"navigation_bar.discover": "Descobrir",
"navigation_bar.domain_blocks": "Dominis bloquejats",
- "navigation_bar.edit_profile": "Editar perfil",
+ "navigation_bar.edit_profile": "Edita el perfil",
"navigation_bar.explore": "Explora",
- "navigation_bar.favourites": "Favorits",
+ "navigation_bar.favourites": "Preferits",
"navigation_bar.filters": "Paraules silenciades",
"navigation_bar.follow_requests": "Sol·licituds de seguiment",
"navigation_bar.follows_and_followers": "Seguits i seguidors",
- "navigation_bar.info": "Quant a aquest servidor",
+ "navigation_bar.info": "Sobre aquest servidor",
"navigation_bar.keyboard_shortcuts": "Dreceres de teclat",
"navigation_bar.lists": "Llistes",
"navigation_bar.logout": "Tancar sessió",
@@ -313,14 +318,14 @@
"notification.favourite": "{name} ha afavorit la teva publicació",
"notification.follow": "{name} et segueix",
"notification.follow_request": "{name} ha sol·licitat seguir-te",
- "notification.mention": "{name} t'ha esmentat",
+ "notification.mention": "{name} t'ha mencionat",
"notification.own_poll": "La teva enquesta ha finalitzat",
- "notification.poll": "Ha finalitzat una enquesta en la que has votat",
- "notification.reblog": "{name} ha impulsat el teu estat",
- "notification.status": "ha publicat {name}",
+ "notification.poll": "Ha finalitzat una enquesta en què has votat",
+ "notification.reblog": "{name} ha impulsat la teva publicació",
+ "notification.status": "{name} acaba de publicar",
"notification.update": "{name} ha editat una publicació",
- "notifications.clear": "Netejar notificacions",
- "notifications.clear_confirmation": "Estàs segur que vols esborrar permanentment totes les teves notificacions?",
+ "notifications.clear": "Esborra les notificacions",
+ "notifications.clear_confirmation": "Segur que vols esborrar permanentment totes les teves notificacions?",
"notifications.column_settings.admin.sign_up": "Nous registres:",
"notifications.column_settings.alert": "Notificacions d'escriptori",
"notifications.column_settings.favourite": "Preferits:",
@@ -337,24 +342,24 @@
"notifications.column_settings.sound": "Reproduir so",
"notifications.column_settings.status": "Noves publicacions:",
"notifications.column_settings.unread_notifications.category": "Notificacions no llegides",
- "notifications.column_settings.unread_notifications.highlight": "Destaca notificacions no llegides",
+ "notifications.column_settings.unread_notifications.highlight": "Destaca les notificacions no llegides",
"notifications.column_settings.update": "Edicions:",
"notifications.filter.all": "Tots",
"notifications.filter.boosts": "Impulsos",
- "notifications.filter.favourites": "Favorits",
+ "notifications.filter.favourites": "Preferits",
"notifications.filter.follows": "Seguiments",
"notifications.filter.mentions": "Mencions",
"notifications.filter.polls": "Resultats de l'enquesta",
"notifications.filter.statuses": "Actualitzacions de gent que segueixes",
"notifications.grant_permission": "Concedir permís.",
"notifications.group": "{count} notificacions",
- "notifications.mark_as_read": "Marca cada notificació com a llegida",
+ "notifications.mark_as_read": "Marca totes les notificacions com a llegides",
"notifications.permission_denied": "Les notificacions d’escriptori no estan disponibles perquè prèviament s’ha denegat el permís al navegador",
- "notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans",
+ "notifications.permission_denied_alert": "No es poden activar les notificacions de l'escriptori perquè el permís del navegador s'ha denegat prèviament",
"notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.",
- "notifications_permission_banner.enable": "Activar les notificacions d’escriptori",
- "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no és obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.",
- "notifications_permission_banner.title": "Mai et perdis res",
+ "notifications_permission_banner.enable": "Activa les notificacions d’escriptori",
+ "notifications_permission_banner.how_to_control": "Per rebre notificacions quan Mastodon no estigui obert, cal activar les notificacions d’escriptori. Pots controlar exactament quins tipus d’interaccions generen notificacions d’escriptori si actives el botó {icon} de dalt.",
+ "notifications_permission_banner.title": "No et perdis mai res",
"picture_in_picture.restore": "Retorna’l",
"poll.closed": "Finalitzada",
"poll.refresh": "Actualitza",
@@ -365,18 +370,18 @@
"poll.votes": "{votes, plural, one {# vot} other {# vots}}",
"poll_button.add_poll": "Afegir una enquesta",
"poll_button.remove_poll": "Elimina l'enquesta",
- "privacy.change": "Ajustar la privacitat de la publicació",
+ "privacy.change": "Canvia la privacitat de la publicació",
"privacy.direct.long": "Visible només per als usuaris esmentats",
- "privacy.direct.short": "Directe",
- "privacy.private.long": "Visible només pels seguidors",
+ "privacy.direct.short": "Només gent mencionada",
+ "privacy.private.long": "Visible només per als seguidors",
"privacy.private.short": "Només seguidors",
- "privacy.public.long": "Visible per a tothom, mostrat en línies de temps públiques",
+ "privacy.public.long": "Visible per tothom",
"privacy.public.short": "Públic",
- "privacy.unlisted.long": "Visible per a tothom però no en les línies de temps públiques",
+ "privacy.unlisted.long": "Visible per tothom però exclosa de les funcions de descobriment",
"privacy.unlisted.short": "No llistat",
"refresh": "Actualitza",
"regeneration_indicator.label": "Carregant…",
- "regeneration_indicator.sublabel": "S'està preparant la teva línia de temps Inici!",
+ "regeneration_indicator.sublabel": "S'està preparant la teva línia de temps d'Inici!",
"relative_time.days": "fa {number} dies",
"relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}",
"relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}",
@@ -388,9 +393,9 @@
"relative_time.minutes": "fa {number} minuts",
"relative_time.seconds": "fa {number} segons",
"relative_time.today": "avui",
- "reply_indicator.cancel": "Cancel·lar",
+ "reply_indicator.cancel": "Cancel·la",
"report.block": "Bloqueja",
- "report.block_explanation": "No veuràs les seves publicacions. Ell no podran veure les teves publicacions ni seguir-te. Ells podran dir que estan bloquejats.",
+ "report.block_explanation": "No veuràs les seves publicacions. Ells no podran veure les teves publicacions ni et podran seguir. Podran saber que estan bloquejats.",
"report.categories.other": "Altres",
"report.categories.spam": "Contingut brossa",
"report.categories.violation": "El contingut viola una o més regles del servidor",
@@ -399,39 +404,39 @@
"report.category.title_account": "perfil",
"report.category.title_status": "publicació",
"report.close": "Fet",
- "report.comment.title": "Hi ha res més que penses hauriem de saber?",
+ "report.comment.title": "Hi ha res més que creguis que hauríem de saber?",
"report.forward": "Reenvia a {target}",
- "report.forward_hint": "Aquest compte és d'un altre servidor. Enviar-hi també una copia anònima del informe?",
+ "report.forward_hint": "Aquest compte és d'un altre servidor. Vols enviar-li també una còpia anònima de l'informe?",
"report.mute": "Silencia",
- "report.mute_explanation": "No veuràs les seves publicacions. Ells encara poden seguir-te i veure les teves publicacions però no sabran que han estat silenciats.",
+ "report.mute_explanation": "No veuràs les seves publicacions. Encara poden seguir-te i veure les teves publicacions, però no sabran que han estat silenciats.",
"report.next": "Següent",
"report.placeholder": "Comentaris addicionals",
"report.reasons.dislike": "No m'agrada",
- "report.reasons.dislike_description": "Això no és quelcom que vulguis veure",
- "report.reasons.other": "Això és una altre cosa",
- "report.reasons.other_description": "El problema no encaixa en altres categories",
- "report.reasons.spam": "Això és contingut brossa",
- "report.reasons.spam_description": "Enllaços maliciosos, compromís falç o respostes repetitives",
+ "report.reasons.dislike_description": "No és una cosa que vulguis veure",
+ "report.reasons.other": "És una altra cosa",
+ "report.reasons.other_description": "El problema no encaixa a les altres categories",
+ "report.reasons.spam": "És contingut brossa",
+ "report.reasons.spam_description": "Enllaços maliciosos, implicació falsa o respostes repetitives",
"report.reasons.violation": "Viola les regles del servidor",
"report.reasons.violation_description": "Ets conscient que trenca regles especifiques",
- "report.rules.subtitle": "Selecciona totes les aplicables",
- "report.rules.title": "Quines regles han estat violades?",
- "report.statuses.subtitle": "Selecciona tots els aplicables",
+ "report.rules.subtitle": "Selecciona tot el que correspongui",
+ "report.rules.title": "Quines regles s'han violat?",
+ "report.statuses.subtitle": "Selecciona tot el que correspongui",
"report.statuses.title": "Hi ha alguna publicació que recolzi aquest informe?",
- "report.submit": "Enviar",
- "report.target": "Informes {target}",
- "report.thanks.take_action": "Aquestes son les teves opcions per a controlar el que veus a Mastodon:",
- "report.thanks.take_action_actionable": "Mentre ho revisem, pots pendre mesures contra @{name}:",
+ "report.submit": "Envia",
+ "report.target": "Denunciant a {target}",
+ "report.thanks.take_action": "Aquestes són les teves opcions per controlar el que veus a Mastodon:",
+ "report.thanks.take_action_actionable": "Mentre ho revisem, pots prendre mesures contra @{name}:",
"report.thanks.title": "No vols veure això?",
- "report.thanks.title_actionable": "Gràcies per informar, ho investigarem.",
- "report.unfollow": "Deixar de seguir @{name}",
- "report.unfollow_explanation": "Estàs seguint aquest compte. Per a no veure més les seves publicacions en la teva línia de temps Inici, deixa de seguir-lo.",
- "search.placeholder": "Cercar",
+ "report.thanks.title_actionable": "Gràcies per denunciar-ho. Ho investigarem.",
+ "report.unfollow": "Deixa de seguir @{name}",
+ "report.unfollow_explanation": "Estàs seguint aquest compte. Per no veure les seves publicacions a la teva línia de temps d'Inici, deixa de seguir-lo.",
+ "search.placeholder": "Cerca",
"search_popout.search_format": "Format de cerca avançada",
- "search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les afavorides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
+ "search_popout.tips.full_text": "El text simple recupera publicacions que has escrit, marcat com a preferides, que has impulsat o on t'han esmentat, així com els usuaris, els noms d'usuaris i les etiquetes.",
"search_popout.tips.hashtag": "etiqueta",
"search_popout.tips.status": "publicació",
- "search_popout.tips.text": "El text simple retorna coincidències amb els noms de visualització, els noms d'usuari i les etiquetes",
+ "search_popout.tips.text": "El text simple recupera coincidències amb els usuaris, els noms d'usuari i les etiquetes",
"search_popout.tips.user": "usuari",
"search_results.accounts": "Gent",
"search_results.all": "Tots",
@@ -441,53 +446,53 @@
"search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.",
"search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
"status.admin_account": "Obre l'interfície de moderació per a @{name}",
- "status.admin_status": "Obre aquesta publicació a la interfície de moderació",
+ "status.admin_status": "Obrir aquesta publicació a la interfície de moderació",
"status.block": "Bloqueja @{name}",
- "status.bookmark": "Marcador",
- "status.cancel_reblog_private": "Desfer l'impuls",
- "status.cannot_reblog": "Aquesta publicació no pot ser impulsada",
- "status.copy": "Copia l'enllaç a l'estat",
+ "status.bookmark": "Afavoreix",
+ "status.cancel_reblog_private": "Desfés l'impuls",
+ "status.cannot_reblog": "Aquesta publicació no es pot impulsar",
+ "status.copy": "Copia l'enllaç a la publicació",
"status.delete": "Esborra",
"status.detailed_status": "Visualització detallada de la conversa",
- "status.direct": "Missatge directe @{name}",
+ "status.direct": "Envia missatge directe a @{name}",
"status.edit": "Edita",
"status.edited": "Editat {date}",
"status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
- "status.embed": "Incrustat",
+ "status.embed": "Incrusta",
"status.favourite": "Favorit",
"status.filtered": "Filtrat",
"status.history.created": "{name} ha creat {date}",
"status.history.edited": "{name} ha editat {date}",
- "status.load_more": "Carrega més",
- "status.media_hidden": "Multimèdia amagat",
- "status.mention": "Esmentar @{name}",
+ "status.load_more": "Carregar-ne més",
+ "status.media_hidden": "Multimèdia amagada",
+ "status.mention": "Esmenta @{name}",
"status.more": "Més",
- "status.mute": "Silenciar @{name}",
- "status.mute_conversation": "Silenciar conversació",
- "status.open": "Ampliar aquest estat",
+ "status.mute": "Silencia @{name}",
+ "status.mute_conversation": "Silencia la conversa",
+ "status.open": "Amplia la publicació",
"status.pin": "Fixa en el perfil",
"status.pinned": "Publicació fixada",
- "status.read_more": "Llegir més",
- "status.reblog": "Impuls",
- "status.reblog_private": "Impulsar amb la visibilitat original",
+ "status.read_more": "Més informació",
+ "status.reblog": "Impulsa",
+ "status.reblog_private": "Impulsa amb la visibilitat original",
"status.reblogged_by": "{name} ha impulsat",
"status.reblogs.empty": "Encara ningú no ha impulsat aquesta publicació. Quan algú ho faci, apareixeran aquí.",
- "status.redraft": "Esborrar i reescriure",
+ "status.redraft": "Esborra-la i reescriure-la",
"status.remove_bookmark": "Suprimeix el marcador",
- "status.reply": "Respondre",
- "status.replyAll": "Respondre al fil",
- "status.report": "Informar sobre @{name}",
+ "status.reply": "Respon",
+ "status.replyAll": "Respon al fil",
+ "status.report": "Denuncia @{name}",
"status.sensitive_warning": "Contingut sensible",
- "status.share": "Compartir",
- "status.show_less": "Mostra menys",
- "status.show_less_all": "Mostra menys per a tot",
- "status.show_more": "Mostra més",
- "status.show_more_all": "Mostra més per a tot",
+ "status.share": "Comparteix",
+ "status.show_less": "Mostrar-ne menys",
+ "status.show_less_all": "Mostrar-ne menys per a tot",
+ "status.show_more": "Mostrar-ne més",
+ "status.show_more_all": "Mostrar-ne més per a tot",
"status.show_thread": "Mostra el fil",
"status.uncached_media_warning": "No està disponible",
- "status.unmute_conversation": "Activar conversació",
- "status.unpin": "Deslliga del perfil",
- "suggestions.dismiss": "Descartar suggeriment",
+ "status.unmute_conversation": "No silenciïs la conversa",
+ "status.unpin": "No fixis al perfil",
+ "suggestions.dismiss": "Ignora el suggeriment",
"suggestions.header": "És possible que estiguis interessat en…",
"tabs_bar.federated_timeline": "Federat",
"tabs_bar.home": "Inici",
@@ -502,23 +507,24 @@
"timeline_hint.remote_resource_not_displayed": "{resource} dels altres servidors no son mostrats.",
"timeline_hint.resources.followers": "Seguidors",
"timeline_hint.resources.follows": "Seguiments",
- "timeline_hint.resources.statuses": "Tuts més antics",
- "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persones}} parlant-hi",
- "trends.trending_now": "Ara en tendència",
+ "timeline_hint.resources.statuses": "Publicacions més antigues",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persones}} parlant-ne",
+ "trends.trending_now": "En tendència",
"ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.",
"units.short.billion": "{count}B",
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
- "upload_area.title": "Arrossega i deixa anar per a carregar",
- "upload_button.label": "Afegir mèdia, un vídeo o un fitxer d'audio",
+ "upload_area.title": "Arrossega i deixa anar per carregar",
+ "upload_button.label": "Afegeix imatges, un vídeo o un fitxer d'àudio",
"upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
- "upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.",
- "upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva",
- "upload_form.description": "Descriure per els que tenen problemes visuals",
+ "upload_error.poll": "No es permet carregar fitxers a les enquestes.",
+ "upload_form.audio_description": "Descripció per a persones amb discapacitat auditiva",
+ "upload_form.description": "Descripció per a persones amb discapacitat visual",
+ "upload_form.description_missing": "No s'ha afegit cap descripció",
"upload_form.edit": "Edita",
"upload_form.thumbnail": "Canvia la miniatura",
"upload_form.undo": "Esborra",
- "upload_form.video_description": "Descriu per a les persones amb pèrdua auditiva o deficiència visual",
+ "upload_form.video_description": "Descripció per a persones amb discapacitat auditiva o amb discapacitat visual",
"upload_modal.analyzing_picture": "Analitzant imatge…",
"upload_modal.apply": "Aplica",
"upload_modal.applying": "Aplicant…",
@@ -526,18 +532,18 @@
"upload_modal.description_placeholder": "Una ràpida guineu marró salta sobre el gos mandrós",
"upload_modal.detect_text": "Detecta el text de l'imatge",
"upload_modal.edit_media": "Editar multimèdia",
- "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.",
+ "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible en totes les miniatures.",
"upload_modal.preparing_ocr": "Preparant OCR…",
"upload_modal.preview_label": "Previsualitza ({ratio})",
"upload_progress.label": "Pujant...",
- "video.close": "Tancar el vídeo",
+ "video.close": "Tanca el vídeo",
"video.download": "Descarrega l’arxiu",
- "video.exit_fullscreen": "Sortir de pantalla completa",
- "video.expand": "Ampliar el vídeo",
+ "video.exit_fullscreen": "Surt de la pantalla completa",
+ "video.expand": "Amplia el vídeo",
"video.fullscreen": "Pantalla completa",
- "video.hide": "Amaga vídeo",
- "video.mute": "Silenciar el so",
+ "video.hide": "Amaga el vídeo",
+ "video.mute": "Silencia el so",
"video.pause": "Pausa",
- "video.play": "Reproduir",
- "video.unmute": "Activar so"
+ "video.play": "Reprodueix",
+ "video.unmute": "Activa el so"
}
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index 7209633ad..e7c4dab71 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -18,12 +18,12 @@
"account.followers": "شوێنکەوتووان",
"account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
"account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
- "account.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.following": "دواکەوتن",
+ "account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
"account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
"account.follows_you": "شوێنکەوتووەکانت",
"account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
- "account.joined": "Joined {date}",
+ "account.joined": "بەشداری {date}",
"account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
"account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
"account.media": "میدیا",
@@ -41,18 +41,18 @@
"account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
"account.unblock": "@{name} لاببە",
"account.unblock_domain": "کردنەوەی دۆمەینی {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "لابردنی بەربەست",
"account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە",
"account.unfollow": "بەدوادانەچو",
"account.unmute": "بێدەنگکردنی @{name}",
"account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "بێدەنگی مەکە",
"account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی ڕۆژ دوای ناو تۆمارکردن",
+ "admin.dashboard.monthly_retention": "ڕێژەی مانەوەی بەکارهێنەر بەپێی مانگ دوای ناو تۆمارکردن",
+ "admin.dashboard.retention.average": "ڕێژە",
+ "admin.dashboard.retention.cohort": "چوونەژوورەوەی مانگانە",
+ "admin.dashboard.retention.cohort_size": "ئەندامی نوێ",
"alert.rate_limited.message": "تکایە هەوڵبدەرەوە دوای {retry_time, time, medium}.",
"alert.rate_limited.title": "ڕێژەی سنووردار",
"alert.unexpected.message": "هەڵەیەکی چاوەڕوان نەکراو ڕوویدا.",
@@ -70,7 +70,7 @@
"column.blocks": "بەکارهێنەرە بلۆککراوەکان",
"column.bookmarks": "نیشانەکان",
"column.community": "هێڵی کاتی ناوخۆیی",
- "column.direct": "نامە ڕاستەوخۆکان",
+ "column.direct": "نامە ڕاستەوخۆ",
"column.directory": "گەڕان لە پرۆفایلەکان",
"column.domain_blocks": "دۆمەینە داخراوەکان",
"column.favourites": "دڵخوازترینەکان",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "تەنها خۆماڵی",
"community.column_settings.media_only": "تەنها میدیا",
"community.column_settings.remote_only": "تەنها بۆ دوور",
- "compose_form.direct_message_warning": "ئەم توتە تەنیا بۆ بەکارهێنەرانی ناوبراو دەنێردرێت.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "زیاتر فێربه",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
"compose_form.lock_disclaimer": "هەژمێرەکەی لە حاڵەتی {locked}. هەر کەسێک دەتوانێت شوێنت بکەوێت بۆ پیشاندانی بابەتەکانی تەنها دوایخۆی.",
"compose_form.lock_disclaimer.lock": "قفڵ دراوە",
@@ -104,9 +106,9 @@
"compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
"compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
"compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
- "compose_form.publish": "توت",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
"compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
"compose_form.sensitive.marked": "وادەی کۆتایی",
"compose_form.sensitive.unmarked": "میدیا وەک هەستیار نیشان نەکراوە",
@@ -121,8 +123,8 @@
"confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
"confirmations.delete_list.confirm": "سڕینەوە",
"confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "ڕەتکردنەوە",
+ "confirmations.discard_edit_media.message": "گۆڕانکاریت لە وەسف یان پێشبینی میدیادا هەڵنەگیراوە، بەهەر حاڵ فڕێیان بدە؟",
"confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
"confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
"confirmations.logout.confirm": "چوونە دەرەوە",
@@ -147,6 +149,7 @@
"embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
"embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
"emoji_button.activity": "چالاکی",
+ "emoji_button.clear": "ڕوون",
"emoji_button.custom": "ئاسایی",
"emoji_button.flags": "ئاڵاکان",
"emoji_button.food": "خواردن& خواردنەوە",
@@ -160,22 +163,22 @@
"emoji_button.search_results": "ئەنجامەکانی گەڕان",
"emoji_button.symbols": "هێماکان",
"emoji_button.travel": "گەشت & شوێنەکان",
- "empty_column.account_suspended": "Account suspended",
- "empty_column.account_timeline": "لێرە هیچ توتەک نییە!",
+ "empty_column.account_suspended": "هەژمار ڕاگیرا",
+ "empty_column.account_timeline": "لێرە هیچ نووسراوە نییە!",
"empty_column.account_unavailable": "پرۆفایل بەردەست نیە",
"empty_column.blocks": "تۆ هێشتا هیچ بەکارهێنەرێکت بلۆک نەکردووە.",
"empty_column.bookmarked_statuses": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
"empty_column.community": "هێڵی کاتی ناوخۆیی بەتاڵە. شتێک بە ئاشکرا بنووسە بۆ ئەوەی تۆپەکە بسووڕێت!",
- "empty_column.direct": "تۆ هیچ نامەی ڕاستەوخۆت نیە تا ئێستا. کاتێک دانەیەک دەنێریت یان وەرت دەگرێت، لێرە پیشان دەدات.",
+ "empty_column.direct": "تا ئێستا هیچ نامەیەکی ڕاستەوخۆت نییە. کاتێک یەکێکیان دەنێری یان وەریدەگریت، لێرە دەردەکەوێت.",
"empty_column.domain_blocks": "هێشتا هیچ دۆمەینێکی بلۆک کراو نییە.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "لە ئێستادا هیچ شتێک ترێند نییە. دواتر سەیری بکە!",
"empty_column.favourited_statuses": "تۆ هێشتا هیچ توتێکی دڵخوازت نییە، کاتێک حەزت لە دانەیەکی باشە، لێرە دەرئەکەویت.",
"empty_column.favourites": "کەس ئەم توتەی دڵخواز نەکردووە،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_recommendations": "پێدەچێت هیچ پێشنیارێک بۆ تۆ دروست نەکرێت. دەتوانیت هەوڵبدەیت گەڕان بەکاربهێنیت بۆ گەڕان بەدوای ئەو کەسانەی کە ڕەنگە بیانناسیت یان بەدوای هاشتاگە ڕەوتەکاندا بگەڕێیت.",
"empty_column.follow_requests": "تۆ هێشتا هیچ داواکارییەکی بەدواداچووت نیە. کاتێک یەکێکت بۆ هات، لێرە دەرئەکەویت.",
"empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.",
"empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.",
- "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.home.suggestions": "چەند پێشنیارێک ببینە",
"empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.",
"empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.",
"empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.",
@@ -187,15 +190,15 @@
"error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.",
"errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
"errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
- "follow_recommendations.done": "Done",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "explore.search_results": "ئەنجامەکانی گەڕان",
+ "explore.suggested_follows": "بۆ تۆ",
+ "explore.title": "گەڕان",
+ "explore.trending_links": "هەواڵەکان",
+ "explore.trending_statuses": "نووسراوەکان",
+ "explore.trending_tags": "هاشتاگ",
+ "follow_recommendations.done": "تەواو",
+ "follow_recommendations.heading": "شوێن ئەو کەسانە بکەون کە دەتەوێت پۆستەکان ببینیت لە! لێرەدا چەند پێشنیارێک هەیە.",
+ "follow_recommendations.lead": "بابەتەکانی ئەو کەسانەی کە بەدوایدا دەگەڕێیت بە فەرمانی کرۆنۆلۆجی لە خواردنەکانی ماڵەکەت دەردەکەون. مەترسە لە هەڵەکردن، دەتوانیت بە ئاسانی خەڵک هەڵبکەیت هەر کاتێک!",
"follow_request.authorize": "دهسهڵاتپێدراو",
"follow_request.reject": "ڕەتکردنەوە",
"follow_requests.unlocked_explanation": "هەرچەندە هەژمارەکەت داخراو نییە، ستافی {domain} وا بیریان کردەوە کە لەوانەیە بتانەوێت پێداچوونەوە بە داواکاریەکانی ئەم هەژمارەدا بکەن بە دەستی.",
@@ -264,6 +267,8 @@
"lightbox.expand": "فراوانکردنی سندوقی بینینی وێنە",
"lightbox.next": "داهاتوو",
"lightbox.previous": "پێشوو",
+ "limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە",
+ "limited_account_hint.title": "ئەم پرۆفایلییە لەلایەن بەڕێوەبەرانی سێرڤەرەکەتەوە شاراوەتەوە.",
"lists.account.add": "زیادکردن بۆ لیست",
"lists.account.remove": "لابردن لە لیست",
"lists.delete": "سڕینەوەی لیست",
@@ -271,13 +276,13 @@
"lists.edit.submit": "گۆڕینی ناونیشان",
"lists.new.create": "زیادکردنی لیست",
"lists.new.title_placeholder": "ناونیشانی لیستی نوێ",
- "lists.replies_policy.followed": "Any followed user",
- "lists.replies_policy.list": "Members of the list",
- "lists.replies_policy.none": "No one",
+ "lists.replies_policy.followed": "هەر بەکارهێنەرێکی بەدواکەوتوو",
+ "lists.replies_policy.list": "ئەندامانی لیستەکە",
+ "lists.replies_policy.none": "هیچکەس",
"lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:",
"lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
"lists.subheading": "لیستەکانت",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "load_pending": "{count, plural, one {# بەڕگەی نوێ} other {# بەڕگەی نوێ}}",
"loading_indicator.label": "بارکردن...",
"media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
"missing_indicator.label": "نەدۆزرایەوە",
@@ -290,11 +295,11 @@
"navigation_bar.bookmarks": "نیشانکراوەکان",
"navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
"navigation_bar.compose": "نووسینی توتی نوێ",
- "navigation_bar.direct": "نامە ڕاستەوخۆکان",
+ "navigation_bar.direct": "نامە ڕاستەوخۆ",
"navigation_bar.discover": "دۆزینەوە",
"navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
"navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "گەڕان",
"navigation_bar.favourites": "دڵخوازەکان",
"navigation_bar.filters": "وشە کپەکان",
"navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
@@ -309,7 +314,7 @@
"navigation_bar.preferences": "پەسەندەکان",
"navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
"navigation_bar.security": "ئاسایش",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "{name} تۆمارکرا",
"notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
"notification.follow": "{name} دوای تۆ کەوت",
"notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت",
@@ -318,15 +323,15 @@
"notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
"notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
"notification.status": "{name} تازە بڵاوکرایەوە",
- "notification.update": "{name} edited a post",
+ "notification.update": "{name} پۆستێکی دەستکاریکرد",
"notifications.clear": "ئاگانامەکان بسڕیەوە",
"notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "چوونەژوورەوەی نوێ:",
"notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
"notifications.column_settings.favourite": "دڵخوازترین:",
"notifications.column_settings.filter_bar.advanced": "هەموو پۆلەکان پیشان بدە",
"notifications.column_settings.filter_bar.category": "شریتی پاڵێوەری خێرا",
- "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.filter_bar.show_bar": "نیشاندانی شریتی پاڵافتن",
"notifications.column_settings.follow": "شوێنکەوتوانی نوێ:",
"notifications.column_settings.follow_request": "شوینکەوتنی داواکاری نوێ:",
"notifications.column_settings.mention": "ئاماژەکان:",
@@ -336,22 +341,22 @@
"notifications.column_settings.show": "لە ستووندا پیشان بدە",
"notifications.column_settings.sound": "لێدانی دەنگ",
"notifications.column_settings.status": "توتەکانی نوێ:",
- "notifications.column_settings.unread_notifications.category": "Unread notifications",
- "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.unread_notifications.category": "ئاگاداریی نەبینراو",
+ "notifications.column_settings.unread_notifications.highlight": "تیشک بخە سەر ئاگاداری نەخوێنراو",
+ "notifications.column_settings.update": "دەستکاری:",
"notifications.filter.all": "هەموو",
"notifications.filter.boosts": "دووبارەتوتەکان",
"notifications.filter.favourites": "دڵخوازەکان",
- "notifications.filter.follows": "شوێنکەوتن",
+ "notifications.filter.follows": "بەدواداچوون",
"notifications.filter.mentions": "ئاماژەکان",
"notifications.filter.polls": "ئەنجامەکانی ڕاپرسی",
"notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت",
- "notifications.grant_permission": "Grant permission.",
+ "notifications.grant_permission": "مۆڵەت بدە.",
"notifications.group": "{count} ئاگانامە",
"notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە",
"notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.",
"notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+ "notifications.permission_required": "ئاگادارکردنەوەکانی سەر مێز بەردەست نین چونکە مۆڵەتی پێویست نەدراوە.",
"notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ",
"notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.",
"notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە",
@@ -362,70 +367,70 @@
"poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
"poll.vote": "دەنگ",
"poll.voted": "تۆ دەنگت بەو وەڵامە دا",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# دەنگ} other {# دەنگ}}",
"poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
"poll_button.remove_poll": "دهنگدان بسڕهوه",
"privacy.change": "ڕێکخستنی تایبەتمەندی توت",
"privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
- "privacy.direct.short": "ڕاستەوخۆ",
+ "privacy.direct.short": "تەنها کەسانی باس کراو",
"privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
- "privacy.private.short": "تەنها بۆ شوێنکەوتوان",
- "privacy.public.long": "بۆ هەمووان دیاربێت، لە هێڵی کاتی گشتی دا نیشان دەدرێت",
+ "privacy.private.short": "تەنیا شوێنکەوتووان",
+ "privacy.public.long": "بۆ هەمووان دیارە",
"privacy.public.short": "گشتی",
- "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە هێڵی کاتی گشتیدا نا",
+ "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە تایبەتمەندییەکانی دۆزینەوە دەرچووە",
"privacy.unlisted.short": "لە لیست نەکراو",
"refresh": "نوێکردنەوە",
"regeneration_indicator.label": "بارکردن…",
"regeneration_indicator.sublabel": "ڕاگەیەنەری ماڵەوەت ئامادە دەکرێت!",
"relative_time.days": "{number}ڕۆژ",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە",
+ "relative_time.full.hours": "{number, plural, one {# کاتژمێر} other {# کاتژمێر}} ماوە",
+ "relative_time.full.just_now": "ئێستا",
+ "relative_time.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}} ماوە",
+ "relative_time.full.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
"relative_time.hours": "{number}کات",
"relative_time.just_now": "ئێستا",
"relative_time.minutes": "{number}کات",
"relative_time.seconds": "{number}کات",
"relative_time.today": "ئیمڕۆ",
"reply_indicator.cancel": "هەڵوەشاندنەوه",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
- "report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.block": "بلۆک",
+ "report.block_explanation": "تۆ پۆستەکانیان نابینیت. ئەوان ناتوانن بابەتەکانتان ببینن یان شوێنتان بکەون. ئەوان دەتوانن بڵێن کە بەربەستکراون.",
+ "report.categories.other": "هی تر",
+ "report.categories.spam": "سپام",
+ "report.categories.violation": "ناوەڕۆک یەک یان زیاتر لە یاساکانی سێرڤەر پێشێل دەکات",
+ "report.category.subtitle": "باشترین هاوتا هەڵبژێرە",
+ "report.category.title": "پێمان بڵێ بە {type} چی ڕوودەدات",
+ "report.category.title_account": "پرۆفایل",
+ "report.category.title_status": "پۆست",
+ "report.close": "تەواو",
+ "report.comment.title": "ئایا هیچ شتێکی تر هەیە کە پێت وایە ئێمە دەبێت بزانین?",
"report.forward": "ناردن بۆ {target}",
"report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "بێدەنگ",
+ "report.mute_explanation": "تۆ پۆستەکانیان نابینیت. ئەوان هێشتا دەتوانن شوێنتان بکەون و پۆستەکانتان ببینن و نازانن کە ئەوان بێ دەنگن.",
+ "report.next": "دواتر",
"report.placeholder": "سەرنجەکانی زیاتر",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "حەزم لێی نییە",
+ "report.reasons.dislike_description": "ئەوە شتێک نیە کە دەتەوێت بیبینیت",
+ "report.reasons.other": "شتێکی ترە",
+ "report.reasons.other_description": "کێشەکە ناگونجێت بۆ هاوپۆلەکانی تر",
+ "report.reasons.spam": "ئەوە سپامە",
+ "report.reasons.spam_description": "لینکە خراپەکان، بەشداری ساختە، یان وەڵامدانەوەی دووبارە",
+ "report.reasons.violation": "یاساکانی سێرڤەر پێشێل دەکات",
+ "report.reasons.violation_description": "ئاگاداری ئەوەن کە یاسا تایبەتەکان دەشکێنێت",
+ "report.rules.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە",
+ "report.rules.title": "کام یاسا پێشێل دەکرێت؟",
+ "report.statuses.subtitle": "هەموو ئەوانەی کە کاریان پێدەکرێت هەڵبژێرە",
+ "report.statuses.title": "ئایا هیچ پۆستێک هەیە کە پشتگیری ئەم ڕاپۆرتە بکات؟",
"report.submit": "ناردن",
"report.target": "گوزارشتکردنی{target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "لێرەدا بژاردەکانت بۆ کۆنترۆڵکردنی ئەو شتانە دەخەینەڕوو کە لە ماستۆدۆن دەیبینیت:",
+ "report.thanks.take_action_actionable": "لە کاتێکدا ئێمە پێداچوونەوە بەم بابەتە دەکەین، دەتوانیت ڕێوشوێن بگریتەبەر دژی @{name}:",
+ "report.thanks.title": "ناتەوێت ئەمە ببینیت؟",
+ "report.thanks.title_actionable": "سوپاس بۆ ڕاپۆرتکردن، ئێمە سەیری ئەم بابەتە دەکەین.",
+ "report.unfollow": "بەدوادانەچوو@{name}",
+ "report.unfollow_explanation": "تۆ شوێنکەوتووی ئەم هەژماررەی دەکەیت. بۆ ئەوەی چیتر نووسراوەکانیان لە هۆم فیدی خۆت نەبینی، بەدوایان مەچۆ.",
"search.placeholder": "گەڕان",
"search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
"search_popout.tips.full_text": "گەڕانێکی دەقی سادە دەتوانێت توتەکانی ئێوە کە، نووسیوتانە،پەسەنتان کردووە، دووبارەتانکردووە، یان ئەو توتانە کە باسی ئێوەی تێدا کراوە پەیدا دەکا. هەروەها ناوی بەکارهێنەران، ناوی پیشاندراو و هەشتەگەکانیش لە خۆ دەگرێت.",
@@ -434,7 +439,7 @@
"search_popout.tips.text": "دەقی سادە هەڵدەسێ بە گەڕاندنەوەی هاوتایی ناوی پیشاندان، ناوی بەکارهێنەر و هاشتاگەکان",
"search_popout.tips.user": "بەکارهێنەر",
"search_results.accounts": "خەڵک",
- "search_results.all": "All",
+ "search_results.all": "هەموو",
"search_results.hashtags": "هەشتاگ",
"search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "توتەکان",
@@ -442,7 +447,7 @@
"search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
"status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
"status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
- "status.block": "بلۆکی @{name}",
+ "status.block": "@{name} ئاستەنگ بکە",
"status.bookmark": "نیشانه",
"status.cancel_reblog_private": "بێبەهێزکردن",
"status.cannot_reblog": "ئەم بابەتە ناتوانرێت بەرزبکرێتەوە",
@@ -450,20 +455,20 @@
"status.delete": "سڕینەوە",
"status.detailed_status": "ڕوانگەی گفتوگۆ بە وردەکاری",
"status.direct": "پەیامی ڕاستەوخۆ @{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edit": "دەستکاری",
+ "status.edited": "بەشداری {date}",
+ "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
"status.embed": "نیشتەجێ بکە",
"status.favourite": "دڵخواز",
"status.filtered": "پاڵاوتن",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
- "status.load_more": "بارکردنی زیاتر",
+ "status.history.created": "{name} دروستکراوە لە{date}",
+ "status.history.edited": "{name} دروستکاریکراوە لە{date}",
+ "status.load_more": "زیاتر بار بکە",
"status.media_hidden": "میدیای شاراوە",
"status.mention": "ناوبنێ @{name}",
"status.more": "زیاتر",
- "status.mute": "بێدەنگکردن @{name}",
- "status.mute_conversation": "گفتوگۆی بێدەنگ",
+ "status.mute": "@{name} بێدەنگ بکە",
+ "status.mute_conversation": "بێدەنگی بکە",
"status.open": "ئەم توتە فراوان بکە",
"status.pin": "لکاندن لەسەر پرۆفایل",
"status.pinned": "توتی چەسپکراو",
@@ -478,58 +483,59 @@
"status.replyAll": "بە نووسراوە وەڵام بدەوە",
"status.report": "گوزارشت @{name}",
"status.sensitive_warning": "ناوەڕۆکی هەستیار",
- "status.share": "هاوبەش کردن",
+ "status.share": "هاوبەشی بکە",
"status.show_less": "کەمتر نیشان بدە",
- "status.show_less_all": "کەمتر نیشان بدە بۆ هەمووی",
- "status.show_more": "زیاتر پیشان بدە",
+ "status.show_less_all": "هەمووی بچووک بکەوە",
+ "status.show_more": "زیاتر نیشان بدە",
"status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی",
"status.show_thread": "نیشاندانی گفتوگۆ",
"status.uncached_media_warning": "بەردەست نیە",
"status.unmute_conversation": "گفتوگۆی بێدەنگ",
- "status.unpin": "لابردن لە پرۆفایل",
+ "status.unpin": "لە سەرەوە لایبە",
"suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
"suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
"tabs_bar.federated_timeline": "گشتی",
"tabs_bar.home": "سەرەتا",
"tabs_bar.local_timeline": "ناوخۆیی",
"tabs_bar.notifications": "ئاگادارییەکان",
- "tabs_bar.search": "گەڕان",
+ "tabs_bar.search": "بگەڕێ",
"time_remaining.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژ}} ماوە",
- "time_remaining.hours": "{number, plural, one {# کات} other {# کات}} ماوە",
- "time_remaining.minutes": "{number, plural, one {# خۆلەک} other {# خولەک}} ماوە",
- "time_remaining.moments": "ئەو ساتانەی ماونەتەوە",
+ "time_remaining.hours": "{number, plural, one {# کاتژمێر} other {# کاتژمێر}} ماوە",
+ "time_remaining.minutes": "{number, plural, one {# خولەک} other {# خولەک}} ماوە",
+ "time_remaining.moments": "کاتی ماوە",
"time_remaining.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
"timeline_hint.remote_resource_not_displayed": "{resource} لە ڕاژەکانی ترەوە پیشان نادرێت.",
- "timeline_hint.resources.followers": "شوێنکەوتووان",
+ "timeline_hint.resources.followers": "شوێنکەوتوو",
"timeline_hint.resources.follows": "شوێنکەوتن",
- "timeline_hint.resources.statuses": "توتی کۆن",
+ "timeline_hint.resources.statuses": "نێردراوی کۆن",
"trends.counter_by_accounts": "{count, plural, one {{counter} کەس} other {{counter} کەس}} گفتوگۆ دەکا",
- "trends.trending_now": "گۆگران",
- "ui.beforeunload": "ڕەشنووسەکەت لە دەست دەچێت ئەگەر لە ماستۆدۆن بڕۆیت.",
- "units.short.billion": "{count}ملیار",
- "units.short.million": "{count}ملیۆن",
- "units.short.thousand": "{count}هەزار",
- "upload_area.title": "ڕاکێشان & دانان بۆ بارکردن",
- "upload_button.label": "زیادکردنی وێنەکان، ڤیدیۆیەک یان فایلێکی دەنگی",
- "upload_error.limit": "سنووری بارکردنی فایل تێپەڕیوە.",
- "upload_error.poll": "پەڕگەکە ڕێی پێنەدراوە بە ڕاپرسی باربکرێت.",
- "upload_form.audio_description": "بۆ ئەو کەسانەی کە گوێ بیستیان هەیە وەسف دەکات",
- "upload_form.description": "وەسف بکە بۆ کەمبینایان",
+ "trends.trending_now": "ڕۆژەڤ",
+ "ui.beforeunload": "ڕەشنووسەکەت لەدەست دەچێت ئەگەر ماستۆدۆن جێ بهێڵیت.",
+ "units.short.billion": "{count} ملیار",
+ "units.short.million": "{count} ملیۆن",
+ "units.short.thousand": "{count} هەزار",
+ "upload_area.title": "فایلەکانت ڕابکێشە ئێرە بۆ بەرزکردنەوەیان",
+ "upload_button.label": "وێنە، ڤیدیۆ یان پەیامی دەنگی زیاد بکە",
+ "upload_error.limit": "سنووری بەرزکردنەوەت بەزاندووە.",
+ "upload_error.poll": "فایل و ڕاپرسی پێکەوە ڕێپێنەدراون.",
+ "upload_form.audio_description": "پەیامەکەت بۆ نابیستەکان",
+ "upload_form.description": "پەیامەکەت بۆ نابیناکان",
+ "upload_form.description_missing": "هیچ وەسفێک زیاد نەکراوە",
"upload_form.edit": "دەستکاری",
"upload_form.thumbnail": "گۆڕانی وینۆچکە",
- "upload_form.undo": "سڕینەوە",
- "upload_form.video_description": "بۆ کەم بینایان و کەم بیستان وەسفی بکە",
- "upload_modal.analyzing_picture": "شیکردنەوەی وێنە…",
- "upload_modal.apply": "جێبەجێ کردن",
- "upload_modal.applying": "Applying…",
+ "upload_form.undo": "بیسڕەوە",
+ "upload_form.video_description": "پەیامەکەت بۆ نابیست و نابیناکان",
+ "upload_modal.analyzing_picture": "وێنەکە شی دەکرێتەوە…",
+ "upload_modal.apply": "بیسەپێنە",
+ "upload_modal.applying": "داواکاری…",
"upload_modal.choose_image": "وێنە هەڵبژێرە",
"upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
- "upload_modal.detect_text": "دەقی وێنەکە بدۆزیەوە",
+ "upload_modal.detect_text": "نووسینی ناو وێنەکە دەستنیشان بکە",
"upload_modal.edit_media": "دەستکاریکردنی میدیا",
"upload_modal.hint": "گەر وێنە چکۆلە یان بڕاوەبێت، خاڵی ناوەندی دیار دەکەوێت. خاڵی ناوەندی وێنە بە کرتە یان جێبەجیکردنی رێکبخەن.",
- "upload_modal.preparing_ocr": "ئامادەکردنی OCR…",
- "upload_modal.preview_label": "پێشبینی ({ratio})",
- "upload_progress.label": "بارکردن...",
+ "upload_modal.preparing_ocr": "نووسینەکە دەستنیشان دەکرێت…",
+ "upload_modal.preview_label": "پێشبینین ({ratio})",
+ "upload_progress.label": "بار دەکرێت...",
"video.close": "داخستنی ڤیدیۆ",
"video.download": "داگرتنی فایل",
"video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
@@ -538,6 +544,6 @@
"video.hide": "شاردنەوەی ڤیدیۆ",
"video.mute": "دەنگی کپ",
"video.pause": "وەستان",
- "video.play": "پەخشکردن",
- "video.unmute": "دەنگ لابدە"
+ "video.play": "لێی بدە",
+ "video.unmute": "بێدەنگی مەکە"
}
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 21240bc3b..9172aea2e 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -70,7 +70,7 @@
"column.blocks": "Utilizatori bluccati",
"column.bookmarks": "Segnalibri",
"column.community": "Linea pubblica lucale",
- "column.direct": "Missaghji diretti",
+ "column.direct": "Direct messages",
"column.directory": "Percorre i prufili",
"column.domain_blocks": "Duminii piattati",
"column.favourites": "Favuriti",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Solu lucale",
"community.column_settings.media_only": "Solu media",
"community.column_settings.remote_only": "Solu distante",
- "compose_form.direct_message_warning": "Solu l'utilizatori mintuvati puderenu vede stu statutu.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Amparà di più",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Stu statutu ùn hè \"Micca listatu\" è ùn sarà micca listatu indè e circate da hashtag. Per esse vistu in quesse, u statutu deve esse \"Pubblicu\".",
"compose_form.lock_disclaimer": "U vostru contu ùn hè micca {locked}. Tuttu u mondu pò seguitavi è vede i vostri statuti privati.",
"compose_form.lock_disclaimer.lock": "privatu",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Toglie sta scelta",
"compose_form.poll.switch_to_multiple": "Cambià u scandagliu per accittà parechje scelte",
"compose_form.poll.switch_to_single": "Cambià u scandagliu per ùn accittà ch'una scelta",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Indicà u media cum'è sensibile} other {Indicà i media cum'è sensibili}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.",
"embed.preview": "Hà da parè à quessa:",
"emoji_button.activity": "Attività",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Persunalizati",
"emoji_button.flags": "Bandere",
"emoji_button.food": "Manghjusca è Bienda",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Per avà ùn avete bluccatu manc'un utilizatore.",
"empty_column.bookmarked_statuses": "Ùn avete manc'un segnalibru. Quandu aghjunghjerate unu, sarà mustratu quì.",
"empty_column.community": "Ùn c'hè nunda indè a linea lucale. Scrivete puru qualcosa!",
- "empty_column.direct": "Ùn avete ancu nisun missaghju direttu. S'è voi mandate o ricevete unu, u vidarete quì.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Ùn c'hè manc'un duminiu bluccatu avà.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Ùn avete manc'unu statutu favuritu. Quandu aghjunghjerate unu à i vostri favuriti, sarà mustratu quì.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "fucalizà un statutu indè una colonna",
"keyboard_shortcuts.compose": "fucalizà nant'à l'area di ridazzione",
"keyboard_shortcuts.description": "Descrizzione",
- "keyboard_shortcuts.direct": "per apre una culonna di missaghji diretti",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "falà indè a lista",
"keyboard_shortcuts.enter": "apre u statutu",
"keyboard_shortcuts.favourite": "aghjunghje à i favuriti",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ingrandà a finestra d'affissera di i ritratti",
"lightbox.next": "Siguente",
"lightbox.previous": "Pricidente",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Aghjunghje à a lista",
"lists.account.remove": "Toglie di a lista",
"lists.delete": "Toglie a lista",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Segnalibri",
"navigation_bar.community_timeline": "Linea pubblica lucale",
"navigation_bar.compose": "Scrive un novu statutu",
- "navigation_bar.direct": "Missaghji diretti",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Scopre",
"navigation_bar.domain_blocks": "Duminii piattati",
"navigation_bar.edit_profile": "Mudificà u prufile",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Toglie u scandagliu",
"privacy.change": "Mudificà a cunfidenzialità di u statutu",
"privacy.direct.long": "Mandà solu à quelli chì so mintuvati",
- "privacy.direct.short": "Direttu",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Mustrà solu à l'abbunati",
- "privacy.private.short": "Privatu",
- "privacy.public.long": "Mustrà à tuttu u mondu nant'à e linee pubbliche",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Pubblicu",
- "privacy.unlisted.long": "Ùn mette micca nant'à e linee pubbliche",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Micca listatu",
"refresh": "Attualizà",
"regeneration_indicator.label": "Caricamentu…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Ùn si pò micca caricà fugliali cù i scandagli.",
"upload_form.audio_description": "Discrizzione per i ciochi",
"upload_form.description": "Discrizzione per i malvistosi",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Mudificà",
"upload_form.thumbnail": "Cambià vignetta",
"upload_form.undo": "Sguassà",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index d48780042..e1602dacf 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -5,7 +5,7 @@
"account.badges.group": "Skupina",
"account.block": "Zablokovat @{name}",
"account.block_domain": "Blokovat doménu {domain}",
- "account.blocked": "Blokováno",
+ "account.blocked": "Blokován",
"account.browse_more_on_origin_server": "Více na původním profilu",
"account.cancel_follow_request": "Zrušit žádost o sledování",
"account.direct": "Poslat @{name} přímou zprávu",
@@ -18,7 +18,7 @@
"account.followers": "Sledující",
"account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
"account.followers_counter": "{count, plural, one {{counter} Sledující} few {{counter} Sledující} many {{counter} Sledujících} other {{counter} Sledujících}}",
- "account.following": "Following",
+ "account.following": "Sledujete",
"account.following_counter": "{count, plural, one {{counter} Sledovaný} few {{counter} Sledovaní} many {{counter} Sledovaných} other {{counter} Sledovaných}}",
"account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
"account.follows_you": "Sleduje vás",
@@ -41,15 +41,15 @@
"account.statuses_counter": "{count, plural, one {{counter} Příspěvek} few {{counter} Příspěvky} many {{counter} Příspěvků} other {{counter} Příspěvků}}",
"account.unblock": "Odblokovat @{name}",
"account.unblock_domain": "Odblokovat doménu {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Odblokovat",
"account.unendorse": "Nezvýrazňovat na profilu",
"account.unfollow": "Přestat sledovat",
- "account.unmute": "Zrušit skrytí @{name}",
- "account.unmute_notifications": "Zrušit skrytí oznámení od @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute": "Odkrýt @{name}",
+ "account.unmute_notifications": "Odkrýt oznámení od @{name}",
+ "account.unmute_short": "Odkrýt",
"account_note.placeholder": "Klikněte pro přidání poznámky",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.daily_retention": "Míra udržení uživatelů podle dne po registraci",
+ "admin.dashboard.monthly_retention": "Míra udržení uživatelů podle měsíce po registraci",
"admin.dashboard.retention.average": "Průměr",
"admin.dashboard.retention.cohort": "Měsíc registrace",
"admin.dashboard.retention.cohort_size": "Noví uživatelé",
@@ -75,7 +75,7 @@
"column.domain_blocks": "Blokované domény",
"column.favourites": "Oblíbené",
"column.follow_requests": "Žádosti o sledování",
- "column.home": "Domů",
+ "column.home": "Domovská časová osa",
"column.lists": "Seznamy",
"column.mutes": "Skrytí uživatelé",
"column.notifications": "Oznámení",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Pouze místní",
"community.column_settings.media_only": "Pouze média",
"community.column_settings.remote_only": "Pouze vzdálené",
- "compose_form.direct_message_warning": "Tento příspěvek bude odeslán pouze zmíněným uživatelům.",
+ "compose.language.change": "Změnit jazyk",
+ "compose.language.search": "Prohledat jazyky...",
"compose_form.direct_message_warning_learn_more": "Zjistit více",
+ "compose_form.encryption_warning": "Příspěvky na Mastodonu nejsou end-to-end šifrovány. Nesdílejte přes Mastodon žádné citlivé informace.",
"compose_form.hashtag_warning": "Tento příspěvek nebude zobrazen pod žádným hashtagem, neboť je neuvedený. Pouze veřejné příspěvky mohou být vyhledány podle hashtagu.",
"compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky učené pouze pro sledující.",
"compose_form.lock_disclaimer.lock": "uzamčen",
@@ -104,9 +106,9 @@
"compose_form.poll.remove_option": "Odstranit tuto volbu",
"compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více možností",
"compose_form.poll.switch_to_single": "Povolit u ankety výběr jediné možnosti",
- "compose_form.publish": "Odeslat",
+ "compose_form.publish": "Zveřejnit",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "Uložit změny",
"compose_form.sensitive.hide": "{count, plural, one {Označit média za citlivá} few {Označit média za citlivá} many {Označit média za citlivá} other {Označit média za citlivá}}",
"compose_form.sensitive.marked": "{count, plural, one {Média jsou označena za citlivá} few {Média jsou označena za citlivá} many {Média jsou označena za citlivá} other {Média jsou označena za citlivá}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Média nejsou označena za citlivá} few {Média nejsou označena za citlivá} many {Média nejsou označena za citlivá} other {Média nejsou označena za citlivá}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
"embed.preview": "Takhle to bude vypadat:",
"emoji_button.activity": "Aktivita",
+ "emoji_button.clear": "Vyčistit",
"emoji_button.custom": "Vlastní",
"emoji_button.flags": "Vlajky",
"emoji_button.food": "Jídla a nápoje",
@@ -168,7 +171,7 @@
"empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!",
"empty_column.direct": "Ještě nemáte žádné přímé zprávy. Pokud nějakou pošlete nebo dostanete, zobrazí se zde.",
"empty_column.domain_blocks": "Ještě nemáte žádné blokované domény.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "Momentálně není nic populární. Vraťte se později!",
"empty_column.favourited_statuses": "Ještě nemáte žádné oblíbené příspěvky. Pokud si nějaký oblíbíte, zobrazí se zde.",
"empty_column.favourites": "Tento příspěvek si ještě nikdo neoblíbil. Pokud to někdo udělá, zobrazí se zde.",
"empty_column.follow_recommendations": "Zdá se, že pro vás nelze vygenerovat žádné návrhy. Můžete zkusit přes vyhledávání naleznout lidi, které znáte, nebo prozkoumat populární hashtagy.",
@@ -187,18 +190,18 @@
"error.unexpected_crash.next_steps_addons": "Zkuste je vypnout a stránku obnovit. Pokud to nepomůže, zkuste otevřít Mastodon v jiném prohlížeči nebo nativní aplikaci.",
"errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
"errors.unexpected_crash.report_issue": "Nahlásit problém",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "Výsledky hledání",
+ "explore.suggested_follows": "Pro vás",
+ "explore.title": "Objevování",
+ "explore.trending_links": "Zprávy",
+ "explore.trending_statuses": "Příspěvky",
+ "explore.trending_tags": "Hashtagy",
"follow_recommendations.done": "Hotovo",
"follow_recommendations.heading": "Sledujte lidi, jejichž příspěvky chcete vidět! Tady jsou nějaké návrhy.",
"follow_recommendations.lead": "Příspěvky od lidí, které sledujete, se budou objevovat v chronologickém pořadí ve vaší domovské ose. Nebojte se, že uděláte chybu, můžete lidi stejně snadno kdykoliv přestat sledovat!",
"follow_request.authorize": "Autorizovat",
"follow_request.reject": "Odmítnout",
- "follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, {domain} si myslí, že budete chtít následující požadavky na sledování zkontrolovat ručně.",
+ "follow_requests.unlocked_explanation": "Přestože váš účet není uzamčen, personál {domain} usoudil, že byste mohli chtít tyto požadavky na sledování zkontrolovat ručně.",
"generic.saved": "Uloženo",
"getting_started.developers": "Vývojáři",
"getting_started.directory": "Adresář profilů",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ukázat obrázek v plné velikosti",
"lightbox.next": "Další",
"lightbox.previous": "Předchozí",
+ "limited_account_hint.action": "Přesto profil zobrazit",
+ "limited_account_hint.title": "Tento profil byl skryt moderátory vašeho serveru.",
"lists.account.add": "Přidat do seznamu",
"lists.account.remove": "Odebrat ze seznamu",
"lists.delete": "Smazat seznam",
@@ -294,7 +299,7 @@
"navigation_bar.discover": "Objevujte",
"navigation_bar.domain_blocks": "Blokované domény",
"navigation_bar.edit_profile": "Upravit profil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Objevování",
"navigation_bar.favourites": "Oblíbené",
"navigation_bar.filters": "Skrytá slova",
"navigation_bar.follow_requests": "Žádosti o sledování",
@@ -309,7 +314,7 @@
"navigation_bar.preferences": "Předvolby",
"navigation_bar.public_timeline": "Federovaná časová osa",
"navigation_bar.security": "Zabezpečení",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "Uživatel {name} se zaregistroval",
"notification.favourite": "Uživatel {name} si oblíbil váš příspěvek",
"notification.follow": "Uživatel {name} vás začal sledovat",
"notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat",
@@ -318,10 +323,10 @@
"notification.poll": "Anketa, ve které jste hlasovali, skončila",
"notification.reblog": "Uživatel {name} boostnul váš příspěvek",
"notification.status": "Nový příspěvek od {name}",
- "notification.update": "{name} edited a post",
- "notifications.clear": "Smazat oznámení",
+ "notification.update": "Uživatel {name} upravil příspěvek",
+ "notifications.clear": "Vymazat oznámení",
"notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Nové registrace:",
"notifications.column_settings.alert": "Oznámení na počítači",
"notifications.column_settings.favourite": "Oblíbení:",
"notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie",
@@ -338,7 +343,7 @@
"notifications.column_settings.status": "Nové příspěvky:",
"notifications.column_settings.unread_notifications.category": "Nepřečtená oznámení",
"notifications.column_settings.unread_notifications.highlight": "Zvýraznit nepřečtená oznámení",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Úpravy:",
"notifications.filter.all": "Vše",
"notifications.filter.boosts": "Boosty",
"notifications.filter.favourites": "Oblíbení",
@@ -366,66 +371,66 @@
"poll_button.add_poll": "Přidat anketu",
"poll_button.remove_poll": "Odstranit anketu",
"privacy.change": "Změnit soukromí příspěvku",
- "privacy.direct.long": "Viditelné pouze pro zmíněné uživatele",
- "privacy.direct.short": "Přímý",
- "privacy.private.long": "Viditelné pouze pro sledující",
- "privacy.private.short": "Pouze pro sledující",
- "privacy.public.long": "Viditelné pro všechny, i ve veřejných časových osách",
+ "privacy.direct.long": "Viditelný pouze pro zmíněné uživatele",
+ "privacy.direct.short": "Jen zmínění lidé",
+ "privacy.private.long": "Viditelný pouze pro sledující",
+ "privacy.private.short": "Pouze sledující",
+ "privacy.public.long": "Viditelný pro všechny",
"privacy.public.short": "Veřejný",
- "privacy.unlisted.long": "Viditelné pro všechny, ale ne ve veřejných časových osách",
+ "privacy.unlisted.long": "Viditelný pro všechny, ale vyňat z funkcí objevování",
"privacy.unlisted.short": "Neuvedený",
"refresh": "Obnovit",
"regeneration_indicator.label": "Načítání…",
"regeneration_indicator.sublabel": "Váš domovský kanál se připravuje!",
"relative_time.days": "{number} d",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "před {number, plural, one {# dnem} few {# dny} many {# dny} other {# dny}}",
+ "relative_time.full.hours": "před {number, plural, one {# hodinou} few {# hodinami} many {# hodinami} other {# hodinami}}",
+ "relative_time.full.just_now": "právě teď",
+ "relative_time.full.minutes": "před {number, plural, one {# minutou} few {# minutami} many {# minutami} other {# minutami}}",
+ "relative_time.full.seconds": "před {number, plural, one {# sekundou} few {# sekundami} many {# sekundami} other {# sekundami}}",
"relative_time.hours": "{number} h",
"relative_time.just_now": "teď",
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "dnes",
"reply_indicator.cancel": "Zrušit",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
+ "report.block": "Zablokovat",
+ "report.block_explanation": "Neuvidíte jejich příspěvky. Oni neuvidí vaše příspěvky ani vás nebudou moci sledovat. Poznají, že jsou blokováni.",
+ "report.categories.other": "Ostatní",
"report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.categories.violation": "Obsah porušuje jedno nebo více pravidel serveru",
+ "report.category.subtitle": "Vyberte nejbližší možnost",
+ "report.category.title": "Povězte nám, proč chcete {type} nahlásit",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "příspěvek",
+ "report.close": "Hotovo",
+ "report.comment.title": "Ještě něco jiného, co myslíte, že bychom měli vědět?",
"report.forward": "Přeposlat na {target}",
"report.forward_hint": "Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii hlášení?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "Skrýt",
+ "report.mute_explanation": "Neuvidíte jejich příspěvky. Oni vás mohou nadále sledovat i vidět vaše příspěvky a nebudou vědět, že jsou skryti.",
+ "report.next": "Dále",
"report.placeholder": "Dodatečné komentáře",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "Nelíbí se mi",
+ "report.reasons.dislike_description": "Není to něco, co chcete vidět",
+ "report.reasons.other": "Jde o něco jiného",
+ "report.reasons.other_description": "Problém neodpovídá ostatním kategoriím",
+ "report.reasons.spam": "Je to spam",
+ "report.reasons.spam_description": "Škodlivé odkazy, falešné interakce nebo opakované odpovědi",
+ "report.reasons.violation": "Porušuje pravidla serveru",
+ "report.reasons.violation_description": "Máte za to, že porušuje konkrétní pravidla",
+ "report.rules.subtitle": "Vyberte všechna relevantní",
+ "report.rules.title": "Která pravidla porušuje?",
+ "report.statuses.subtitle": "Vyberte všechny relevantní",
+ "report.statuses.title": "Existují příspěvky dokládající toto hlášení?",
"report.submit": "Odeslat",
"report.target": "Nahlášení uživatele {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Tady jsou vaše možnosti pro řízení toho, co na Mastodonu vidíte:",
+ "report.thanks.take_action_actionable": "Zatímco to posuzujeme, můžete podniknout kroky proti @{name}:",
+ "report.thanks.title": "Nechcete tohle vidět?",
+ "report.thanks.title_actionable": "Děkujeme za nahlášení, podíváme se na to.",
+ "report.unfollow": "Přestat sledovat @{name}",
+ "report.unfollow_explanation": "Tento účet sledujete. Abyste už neviděli jejich příspěvky ve své domácí časové ose, přestaňte je sledovat.",
"search.placeholder": "Hledat",
"search_popout.search_format": "Pokročilé hledání",
"search_popout.tips.full_text": "Jednoduchý text vrací příspěvky, které jste napsali, oblíbili si, boostnuli, nebo vás v nich někdo zmínil, a také odpovídající přezdívky, zobrazovaná jména a hashtagy.",
@@ -434,9 +439,9 @@
"search_popout.tips.text": "Jednoduchý text vrací odpovídající zobrazovaná jména, přezdívky a hashtagy",
"search_popout.tips.user": "uživatel",
"search_results.accounts": "Lidé",
- "search_results.all": "All",
+ "search_results.all": "Vše",
"search_results.hashtags": "Hashtagy",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "Pro tyto hledané výrazy nebylo nic nenalezeno",
"search_results.statuses": "Příspěvky",
"search_results.statuses_fts_disabled": "Vyhledávání příspěvků podle jejich obsahu není na tomto Mastodon serveru povoleno.",
"search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledků} other {výsledků}}",
@@ -450,14 +455,14 @@
"status.delete": "Smazat",
"status.detailed_status": "Podrobné zobrazení konverzace",
"status.direct": "Poslat @{name} přímou zprávu",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edit": "Upravit",
+ "status.edited": "Upraven {date}",
+ "status.edited_x_times": "Upraven {count, plural, one {{count}krát} few {{count}krát} many {{count}krát} other {{count}krát}}",
"status.embed": "Vložit na web",
"status.favourite": "Oblíbit",
"status.filtered": "Filtrováno",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "Uživatel {name} vytvořil {date}",
+ "status.history.edited": "Uživatel {name} upravil {date}",
"status.load_more": "Zobrazit více",
"status.media_hidden": "Média skryta",
"status.mention": "Zmínit @{name}",
@@ -490,7 +495,7 @@
"suggestions.dismiss": "Odmítnout návrh",
"suggestions.header": "Mohlo by vás zajímat…",
"tabs_bar.federated_timeline": "Federovaná",
- "tabs_bar.home": "Domů",
+ "tabs_bar.home": "Domovská",
"tabs_bar.local_timeline": "Místní",
"tabs_bar.notifications": "Oznámení",
"tabs_bar.search": "Hledat",
@@ -501,7 +506,7 @@
"time_remaining.seconds": "{number, plural, one {Zbývá # sekunda} few {Zbývají # sekundy} many {Zbývá # sekund} other {Zbývá # sekund}}",
"timeline_hint.remote_resource_not_displayed": "{resource} z jiných serveru se nezobrazuje.",
"timeline_hint.resources.followers": "Sledující",
- "timeline_hint.resources.follows": "Sleduje",
+ "timeline_hint.resources.follows": "Sledovaní",
"timeline_hint.resources.statuses": "Starší příspěvky",
"trends.counter_by_accounts": "zmiňuje {count, plural, one {{counter} člověk} few {{counter} lidé} many {{counter} lidí} other {{counter} lidí}}",
"trends.trending_now": "Právě populární",
@@ -515,6 +520,7 @@
"upload_error.poll": "U anket není nahrávání souborů povoleno.",
"upload_form.audio_description": "Popis pro sluchově postižené",
"upload_form.description": "Popis pro zrakově postižené",
+ "upload_form.description_missing": "Nebyl přidán popis",
"upload_form.edit": "Upravit",
"upload_form.thumbnail": "Změnit miniaturu",
"upload_form.undo": "Smazat",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index d3ac8d806..42fef4732 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -4,26 +4,26 @@
"account.badges.bot": "Bot",
"account.badges.group": "Grŵp",
"account.block": "Blocio @{name}",
- "account.block_domain": "Cuddio popeth rhag {domain}",
+ "account.block_domain": "Blocio parth {domain}",
"account.blocked": "Blociwyd",
"account.browse_more_on_origin_server": "Pori mwy ar y proffil gwreiddiol",
"account.cancel_follow_request": "Canslo cais dilyn",
"account.direct": "Neges breifat @{name}",
- "account.disable_notifications": "Stop notifying me when @{name} posts",
- "account.domain_blocked": "Parth wedi ei guddio",
+ "account.disable_notifications": "Stopiwch fy hysbysu pan fydd @{name} yn postio",
+ "account.domain_blocked": "Parth wedi ei flocio",
"account.edit_profile": "Golygu proffil",
- "account.enable_notifications": "Notify me when @{name} posts",
+ "account.enable_notifications": "Rhowch wybod i fi pan fydd @{name} yn postio",
"account.endorse": "Arddangos ar fy mhroffil",
"account.follow": "Dilyn",
"account.followers": "Dilynwyr",
- "account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.",
- "account.followers_counter": "{count, plural, one {{counter} Ddilynwr} other {{counter} o Ddilynwyr}}",
- "account.following": "Following",
+ "account.followers.empty": "Does neb yn dilyn y defnyddiwr hwn eto.",
+ "account.followers_counter": "{count, plural, one {{counter} Dilynwr} other {{counter} o Ddilynwyr}}",
+ "account.following": "Yn dilyn",
"account.following_counter": "{count, plural, one {{counter} yn Dilyn} other {{counter} yn Dilyn}}",
"account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
"account.follows_you": "Yn eich dilyn chi",
"account.hide_reblogs": "Cuddio bwstiau o @{name}",
- "account.joined": "Joined {date}",
+ "account.joined": "Ymunodd {date}",
"account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}",
"account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.",
"account.media": "Cyfryngau",
@@ -32,8 +32,8 @@
"account.mute": "Tawelu @{name}",
"account.mute_notifications": "Cuddio hysbysiadau o @{name}",
"account.muted": "Distewyd",
- "account.posts": "Tŵtiau",
- "account.posts_with_replies": "Tŵtiau ac atebion",
+ "account.posts": "Postiadau",
+ "account.posts_with_replies": "Postiadau ac atebion",
"account.report": "Adrodd @{name}",
"account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
"account.share": "Rhannwch broffil @{name}",
@@ -41,24 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} Dŵt} other {{counter} o Dŵtiau}}",
"account.unblock": "Dadflocio @{name}",
"account.unblock_domain": "Dadguddio {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Dad-flocio",
"account.unendorse": "Peidio a'i arddangos ar fy mhroffil",
"account.unfollow": "Dad-ddilyn",
"account.unmute": "Dad-dawelu @{name}",
"account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Dad-dewi",
"account_note.placeholder": "Clicio i ychwanegu nodyn",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
+ "admin.dashboard.daily_retention": "Cyfradd cadw defnyddwyr fesul diwrnod ar ôl cofrestru",
+ "admin.dashboard.monthly_retention": "Cyfradd cadw defnyddwyr fesul mis ar ôl cofrestru",
+ "admin.dashboard.retention.average": "Cyfartaledd",
+ "admin.dashboard.retention.cohort": "Mis cofrestru",
"admin.dashboard.retention.cohort_size": "Defnyddwyr newydd",
"alert.rate_limited.message": "Ceisiwch eto ar ôl {retry_time, time, medium}.",
"alert.rate_limited.title": "Cyfradd gyfyngedig",
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
"alert.unexpected.title": "Wps!",
"announcement.announcement": "Cyhoeddiad",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(heb eu prosesu)",
"autosuggest_hashtag.per_week": "{count} yr wythnos",
"boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa",
"bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
@@ -79,7 +79,7 @@
"column.lists": "Rhestrau",
"column.mutes": "Defnyddwyr a ddistewyd",
"column.notifications": "Hysbysiadau",
- "column.pins": "Tŵtiau wedi eu pinio",
+ "column.pins": "Postiadau wedi eu pinio",
"column.public": "Ffrwd y ffederasiwn",
"column_back_button.label": "Nôl",
"column_header.hide_settings": "Cuddio dewisiadau",
@@ -92,10 +92,12 @@
"community.column_settings.local_only": "Lleol yn unig",
"community.column_settings.media_only": "Cyfryngau yn unig",
"community.column_settings.remote_only": "Anghysbell yn unig",
- "compose_form.direct_message_warning": "Mi fydd y tŵt hwn ond yn cael ei anfon at y defnyddwyr sy'n cael eu crybwyll.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Dysgu mwy",
- "compose_form.hashtag_warning": "Ni fydd y tŵt hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond tŵtiau cyhoeddus gellid chwilota amdanynt drwy hashnod.",
- "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich tŵtiau dilynwyr-yn-unig.",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "compose_form.hashtag_warning": "Ni fydd y post hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond postiadau cyhoeddus gellid chwilio amdanynt drwy hashnod.",
+ "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich postiadau dilynwyr-yn-unig.",
"compose_form.lock_disclaimer.lock": "wedi ei gloi",
"compose_form.placeholder": "Beth sydd ar eich meddwl?",
"compose_form.poll.add_option": "Ychwanegu Dewisiad",
@@ -104,9 +106,9 @@
"compose_form.poll.remove_option": "Tynnu'r dewisiad",
"compose_form.poll.switch_to_multiple": "Newid pleidlais i adael mwy nag un dewis",
"compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis",
- "compose_form.publish": "Tŵt",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "Cadw newidiadau",
"compose_form.sensitive.hide": "Marcio cyfryngau fel eu bod yn sensitif",
"compose_form.sensitive.marked": "Cyfryngau wedi'u marcio'n sensitif",
"compose_form.sensitive.unmarked": "Nid yw'r cyfryngau wedi'u marcio'n sensitif",
@@ -118,11 +120,11 @@
"confirmations.block.confirm": "Blocio",
"confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?",
"confirmations.delete.confirm": "Dileu",
- "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y tŵt hwn?",
+ "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y post hwn?",
"confirmations.delete_list.confirm": "Dileu",
"confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Gwaredu",
+ "confirmations.discard_edit_media.message": "Mae gennych newidiadau heb eu cadw i'r disgrifiad cyfryngau neu'r rhagolwg, eu taflu beth bynnag?",
"confirmations.domain_block.confirm": "Cuddio parth cyfan",
"confirmations.domain_block.message": "A ydych yn hollol, hollol sicr eich bod am flocio y {domain} cyfan? Yn y nifer helaeth o achosion mae blocio neu tawelu ambell gyfrif yn ddigonol ac yn well. Ni fyddwch yn gweld cynnwys o'r parth hwnnw mewn unrhyw ffrydiau cyhoeddus na chwaith yn eich hysbysiadau. Bydd hyn yn cael gwared o'ch dilynwyr o'r parth hwnnw.",
"confirmations.logout.confirm": "Allgofnodi",
@@ -131,7 +133,7 @@
"confirmations.mute.explanation": "Bydd hyn yn cuddio pyst oddi wrthynt a physt sydd yn sôn amdanynt, ond bydd hyn dal yn gadael iddyn nhw gweld eich pyst a'ch dilyn.",
"confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?",
"confirmations.redraft.confirm": "Dileu & ailddrafftio",
- "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y tŵt hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r tŵt gwreiddiol yn cael eu hamddifadu.",
+ "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y post hwn a'i ailddrafftio? Bydd ffefrynnau a hybiau'n cael ei colli, a bydd ymatebion i'r post gwreiddiol yn cael eu hamddifadu.",
"confirmations.reply.confirm": "Ateb",
"confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?",
"confirmations.unfollow.confirm": "Dad-ddilynwch",
@@ -140,13 +142,14 @@
"conversation.mark_as_read": "Nodi fel wedi'i ddarllen",
"conversation.open": "Gweld sgwrs",
"conversation.with": "Gyda {names}",
- "directory.federated": "O ffedysawd hysbys",
+ "directory.federated": "O'r ffedysawd cyfan",
"directory.local": "O {domain} yn unig",
"directory.new_arrivals": "Newydd-ddyfodiaid",
"directory.recently_active": "Yn weithredol yn ddiweddar",
- "embed.instructions": "Mewnblannwch y tŵt hwn ar eich gwefan drwy gopïo'r côd isod.",
+ "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.",
"embed.preview": "Dyma sut olwg fydd arno:",
"emoji_button.activity": "Gweithgarwch",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Unigryw",
"emoji_button.flags": "Baneri",
"emoji_button.food": "Bwyd a Diod",
@@ -160,42 +163,42 @@
"emoji_button.search_results": "Canlyniadau chwilio",
"emoji_button.symbols": "Symbolau",
"emoji_button.travel": "Teithio & Llefydd",
- "empty_column.account_suspended": "Account suspended",
- "empty_column.account_timeline": "Dim tŵtiau fama!",
+ "empty_column.account_suspended": "Cyfrif wedi'i atal",
+ "empty_column.account_timeline": "Dim postiadau yma!",
"empty_column.account_unavailable": "Proffil ddim ar gael",
"empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.",
"empty_column.bookmarked_statuses": "Nid oes gennych unrhyw dwtiau tudalnodiedig eto. Pan y byddwch yn tudalnodi un, mi fydd yn ymddangos yma.",
"empty_column.community": "Mae'r ffrwd lleol yn wag. Ysgrifenwch rhywbeth yn gyhoeddus i gael dechrau arni!",
- "empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.",
+ "empty_column.direct": "Does gennych unrhyw negeseuon preifat eto. Pan byddwch yn anfon neu derbyn un, bydd yn ymddangos yma.",
"empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.",
- "empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, byddent yn ymddangos yma.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.explore_statuses": "Does dim byd yn trendio ar hyn o bryd. Gwiriwch yn ôl yn nes ymlaen!",
+ "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff bostiadau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.",
+ "empty_column.favourites": "Does neb wedi hoffi'r post hwn eto. Pan bydd rhywun yn ei hoffi, byddent yn ymddangos yma.",
+ "empty_column.follow_recommendations": "Does dim awgrymiadau yma i chi. Gallwch geisio chwilio am bobl yr ydych yn eu hadnabod neu archwilio hashnodau sy'n trendio.",
"empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, byddent yn ymddangos yma.",
"empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.",
"empty_column.home": "Mae eich ffrwd gartref yn wag! Ymwelwch a {public} neu defnyddiwch y chwilotwr i ddechrau arni ac i gwrdd a defnyddwyr eraill.",
- "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.home.suggestions": "Gweler awgrymiadau",
"empty_column.list": "Nid oes dim yn y rhestr yma eto. Pan y bydd aelodau'r rhestr yn cyhoeddi statws newydd, mi fydd yn ymddangos yma.",
"empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan grëwch chi un, mi fydd yn ymddangos yma.",
"empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.",
"empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.",
"empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o achosion eraill i'w lenwi",
"error.unexpected_crash.explanation": "Oherwydd gwall yn ein cod neu oherwydd problem cysondeb porwr, nid oedd y dudalen hon gallu cael ei dangos yn gywir.",
- "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+ "error.unexpected_crash.explanation_addons": "Ni ellid arddangos y dudalen hon yn gywir. Mae'r gwall hwn yn debygol o gael ei achosi gan ategyn porwr neu offer cyfieithu awtomatig.",
"error.unexpected_crash.next_steps": "Ceisiwch ail-lwytho y dudalen. Os nad yw hyn yn eich helpu, efallai gallech defnyddio Mastodon trwy borwr neu ap brodorol gwahanol.",
- "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+ "error.unexpected_crash.next_steps_addons": "Ceisiwch eu hanalluogi ac adnewyddu'r dudalen. Os nad yw hynny'n helpu, efallai y byddwch yn dal i allu defnyddio Mastodon trwy borwr neu ap cynhenid arall.",
"errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
"errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "Canlyniadau chwilio",
+ "explore.suggested_follows": "I chi",
+ "explore.title": "Archwilio",
+ "explore.trending_links": "Newyddion",
+ "explore.trending_statuses": "Postiadau",
+ "explore.trending_tags": "Hashnodau",
"follow_recommendations.done": "Wedi gorffen",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_recommendations.heading": "Dilynwch y bobl yr hoffech chi weld eu postiadau! Dyma ambell i awgrymiad.",
+ "follow_recommendations.lead": "Bydd postiadau gan bobl rydych chi'n eu dilyn yn ymddangos mewn trefn amser ar eich ffrwd cartref. Peidiwch â bod ofn gwneud camgymeriadau, gallwch chi ddad-ddilyn pobl yr un mor hawdd unrhyw bryd!",
"follow_request.authorize": "Caniatau",
"follow_request.reject": "Gwrthod",
"follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, oedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.",
@@ -218,36 +221,36 @@
"hashtag.column_settings.tag_mode.none": "Dim o'r rhain",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"home.column_settings.basic": "Syml",
- "home.column_settings.show_reblogs": "Dangos bŵstiau",
+ "home.column_settings.show_reblogs": "Dangos hybiau",
"home.column_settings.show_replies": "Dangos ymatebion",
"home.hide_announcements": "Cuddio cyhoeddiadau",
"home.show_announcements": "Dangos cyhoeddiadau",
- "intervals.full.days": "{number, plural, one {# ddydd} other {# o ddyddiau}}",
+ "intervals.full.days": "{number, plural, one {# dydd} two {# ddydd} other {# o ddyddiau}}",
"intervals.full.hours": "{number, plural, one {# awr} other {# o oriau}}",
"intervals.full.minutes": "{number, plural, one {# funud} other {# o funudau}}",
"keyboard_shortcuts.back": "i lywio nôl",
"keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd",
"keyboard_shortcuts.boost": "i fŵstio",
- "keyboard_shortcuts.column": "i ffocysu tŵt yn un o'r colofnau",
+ "keyboard_shortcuts.column": "Ffocysu colofn",
"keyboard_shortcuts.compose": "i ffocysu yr ardal cyfansoddi testun",
"keyboard_shortcuts.description": "Disgrifiad",
"keyboard_shortcuts.direct": "i agor colofn negeseuon preifat",
"keyboard_shortcuts.down": "i symud lawr yn y rhestr",
- "keyboard_shortcuts.enter": "i agor tŵt",
+ "keyboard_shortcuts.enter": "Agor post",
"keyboard_shortcuts.favourite": "i hoffi",
"keyboard_shortcuts.favourites": "i agor rhestr hoffi",
"keyboard_shortcuts.federated": "i agor ffrwd y ffederasiwn",
"keyboard_shortcuts.heading": "Llwybrau byr allweddell",
"keyboard_shortcuts.home": "i agor ffrwd cartref",
"keyboard_shortcuts.hotkey": "Bysell brys",
- "keyboard_shortcuts.legend": "i ddangos yr arwr yma",
+ "keyboard_shortcuts.legend": "i ddangos y rhestr hon",
"keyboard_shortcuts.local": "i agor ffrwd lleol",
"keyboard_shortcuts.mention": "i grybwyll yr awdur",
"keyboard_shortcuts.muted": "i agor rhestr defnyddwyr a dawelwyd",
"keyboard_shortcuts.my_profile": "i agor eich proffil",
"keyboard_shortcuts.notifications": "i agor colofn hysbysiadau",
"keyboard_shortcuts.open_media": "i agor cyfryngau",
- "keyboard_shortcuts.pinned": "i agor rhestr tŵtiau wedi'i pinio",
+ "keyboard_shortcuts.pinned": "Agor rhestr postiadau wedi'u pinio",
"keyboard_shortcuts.profile": "i agor proffil yr awdur",
"keyboard_shortcuts.reply": "i ateb",
"keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn",
@@ -256,7 +259,7 @@
"keyboard_shortcuts.start": "i agor colofn \"dechrau arni\"",
"keyboard_shortcuts.toggle_hidden": "i ddangos/cuddio testun tu ôl i CW",
"keyboard_shortcuts.toggle_sensitivity": "i ddangos/gyddio cyfryngau",
- "keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon",
+ "keyboard_shortcuts.toot": "Dechrau post newydd",
"keyboard_shortcuts.unfocus": "i ddad-ffocysu ardal cyfansoddi testun/chwilio",
"keyboard_shortcuts.up": "i symud yn uwch yn y rhestr",
"lightbox.close": "Cau",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ehangu blwch gweld delwedd",
"lightbox.next": "Nesaf",
"lightbox.previous": "Blaenorol",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Ychwanegwch at restr",
"lists.account.remove": "Dileu o'r rhestr",
"lists.delete": "Dileu rhestr",
@@ -275,7 +280,7 @@
"lists.replies_policy.list": "Aelodau'r rhestr",
"lists.replies_policy.none": "Neb",
"lists.replies_policy.title": "Dangos ymatebion i:",
- "lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn",
+ "lists.search": "Chwilio ymysg pobl yr ydych yn eu dilyn",
"lists.subheading": "Eich rhestrau",
"load_pending": "{count, plural, one {# eitem newydd} other {# eitemau newydd}}",
"loading_indicator.label": "Llwytho...",
@@ -289,12 +294,12 @@
"navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
"navigation_bar.bookmarks": "Tudalnodau",
"navigation_bar.community_timeline": "Ffrwd leol",
- "navigation_bar.compose": "Cyfansoddi tŵt newydd",
+ "navigation_bar.compose": "Cyfansoddi post newydd",
"navigation_bar.direct": "Negeseuon preifat",
"navigation_bar.discover": "Darganfod",
"navigation_bar.domain_blocks": "Parthau cuddiedig",
"navigation_bar.edit_profile": "Golygu proffil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Archwilio",
"navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.filters": "Geiriau a dawelwyd",
"navigation_bar.follow_requests": "Ceisiadau dilyn",
@@ -305,28 +310,28 @@
"navigation_bar.logout": "Allgofnodi",
"navigation_bar.mutes": "Defnyddwyr a dawelwyd",
"navigation_bar.personal": "Personol",
- "navigation_bar.pins": "Tŵtiau wedi eu pinio",
+ "navigation_bar.pins": "Postiadau wedi eu pinio",
"navigation_bar.preferences": "Dewisiadau",
"navigation_bar.public_timeline": "Ffrwd y ffederasiwn",
"navigation_bar.security": "Diogelwch",
- "notification.admin.sign_up": "{name} signed up",
- "notification.favourite": "hoffodd {name} eich tŵt",
- "notification.follow": "dilynodd {name} chi",
+ "notification.admin.sign_up": "Cofrestrodd {name}",
+ "notification.favourite": "Hoffodd {name} eich post",
+ "notification.follow": "Dilynodd {name} chi",
"notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
"notification.mention": "Soniodd {name} amdanoch chi",
"notification.own_poll": "Mae eich pôl wedi diweddu",
"notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben",
- "notification.reblog": "Hysbysebodd {name} eich tŵt",
+ "notification.reblog": "Hybodd {name} eich post",
"notification.status": "{name} newydd ei bostio",
- "notification.update": "{name} edited a post",
+ "notification.update": "Golygodd {name} bost",
"notifications.clear": "Clirio hysbysiadau",
"notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Cofrestriadau newydd:",
"notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
"notifications.column_settings.favourite": "Ffefrynnau:",
"notifications.column_settings.filter_bar.advanced": "Dangos pob categori",
"notifications.column_settings.filter_bar.category": "Bar hidlo",
- "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.filter_bar.show_bar": "Dangos bar hidlo",
"notifications.column_settings.follow": "Dilynwyr newydd:",
"notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:",
"notifications.column_settings.mention": "Crybwylliadau:",
@@ -336,10 +341,10 @@
"notifications.column_settings.show": "Dangos yn y golofn",
"notifications.column_settings.sound": "Chwarae sain",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_notifications.category": "Unread notifications",
- "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
- "notifications.filter.all": "Pob",
+ "notifications.column_settings.unread_notifications.category": "Hysbysiadau heb eu darllen",
+ "notifications.column_settings.unread_notifications.highlight": "Amlygu hysbysiadau heb eu darllen",
+ "notifications.column_settings.update": "Golygiadau:",
+ "notifications.filter.all": "Popeth",
"notifications.filter.boosts": "Hybiadau",
"notifications.filter.favourites": "Ffefrynnau",
"notifications.filter.follows": "Yn dilyn",
@@ -362,116 +367,116 @@
"poll.total_votes": "{count, plural, one {# bleidlais} other {# o bleidleisiau}}",
"poll.vote": "Pleidleisio",
"poll.voted": "Pleidleisioch chi am yr ateb hon",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# bleidlais} other {# o bleidleisiau}}",
"poll_button.add_poll": "Ychwanegu pleidlais",
"poll_button.remove_poll": "Tynnu pleidlais",
- "privacy.change": "Addasu preifatrwdd y tŵt",
+ "privacy.change": "Addasu preifatrwdd y post",
"privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig",
- "privacy.direct.short": "Uniongyrchol",
+ "privacy.direct.short": "Pobl sy wedi'u crybwyll yn unig",
"privacy.private.long": "Cyhoeddi i ddilynwyr yn unig",
- "privacy.private.short": "Dilynwyr-yn-unig",
- "privacy.public.long": "Cyhoeddi i ffrydiau cyhoeddus",
+ "privacy.private.short": "Dilynwyr yn unig",
+ "privacy.public.long": "Gweladwy i bawb",
"privacy.public.short": "Cyhoeddus",
- "privacy.unlisted.long": "Peidio a chyhoeddi i ffrydiau cyhoeddus",
+ "privacy.unlisted.long": "Gweladwy i bawb, ond wedi optio allan o nodweddion darganfod",
"privacy.unlisted.short": "Heb ei restru",
"refresh": "Adnewyddu",
"regeneration_indicator.label": "Llwytho…",
"regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!",
- "relative_time.days": "{number}dydd",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
- "relative_time.hours": "{number}awr",
+ "relative_time.days": "{number} dydd",
+ "relative_time.full.days": "{number, plural, one {# dydd} other {# o ddyddiau}} yn ôl",
+ "relative_time.full.hours": "{number, plural, one {# awr} other {# o oriau}} yn ôl",
+ "relative_time.full.just_now": "jyst nawr",
+ "relative_time.full.minutes": "{number, plural, one {# funud} other {# o funudau}} yn ôl",
+ "relative_time.full.seconds": "{number, plural, one {# eiliad} other {# o eiliadau}} yn ôl",
+ "relative_time.hours": "{number} awr",
"relative_time.just_now": "nawr",
- "relative_time.minutes": "{number}munud",
- "relative_time.seconds": "{number}eiliad",
+ "relative_time.minutes": "{number} munud",
+ "relative_time.seconds": "{number} eiliad",
"relative_time.today": "heddiw",
"reply_indicator.cancel": "Canslo",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block": "Blocio",
+ "report.block_explanation": "Ni welwch chi eu postiadau. Ni allan nhw weld eich postiadau na'ch dilyn. Byddan nhw'n gallu gweld eu bod nhw wedi'u rhwystro.",
"report.categories.other": "Arall",
"report.categories.spam": "Sbam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
+ "report.categories.violation": "Mae cynnwys yn torri un neu fwy o reolau'r gweinydd",
+ "report.category.subtitle": "Dewiswch yr ateb gorau",
+ "report.category.title": "Beth sy'n bod â'r {type} hwn?",
+ "report.category.title_account": "proffil",
"report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.close": "Iawn",
+ "report.comment.title": "Oes unrhyw beth arall y dylem ei wybod yn eich barn chi?",
"report.forward": "Ymlaen i {target}",
"report.forward_hint": "Mae'r cyfrif o weinydd arall. Anfon copi anhysbys o'r adroddiad yno hefyd?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "Mudo",
+ "report.mute_explanation": "Ni fyddwch yn gweld eu postiadau. Gallant eich dilyn o hyd a gweld eich postiadau ac ni fyddant yn gwybod eu bod nhw wedi'u mudo.",
+ "report.next": "Nesaf",
"report.placeholder": "Sylwadau ychwanegol",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "Dydw i ddim yn ei hoffi",
+ "report.reasons.dislike_description": "Nid yw'n rhywbeth yr ydych am ei weld",
+ "report.reasons.other": "Mae'n rhywbeth arall",
+ "report.reasons.other_description": "Nid yw'r mater yn ffitio i gategorïau eraill",
+ "report.reasons.spam": "Sothach yw e",
+ "report.reasons.spam_description": "Cysylltiadau maleisus, ymgysylltu ffug, neu atebion ailadroddus",
+ "report.reasons.violation": "Mae'n torri rheolau'r gweinydd",
+ "report.reasons.violation_description": "Rydych yn ymwybodol ei fod yn torri rheolau penodol",
+ "report.rules.subtitle": "Dewiswch bob un sy'n berthnasol",
+ "report.rules.title": "Pa reolau sy'n cael eu torri?",
+ "report.statuses.subtitle": "Dewiswch bob un sy'n berthnasol",
+ "report.statuses.title": "Oes postiadau eraill sy'n cefnogi'r adroddiad hwn?",
"report.submit": "Cyflwyno",
"report.target": "Cwyno am {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Dyma'ch opsiynau ar gyfer rheoli'r hyn a welwch ar Mastodon:",
+ "report.thanks.take_action_actionable": "Tra byddwn yn edrych ar hyn, gallwch gymryd camau yn erbyn @{name}:",
+ "report.thanks.title": "Ddim eisiau gweld hwn?",
+ "report.thanks.title_actionable": "Diolch am adrodd, byddwn yn ymchwilio i hyn.",
+ "report.unfollow": "Dad-ddilyn @{name}",
+ "report.unfollow_explanation": "Rydych chi'n dilyn y cyfrif hwn. I beidio â gweld eu postiadau yn eich porthiant cartref mwyach, dad-ddilynwch nhw.",
"search.placeholder": "Chwilio",
"search_popout.search_format": "Fformat chwilio uwch",
- "search_popout.tips.full_text": "Mae testun syml yn dychwelyd tŵtiau yr ydych wedi ysgrifennu, hoffi, wedi'u bŵstio, neu wedi'ch crybwyll ynddynt, ynghyd a chyfateb a enwau defnyddwyr, enwau arddangos ac hashnodau.",
+ "search_popout.tips.full_text": "Mae testun syml yn dychwelyd postiadau yr ydych wedi ysgrifennu, hoffi, wedi'u hybio, neu wedi'ch crybwyll ynddynt, ynghyd a chyfateb a enwau defnyddwyr, enwau arddangos ac hashnodau.",
"search_popout.tips.hashtag": "hashnod",
- "search_popout.tips.status": "tŵt",
+ "search_popout.tips.status": "post",
"search_popout.tips.text": "Mae testun syml yn dychwelyd enwau arddangos, enwau defnyddwyr a hashnodau sy'n cyfateb",
"search_popout.tips.user": "defnyddiwr",
"search_results.accounts": "Pobl",
- "search_results.all": "All",
- "search_results.hashtags": "Hanshnodau",
- "search_results.nothing_found": "Could not find anything for these search terms",
- "search_results.statuses": "Tŵtiau",
- "search_results.statuses_fts_disabled": "Nid yw chwilio Tŵtiau yn ôl eu cynnwys wedi'i alluogi ar y gweinydd Mastodon hwn.",
- "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+ "search_results.all": "Popeth",
+ "search_results.hashtags": "Hashnodau",
+ "search_results.nothing_found": "Methu dod o hyd i unrhyw beth ar gyfer y termau chwilio hyn",
+ "search_results.statuses": "Postiadau",
+ "search_results.statuses_fts_disabled": "Nid yw chwilio postiadau yn ôl eu cynnwys wedi'i alluogi ar y gweinydd Mastodon hwn.",
+ "search_results.total": "{count, number} {count, plural, zero {canlyniad} one {canlyniad} two {ganlyniad} other {o ganlyniadau}}",
"status.admin_account": "Agor rhyngwyneb goruwchwylio ar gyfer @{name}",
- "status.admin_status": "Agor y tŵt yn y rhyngwyneb goruwchwylio",
+ "status.admin_status": "Agor y post hwn yn y rhyngwyneb goruwchwylio",
"status.block": "Blocio @{name}",
"status.bookmark": "Tudalnodi",
"status.cancel_reblog_private": "Dadfŵstio",
- "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn",
- "status.copy": "Copïo cysylltiad i'r tŵt",
+ "status.cannot_reblog": "Ni ellir hybio'r post hwn",
+ "status.copy": "Copïo dolen i'r post",
"status.delete": "Dileu",
"status.detailed_status": "Golwg manwl o'r sgwrs",
"status.direct": "Neges breifat @{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edit": "Golygu",
+ "status.edited": "Ymunodd {date}",
+ "status.edited_x_times": "Golygwyd {count, plural, one {unwaith} two {dwywaith} other {{count} gwaith}}",
"status.embed": "Plannu",
"status.favourite": "Hoffi",
"status.filtered": "Wedi'i hidlo",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "{name} greuodd {date}",
+ "status.history.edited": "{name} olygodd {date}",
"status.load_more": "Llwythwch mwy",
"status.media_hidden": "Cyfryngau wedi'u cuddio",
"status.mention": "Crybwyll @{name}",
"status.more": "Mwy",
"status.mute": "Tawelu @{name}",
"status.mute_conversation": "Tawelu sgwrs",
- "status.open": "Ehangu'r tŵt hwn",
+ "status.open": "Ehangu'r post hwn",
"status.pin": "Pinio ar y proffil",
- "status.pinned": "Pinio tŵt",
+ "status.pinned": "Post wedi'i binio",
"status.read_more": "Darllen mwy",
"status.reblog": "Hybu",
"status.reblog_private": "Hybu i'r gynulleidfa wreiddiol",
- "status.reblogged_by": "Bŵstio {name}",
- "status.reblogs.empty": "Does neb wedi bŵstio'r tŵt yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
+ "status.reblogged_by": "Hybodd {name}",
+ "status.reblogs.empty": "Does neb wedi hybio'r post yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
"status.redraft": "Dileu & ailddrafftio",
"status.remove_bookmark": "Tynnu'r tudalnod",
"status.reply": "Ateb",
@@ -502,7 +507,7 @@
"timeline_hint.remote_resource_not_displayed": "ni chaiff {resource} o gweinyddion eraill ei ddangos.",
"timeline_hint.resources.followers": "Dilynwyr",
"timeline_hint.resources.follows": "Yn dilyn",
- "timeline_hint.resources.statuses": "Tŵtiau henach",
+ "timeline_hint.resources.statuses": "Postiadau hŷn",
"trends.counter_by_accounts": "{count, plural, one {{counter} berson} other {{counter} o bobl}}",
"trends.trending_now": "Yn tueddu nawr",
"ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
@@ -515,19 +520,20 @@
"upload_error.poll": "Nid oes modd uwchlwytho ffeiliau â phleidleisiau.",
"upload_form.audio_description": "Disgrifio ar gyfer pobl sydd â cholled clyw",
"upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
+ "upload_form.description_missing": "Dim disgrifiad wedi'i ychwanegu",
"upload_form.edit": "Golygu",
"upload_form.thumbnail": "Newid mân-lun",
"upload_form.undo": "Dileu",
"upload_form.video_description": "Disgrifio ar gyfer pobl sydd â cholled clyw neu amhariad golwg",
"upload_modal.analyzing_picture": "Dadansoddi llun…",
"upload_modal.apply": "Gweithredu",
- "upload_modal.applying": "Applying…",
+ "upload_modal.applying": "Gweithio…",
"upload_modal.choose_image": "Dewis delwedd",
"upload_modal.description_placeholder": "Mae ei phen bach llawn jocs, 'run peth a fy nghot golff, rhai dyddiau",
"upload_modal.detect_text": "Canfod testun o'r llun",
"upload_modal.edit_media": "Golygu cyfryngau",
"upload_modal.hint": "Cliciwch neu llusgwch y cylch ar y rhagolwg i ddewis y canolbwynt a fydd bob amser i'w weld ar bob mân-lunau.",
- "upload_modal.preparing_ocr": "Preparing OCR…",
+ "upload_modal.preparing_ocr": "Paratoi OCR…",
"upload_modal.preview_label": "Rhagolwg ({ratio})",
"upload_progress.label": "Uwchlwytho...",
"video.close": "Cau fideo",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 12023bfb0..537fa6af6 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Kun lokalt",
"community.column_settings.media_only": "Kun medier",
"community.column_settings.remote_only": "Kun udefra",
- "compose_form.direct_message_warning": "Indlægget sendes kun til de nævnte brugere.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Få mere at vide",
+ "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende krypteret. Del derfor ikke sensitiv information via Mastodon.",
"compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, idet kun offentlige indlæg kan søges via hashtags.",
"compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.",
"compose_form.lock_disclaimer.lock": "låst",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Fjern denne valgmulighed",
"compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype",
"compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype",
- "compose_form.publish": "Udgiv",
+ "compose_form.publish": "Publicér",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Gem ændringer",
"compose_form.sensitive.hide": "{count, plural, one {Markér medie som følsomt} other {Markér medier som følsomme}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Indlejr dette indlæg på dit websted ved at kopiere nedenstående kode.",
"embed.preview": "Sådan kommer det til at se ud:",
"emoji_button.activity": "Aktivitet",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Tilpasset",
"emoji_button.flags": "Flag",
"emoji_button.food": "Mad og drikke",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Ingen brugere blokeret endnu.",
"empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.",
"empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!",
- "empty_column.direct": "Du har endnu ingen direkte beskeder. Når du sender eller modtager én, vil den dukke op hér.",
+ "empty_column.direct": "Der er endnu ingen direkte beskeder. Når en sendes eller modtages, dukker den op hér.",
"empty_column.domain_blocks": "Ingen blokerede domæner endnu.",
"empty_column.explore_statuses": "Ingen nye tendensen pt. Tjek igen senere!",
"empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du favoritmarkerer ét, vil det dukke op hér.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Fokusér kolonne",
"keyboard_shortcuts.compose": "Fokusér skriveområdet",
"keyboard_shortcuts.description": "Beskrivelse",
- "keyboard_shortcuts.direct": "Åbn Direkte beskeder-kolonnen",
+ "keyboard_shortcuts.direct": "for at åbne direkte beskeder-kolonnen",
"keyboard_shortcuts.down": "Flyt nedad på listen",
"keyboard_shortcuts.enter": "Åbn indlæg",
"keyboard_shortcuts.favourite": "Favoritmarkér indlæg",
@@ -264,6 +267,8 @@
"lightbox.expand": "Udvid billedevisningsfelt",
"lightbox.next": "Næste",
"lightbox.previous": "Forrige",
+ "limited_account_hint.action": "Vis profil alligevel",
+ "limited_account_hint.title": "Denne profil er blevet skjult af servermoderatorerne.",
"lists.account.add": "Føj til liste",
"lists.account.remove": "Fjern fra liste",
"lists.delete": "Slet liste",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Fjern afstemning",
"privacy.change": "Justér indlægsfortrolighed",
"privacy.direct.long": "Kun synlig for nævnte brugere",
- "privacy.direct.short": "Direkte",
+ "privacy.direct.short": "Kun nævnte personer",
"privacy.private.long": "Kun synlig for følgere",
- "privacy.private.short": "Kun for følgere",
- "privacy.public.long": "Synlig for alle, fremgår på offentlige tidslinjer",
+ "privacy.private.short": "Kun følgere",
+ "privacy.public.long": "Synlig for alle",
"privacy.public.short": "Offentlig",
- "privacy.unlisted.long": "Synlig for alle, fremgår ikke på offentlige tidslinjer",
+ "privacy.unlisted.long": "Synlig for alle, men med fravalgt visning i opdagelsesfunktioner",
"privacy.unlisted.short": "Diskret",
"refresh": "Genindlæs",
"regeneration_indicator.label": "Indlæser…",
@@ -506,15 +511,16 @@
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} personer}} taler",
"trends.trending_now": "Hot lige nu",
"ui.beforeunload": "Dit udkast går tabt, hvis du lukker Mastodon.",
- "units.short.billion": "{count} MIA",
- "units.short.million": "{count} M",
- "units.short.thousand": "{count} K",
+ "units.short.billion": "{count} mia.",
+ "units.short.million": "{count} mio.",
+ "units.short.thousand": "{count} tusind",
"upload_area.title": "Træk og slip for at uploade",
"upload_button.label": "Tilføj billed-, video- eller lydfil(er)",
"upload_error.limit": "Grænse for filupload nået.",
"upload_error.poll": "Filupload ikke tilladt for afstemninger.",
"upload_form.audio_description": "Beskrivelse til hørehæmmede",
"upload_form.description": "Beskrivelse til svagtseende",
+ "upload_form.description_missing": "Ingen beskrivelse tilføjet",
"upload_form.edit": "Redigér",
"upload_form.thumbnail": "Skift miniature",
"upload_form.undo": "Slet",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 72c723e2e..aaf552a1e 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -19,16 +19,16 @@
"account.followers.empty": "Diesem Profil folgt noch niemand.",
"account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
"account.following": "Folgt",
- "account.following_counter": "{count, plural, one {{counter} Folgender} other {{counter} Folgende}}",
- "account.follows.empty": "Dieses Profil folgt noch niemandem.",
+ "account.following_counter": "{count, plural, one {{counter} Folgt} other {{counter} Folgt}}",
+ "account.follows.empty": "Diesem Profil folgt niemand",
"account.follows_you": "Folgt dir",
"account.hide_reblogs": "Geteilte Beiträge von @{name} verbergen",
"account.joined": "Beigetreten am {date}",
- "account.link_verified_on": "Besitz dieses Links wurde geprüft am {date}",
- "account.locked_info": "Der Privatsphärenstatus dieses Accounts wurde auf gesperrt gesetzt. Die Person bestimmt manuell wer ihm/ihr folgen darf.",
+ "account.link_verified_on": "Diesem Profil folgt niemand",
+ "account.locked_info": "Der Privatsphärenstatus dieses Accounts wurde auf „gesperrt“ gesetzt. Die Person bestimmt manuell, wer ihm/ihr folgen darf.",
"account.media": "Medien",
"account.mention": "@{name} erwähnen",
- "account.moved_to": "{name} ist umgezogen auf:",
+ "account.moved_to": "{name} ist umgezogen nach:",
"account.mute": "@{name} stummschalten",
"account.mute_notifications": "Benachrichtigungen von @{name} stummschalten",
"account.muted": "Stummgeschaltet",
@@ -39,26 +39,26 @@
"account.share": "Profil von @{name} teilen",
"account.show_reblogs": "Von @{name} geteilte Beiträge anzeigen",
"account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
- "account.unblock": "@{name} entblocken",
+ "account.unblock": "Blockierung von @{name} aufheben",
"account.unblock_domain": "{domain} wieder anzeigen",
"account.unblock_short": "Blockierung aufheben",
- "account.unendorse": "Nicht auf Profil hervorheben",
+ "account.unendorse": "Nicht mehr im Profil anzeigen",
"account.unfollow": "Entfolgen",
- "account.unmute": "@{name} nicht mehr stummschalten",
+ "account.unmute": "Stummschaltung von @{name} aufheben",
"account.unmute_notifications": "Benachrichtigungen von @{name} einschalten",
- "account.unmute_short": "Nicht mehr stummschalten",
+ "account.unmute_short": "Stummschaltung aufheben",
"account_note.placeholder": "Notiz durch Klicken hinzufügen",
"admin.dashboard.daily_retention": "Benutzerverbleibrate nach Tag nach Anmeldung",
"admin.dashboard.monthly_retention": "Benutzerverbleibrate nach Monat nach Anmeldung",
"admin.dashboard.retention.average": "Durchschnitt",
- "admin.dashboard.retention.cohort": "Anmeldemonat",
+ "admin.dashboard.retention.cohort": "Monat der Anmeldung",
"admin.dashboard.retention.cohort_size": "Neue Benutzer",
- "alert.rate_limited.message": "Bitte versuche es nach {retry_time, time, medium}.",
+ "alert.rate_limited.message": "Bitte versuche es nach {retry_time, time, medium} erneut.",
"alert.rate_limited.title": "Anfragelimit überschritten",
"alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.",
"alert.unexpected.title": "Hoppla!",
"announcement.announcement": "Ankündigung",
- "attachments_list.unprocessed": "(unverarbeitet)",
+ "attachments_list.unprocessed": "(ausstehend)",
"autosuggest_hashtag.per_week": "{count} pro Woche",
"boost_modal.combo": "Drücke {combo}, um dieses Fenster zu überspringen",
"bundle_column_error.body": "Etwas ist beim Laden schiefgelaufen.",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Nur lokal",
"community.column_settings.media_only": "Nur Medien",
"community.column_settings.remote_only": "Nur entfernt",
- "compose_form.direct_message_warning": "Dieser Beitrag wird nur für die erwähnten Nutzer sichtbar sein.",
+ "compose.language.change": "Sprache ändern",
+ "compose.language.search": "Sprachen durchsuchen...",
"compose_form.direct_message_warning_learn_more": "Mehr erfahren",
+ "compose_form.encryption_warning": "Beiträge von Mastodon sind nicht Ende-zu-Ende verschlüsselt. Teile keine senible Informationen über Mastodon.",
"compose_form.hashtag_warning": "Dieser Beitrag wird nicht durch Hashtags entdeckbar sein, weil er ungelistet ist. Nur öffentliche Beiträge tauchen in Hashtag-Zeitleisten auf.",
"compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Wer dir folgen will, kann das jederzeit tun und dann auch deine privaten Beiträge sehen.",
"compose_form.lock_disclaimer.lock": "gesperrt",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Wahl entfernen",
"compose_form.poll.switch_to_multiple": "Umfrage ändern, um mehrere Optionen zu erlauben",
"compose_form.poll.switch_to_single": "Umfrage ändern, um eine einzige Wahl zu erlauben",
- "compose_form.publish": "Tröt",
+ "compose_form.publish": "Veröffentlichen",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Änderungen speichern",
"compose_form.sensitive.hide": "Medien als NSFW markieren",
@@ -133,7 +135,7 @@
"confirmations.redraft.confirm": "Löschen und neu erstellen",
"confirmations.redraft.message": "Bist du dir sicher, dass du diesen Beitrag löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Beitrag werden verwaist sein.",
"confirmations.reply.confirm": "Antworten",
- "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?",
+ "confirmations.reply.message": "Wenn du jetzt antwortest wird die gesamte Nachricht verworfen, die du gerade schreibst. Möchtest du wirklich fortfahren?",
"confirmations.unfollow.confirm": "Entfolgen",
"confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?",
"conversation.delete": "Unterhaltung löschen",
@@ -147,6 +149,7 @@
"embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.",
"embed.preview": "So wird es aussehen:",
"emoji_button.activity": "Aktivitäten",
+ "emoji_button.clear": "Leeren",
"emoji_button.custom": "Eigene",
"emoji_button.flags": "Flaggen",
"emoji_button.food": "Essen und Trinken",
@@ -165,18 +168,18 @@
"empty_column.account_unavailable": "Konto nicht verfügbar",
"empty_column.blocks": "Du hast keine Profile blockiert.",
"empty_column.bookmarked_statuses": "Du hast bis jetzt keine Beiträge als Lesezeichen gespeichert. Wenn du einen Beitrag als Lesezeichen speicherst wird er hier erscheinen.",
- "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Ball ins Rollen zu bringen!",
- "empty_column.direct": "Du hast noch keine Direktnachrichten erhalten. Wenn du eine sendest oder empfängst, wird sie hier zu sehen sein.",
+ "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!",
+ "empty_column.direct": "Du hast noch keine Direktnachrichten. Sobald du eine sendest oder empfängst, wird sie hier zu sehen sein.",
"empty_column.domain_blocks": "Es sind noch keine Domains versteckt.",
- "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder!",
+ "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder vorbei!",
"empty_column.favourited_statuses": "Du hast noch keine favorisierten Tröts. Wenn du einen favorisierst, wird er hier erscheinen.",
"empty_column.favourites": "Noch niemand hat diesen Beitrag favorisiert. Sobald es jemand tut, wird das hier angezeigt.",
"empty_column.follow_recommendations": "Es sieht so aus, als könnten keine Vorschläge für dich generiert werden. Du kannst versuchen nach Leuten zu suchen, die du vielleicht kennst oder du kannst angesagte Hashtags erkunden.",
"empty_column.follow_requests": "Du hast noch keine Folge-Anfragen. Sobald du eine erhältst, wird sie hier angezeigt.",
"empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.",
- "empty_column.home": "Deine Startseite ist leer! Besuche {public} oder nutze die Suche, um loszulegen und andere Leute zu finden.",
+ "empty_column.home": "Deine Startseite ist leer! Folge mehr Leuten, um sie zu füllen. {suggestions}",
"empty_column.home.suggestions": "Ein paar Vorschläge ansehen",
- "empty_column.list": "Diese Liste ist derzeit leer. Wenn Wesen auf dieser Liste neue Beiträge veröffentlichen werden sie hier erscheinen.",
+ "empty_column.list": "Diese Liste ist derzeit leer. Wenn Konten auf dieser Liste neue Beiträge veröffentlichen werden sie hier erscheinen.",
"empty_column.lists": "Du hast noch keine Listen. Wenn du eine anlegst, wird sie hier angezeigt.",
"empty_column.mutes": "Du hast keine Profile stummgeschaltet.",
"empty_column.notifications": "Du hast noch keine Mitteilungen. Interagiere mit anderen, um ins Gespräch zu kommen.",
@@ -198,7 +201,7 @@
"follow_recommendations.lead": "Beiträge von Personen, denen du folgst, werden in chronologischer Reihenfolge auf deiner Startseite angezeigt. Hab keine Angst, Fehler zu machen, du kannst den Leuten jederzeit wieder entfolgen!",
"follow_request.authorize": "Erlauben",
"follow_request.reject": "Ablehnen",
- "follow_requests.unlocked_explanation": "Auch wenn dein Konto nicht gesperrt ist, haben die Mitarbeiter von {domain} gedacht, dass es besser wäre den Follow manuell zu bestätigen.",
+ "follow_requests.unlocked_explanation": "Auch wenn dein Konto nicht gesperrt ist, haben die Moderator_innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.",
"generic.saved": "Gespeichert",
"getting_started.developers": "Entwickler",
"getting_started.directory": "Profilverzeichnis",
@@ -225,13 +228,13 @@
"intervals.full.days": "{number, plural, one {# Tag} other {# Tage}}",
"intervals.full.hours": "{number, plural, one {# Stunde} other {# Stunden}}",
"intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}",
- "keyboard_shortcuts.back": "zurück navigieren",
+ "keyboard_shortcuts.back": "Zurück navigieren",
"keyboard_shortcuts.blocked": "Liste blockierter Profile öffnen",
"keyboard_shortcuts.boost": "teilen",
"keyboard_shortcuts.column": "einen Beitrag in einer der Spalten fokussieren",
"keyboard_shortcuts.compose": "fokussiere das Eingabefeld",
"keyboard_shortcuts.description": "Beschreibung",
- "keyboard_shortcuts.direct": "Direct-Message-Spalte öffnen",
+ "keyboard_shortcuts.direct": "um Direktnachrichtenspalte zu öffnen",
"keyboard_shortcuts.down": "sich in der Liste hinunter bewegen",
"keyboard_shortcuts.enter": "Beitrag öffnen",
"keyboard_shortcuts.favourite": "um zu favorisieren",
@@ -264,6 +267,8 @@
"lightbox.expand": "Bildansicht erweitern",
"lightbox.next": "Weiter",
"lightbox.previous": "Zurück",
+ "limited_account_hint.action": "Profil trotzdem anzeigen",
+ "limited_account_hint.title": "Dieses Profil wurde von den Moderatoren deines Servers versteckt.",
"lists.account.add": "Zur Liste hinzufügen",
"lists.account.remove": "Von der Liste entfernen",
"lists.delete": "Liste löschen",
@@ -279,7 +284,7 @@
"lists.subheading": "Deine Listen",
"load_pending": "{count, plural, one {# neuer Beitrag} other {# neue Beiträge}}",
"loading_indicator.label": "Wird geladen …",
- "media_gallery.toggle_visible": "Sichtbarkeit umschalten",
+ "media_gallery.toggle_visible": "{number, plural, one {Bild verbergen} other {Bilder verbergen}}",
"missing_indicator.label": "Nicht gefunden",
"missing_indicator.sublabel": "Die Ressource konnte nicht gefunden werden",
"mute_modal.duration": "Dauer",
@@ -346,7 +351,7 @@
"notifications.filter.mentions": "Erwähnungen",
"notifications.filter.polls": "Ergebnisse der Umfrage",
"notifications.filter.statuses": "Updates von Personen, denen du folgst",
- "notifications.grant_permission": "Zugriff gewährt.",
+ "notifications.grant_permission": "Berechtigung erteilen.",
"notifications.group": "{count} Benachrichtigungen",
"notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren",
"notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Umfrage entfernen",
"privacy.change": "Sichtbarkeit des Beitrags anpassen",
"privacy.direct.long": "Wird an erwähnte Profile gesendet",
- "privacy.direct.short": "Direktnachricht",
+ "privacy.direct.short": "Nur erwähnte Personen",
"privacy.private.long": "Nur für Folgende sichtbar",
- "privacy.private.short": "Nur für Folgende",
- "privacy.public.long": "Wird in öffentlichen Zeitleisten erscheinen",
+ "privacy.private.short": "Nur Follower",
+ "privacy.public.long": "Für alle sichtbar",
"privacy.public.short": "Öffentlich",
- "privacy.unlisted.long": "Wird in öffentlichen Zeitleisten nicht gezeigt",
+ "privacy.unlisted.long": "Sichtbar für alle, aber nicht über Entdeckungsfunktionen",
"privacy.unlisted.short": "Nicht gelistet",
"refresh": "Aktualisieren",
"regeneration_indicator.label": "Laden…",
@@ -393,23 +398,23 @@
"report.block_explanation": "Du wirst die Beiträge von diesem Konto nicht sehen. Das Konto wird nicht in der Lage sein, deine Beiträge zu sehen oder dir zu folgen. Die Person hinter dem Konto wird wissen, dass du das Konto blockiert hast.",
"report.categories.other": "Andere",
"report.categories.spam": "Spam",
- "report.categories.violation": "Inhalt verletzt ein oder mehrere Server-Regeln",
- "report.category.subtitle": "Wähle die beste Zugehörigkeit",
- "report.category.title": "Sag uns, was mit diesem {type} vor sich geht",
+ "report.categories.violation": "Der Inhalt verletzt eine oder mehrere Server-Regeln",
+ "report.category.subtitle": "Wähle die passendste Kategorie",
+ "report.category.title": "Sag uns, was das Problem mit diesem {type} ist",
"report.category.title_account": "Profil",
"report.category.title_status": "Beitrag",
"report.close": "Fertig",
"report.comment.title": "Gibt es etwas anderes, was wir wissen sollten?",
"report.forward": "An {target} weiterleiten",
- "report.forward_hint": "Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie des Berichts auch dorthin geschickt werden?",
+ "report.forward_hint": "Dieses Konto gehört zu einem anderen Server. Soll eine anonymisierte Kopie der Meldung auch dorthin geschickt werden?",
"report.mute": "Stummschalten",
"report.mute_explanation": "Du wirst die Beiträge vom Konto nicht mehr sehen. Das Konto kann dir immernoch folgen und die Person hinter dem Konto wird deine Beiträge sehen können und nicht wissen, dass du sie stumm geschaltet hast.",
"report.next": "Weiter",
"report.placeholder": "Zusätzliche Kommentare",
"report.reasons.dislike": "Das gefällt mir nicht",
- "report.reasons.dislike_description": "Das ist nicht etwas, was ihr nicht sehen wollt",
+ "report.reasons.dislike_description": "Es ist etwas, das du nicht sehen willst",
"report.reasons.other": "Da ist was anderes",
- "report.reasons.other_description": "Das Problem passt nicht in eine der Kategorien",
+ "report.reasons.other_description": "Das Problem passt nicht in die Kategorien",
"report.reasons.spam": "Das ist Spam",
"report.reasons.spam_description": "Bösartige Links, gefälschtes Engagement oder wiederholte Antworten",
"report.reasons.violation": "Es verstößt gegen Serverregeln",
@@ -420,10 +425,10 @@
"report.statuses.title": "Gibt es Beiträge, die diesen Bericht unterstützen?",
"report.submit": "Absenden",
"report.target": "{target} melden",
- "report.thanks.take_action": "Hier sind deine Optionen, die es dir erlauben zu kontrollieren, was du auf Mastodon sehen möchtest:",
+ "report.thanks.take_action": "Das sind deine Möglichkeiten, zu bestimmen, was du auf Mastodon sehen möchtest:",
"report.thanks.take_action_actionable": "Während wir dies überprüfen, kannst du gegen @{name} vorgehen:",
"report.thanks.title": "Möchtest du das nicht sehen?",
- "report.thanks.title_actionable": "Vielen Dank für die Berichterstattung, wir werden uns damit befassen.",
+ "report.thanks.title_actionable": "Vielen Dank für die Meldung, wir werden uns das ansehen.",
"report.unfollow": "@{name} entfolgen",
"report.unfollow_explanation": "Du folgst diesem Konto. Um die Beiträge nicht mehr auf deiner Startseite zu sehen, entfolge dem Konto.",
"search.placeholder": "Suche",
@@ -515,6 +520,7 @@
"upload_error.poll": "Dateiuploads sind in Kombination mit Umfragen nicht erlaubt.",
"upload_form.audio_description": "Beschreibe die Audiodatei für Menschen mit Hörschädigungen",
"upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
+ "upload_form.description_missing": "Keine Beschreibung hinzugefügt",
"upload_form.edit": "Bearbeiten",
"upload_form.thumbnail": "Miniaturansicht ändern",
"upload_form.undo": "Löschen",
@@ -523,7 +529,7 @@
"upload_modal.apply": "Übernehmen",
"upload_modal.applying": "Anwenden…",
"upload_modal.choose_image": "Bild auswählen",
- "upload_modal.description_placeholder": "Die heiße Zypernsonne quälte Max und Victoria ja böse auf dem Weg bis zur Küste",
+ "upload_modal.description_placeholder": "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich",
"upload_modal.detect_text": "Text aus Bild erkennen",
"upload_modal.edit_media": "Medien bearbeiten",
"upload_modal.hint": "Klicke oder ziehe den Kreis auf die Vorschau, um den Brennpunkt auszuwählen, der immer auf allen Vorschaubilder angezeigt wird.",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index ff69a8c51..8c46acf6d 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -75,6 +75,14 @@
{
"defaultMessage": "Unmute notifications from @{name}",
"id": "account.unmute_notifications"
+ },
+ {
+ "defaultMessage": "Mute @{name}",
+ "id": "account.mute"
+ },
+ {
+ "defaultMessage": "Block @{name}",
+ "id": "account.block"
}
],
"path": "app/javascript/mastodon/components/account.json"
@@ -206,7 +214,7 @@
{
"descriptors": [
{
- "defaultMessage": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+ "defaultMessage": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
"id": "account.statuses_counter"
},
{
@@ -659,7 +667,7 @@
"id": "privacy.private.short"
},
{
- "defaultMessage": "Direct",
+ "defaultMessage": "Mentioned people only",
"id": "privacy.direct.short"
},
{
@@ -671,7 +679,7 @@
"id": "status.filtered"
},
{
- "defaultMessage": "Pinned toot",
+ "defaultMessage": "Pinned post",
"id": "status.pinned"
},
{
@@ -773,11 +781,11 @@
{
"descriptors": [
{
- "defaultMessage": "Toots",
+ "defaultMessage": "Posts",
"id": "account.posts"
},
{
- "defaultMessage": "Toots and replies",
+ "defaultMessage": "Posts and replies",
"id": "account.posts_with_replies"
},
{
@@ -787,6 +795,19 @@
],
"path": "app/javascript/mastodon/features/account_timeline/components/header.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "This profile has been hidden by the moderators of your server.",
+ "id": "limited_account_hint.title"
+ },
+ {
+ "defaultMessage": "Show profile anyway",
+ "id": "limited_account_hint.action"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/account_timeline/components/limited_account_hint.json"
+ },
{
"descriptors": [
{
@@ -820,7 +841,7 @@
{
"descriptors": [
{
- "defaultMessage": "Older toots",
+ "defaultMessage": "Older posts",
"id": "timeline_hint.resources.statuses"
},
{
@@ -832,7 +853,7 @@
"id": "empty_column.account_unavailable"
},
{
- "defaultMessage": "No toots here!",
+ "defaultMessage": "No posts found",
"id": "empty_column.account_timeline"
}
],
@@ -946,7 +967,7 @@
"id": "account.disable_notifications"
},
{
- "defaultMessage": "Pinned toots",
+ "defaultMessage": "Pinned posts",
"id": "navigation_bar.pins"
},
{
@@ -1069,7 +1090,7 @@
"id": "column.bookmarks"
},
{
- "defaultMessage": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
+ "defaultMessage": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
"id": "empty_column.bookmarked_statuses"
}
],
@@ -1104,7 +1125,7 @@
"id": "account.edit_profile"
},
{
- "defaultMessage": "Pinned toots",
+ "defaultMessage": "Pinned posts",
"id": "navigation_bar.pins"
},
{
@@ -1161,7 +1182,7 @@
"id": "compose_form.spoiler_placeholder"
},
{
- "defaultMessage": "Toot",
+ "defaultMessage": "Publish",
"id": "compose_form.publish"
},
{
@@ -1236,6 +1257,23 @@
],
"path": "app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Change language",
+ "id": "compose.language.change"
+ },
+ {
+ "defaultMessage": "Search languages...",
+ "id": "compose.language.search"
+ },
+ {
+ "defaultMessage": "Clear",
+ "id": "emoji_button.clear"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/compose/components/language_dropdown.json"
+ },
{
"descriptors": [
{
@@ -1306,7 +1344,7 @@
"id": "privacy.public.short"
},
{
- "defaultMessage": "Visible for all, shown in public timelines",
+ "defaultMessage": "Visible for all",
"id": "privacy.public.long"
},
{
@@ -1314,11 +1352,11 @@
"id": "privacy.unlisted.short"
},
{
- "defaultMessage": "Visible for all, but not in public timelines",
+ "defaultMessage": "Visible for all, but opted-out of discovery features",
"id": "privacy.unlisted.long"
},
{
- "defaultMessage": "Followers-only",
+ "defaultMessage": "Followers only",
"id": "privacy.private.short"
},
{
@@ -1326,7 +1364,7 @@
"id": "privacy.private.long"
},
{
- "defaultMessage": "Direct",
+ "defaultMessage": "Mentioned people only",
"id": "privacy.direct.short"
},
{
@@ -1364,11 +1402,11 @@
"id": "search_results.accounts"
},
{
- "defaultMessage": "Toots",
+ "defaultMessage": "Posts",
"id": "search_results.statuses"
},
{
- "defaultMessage": "Searching toots by their content is not enabled on this Mastodon server.",
+ "defaultMessage": "Searching posts by their content is not enabled on this Mastodon server.",
"id": "search_results.statuses_fts_disabled"
},
{
@@ -1442,6 +1480,10 @@
{
"defaultMessage": "Edit",
"id": "upload_form.edit"
+ },
+ {
+ "defaultMessage": "No description added",
+ "id": "upload_form.description_missing"
}
],
"path": "app/javascript/mastodon/features/compose/components/upload.json"
@@ -1500,12 +1542,12 @@
"id": "compose_form.lock_disclaimer.lock"
},
{
- "defaultMessage": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+ "defaultMessage": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"id": "compose_form.hashtag_warning"
},
{
- "defaultMessage": "This toot will only be sent to all the mentioned users.",
- "id": "compose_form.direct_message_warning"
+ "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "id": "compose_form.encryption_warning"
},
{
"defaultMessage": "Learn more",
@@ -1545,7 +1587,7 @@
"id": "navigation_bar.logout"
},
{
- "defaultMessage": "Compose new toot",
+ "defaultMessage": "Compose new post",
"id": "navigation_bar.compose"
},
{
@@ -1615,6 +1657,14 @@
"defaultMessage": "Direct messages",
"id": "column.direct"
},
+ {
+ "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "id": "compose_form.encryption_warning"
+ },
+ {
+ "defaultMessage": "Learn more",
+ "id": "compose_form.direct_message_warning_learn_more"
+ },
{
"defaultMessage": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"id": "empty_column.direct"
@@ -1661,7 +1711,7 @@
"id": "confirmations.unfollow.message"
},
{
- "defaultMessage": "Toots",
+ "defaultMessage": "Posts",
"id": "account.posts"
},
{
@@ -1765,7 +1815,7 @@
"id": "search_results.hashtags"
},
{
- "defaultMessage": "Toots",
+ "defaultMessage": "Posts",
"id": "search_results.statuses"
}
],
@@ -1787,7 +1837,7 @@
"id": "column.favourites"
},
{
- "defaultMessage": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+ "defaultMessage": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
"id": "empty_column.favourited_statuses"
}
],
@@ -1800,7 +1850,7 @@
"id": "refresh"
},
{
- "defaultMessage": "No one has favourited this toot yet. When someone does, they will show up here.",
+ "defaultMessage": "No one has favourited this post yet. When someone does, they will show up here.",
"id": "empty_column.favourites"
}
],
@@ -1876,6 +1926,10 @@
"defaultMessage": "Followers",
"id": "timeline_hint.resources.followers"
},
+ {
+ "defaultMessage": "Account suspended",
+ "id": "empty_column.account_suspended"
+ },
{
"defaultMessage": "Profile unavailable",
"id": "empty_column.account_unavailable"
@@ -1893,6 +1947,10 @@
"defaultMessage": "Follows",
"id": "timeline_hint.resources.follows"
},
+ {
+ "defaultMessage": "Account suspended",
+ "id": "empty_column.account_suspended"
+ },
{
"defaultMessage": "Profile unavailable",
"id": "empty_column.account_unavailable"
@@ -1993,7 +2051,7 @@
"id": "navigation_bar.mutes"
},
{
- "defaultMessage": "Pinned toots",
+ "defaultMessage": "Pinned posts",
"id": "navigation_bar.pins"
},
{
@@ -2182,7 +2240,7 @@
"id": "keyboard_shortcuts.compose"
},
{
- "defaultMessage": "to start a brand new toot",
+ "defaultMessage": "to start a brand new post",
"id": "keyboard_shortcuts.toot"
},
{
@@ -2230,7 +2288,7 @@
"id": "keyboard_shortcuts.favourites"
},
{
- "defaultMessage": "to open pinned toots list",
+ "defaultMessage": "to open pinned posts list",
"id": "keyboard_shortcuts.pinned"
},
{
@@ -2464,7 +2522,7 @@
"id": "notifications.column_settings.poll"
},
{
- "defaultMessage": "New toots:",
+ "defaultMessage": "New posts:",
"id": "notifications.column_settings.status"
},
{
@@ -2474,6 +2532,10 @@
{
"defaultMessage": "New sign-ups:",
"id": "notifications.column_settings.admin.sign_up"
+ },
+ {
+ "defaultMessage": "New reports:",
+ "id": "notifications.column_settings.admin.report"
}
],
"path": "app/javascript/mastodon/features/notifications/components/column_settings.json"
@@ -2567,6 +2629,10 @@
"defaultMessage": "{name} signed up",
"id": "notification.admin.sign_up"
},
+ {
+ "defaultMessage": "{name} reported {target}",
+ "id": "notification.admin.report"
+ },
{
"defaultMessage": "{name} has requested to follow you",
"id": "notification.follow_request"
@@ -2595,6 +2661,31 @@
],
"path": "app/javascript/mastodon/features/notifications/components/notifications_permission_banner.json"
},
+ {
+ "descriptors": [
+ {
+ "defaultMessage": "Open report",
+ "id": "report_notification.open"
+ },
+ {
+ "defaultMessage": "Other",
+ "id": "report_notification.categories.other"
+ },
+ {
+ "defaultMessage": "Spam",
+ "id": "report_notification.categories.spam"
+ },
+ {
+ "defaultMessage": "Rule violation",
+ "id": "report_notification.categories.violation"
+ },
+ {
+ "defaultMessage": "{count, plural, one {{count} post} other {{count} posts}} attached",
+ "id": "report_notification.attached_statuses"
+ }
+ ],
+ "path": "app/javascript/mastodon/features/notifications/components/report.json"
+ },
{
"descriptors": [
{
@@ -2686,7 +2777,7 @@
{
"descriptors": [
{
- "defaultMessage": "Pinned toot",
+ "defaultMessage": "Pinned post",
"id": "column.pins"
}
],
@@ -2725,7 +2816,7 @@
"id": "refresh"
},
{
- "defaultMessage": "No one has boosted this toot yet. When someone does, they will show up here.",
+ "defaultMessage": "No one has boosted this post yet. When someone does, they will show up here.",
"id": "status.reblogs.empty"
}
],
@@ -3249,7 +3340,7 @@
{
"descriptors": [
{
- "defaultMessage": "Toot",
+ "defaultMessage": "Publish",
"id": "compose_form.publish"
}
],
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 3c797d47d..6f324860c 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Τοπικά μόνο",
"community.column_settings.media_only": "Μόνο πολυμέσα",
"community.column_settings.remote_only": "Απομακρυσμένα μόνο",
- "compose_form.direct_message_warning": "Αυτό το τουτ θα σταλεί μόνο στους αναφερόμενους χρήστες.",
+ "compose.language.change": "Αλλαγή γλώσσας",
+ "compose.language.search": "Αναζήτηση γλωσσών...",
"compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα",
+ "compose_form.encryption_warning": "Οι δημοσιεύσεις στο Mastodon δεν είναι κρυπτογραφημένες από άκρο σε άκρο. Μην μοιράζεστε ευαίσθητες πληροφορίες μέσω του Mastodon.",
"compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από κανένα hashtag καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά hashtag.",
"compose_form.lock_disclaimer": "Ο λογαριασμός σου δεν είναι {locked}. Οποιοσδήποτε μπορεί να σε ακολουθήσει για να δει τις δημοσιεύσεις σας προς τους ακολούθους σας.",
"compose_form.lock_disclaimer.lock": "κλειδωμένο",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Αφαίρεση επιλογής",
"compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές",
"compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή",
- "compose_form.publish": "Τουτ",
+ "compose_form.publish": "Δημοσίευση",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Αποθήκευση αλλαγών",
"compose_form.sensitive.hide": "Σημείωσε τα πολυμέσα ως ευαίσθητα",
@@ -147,6 +149,7 @@
"embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.",
"embed.preview": "Ορίστε πως θα φαίνεται:",
"emoji_button.activity": "Δραστηριότητα",
+ "emoji_button.clear": "Καθαρισμός",
"emoji_button.custom": "Προσαρμοσμένα",
"emoji_button.flags": "Σημαίες",
"emoji_button.food": "Φαγητά & Ποτά",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "εμφάνιση της κατάστασης σε μια από τις στήλες",
"keyboard_shortcuts.compose": "εστίαση στην περιοχή συγγραφής",
"keyboard_shortcuts.description": "Περιγραφή",
- "keyboard_shortcuts.direct": "άνοιγμα στήλης απευθείας μηνυμάτων",
+ "keyboard_shortcuts.direct": "άνοιγμα στήλης προσωπικών μηνυμάτων",
"keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα",
"keyboard_shortcuts.enter": "εμφάνιση κατάστασης",
"keyboard_shortcuts.favourite": "σημείωση ως αγαπημένο",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ανάπτυξη πλαισίου εμφάνισης εικόνας",
"lightbox.next": "Επόμενο",
"lightbox.previous": "Προηγούμενο",
+ "limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως",
+ "limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή σας.",
"lists.account.add": "Πρόσθεσε στη λίστα",
"lists.account.remove": "Βγάλε από τη λίστα",
"lists.delete": "Διαγραφή λίστας",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Αφαίρεση δημοσκόπησης",
"privacy.change": "Προσαρμογή ιδιωτικότητας δημοσίευσης",
"privacy.direct.long": "Δημοσίευση μόνο σε όσους και όσες αναφέρονται",
- "privacy.direct.short": "Προσωπικά",
+ "privacy.direct.short": "Αναφερόμενα άτομα μόνο",
"privacy.private.long": "Δημοσίευση μόνο στους ακόλουθους",
"privacy.private.short": "Μόνο ακόλουθοι",
- "privacy.public.long": "Δημοσίευσε στις δημόσιες ροές",
+ "privacy.public.long": "Ορατό σε όλους",
"privacy.public.short": "Δημόσιο",
- "privacy.unlisted.long": "Μην δημοσιεύσεις στις δημόσιες ροές",
+ "privacy.unlisted.long": "Ορατό για όλους, αλλά opted-out των χαρακτηριστικών της ανακάλυψης",
"privacy.unlisted.short": "Μη καταχωρημένα",
"refresh": "Ανανέωση",
"regeneration_indicator.label": "Φορτώνει…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
"upload_form.audio_description": "Περιγραφή για άτομα με προβλήματα ακοής",
"upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
+ "upload_form.description_missing": "Δεν προστέθηκε περιγραφή",
"upload_form.edit": "Ενημέρωση",
"upload_form.thumbnail": "Αλλαγή μικρογραφίας",
"upload_form.undo": "Διαγραφή",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
new file mode 100644
index 000000000..71874cb45
--- /dev/null
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -0,0 +1,549 @@
+{
+ "account.account_note_header": "Note",
+ "account.add_or_remove_from_list": "Add or Remove from lists",
+ "account.badges.bot": "Bot",
+ "account.badges.group": "Group",
+ "account.block": "Block @{name}",
+ "account.block_domain": "Block domain {domain}",
+ "account.blocked": "Blocked",
+ "account.browse_more_on_origin_server": "Browse more on the original profile",
+ "account.cancel_follow_request": "Cancel follow request",
+ "account.direct": "Direct message @{name}",
+ "account.disable_notifications": "Stop notifying me when @{name} posts",
+ "account.domain_blocked": "Domain blocked",
+ "account.edit_profile": "Edit profile",
+ "account.enable_notifications": "Notify me when @{name} posts",
+ "account.endorse": "Feature on profile",
+ "account.follow": "Follow",
+ "account.followers": "Followers",
+ "account.followers.empty": "No one follows this user yet.",
+ "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Following",
+ "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.follows.empty": "This user doesn't follow anyone yet.",
+ "account.follows_you": "Follows you",
+ "account.hide_reblogs": "Hide boosts from @{name}",
+ "account.joined": "Joined {date}",
+ "account.link_verified_on": "Ownership of this link was checked on {date}",
+ "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+ "account.media": "Media",
+ "account.mention": "Mention @{name}",
+ "account.moved_to": "{name} has moved to:",
+ "account.mute": "Mute @{name}",
+ "account.mute_notifications": "Mute notifications from @{name}",
+ "account.muted": "Muted",
+ "account.posts": "Posts",
+ "account.posts_with_replies": "Posts and replies",
+ "account.report": "Report @{name}",
+ "account.requested": "Awaiting approval. Click to cancel follow request",
+ "account.share": "Share @{name}'s profile",
+ "account.show_reblogs": "Show boosts from @{name}",
+ "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
+ "account.unblock": "Unblock @{name}",
+ "account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
+ "account.unendorse": "Don't feature on profile",
+ "account.unfollow": "Unfollow",
+ "account.unmute": "Unmute @{name}",
+ "account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Unmute",
+ "account_note.placeholder": "Click to add a note",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Average",
+ "admin.dashboard.retention.cohort": "Sign-up month",
+ "admin.dashboard.retention.cohort_size": "New users",
+ "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+ "alert.rate_limited.title": "Rate limited",
+ "alert.unexpected.message": "An unexpected error occurred.",
+ "alert.unexpected.title": "Oops!",
+ "announcement.announcement": "Announcement",
+ "attachments_list.unprocessed": "(unprocessed)",
+ "autosuggest_hashtag.per_week": "{count} per week",
+ "boost_modal.combo": "You can press {combo} to skip this next time",
+ "bundle_column_error.body": "Something went wrong while loading this component.",
+ "bundle_column_error.retry": "Try again",
+ "bundle_column_error.title": "Network error",
+ "bundle_modal_error.close": "Close",
+ "bundle_modal_error.message": "Something went wrong while loading this component.",
+ "bundle_modal_error.retry": "Try again",
+ "column.blocks": "Blocked users",
+ "column.bookmarks": "Bookmarks",
+ "column.community": "Local timeline",
+ "column.direct": "Direct messages",
+ "column.directory": "Browse profiles",
+ "column.domain_blocks": "Blocked domains",
+ "column.favourites": "Favourites",
+ "column.follow_requests": "Follow requests",
+ "column.home": "Home",
+ "column.lists": "Lists",
+ "column.mutes": "Muted users",
+ "column.notifications": "Notifications",
+ "column.pins": "Pinned post",
+ "column.public": "Federated timeline",
+ "column_back_button.label": "Back",
+ "column_header.hide_settings": "Hide settings",
+ "column_header.moveLeft_settings": "Move column to the left",
+ "column_header.moveRight_settings": "Move column to the right",
+ "column_header.pin": "Pin",
+ "column_header.show_settings": "Show settings",
+ "column_header.unpin": "Unpin",
+ "column_subheading.settings": "Settings",
+ "community.column_settings.local_only": "Local only",
+ "community.column_settings.media_only": "Media only",
+ "community.column_settings.remote_only": "Remote only",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
+ "compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
+ "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+ "compose_form.lock_disclaimer.lock": "locked",
+ "compose_form.placeholder": "What is on your mind?",
+ "compose_form.poll.add_option": "Add a choice",
+ "compose_form.poll.duration": "Poll duration",
+ "compose_form.poll.option_placeholder": "Choice {number}",
+ "compose_form.poll.remove_option": "Remove this choice",
+ "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+ "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+ "compose_form.publish": "Publish",
+ "compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
+ "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+ "compose_form.spoiler.marked": "Text is hidden behind warning",
+ "compose_form.spoiler.unmarked": "Text is not hidden",
+ "compose_form.spoiler_placeholder": "Write your warning here",
+ "confirmation_modal.cancel": "Cancel",
+ "confirmations.block.block_and_report": "Block & Report",
+ "confirmations.block.confirm": "Block",
+ "confirmations.block.message": "Are you sure you want to block {name}?",
+ "confirmations.delete.confirm": "Delete",
+ "confirmations.delete.message": "Are you sure you want to delete this status?",
+ "confirmations.delete_list.confirm": "Delete",
+ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+ "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.domain_block.confirm": "Hide entire domain",
+ "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+ "confirmations.logout.confirm": "Log out",
+ "confirmations.logout.message": "Are you sure you want to log out?",
+ "confirmations.mute.confirm": "Mute",
+ "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+ "confirmations.mute.message": "Are you sure you want to mute {name}?",
+ "confirmations.redraft.confirm": "Delete & redraft",
+ "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+ "confirmations.reply.confirm": "Reply",
+ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+ "confirmations.unfollow.confirm": "Unfollow",
+ "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+ "conversation.delete": "Delete conversation",
+ "conversation.mark_as_read": "Mark as read",
+ "conversation.open": "View conversation",
+ "conversation.with": "With {names}",
+ "directory.federated": "From known fediverse",
+ "directory.local": "From {domain} only",
+ "directory.new_arrivals": "New arrivals",
+ "directory.recently_active": "Recently active",
+ "embed.instructions": "Embed this status on your website by copying the code below.",
+ "embed.preview": "Here is what it will look like:",
+ "emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
+ "emoji_button.custom": "Custom",
+ "emoji_button.flags": "Flags",
+ "emoji_button.food": "Food & Drink",
+ "emoji_button.label": "Insert emoji",
+ "emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No matching emojis found",
+ "emoji_button.objects": "Objects",
+ "emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
+ "emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
+ "emoji_button.symbols": "Symbols",
+ "emoji_button.travel": "Travel & Places",
+ "empty_column.account_suspended": "Account suspended",
+ "empty_column.account_timeline": "No posts found",
+ "empty_column.account_unavailable": "Profile unavailable",
+ "empty_column.blocks": "You haven't blocked any users yet.",
+ "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
+ "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+ "empty_column.domain_blocks": "There are no blocked domains yet.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
+ "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
+ "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+ "empty_column.hashtag": "There is nothing in this hashtag yet.",
+ "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
+ "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+ "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+ "empty_column.mutes": "You haven't muted any users yet.",
+ "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.",
+ "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+ "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+ "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+ "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+ "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+ "errors.unexpected_crash.report_issue": "Report issue",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "For you",
+ "explore.title": "Explore",
+ "explore.trending_links": "News",
+ "explore.trending_statuses": "Posts",
+ "explore.trending_tags": "Hashtags",
+ "follow_recommendations.done": "Done",
+ "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
+ "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_request.authorize": "Authorize",
+ "follow_request.reject": "Reject",
+ "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+ "generic.saved": "Saved",
+ "getting_started.developers": "Developers",
+ "getting_started.directory": "Profile directory",
+ "getting_started.documentation": "Documentation",
+ "getting_started.heading": "Getting started",
+ "getting_started.invite": "Invite people",
+ "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+ "getting_started.security": "Security",
+ "getting_started.terms": "Terms of service",
+ "hashtag.column_header.tag_mode.all": "and {additional}",
+ "hashtag.column_header.tag_mode.any": "or {additional}",
+ "hashtag.column_header.tag_mode.none": "without {additional}",
+ "hashtag.column_settings.select.no_options_message": "No suggestions found",
+ "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+ "hashtag.column_settings.tag_mode.all": "All of these",
+ "hashtag.column_settings.tag_mode.any": "Any of these",
+ "hashtag.column_settings.tag_mode.none": "None of these",
+ "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+ "home.column_settings.basic": "Basic",
+ "home.column_settings.show_reblogs": "Show boosts",
+ "home.column_settings.show_replies": "Show replies",
+ "home.hide_announcements": "Hide announcements",
+ "home.show_announcements": "Show announcements",
+ "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+ "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+ "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+ "keyboard_shortcuts.back": "to navigate back",
+ "keyboard_shortcuts.blocked": "to open blocked users list",
+ "keyboard_shortcuts.boost": "to boost",
+ "keyboard_shortcuts.column": "to focus a status in one of the columns",
+ "keyboard_shortcuts.compose": "to focus the compose textarea",
+ "keyboard_shortcuts.description": "Description",
+ "keyboard_shortcuts.direct": "to open direct messages column",
+ "keyboard_shortcuts.down": "to move down in the list",
+ "keyboard_shortcuts.enter": "to open status",
+ "keyboard_shortcuts.favourite": "to favourite",
+ "keyboard_shortcuts.favourites": "to open favourites list",
+ "keyboard_shortcuts.federated": "to open federated timeline",
+ "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+ "keyboard_shortcuts.home": "to open home timeline",
+ "keyboard_shortcuts.hotkey": "Hotkey",
+ "keyboard_shortcuts.legend": "to display this legend",
+ "keyboard_shortcuts.local": "to open local timeline",
+ "keyboard_shortcuts.mention": "to mention author",
+ "keyboard_shortcuts.muted": "to open muted users list",
+ "keyboard_shortcuts.my_profile": "to open your profile",
+ "keyboard_shortcuts.notifications": "to open notifications column",
+ "keyboard_shortcuts.open_media": "to open media",
+ "keyboard_shortcuts.pinned": "to open pinned posts list",
+ "keyboard_shortcuts.profile": "to open author's profile",
+ "keyboard_shortcuts.reply": "to reply",
+ "keyboard_shortcuts.requests": "to open follow requests list",
+ "keyboard_shortcuts.search": "to focus search",
+ "keyboard_shortcuts.spoilers": "to show/hide CW field",
+ "keyboard_shortcuts.start": "to open \"get started\" column",
+ "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+ "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+ "keyboard_shortcuts.toot": "to start a brand new post",
+ "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+ "keyboard_shortcuts.up": "to move up in the list",
+ "lightbox.close": "Close",
+ "lightbox.compress": "Compress image view box",
+ "lightbox.expand": "Expand image view box",
+ "lightbox.next": "Next",
+ "lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
+ "lists.account.add": "Add to list",
+ "lists.account.remove": "Remove from list",
+ "lists.delete": "Delete list",
+ "lists.edit": "Edit list",
+ "lists.edit.submit": "Change title",
+ "lists.new.create": "Add list",
+ "lists.new.title_placeholder": "New list title",
+ "lists.replies_policy.followed": "Any followed user",
+ "lists.replies_policy.list": "Members of the list",
+ "lists.replies_policy.none": "No one",
+ "lists.replies_policy.title": "Show replies to:",
+ "lists.search": "Search among people you follow",
+ "lists.subheading": "Your lists",
+ "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "loading_indicator.label": "Loading...",
+ "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
+ "missing_indicator.label": "Not found",
+ "missing_indicator.sublabel": "This resource could not be found",
+ "mute_modal.duration": "Duration",
+ "mute_modal.hide_notifications": "Hide notifications from this user?",
+ "mute_modal.indefinite": "Indefinite",
+ "navigation_bar.apps": "Mobile apps",
+ "navigation_bar.blocks": "Blocked users",
+ "navigation_bar.bookmarks": "Bookmarks",
+ "navigation_bar.community_timeline": "Local timeline",
+ "navigation_bar.compose": "Compose new post",
+ "navigation_bar.direct": "Direct messages",
+ "navigation_bar.discover": "Discover",
+ "navigation_bar.domain_blocks": "Hidden domains",
+ "navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
+ "navigation_bar.favourites": "Favourites",
+ "navigation_bar.filters": "Muted words",
+ "navigation_bar.follow_requests": "Follow requests",
+ "navigation_bar.follows_and_followers": "Follows and followers",
+ "navigation_bar.info": "About this server",
+ "navigation_bar.keyboard_shortcuts": "Hotkeys",
+ "navigation_bar.lists": "Lists",
+ "navigation_bar.logout": "Logout",
+ "navigation_bar.mutes": "Muted users",
+ "navigation_bar.personal": "Personal",
+ "navigation_bar.pins": "Pinned posts",
+ "navigation_bar.preferences": "Preferences",
+ "navigation_bar.public_timeline": "Federated timeline",
+ "navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} signed up",
+ "notification.favourite": "{name} favourited your status",
+ "notification.follow": "{name} followed you",
+ "notification.follow_request": "{name} has requested to follow you",
+ "notification.mention": "{name} mentioned you",
+ "notification.own_poll": "Your poll has ended",
+ "notification.poll": "A poll you have voted in has ended",
+ "notification.reblog": "{name} boosted your status",
+ "notification.status": "{name} just posted",
+ "notification.update": "{name} edited a post",
+ "notifications.clear": "Clear notifications",
+ "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.alert": "Desktop notifications",
+ "notifications.column_settings.favourite": "Favourites:",
+ "notifications.column_settings.filter_bar.advanced": "Display all categories",
+ "notifications.column_settings.filter_bar.category": "Quick filter bar",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.follow": "New followers:",
+ "notifications.column_settings.follow_request": "New follow requests:",
+ "notifications.column_settings.mention": "Mentions:",
+ "notifications.column_settings.poll": "Poll results:",
+ "notifications.column_settings.push": "Push notifications",
+ "notifications.column_settings.reblog": "Boosts:",
+ "notifications.column_settings.show": "Show in column",
+ "notifications.column_settings.sound": "Play sound",
+ "notifications.column_settings.status": "New posts:",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
+ "notifications.filter.all": "All",
+ "notifications.filter.boosts": "Boosts",
+ "notifications.filter.favourites": "Favourites",
+ "notifications.filter.follows": "Follows",
+ "notifications.filter.mentions": "Mentions",
+ "notifications.filter.polls": "Poll results",
+ "notifications.filter.statuses": "Updates from people you follow",
+ "notifications.grant_permission": "Grant permission.",
+ "notifications.group": "{count} notifications",
+ "notifications.mark_as_read": "Mark every notification as read",
+ "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+ "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+ "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+ "notifications_permission_banner.enable": "Enable desktop notifications",
+ "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+ "notifications_permission_banner.title": "Never miss a thing",
+ "picture_in_picture.restore": "Put it back",
+ "poll.closed": "Closed",
+ "poll.refresh": "Refresh",
+ "poll.total_people": "{count, plural, one {# person} other {# people}}",
+ "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+ "poll.vote": "Vote",
+ "poll.voted": "You voted for this answer",
+ "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll_button.add_poll": "Add a poll",
+ "poll_button.remove_poll": "Remove poll",
+ "privacy.change": "Adjust status privacy",
+ "privacy.direct.long": "Visible for mentioned users only",
+ "privacy.direct.short": "Direct",
+ "privacy.private.long": "Visible for followers only",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
+ "privacy.public.short": "Public",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+ "privacy.unlisted.short": "Unlisted",
+ "refresh": "Refresh",
+ "regeneration_indicator.label": "Loading…",
+ "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+ "relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+ "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.just_now": "just now",
+ "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+ "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.hours": "{number}h",
+ "relative_time.just_now": "now",
+ "relative_time.minutes": "{number}m",
+ "relative_time.seconds": "{number}s",
+ "relative_time.today": "today",
+ "reply_indicator.cancel": "Cancel",
+ "report.block": "Block",
+ "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Content violates one or more server rules",
+ "report.category.subtitle": "Choose the best match",
+ "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.title_account": "profile",
+ "report.category.title_status": "post",
+ "report.close": "Done",
+ "report.comment.title": "Is there anything else you think we should know?",
+ "report.forward": "Forward to {target}",
+ "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+ "report.mute": "Mute",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Next",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.other": "It's something else",
+ "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
+ "report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "search.placeholder": "Search",
+ "search_popout.search_format": "Advanced search format",
+ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+ "search_popout.tips.hashtag": "hashtag",
+ "search_popout.tips.status": "status",
+ "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+ "search_popout.tips.user": "user",
+ "search_results.accounts": "People",
+ "search_results.all": "All",
+ "search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.statuses": "Posts",
+ "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
+ "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+ "status.admin_account": "Open moderation interface for @{name}",
+ "status.admin_status": "Open this status in the moderation interface",
+ "status.block": "Block @{name}",
+ "status.bookmark": "Bookmark",
+ "status.cancel_reblog_private": "Unboost",
+ "status.cannot_reblog": "This post cannot be boosted",
+ "status.copy": "Copy link to status",
+ "status.delete": "Delete",
+ "status.detailed_status": "Detailed conversation view",
+ "status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.embed": "Embed",
+ "status.favourite": "Favourite",
+ "status.filtered": "Filtered",
+ "status.history.created": "{name} created {date}",
+ "status.history.edited": "{name} edited {date}",
+ "status.load_more": "Load more",
+ "status.media_hidden": "Media hidden",
+ "status.mention": "Mention @{name}",
+ "status.more": "More",
+ "status.mute": "Mute @{name}",
+ "status.mute_conversation": "Mute conversation",
+ "status.open": "Expand this status",
+ "status.pin": "Pin on profile",
+ "status.pinned": "Pinned post",
+ "status.read_more": "Read more",
+ "status.reblog": "Boost",
+ "status.reblog_private": "Boost with original visibility",
+ "status.reblogged_by": "{name} boosted",
+ "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
+ "status.redraft": "Delete & re-draft",
+ "status.remove_bookmark": "Remove bookmark",
+ "status.reply": "Reply",
+ "status.replyAll": "Reply to thread",
+ "status.report": "Report @{name}",
+ "status.sensitive_warning": "Sensitive content",
+ "status.share": "Share",
+ "status.show_less": "Show less",
+ "status.show_less_all": "Show less for all",
+ "status.show_more": "Show more",
+ "status.show_more_all": "Show more for all",
+ "status.show_thread": "Show thread",
+ "status.uncached_media_warning": "Not available",
+ "status.unmute_conversation": "Unmute conversation",
+ "status.unpin": "Unpin from profile",
+ "suggestions.dismiss": "Dismiss suggestion",
+ "suggestions.header": "You might be interested in…",
+ "tabs_bar.federated_timeline": "Federated",
+ "tabs_bar.home": "Home",
+ "tabs_bar.local_timeline": "Local",
+ "tabs_bar.notifications": "Notifications",
+ "tabs_bar.search": "Search",
+ "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+ "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+ "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+ "time_remaining.moments": "Moments remaining",
+ "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+ "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+ "timeline_hint.resources.followers": "Followers",
+ "timeline_hint.resources.follows": "Follows",
+ "timeline_hint.resources.statuses": "Older posts",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+ "trends.trending_now": "Trending now",
+ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+ "units.short.billion": "{count}B",
+ "units.short.million": "{count}M",
+ "units.short.thousand": "{count}K",
+ "upload_area.title": "Drag & drop to upload",
+ "upload_button.label": "Add images, a video or an audio file",
+ "upload_error.limit": "File upload limit exceeded.",
+ "upload_error.poll": "File upload not allowed with polls.",
+ "upload_form.audio_description": "Describe for people with hearing loss",
+ "upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
+ "upload_form.edit": "Edit",
+ "upload_form.thumbnail": "Change thumbnail",
+ "upload_form.undo": "Delete",
+ "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+ "upload_modal.analyzing_picture": "Analyzing picture…",
+ "upload_modal.apply": "Apply",
+ "upload_modal.applying": "Applying…",
+ "upload_modal.choose_image": "Choose image",
+ "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+ "upload_modal.detect_text": "Detect text from picture",
+ "upload_modal.edit_media": "Edit media",
+ "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+ "upload_modal.preparing_ocr": "Preparing OCR…",
+ "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_progress.label": "Uploading…",
+ "video.close": "Close video",
+ "video.download": "Download file",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 30acb054e..abe13906b 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -96,8 +96,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media Only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This post will only be sent to the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.",
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -108,7 +110,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -151,6 +153,7 @@
"embed.instructions": "Embed this post on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -235,7 +238,7 @@
"keyboard_shortcuts.column": "Focus column",
"keyboard_shortcuts.compose": "Focus compose textarea",
"keyboard_shortcuts.description": "Description",
- "keyboard_shortcuts.direct": "Open direct messages column",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "Move down in the list",
"keyboard_shortcuts.enter": "Open post",
"keyboard_shortcuts.favourite": "Favourite post",
@@ -268,6 +271,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -314,6 +319,7 @@
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
+ "notification.admin.report": "{name} reported {target}",
"notification.admin.sign_up": "{name} signed up",
"notification.favourite": "{name} favourited your post",
"notification.follow": "{name} followed you",
@@ -326,6 +332,7 @@
"notification.update": "{name} edited a post",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+ "notifications.column_settings.admin.report": "New reports:",
"notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
"notifications.column_settings.favourite": "Favourites:",
@@ -372,12 +379,12 @@
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Change post privacy",
"privacy.direct.long": "Visible for mentioned users only",
- "privacy.direct.short": "Direct",
+ "privacy.direct.short": "Mentioned people only",
"privacy.private.long": "Visible for followers only",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.private.short": "Followers only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -431,6 +438,11 @@
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
"report.unfollow": "Unfollow @{name}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached",
+ "report_notification.categories.other": "Other",
+ "report_notification.categories.spam": "Spam",
+ "report_notification.categories.violation": "Rule violation",
+ "report_notification.open": "Open report",
"search.placeholder": "Search",
"search_popout.search_format": "Advanced search format",
"search_popout.tips.full_text": "Simple text returns posts you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
@@ -520,6 +532,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 7f999c34f..999f34be6 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -6,23 +6,23 @@
"account.block": "Bloki @{name}",
"account.block_domain": "Bloki domajnon {domain}",
"account.blocked": "Blokita",
- "account.browse_more_on_origin_server": "Rigardi pli al la originala profilo",
- "account.cancel_follow_request": "Nuligi peton de sekvado",
+ "account.browse_more_on_origin_server": "Vidi pli ĉe la originala profilo",
+ "account.cancel_follow_request": "Nuligi la demandon de sekvado",
"account.direct": "Rekte mesaĝi @{name}",
"account.disable_notifications": "Ĉesu sciigi min kiam @{name} mesaĝi",
"account.domain_blocked": "Domajno blokita",
- "account.edit_profile": "Redakti profilon",
- "account.enable_notifications": "Sciigi min kiam @{name} mesaĝi",
- "account.endorse": "Montri en profilo",
+ "account.edit_profile": "Redakti la profilon",
+ "account.enable_notifications": "Sciigi min kiam @{name} mesaĝas",
+ "account.endorse": "Rekomendi ĉe via profilo",
"account.follow": "Sekvi",
"account.followers": "Sekvantoj",
"account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.",
"account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}",
- "account.following": "Following",
+ "account.following": "Sekvantaj",
"account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}",
"account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.",
"account.follows_you": "Sekvas vin",
- "account.hide_reblogs": "Kaŝi diskonigojn de @{name}",
+ "account.hide_reblogs": "Kaŝi la plusendojn de @{name}",
"account.joined": "Kuniĝis {date}",
"account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}",
"account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.",
@@ -30,81 +30,83 @@
"account.mention": "Mencii @{name}",
"account.moved_to": "{name} moviĝis al:",
"account.mute": "Silentigi @{name}",
- "account.mute_notifications": "Silentigi sciigojn de @{name}",
+ "account.mute_notifications": "Silentigi la sciigojn de @{name}",
"account.muted": "Silentigita",
"account.posts": "Mesaĝoj",
- "account.posts_with_replies": "Kun respondoj",
- "account.report": "Signali @{name}",
+ "account.posts_with_replies": "Mesaĝoj kaj respondoj",
+ "account.report": "Raporti @{name}",
"account.requested": "Atendo de aprobo. Alklaku por nuligi peton de sekvado",
- "account.share": "Diskonigi la profilon de @{name}",
- "account.show_reblogs": "Montri diskonigojn de @{name}",
+ "account.share": "Kundividi la profilon de @{name}",
+ "account.show_reblogs": "Montri la plusendojn de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Mesaĝo} other {{counter} Mesaĝoj}}",
"account.unblock": "Malbloki @{name}",
"account.unblock_domain": "Malbloki {domain}",
"account.unblock_short": "Malbloki",
- "account.unendorse": "Ne montri en profilo",
+ "account.unendorse": "Ne rekomendi ĉe la profilo",
"account.unfollow": "Ne plu sekvi",
- "account.unmute": "Malsilentigi @{name}",
- "account.unmute_notifications": "Malsilentigi sciigojn de @{name}",
- "account.unmute_short": "Malsilentigi",
- "account_note.placeholder": "Alklaku por aldoni noton",
+ "account.unmute": "Ne plu silentigi @{name}",
+ "account.unmute_notifications": "Reebligi la sciigojn de @{name}",
+ "account.unmute_short": "Ne plu silentigi",
+ "account_note.placeholder": "Klaku por aldoni noton",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Averaĝa",
- "admin.dashboard.retention.cohort": "Registriĝo monato",
+ "admin.dashboard.retention.cohort": "Monato de registriĝo",
"admin.dashboard.retention.cohort_size": "Novaj uzantoj",
"alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.",
"alert.rate_limited.title": "Mesaĝkvante limigita",
"alert.unexpected.message": "Neatendita eraro okazis.",
- "alert.unexpected.title": "Ups!",
+ "alert.unexpected.title": "Aj!",
"announcement.announcement": "Anonco",
"attachments_list.unprocessed": "(neprilaborita)",
"autosuggest_hashtag.per_week": "{count} semajne",
"boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
"bundle_column_error.body": "Io misfunkciis en la ŝargado de ĉi tiu elemento.",
- "bundle_column_error.retry": "Bonvolu reprovi",
- "bundle_column_error.title": "Reta eraro",
+ "bundle_column_error.retry": "Provu refoje",
+ "bundle_column_error.title": "Eraro de reto",
"bundle_modal_error.close": "Fermi",
"bundle_modal_error.message": "Io misfunkciis en la ŝargado de ĉi tiu elemento.",
- "bundle_modal_error.retry": "Bonvolu reprovi",
+ "bundle_modal_error.retry": "Provu refoje",
"column.blocks": "Blokitaj uzantoj",
"column.bookmarks": "Legosignoj",
"column.community": "Loka templinio",
"column.direct": "Rektaj mesaĝoj",
"column.directory": "Trarigardi profilojn",
"column.domain_blocks": "Blokitaj domajnoj",
- "column.favourites": "Stelumoj",
- "column.follow_requests": "Petoj de sekvado",
+ "column.favourites": "Preferaĵoj",
+ "column.follow_requests": "Demandoj de sekvado",
"column.home": "Hejmo",
"column.lists": "Listoj",
"column.mutes": "Silentigitaj uzantoj",
"column.notifications": "Sciigoj",
"column.pins": "Alpinglitaj mesaĝoj",
- "column.public": "Fratara templinio",
+ "column.public": "Federata templinio",
"column_back_button.label": "Reveni",
- "column_header.hide_settings": "Kaŝi agordojn",
+ "column_header.hide_settings": "Kaŝi la agordojn",
"column_header.moveLeft_settings": "Movi kolumnon maldekstren",
"column_header.moveRight_settings": "Movi kolumnon dekstren",
"column_header.pin": "Alpingli",
- "column_header.show_settings": "Montri agordojn",
+ "column_header.show_settings": "Montri la agordojn",
"column_header.unpin": "Depingli",
- "column_subheading.settings": "Agordado",
+ "column_subheading.settings": "Agordoj",
"community.column_settings.local_only": "Nur loka",
"community.column_settings.media_only": "Nur aŭdovidaĵoj",
- "community.column_settings.remote_only": "Nur malproksima",
- "compose_form.direct_message_warning": "Tiu mesaĝo estos sendita nur al menciitaj uzantoj.",
+ "community.column_settings.remote_only": "Nur fora",
+ "compose.language.change": "Ŝanĝi lingvon",
+ "compose.language.search": "Serĉi lingvojn...",
"compose_form.direct_message_warning_learn_more": "Lerni pli",
+ "compose_form.encryption_warning": "La mesaĵoj en Mastodono ne estas ĉifrita de tutvojo. Ne kundividu sentemajn informojn ĉe Mastodono.",
"compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.",
- "compose_form.lock_disclaimer": "Via konta ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn, kiuj estas nur por sekvantoj.",
+ "compose_form.lock_disclaimer": "Via konto ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn nur al la sekvantoj.",
"compose_form.lock_disclaimer.lock": "ŝlosita",
- "compose_form.placeholder": "Pri kio vi pensas?",
+ "compose_form.placeholder": "Kion vi pensas?",
"compose_form.poll.add_option": "Aldoni elekteblon",
"compose_form.poll.duration": "Balotenketa daŭro",
"compose_form.poll.option_placeholder": "Elekteblo {number}",
"compose_form.poll.remove_option": "Forigi ĉi tiu elekteblon",
"compose_form.poll.switch_to_multiple": "Ŝanĝi la balotenketon por permesi multajn elektojn",
"compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton",
- "compose_form.publish": "Hup",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Konservi ŝanĝojn",
"compose_form.sensitive.hide": "Marki la aŭdovidaĵojn kiel tiklaj",
@@ -114,7 +116,7 @@
"compose_form.spoiler.unmarked": "Teksto ne kaŝita",
"compose_form.spoiler_placeholder": "Skribu vian averton ĉi tie",
"confirmation_modal.cancel": "Nuligi",
- "confirmations.block.block_and_report": "Bloki kaj signali",
+ "confirmations.block.block_and_report": "Bloki kaj raporti",
"confirmations.block.confirm": "Bloki",
"confirmations.block.message": "Ĉu vi certas, ke vi volas bloki {name}?",
"confirmations.delete.confirm": "Forigi",
@@ -122,7 +124,7 @@
"confirmations.delete_list.confirm": "Forigi",
"confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?",
"confirmations.discard_edit_media.confirm": "Ne konservi",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.message": "Vi havas nekonservitan ŝanĝon de la priskribo aŭ de la antaŭvido de aŭdvidaĵo, ĉu vi forigu ĝin?",
"confirmations.domain_block.confirm": "Bloki la tutan domajnon",
"confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika templinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.",
"confirmations.logout.confirm": "Adiaŭi",
@@ -131,7 +133,7 @@
"confirmations.mute.explanation": "Ĉi-tio kaŝos mesaĝojn el ili kaj mesaĝojn kiuj mencias ilin, sed ili ankoraŭ rajtos vidi viajn mesaĝojn kaj sekvi vin.",
"confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?",
"confirmations.redraft.confirm": "Forigi kaj reskribi",
- "confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi tiun mesaĝon kaj reskribi ĝin? Ĉiuj diskonigoj kaj stelumoj estos perditaj, kaj respondoj al la originala mesaĝo estos senparentaj.",
+ "confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi kaj reskribi la mesaĝon? Ĝiaj preferitaĵoj kaj ĝiaj plusendoj estos perditaj, kaj la respondoj al la originala mesaĝo estos orfaj.",
"confirmations.reply.confirm": "Respondi",
"confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?",
"confirmations.unfollow.confirm": "Ne plu sekvi",
@@ -147,6 +149,7 @@
"embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.",
"embed.preview": "Ĝi aperos tiel:",
"emoji_button.activity": "Agadoj",
+ "emoji_button.clear": "Forviŝi",
"emoji_button.custom": "Propraj",
"emoji_button.flags": "Flagoj",
"emoji_button.food": "Manĝi kaj trinki",
@@ -168,10 +171,10 @@
"empty_column.community": "La loka templinio estas malplena. Skribu ion por plenigi ĝin!",
"empty_column.direct": "Vi ankoraŭ ne havas rektan mesaĝon. Kiam vi sendos aŭ ricevos iun, ĝi aperos ĉi tie.",
"empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "Vi ankoraŭ ne stelumis mesaĝon. Kiam vi stelumos iun, tiu aperos ĉi tie.",
- "empty_column.favourites": "Ankoraŭ neniu stelumis tiun mesaĝon. Kiam iu faros tion, tiu aperos ĉi tie.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.explore_statuses": "Nenio tendencas nun. Rekontrolu poste!",
+ "empty_column.favourited_statuses": "Vi ankoraŭ ne havas mesaĝon en la preferaĵoj. Kiam vi aldonas ion, ĝi aperos ĉi tie.",
+ "empty_column.favourites": "Ankoraŭ neniu preferis la mesaĝon. Kiam iu faros ĉi tion, ili aperos ĉi tie.",
+ "empty_column.follow_recommendations": "Ŝajnas, ke neniuj sugestoj povis esti generitaj por vi. Vi povas provi uzi serĉon por serĉi homojn, kiujn vi eble konas, aŭ esplori tendencajn kradvortojn.",
"empty_column.follow_requests": "Vi ne ankoraŭ havas iun peton de sekvado. Kiam vi ricevos unu, ĝi aperos ĉi tie.",
"empty_column.hashtag": "Ankoraŭ estas nenio per ĉi tiu kradvorto.",
"empty_column.home": "Via hejma tempolinio estas malplena! Vizitu {public} aŭ uzu la serĉilon por renkonti aliajn uzantojn.",
@@ -195,10 +198,10 @@
"explore.trending_tags": "Kradvortoj",
"follow_recommendations.done": "Farita",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_recommendations.lead": "La mesaĝoj de personoj kiujn vi sekvas, kronologie aperos en via hejma templinio. Ne timu erari, vi povas ĉesi sekvi facile iam ajn!",
"follow_request.authorize": "Rajtigi",
"follow_request.reject": "Rifuzi",
- "follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la dungitaro de {domain} opiniis, ke vi eble volus revizii petojn de sekvadon el ĉi tiuj kontoj permane.",
+ "follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la teamo de {domain} pensis ke vi eble volas permane kontroli la demandojn de sekvado de ĉi tiuj kontoj.",
"generic.saved": "Konservita",
"getting_started.developers": "Programistoj",
"getting_started.directory": "Profilujo",
@@ -218,7 +221,7 @@
"hashtag.column_settings.tag_mode.none": "Neniu",
"hashtag.column_settings.tag_toggle": "Aldoni pliajn etikedojn por ĉi tiu kolumno",
"home.column_settings.basic": "Bazaj agordoj",
- "home.column_settings.show_reblogs": "Montri diskonigojn",
+ "home.column_settings.show_reblogs": "Montri plusendojn",
"home.column_settings.show_replies": "Montri respondojn",
"home.hide_announcements": "Kaŝi anoncojn",
"home.show_announcements": "Montri anoncojn",
@@ -227,16 +230,16 @@
"intervals.full.minutes": "{number, plural, one {# minuto} other {# minutoj}}",
"keyboard_shortcuts.back": "reveni",
"keyboard_shortcuts.blocked": "malfermi la liston de blokitaj uzantoj",
- "keyboard_shortcuts.boost": "diskonigi",
+ "keyboard_shortcuts.boost": "Plusendi",
"keyboard_shortcuts.column": "fokusi mesaĝon en unu el la kolumnoj",
"keyboard_shortcuts.compose": "enfokusigi la tekstujon",
"keyboard_shortcuts.description": "Priskribo",
"keyboard_shortcuts.direct": "malfermi la kolumnon de rektaj mesaĝoj",
"keyboard_shortcuts.down": "iri suben en la listo",
"keyboard_shortcuts.enter": "malfermi mesaĝon",
- "keyboard_shortcuts.favourite": "stelumi",
- "keyboard_shortcuts.favourites": "malfermi la liston de stelumoj",
- "keyboard_shortcuts.federated": "Malfermi la frataran templinion",
+ "keyboard_shortcuts.favourite": "Aldoni la mesaĝon al preferaĵoj",
+ "keyboard_shortcuts.favourites": "Malfermi la liston de preferaĵoj",
+ "keyboard_shortcuts.federated": "Malfermi la federatan templinion",
"keyboard_shortcuts.heading": "Klavaraj mallongigoj",
"keyboard_shortcuts.home": "Malfermi la hejman templinion",
"keyboard_shortcuts.hotkey": "Rapidklavo",
@@ -256,7 +259,7 @@
"keyboard_shortcuts.start": "malfermi la kolumnon «por komenci»",
"keyboard_shortcuts.toggle_hidden": "montri/kaŝi tekston malantaŭ enhava averto",
"keyboard_shortcuts.toggle_sensitivity": "montri/kaŝi aŭdovidaĵojn",
- "keyboard_shortcuts.toot": "komenci tute novan mesaĝon",
+ "keyboard_shortcuts.toot": "Krei novan mesaĝon",
"keyboard_shortcuts.unfocus": "malenfokusigi la tekstujon aŭ la serĉilon",
"keyboard_shortcuts.up": "iri supren en la listo",
"lightbox.close": "Fermi",
@@ -264,6 +267,8 @@
"lightbox.expand": "Pligrandigi bildan vidkeston",
"lightbox.next": "Sekva",
"lightbox.previous": "Antaŭa",
+ "limited_account_hint.action": "Montru profilon ĉiukaze",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Aldoni al la listo",
"lists.account.remove": "Forigi de la listo",
"lists.delete": "Forigi la liston",
@@ -274,7 +279,7 @@
"lists.replies_policy.followed": "Iu sekvanta uzanto",
"lists.replies_policy.list": "Membroj de la listo",
"lists.replies_policy.none": "Neniu",
- "lists.replies_policy.title": "Montri respondon al:",
+ "lists.replies_policy.title": "Montri respondojn al:",
"lists.search": "Serĉi inter la homoj, kiujn vi sekvas",
"lists.subheading": "Viaj listoj",
"load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}",
@@ -294,7 +299,7 @@
"navigation_bar.discover": "Esplori",
"navigation_bar.domain_blocks": "Blokitaj domajnoj",
"navigation_bar.edit_profile": "Redakti profilon",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Esplori",
"navigation_bar.favourites": "Stelumoj",
"navigation_bar.filters": "Silentigitaj vortoj",
"navigation_bar.follow_requests": "Petoj de sekvado",
@@ -307,41 +312,41 @@
"navigation_bar.personal": "Persone",
"navigation_bar.pins": "Alpinglitaj mesaĝoj",
"navigation_bar.preferences": "Preferoj",
- "navigation_bar.public_timeline": "Fratara templinio",
+ "navigation_bar.public_timeline": "Federata templinio",
"navigation_bar.security": "Sekureco",
"notification.admin.sign_up": "{name} registris",
- "notification.favourite": "{name} stelumis vian mesaĝon",
+ "notification.favourite": "{name} preferis vian mesaĝon",
"notification.follow": "{name} eksekvis vin",
"notification.follow_request": "{name} petis sekvi vin",
"notification.mention": "{name} menciis vin",
"notification.own_poll": "Via balotenketo finiĝitis",
"notification.poll": "Partoprenita balotenketo finiĝis",
- "notification.reblog": "{name} diskonigis vian mesaĝon",
+ "notification.reblog": "{name} plusendis vian mesaĝon",
"notification.status": "{name} ĵus afiŝita",
"notification.update": "{name} redaktis afiŝon",
"notifications.clear": "Forviŝi sciigojn",
"notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Novaj registriĝoj:",
"notifications.column_settings.alert": "Retumilaj sciigoj",
- "notifications.column_settings.favourite": "Stelumoj:",
+ "notifications.column_settings.favourite": "Preferaĵoj:",
"notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn",
"notifications.column_settings.filter_bar.category": "Rapida filtra breto",
- "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.filter_bar.show_bar": "Montri la breton de filtrilo",
"notifications.column_settings.follow": "Novaj sekvantoj:",
"notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
"notifications.column_settings.mention": "Mencioj:",
"notifications.column_settings.poll": "Balotenketaj rezultoj:",
"notifications.column_settings.push": "Puŝsciigoj",
- "notifications.column_settings.reblog": "Diskonigoj:",
+ "notifications.column_settings.reblog": "Plusendoj:",
"notifications.column_settings.show": "Montri en kolumno",
"notifications.column_settings.sound": "Eligi sonon",
"notifications.column_settings.status": "Novaj mesaĝoj:",
"notifications.column_settings.unread_notifications.category": "Nelegitaj sciigoj",
- "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Marki nelegitajn sciigojn",
"notifications.column_settings.update": "Redaktoj:",
"notifications.filter.all": "Ĉiuj",
- "notifications.filter.boosts": "Diskonigoj",
- "notifications.filter.favourites": "Stelumoj",
+ "notifications.filter.boosts": "Plusendoj",
+ "notifications.filter.favourites": "Preferaĵoj",
"notifications.filter.follows": "Sekvoj",
"notifications.filter.mentions": "Mencioj",
"notifications.filter.polls": "Balotenketaj rezultoj",
@@ -367,16 +372,16 @@
"poll_button.remove_poll": "Forigi balotenketon",
"privacy.change": "Agordi mesaĝan privatecon",
"privacy.direct.long": "Videbla nur al menciitaj uzantoj",
- "privacy.direct.short": "Rekta",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Videbla nur al viaj sekvantoj",
- "privacy.private.short": "Nur al sekvantoj",
- "privacy.public.long": "Videbla al ĉiuj, afiŝita en publikaj templinioj",
+ "privacy.private.short": "Nur abonantoj",
+ "privacy.public.long": "Videbla por ĉiuj",
"privacy.public.short": "Publika",
- "privacy.unlisted.long": "Videbla al ĉiuj, sed ne en publikaj templinioj",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Nelistigita",
"refresh": "Refreŝigu",
"regeneration_indicator.label": "Ŝargado…",
- "regeneration_indicator.sublabel": "Via hejma fluo pretiĝas!",
+ "regeneration_indicator.sublabel": "Via abonfluo estas preparata!",
"relative_time.days": "{number}t",
"relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
"relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
@@ -392,40 +397,40 @@
"report.block": "Bloki",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Aliaj",
- "report.categories.spam": "Spamo",
+ "report.categories.spam": "Trudaĵo",
"report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.subtitle": "Elektu la plej bonan kongruon",
+ "report.category.title": "Diru al ni kio okazas pri ĉi tiu {type}",
"report.category.title_account": "profilo",
"report.category.title_status": "afiŝo",
"report.close": "Farita",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.comment.title": "Ĉu estas io alia kion vi pensas ke ni devas scii?",
"report.forward": "Plusendi al {target}",
- "report.forward_hint": "La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien?",
+ "report.forward_hint": "La konto estas de alia servilo. Ĉu vi volas sendi anoniman kopion de la informo ankaŭ al tie?",
"report.mute": "Silentigi",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.mute_explanation": "Vi ne vidos iliajn afiŝojn. Ili ankoraŭ povas sekvi vin kaj vidi viajn afiŝojn, kaj ne scios ke ili estas silentigitaj.",
"report.next": "Sekva",
"report.placeholder": "Pliaj komentoj",
"report.reasons.dislike": "Mi ne ŝatas ĝin",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
+ "report.reasons.dislike_description": "Ĝi ne estas io, kiun vi volas vidi",
+ "report.reasons.other": "Io alia",
+ "report.reasons.other_description": "La problemo ne taŭgas en aliaj kategorioj",
+ "report.reasons.spam": "Ĝi estas trudaĵo",
"report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "Ĝi malrespektas servilajn regulojn",
+ "report.reasons.violation": "Ĝi malobservas la regulojn de la servilo",
"report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
+ "report.rules.subtitle": "Elektu ĉiujn, kiuj validas",
+ "report.rules.title": "Kiuj reguloj estas malobservataj?",
+ "report.statuses.subtitle": "Elektu ĉiujn, kiuj validas",
"report.statuses.title": "Are there any posts that back up this report?",
"report.submit": "Sendi",
- "report.target": "Signali {target}",
+ "report.target": "Raporto pri {target}",
"report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.thanks.title": "Ĉu vi ne volas vidi ĉi tion?",
+ "report.thanks.title_actionable": "Dankon pro raporti, ni esploros ĉi tion.",
"report.unfollow": "Malsekvi @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.unfollow_explanation": "Vi sekvas ĉi tiun konton. Por ne plu vidi ĝiajn abonfluojn en via hejma templinio, ĉesu sekvi ĝin.",
"search.placeholder": "Serĉi",
"search_popout.search_format": "Detala serĉo",
"search_popout.tips.full_text": "Simplaj tekstoj montras la mesaĝojn, kiujn vi skribis, stelumis, diskonigis, aŭ en kiuj vi estis menciita, sed ankaŭ kongruajn uzantnomojn, montratajn nomojn, kaj kradvortojn.",
@@ -436,7 +441,7 @@
"search_results.accounts": "Homoj",
"search_results.all": "Ĉiuj",
"search_results.hashtags": "Kradvortoj",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "Povis trovi nenion por ĉi tiuj serĉaj terminoj",
"search_results.statuses": "Mesaĝoj",
"search_results.statuses_fts_disabled": "Serĉi mesaĝojn laŭ enhavo ne estas ebligita en ĉi tiu Mastodon-servilo.",
"search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}",
@@ -444,8 +449,8 @@
"status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco",
"status.block": "Bloki @{name}",
"status.bookmark": "Aldoni al la legosignoj",
- "status.cancel_reblog_private": "Ne plu diskonigi",
- "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas",
+ "status.cancel_reblog_private": "Malfari la plusendon",
+ "status.cannot_reblog": "Ĉi tiu mesaĝo ne povas esti plusendita",
"status.copy": "Kopii la ligilon al la mesaĝo",
"status.delete": "Forigi",
"status.detailed_status": "Detala konversacia vido",
@@ -454,7 +459,7 @@
"status.edited": "Redaktita {date}",
"status.edited_x_times": "Redactita {count, plural, one {{count} fojon} other {{count} fojojn}}",
"status.embed": "Enkorpigi",
- "status.favourite": "Stelumi",
+ "status.favourite": "Preferaĵo",
"status.filtered": "Filtrita",
"status.history.created": "{name} kreis {date}",
"status.history.edited": "{name} redaktis {date}",
@@ -464,32 +469,32 @@
"status.more": "Pli",
"status.mute": "Silentigi @{name}",
"status.mute_conversation": "Silentigi konversacion",
- "status.open": "Grandigi ĉi tiun mesaĝon",
- "status.pin": "Alpingli profile",
+ "status.open": "Disvolvi la mesaĝon",
+ "status.pin": "Alpingli al la profilo",
"status.pinned": "Alpinglita mesaĝo",
"status.read_more": "Legi pli",
- "status.reblog": "Diskonigi",
- "status.reblog_private": "Diskonigi al la originala atentaro",
- "status.reblogged_by": "{name} diskonigis",
- "status.reblogs.empty": "Ankoraŭ neniu diskonigis tiun mesaĝon. Kiam iu faros tion, tiu aperos ĉi tie.",
+ "status.reblog": "Plusendi",
+ "status.reblog_private": "Plusendi kiel la originala videbleco",
+ "status.reblogged_by": "{name} plusendis",
+ "status.reblogs.empty": "Neniu ankoraŭ plusendis la mesaĝon. Kiam iu faros tion, ili aperos ĉi tie.",
"status.redraft": "Forigi kaj reskribi",
"status.remove_bookmark": "Forigi legosignon",
"status.reply": "Respondi",
"status.replyAll": "Respondi al la fadeno",
- "status.report": "Signali @{name}",
+ "status.report": "Raporti @{name}",
"status.sensitive_warning": "Tikla enhavo",
- "status.share": "Diskonigi",
- "status.show_less": "Malgrandigi",
- "status.show_less_all": "Malgrandigi ĉiujn",
- "status.show_more": "Grandigi",
- "status.show_more_all": "Malfoldi ĉiun",
- "status.show_thread": "Montri la fadenon",
+ "status.share": "Kundividi",
+ "status.show_less": "Montri malpli",
+ "status.show_less_all": "Montri malpli ĉiun",
+ "status.show_more": "Montri pli",
+ "status.show_more_all": "Montri pli ĉiun",
+ "status.show_thread": "Montri la mesaĝaron",
"status.uncached_media_warning": "Nedisponebla",
"status.unmute_conversation": "Malsilentigi la konversacion",
"status.unpin": "Depingli de profilo",
"suggestions.dismiss": "Forigi la proponon",
"suggestions.header": "Vi povus interesiĝi pri…",
- "tabs_bar.federated_timeline": "Fratara templinio",
+ "tabs_bar.federated_timeline": "Federata",
"tabs_bar.home": "Hejmo",
"tabs_bar.local_timeline": "Loka templinio",
"tabs_bar.notifications": "Sciigoj",
@@ -515,6 +520,7 @@
"upload_error.poll": "Alŝuto de dosiero ne permesita kun balotenketo.",
"upload_form.audio_description": "Priskribi por homoj kiuj malfacile aŭdi",
"upload_form.description": "Priskribi por misvidantaj homoj",
+ "upload_form.description_missing": "Neniu priskribo aldonita",
"upload_form.edit": "Redakti",
"upload_form.thumbnail": "Ŝanĝi etigita bildo",
"upload_form.undo": "Forigi",
@@ -533,7 +539,7 @@
"video.close": "Fermi la videon",
"video.download": "Elŝuti dosieron",
"video.exit_fullscreen": "Eksigi plenekrana",
- "video.expand": "Grandigi la videon",
+ "video.expand": "Pligrandigi la videon",
"video.fullscreen": "Igi plenekrana",
"video.hide": "Kaŝi la videon",
"video.mute": "Silentigi",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index b239c69e6..78d81b38f 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -18,7 +18,7 @@
"account.followers": "Seguidores",
"account.followers.empty": "Todavía nadie sigue a este usuario.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
- "account.following": "Siguiendo",
+ "account.following": "Seguimientos",
"account.following_counter": "{count, plural, other {{counter} Siguiendo}}",
"account.follows.empty": "Todavía este usuario no sigue a nadie.",
"account.follows_you": "Te sigue",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Sólo local",
"community.column_settings.media_only": "Sólo medios",
"community.column_settings.remote_only": "Sólo remoto",
- "compose_form.direct_message_warning": "Este mensaje sólo será enviado a los usuarios mencionados.",
+ "compose.language.change": "Cambiar idioma",
+ "compose.language.search": "Buscar idiomas…",
"compose_form.direct_message_warning_learn_more": "Aprendé más",
+ "compose_form.encryption_warning": "Los mensajes en Mastodon no están cifrados de extremo a extremo. No compartas ninguna información sensible al usar Mastodon.",
"compose_form.hashtag_warning": "Este mensaje no se mostrará bajo ninguna etiqueta porque no es público. Sólo los mensajes públicos se pueden buscar por etiquetas.",
"compose_form.lock_disclaimer": "Tu cuenta no es {locked}. Todos pueden seguirte para ver tus mensajes marcados como \"Sólo para seguidores\".",
"compose_form.lock_disclaimer.lock": "privada",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Quitar esta opción",
"compose_form.poll.switch_to_multiple": "Cambiar encuesta para permitir opciones múltiples",
"compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción",
- "compose_form.publish": "Enviar",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "¡{publish}!",
"compose_form.save_changes": "Guardar cambios",
"compose_form.sensitive.hide": "Marcar medio como sensible",
@@ -147,6 +149,7 @@
"embed.instructions": "Insertá este mensaje a tu sitio web copiando el código de abajo.",
"embed.preview": "Así es cómo se verá:",
"emoji_button.activity": "Actividad",
+ "emoji_button.clear": "Limpiar",
"emoji_button.custom": "Personalizado",
"emoji_button.flags": "Banderas",
"emoji_button.food": "Comida y bebida",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Enfocar columna",
"keyboard_shortcuts.compose": "Enfocar el área de texto de redacción",
"keyboard_shortcuts.description": "Descripción",
- "keyboard_shortcuts.direct": "Abrir columna de mensajes directos",
+ "keyboard_shortcuts.direct": "para abrir columna de mensajes directos",
"keyboard_shortcuts.down": "Bajar en la lista",
"keyboard_shortcuts.enter": "Abrir mensaje",
"keyboard_shortcuts.favourite": "Marcar mensaje como favorito",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expandir cuadro de vista de imagen",
"lightbox.next": "Siguiente",
"lightbox.previous": "Anterior",
+ "limited_account_hint.action": "Mostrar perfil de todos modos",
+ "limited_account_hint.title": "Este perfil fue ocultado por los moderadores de tu servidor.",
"lists.account.add": "Agregar a lista",
"lists.account.remove": "Quitar de lista",
"lists.delete": "Eliminar lista",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Quitar encuesta",
"privacy.change": "Configurar privacidad del mensaje",
"privacy.direct.long": "Visible sólo para los usuarios mencionados",
- "privacy.direct.short": "Directo",
+ "privacy.direct.short": "Sólo cuentas mencionadas",
"privacy.private.long": "Visible sólo para los seguidores",
"privacy.private.short": "Sólo para seguidores",
- "privacy.public.long": "Visible para todos, mostrado en las líneas temporales públicas",
+ "privacy.public.long": "Visible para todos",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Visible para todos, pero no en las líneas temporales públicas",
+ "privacy.unlisted.long": "Visible para todos, pero excluido de las características de descubrimiento",
"privacy.unlisted.short": "No listado",
"refresh": "Refrescar",
"regeneration_indicator.label": "Cargando…",
@@ -515,6 +520,7 @@
"upload_error.poll": "No se permite la subida de archivos en encuestas.",
"upload_form.audio_description": "Agregá una descripción para personas con dificultades auditivas",
"upload_form.description": "Agregá una descripción para personas con dificultades visuales",
+ "upload_form.description_missing": "No se agregó descripción",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
"upload_form.undo": "Eliminar",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index ccdca8d9c..570a03186 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Solo local",
"community.column_settings.media_only": "Solo media",
"community.column_settings.remote_only": "Solo remoto",
- "compose_form.direct_message_warning": "Este toot solo será enviado a los usuarios mencionados.",
+ "compose.language.change": "Cambiar idioma",
+ "compose.language.search": "Buscar idiomas...",
"compose_form.direct_message_warning_learn_more": "Aprender mas",
+ "compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
"compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.",
"compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
"compose_form.lock_disclaimer.lock": "bloqueado",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Eliminar esta opción",
"compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones",
"compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
- "compose_form.publish": "Tootear",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "¡{publish}!",
"compose_form.save_changes": "Guardar cambios",
"compose_form.sensitive.hide": "Marcar multimedia como sensible",
@@ -147,6 +149,7 @@
"embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
"embed.preview": "Así es como se verá:",
"emoji_button.activity": "Actividad",
+ "emoji_button.clear": "Limpiar",
"emoji_button.custom": "Personalizado",
"emoji_button.flags": "Marcas",
"emoji_button.food": "Comida y bebida",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "enfocar un estado en una de las columnas",
"keyboard_shortcuts.compose": "enfocar el área de texto de redacción",
"keyboard_shortcuts.description": "Descripción",
- "keyboard_shortcuts.direct": "abrir la columna de mensajes directos",
+ "keyboard_shortcuts.direct": "para abrir la columna de mensajes directos",
"keyboard_shortcuts.down": "mover hacia abajo en la lista",
"keyboard_shortcuts.enter": "abrir estado",
"keyboard_shortcuts.favourite": "añadir a favoritos",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expandir cuadro de visualización de imagen",
"lightbox.next": "Siguiente",
"lightbox.previous": "Anterior",
+ "limited_account_hint.action": "Mostrar perfil de todos modos",
+ "limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de tu servidor.",
"lists.account.add": "Añadir a lista",
"lists.account.remove": "Quitar de lista",
"lists.delete": "Borrar lista",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Eliminar encuesta",
"privacy.change": "Ajustar privacidad",
"privacy.direct.long": "Sólo mostrar a los usuarios mencionados",
- "privacy.direct.short": "Directo",
+ "privacy.direct.short": "Sólo cuentas mencionadas",
"privacy.private.long": "Sólo mostrar a seguidores",
- "privacy.private.short": "Privado",
- "privacy.public.long": "Mostrar en la historia federada",
+ "privacy.private.short": "Solo seguidores",
+ "privacy.public.long": "Visible para todos",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "No mostrar en la historia federada",
+ "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento",
"privacy.unlisted.short": "No listado",
"refresh": "Actualizar",
"regeneration_indicator.label": "Cargando…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Subida de archivos no permitida con encuestas.",
"upload_form.audio_description": "Describir para personas con problemas auditivos",
"upload_form.description": "Describir para los usuarios con dificultad visual",
+ "upload_form.description_missing": "Ninguna descripción añadida",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
"upload_form.undo": "Borrar",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index ba33d8a6c..0befa9153 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -4,7 +4,7 @@
"account.badges.bot": "Bot",
"account.badges.group": "Grupo",
"account.block": "Bloquear a @{name}",
- "account.block_domain": "Ocultar todo de {domain}",
+ "account.block_domain": "Bloquear dominio {domain}",
"account.blocked": "Bloqueado",
"account.browse_more_on_origin_server": "Ver más en el perfil original",
"account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Solo local",
"community.column_settings.media_only": "Solo media",
"community.column_settings.remote_only": "Solo remoto",
- "compose_form.direct_message_warning": "Esta nueva publicación solo será enviada a los usuarios mencionados.",
+ "compose.language.change": "Cambiar idioma",
+ "compose.language.search": "Buscar idiomas...",
"compose_form.direct_message_warning_learn_more": "Aprender más",
+ "compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
"compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ningún hashtag porque no está listada. Sólo las publicaciones públicas se pueden buscar por hashtag.",
"compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus publicaciones solo para seguidores.",
"compose_form.lock_disclaimer.lock": "bloqueado",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Eliminar esta opción",
"compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones",
"compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
- "compose_form.publish": "Tootear",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Guardar cambios",
"compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.",
"embed.preview": "Así es como se verá:",
"emoji_button.activity": "Actividad",
+ "emoji_button.clear": "Limpiar",
"emoji_button.custom": "Personalizado",
"emoji_button.flags": "Marcas",
"emoji_button.food": "Comida y bebida",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "enfocar un estado en una de las columnas",
"keyboard_shortcuts.compose": "enfocar el área de texto de redacción",
"keyboard_shortcuts.description": "Descripción",
- "keyboard_shortcuts.direct": "abrir la columna de mensajes directos",
+ "keyboard_shortcuts.direct": "para abrir la columna de mensajes directos",
"keyboard_shortcuts.down": "mover hacia abajo en la lista",
"keyboard_shortcuts.enter": "abrir estado",
"keyboard_shortcuts.favourite": "añadir a favoritos",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expandir cuadro de visualización de imagen",
"lightbox.next": "Siguiente",
"lightbox.previous": "Anterior",
+ "limited_account_hint.action": "Mostrar perfil de todos modos",
+ "limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de tu servidor.",
"lists.account.add": "Añadir a lista",
"lists.account.remove": "Quitar de lista",
"lists.delete": "Borrar lista",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Eliminar encuesta",
"privacy.change": "Ajustar privacidad",
"privacy.direct.long": "Sólo mostrar a los usuarios mencionados",
- "privacy.direct.short": "Directo",
+ "privacy.direct.short": "Sólo cuentas mencionadas",
"privacy.private.long": "Sólo mostrar a seguidores",
- "privacy.private.short": "Privado",
- "privacy.public.long": "Mostrar en la historia federada",
+ "privacy.private.short": "Solo seguidores",
+ "privacy.public.long": "Visible para todos",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "No mostrar en la historia federada",
+ "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento",
"privacy.unlisted.short": "No listado",
"refresh": "Actualizar",
"regeneration_indicator.label": "Cargando…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Subida de archivos no permitida con encuestas.",
"upload_form.audio_description": "Describir para personas con problemas auditivos",
"upload_form.description": "Describir para los usuarios con dificultad visual",
+ "upload_form.description_missing": "Ninguna descripción añadida",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
"upload_form.undo": "Borrar",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index e3bcdb521..eb3425f79 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -1,5 +1,5 @@
{
- "account.account_note_header": "Note",
+ "account.account_note_header": "Märge",
"account.add_or_remove_from_list": "Lisa või Eemalda nimekirjadest",
"account.badges.bot": "Robot",
"account.badges.group": "Grupp",
@@ -8,7 +8,7 @@
"account.blocked": "Blokeeritud",
"account.browse_more_on_origin_server": "Browse more on the original profile",
"account.cancel_follow_request": "Tühista jälgimistaotlus",
- "account.direct": "Otsesõnum @{name}",
+ "account.direct": "Saada otsesõnum @{name}'ile",
"account.disable_notifications": "Stop notifying me when @{name} posts",
"account.domain_blocked": "Domeen peidetud",
"account.edit_profile": "Muuda profiili",
@@ -17,28 +17,28 @@
"account.follow": "Jälgi",
"account.followers": "Jälgijad",
"account.followers.empty": "Keegi ei jälgi seda kasutajat veel.",
- "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.followers_counter": "{count, plural, one {{counter} jälgija} other {{counter} jälgijat}}",
"account.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.following_counter": "{count, plural, one {{counter} jälgitav} other {{counter} jälgitavat}}",
"account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
"account.follows_you": "Jälgib Teid",
"account.hide_reblogs": "Peida upitused kasutajalt @{name}",
- "account.joined": "Joined {date}",
+ "account.joined": "Liitus {date}",
"account.link_verified_on": "Selle lingi autorsust kontrolliti {date}",
"account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.",
"account.media": "Meedia",
- "account.mention": "Maini @{name}",
+ "account.mention": "Maini @{name}'i",
"account.moved_to": "{name} on kolinud:",
"account.mute": "Vaigista @{name}",
"account.mute_notifications": "Vaigista teated kasutajalt @{name}",
"account.muted": "Vaigistatud",
- "account.posts": "Tuututused",
- "account.posts_with_replies": "Tuututused ja vastused",
+ "account.posts": "Postitused",
+ "account.posts_with_replies": "Postitused ja vastused",
"account.report": "Raporteeri @{name}",
"account.requested": "Ootab kinnitust. Klõpsa jälgimise soovi tühistamiseks",
"account.share": "Jaga @{name} profiili",
"account.show_reblogs": "Näita kasutaja @{name} upitusi",
- "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+ "account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}",
"account.unblock": "Eemalda blokeering @{name}",
"account.unblock_domain": "Tee {domain} nähtavaks",
"account.unblock_short": "Unblock",
@@ -47,7 +47,7 @@
"account.unmute": "Ära vaigista @{name}",
"account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}",
"account.unmute_short": "Unmute",
- "account_note.placeholder": "Click to add a note",
+ "account_note.placeholder": "Klõpsa märkme lisamiseks",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
@@ -70,7 +70,7 @@
"column.blocks": "Blokeeritud kasutajad",
"column.bookmarks": "Järjehoidjad",
"column.community": "Kohalik ajajoon",
- "column.direct": "Otsesõnumid",
+ "column.direct": "Direct messages",
"column.directory": "Sirvi profiile",
"column.domain_blocks": "Peidetud domeenid",
"column.favourites": "Lemmikud",
@@ -92,19 +92,21 @@
"community.column_settings.local_only": "Ainult kohalik",
"community.column_settings.media_only": "Ainult meedia",
"community.column_settings.remote_only": "Ainult kaug",
- "compose_form.direct_message_warning": "See tuut saadetakse ainult mainitud kasutajatele.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Vaata veel",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Seda tuuti ei kuvata ühegi sildi all, sest see on kirjendamata. Ainult avalikud tuutid on sildi järgi otsitavad.",
"compose_form.lock_disclaimer": "Teie konto ei ole {locked}. Igaüks saab Teid jälgida ja näha Teie ainult-jälgijatele postitusi.",
"compose_form.lock_disclaimer.lock": "lukus",
- "compose_form.placeholder": "Millest mõtlete?",
+ "compose_form.placeholder": "Millest mõtled?",
"compose_form.poll.add_option": "Lisa valik",
"compose_form.poll.duration": "Küsitluse kestus",
"compose_form.poll.option_placeholder": "Valik {number}",
"compose_form.poll.remove_option": "Eemalda see valik",
"compose_form.poll.switch_to_multiple": "Muuda küsitlust lubamaks mitut valikut",
"compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut",
- "compose_form.publish": "Tuut",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Märgista meedia tundlikuks",
@@ -147,9 +149,10 @@
"embed.instructions": "Manusta see staatus oma veebilehele, kopeerides alloleva koodi.",
"embed.preview": "Nii näeb see välja:",
"emoji_button.activity": "Tegevus",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Mugandatud",
"emoji_button.flags": "Lipud",
- "emoji_button.food": "Toit & Jook",
+ "emoji_button.food": "Toit & jook",
"emoji_button.label": "Sisesta emoji",
"emoji_button.nature": "Loodus",
"emoji_button.not_found": "Ei ole emojosi!! (╯°□°)╯︵ ┻━┻",
@@ -159,20 +162,20 @@
"emoji_button.search": "Otsi...",
"emoji_button.search_results": "Otsitulemused",
"emoji_button.symbols": "Sümbolid",
- "emoji_button.travel": "Reisimine & Kohad",
+ "emoji_button.travel": "Reisimine & kohad",
"empty_column.account_suspended": "Account suspended",
"empty_column.account_timeline": "Siin tuute ei ole!",
"empty_column.account_unavailable": "Profiil pole saadaval",
"empty_column.blocks": "Sa ei ole veel ühtegi kasutajat blokeerinud.",
"empty_column.bookmarked_statuses": "Teil pole veel järjehoidjatesse lisatud tuututusi. Kui lisate mõne, näete neid siin.",
"empty_column.community": "Kohalik ajajoon on tühi. Kirjutage midagi avalikult, et pall veerema ajada!",
- "empty_column.direct": "Teil ei ole veel otsesõnumeid. Kui saadate või võtate mõne vastu, ilmuvad nad siia.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "Ükski postitus pole hetkel populaarne. Tule hiljem tagasi!",
"empty_column.favourited_statuses": "Teil pole veel lemmikuid tuute. Kui märgite mõne, näete neid siin.",
"empty_column.favourites": "Keegi pole veel seda tuuti lemmikuks märkinud. Kui seegi seda teeb, näed seda siin.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
- "empty_column.follow_requests": "Teil pole veel ühtegi jälgimise taotlust. Kui saate mõne, näete neid siin.",
+ "empty_column.follow_requests": "Teil pole hetkel ühtegi jälgimistaotlust. Kui saate mõne, näete neid siin.",
"empty_column.hashtag": "Selle sildiga pole veel midagi.",
"empty_column.home": "Teie kodu ajajoon on tühi! Külastage {public} või kasutage otsingut alustamaks ja kohtamaks teisi kasutajaid.",
"empty_column.home.suggestions": "See some suggestions",
@@ -187,12 +190,12 @@
"error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
"errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale",
"errors.unexpected_crash.report_issue": "Teavita veast",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "Otsingutulemused",
+ "explore.suggested_follows": "Sinu jaoks",
+ "explore.title": "Avasta",
+ "explore.trending_links": "Uudised",
+ "explore.trending_statuses": "Postitused",
+ "explore.trending_tags": "Sildid",
"follow_recommendations.done": "Done",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -231,9 +234,9 @@
"keyboard_shortcuts.column": "fokuseerimaks staatust ühele tulpadest",
"keyboard_shortcuts.compose": "fokuseerimaks tekstikoostamise alale",
"keyboard_shortcuts.description": "Kirjeldus",
- "keyboard_shortcuts.direct": "avamaks otsesõnumite tulpa",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "liikumaks nimstus alla",
- "keyboard_shortcuts.enter": "staatuse avamiseks",
+ "keyboard_shortcuts.enter": "Ava postitus",
"keyboard_shortcuts.favourite": "lemmikuks märkimiseks",
"keyboard_shortcuts.favourites": "avamaks lemmikute nimistut",
"keyboard_shortcuts.federated": "avamaks föderatsiooni ajajoont",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Järgmine",
"lightbox.previous": "Eelmine",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Lisa nimistusse",
"lists.account.remove": "Eemalda nimistust",
"lists.delete": "Kustuta nimistu",
@@ -279,22 +284,22 @@
"lists.subheading": "Teie nimistud",
"load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
"loading_indicator.label": "Laeb..",
- "media_gallery.toggle_visible": "Lülita nähtavus",
+ "media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}",
"missing_indicator.label": "Ei leitud",
"missing_indicator.sublabel": "Seda ressurssi ei leitud",
"mute_modal.duration": "Duration",
"mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?",
"mute_modal.indefinite": "Indefinite",
- "navigation_bar.apps": "Mobiilrakendused",
+ "navigation_bar.apps": "Mobiilirakendused",
"navigation_bar.blocks": "Blokeeritud kasutajad",
"navigation_bar.bookmarks": "Järjehoidjad",
"navigation_bar.community_timeline": "Kohalik ajajoon",
"navigation_bar.compose": "Koosta uus tuut",
- "navigation_bar.direct": "Otsesõnumid",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Avasta",
"navigation_bar.domain_blocks": "Peidetud domeenid",
"navigation_bar.edit_profile": "Muuda profiili",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Avasta",
"navigation_bar.favourites": "Lemmikud",
"navigation_bar.filters": "Vaigistatud sõnad",
"navigation_bar.follow_requests": "Jälgimistaotlused",
@@ -359,27 +364,27 @@
"poll.closed": "Suletud",
"poll.refresh": "Värskenda",
"poll.total_people": "{count, plural,one {# inimene} other {# inimest}}",
- "poll.total_votes": "{count, plural, one {# hääl} other {# hääli}}",
+ "poll.total_votes": "{count, plural, one {# hääl} other {# häält}}",
"poll.vote": "Hääleta",
"poll.voted": "Teie hääletasite selle poolt",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# hääl} other {# häält}}",
"poll_button.add_poll": "Lisa küsitlus",
"poll_button.remove_poll": "Eemalda küsitlus",
- "privacy.change": "Muuda staatuse privaatsust",
+ "privacy.change": "Muuda postituse nähtavust",
"privacy.direct.long": "Postita ainult mainitud kasutajatele",
- "privacy.direct.short": "Otsene",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Postita ainult jälgijatele",
- "privacy.private.short": "Ainult jälgijatele",
- "privacy.public.long": "Postita avalikele ajajoontele",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Avalik",
- "privacy.unlisted.long": "Ära postita avalikele ajajoontele",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Määramata",
"refresh": "Värskenda",
"regeneration_indicator.label": "Laeb…",
"regeneration_indicator.sublabel": "Teie kodu voog on ettevalmistamisel!",
"relative_time.days": "{number}p",
"relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.hours": "{number, plural, one {# tund} other {# tundi}} tagasi",
"relative_time.full.just_now": "just now",
"relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
"relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
@@ -434,7 +439,7 @@
"search_popout.tips.text": "Lihtne tekst toob esile kattuvad kuvanimed, kasutajanimed ning sildid",
"search_popout.tips.user": "kasutaja",
"search_results.accounts": "Inimesed",
- "search_results.all": "All",
+ "search_results.all": "Kõik",
"search_results.hashtags": "Sildid",
"search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tuudid",
@@ -446,10 +451,10 @@
"status.bookmark": "Järjehoidja",
"status.cancel_reblog_private": "Äraupita",
"status.cannot_reblog": "Seda postitust ei saa upitada",
- "status.copy": "Kopeeri link staatusesse",
+ "status.copy": "Kopeeri postituse link",
"status.delete": "Kustuta",
"status.detailed_status": "Detailne vestluskuva",
- "status.direct": "Otsesõnum @{name}",
+ "status.direct": "Saada otsesõnum @{name}'ile",
"status.edit": "Edit",
"status.edited": "Edited {date}",
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
@@ -458,13 +463,13 @@
"status.filtered": "Filtreeritud",
"status.history.created": "{name} created {date}",
"status.history.edited": "{name} edited {date}",
- "status.load_more": "Lae veel",
+ "status.load_more": "Lae rohkem",
"status.media_hidden": "Meedia peidetud",
- "status.mention": "Mainimine @{name}",
+ "status.mention": "Maini @{name}'i",
"status.more": "Veel",
"status.mute": "Vaigista @{name}",
"status.mute_conversation": "Vaigista vestlus",
- "status.open": "Laienda see staatus",
+ "status.open": "Laienda see postitus",
"status.pin": "Kinnita profiilile",
"status.pinned": "Kinnitatud tuut",
"status.read_more": "Loe veel",
@@ -476,7 +481,7 @@
"status.remove_bookmark": "Eemalda järjehoidja",
"status.reply": "Vasta",
"status.replyAll": "Vasta lõimele",
- "status.report": "Raport @{name}",
+ "status.report": "Raporteeri @{name}",
"status.sensitive_warning": "Tundlik sisu",
"status.share": "Jaga",
"status.show_less": "Näita vähem",
@@ -494,17 +499,17 @@
"tabs_bar.local_timeline": "Kohalik",
"tabs_bar.notifications": "Teated",
"tabs_bar.search": "Otsi",
- "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} left",
- "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} left",
- "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} left",
+ "time_remaining.days": "{number, plural, one {# päev} other {# päeva}} jäänud",
+ "time_remaining.hours": "{number, plural, one {# tund} other {# tundi}} jäänud",
+ "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} jäänud",
"time_remaining.moments": "Hetked jäänud",
- "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left",
+ "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} jäänud",
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
"timeline_hint.resources.followers": "Followers",
"timeline_hint.resources.follows": "Follows",
"timeline_hint.resources.statuses": "Older toots",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
- "trends.trending_now": "Praegu populaarne",
+ "trends.trending_now": "Hetkel populaarne",
"ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.",
"units.short.billion": "{count}B",
"units.short.million": "{count}M",
@@ -515,6 +520,7 @@
"upload_error.poll": "Küsitlustes pole faili üleslaadimine lubatud.",
"upload_form.audio_description": "Kirjelda kuulmispuudega inimeste jaoks",
"upload_form.description": "Kirjelda vaegnägijatele",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Redigeeri",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Kustuta",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index a5cbf5128..c8182640a 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -70,7 +70,7 @@
"column.blocks": "Blokeatutako erabiltzaileak",
"column.bookmarks": "Laster-markak",
"column.community": "Denbora-lerro lokala",
- "column.direct": "Mezu zuzenak",
+ "column.direct": "Direct messages",
"column.directory": "Arakatu profilak",
"column.domain_blocks": "Ezkutatutako domeinuak",
"column.favourites": "Gogokoak",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Lokala soilik",
"community.column_settings.media_only": "Multimedia besterik ez",
"community.column_settings.remote_only": "Urrunekoa soilik",
- "compose_form.direct_message_warning": "Bidalketa hau aipatutako erabiltzaileei besterik ez zaie bidaliko.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Bidalketa hau ez da traoletan agertuko zerrendatu gabekoa baita. Traoletan bidalketa publikoak besterik ez dira agertzen.",
"compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.",
"compose_form.lock_disclaimer.lock": "giltzapetuta",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Kendu aukera hau",
"compose_form.poll.switch_to_multiple": "Aldatu inkesta hainbat aukera onartzeko",
"compose_form.poll.switch_to_single": "Aldatu inkesta aukera bakarra onartzeko",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Gorde aldaketak",
"compose_form.sensitive.hide": "Markatu multimedia hunkigarri gisa",
@@ -147,6 +149,7 @@
"embed.instructions": "Txertatu bidalketa hau zure webgunean beheko kodea kopiatuz.",
"embed.preview": "Hau da izango duen itxura:",
"emoji_button.activity": "Jarduera",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Pertsonalizatua",
"emoji_button.flags": "Banderak",
"emoji_button.food": "Janari eta edaria",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Ez duzu erabiltzailerik blokeatu oraindik.",
"empty_column.bookmarked_statuses": "Oraindik ez dituzu bidalketa laster-markatutarik. Bat laster-markatzerakoan, hemen agertuko da.",
"empty_column.community": "Denbora-lerro lokala hutsik dago. Idatzi zerbait publikoki pilota biraka jartzeko!",
- "empty_column.direct": "Ez duzu mezu zuzenik oraindik. Baten bat bidali edo jasotzen duzunean, hemen agertuko da.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.",
"empty_column.explore_statuses": "Ez dago joerarik une honetan. Begiratu beranduago!",
"empty_column.favourited_statuses": "Ez duzu gogokorik oraindik. Gogokoren bat duzunean hemen agertuko da.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "mezu bat zutabe batean fokatzea",
"keyboard_shortcuts.compose": "testua konposatzeko arean fokatzea",
"keyboard_shortcuts.description": "Deskripzioa",
- "keyboard_shortcuts.direct": "mezu zuzenen zutabea irekitzeko",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "zerrendan behera mugitzea",
"keyboard_shortcuts.enter": "Ireki bidalketa",
"keyboard_shortcuts.favourite": "Egin gogoko bidalketa",
@@ -264,6 +267,8 @@
"lightbox.expand": "Zabaldu irudia ikusteko kaxa",
"lightbox.next": "Hurrengoa",
"lightbox.previous": "Aurrekoa",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Gehitu zerrendara",
"lists.account.remove": "Kendu zerrendatik",
"lists.delete": "Ezabatu zerrenda",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Laster-markak",
"navigation_bar.community_timeline": "Denbora-lerro lokala",
"navigation_bar.compose": "Idatzi bidalketa berria",
- "navigation_bar.direct": "Mezu zuzenak",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Aurkitu",
"navigation_bar.domain_blocks": "Ezkutatutako domeinuak",
"navigation_bar.edit_profile": "Aldatu profila",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Kendu inkesta",
"privacy.change": "Aldatu bidalketaren pribatutasuna",
"privacy.direct.long": "Bidali aipatutako erabiltzaileei besterik ez",
- "privacy.direct.short": "Zuzena",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Bidali jarraitzaileei besterik ez",
- "privacy.private.short": "Jarraitzaileak soilik",
- "privacy.public.long": "Bistaratu denbora-lerro publikoetan",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Publikoa",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Zerrendatu gabea",
"refresh": "Berritu",
"regeneration_indicator.label": "Kargatzen…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Ez da inkestetan fitxategiak igotzea onartzen.",
"upload_form.audio_description": "Deskribatu entzumen galera duten pertsonentzat",
"upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Editatu",
"upload_form.thumbnail": "Aldatu koadro txikia",
"upload_form.undo": "Ezabatu",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 820b90640..c76c596eb 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -3,16 +3,16 @@
"account.add_or_remove_from_list": "افزودن یا برداشتن از سیاههها",
"account.badges.bot": "روبات",
"account.badges.group": "گروه",
- "account.block": "مسدود کردن @{name}",
+ "account.block": "مسدود کردن @{name}",
"account.block_domain": "مسدود کردن دامنهٔ {domain}",
"account.blocked": "مسدود",
"account.browse_more_on_origin_server": "مرور بیشتر روی نمایهٔ اصلی",
"account.cancel_follow_request": "لغو درخواست پیگیری",
- "account.direct": "پیام مستقیم به @{name}",
- "account.disable_notifications": "آگاهی به من هنگام فرستادنهای @{name} پایان یابد",
+ "account.direct": "پیام مستقیم به @{name}",
+ "account.disable_notifications": "آگاه کردن من هنگام فرستههای @{name} را متوقّف کن",
"account.domain_blocked": "دامنه مسدود شد",
"account.edit_profile": "ویرایش نمایه",
- "account.enable_notifications": "هنگام فرستههای @{name} مرا آگاه کن",
+ "account.enable_notifications": "هنگام فرستههای @{name} مرا آگاه کن",
"account.endorse": "معرّفی در نمایه",
"account.follow": "پیگیری",
"account.followers": "پیگیرندگان",
@@ -22,34 +22,34 @@
"account.following_counter": "{count, plural, one {{counter} پیگرفته} other {{counter} پیگرفته}}",
"account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
"account.follows_you": "پی میگیردتان",
- "account.hide_reblogs": "نهفتن تقویتهای @{name}",
+ "account.hide_reblogs": "نهفتن تقویتهای @{name}",
"account.joined": "پیوسته از {date}",
"account.link_verified_on": "مالکیت این پیوند در {date} بررسی شد",
"account.locked_info": "این حساب خصوصی است. صاحبش تصمیم میگیرد که چه کسی پیگیرش باشد.",
"account.media": "رسانه",
- "account.mention": "نامبردن از @{name}",
+ "account.mention": "نامبردن از @{name}",
"account.moved_to": "{name} منتقل شده به:",
- "account.mute": "خموشاندن @{name}",
- "account.mute_notifications": "خموشاندن آگاهیها از @{name}",
+ "account.mute": "خموشاندن @{name}",
+ "account.mute_notifications": "خموشاندن آگاهیهای @{name}",
"account.muted": "خموش",
"account.posts": "فرسته",
"account.posts_with_replies": "فرستهها و پاسخها",
- "account.report": "گزارش @{name}",
+ "account.report": "گزارش @{name}",
"account.requested": "منتظر پذیرش است. برای لغو درخواست پیگیری کلیک کنید",
- "account.share": "همرسانی نمایهٔ @{name}",
- "account.show_reblogs": "نمایش تقویتهای @{name}",
+ "account.share": "همرسانی نمایهٔ @{name}",
+ "account.show_reblogs": "نمایش تقویتهای @{name}",
"account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}",
- "account.unblock": "رفع مسدودیت @{name}",
+ "account.unblock": "رفع مسدودیت @{name}",
"account.unblock_domain": "رفع مسدودیت دامنهٔ {domain}",
"account.unblock_short": "رفع مسدودیت",
"account.unendorse": "معرّفی نکردن در نمایه",
"account.unfollow": "ناپیگیری",
- "account.unmute": "ناخموشی @{name}",
- "account.unmute_notifications": "ناخموشی آگاهیها از @{name}",
+ "account.unmute": "ناخموشی @{name}",
+ "account.unmute_notifications": "ناخموشی آگاهیهای @{name}",
"account.unmute_short": "ناخموشی",
"account_note.placeholder": "برای افزودن یادداشت کلیک کنید",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.daily_retention": "نرخ حفظ کاربر در روز پس از ثبت نام",
+ "admin.dashboard.monthly_retention": "نرخ حفظ کاربر در ماه پس از ثبت نام",
"admin.dashboard.retention.average": "میانگین",
"admin.dashboard.retention.cohort": "ماه ثبتنام",
"admin.dashboard.retention.cohort_size": "کاربران جدید",
@@ -79,22 +79,24 @@
"column.lists": "سیاههها",
"column.mutes": "کاربران خموش",
"column.notifications": "آگاهیها",
- "column.pins": "فرستههای سنجاقشده",
+ "column.pins": "فرستههای سنجاق شده",
"column.public": "خط زمانی همگانی",
"column_back_button.label": "بازگشت",
"column_header.hide_settings": "نهفتن تنظیمات",
"column_header.moveLeft_settings": "جابهجایی ستون به چپ",
"column_header.moveRight_settings": "جابهجایی ستون به راست",
- "column_header.pin": "سنجاقکردن",
+ "column_header.pin": "سنجاق کردن",
"column_header.show_settings": "نمایش تنظیمات",
"column_header.unpin": "برداشتن سنجاق",
"column_subheading.settings": "تنظیمات",
"community.column_settings.local_only": "فقط محلّی",
"community.column_settings.media_only": "فقط رسانه",
"community.column_settings.remote_only": "تنها دوردست",
- "compose_form.direct_message_warning": "این فرسته تنها به کاربرانی که از آنها نام برده شده فرستاده خواهد شد.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "بیشتر بدانید",
- "compose_form.hashtag_warning": "از آنجا که این فرسته فهرستنشده است، در نتایج جستوجوی برچسبها پیدا نخواهد شد. تنها فرستههای عمومی را میتوان با جستوجوی برچسب یافت.",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "compose_form.hashtag_warning": "از آنجا که این فرسته فهرست نشده است، در نتایج جستوجوی هشتگها پیدا نخواهد شد. تنها فرستههای عمومی را میتوان با جستوجوی هشتگ یافت.",
"compose_form.lock_disclaimer": "حسابتان {locked} نیست. هر کسی میتواند پیگیرتان شده و فرستههای ویژهٔ پیگیرانتان را ببیند.",
"compose_form.lock_disclaimer.lock": "قفلشده",
"compose_form.placeholder": "تازه چه خبر؟",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "برداشتن این گزینه",
"compose_form.poll.switch_to_multiple": "تبدیل به نظرسنجی چندگزینهای",
"compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تکگزینهای",
- "compose_form.publish": "بوق",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "ذخیرهٔ تغییرات",
"compose_form.sensitive.hide": "{count, plural, one {علامتگذاری رسانه به عنوان حساس} other {علامتگذاری رسانهها به عنوان حساس}}",
@@ -144,9 +146,10 @@
"directory.local": "تنها از {domain}",
"directory.new_arrivals": "تازهواردان",
"directory.recently_active": "کاربران فعال اخیر",
- "embed.instructions": "برای جاگذاری این فرسته در سایت خودتان، کد زیر را کپی کنید.",
+ "embed.instructions": "برای جاسازی این فرسته در سایت خودتان، کد زیر را رونوشت کنید.",
"embed.preview": "این گونه دیده خواهد شد:",
"emoji_button.activity": "فعالیت",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "سفارشی",
"emoji_button.flags": "پرچمها",
"emoji_button.food": "غذا و نوشیدنی",
@@ -164,11 +167,11 @@
"empty_column.account_timeline": "هیچ فرستهای اینجا نیست!",
"empty_column.account_unavailable": "نمایهٔ موجود نیست",
"empty_column.blocks": "هنوز کسی را مسدود نکردهاید.",
- "empty_column.bookmarked_statuses": "هنوز هیچ فرستهٔ نشانشدهای ندارید. هنگامی که فرستهای را نشانکنید، اینجا نشان داده خواهد شد.",
+ "empty_column.bookmarked_statuses": "هنوز هیچ فرستهٔ نشانهگذاری شدهای ندارید. هنگامی که فرستهای را نشانهگذاری کنید، اینجا نشان داده خواهد شد.",
"empty_column.community": "خط زمانی محلّی خالی است. چیزی بنویسید تا چرخش بچرخد!",
"empty_column.direct": "هنوز هیچ پیام مستقیمی ندارید. هنگامی که چنین پیامی بگیرید یا بفرستید اینجا نشان داده خواهد شد.",
"empty_column.domain_blocks": "هنوز هیچ دامنهای مسدود نشده است.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "الآن چیزی پرطرفدار نیست. بعداً دوباره بررسی کنید!",
"empty_column.favourited_statuses": "شما هنوز هیچ فرستهای را نپسندیدهاید. هنگامی که فرستهای را بپسندید، اینجا نشان داده خواهد شد.",
"empty_column.favourites": "هنوز هیچ کسی این فرسته را نپسندیده است. هنگامی که کسی آن را بپسندد، اینجا نشان داده خواهد شد.",
"empty_column.follow_recommendations": "ظاهرا هیچ پیشنهادی برای شما نمیتوانیم تولید کنیم. میتوانید از امکان جستوجو برای یافتن افرادی که ممکن است بشناسید و یا کاوش میان برچسبهای داغ استفاده کنید.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "برای تمرکز روی یک فرسته در یکی از ستونها",
"keyboard_shortcuts.compose": "تمرکز روی محیط نوشتن",
"keyboard_shortcuts.description": "توضیح",
- "keyboard_shortcuts.direct": "گشودن ستون پیامهای مستقیم",
+ "keyboard_shortcuts.direct": "برای گشودن ستون پیغامهای مستقیم",
"keyboard_shortcuts.down": "پایین بردن در سیاهه",
"keyboard_shortcuts.enter": "گشودن فرسته",
"keyboard_shortcuts.favourite": "پسندیدن فرسته",
@@ -247,7 +250,7 @@
"keyboard_shortcuts.my_profile": "گشودن نمایهتان",
"keyboard_shortcuts.notifications": "گشودن ستون آگاهیها",
"keyboard_shortcuts.open_media": "گشودن رسانه",
- "keyboard_shortcuts.pinned": "گشودن سیاههٔ فرستههای سنجاق شده",
+ "keyboard_shortcuts.pinned": "گشودن فهرست فرستههای سنجاق شده",
"keyboard_shortcuts.profile": "گشودن نمایهٔ نویسنده",
"keyboard_shortcuts.reply": "پاسخ به فرسته",
"keyboard_shortcuts.requests": "گشودن سیاههٔ درخواستهای پیگیری",
@@ -264,6 +267,8 @@
"lightbox.expand": "گسترش جعبهٔ نمایش تصویر",
"lightbox.next": "بعدی",
"lightbox.previous": "قبلی",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "افزودن به سیاهه",
"lists.account.remove": "برداشتن از سیاهه",
"lists.delete": "حذف سیاهه",
@@ -305,7 +310,7 @@
"navigation_bar.logout": "خروج",
"navigation_bar.mutes": "کاربران خموشانده",
"navigation_bar.personal": "شخصی",
- "navigation_bar.pins": "فرستههای سنجاقشده",
+ "navigation_bar.pins": "فرستههای سنجاق شده",
"navigation_bar.preferences": "ترجیحات",
"navigation_bar.public_timeline": "خط زمانی همگانی",
"navigation_bar.security": "امنیت",
@@ -366,13 +371,13 @@
"poll_button.add_poll": "افزودن نظرسنجی",
"poll_button.remove_poll": "برداشتن نظرسنجی",
"privacy.change": "تغییر محرمانگی فرسته",
- "privacy.direct.long": "فقط برای کاربران نامبرده نمایان است",
- "privacy.direct.short": "مستقیم",
+ "privacy.direct.long": "نمایان فقط برای کاربران اشاره شده",
+ "privacy.direct.short": "فقط افراد اشاره شده",
"privacy.private.long": "نمایان فقط برای پیگیرندگان",
"privacy.private.short": "فقط پیگیرندگان",
- "privacy.public.long": "نمایان برای همه، در خطهای زمانی همگانی نمایش داده خواهد شد",
+ "privacy.public.long": "نمایان برای همه",
"privacy.public.short": "عمومی",
- "privacy.unlisted.long": "نمایان برای همه، ولی در خطهای زمانی همگانی نمایش داده نخواهد شد",
+ "privacy.unlisted.long": "نمایان برای همه، ولی خارج از قابلیتهای کشف",
"privacy.unlisted.short": "فهرست نشده",
"refresh": "نوسازی",
"regeneration_indicator.label": "در حال بار شدن…",
@@ -392,40 +397,40 @@
"report.block": "مسدود کردن",
"report.block_explanation": "شما فرستههایشان را نخواهید دید. آنها نمیتوانند فرستههایتان را ببینند یا شما را پیبگیرند. آنها میتوانند بگویند که مسدود شدهاند.",
"report.categories.other": "غیره",
- "report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.categories.spam": "هرزنامه",
+ "report.categories.violation": "محتوا یک یا چند قانون کارساز را نقض میکند",
+ "report.category.subtitle": "منطبقترین را انتخاب کنید",
+ "report.category.title": "به ما بگویید با این {type} چه مشکلی دارید",
+ "report.category.title_account": "نمایه",
+ "report.category.title_status": "فرسته",
+ "report.close": "انجام شد",
+ "report.comment.title": "آیا چیز دیگری هست که فکر میکنید باید بدانیم؟",
"report.forward": "فرستادن به {target}",
"report.forward_hint": "این حساب در کارساز دیگری ثبت شده. آیا میخواهید رونوشتی ناشناس از این گزارش به آنجا هم فرستاده شود؟",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "خموش",
+ "report.mute_explanation": "شما فرستههای آنها را نخواهید دید. آنها همچنان میتوانند شما را پیبگیرند و فرستههایتان را ببینند و نمیدانند که خموش شدهاند.",
+ "report.next": "بعدی",
"report.placeholder": "توضیحات اضافه",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "من آن را دوست ندارم",
+ "report.reasons.dislike_description": "این چیزی نیست که بخواهید ببینید",
+ "report.reasons.other": "بخواطر چیز دیگری است",
+ "report.reasons.other_description": "این موضوع در دستهبندیهای دیگر نمیگنجد",
+ "report.reasons.spam": "این هرزنامه است",
+ "report.reasons.spam_description": "پیوندهای مخرب، تعامل جعلی یا پاسخهای تکراری",
+ "report.reasons.violation": "قوانین کارساز را نقض میکند",
+ "report.reasons.violation_description": "شما آگاه هستید که قوانین خاصی را زیر پا میگذارد",
+ "report.rules.subtitle": "همهٔ موارد انجام شده را برگزینید",
+ "report.rules.title": "کدام قوانین نقض شدهاند؟",
+ "report.statuses.subtitle": "همهٔ موارد انجام شده را برگزینید",
+ "report.statuses.title": "آیا فرستهای وجود دارد که از این گزارش پشتیبانی کند؟",
"report.submit": "فرستادن",
"report.target": "در حال گزارش {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "در اینجا گزینههایی برای کنترل آنچه در ماستودون میبینید، وجود دارد:",
+ "report.thanks.take_action_actionable": "در حالی که ما این مورد را بررسی میکنیم، میتوانید علیه @{name} اقدام کنید:",
+ "report.thanks.title": "نمیخواهید این را ببینید؟",
+ "report.thanks.title_actionable": "ممنون بابت گزارش، ما آن را بررسی خواهیم کرد.",
+ "report.unfollow": "ناپیگیری @{name}",
+ "report.unfollow_explanation": "شما این حساب را پیگرفتهاید، برای اینکه دیگر فرستههایش را در خوراک خانهتان نبینید؛ آن را پینگیرید.",
"search.placeholder": "جستوجو",
"search_popout.search_format": "راهنمای جستوجوی پیشرفته",
"search_popout.tips.full_text": "جستوجوی متنی ساده فرستههایی که نوشته، پسندیده، تقویتکرده یا در آنها نامبرده شدهاید را به علاوهٔ نامهای کاربری، نامهای نمایشی و برچسبها برمیگرداند.",
@@ -434,39 +439,39 @@
"search_popout.tips.text": "جستوجوی متنی ساده برای نامها، نامهای کاربری، و برچسبها",
"search_popout.tips.user": "کاربر",
"search_results.accounts": "افراد",
- "search_results.all": "All",
+ "search_results.all": "همه",
"search_results.hashtags": "برچسبها",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "چیزی برای این عبارت جستوجو یافت نشد",
"search_results.statuses": "فرستهها",
- "search_results.statuses_fts_disabled": "جستوجوی محتوای فرستهها در این کارساز ماستودون فعال نشده است.",
+ "search_results.statuses_fts_disabled": "جستوجوی محتوای فرستهها در این کارساز ماستودون به کار انداخته نشده است.",
"search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
- "status.admin_account": "گشودن واسط مدیریت برای @{name}",
+ "status.admin_account": "گشودن واسط مدیریت برای @{name}",
"status.admin_status": "گشودن این فرسته در واسط مدیریت",
- "status.block": "مسدود کردن @{name}",
+ "status.block": "مسدود کردن @{name}",
"status.bookmark": "نشانک",
- "status.cancel_reblog_private": "لغو تقویت",
+ "status.cancel_reblog_private": "ناتقویت",
"status.cannot_reblog": "این فرسته قابل تقویت نیست",
- "status.copy": "رونویسی از نشانی فرسته",
+ "status.copy": "رونوشت پیوند فرسته",
"status.delete": "حذف",
"status.detailed_status": "نمایش کامل گفتگو",
- "status.direct": "پیام مستقیم به @{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
- "status.embed": "جاگذاری",
+ "status.direct": "پیام مستقیم به @{name}",
+ "status.edit": "ویرایش",
+ "status.edited": "ویرایش شده در {date}",
+ "status.edited_x_times": "{count, plural, one {{count} مرتبه} other {{count} مرتبه}} ویرایش شد",
+ "status.embed": "جاسازی",
"status.favourite": "پسندیدن",
"status.filtered": "پالوده",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "توسط {name} در {date} ایجاد شد",
+ "status.history.edited": "توسط {name} در {date} ویرایش شد",
"status.load_more": "بار کردن بیشتر",
"status.media_hidden": "رسانهٔ نهفته",
- "status.mention": "نامبردن از @{name}",
+ "status.mention": "نامبردن از @{name}",
"status.more": "بیشتر",
- "status.mute": "خموشاندن @{name}",
+ "status.mute": "خموشاندن @{name}",
"status.mute_conversation": "خموشاندن گفتوگو",
"status.open": "گسترش این فرسته",
- "status.pin": "سنجاقکردن در نمایه",
- "status.pinned": "فرستهٔ سنجاقشده",
+ "status.pin": "سنجاق کردن در نمایه",
+ "status.pinned": "فرستهٔ سنجاق شده",
"status.read_more": "بیشتر بخوانید",
"status.reblog": "تقویت",
"status.reblog_private": "تقویت برای مخاطبان نخستین",
@@ -476,7 +481,7 @@
"status.remove_bookmark": "برداشتن نشانک",
"status.reply": "پاسخ",
"status.replyAll": "پاسخ به رشته",
- "status.report": "گزارش @{name}",
+ "status.report": "گزارش @{name}",
"status.sensitive_warning": "محتوای حساس",
"status.share": "همرسانی",
"status.show_less": "نمایش کمتر",
@@ -515,6 +520,7 @@
"upload_error.poll": "بارگذاری پرونده در نظرسنجیها مجاز نیست.",
"upload_form.audio_description": "برای ناشنوایان توصیفش کنید",
"upload_form.description": "برای کمبینایان توصیفش کنید",
+ "upload_form.description_missing": "شرحی افزوده نشده",
"upload_form.edit": "ویرایش",
"upload_form.thumbnail": "تغییر بندانگشتی",
"upload_form.undo": "حذف",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 39df81770..fb3725664 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -70,7 +70,7 @@
"column.blocks": "Estetyt käyttäjät",
"column.bookmarks": "Kirjanmerkit",
"column.community": "Paikallinen aikajana",
- "column.direct": "Pikaviestit",
+ "column.direct": "Direct messages",
"column.directory": "Selaa profiileja",
"column.domain_blocks": "Piilotetut verkkotunnukset",
"column.favourites": "Suosikit",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Vain paikalliset",
"community.column_settings.media_only": "Vain media",
"community.column_settings.remote_only": "Vain etäkäyttö",
- "compose_form.direct_message_warning": "Tämä viesti näkyy vain mainituille käyttäjille.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Lisätietoja",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Tätä julkaisua listata minkään hastagin alle, koska se on listaamaton. Ainoastaan julkisia julkaisuja etsiä hastageilla.",
"compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.",
"compose_form.lock_disclaimer.lock": "lukittu",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Poista tämä valinta",
"compose_form.poll.switch_to_multiple": "Muuta kysely monivalinnaksi",
"compose_form.poll.switch_to_single": "Muuta kysely sallimaan vain yksi valinta",
- "compose_form.publish": "Lähetä viesti",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Tallenna muutokset",
"compose_form.sensitive.hide": "{count, plural, one {Merkitse media arkaluontoiseksi} other {Merkitse media arkaluontoiseksi}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
"embed.preview": "Se tulee näyttämään tältä:",
"emoji_button.activity": "Aktiviteetit",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Mukautetut",
"emoji_button.flags": "Liput",
"emoji_button.food": "Ruoka ja juoma",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.",
"empty_column.bookmarked_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
"empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!",
- "empty_column.direct": "Sinulla ei ole vielä yhtään viestiä yksittäiselle käyttäjälle. Kun lähetät tai vastaanotat sellaisen, se näkyy täällä.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Yhtään verkko-osoitetta ei ole vielä estetty.",
"empty_column.explore_statuses": "Mikään ei ole nyt trendi. Tarkista myöhemmin!",
"empty_column.favourited_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Kohdista sarakkeeseen",
"keyboard_shortcuts.compose": "siirry tekstinsyöttöön",
"keyboard_shortcuts.description": "Kuvaus",
- "keyboard_shortcuts.direct": "Avaa pikaviestisarake",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "Siirry listassa alaspäin",
"keyboard_shortcuts.enter": "Avaa julkaisu",
"keyboard_shortcuts.favourite": "Lisää suosikkeihin",
@@ -264,6 +267,8 @@
"lightbox.expand": "Laajenna kuvan näkymälaatikko",
"lightbox.next": "Seuraava",
"lightbox.previous": "Edellinen",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Lisää listaan",
"lists.account.remove": "Poista listasta",
"lists.delete": "Poista lista",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Kirjanmerkit",
"navigation_bar.community_timeline": "Paikallinen aikajana",
"navigation_bar.compose": "Luo uusi viesti",
- "navigation_bar.direct": "Pikaviestit",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Löydä uutta",
"navigation_bar.domain_blocks": "Estetyt verkkotunnukset",
"navigation_bar.edit_profile": "Muokkaa profiilia",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Poista kysely",
"privacy.change": "Muuta julkaisun näkyvyyttä",
"privacy.direct.long": "Julkaise vain mainituille käyttäjille",
- "privacy.direct.short": "Suora viesti",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Julkaise vain seuraajille",
- "privacy.private.short": "Vain seuraajat",
- "privacy.public.long": "Julkaise julkisille aikajanoille",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Julkinen",
- "privacy.unlisted.long": "Älä julkaise julkisilla aikajanoilla",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Listaamaton julkinen",
"refresh": "Päivitä",
"regeneration_indicator.label": "Ladataan…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Tiedon lataaminen ei ole sallittua kyselyissä.",
"upload_form.audio_description": "Kuvaile kuulovammaisille",
"upload_form.description": "Anna kuvaus näkörajoitteisia varten",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Muokkaa",
"upload_form.thumbnail": "Vaihda pikkukuva",
"upload_form.undo": "Peru",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 65d3c6ea1..0d8759e25 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -1,25 +1,25 @@
{
"account.account_note_header": "Note",
"account.add_or_remove_from_list": "Ajouter ou retirer des listes",
- "account.badges.bot": "Robot",
+ "account.badges.bot": "Bot",
"account.badges.group": "Groupe",
"account.block": "Bloquer @{name}",
"account.block_domain": "Bloquer le domaine {domain}",
- "account.blocked": "Bloqué",
+ "account.blocked": "Bloqué·e",
"account.browse_more_on_origin_server": "Parcourir davantage sur le profil original",
"account.cancel_follow_request": "Annuler la demande de suivi",
"account.direct": "Envoyer un message direct à @{name}",
- "account.disable_notifications": "Arrêter de me notifier quand @{name} publie",
+ "account.disable_notifications": "Ne plus me notifier quand @{name} publie quelque chose",
"account.domain_blocked": "Domaine bloqué",
"account.edit_profile": "Modifier le profil",
- "account.enable_notifications": "Me notifier quand @{name} publie",
+ "account.enable_notifications": "Me notifier quand @{name} publie quelque chose",
"account.endorse": "Recommander sur votre profil",
"account.follow": "Suivre",
- "account.followers": "Abonnés",
+ "account.followers": "Abonné·e·s",
"account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
"account.followers_counter": "{count, plural, one {{counter} Abonné·e} other {{counter} Abonné·e·s}}",
"account.following": "Abonnements",
- "account.following_counter": "{count, plural, other {{counter} Abonnements}}",
+ "account.following_counter": "{count, plural, one {{counter} Abonnement} other {{counter} Abonnements}}",
"account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
"account.follows_you": "Vous suit",
"account.hide_reblogs": "Masquer les partages de @{name}",
@@ -30,12 +30,12 @@
"account.mention": "Mentionner @{name}",
"account.moved_to": "{name} a déménagé vers :",
"account.mute": "Masquer @{name}",
- "account.mute_notifications": "Ignorer les notifications de @{name}",
+ "account.mute_notifications": "Masquer les notifications de @{name}",
"account.muted": "Masqué·e",
"account.posts": "Messages",
"account.posts_with_replies": "Messages et réponses",
"account.report": "Signaler @{name}",
- "account.requested": "En attente d’approbation. Cliquez pour annuler la requête",
+ "account.requested": "En attente d’approbation. Cliquez pour annuler la demande",
"account.share": "Partager le profil de @{name}",
"account.show_reblogs": "Afficher les partages de @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Message} other {{counter} Messages}}",
@@ -48,8 +48,8 @@
"account.unmute_notifications": "Ne plus masquer les notifications de @{name}",
"account.unmute_short": "Ne plus masquer",
"account_note.placeholder": "Cliquez pour ajouter une note",
- "admin.dashboard.daily_retention": "Taux de maintien des utilisateur·rice·s par jour après inscription",
- "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate efter måned efter tilmelding",
+ "admin.dashboard.daily_retention": "Taux de rétention des utilisateur·rice·s par jour après inscription",
+ "admin.dashboard.monthly_retention": "Taux de rétention des utilisateur·rice·s par mois après inscription",
"admin.dashboard.retention.average": "Moyenne",
"admin.dashboard.retention.cohort": "Mois d'inscription",
"admin.dashboard.retention.cohort_size": "Nouveaux utilisateurs",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local seulement",
"community.column_settings.media_only": "Média uniquement",
"community.column_settings.remote_only": "Distant seulement",
- "compose_form.direct_message_warning": "Ce message sera uniquement envoyé aux personnes mentionnées. Cependant, l’administration de votre instance et des instances réceptrices pourront inspecter ce message.",
+ "compose.language.change": "Changer de langue",
+ "compose.language.search": "Rechercher des langues …",
"compose_form.direct_message_warning_learn_more": "En savoir plus",
+ "compose_form.encryption_warning": "Les messages sur Mastodon ne sont pas chiffrés de bout en bout. Ne partagez aucune information sensible sur Mastodon.",
"compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur « non listé ». Seuls les pouets avec une visibilité « publique » peuvent être recherchés par hashtag.",
"compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos messages privés.",
"compose_form.lock_disclaimer.lock": "verrouillé",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Supprimer ce choix",
"compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix",
"compose_form.poll.switch_to_single": "Changer le sondage pour autoriser qu'un seul choix",
- "compose_form.publish": "Pouet",
+ "compose_form.publish": "Publier",
"compose_form.publish_loud": "{publish} !",
"compose_form.save_changes": "Enregistrer les modifications",
"compose_form.sensitive.hide": "Marquer le média comme sensible",
@@ -146,10 +148,11 @@
"directory.recently_active": "Actif·ve·s récemment",
"embed.instructions": "Intégrez ce message à votre site en copiant le code ci-dessous.",
"embed.preview": "Il apparaîtra comme cela :",
- "emoji_button.activity": "Activité",
+ "emoji_button.activity": "Activités",
+ "emoji_button.clear": "Effacer",
"emoji_button.custom": "Personnalisés",
"emoji_button.flags": "Drapeaux",
- "emoji_button.food": "Nourriture & Boisson",
+ "emoji_button.food": "Nourriture et boisson",
"emoji_button.label": "Insérer un émoji",
"emoji_button.nature": "Nature",
"emoji_button.not_found": "Aucun émoji correspondant n'a été trouvé",
@@ -159,7 +162,7 @@
"emoji_button.search": "Recherche...",
"emoji_button.search_results": "Résultats de la recherche",
"emoji_button.symbols": "Symboles",
- "emoji_button.travel": "Lieux & Voyages",
+ "emoji_button.travel": "Voyage et lieux",
"empty_column.account_suspended": "Compte suspendu",
"empty_column.account_timeline": "Aucun message ici !",
"empty_column.account_unavailable": "Profil non disponible",
@@ -229,9 +232,9 @@
"keyboard_shortcuts.blocked": "Ouvrir la liste des comptes bloqués",
"keyboard_shortcuts.boost": "Partager le message",
"keyboard_shortcuts.column": "Se placer dans une colonne",
- "keyboard_shortcuts.compose": "se placer dans la zone de rédaction",
+ "keyboard_shortcuts.compose": "Se placer dans la zone de rédaction",
"keyboard_shortcuts.description": "Description",
- "keyboard_shortcuts.direct": "Ouvrir la colonne des messages directs",
+ "keyboard_shortcuts.direct": "pour ouvrir la colonne des messages directs",
"keyboard_shortcuts.down": "Descendre dans la liste",
"keyboard_shortcuts.enter": "Ouvrir le message",
"keyboard_shortcuts.favourite": "Ajouter le message aux favoris",
@@ -246,7 +249,7 @@
"keyboard_shortcuts.muted": "Ouvrir la liste des comptes masqués",
"keyboard_shortcuts.my_profile": "Ouvrir votre profil",
"keyboard_shortcuts.notifications": "Ouvrir la colonne de notifications",
- "keyboard_shortcuts.open_media": "ouvrir le média",
+ "keyboard_shortcuts.open_media": "Ouvrir le média",
"keyboard_shortcuts.pinned": "Ouvrir la liste des messages épinglés",
"keyboard_shortcuts.profile": "Ouvrir le profil de l’auteur·rice",
"keyboard_shortcuts.reply": "Répondre au message",
@@ -264,6 +267,8 @@
"lightbox.expand": "Agrandir la fenêtre de visualisation des images",
"lightbox.next": "Suivant",
"lightbox.previous": "Précédent",
+ "limited_account_hint.action": "Afficher le profil quand même",
+ "limited_account_hint.title": "Ce profil a été masqué par la modération de votre serveur.",
"lists.account.add": "Ajouter à la liste",
"lists.account.remove": "Supprimer de la liste",
"lists.delete": "Supprimer la liste",
@@ -279,7 +284,7 @@
"lists.subheading": "Vos listes",
"load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}",
"loading_indicator.label": "Chargement…",
- "media_gallery.toggle_visible": "Intervertir la visibilité",
+ "media_gallery.toggle_visible": "{number, plural, one {Cacher l’image} other {Cacher les images}}",
"missing_indicator.label": "Non trouvé",
"missing_indicator.sublabel": "Ressource introuvable",
"mute_modal.duration": "Durée",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Supprimer le sondage",
"privacy.change": "Ajuster la confidentialité du message",
"privacy.direct.long": "Visible uniquement par les comptes mentionnés",
- "privacy.direct.short": "Direct",
+ "privacy.direct.short": "Personnes mentionnées uniquement",
"privacy.private.long": "Visible uniquement par vos abonné·e·s",
"privacy.private.short": "Abonné·e·s uniquement",
- "privacy.public.long": "Visible par tou·te·s, affiché dans les fils publics",
+ "privacy.public.long": "Visible pour tous",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible par tou·te·s, mais pas dans les fils publics",
+ "privacy.unlisted.long": "Visible pour tous, mais sans fonctionnalités de découverte",
"privacy.unlisted.short": "Non listé",
"refresh": "Actualiser",
"regeneration_indicator.label": "Chargement…",
@@ -515,6 +520,7 @@
"upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.",
"upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
"upload_form.description": "Décrire pour les malvoyant·e·s",
+ "upload_form.description_missing": "Description manquante",
"upload_form.edit": "Modifier",
"upload_form.thumbnail": "Changer la vignette",
"upload_form.undo": "Supprimer",
diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json
new file mode 100644
index 000000000..f8485270a
--- /dev/null
+++ b/app/javascript/mastodon/locales/fy.json
@@ -0,0 +1,549 @@
+{
+ "account.account_note_header": "Note",
+ "account.add_or_remove_from_list": "Add or Remove from lists",
+ "account.badges.bot": "Bot",
+ "account.badges.group": "Groep",
+ "account.block": "Block @{name}",
+ "account.block_domain": "Block domain {domain}",
+ "account.blocked": "Blocked",
+ "account.browse_more_on_origin_server": "Browse more on the original profile",
+ "account.cancel_follow_request": "Cancel follow request",
+ "account.direct": "Direct message @{name}",
+ "account.disable_notifications": "Stop notifying me when @{name} posts",
+ "account.domain_blocked": "Domein blokkearre",
+ "account.edit_profile": "Profyl oanpasse",
+ "account.enable_notifications": "Notify me when @{name} posts",
+ "account.endorse": "Feature on profile",
+ "account.follow": "Folgje",
+ "account.followers": "Folgers",
+ "account.followers.empty": "No one follows this user yet.",
+ "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+ "account.following": "Folget",
+ "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+ "account.follows.empty": "This user doesn't follow anyone yet.",
+ "account.follows_you": "Folget dy",
+ "account.hide_reblogs": "Hide boosts from @{name}",
+ "account.joined": "Registrearre op {date}",
+ "account.link_verified_on": "Ownership of this link was checked on {date}",
+ "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+ "account.media": "Media",
+ "account.mention": "Fermeld @{name}",
+ "account.moved_to": "{name} has moved to:",
+ "account.mute": "Mute @{name}",
+ "account.mute_notifications": "Mute notifications from @{name}",
+ "account.muted": "Muted",
+ "account.posts": "Posts",
+ "account.posts_with_replies": "Posts and replies",
+ "account.report": "Report @{name}",
+ "account.requested": "Awaiting approval. Click to cancel follow request",
+ "account.share": "Share @{name}'s profile",
+ "account.show_reblogs": "Show boosts from @{name}",
+ "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
+ "account.unblock": "Unblock @{name}",
+ "account.unblock_domain": "Unblock domain {domain}",
+ "account.unblock_short": "Unblock",
+ "account.unendorse": "Don't feature on profile",
+ "account.unfollow": "Net mear folgje",
+ "account.unmute": "Unmute @{name}",
+ "account.unmute_notifications": "Unmute notifications from @{name}",
+ "account.unmute_short": "Net mear negearre",
+ "account_note.placeholder": "Click to add a note",
+ "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.retention.average": "Gemiddelde",
+ "admin.dashboard.retention.cohort": "Sign-up month",
+ "admin.dashboard.retention.cohort_size": "Nije brûkers",
+ "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+ "alert.rate_limited.title": "Rate limited",
+ "alert.unexpected.message": "An unexpected error occurred.",
+ "alert.unexpected.title": "Oops!",
+ "announcement.announcement": "Announcement",
+ "attachments_list.unprocessed": "(net ferwurke)",
+ "autosuggest_hashtag.per_week": "{count} per week",
+ "boost_modal.combo": "You can press {combo} to skip this next time",
+ "bundle_column_error.body": "Something went wrong while loading this component.",
+ "bundle_column_error.retry": "Try again",
+ "bundle_column_error.title": "Network error",
+ "bundle_modal_error.close": "Slute",
+ "bundle_modal_error.message": "Something went wrong while loading this component.",
+ "bundle_modal_error.retry": "Opnij probearje",
+ "column.blocks": "Blokkearre brûkers",
+ "column.bookmarks": "Blêdwizers",
+ "column.community": "Local timeline",
+ "column.direct": "Direct messages",
+ "column.directory": "Browse profiles",
+ "column.domain_blocks": "Blokkeare domeinen",
+ "column.favourites": "Favoriten",
+ "column.follow_requests": "Follow requests",
+ "column.home": "Home",
+ "column.lists": "Listen",
+ "column.mutes": "Negearre brûkers",
+ "column.notifications": "Notifikaasjes",
+ "column.pins": "Fêstsette berjochten",
+ "column.public": "Federated timeline",
+ "column_back_button.label": "Werom",
+ "column_header.hide_settings": "Ynstellings ferbergje",
+ "column_header.moveLeft_settings": "Kolom nei links ferpleatse",
+ "column_header.moveRight_settings": "Kolom nei rjochts ferpleatse",
+ "column_header.pin": "Fêstsette",
+ "column_header.show_settings": "Ynstellings sjen litte",
+ "column_header.unpin": "Los helje",
+ "column_subheading.settings": "Ynstellings",
+ "community.column_settings.local_only": "Allinnich lokaal",
+ "community.column_settings.media_only": "Allinnich media",
+ "community.column_settings.remote_only": "Allinnich oare tsjinners",
+ "compose.language.change": "Fan taal feroarje",
+ "compose.language.search": "Talen sykje...",
+ "compose_form.direct_message_warning_learn_more": "Lês mear",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
+ "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+ "compose_form.lock_disclaimer.lock": "locked",
+ "compose_form.placeholder": "Wat wolst kwyt?",
+ "compose_form.poll.add_option": "Add a choice",
+ "compose_form.poll.duration": "Poll duration",
+ "compose_form.poll.option_placeholder": "Choice {number}",
+ "compose_form.poll.remove_option": "Remove this choice",
+ "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+ "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+ "compose_form.publish": "Publisearje",
+ "compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "Save changes",
+ "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+ "compose_form.spoiler.marked": "Ynhâldswarskôging fuortsmite",
+ "compose_form.spoiler.unmarked": "Ynhâldswarskôging tafoegje",
+ "compose_form.spoiler_placeholder": "Write your warning here",
+ "confirmation_modal.cancel": "Ofbrekke",
+ "confirmations.block.block_and_report": "Blokkearre & Oanjaan",
+ "confirmations.block.confirm": "Blokkearre",
+ "confirmations.block.message": "Wolle jo {name} werklik blokkearre?",
+ "confirmations.delete.confirm": "Fuortsmite",
+ "confirmations.delete.message": "Wolle jo dit berjocht werklik fuortsmite?",
+ "confirmations.delete_list.confirm": "Fuortsmite",
+ "confirmations.delete_list.message": "Wolle jo dizze list werklik foar ivich fuortsmite?",
+ "confirmations.discard_edit_media.confirm": "Discard",
+ "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.domain_block.confirm": "Hide entire domain",
+ "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+ "confirmations.logout.confirm": "Log out",
+ "confirmations.logout.message": "Wolle jo werklik útlogge?",
+ "confirmations.mute.confirm": "Negearre",
+ "confirmations.mute.explanation": "Dit sil berjochten fan harren ûnsichtber meitsje en berjochen wêr se yn fermeld wurde, mar se sille jo berjochten noch immen sjen kinne en jo folgje kinne.",
+ "confirmations.mute.message": "Wolle jo {name} werklik negearre?",
+ "confirmations.redraft.confirm": "Delete & redraft",
+ "confirmations.redraft.message": "Wolle jo dit berjocht werklik fuortsmite en opnij opstelle? Favoriten en boosts geane dan ferlern, en reaksjes op it oarspronklike berjocht reitsje jo kwyt.",
+ "confirmations.reply.confirm": "Reagearre",
+ "confirmations.reply.message": "Troch no te reagearjen sil it berjocht wat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo troch gean?",
+ "confirmations.unfollow.confirm": "Net mear folgje",
+ "confirmations.unfollow.message": "Wolle jo {name} werklik net mear folgje?",
+ "conversation.delete": "Petear fuortsmite",
+ "conversation.mark_as_read": "As lêzen oanmurkje",
+ "conversation.open": "Petear besjen",
+ "conversation.with": "Mei {names}",
+ "directory.federated": "From known fediverse",
+ "directory.local": "From {domain} only",
+ "directory.new_arrivals": "New arrivals",
+ "directory.recently_active": "Resintlik warber",
+ "embed.instructions": "Embed this status on your website by copying the code below.",
+ "embed.preview": "Here is what it will look like:",
+ "emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
+ "emoji_button.custom": "Custom",
+ "emoji_button.flags": "Flags",
+ "emoji_button.food": "Food & Drink",
+ "emoji_button.label": "Insert emoji",
+ "emoji_button.nature": "Nature",
+ "emoji_button.not_found": "No matching emojis found",
+ "emoji_button.objects": "Objects",
+ "emoji_button.people": "People",
+ "emoji_button.recent": "Frequently used",
+ "emoji_button.search": "Search...",
+ "emoji_button.search_results": "Search results",
+ "emoji_button.symbols": "Symbols",
+ "emoji_button.travel": "Travel & Places",
+ "empty_column.account_suspended": "Account suspended",
+ "empty_column.account_timeline": "Gjin berjochten hjir!",
+ "empty_column.account_unavailable": "Profyl net beskikber",
+ "empty_column.blocks": "Jo hawwe noch gjin brûkers blokkearre.",
+ "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
+ "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+ "empty_column.domain_blocks": "Der binne noch gjin blokkearre domeinen.",
+ "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
+ "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
+ "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+ "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+ "empty_column.hashtag": "There is nothing in this hashtag yet.",
+ "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
+ "empty_column.home.suggestions": "Suggestjes besjen",
+ "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+ "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+ "empty_column.mutes": "Jo hawwe noch gjin brûkers negearre.",
+ "empty_column.notifications": "Jo hawwe noch gjin notifikaasjes. Ynteraksjes mei oare minsken sjogge jo hjir.",
+ "empty_column.public": "Der is hjir neat! Skriuw eat publyklik, of folgje sels brûkers fan oare tsjinners om it hjir te foljen",
+ "error.unexpected_crash.explanation": "Troch in bug in ús koade as in probleem mei de komptabiliteit fan jo browser, koe dizze side net sjen litten wurde.",
+ "error.unexpected_crash.explanation_addons": "Dizze side kin net goed sjen litten wurde. Dit probleem komt faaks troch in browser útwreiding of ark foar automatysk oersetten.",
+ "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+ "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+ "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+ "errors.unexpected_crash.report_issue": "Technysk probleem oanjaan",
+ "explore.search_results": "Search results",
+ "explore.suggested_follows": "Foar jo",
+ "explore.title": "Ferkenne",
+ "explore.trending_links": "Nijs",
+ "explore.trending_statuses": "Berjochten",
+ "explore.trending_tags": "Hashtags",
+ "follow_recommendations.done": "Klear",
+ "follow_recommendations.heading": "Folgje minsken wer as jo graach berjochten fan sjen wolle! Hjir binne wat suggestjes.",
+ "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "follow_request.authorize": "Goedkarre",
+ "follow_request.reject": "Ofkarre",
+ "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+ "generic.saved": "Bewarre",
+ "getting_started.developers": "Untwikkelders",
+ "getting_started.directory": "Profile directory",
+ "getting_started.documentation": "Dokumintaasje",
+ "getting_started.heading": "Utein sette",
+ "getting_started.invite": "Minsken útnûgje",
+ "getting_started.open_source_notice": "Mastodon is iepen boarne software. Jo kinne sels bydrage of problemen oanjaan troch GitHub op {github}.",
+ "getting_started.security": "Account ynstellings",
+ "getting_started.terms": "Terms of service",
+ "hashtag.column_header.tag_mode.all": "en {additional}",
+ "hashtag.column_header.tag_mode.any": "of {additional}",
+ "hashtag.column_header.tag_mode.none": "sûnder {additional}",
+ "hashtag.column_settings.select.no_options_message": "No suggestions found",
+ "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+ "hashtag.column_settings.tag_mode.all": "All of these",
+ "hashtag.column_settings.tag_mode.any": "Any of these",
+ "hashtag.column_settings.tag_mode.none": "None of these",
+ "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+ "home.column_settings.basic": "Basic",
+ "home.column_settings.show_reblogs": "Show boosts",
+ "home.column_settings.show_replies": "Show replies",
+ "home.hide_announcements": "Hide announcements",
+ "home.show_announcements": "Show announcements",
+ "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+ "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+ "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+ "keyboard_shortcuts.back": "to navigate back",
+ "keyboard_shortcuts.blocked": "to open blocked users list",
+ "keyboard_shortcuts.boost": "to boost",
+ "keyboard_shortcuts.column": "to focus a status in one of the columns",
+ "keyboard_shortcuts.compose": "to focus the compose textarea",
+ "keyboard_shortcuts.description": "Description",
+ "keyboard_shortcuts.direct": "to open direct messages column",
+ "keyboard_shortcuts.down": "to move down in the list",
+ "keyboard_shortcuts.enter": "to open status",
+ "keyboard_shortcuts.favourite": "to favourite",
+ "keyboard_shortcuts.favourites": "to open favourites list",
+ "keyboard_shortcuts.federated": "to open federated timeline",
+ "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+ "keyboard_shortcuts.home": "to open home timeline",
+ "keyboard_shortcuts.hotkey": "Hotkey",
+ "keyboard_shortcuts.legend": "to display this legend",
+ "keyboard_shortcuts.local": "to open local timeline",
+ "keyboard_shortcuts.mention": "Skriuwer beneame",
+ "keyboard_shortcuts.muted": "to open muted users list",
+ "keyboard_shortcuts.my_profile": "Jo profyl iepenje",
+ "keyboard_shortcuts.notifications": "Notifikaasjes sjen litte",
+ "keyboard_shortcuts.open_media": "Media iepenje",
+ "keyboard_shortcuts.pinned": "Fêstsette berjochten sjen litte",
+ "keyboard_shortcuts.profile": "Profyl fan skriuwer iepenje",
+ "keyboard_shortcuts.reply": "Berjocht beäntwurdzje",
+ "keyboard_shortcuts.requests": "Folgfersiken sjen litte",
+ "keyboard_shortcuts.search": "to focus search",
+ "keyboard_shortcuts.spoilers": "CW fjild ferstopje/sjen litte",
+ "keyboard_shortcuts.start": "\"Útein sette\" iepenje",
+ "keyboard_shortcuts.toggle_hidden": "Tekst efter CW fjild ferstopje/sjen litte",
+ "keyboard_shortcuts.toggle_sensitivity": "Media ferstopje/sjen litte",
+ "keyboard_shortcuts.toot": "Nij berjocht skriuwe",
+ "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+ "keyboard_shortcuts.up": "Nei boppe yn list ferpleatse",
+ "lightbox.close": "Slute",
+ "lightbox.compress": "Compress image view box",
+ "lightbox.expand": "Expand image view box",
+ "lightbox.next": "Fierder",
+ "lightbox.previous": "Werom",
+ "limited_account_hint.action": "Profyl dochs besjen",
+ "limited_account_hint.title": "Dit profyl is ferstoppe troch de behearders fan jo tsjinner.",
+ "lists.account.add": "Oan list tafoegje",
+ "lists.account.remove": "Ut list wei smite",
+ "lists.delete": "List fuortsmite",
+ "lists.edit": "Edit list",
+ "lists.edit.submit": "Titel feroarje",
+ "lists.new.create": "Add list",
+ "lists.new.title_placeholder": "Nije list titel",
+ "lists.replies_policy.followed": "Elke folge brûker",
+ "lists.replies_policy.list": "Leden fan de list",
+ "lists.replies_policy.none": "Net ien",
+ "lists.replies_policy.title": "Reaksjes sjen litte oan:",
+ "lists.search": "Search among people you follow",
+ "lists.subheading": "Jo listen",
+ "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "loading_indicator.label": "Loading...",
+ "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
+ "missing_indicator.label": "Net fûn",
+ "missing_indicator.sublabel": "This resource could not be found",
+ "mute_modal.duration": "Duration",
+ "mute_modal.hide_notifications": "Notifikaasjes fan dizze brûker ferstopje?",
+ "mute_modal.indefinite": "Indefinite",
+ "navigation_bar.apps": "Mobile apps",
+ "navigation_bar.blocks": "Blokkearre brûkers",
+ "navigation_bar.bookmarks": "Blêdwiizers",
+ "navigation_bar.community_timeline": "Local timeline",
+ "navigation_bar.compose": "Compose new post",
+ "navigation_bar.direct": "Direct messages",
+ "navigation_bar.discover": "Untdekke",
+ "navigation_bar.domain_blocks": "Blokkearre domeinen",
+ "navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.explore": "Explore",
+ "navigation_bar.favourites": "Favoriten",
+ "navigation_bar.filters": "Negearre wurden",
+ "navigation_bar.follow_requests": "Folgfersiken",
+ "navigation_bar.follows_and_followers": "Folgers en folgjenden",
+ "navigation_bar.info": "Oer dizze tsjinner",
+ "navigation_bar.keyboard_shortcuts": "Fluchtoetsen",
+ "navigation_bar.lists": "Listen",
+ "navigation_bar.logout": "Utlogge",
+ "navigation_bar.mutes": "Negearre brûkers",
+ "navigation_bar.personal": "Persoanlik",
+ "navigation_bar.pins": "Fêstsette berjochten",
+ "navigation_bar.preferences": "Foarkarren",
+ "navigation_bar.public_timeline": "Federated timeline",
+ "navigation_bar.security": "Security",
+ "notification.admin.sign_up": "{name} hat harren ynskreaun",
+ "notification.favourite": "{name} hat jo berjocht as favoryt markearre",
+ "notification.follow": "{name} folget jo",
+ "notification.follow_request": "{name} hat jo in folgfersyk stjoerd",
+ "notification.mention": "{name} hat jo fermeld",
+ "notification.own_poll": "Jo poll is beëinige",
+ "notification.poll": "In poll wêr jo yn stimt ha is beëinige",
+ "notification.reblog": "{name} hat jo berjocht boost",
+ "notification.status": "{name} hat in berjocht pleatst",
+ "notification.update": "{name} hat in berjocht feroare",
+ "notifications.clear": "Notifikaasjes leegje",
+ "notifications.clear_confirmation": "Wolle jo al jo notifikaasjes werklik foar ivich fuortsmite?",
+ "notifications.column_settings.admin.sign_up": "Nije ynskriuwingen:",
+ "notifications.column_settings.alert": "Desktop notifikaasjes",
+ "notifications.column_settings.favourite": "Favoriten:",
+ "notifications.column_settings.filter_bar.advanced": "Alle kategorien sjen litte",
+ "notifications.column_settings.filter_bar.category": "Quick filter bar",
+ "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.follow": "Nije folgers:",
+ "notifications.column_settings.follow_request": "New follow requests:",
+ "notifications.column_settings.mention": "Fermeldingen:",
+ "notifications.column_settings.poll": "Poll results:",
+ "notifications.column_settings.push": "Push notifications",
+ "notifications.column_settings.reblog": "Boosts:",
+ "notifications.column_settings.show": "Show in column",
+ "notifications.column_settings.sound": "Play sound",
+ "notifications.column_settings.status": "New posts:",
+ "notifications.column_settings.unread_notifications.category": "Unread notifications",
+ "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.update": "Edits:",
+ "notifications.filter.all": "All",
+ "notifications.filter.boosts": "Boosts",
+ "notifications.filter.favourites": "Favourites",
+ "notifications.filter.follows": "Follows",
+ "notifications.filter.mentions": "Fermeldingen",
+ "notifications.filter.polls": "Poll results",
+ "notifications.filter.statuses": "Updates from people you follow",
+ "notifications.grant_permission": "Grant permission.",
+ "notifications.group": "{count} notifications",
+ "notifications.mark_as_read": "Mark every notification as read",
+ "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+ "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+ "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+ "notifications_permission_banner.enable": "Enable desktop notifications",
+ "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+ "notifications_permission_banner.title": "Never miss a thing",
+ "picture_in_picture.restore": "Put it back",
+ "poll.closed": "Closed",
+ "poll.refresh": "Refresh",
+ "poll.total_people": "{count, plural, one {# persoan} other {# minsken}}",
+ "poll.total_votes": "{count, plural, one {# stim} other {# stimmen}}",
+ "poll.vote": "Stim",
+ "poll.voted": "Jo hawwe hjir op stimt",
+ "poll.votes": "{votes, plural, one {# stim} other {# stimmen}}",
+ "poll_button.add_poll": "In poll tafoegje",
+ "poll_button.remove_poll": "Poll fuortsmite",
+ "privacy.change": "Adjust status privacy",
+ "privacy.direct.long": "Allinnich sichtber foar fermelde brûkers",
+ "privacy.direct.short": "Allinnich fermelde minsken",
+ "privacy.private.long": "Allinnich sichtber foar folgers",
+ "privacy.private.short": "Allinnich folgers",
+ "privacy.public.long": "Sichtber foar elkenien",
+ "privacy.public.short": "Iepenbier",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+ "privacy.unlisted.short": "Unlisted",
+ "refresh": "Fernije",
+ "regeneration_indicator.label": "Loading…",
+ "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+ "relative_time.days": "{number}d",
+ "relative_time.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
+ "relative_time.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
+ "relative_time.full.just_now": "no krekt",
+ "relative_time.full.minutes": "{number, plural, one {# minút} other {# minuten}} lyn",
+ "relative_time.full.seconds": "{number, plural, one {# sekonde} other {# sekonden}} lyn",
+ "relative_time.hours": "{number}o",
+ "relative_time.just_now": "no",
+ "relative_time.minutes": "{number}m",
+ "relative_time.seconds": "{number}s",
+ "relative_time.today": "hjoed",
+ "reply_indicator.cancel": "Ofbrekke",
+ "report.block": "Blokkearre",
+ "report.block_explanation": "Jo sille harren berjochten net sjen kinne. Se sille jo berjochten net sjen kinne en jo net folgje kinne. Se sille wol sjen kinne dat se blokkearre binne.",
+ "report.categories.other": "Other",
+ "report.categories.spam": "Spam",
+ "report.categories.violation": "Ynhâld ferbrekt ien of mear tsjinner regels",
+ "report.category.subtitle": "Selektearje wat it bêst past",
+ "report.category.title": "Fertel ús wat der mei dit {type} oan de hân is",
+ "report.category.title_account": "profyl",
+ "report.category.title_status": "berjocht",
+ "report.close": "Klear",
+ "report.comment.title": "Tinke jo dat wy noch mear witte moatte?",
+ "report.forward": "Troch stjoere nei {target}",
+ "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+ "report.mute": "Negearre",
+ "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.next": "Fierder",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "Ik fyn der neat oan",
+ "report.reasons.dislike_description": "It is net eat wat jo sjen wolle",
+ "report.reasons.other": "It is wat oars",
+ "report.reasons.other_description": "It probleem stiet der net tusken",
+ "report.reasons.spam": "It's spam",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+ "report.reasons.violation": "It violates server rules",
+ "report.reasons.violation_description": "You are aware that it breaks specific rules",
+ "report.rules.subtitle": "Select all that apply",
+ "report.rules.title": "Which rules are being violated?",
+ "report.statuses.subtitle": "Select all that apply",
+ "report.statuses.title": "Are there any posts that back up this report?",
+ "report.submit": "Submit report",
+ "report.target": "Report {target}",
+ "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+ "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.unfollow": "Unfollow @{name}",
+ "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "search.placeholder": "Search",
+ "search_popout.search_format": "Advanced search format",
+ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+ "search_popout.tips.hashtag": "hashtag",
+ "search_popout.tips.status": "status",
+ "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+ "search_popout.tips.user": "user",
+ "search_results.accounts": "People",
+ "search_results.all": "All",
+ "search_results.hashtags": "Hashtags",
+ "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.statuses": "Posts",
+ "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
+ "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+ "status.admin_account": "Open moderation interface for @{name}",
+ "status.admin_status": "Open this status in the moderation interface",
+ "status.block": "Block @{name}",
+ "status.bookmark": "Bookmark",
+ "status.cancel_reblog_private": "Unboost",
+ "status.cannot_reblog": "This post cannot be boosted",
+ "status.copy": "Copy link to status",
+ "status.delete": "Delete",
+ "status.detailed_status": "Detaillearre oersjoch fan petear",
+ "status.direct": "Direct message @{name}",
+ "status.edit": "Edit",
+ "status.edited": "Edited {date}",
+ "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke",
+ "status.embed": "Ynslute",
+ "status.favourite": "Favorite",
+ "status.filtered": "Filtere",
+ "status.history.created": "{name} makke dit {date}",
+ "status.history.edited": "{name} feroare dit {date}",
+ "status.load_more": "Load more",
+ "status.media_hidden": "Media ferstoppe",
+ "status.mention": "Fermeld @{name}",
+ "status.more": "Mear",
+ "status.mute": "Negearje @{name}",
+ "status.mute_conversation": "Petear negearre",
+ "status.open": "Dit berjocht útflappe",
+ "status.pin": "Op profyl fêstsette",
+ "status.pinned": "Fêstset berjocht",
+ "status.read_more": "Lês mear",
+ "status.reblog": "Boost",
+ "status.reblog_private": "Boost with original visibility",
+ "status.reblogged_by": "{name} hat boost",
+ "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
+ "status.redraft": "Fuortsmite en opnij opstelle",
+ "status.remove_bookmark": "Remove bookmark",
+ "status.reply": "Reagearre",
+ "status.replyAll": "Op elkenien reagearre",
+ "status.report": "Jou @{name} oan",
+ "status.sensitive_warning": "Sensitive content",
+ "status.share": "Diele",
+ "status.show_less": "Minder sjen litte",
+ "status.show_less_all": "Foar alles minder sjen litte",
+ "status.show_more": "Mear sjen litte",
+ "status.show_more_all": "Foar alles mear sjen litte",
+ "status.show_thread": "Petear sjen litte",
+ "status.uncached_media_warning": "Net beskikber",
+ "status.unmute_conversation": "Petear net mear negearre",
+ "status.unpin": "Unpin from profile",
+ "suggestions.dismiss": "Dismiss suggestion",
+ "suggestions.header": "You might be interested in…",
+ "tabs_bar.federated_timeline": "Federated",
+ "tabs_bar.home": "Home",
+ "tabs_bar.local_timeline": "Local",
+ "tabs_bar.notifications": "Notifikaasjes",
+ "tabs_bar.search": "Sykje",
+ "time_remaining.days": "{number, plural, one {# dei} other {# dagen}} te gean",
+ "time_remaining.hours": "{number, plural, one {# oere} other {# oeren}} te gean",
+ "time_remaining.minutes": "{number, plural, one {# minút} other {# minuten}} te gean",
+ "time_remaining.moments": "Noch krekt even te gean",
+ "time_remaining.seconds": "{number, plural, one {# sekonde} other {# sekonden}} te gean",
+ "timeline_hint.remote_resource_not_displayed": "{resource} fan oare tsjinners wurde net sjen litten.",
+ "timeline_hint.resources.followers": "Folgers",
+ "timeline_hint.resources.follows": "Follows",
+ "timeline_hint.resources.statuses": "Aldere berjochten",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} persoan is} other {{counter} persoanen binne}} yn petear",
+ "trends.trending_now": "Trending now",
+ "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+ "units.short.billion": "{count}B",
+ "units.short.million": "{count}M",
+ "units.short.thousand": "{count}K",
+ "upload_area.title": "Drag & drop to upload",
+ "upload_button.label": "Add images, a video or an audio file",
+ "upload_error.limit": "File upload limit exceeded.",
+ "upload_error.poll": "File upload not allowed with polls.",
+ "upload_form.audio_description": "Describe for people with hearing loss",
+ "upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
+ "upload_form.edit": "Edit",
+ "upload_form.thumbnail": "Change thumbnail",
+ "upload_form.undo": "Delete",
+ "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+ "upload_modal.analyzing_picture": "Analyzing picture…",
+ "upload_modal.apply": "Apply",
+ "upload_modal.applying": "Applying…",
+ "upload_modal.choose_image": "Choose image",
+ "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+ "upload_modal.detect_text": "Detect text from picture",
+ "upload_modal.edit_media": "Edit media",
+ "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+ "upload_modal.preparing_ocr": "Preparing OCR…",
+ "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_progress.label": "Uploading…",
+ "video.close": "Close video",
+ "video.download": "Download file",
+ "video.exit_fullscreen": "Exit full screen",
+ "video.expand": "Expand video",
+ "video.fullscreen": "Full screen",
+ "video.hide": "Hide video",
+ "video.mute": "Mute sound",
+ "video.pause": "Pause",
+ "video.play": "Play",
+ "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 5bf1681a8..2d2551845 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -1,54 +1,54 @@
{
- "account.account_note_header": "Your note for @{name}",
- "account.add_or_remove_from_list": "Add or Remove from lists",
- "account.badges.bot": "Bot",
- "account.badges.group": "Group",
- "account.block": "Block @{name}",
- "account.block_domain": "Hide everything from {domain}",
- "account.blocked": "Blocked",
- "account.browse_more_on_origin_server": "Browse more on the original profile",
- "account.cancel_follow_request": "Cancel follow request",
- "account.direct": "Direct message @{name}",
- "account.disable_notifications": "Stop notifying me when @{name} posts",
- "account.domain_blocked": "Domain hidden",
- "account.edit_profile": "Edit profile",
- "account.enable_notifications": "Notify me when @{name} posts",
- "account.endorse": "Feature on profile",
- "account.follow": "Follow",
- "account.followers": "Followers",
- "account.followers.empty": "No one follows this user yet.",
- "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
- "account.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.follows.empty": "This user doesn't follow anyone yet.",
- "account.follows_you": "Follows you",
- "account.hide_reblogs": "Hide boosts from @{name}",
- "account.joined": "Joined {date}",
+ "account.account_note_header": "Nóta",
+ "account.add_or_remove_from_list": "Cuir Le nó Bain De na liostaí",
+ "account.badges.bot": "Bota",
+ "account.badges.group": "Grúpa",
+ "account.block": "Bac @{name}",
+ "account.block_domain": "Bac ainm fearainn {domain}",
+ "account.blocked": "Bactha",
+ "account.browse_more_on_origin_server": "Brabhsáil níos mó ar an phróifíl bhunaidh",
+ "account.cancel_follow_request": "Cealaigh iarratas leanúnaí",
+ "account.direct": "Seol teachtaireacht dhíreach chuig @{name}",
+ "account.disable_notifications": "Éirigh as ag cuir mé in eol nuair bpostálann @{name}",
+ "account.domain_blocked": "Ainm fearainn bactha",
+ "account.edit_profile": "Cuir an phróifíl in eagar",
+ "account.enable_notifications": "Cuir mé in eol nuair bpostálann @{name}",
+ "account.endorse": "Cuir ar an phróifíl mar ghné",
+ "account.follow": "Lean",
+ "account.followers": "Leantóirí",
+ "account.followers.empty": "Ní leanann éinne an t-úsáideoir seo fós.",
+ "account.followers_counter": "{count, plural, one {Leantóir amháin} other {{counter} Leantóir}}",
+ "account.following": "Ag leanúint",
+ "account.following_counter": "{count, plural, one {Ag leanúint cúntas amháin} other {Ag leanúint {counter} cúntas}}",
+ "account.follows.empty": "Ní leanann an t-úsáideoir seo duine ar bith fós.",
+ "account.follows_you": "Do do leanúint",
+ "account.hide_reblogs": "Folaigh athphostálacha ó @{name}",
+ "account.joined": "Ina bhall ó {date}",
"account.link_verified_on": "Ownership of this link was checked on {date}",
- "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
- "account.media": "Media",
- "account.mention": "Mention @{name}",
- "account.moved_to": "{name} has moved to:",
- "account.mute": "Mute @{name}",
- "account.mute_notifications": "Mute notifications from @{name}",
- "account.muted": "Muted",
- "account.posts": "Toots",
- "account.posts_with_replies": "Toots and replies",
- "account.report": "Report @{name}",
- "account.requested": "Awaiting approval",
- "account.share": "Share @{name}'s profile",
- "account.show_reblogs": "Show boosts from @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
- "account.unblock": "Unblock @{name}",
- "account.unblock_domain": "Unhide {domain}",
- "account.unblock_short": "Unblock",
- "account.unendorse": "Don't feature on profile",
- "account.unfollow": "Unfollow",
- "account.unmute": "Unmute @{name}",
- "account.unmute_notifications": "Unmute notifications from @{name}",
- "account.unmute_short": "Unmute",
- "account_note.placeholder": "No comment provided",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "account.locked_info": "Tá an socrú príobháideachais don cuntas seo curtha go 'faoi ghlas'. Déanann an t-úinéir léirmheas ar cén daoine atá ceadaithe an cuntas leanúint.",
+ "account.media": "Ábhair",
+ "account.mention": "Luaigh @{name}",
+ "account.moved_to": "Tá {name} bogtha go:",
+ "account.mute": "Balbhaigh @{name}",
+ "account.mute_notifications": "Balbhaigh fógraí ó @{name}",
+ "account.muted": "Balbhaithe",
+ "account.posts": "Postálacha",
+ "account.posts_with_replies": "Postálacha agus freagraí",
+ "account.report": "Tuairiscigh @{name}",
+ "account.requested": "Ag fanacht le ceadú. Cliceáil chun an iarratas leanúnaí a chealú",
+ "account.share": "Roinn próifíl @{name}",
+ "account.show_reblogs": "Taispeáin athphostálacha ó @{name}",
+ "account.statuses_counter": "{count, plural, one {Postáil amháin} other {{counter} Postáil}}",
+ "account.unblock": "Bain bac de @{name}",
+ "account.unblock_domain": "Bain bac den ainm fearainn {domain}",
+ "account.unblock_short": "Bain bac de",
+ "account.unendorse": "Ná chuir ar an phróifíl mar ghné",
+ "account.unfollow": "Ná lean a thuilleadh",
+ "account.unmute": "Díbhalbhaigh @{name}",
+ "account.unmute_notifications": "Díbhalbhaigh fógraí ó @{name}",
+ "account.unmute_short": "Díbhalbhaigh",
+ "account_note.placeholder": "Cliceáil chun nóta a chuir leis",
+ "admin.dashboard.daily_retention": "Ráta coinneála an úsáideora de réir an lae tar éis clárú",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
"admin.dashboard.retention.average": "Average",
"admin.dashboard.retention.cohort": "Sign-up month",
@@ -56,55 +56,57 @@
"alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
"alert.rate_limited.title": "Rate limited",
"alert.unexpected.message": "An unexpected error occurred.",
- "alert.unexpected.title": "Oops!",
- "announcement.announcement": "Announcement",
+ "alert.unexpected.title": "Hiúps!",
+ "announcement.announcement": "Fógra",
"attachments_list.unprocessed": "(unprocessed)",
"autosuggest_hashtag.per_week": "{count} per week",
- "boost_modal.combo": "You can press {combo} to skip this next time",
+ "boost_modal.combo": "Is féidir leat brúigh {combo} chun é seo a scipeáil an chéad uair eile",
"bundle_column_error.body": "Something went wrong while loading this component.",
- "bundle_column_error.retry": "Try again",
+ "bundle_column_error.retry": "Bain triail as arís",
"bundle_column_error.title": "Network error",
- "bundle_modal_error.close": "Close",
+ "bundle_modal_error.close": "Dún",
"bundle_modal_error.message": "Something went wrong while loading this component.",
- "bundle_modal_error.retry": "Try again",
- "column.blocks": "Blocked users",
- "column.bookmarks": "Bookmarks",
+ "bundle_modal_error.retry": "Bain triail as arís",
+ "column.blocks": "Cuntais choiscthe",
+ "column.bookmarks": "Leabharmharcanna",
"column.community": "Local timeline",
"column.direct": "Direct messages",
- "column.directory": "Browse profiles",
- "column.domain_blocks": "Hidden domains",
- "column.favourites": "Favourites",
+ "column.directory": "Brabhsáil próifílí",
+ "column.domain_blocks": "Blocked domains",
+ "column.favourites": "Roghanna",
"column.follow_requests": "Follow requests",
- "column.home": "Home",
- "column.lists": "Lists",
- "column.mutes": "Muted users",
+ "column.home": "Baile",
+ "column.lists": "Liostaí",
+ "column.mutes": "Úsáideoirí balbhaithe",
"column.notifications": "Notifications",
- "column.pins": "Pinned toot",
+ "column.pins": "Pinned post",
"column.public": "Federated timeline",
- "column_back_button.label": "Back",
+ "column_back_button.label": "Siar",
"column_header.hide_settings": "Hide settings",
"column_header.moveLeft_settings": "Move column to the left",
"column_header.moveRight_settings": "Move column to the right",
- "column_header.pin": "Pin",
+ "column_header.pin": "Greamaigh",
"column_header.show_settings": "Show settings",
- "column_header.unpin": "Unpin",
- "column_subheading.settings": "Settings",
+ "column_header.unpin": "Díghreamaigh",
+ "column_subheading.settings": "Socruithe",
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
- "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+ "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
- "compose_form.placeholder": "What is on your mind?",
+ "compose_form.placeholder": "Cad atá ag tarlú?",
"compose_form.poll.add_option": "Add a choice",
"compose_form.poll.duration": "Poll duration",
"compose_form.poll.option_placeholder": "Choice {number}",
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -118,23 +120,23 @@
"confirmations.block.confirm": "Block",
"confirmations.block.message": "Are you sure you want to block {name}?",
"confirmations.delete.confirm": "Delete",
- "confirmations.delete.message": "Are you sure you want to delete this status?",
+ "confirmations.delete.message": "An bhfuil tú cinnte gur mhaith leat an phostáil seo a scriosadh?",
"confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "Faigh réidh de",
+ "confirmations.discard_edit_media.message": "Tá athruithe neamhshlánaithe don tuarascáil gné nó réamhamharc agat, faigh réidh dóibh ar aon nós?",
"confirmations.domain_block.confirm": "Hide entire domain",
- "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
- "confirmations.logout.confirm": "Log out",
+ "confirmations.domain_block.message": "An bhfuil tú iontach cinnte gur mhaith leat bac an t-ainm fearainn {domain} in iomlán? I bhformhór na gcásanna, is leor agus is fearr cúpla baic a cur i bhfeidhm nó cúpla úsáideoirí a balbhú. Ní fheicfidh tú ábhair ón t-ainm fearainn sin in amlíne ar bith, nó i d'fhógraí. Scaoilfear do leantóirí ón ainm fearainn sin.",
+ "confirmations.logout.confirm": "Logáil amach",
"confirmations.logout.message": "Are you sure you want to log out?",
- "confirmations.mute.confirm": "Mute",
+ "confirmations.mute.confirm": "Balbhaigh",
"confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
- "confirmations.mute.message": "Are you sure you want to mute {name}?",
+ "confirmations.mute.message": "An bhfuil tú cinnte gur mhaith leat {name} a bhalbhú?",
"confirmations.redraft.confirm": "Delete & redraft",
- "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+ "confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an phostáil sin a scriosadh agus athdhréachtú? Beidh roghanna agus treisithe caillte, agus beidh freagraí ar an bpostáil bhunúsach ina ndílleachtaí.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
- "confirmations.unfollow.confirm": "Unfollow",
+ "confirmations.unfollow.confirm": "Ná lean",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.delete": "Delete conversation",
"conversation.mark_as_read": "Mark as read",
@@ -146,40 +148,41 @@
"directory.recently_active": "Recently active",
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
- "emoji_button.activity": "Activity",
+ "emoji_button.activity": "Gníomhaíocht",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
- "emoji_button.food": "Food & Drink",
+ "emoji_button.food": "Bia ⁊ Ól",
"emoji_button.label": "Insert emoji",
- "emoji_button.nature": "Nature",
- "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.nature": "Nádur",
+ "emoji_button.not_found": "No matching emojis found",
"emoji_button.objects": "Objects",
- "emoji_button.people": "People",
+ "emoji_button.people": "Daoine",
"emoji_button.recent": "Frequently used",
- "emoji_button.search": "Search...",
+ "emoji_button.search": "Cuardaigh...",
"emoji_button.search_results": "Search results",
"emoji_button.symbols": "Symbols",
- "emoji_button.travel": "Travel & Places",
+ "emoji_button.travel": "Taisteal ⁊ Áiteanna",
"empty_column.account_suspended": "Account suspended",
- "empty_column.account_timeline": "No toots here!",
- "empty_column.account_unavailable": "Profile unavailable",
+ "empty_column.account_timeline": "Níl postálacha ar bith anseo!",
+ "empty_column.account_unavailable": "Níl an phróifíl ar fáil",
"empty_column.blocks": "You haven't blocked any users yet.",
- "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
+ "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
"empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
"empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
- "empty_column.domain_blocks": "There are no hidden domains yet.",
+ "empty_column.domain_blocks": "There are no blocked domains yet.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
- "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+ "empty_column.favourited_statuses": "Níor roghnaigh tú postáil ar bith fós. Nuair a roghnaigh tú ceann, beidh sí le feiceáil anseo.",
+ "empty_column.favourites": "Níor roghnaigh éinne an phostáil seo fós. Nuair a roghnaigh duine éigin, beidh siad le feiceáil anseo.",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
"empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
"empty_column.hashtag": "There is nothing in this hashtag yet.",
- "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+ "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
"empty_column.home.suggestions": "See some suggestions",
"empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
"empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
- "empty_column.mutes": "You haven't muted any users yet.",
- "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+ "empty_column.mutes": "Níl aon úsáideoir balbhaithe agat fós.",
+ "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.",
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
"error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
"error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
@@ -189,19 +192,19 @@
"errors.unexpected_crash.report_issue": "Report issue",
"explore.search_results": "Search results",
"explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
- "follow_recommendations.done": "Done",
+ "explore.title": "Féach thart",
+ "explore.trending_links": "Nuacht",
+ "explore.trending_statuses": "Postálacha",
+ "explore.trending_tags": "Haischlibeanna",
+ "follow_recommendations.done": "Déanta",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
- "follow_request.authorize": "Authorize",
- "follow_request.reject": "Reject",
+ "follow_request.authorize": "Ceadaigh",
+ "follow_request.reject": "Diúltaigh",
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
"generic.saved": "Saved",
"getting_started.developers": "Developers",
- "getting_started.directory": "Profile directory",
+ "getting_started.directory": "Eolaire na próifíle",
"getting_started.documentation": "Documentation",
"getting_started.heading": "Getting started",
"getting_started.invite": "Invite people",
@@ -218,7 +221,7 @@
"hashtag.column_settings.tag_mode.none": "None of these",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"home.column_settings.basic": "Basic",
- "home.column_settings.show_reblogs": "Show boosts",
+ "home.column_settings.show_reblogs": "Taispeáin treisithe",
"home.column_settings.show_replies": "Show replies",
"home.hide_announcements": "Hide announcements",
"home.show_announcements": "Show announcements",
@@ -227,15 +230,15 @@
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
"keyboard_shortcuts.back": "to navigate back",
"keyboard_shortcuts.blocked": "to open blocked users list",
- "keyboard_shortcuts.boost": "to boost",
+ "keyboard_shortcuts.boost": "Treisigh postáil",
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "to focus the compose textarea",
"keyboard_shortcuts.description": "Description",
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "to move down in the list",
- "keyboard_shortcuts.enter": "to open status",
- "keyboard_shortcuts.favourite": "to favourite",
- "keyboard_shortcuts.favourites": "to open favourites list",
+ "keyboard_shortcuts.enter": "Oscail postáil",
+ "keyboard_shortcuts.favourite": "Roghnaigh postáil",
+ "keyboard_shortcuts.favourites": "Oscail liosta roghanna",
"keyboard_shortcuts.federated": "to open federated timeline",
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
"keyboard_shortcuts.home": "to open home timeline",
@@ -243,20 +246,20 @@
"keyboard_shortcuts.legend": "to display this legend",
"keyboard_shortcuts.local": "to open local timeline",
"keyboard_shortcuts.mention": "to mention author",
- "keyboard_shortcuts.muted": "to open muted users list",
- "keyboard_shortcuts.my_profile": "to open your profile",
+ "keyboard_shortcuts.muted": "Oscail liosta na n-úsáideoirí balbhaithe",
+ "keyboard_shortcuts.my_profile": "Oscail do phróifíl",
"keyboard_shortcuts.notifications": "to open notifications column",
"keyboard_shortcuts.open_media": "to open media",
- "keyboard_shortcuts.pinned": "to open pinned toots list",
- "keyboard_shortcuts.profile": "to open author's profile",
- "keyboard_shortcuts.reply": "to reply",
+ "keyboard_shortcuts.pinned": "to open pinned posts list",
+ "keyboard_shortcuts.profile": "Oscail próifíl an t-údar",
+ "keyboard_shortcuts.reply": "Freagair ar phostáil",
"keyboard_shortcuts.requests": "to open follow requests list",
"keyboard_shortcuts.search": "to focus search",
"keyboard_shortcuts.spoilers": "to show/hide CW field",
"keyboard_shortcuts.start": "to open \"get started\" column",
"keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
"keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
- "keyboard_shortcuts.toot": "to start a brand new toot",
+ "keyboard_shortcuts.toot": "Cuir tús le postáil nua",
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
"keyboard_shortcuts.up": "to move up in the list",
"lightbox.close": "Close",
@@ -264,11 +267,13 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Taispeáin an phróifíl ar aon nós",
+ "limited_account_hint.title": "Tá an phróifíl seo curtha i bhfolach ag na modhnóra do fhreastalaí.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
- "lists.edit": "Edit list",
- "lists.edit.submit": "Change title",
+ "lists.edit": "Cuir an liosta in eagar",
+ "lists.edit.submit": "Athraigh teideal",
"lists.new.create": "Add list",
"lists.new.title_placeholder": "New list title",
"lists.replies_policy.followed": "Any followed user",
@@ -279,69 +284,69 @@
"lists.subheading": "Your lists",
"load_pending": "{count, plural, one {# new item} other {# new items}}",
"loading_indicator.label": "Loading...",
- "media_gallery.toggle_visible": "Hide media",
+ "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
"missing_indicator.label": "Not found",
"missing_indicator.sublabel": "This resource could not be found",
- "mute_modal.duration": "Duration",
- "mute_modal.hide_notifications": "Hide notifications from this user?",
- "mute_modal.indefinite": "Indefinite",
+ "mute_modal.duration": "Tréimhse",
+ "mute_modal.hide_notifications": "Cuir póstalacha ón t-úsáideoir seo i bhfolach?",
+ "mute_modal.indefinite": "Gan téarma",
"navigation_bar.apps": "Mobile apps",
"navigation_bar.blocks": "Blocked users",
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "Local timeline",
- "navigation_bar.compose": "Compose new toot",
+ "navigation_bar.compose": "Cum postáil nua",
"navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "Edit profile",
+ "navigation_bar.edit_profile": "Cuir an phróifíl in eagar",
"navigation_bar.explore": "Explore",
- "navigation_bar.favourites": "Favourites",
- "navigation_bar.filters": "Muted words",
+ "navigation_bar.favourites": "Roghanna",
+ "navigation_bar.filters": "Focail bhalbhaithe",
"navigation_bar.follow_requests": "Follow requests",
- "navigation_bar.follows_and_followers": "Follows and followers",
+ "navigation_bar.follows_and_followers": "Ag leanúint agus do do leanúint",
"navigation_bar.info": "About this server",
- "navigation_bar.keyboard_shortcuts": "Hotkeys",
- "navigation_bar.lists": "Lists",
- "navigation_bar.logout": "Logout",
- "navigation_bar.mutes": "Muted users",
- "navigation_bar.personal": "Personal",
- "navigation_bar.pins": "Pinned toots",
+ "navigation_bar.keyboard_shortcuts": "Eochracha Aicearra",
+ "navigation_bar.lists": "Liostaí",
+ "navigation_bar.logout": "Logáil Amach",
+ "navigation_bar.mutes": "Úsáideoirí balbhaithe",
+ "navigation_bar.personal": "Pearsanta",
+ "navigation_bar.pins": "Pinned posts",
"navigation_bar.preferences": "Preferences",
"navigation_bar.public_timeline": "Federated timeline",
"navigation_bar.security": "Security",
"notification.admin.sign_up": "{name} signed up",
- "notification.favourite": "{name} favourited your status",
- "notification.follow": "{name} followed you",
- "notification.follow_request": "{name} has requested to follow you",
+ "notification.favourite": "Roghnaigh {name} do phostáil",
+ "notification.follow": "Lean {name} thú",
+ "notification.follow_request": "D'iarr {name} ort do chuntas a leanúint",
"notification.mention": "{name} mentioned you",
"notification.own_poll": "Your poll has ended",
"notification.poll": "A poll you have voted in has ended",
- "notification.reblog": "{name} boosted your status",
- "notification.status": "{name} just posted",
- "notification.update": "{name} edited a post",
+ "notification.reblog": "Threisigh {name} do phostáil",
+ "notification.status": "Phostáil {name} díreach",
+ "notification.update": "Chuir {name} postáil in eagar",
"notifications.clear": "Clear notifications",
"notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
"notifications.column_settings.admin.sign_up": "New sign-ups:",
"notifications.column_settings.alert": "Desktop notifications",
- "notifications.column_settings.favourite": "Favourites:",
+ "notifications.column_settings.favourite": "Roghanna:",
"notifications.column_settings.filter_bar.advanced": "Display all categories",
"notifications.column_settings.filter_bar.category": "Quick filter bar",
"notifications.column_settings.filter_bar.show_bar": "Show filter bar",
- "notifications.column_settings.follow": "New followers:",
- "notifications.column_settings.follow_request": "New follow requests:",
+ "notifications.column_settings.follow": "Leantóirí nua:",
+ "notifications.column_settings.follow_request": "Iarratais leanúnaí nua:",
"notifications.column_settings.mention": "Mentions:",
"notifications.column_settings.poll": "Poll results:",
"notifications.column_settings.push": "Push notifications",
- "notifications.column_settings.reblog": "Boosts:",
+ "notifications.column_settings.reblog": "Treisithe:",
"notifications.column_settings.show": "Show in column",
"notifications.column_settings.sound": "Play sound",
- "notifications.column_settings.status": "New toots:",
+ "notifications.column_settings.status": "Postálacha nua:",
"notifications.column_settings.unread_notifications.category": "Unread notifications",
"notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Eagair:",
"notifications.filter.all": "All",
- "notifications.filter.boosts": "Boosts",
- "notifications.filter.favourites": "Favourites",
+ "notifications.filter.boosts": "Treisithe",
+ "notifications.filter.favourites": "Roghanna",
"notifications.filter.follows": "Follows",
"notifications.filter.mentions": "Mentions",
"notifications.filter.polls": "Poll results",
@@ -366,16 +371,16 @@
"poll_button.add_poll": "Add a poll",
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Adjust status privacy",
- "privacy.direct.long": "Post to mentioned users only",
+ "privacy.direct.long": "Visible for mentioned users only",
"privacy.direct.short": "Direct",
- "privacy.private.long": "Post to followers only",
+ "privacy.private.long": "Sofheicthe do Leantóirí amháin",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Post to public timelines",
- "privacy.public.short": "Public",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.public.long": "Visible for all",
+ "privacy.public.short": "Poiblí",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
- "regeneration_indicator.label": "Loading…",
+ "regeneration_indicator.label": "Ag lódáil…",
"regeneration_indicator.sublabel": "Your home feed is being prepared!",
"relative_time.days": "{number}d",
"relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
@@ -387,38 +392,38 @@
"relative_time.just_now": "now",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
- "relative_time.today": "today",
+ "relative_time.today": "inniu",
"reply_indicator.cancel": "Cancel",
"report.block": "Block",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Other",
- "report.categories.spam": "Spam",
+ "report.categories.spam": "Turscar",
"report.categories.violation": "Content violates one or more server rules",
"report.category.subtitle": "Choose the best match",
"report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
+ "report.category.title_account": "próifíl",
+ "report.category.title_status": "postáil",
+ "report.close": "Déanta",
"report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Forward to {target}",
"report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.mute": "Balbhaigh",
+ "report.mute_explanation": "Ní fheicfidh tú a postálacha. Is féidir an té seo tú a leanúint agus do phostálacha a fheiceáil, agus ní fhios go bhfuil iad balbhaithe.",
"report.next": "Next",
- "report.placeholder": "Additional comments",
- "report.reasons.dislike": "I don't like it",
+ "report.placeholder": "Type or paste additional comments",
+ "report.reasons.dislike": "Ní maith liom é",
"report.reasons.dislike_description": "It is not something you want to see",
"report.reasons.other": "It's something else",
"report.reasons.other_description": "The issue does not fit into other categories",
"report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetetive replies",
+ "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
"report.reasons.violation": "It violates server rules",
"report.reasons.violation_description": "You are aware that it breaks specific rules",
"report.rules.subtitle": "Select all that apply",
"report.rules.title": "Which rules are being violated?",
"report.statuses.subtitle": "Select all that apply",
"report.statuses.title": "Are there any posts that back up this report?",
- "report.submit": "Submit",
+ "report.submit": "Submit report",
"report.target": "Report {target}",
"report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
@@ -426,52 +431,52 @@
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
"report.unfollow": "Unfollow @{name}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
- "search.placeholder": "Search",
+ "search.placeholder": "Cuardaigh",
"search_popout.search_format": "Advanced search format",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
- "search_popout.tips.hashtag": "hashtag",
- "search_popout.tips.status": "status",
+ "search_popout.tips.hashtag": "haischlib",
+ "search_popout.tips.status": "postáil",
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
"search_popout.tips.user": "user",
- "search_results.accounts": "People",
+ "search_results.accounts": "Daoine",
"search_results.all": "All",
- "search_results.hashtags": "Hashtags",
+ "search_results.hashtags": "Haischlibeanna",
"search_results.nothing_found": "Could not find anything for these search terms",
- "search_results.statuses": "Toots",
- "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+ "search_results.statuses": "Postálacha",
+ "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"status.admin_account": "Open moderation interface for @{name}",
"status.admin_status": "Open this status in the moderation interface",
"status.block": "Block @{name}",
"status.bookmark": "Bookmark",
- "status.cancel_reblog_private": "Unboost",
- "status.cannot_reblog": "This post cannot be boosted",
+ "status.cancel_reblog_private": "Díthreisigh",
+ "status.cannot_reblog": "Ní féidir an phostáil seo a threisiú",
"status.copy": "Copy link to status",
- "status.delete": "Delete",
+ "status.delete": "Scrios",
"status.detailed_status": "Detailed conversation view",
"status.direct": "Direct message @{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edit": "Cuir in eagar",
+ "status.edited": "Curtha in eagar in {date}",
+ "status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}",
"status.embed": "Embed",
- "status.favourite": "Favourite",
+ "status.favourite": "Rogha",
"status.filtered": "Filtered",
"status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.edited": "Curtha in eagar ag {name} in {date}",
"status.load_more": "Load more",
"status.media_hidden": "Media hidden",
"status.mention": "Mention @{name}",
- "status.more": "More",
- "status.mute": "Mute @{name}",
- "status.mute_conversation": "Mute conversation",
+ "status.more": "Tuilleadh",
+ "status.mute": "Balbhaigh @{name}",
+ "status.mute_conversation": "Balbhaigh comhrá",
"status.open": "Expand this status",
- "status.pin": "Pin on profile",
- "status.pinned": "Pinned toot",
+ "status.pin": "Pionnáil ar do phróifíl",
+ "status.pinned": "Pinned post",
"status.read_more": "Read more",
- "status.reblog": "Boost",
- "status.reblog_private": "Boost with original visibility",
- "status.reblogged_by": "{name} boosted",
- "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+ "status.reblog": "Treisigh",
+ "status.reblog_private": "Treisigh le léargas bunúsach",
+ "status.reblogged_by": "Treisithe ag {name}",
+ "status.reblogs.empty": "Níor threisigh éinne an phostáil seo fós. Nuair a threisigh duine éigin, beidh siad le feiceáil anseo.",
"status.redraft": "Delete & re-draft",
"status.remove_bookmark": "Remove bookmark",
"status.reply": "Reply",
@@ -485,24 +490,24 @@
"status.show_more_all": "Show more for all",
"status.show_thread": "Show thread",
"status.uncached_media_warning": "Not available",
- "status.unmute_conversation": "Unmute conversation",
- "status.unpin": "Unpin from profile",
+ "status.unmute_conversation": "Díbhalbhaigh comhrá",
+ "status.unpin": "Díphionnáil de do phróifíl",
"suggestions.dismiss": "Dismiss suggestion",
"suggestions.header": "You might be interested in…",
"tabs_bar.federated_timeline": "Federated",
- "tabs_bar.home": "Home",
+ "tabs_bar.home": "Baile",
"tabs_bar.local_timeline": "Local",
"tabs_bar.notifications": "Notifications",
- "tabs_bar.search": "Search",
+ "tabs_bar.search": "Cuardaigh",
"time_remaining.days": "{number, plural, one {# day} other {# days}} left",
"time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
"time_remaining.moments": "Moments remaining",
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
"timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
- "timeline_hint.resources.followers": "Followers",
+ "timeline_hint.resources.followers": "Leantóirí",
"timeline_hint.resources.follows": "Follows",
- "timeline_hint.resources.statuses": "Older toots",
+ "timeline_hint.resources.statuses": "Older posts",
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
"trends.trending_now": "Trending now",
"ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
@@ -510,12 +515,13 @@
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
"upload_area.title": "Drag & drop to upload",
- "upload_button.label": "Add media ({formats})",
+ "upload_button.label": "Add images, a video or an audio file",
"upload_error.limit": "File upload limit exceeded.",
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
- "upload_form.edit": "Edit",
+ "upload_form.description_missing": "No description added",
+ "upload_form.edit": "Cuir in eagar",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
@@ -525,19 +531,19 @@
"upload_modal.choose_image": "Choose image",
"upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
"upload_modal.detect_text": "Detect text from picture",
- "upload_modal.edit_media": "Edit media",
+ "upload_modal.edit_media": "Cuir gné in eagar",
"upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
"upload_modal.preparing_ocr": "Preparing OCR…",
"upload_modal.preview_label": "Preview ({ratio})",
- "upload_progress.label": "Uploading...",
+ "upload_progress.label": "Uploading…",
"video.close": "Close video",
"video.download": "Download file",
"video.exit_fullscreen": "Exit full screen",
"video.expand": "Expand video",
"video.fullscreen": "Full screen",
"video.hide": "Hide video",
- "video.mute": "Mute sound",
- "video.pause": "Pause",
- "video.play": "Play",
- "video.unmute": "Unmute sound"
+ "video.mute": "Ciúnaigh fuaim",
+ "video.pause": "Cuir ar sos",
+ "video.play": "Cuir ar siúl",
+ "video.unmute": "Díchiúnaigh fuaim"
}
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index aae73a23e..bdfc02af7 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -18,7 +18,7 @@
"account.followers": "Luchd-leantainn",
"account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.",
"account.followers_counter": "{count, plural, one {{counter} neach-leantainn} two {{counter} neach-leantainn} few {{counter} luchd-leantainn} other {{counter} luchd-leantainn}}",
- "account.following": "Following",
+ "account.following": "A’ leantainn",
"account.following_counter": "{count, plural, one {A’ leantainn air {counter}} two {A’ leantainn air {counter}} few {A’ leantainn air {counter}} other {A’ leantainn air {counter}}}",
"account.follows.empty": "Chan eil an cleachdaiche seo a’ leantainn air neach sam bith fhathast.",
"account.follows_you": "’Gad leantainn",
@@ -41,16 +41,16 @@
"account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
"account.unblock": "Dì-bhac @{name}",
"account.unblock_domain": "Dì-bhac an àrainn {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Dì-bhac",
"account.unendorse": "Na brosnaich air a’ phròifil",
"account.unfollow": "Na lean tuilleadh",
"account.unmute": "Dì-mhùch @{name}",
"account.unmute_notifications": "Dì-mhùch na brathan o @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Dì-mhùch",
"account_note.placeholder": "Briog airson nòta a chur ris",
"admin.dashboard.daily_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir latha",
"admin.dashboard.monthly_retention": "Reat glèidheadh nan cleachdaichean às dèidh an clàradh a-rèir mìos",
- "admin.dashboard.retention.average": "Cuibheasach",
+ "admin.dashboard.retention.average": "Średnia",
"admin.dashboard.retention.cohort": "Mìos a’ chlàraidh",
"admin.dashboard.retention.cohort_size": "Cleachdaichean ùra",
"alert.rate_limited.message": "Feuch ris a-rithist às dèidh {retry_time, time, medium}.",
@@ -59,7 +59,7 @@
"alert.unexpected.title": "Oich!",
"announcement.announcement": "Brath-fios",
"attachments_list.unprocessed": "(gun phròiseasadh)",
- "autosuggest_hashtag.per_week": "{count} gach seachdain",
+ "autosuggest_hashtag.per_week": "{count} san t-seachdain",
"boost_modal.combo": "Brùth air {combo} nam b’ fheàrr leat leum a ghearradh thar seo an ath-thuras",
"bundle_column_error.body": "Chaidh rudeigin cearr nuair a dh’fheuch sinn ris a’ cho-phàirt seo a luchdadh.",
"bundle_column_error.retry": "Feuch ris a-rithist",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Feadhainn ionadail a-mhàin",
"community.column_settings.media_only": "Meadhanan a-mhàin",
"community.column_settings.remote_only": "Feadhainn chèin a-mhàin",
- "compose_form.direct_message_warning": "Cha dèid am post seo a chur ach dha na cleachdaichean air an dug thu iomradh.",
+ "compose.language.change": "Atharraich an cànan",
+ "compose.language.search": "Lorg cànan…",
"compose_form.direct_message_warning_learn_more": "Barrachd fiosrachaidh",
+ "compose_form.encryption_warning": "Chan eil crioptachadh ceann gu ceann air postaichean Mhastodon. Na co-roinn fiosrachadh dìomhair idir le Mastodon.",
"compose_form.hashtag_warning": "Cha nochd am post seo fon taga hais on a tha e falaichte o liostaichean. Cha ghabh ach postaichean poblach a lorg a-rèir an tagaichean hais.",
"compose_form.lock_disclaimer": "Chan eil an cunntas agad {locked}. ’S urrainn do dhuine sam bith leantainn ort is na postaichean agad a tha ag amas air an luchd-leantainn agad a-mhàin a shealltainn.",
"compose_form.lock_disclaimer.lock": "glaiste",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Thoir an roghainn seo air falbh",
"compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh",
"compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh",
- "compose_form.publish": "Postaich",
+ "compose_form.publish": "Foillsich",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Sàbhail na h-atharraichean",
"compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Leabaich am post seo san làrach-lìn agad is tu a’ dèanamh lethbhreac dhen chòd gu h-ìosal.",
"embed.preview": "Seo an coltas a bhios air:",
"emoji_button.activity": "Gnìomhachd",
+ "emoji_button.clear": "Falamhaich",
"emoji_button.custom": "Gnàthaichte",
"emoji_button.flags": "Brataichean",
"emoji_button.food": "Biadh ⁊ deoch",
@@ -203,7 +206,7 @@
"getting_started.developers": "Luchd-leasachaidh",
"getting_started.directory": "Eòlaire nam pròifil",
"getting_started.documentation": "Docamaideadh",
- "getting_started.heading": "Dèan toiseach-tòiseachaidh",
+ "getting_started.heading": "Toiseach",
"getting_started.invite": "Thoir cuireadh do dhaoine",
"getting_started.open_source_notice": "’S e bathar-bog le bun-tùs fosgailte a th’ ann am Mastodon. ’S urrainn dhut cuideachadh leis no aithris a dhèanamh air duilgheadasan air GitHub fo {github}.",
"getting_started.security": "Roghainnean a’ chunntais",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Cuir am fòcas air colbh",
"keyboard_shortcuts.compose": "Cuir am fòcas air raon teacsa an sgrìobhaidh",
"keyboard_shortcuts.description": "Tuairisgeul",
- "keyboard_shortcuts.direct": "Fosgail colbh nan teachdaireachdan dìreach",
+ "keyboard_shortcuts.direct": "a dh’fhosgladh colbh nan teachdaireachdan dìreach",
"keyboard_shortcuts.down": "Gluais sìos air an liosta",
"keyboard_shortcuts.enter": "Fosgail post",
"keyboard_shortcuts.favourite": "Cuir post ris na h-annsachdan",
@@ -253,7 +256,7 @@
"keyboard_shortcuts.requests": "Fosgail liosta nan iarrtasan leantainn",
"keyboard_shortcuts.search": "Cuir am fòcas air a’ bhàr-luirg",
"keyboard_shortcuts.spoilers": "Seall/Falaich raon an rabhaidh susbainte",
- "keyboard_shortcuts.start": "Fosgail an colbh “dèan toiseach-tòiseachaidh”",
+ "keyboard_shortcuts.start": "Fosgail an colbh “Toiseach”",
"keyboard_shortcuts.toggle_hidden": "Seall/Falaich an teacsa fo rabhadh susbainte",
"keyboard_shortcuts.toggle_sensitivity": "Seall/Falaich na meadhanan",
"keyboard_shortcuts.toot": "Tòisich air post ùr",
@@ -264,6 +267,8 @@
"lightbox.expand": "Leudaich bogsa sealladh an deilbh",
"lightbox.next": "Air adhart",
"lightbox.previous": "Air ais",
+ "limited_account_hint.action": "Seall a’ phròifil co-dhiù",
+ "limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir an fhrithealaiche agad.",
"lists.account.add": "Cuir ris an liosta",
"lists.account.remove": "Thoir air falbh on liosta",
"lists.delete": "Sguab às an liosta",
@@ -291,10 +296,10 @@
"navigation_bar.community_timeline": "Loidhne-ama ionadail",
"navigation_bar.compose": "Sgrìobh post ùr",
"navigation_bar.direct": "Teachdaireachdan dìreach",
- "navigation_bar.discover": "Fidir",
+ "navigation_bar.discover": "Rùraich",
"navigation_bar.domain_blocks": "Àrainnean bacte",
"navigation_bar.edit_profile": "Deasaich a’ phròifil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Rùraich",
"navigation_bar.favourites": "Na h-annsachdan",
"navigation_bar.filters": "Faclan mùchte",
"navigation_bar.follow_requests": "Iarrtasan leantainn",
@@ -317,7 +322,7 @@
"notification.own_poll": "Thàinig an cunntas-bheachd agad gu crìoch",
"notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch",
"notification.reblog": "Bhrosnaich {name} am post agad",
- "notification.status": "Tha {name} air rud a phostadh",
+ "notification.status": "Phostaich {name} rud",
"notification.update": "Dheasaich {name} post",
"notifications.clear": "Falamhaich na brathan",
"notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd",
"privacy.change": "Cuir gleus air prìobhaideachd a’ phuist",
"privacy.direct.long": "Chan fhaic ach na cleachdaichean le iomradh orra seo",
- "privacy.direct.short": "Dìreach",
+ "privacy.direct.short": "An fheadhainn le iomradh orra a-mhàin",
"privacy.private.long": "Chan fhaic ach na daoine a tha a’ leantainn ort seo",
"privacy.private.short": "Luchd-leantainn a-mhàin",
- "privacy.public.long": "Chì a h-uile duine seo ’s e ’ga shealltainn air loidhnichean-ama poblach",
+ "privacy.public.long": "Chì a h-uile duine e",
"privacy.public.short": "Poblach",
- "privacy.unlisted.long": "Chì a h-uile duine seo ach cha dèid a shealltainn air loidhnichean-ama poblach",
+ "privacy.unlisted.long": "Chì a h-uile duine e ach cha nochd e ann an gleusan rùrachaidh",
"privacy.unlisted.short": "Falaichte o liostaichean",
"refresh": "Ath-nuadhaich",
"regeneration_indicator.label": "’Ga luchdadh…",
@@ -459,7 +464,7 @@
"status.history.created": "Chruthaich {name} {date} e",
"status.history.edited": "Dheasaich {name} {date} e",
"status.load_more": "Luchdaich barrachd dheth",
- "status.media_hidden": "Meadhanan falaichte",
+ "status.media_hidden": "Meadhan falaichte",
"status.mention": "Thoir iomradh air @{name}",
"status.more": "Barrachd",
"status.mute": "Mùch @{name}",
@@ -515,6 +520,7 @@
"upload_error.poll": "Chan fhaod thu faidhle a luchdadh suas an cois cunntais-bheachd.",
"upload_form.audio_description": "Mìnich e dhan fheadhainn le èisteachd bheag",
"upload_form.description": "Mìnich e dhan fheadhainn le cion-lèirsinne",
+ "upload_form.description_missing": "Cha deach tuairisgeul a chur ris",
"upload_form.edit": "Deasaich",
"upload_form.thumbnail": "Atharraich an dealbhag",
"upload_form.undo": "Sguab às",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 56fd5ca7f..01fd9a567 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -8,7 +8,7 @@
"account.blocked": "Bloqueada",
"account.browse_more_on_origin_server": "Busca máis no perfil orixinal",
"account.cancel_follow_request": "Desbotar solicitude de seguimento",
- "account.direct": "Mensaxe directa @{name}",
+ "account.direct": "Mensaxe directa a @{name}",
"account.disable_notifications": "Deixar de notificarme cando @{name} publica",
"account.domain_blocked": "Dominio agochado",
"account.edit_profile": "Editar perfil",
@@ -48,8 +48,8 @@
"account.unmute_notifications": "Deixar de silenciar as notificacións de @{name}",
"account.unmute_short": "Non silenciar",
"account_note.placeholder": "Preme para engadir nota",
- "admin.dashboard.daily_retention": "Ratio de retención de usuarias após rexistrarse",
- "admin.dashboard.monthly_retention": "Ratio de retención de usuarias após un mes do rexistro",
+ "admin.dashboard.daily_retention": "Ratio de retención de usuarias diaria após rexistrarse",
+ "admin.dashboard.monthly_retention": "Ratio de retención de usuarias mensual após o rexistro",
"admin.dashboard.retention.average": "Media",
"admin.dashboard.retention.cohort": "Mes de rexistro",
"admin.dashboard.retention.cohort_size": "Novas usuarias",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Só local",
"community.column_settings.media_only": "Só multimedia",
"community.column_settings.remote_only": "Só remoto",
- "compose_form.direct_message_warning": "Esta publicación só será enviada ás usuarias mencionadas.",
+ "compose.language.change": "Elixe o idioma",
+ "compose.language.search": "Buscar idiomas...",
"compose_form.direct_message_warning_learn_more": "Coñecer máis",
+ "compose_form.encryption_warning": "As publicacións en Mastodon non están cifradas de extremo-a-extremo. Non compartas información sensible en Mastodon.",
"compose_form.hashtag_warning": "Esta publicación non aparecerá baixo ningún cancelo (hashtag) porque non está listada. Só se poden procurar publicacións públicas por cancelos.",
"compose_form.lock_disclaimer": "A túa conta non está {locked}. Todas poden seguirte para ollar os teus toots só para seguidoras.",
"compose_form.lock_disclaimer.lock": "bloqueada",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Eliminar esta opción",
"compose_form.poll.switch_to_multiple": "Mudar a enquisa para permitir múltiples escollas",
"compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa escolla",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Gardar cambios",
"compose_form.sensitive.hide": "{count, plural, one {Marca multimedia como sensible} other {Marca multimedia como sensibles}}",
@@ -133,7 +135,7 @@
"confirmations.redraft.confirm": "Eliminar e reescribir",
"confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás os compartidos e favoritos, e as respostas á publicación orixinal ficarán orfas.",
"confirmations.reply.confirm": "Responder",
- "confirmations.reply.message": "Responder agora sobrescribirá a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
+ "confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
"confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "Desexas deixar de seguir a {name}?",
"conversation.delete": "Eliminar conversa",
@@ -147,6 +149,7 @@
"embed.instructions": "Engade esta publicación ó teu sitio web copiando o seguinte código.",
"embed.preview": "Así será mostrado:",
"emoji_button.activity": "Actividade",
+ "emoji_button.clear": "Limpar",
"emoji_button.custom": "Personalizado",
"emoji_button.flags": "Marcas",
"emoji_button.food": "Comida e Bebida",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Destacar unha columna",
"keyboard_shortcuts.compose": "Por o cursor na área de escritura",
"keyboard_shortcuts.description": "Descrición",
- "keyboard_shortcuts.direct": "Para abrir a columna de mensaxes directas",
+ "keyboard_shortcuts.direct": "para abrir a columna de mensaxes directas",
"keyboard_shortcuts.down": "Para mover cara abaixo na listaxe",
"keyboard_shortcuts.enter": "Para abrir publicación",
"keyboard_shortcuts.favourite": "Para engadir a favoritos",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expandir a caixa de vista da imaxe",
"lightbox.next": "Seguinte",
"lightbox.previous": "Anterior",
+ "limited_account_hint.action": "Mostrar perfil igualmente",
+ "limited_account_hint.title": "Este perfil foi agochado pola moderación do teu servidor.",
"lists.account.add": "Engadir á listaxe",
"lists.account.remove": "Eliminar da listaxe",
"lists.delete": "Eliminar listaxe",
@@ -315,7 +320,7 @@
"notification.follow_request": "{name} solicitou seguirte",
"notification.mention": "{name} mencionoute",
"notification.own_poll": "A túa enquisa rematou",
- "notification.poll": "Unha enquisa na que votaches rematou",
+ "notification.poll": "Rematou a enquisa na que votaches",
"notification.reblog": "{name} compartiu a túa publicación",
"notification.status": "{name} publicou",
"notification.update": "{name} editou unha publicación",
@@ -367,19 +372,19 @@
"poll_button.remove_poll": "Eliminar enquisa",
"privacy.change": "Axustar privacidade",
"privacy.direct.long": "Só para as usuarias mencionadas",
- "privacy.direct.short": "Directo",
+ "privacy.direct.short": "Só persoas mencionadas",
"privacy.private.long": "Só para os seguidoras",
"privacy.private.short": "Só para seguidoras",
- "privacy.public.long": "Publicar nas cronoloxías públicas",
+ "privacy.public.long": "Visible por todas",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Non publicar nas cronoloxías públicas",
+ "privacy.unlisted.long": "Visible por todas, pero excluída da sección descubrir",
"privacy.unlisted.short": "Non listado",
"refresh": "Actualizar",
"regeneration_indicator.label": "Estase a cargar…",
"regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!",
"relative_time.days": "{number}d",
"relative_time.full.days": "fai {number, plural, one {# día} other {# días}}",
- "relative_time.full.hours": "fai {number, plural, one {# hora} other {# horas}} ago",
+ "relative_time.full.hours": "fai {number, plural, one {# hora} other {# horas}}",
"relative_time.full.just_now": "xusto agora",
"relative_time.full.minutes": "fai {number, plural, one {# minuto} other {# minutos}}",
"relative_time.full.seconds": "fai {number, plural, one {# segundo} other {# segundos}}",
@@ -409,11 +414,11 @@
"report.reasons.dislike": "Non me gusta",
"report.reasons.dislike_description": "Non é algo que queiras ver",
"report.reasons.other": "É outra cousa",
- "report.reasons.other_description": "O asunto non cae dentro de outras categorías",
+ "report.reasons.other_description": "O problema non cae dentro de outras categorías",
"report.reasons.spam": "É spam",
"report.reasons.spam_description": "Ligazóns perigosas, relacións falsas, ou respostas repetitivas",
"report.reasons.violation": "Viola as regras do servidor",
- "report.reasons.violation_description": "Daste conta de que quebra unhas normas en concreto",
+ "report.reasons.violation_description": "Décheste conta de que quebra unhas normas en concreto",
"report.rules.subtitle": "Elixe todo o que sexa de aplicación",
"report.rules.title": "Que regras foron incumpridas?",
"report.statuses.subtitle": "Elixe todo o que corresponda",
@@ -456,8 +461,8 @@
"status.embed": "Incrustar",
"status.favourite": "Favorito",
"status.filtered": "Filtrado",
- "status.history.created": "{name} creado o {date}",
- "status.history.edited": "{name} editado o {date}",
+ "status.history.created": "{name} creouno o {date}",
+ "status.history.edited": "{name} editouno o {date}",
"status.load_more": "Cargar máis",
"status.media_hidden": "Contido multimedia agochado",
"status.mention": "Mencionar @{name}",
@@ -475,7 +480,7 @@
"status.redraft": "Eliminar e reescribir",
"status.remove_bookmark": "Eliminar marcador",
"status.reply": "Responder",
- "status.replyAll": "Responder ó fío",
+ "status.replyAll": "Responder ao tema",
"status.report": "Denunciar @{name}",
"status.sensitive_warning": "Contido sensíbel",
"status.share": "Compartir",
@@ -494,11 +499,11 @@
"tabs_bar.local_timeline": "Local",
"tabs_bar.notifications": "Notificacións",
"tabs_bar.search": "Procurar",
- "time_remaining.days": "{number, plural, one {# día} other {# días}} restantes",
- "time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restantes",
- "time_remaining.minutes": "{number, plural, one {# minuto} other {# minutos}} restantes",
- "time_remaining.moments": "Momentos restantes",
- "time_remaining.seconds": "{number, plural, one {# segundo} other {# segundos}} restantes",
+ "time_remaining.days": "Remata en {number, plural, one {# día} other {# días}}",
+ "time_remaining.hours": "Remata en {number, plural, one {# hora} other {# horas}}",
+ "time_remaining.minutes": "Remata en {number, plural, one {# minuto} other {# minutos}}",
+ "time_remaining.moments": "A piques de rematar",
+ "time_remaining.seconds": "Remata en {number, plural, one {# segundo} other {# segundos}}",
"timeline_hint.remote_resource_not_displayed": "Non se mostran {resource} desde outros servidores.",
"timeline_hint.resources.followers": "Seguidoras",
"timeline_hint.resources.follows": "Seguindo",
@@ -515,6 +520,7 @@
"upload_error.poll": "Non se poden subir ficheiros nas enquisas.",
"upload_form.audio_description": "Describir para persoas con problemas auditivos",
"upload_form.description": "Describir para persoas con problemas visuais",
+ "upload_form.description_missing": "Sen descrición",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar a miniatura",
"upload_form.undo": "Eliminar",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index db25a33fd..ecbc373c6 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -1,24 +1,24 @@
{
- "account.account_note_header": "ההודעה שלך ל@{name}",
+ "account.account_note_header": "הערה",
"account.add_or_remove_from_list": "הוסף או הסר מהרשימות",
"account.badges.bot": "בוט",
"account.badges.group": "קבוצה",
- "account.block": "חסימת @{name}",
- "account.block_domain": "להסתיר הכל מהקהילה {domain}",
+ "account.block": "חסמי את @{name}",
+ "account.block_domain": "חסמו את קהילת {domain}",
"account.blocked": "חסום",
- "account.browse_more_on_origin_server": "המשך לגלוש בפרופיל המקורי",
+ "account.browse_more_on_origin_server": "ראה יותר בפרופיל המקורי",
"account.cancel_follow_request": "בטל בקשת מעקב",
- "account.direct": "Direct Message @{name}",
+ "account.direct": "הודעה ישירה ל@{name}",
"account.disable_notifications": "הפסק לשלוח לי התראות כש@{name} מפרסמים",
- "account.domain_blocked": "הדומיין חסוי",
+ "account.domain_blocked": "הדומיין חסום",
"account.edit_profile": "עריכת פרופיל",
- "account.enable_notifications": "שלח לי התראות כש@{name} מפרסמים",
- "account.endorse": "הצג בפרופיל",
- "account.follow": "מעקב",
+ "account.enable_notifications": "שלח לי התראות כש@{name} מפרסם",
+ "account.endorse": "קדם את החשבון בפרופיל",
+ "account.follow": "עקוב",
"account.followers": "עוקבים",
"account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.",
"account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}",
- "account.following": "Following",
+ "account.following": "נעקבים",
"account.following_counter": "{count, plural,one {עוקב אחרי {counter}}other {עוקב אחרי {counter}}}",
"account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.",
"account.follows_you": "במעקב אחריך",
@@ -30,71 +30,73 @@
"account.mention": "אזכור של @{name}",
"account.moved_to": "החשבון {name} הועבר אל:",
"account.mute": "להשתיק את @{name}",
- "account.mute_notifications": "להסתיר התראות מאת @{name}",
+ "account.mute_notifications": "להסתיר התראות מ @{name}",
"account.muted": "מושתק",
- "account.posts": "הודעות",
- "account.posts_with_replies": "Toots with replies",
- "account.report": "לדווח על @{name}",
- "account.requested": "בהמתנה לאישור",
- "account.share": "לשתף את הפרופיל של @{name}",
- "account.show_reblogs": "להראות הדהודים מאת @{name}",
+ "account.posts": "פוסטים",
+ "account.posts_with_replies": "פוסטים ותגובות",
+ "account.report": "דווח על @{name}",
+ "account.requested": "בהמתנה לאישור. לחצי כדי לבטל בקשת מעקב",
+ "account.share": "שתף את הפרופיל של @{name}",
+ "account.show_reblogs": "הצג הדהודים מאת @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
- "account.unblock": "הסרת חסימה מעל @{name}",
- "account.unblock_domain": "הסר חסימה מקהילת {domain}",
- "account.unblock_short": "Unblock",
- "account.unendorse": "לא להציג בפרופיל",
+ "account.unblock": "הסר את החסימה של @{name}",
+ "account.unblock_domain": "הסירי את החסימה של קהילת {domain}",
+ "account.unblock_short": "הסר חסימה",
+ "account.unendorse": "אל תקדם בפרופיל",
"account.unfollow": "הפסקת מעקב",
"account.unmute": "הפסקת השתקת @{name}",
- "account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}",
- "account.unmute_short": "Unmute",
- "account_note.placeholder": "ללא הערה",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "account.unmute_notifications": "להפסיק השתקת התראות מ @{name}",
+ "account.unmute_short": "ביטול השתקה",
+ "account_note.placeholder": "יש ללחוץ כדי להוסיף הערות",
+ "admin.dashboard.daily_retention": "קצב שימור משתמשים (פר יום) אחרי ההרשמה",
+ "admin.dashboard.monthly_retention": "קצב שימור משתמשים (פר חודש) אחרי ההרשמה",
"admin.dashboard.retention.average": "ממוצע",
- "admin.dashboard.retention.cohort": "Sign-up month",
+ "admin.dashboard.retention.cohort": "חודש רישום",
"admin.dashboard.retention.cohort_size": "משתמשים חדשים",
"alert.rate_limited.message": "נא לנסות אחרי {retry_time, time, medium}.",
- "alert.rate_limited.title": "מגבלות מיכסה",
+ "alert.rate_limited.title": "חלה הגבלת קצב",
"alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
"alert.unexpected.title": "אופס!",
- "announcement.announcement": "הודעה",
+ "announcement.announcement": "הכרזה",
"attachments_list.unprocessed": "(לא מעובד)",
"autosuggest_hashtag.per_week": "{count} לשבוע",
"boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
- "bundle_column_error.body": "משהו השתבש בעת הצגת הרכיב הזה.",
+ "bundle_column_error.body": "משהו השתבש בעת טעינת הרכיב הזה.",
"bundle_column_error.retry": "לנסות שוב",
"bundle_column_error.title": "שגיאת רשת",
"bundle_modal_error.close": "לסגור",
"bundle_modal_error.message": "משהו השתבש בעת טעינת הרכיב הזה.",
"bundle_modal_error.retry": "לנסות שוב",
- "column.blocks": "חסימות",
+ "column.blocks": "משתמשים חסומים",
"column.bookmarks": "סימניות",
- "column.community": "ציר זמן מקומי",
+ "column.community": "פיד שרת מקומי",
"column.direct": "הודעות ישירות",
- "column.directory": "גלוש פרופילים",
- "column.domain_blocks": "Hidden domains",
+ "column.directory": "עיין בפרופילים",
+ "column.domain_blocks": "קהילות (שמות מתחם) מוסתרות",
"column.favourites": "חיבובים",
"column.follow_requests": "בקשות מעקב",
- "column.home": "בבית",
+ "column.home": "פיד הבית",
"column.lists": "רשימות",
"column.mutes": "השתקות",
"column.notifications": "התראות",
- "column.pins": "Pinned toot",
- "column.public": "בפרהסיה",
- "column_back_button.label": "חזרה",
- "column_header.hide_settings": "הסתרת העדפות",
- "column_header.moveLeft_settings": "הזחת טור לשמאל",
- "column_header.moveRight_settings": "הזחת טור לימין",
- "column_header.pin": "קיבוע",
+ "column.pins": "פווסטים נעוצים",
+ "column.public": "פיד כללי (כל השרתים)",
+ "column_back_button.label": "בחזרה",
+ "column_header.hide_settings": "הסתרת הגדרות",
+ "column_header.moveLeft_settings": "הזזת טור לשמאל",
+ "column_header.moveRight_settings": "הזזת טור לימין",
+ "column_header.pin": "הצמדה",
"column_header.show_settings": "הצגת העדפות",
- "column_header.unpin": "שחרור קיבוע",
+ "column_header.unpin": "שחרור הצמדה",
"column_subheading.settings": "אפשרויות",
"community.column_settings.local_only": "מקומי בלבד",
- "community.column_settings.media_only": "Media only",
- "community.column_settings.remote_only": "מרחוק בלבד",
- "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
+ "community.column_settings.media_only": "מדיה בלבד",
+ "community.column_settings.remote_only": "מרוחק בלבד",
+ "compose.language.change": "שינוי שפת הפוסט",
+ "compose.language.search": "חיפוש שפות...",
"compose_form.direct_message_warning_learn_more": "מידע נוסף",
- "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+ "compose_form.encryption_warning": "פוסטים במסטודון לא מוצפנים מקצה לקצה. אל תשתפו מידע רגיש במסטודון.",
+ "compose_form.hashtag_warning": "פוסט זה לא יירשם תחת תגי הקבצה (האשטאגים) היות והנראות שלו היא 'לא רשום'. רק פוסטים ציבוריים יכולים להימצא באמצעות תגי הקבצה.",
"compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.",
"compose_form.lock_disclaimer.lock": "נעול",
"compose_form.placeholder": "מה עובר לך בראש?",
@@ -104,49 +106,50 @@
"compose_form.poll.remove_option": "הסר בחירה זו",
"compose_form.poll.switch_to_multiple": "אפשרו בחירה מרובה בסקר",
"compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר",
- "compose_form.publish": "ללחוש",
- "compose_form.publish_loud": "לחצרץ!",
- "compose_form.save_changes": "Save changes",
- "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
- "compose_form.spoiler.marked": "Text is hidden behind warning",
- "compose_form.spoiler.unmarked": "Text is not hidden",
- "compose_form.spoiler_placeholder": "אזהרת תוכן",
+ "compose_form.publish": "פרסום",
+ "compose_form.publish_loud": "{publish}!",
+ "compose_form.save_changes": "שמירת שינויים",
+ "compose_form.sensitive.hide": "{count, plural, one {סימון מידע כרגיש} other {סימון מידע כרגיש}}",
+ "compose_form.sensitive.marked": "{count, plural, one {מידע מסומן כרגיש} other {מידע מסומן כרגיש}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {מידע לא מסומן כרגיש} other {מידע לא מסומן כרגיש}}",
+ "compose_form.spoiler.marked": "הסר אזהרת תוכן",
+ "compose_form.spoiler.unmarked": "הוסף אזהרת תוכן",
+ "compose_form.spoiler_placeholder": "כתוב את האזהרה שלך כאן",
"confirmation_modal.cancel": "ביטול",
"confirmations.block.block_and_report": "לחסום ולדווח",
"confirmations.block.confirm": "לחסום",
- "confirmations.block.message": "לחסום את {name}?",
+ "confirmations.block.message": "האם את/ה בטוח/ה שברצונך למחוק את \"{name}\"?",
"confirmations.delete.confirm": "למחוק",
- "confirmations.delete.message": "למחוק את ההודעה?",
+ "confirmations.delete.message": "בטוח/ה שאת/ה רוצה למחוק את ההודעה?",
"confirmations.delete_list.confirm": "למחוק",
"confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
- "confirmations.domain_block.confirm": "הסתר קהילה שלמה",
- "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.",
+ "confirmations.discard_edit_media.confirm": "השלך",
+ "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?",
+ "confirmations.domain_block.confirm": "חסמו לגמרי את שם המתחם (דומיין)",
+ "confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו",
"confirmations.logout.confirm": "להתנתק",
"confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?",
"confirmations.mute.confirm": "להשתיק",
- "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+ "confirmations.mute.explanation": "זה יסתיר פוסטים שלהם ופוסטים שמאזכרים אותם, אבל עדיין יתיר להם לראות פוסטים שלך ולעקוב אחריך.",
"confirmations.mute.message": "להשתיק את {name}?",
"confirmations.redraft.confirm": "מחק וערוך מחדש",
- "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
+ "confirmations.redraft.message": "בטוחה שאת רוצה למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות לפוסט המקורי ישארו יתומות.",
"confirmations.reply.confirm": "הגב",
- "confirmations.reply.message": "הגבה עכשיו ידרוס את ההודעה שאתם כותבים כעת. האם אתם בטוחים שברצונכם להמשיך?",
+ "confirmations.reply.message": "תגובה עכשיו תדרוס את ההודעה שכבר התחלתים לכתוב. האם אתם בטוחים שברצונכם להמשיך?",
"confirmations.unfollow.confirm": "להפסיק מעקב",
"confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?",
"conversation.delete": "מחיקת שיחה",
"conversation.mark_as_read": "סמן כנקרא",
"conversation.open": "צפו בשיחה",
"conversation.with": "עם {names}",
- "directory.federated": "From known fediverse",
- "directory.local": "From {domain} only",
- "directory.new_arrivals": "New arrivals",
+ "directory.federated": "מהפדרציה הידועה",
+ "directory.local": "מ- {domain} בלבד",
+ "directory.new_arrivals": "חדשים כאן",
"directory.recently_active": "פעילים לאחרונה",
"embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.",
"embed.preview": "דוגמא כיצד זה יראה:",
"emoji_button.activity": "פעילות",
+ "emoji_button.clear": "ניקוי",
"emoji_button.custom": "מיוחדים",
"emoji_button.flags": "דגלים",
"emoji_button.food": "אוכל ושתיה",
@@ -161,114 +164,116 @@
"emoji_button.symbols": "סמלים",
"emoji_button.travel": "טיולים ואתרים",
"empty_column.account_suspended": "חשבון מושהה",
- "empty_column.account_timeline": "No toots here!",
+ "empty_column.account_timeline": "אין עדיין אף פוסט!",
"empty_column.account_unavailable": "פרופיל לא זמין",
"empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
- "empty_column.community": "טור הסביבה ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
- "empty_column.direct": "עדיין אין לכם הודעות פרטיות. כאשר תשלחו או תקבלו אחת, היא תופיע כאן.",
- "empty_column.domain_blocks": "There are no hidden domains yet.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
- "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
- "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+ "empty_column.community": "פיד השרת המקומי ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
+ "empty_column.direct": "אין לך שום הודעות פרטיות עדיין. כשתשלחו או תקבלו אחת, היא תופיע כאן.",
+ "empty_column.domain_blocks": "אין עדיין קהילות מוסתרות.",
+ "empty_column.explore_statuses": "אין נושאים חמים כרגע. אולי אחר כך!",
+ "empty_column.favourited_statuses": "אין עדיין פוסטים שחיבבת. כשתחבב את הראשון, הוא יופיע כאן.",
+ "empty_column.favourites": "עוד לא חיבבו את הפוסט הזה. כאשר זה יקרה, החיבובים יופיעו כאן.",
+ "empty_column.follow_recommendations": "נראה שלא ניתן לייצר המלצות עבורך. נסה/י להשתמש בחיפוש כדי למצוא אנשים מוכרים או לבדוק את הנושאים החמים.",
+ "empty_column.follow_requests": "אין לך שום בקשות מעקב עדיין. לכשיתקבלו כאלה, הן תופענה כאן.",
"empty_column.hashtag": "אין כלום בהאשתג הזה עדיין.",
- "empty_column.home": "אף אחד לא במעקב עדיין. אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר חצוצרנים אחרים.",
- "empty_column.home.suggestions": "See some suggestions",
- "empty_column.list": "אין עדיין מאום ברשימה.",
- "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
- "empty_column.mutes": "You haven't muted any users yet.",
+ "empty_column.home": "אף אחד לא במעקב עדיין. אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר חצוצרנים אחרים. {suggestions}",
+ "empty_column.home.suggestions": "ראה/י כמה הצעות",
+ "empty_column.list": "אין עדיין פריטים ברשימה. כאשר חברים ברשימה הזאת יפרסמו פוסטים חדשים, הם יופיעו פה.",
+ "empty_column.lists": "אין לך שום רשימות עדיין. לכשיהיו, הן תופענה כאן.",
+ "empty_column.mutes": "עוד לא השתקת שום משתמש.",
"empty_column.notifications": "אין התראות עדיין. יאללה, הגיע הזמן להתחיל להתערבב.",
"empty_column.public": "אין פה כלום! כדי למלא את הטור הזה אפשר לכתוב משהו, או להתחיל לעקוב אחרי אנשים מקהילות אחרות",
- "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
- "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
- "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
- "errors.unexpected_crash.report_issue": "Report issue",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
- "follow_recommendations.done": "Done",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
- "follow_request.authorize": "קבלה",
+ "error.unexpected_crash.explanation": "עקב תקלה בקוד שלנו או בעיית תאימות דפדפן, לא ניתן להציג דף זה כראוי.",
+ "error.unexpected_crash.explanation_addons": "לא ניתן להציג דף זה כראוי. הבעיה נגרמת כנראה עקב תוסף דפדפן או כלי תרגום אוטומטי.",
+ "error.unexpected_crash.next_steps": "נסה/י לרענן את הדף. אם זה לא עוזר, אולי אפשר עדיין להשתמש במסטודון דרך דפדפן אחר או באמצעות אפליקציה ילידית.",
+ "error.unexpected_crash.next_steps_addons": "נסה/י להסיר אותם ולרענן את הדף. אם זה לא עוזר, אולי אפשר עדיין להשתמש במסטודון דרך דפדפן אחר או באמצעות אפליקציה ילידית.",
+ "errors.unexpected_crash.copy_stacktrace": "להעתיק את הקוד ללוח הכתיבה",
+ "errors.unexpected_crash.report_issue": "דווח על בעיה",
+ "explore.search_results": "תוצאות חיפוש",
+ "explore.suggested_follows": "עבורך",
+ "explore.title": "סיור",
+ "explore.trending_links": "חדשות",
+ "explore.trending_statuses": "פוסטים",
+ "explore.trending_tags": "האשטאגים",
+ "follow_recommendations.done": "בוצע",
+ "follow_recommendations.heading": "עקב/י אחרי אנשים שתרצה/י לראות את חצרוציהם! הנה כמה הצעות.",
+ "follow_recommendations.lead": "חצרוצים מאנשים במעקב יופיעו בסדר כרונולוגי בפיד הבית. אל תחששו מטעויות, אפשר להסיר מעקב באותה הקלות ובכל זמן!",
+ "follow_request.authorize": "הרשאה",
"follow_request.reject": "דחיה",
- "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
- "generic.saved": "Saved",
- "getting_started.developers": "Developers",
- "getting_started.directory": "Profile directory",
- "getting_started.documentation": "Documentation",
+ "follow_requests.unlocked_explanation": "למרות שחשבונך אינו נעול, צוות {domain} חושב שאולי כדאי לוודא את בקשות המעקב האלה ידנית.",
+ "generic.saved": "נשמר",
+ "getting_started.developers": "מפתחות",
+ "getting_started.directory": "מדריך פרופילים",
+ "getting_started.documentation": "תיעוד",
"getting_started.heading": "בואו נתחיל",
- "getting_started.invite": "Invite people",
+ "getting_started.invite": "להזמין אנשים",
"getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {github}.",
- "getting_started.security": "Security",
- "getting_started.terms": "Terms of service",
- "hashtag.column_header.tag_mode.all": "and {additional}",
- "hashtag.column_header.tag_mode.any": "or {additional}",
- "hashtag.column_header.tag_mode.none": "without {additional}",
- "hashtag.column_settings.select.no_options_message": "No suggestions found",
- "hashtag.column_settings.select.placeholder": "Enter hashtags…",
- "hashtag.column_settings.tag_mode.all": "All of these",
- "hashtag.column_settings.tag_mode.any": "Any of these",
- "hashtag.column_settings.tag_mode.none": "None of these",
- "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+ "getting_started.security": "הגדרות חשבון",
+ "getting_started.terms": "תנאי שימוש",
+ "hashtag.column_header.tag_mode.all": "ו- {additional}",
+ "hashtag.column_header.tag_mode.any": "או {additional}",
+ "hashtag.column_header.tag_mode.none": "ללא {additional}",
+ "hashtag.column_settings.select.no_options_message": "לא נמצאו הצעות",
+ "hashtag.column_settings.select.placeholder": "הזן תגי הקבצה…",
+ "hashtag.column_settings.tag_mode.all": "כל אלה",
+ "hashtag.column_settings.tag_mode.any": "כל אלה",
+ "hashtag.column_settings.tag_mode.none": "אף אחד מאלה",
+ "hashtag.column_settings.tag_toggle": "כלול תגיות נוספות בטור זה",
"home.column_settings.basic": "למתחילים",
"home.column_settings.show_reblogs": "הצגת הדהודים",
"home.column_settings.show_replies": "הצגת תגובות",
- "home.hide_announcements": "Hide announcements",
- "home.show_announcements": "Show announcements",
- "intervals.full.days": "{number, plural, one {# day} other {# days}}",
- "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
- "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+ "home.hide_announcements": "הסתר הכרזות",
+ "home.show_announcements": "הצג הכרזות",
+ "intervals.full.days": "{number, plural, one {# יום} other {# ימים}}",
+ "intervals.full.hours": "{number, plural, one {# שעה} other {# שעות}}",
+ "intervals.full.minutes": "{number, plural, one {# דקה} other {# דקות}}",
"keyboard_shortcuts.back": "ניווט חזרה",
- "keyboard_shortcuts.blocked": "to open blocked users list",
+ "keyboard_shortcuts.blocked": "פתיחת רשימת חסומים",
"keyboard_shortcuts.boost": "להדהד",
"keyboard_shortcuts.column": "להתמקד בהודעה באחד מהטורים",
"keyboard_shortcuts.compose": "להתמקד בתיבת חיבור ההודעות",
"keyboard_shortcuts.description": "תיאור",
- "keyboard_shortcuts.direct": "to open direct messages column",
+ "keyboard_shortcuts.direct": "לפתיחת טור הודעות ישירות",
"keyboard_shortcuts.down": "לנוע במורד הרשימה",
- "keyboard_shortcuts.enter": "to open status",
+ "keyboard_shortcuts.enter": "פתח חצרוץ",
"keyboard_shortcuts.favourite": "לחבב",
- "keyboard_shortcuts.favourites": "to open favourites list",
- "keyboard_shortcuts.federated": "to open federated timeline",
+ "keyboard_shortcuts.favourites": "פתיחת רשימת מועדפים",
+ "keyboard_shortcuts.federated": "פתיחת ציר זמן בין-קהילתי",
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
- "keyboard_shortcuts.home": "to open home timeline",
+ "keyboard_shortcuts.home": "פתיחת ציר זמן אישי",
"keyboard_shortcuts.hotkey": "מקש קיצור",
"keyboard_shortcuts.legend": "להציג את הפירוש",
- "keyboard_shortcuts.local": "to open local timeline",
+ "keyboard_shortcuts.local": "פתיחת ציר זמן קהילתי",
"keyboard_shortcuts.mention": "לאזכר את המחבר(ת)",
- "keyboard_shortcuts.muted": "to open muted users list",
- "keyboard_shortcuts.my_profile": "to open your profile",
- "keyboard_shortcuts.notifications": "to open notifications column",
- "keyboard_shortcuts.open_media": "to open media",
- "keyboard_shortcuts.pinned": "to open pinned toots list",
- "keyboard_shortcuts.profile": "to open author's profile",
+ "keyboard_shortcuts.muted": "פתיחת רשימת משתמשים מושתקים",
+ "keyboard_shortcuts.my_profile": "פתיחת הפרופיל שלך",
+ "keyboard_shortcuts.notifications": "פתיחת טור התראות",
+ "keyboard_shortcuts.open_media": "פתיחת מדיה",
+ "keyboard_shortcuts.pinned": "פתיחת רשימת חצרותים מוצמדים",
+ "keyboard_shortcuts.profile": "פתח את פרופיל המשתמש",
"keyboard_shortcuts.reply": "לענות",
- "keyboard_shortcuts.requests": "to open follow requests list",
+ "keyboard_shortcuts.requests": "פתיחת רשימת בקשות מעקב",
"keyboard_shortcuts.search": "להתמקד בחלון החיפוש",
- "keyboard_shortcuts.spoilers": "to show/hide CW field",
+ "keyboard_shortcuts.spoilers": "הצגת/הסתרת שדה אזהרת תוכן (CW)",
"keyboard_shortcuts.start": "to open \"get started\" column",
- "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
- "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
- "keyboard_shortcuts.toot": "להתחיל חיצרוץ חדש",
+ "keyboard_shortcuts.toggle_hidden": "הצגת/הסתרת טקסט מוסתר מאחורי אזהרת תוכן",
+ "keyboard_shortcuts.toggle_sensitivity": "הצגת/הסתרת מדיה",
+ "keyboard_shortcuts.toot": "להתחיל פוסט חדש",
"keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש",
"keyboard_shortcuts.up": "לנוע במעלה הרשימה",
"lightbox.close": "סגירה",
- "lightbox.compress": "Compress image view box",
- "lightbox.expand": "Expand image view box",
+ "lightbox.compress": "דחיסת קופסת צפייה בתמונה",
+ "lightbox.expand": "הרחבת קופסת צפייה בתמונה",
"lightbox.next": "הלאה",
"lightbox.previous": "הקודם",
+ "limited_account_hint.action": "הצג חשבון בכל זאת",
+ "limited_account_hint.title": "פרופיל זה הוסתר ע\"י מנהלי השרת שלך.",
"lists.account.add": "הוסף לרשימה",
"lists.account.remove": "הסר מרשימה",
- "lists.delete": "Delete list",
- "lists.edit": "Edit list",
- "lists.edit.submit": "Change title",
+ "lists.delete": "מחיקת רשימה",
+ "lists.edit": "עריכת רשימה",
+ "lists.edit.submit": "שנה/י כותרת",
"lists.new.create": "הוספת רשימה",
"lists.new.title_placeholder": "כותרת הרשימה החדשה",
"lists.replies_policy.followed": "משתמשים שאני עוקב אחריהם",
@@ -277,155 +282,155 @@
"lists.replies_policy.title": "הצג תגובות ל:",
"lists.search": "חיפוש בין אנשים שאני עוקב\\ת אחריהם",
"lists.subheading": "הרשימות שלך",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "load_pending": "{count, plural, one {# פריט חדש} other {# פריטים חדשים}}",
"loading_indicator.label": "טוען...",
"media_gallery.toggle_visible": "נראה\\בלתי נראה",
"missing_indicator.label": "לא נמצא",
"missing_indicator.sublabel": "לא ניתן היה למצוא את המשאב",
"mute_modal.duration": "משך הזמן",
- "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?",
+ "mute_modal.hide_notifications": "להסתיר התראות מחשבון זה?",
"mute_modal.indefinite": "ללא תאריך סיום",
- "navigation_bar.apps": "Mobile apps",
- "navigation_bar.blocks": "חסימות",
- "navigation_bar.bookmarks": "Bookmarks",
- "navigation_bar.community_timeline": "ציר זמן מקומי",
- "navigation_bar.compose": "Compose new toot",
+ "navigation_bar.apps": "יישומונים לנייד",
+ "navigation_bar.blocks": "משתמשים חסומים",
+ "navigation_bar.bookmarks": "סימניות",
+ "navigation_bar.community_timeline": "פיד שרת מקומי",
+ "navigation_bar.compose": "צור פוסט חדש",
"navigation_bar.direct": "הודעות ישירות",
- "navigation_bar.discover": "Discover",
- "navigation_bar.domain_blocks": "Hidden domains",
+ "navigation_bar.discover": "גלה",
+ "navigation_bar.domain_blocks": "קהילות (שמות מתחם) חסומות",
"navigation_bar.edit_profile": "עריכת פרופיל",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "סיור",
"navigation_bar.favourites": "חיבובים",
- "navigation_bar.filters": "Muted words",
+ "navigation_bar.filters": "מילים מושתקות",
"navigation_bar.follow_requests": "בקשות מעקב",
- "navigation_bar.follows_and_followers": "Follows and followers",
- "navigation_bar.info": "מידע נוסף",
+ "navigation_bar.follows_and_followers": "נעקבים ועוקבים",
+ "navigation_bar.info": "אודות שרת זה",
"navigation_bar.keyboard_shortcuts": "קיצורי מקלדת",
- "navigation_bar.lists": "Lists",
- "navigation_bar.logout": "יציאה",
+ "navigation_bar.lists": "רשימות",
+ "navigation_bar.logout": "התנתקות",
"navigation_bar.mutes": "השתקות",
- "navigation_bar.personal": "Personal",
- "navigation_bar.pins": "חיצרוצים מקובעים",
+ "navigation_bar.personal": "אישי",
+ "navigation_bar.pins": "פוסטים נעוצים",
"navigation_bar.preferences": "העדפות",
"navigation_bar.public_timeline": "ציר זמן בין-קהילתי",
- "navigation_bar.security": "Security",
- "notification.admin.sign_up": "{name} signed up",
+ "navigation_bar.security": "אבטחה",
+ "notification.admin.sign_up": "{name} נרשמו",
"notification.favourite": "חצרוצך חובב על ידי {name}",
"notification.follow": "{name} במעקב אחרייך",
- "notification.follow_request": "{name} has requested to follow you",
+ "notification.follow_request": "{name} ביקשו לעקוב אחריך",
"notification.mention": "אוזכרת על ידי {name}",
- "notification.own_poll": "Your poll has ended",
- "notification.poll": "A poll you have voted in has ended",
+ "notification.own_poll": "הסקר שלך הסתיים",
+ "notification.poll": "סקר שהצבעת בו הסתיים",
"notification.reblog": "חצרוצך הודהד על ידי {name}",
- "notification.status": "{name} just posted",
+ "notification.status": "{name} הרגע פרסמו",
"notification.update": "{name} ערכו פוסט",
"notifications.clear": "הסרת התראות",
"notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "הרשמות חדשות:",
"notifications.column_settings.alert": "התראות לשולחן העבודה",
"notifications.column_settings.favourite": "מחובבים:",
- "notifications.column_settings.filter_bar.advanced": "Display all categories",
- "notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.filter_bar.advanced": "הצג את כל הקטגוריות",
+ "notifications.column_settings.filter_bar.category": "שורת סינון מהיר",
+ "notifications.column_settings.filter_bar.show_bar": "הצג שורת סינון",
"notifications.column_settings.follow": "עוקבים חדשים:",
- "notifications.column_settings.follow_request": "New follow requests:",
+ "notifications.column_settings.follow_request": "בקשות מעקב חדשות:",
"notifications.column_settings.mention": "פניות:",
- "notifications.column_settings.poll": "Poll results:",
+ "notifications.column_settings.poll": "תוצאות סקר:",
"notifications.column_settings.push": "הודעות בדחיפה",
"notifications.column_settings.reblog": "הדהודים:",
"notifications.column_settings.show": "הצגה בטור",
"notifications.column_settings.sound": "שמע מופעל",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_notifications.category": "Unread notifications",
- "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+ "notifications.column_settings.unread_notifications.category": "התראות שלא נקראו",
+ "notifications.column_settings.unread_notifications.highlight": "הבלט התראות שלא נקראו",
"notifications.column_settings.update": "שינויים:",
- "notifications.filter.all": "All",
- "notifications.filter.boosts": "Boosts",
- "notifications.filter.favourites": "Favourites",
- "notifications.filter.follows": "Follows",
- "notifications.filter.mentions": "Mentions",
- "notifications.filter.polls": "Poll results",
- "notifications.filter.statuses": "Updates from people you follow",
- "notifications.grant_permission": "Grant permission.",
- "notifications.group": "{count} notifications",
- "notifications.mark_as_read": "Mark every notification as read",
- "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
- "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
- "notifications_permission_banner.enable": "Enable desktop notifications",
- "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
- "notifications_permission_banner.title": "Never miss a thing",
- "picture_in_picture.restore": "Put it back",
- "poll.closed": "Closed",
- "poll.refresh": "Refresh",
- "poll.total_people": "{count, plural, one {# person} other {# people}}",
- "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
- "poll.vote": "Vote",
- "poll.voted": "You voted for this answer",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
- "poll_button.add_poll": "Add a poll",
- "poll_button.remove_poll": "Remove poll",
+ "notifications.filter.all": "הכל",
+ "notifications.filter.boosts": "הדהודים",
+ "notifications.filter.favourites": "חיבובים",
+ "notifications.filter.follows": "נעקבים",
+ "notifications.filter.mentions": "אזכורים",
+ "notifications.filter.polls": "תוצאות סקר",
+ "notifications.filter.statuses": "עדכונים מאנשים במעקב",
+ "notifications.grant_permission": "מתן הרשאה.",
+ "notifications.group": "{count} התראות",
+ "notifications.mark_as_read": "סימון כל ההודעות כנקראו",
+ "notifications.permission_denied": "לא ניתן להציג התראות מסך כיוון כיוון שהרשאות דפדפן נשללו בעבר",
+ "notifications.permission_denied_alert": "לא ניתן לאפשר נוטיפיקציות מסך שכן הדפדפן סורב הרשאה בעבר",
+ "notifications.permission_required": "לא ניתן לאפשר נוטיפיקציות מסך כיוון שהרשאה דרושה לא ניתנה.",
+ "notifications_permission_banner.enable": "לאפשר נוטיפיקציות מסך",
+ "notifications_permission_banner.how_to_control": "כדי לקבל הודעות גם כאשר מסטודון סגור יש לאפשר נוטיפיקציות מסך. ניתן לשלוט בדיוק איזה סוג של אינטראקציות יביא לנוטיפיקציות מסך דרך כפתור ה- {icon} מרגע שהן מאופשרות.",
+ "notifications_permission_banner.title": "לעולם אל תחמיץ דבר",
+ "picture_in_picture.restore": "החזירי למקומו",
+ "poll.closed": "סגור",
+ "poll.refresh": "רענון",
+ "poll.total_people": "{count, plural, one {# איש/אישה} other {# אנשים}}",
+ "poll.total_votes": "{count, plural, one {# קול} other {# קולות}}",
+ "poll.vote": "הצבעה",
+ "poll.voted": "הצבעת לתשובה זו",
+ "poll.votes": "{votes, plural, one {# קול} other {# קולות}}",
+ "poll_button.add_poll": "הוספת סקר",
+ "poll_button.remove_poll": "הסרת סקר",
"privacy.change": "שינוי פרטיות ההודעה",
- "privacy.direct.long": "הצג רק למי שהודעה זו פונה אליו",
- "privacy.direct.short": "הודעה ישירה",
+ "privacy.direct.long": "רק למשתמשים מאוזכרים (mentioned)",
+ "privacy.direct.short": "למאוזכרים בלבד",
"privacy.private.long": "הצג לעוקבים בלבד",
"privacy.private.short": "לעוקבים בלבד",
- "privacy.public.long": "פרסם בפומבי",
+ "privacy.public.long": "גלוי לכל",
"privacy.public.short": "פומבי",
- "privacy.unlisted.long": "לא יופיע בפידים הציבוריים המשותפים",
- "privacy.unlisted.short": "לא לפיד הכללי",
- "refresh": "Refresh",
- "regeneration_indicator.label": "Loading…",
- "regeneration_indicator.sublabel": "Your home feed is being prepared!",
- "relative_time.days": "{number}d",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
- "relative_time.hours": "{number}h",
+ "privacy.unlisted.long": "גלוי לכל, אבל מוסתר מאמצעי גילוי",
+ "privacy.unlisted.short": "לא רשום (לא לפיד הכללי)",
+ "refresh": "רענון",
+ "regeneration_indicator.label": "טוען…",
+ "regeneration_indicator.sublabel": "פיד הבית שלך בהכנה!",
+ "relative_time.days": "{number} ימים",
+ "relative_time.full.days": "לפני {number, plural, one {# יום} other {# ימים}}",
+ "relative_time.full.hours": "לפני {number, plural, one {# שעה} other {# שעות}}",
+ "relative_time.full.just_now": "ממש עכשיו",
+ "relative_time.full.minutes": "לפני {number, plural, one {# דקה} other {# דקות}}",
+ "relative_time.full.seconds": "לפני {number, plural, one {# שניה} other {# שניות}}",
+ "relative_time.hours": "{number} שעות",
"relative_time.just_now": "כרגע",
- "relative_time.minutes": "{number}m",
- "relative_time.seconds": "{number}s",
- "relative_time.today": "today",
+ "relative_time.minutes": "{number} דקות",
+ "relative_time.seconds": "{number} שניות",
+ "relative_time.today": "היום",
"reply_indicator.cancel": "ביטול",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
- "report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
- "report.forward": "Forward to {target}",
- "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.block": "לחסום",
+ "report.block_explanation": "לא ניתן יהיה לראות את הפוסטים שלהן. הן לא יוכלו לראות את הפוסטים שלך או לעקוב אחריך. הם יוכלו לדעת שהם חסומים.",
+ "report.categories.other": "אחר",
+ "report.categories.spam": "ספאם",
+ "report.categories.violation": "התוכן מפר אחד או יותר מחוקי השרת",
+ "report.category.subtitle": "בחר/י את המתאים ביותר",
+ "report.category.title": "ספר/י לנו מה קורה עם ה-{type} הזה",
+ "report.category.title_account": "פרופיל",
+ "report.category.title_status": "חצרוץ",
+ "report.close": "בוצע",
+ "report.comment.title": "האם יש דבר נוסף שלדעתך חשוב שנדע?",
+ "report.forward": "קדם ל-{target}",
+ "report.forward_hint": "חשבון זה הוא משרת אחר. האם לשלוח בנוסף עותק אנונימי לשם?",
+ "report.mute": "להשתיק",
+ "report.mute_explanation": "לא ניתן יהיה לראות את חצרוציהם. הם עדיין יוכלו לעקוב אחריך ולראות את חצרוציך ולא ידעו שהם מושתקים.",
+ "report.next": "הבא",
"report.placeholder": "הערות נוספות",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "אני לא אוהב את זה",
+ "report.reasons.dislike_description": "זה לא משהו שתרצה/י לראות",
+ "report.reasons.other": "זה משהו אחר",
+ "report.reasons.other_description": "הבעיה לא מתאימה לקטגוריות אחרות",
+ "report.reasons.spam": "זה ספאם",
+ "report.reasons.spam_description": "קישורים מרושעים, התייחסות מזוייפת או תגובות חוזרות",
+ "report.reasons.violation": "מפר את חוקי השרת",
+ "report.reasons.violation_description": "את/ה מודע/ת לכך שזה מפר חוקים ספציפיים",
+ "report.rules.subtitle": "בחר/י את כל המתאימים",
+ "report.rules.title": "אילו חוקים מופרים?",
+ "report.statuses.subtitle": "בחר/י את כל המתאימים",
+ "report.statuses.title": "האם ישנם חצרוצים התומכים בדיווח זה?",
"report.submit": "שליחה",
- "report.target": "דיווח",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.target": "דיווח על {target}",
+ "report.thanks.take_action": "הנה כמה אפשרויות לשליטה בתצוגת מסטודון:",
+ "report.thanks.take_action_actionable": "בזמן שאנו בוחנות את הדיווח, ניתן לפעול כנגד @{name}:",
+ "report.thanks.title": "לא מעוניין/ת לראות את זה?",
+ "report.thanks.title_actionable": "תודה על הדיווח, נבדוק את העניין.",
+ "report.unfollow": "הפסיקו לעקוב אחרי @{name}",
+ "report.unfollow_explanation": "אתם עוקבים אחרי החשבון הזה. כדי להפסיק לראות את הפרסומים שלו בפיד הבית שלכם, הפסיקו לעקוב אחריהם.",
"search.placeholder": "חיפוש",
"search_popout.search_format": "מבנה חיפוש מתקדם",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
@@ -433,111 +438,112 @@
"search_popout.tips.status": "status",
"search_popout.tips.text": "טקסט פשוט מחזיר כינויים, שמות משתמש והאשתגים",
"search_popout.tips.user": "משתמש(ת)",
- "search_results.accounts": "People",
- "search_results.all": "All",
- "search_results.hashtags": "Hashtags",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.accounts": "אנשים",
+ "search_results.all": "כל התוצאות",
+ "search_results.hashtags": "האשתגיות",
+ "search_results.nothing_found": "לא נמצא דבר עבור תנאי חיפוש אלה",
"search_results.statuses": "Toots",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {תוצאה} other {תוצאות}}",
- "status.admin_account": "Open moderation interface for @{name}",
+ "status.admin_account": "פתח/י ממשק ניהול עבור @{name}",
"status.admin_status": "Open this status in the moderation interface",
- "status.block": "Block @{name}",
- "status.bookmark": "Bookmark",
- "status.cancel_reblog_private": "Unboost",
+ "status.block": "חסימת @{name}",
+ "status.bookmark": "סימניה",
+ "status.cancel_reblog_private": "הסרת הדהוד",
"status.cannot_reblog": "לא ניתן להדהד הודעה זו",
- "status.copy": "Copy link to status",
+ "status.copy": "העתק/י קישור לפוסט זה",
"status.delete": "מחיקה",
- "status.detailed_status": "Detailed conversation view",
+ "status.detailed_status": "תצוגת שיחה מפורטת",
"status.direct": "הודעה ישירה ל@{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edit": "עריכה",
+ "status.edited": "נערך ב{date}",
+ "status.edited_x_times": "נערך {count, plural, one {פעם {count}} other {{count} פעמים}}",
"status.embed": "הטמעה",
"status.favourite": "חיבוב",
- "status.filtered": "Filtered",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.filtered": "סונן",
+ "status.history.created": "{name} יצר/ה {date}",
+ "status.history.edited": "{name} ערך/ה {date}",
"status.load_more": "עוד",
"status.media_hidden": "מדיה מוסתרת",
"status.mention": "פניה אל @{name}",
"status.more": "עוד",
- "status.mute": "Mute @{name}",
+ "status.mute": "להשתיק את @{name}",
"status.mute_conversation": "השתקת שיחה",
- "status.open": "הרחבת הודעה",
- "status.pin": "לקבע באודות",
+ "status.open": "הרחבת פוסט זה",
+ "status.pin": "הצמדה לפרופיל שלי",
"status.pinned": "Pinned toot",
- "status.read_more": "Read more",
+ "status.read_more": "לקרוא עוד",
"status.reblog": "הדהוד",
- "status.reblog_private": "Boost with original visibility",
+ "status.reblog_private": "להדהד ברמת הנראות המקורית",
"status.reblogged_by": "הודהד על ידי {name}",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
- "status.redraft": "Delete & re-draft",
- "status.remove_bookmark": "Remove bookmark",
+ "status.redraft": "מחיקה ועריכה מחדש",
+ "status.remove_bookmark": "הסרת סימניה",
"status.reply": "תגובה",
- "status.replyAll": "תגובה לכולם",
+ "status.replyAll": "תגובה לפתיל",
"status.report": "דיווח על @{name}",
"status.sensitive_warning": "תוכן רגיש",
"status.share": "שיתוף",
"status.show_less": "הראה פחות",
- "status.show_less_all": "Show less for all",
+ "status.show_less_all": "להציג פחות מהכל",
"status.show_more": "הראה יותר",
- "status.show_more_all": "Show more for all",
- "status.show_thread": "Show thread",
- "status.uncached_media_warning": "Not available",
+ "status.show_more_all": "להציג יותר מהכל",
+ "status.show_thread": "הצג כחלק מפתיל",
+ "status.uncached_media_warning": "לא זמין",
"status.unmute_conversation": "הסרת השתקת שיחה",
"status.unpin": "לשחרר מקיבוע באודות",
- "suggestions.dismiss": "Dismiss suggestion",
- "suggestions.header": "You might be interested in…",
- "tabs_bar.federated_timeline": "ציר זמן בין-קהילתי",
- "tabs_bar.home": "בבית",
- "tabs_bar.local_timeline": "ציר זמן מקומי",
+ "suggestions.dismiss": "להתעלם מהצעה",
+ "suggestions.header": "ייתכן שזה יעניין אותך…",
+ "tabs_bar.federated_timeline": "פיד כללי (בין-קהילתי)",
+ "tabs_bar.home": "פיד הבית",
+ "tabs_bar.local_timeline": "פיד שרת מקומי",
"tabs_bar.notifications": "התראות",
- "tabs_bar.search": "Search",
- "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
- "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
- "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
- "time_remaining.moments": "Moments remaining",
- "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
- "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
- "timeline_hint.resources.followers": "Followers",
- "timeline_hint.resources.follows": "Follows",
+ "tabs_bar.search": "חיפוש",
+ "time_remaining.days": "נותרו {number, plural, one {# יום} other {# ימים}}",
+ "time_remaining.hours": "נותרו {number, plural, one {# שעה} other {# שעות}}",
+ "time_remaining.minutes": "נותרו {number, plural, one {# דקה} other {# דקות}}",
+ "time_remaining.moments": "רגעים נותרו",
+ "time_remaining.seconds": "נותרו {number, plural, one {# שניה} other {# שניות}}",
+ "timeline_hint.remote_resource_not_displayed": "{resource} משרתים אחרים לא מוצגים.",
+ "timeline_hint.resources.followers": "עוקבים",
+ "timeline_hint.resources.follows": "נעקבים",
"timeline_hint.resources.statuses": "Older toots",
- "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
- "trends.trending_now": "Trending now",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} אחד/ת מדבר/ת} other {{counter} אנשים מדברים}}",
+ "trends.trending_now": "נושאים חמים",
"ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}K",
+ "units.short.billion": "{count} מליארד",
+ "units.short.million": "{count} מליון",
+ "units.short.thousand": "{count} אלפים",
"upload_area.title": "ניתן להעלות על ידי Drag & drop",
"upload_button.label": "הוספת מדיה",
- "upload_error.limit": "File upload limit exceeded.",
- "upload_error.poll": "File upload not allowed with polls.",
- "upload_form.audio_description": "Describe for people with hearing loss",
+ "upload_error.limit": "קובץ להעלאה חורג מנפח מותר.",
+ "upload_error.poll": "לא ניתן להעלות קובץ עם סקר.",
+ "upload_form.audio_description": "תאר/י עבור לקויי שמיעה",
"upload_form.description": "תיאור לכבדי ראיה",
- "upload_form.edit": "Edit",
- "upload_form.thumbnail": "Change thumbnail",
+ "upload_form.description_missing": "לא הוסף תיאור",
+ "upload_form.edit": "עריכה",
+ "upload_form.thumbnail": "שנה/י תמונה ממוזערת",
"upload_form.undo": "ביטול",
- "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
- "upload_modal.analyzing_picture": "Analyzing picture…",
- "upload_modal.apply": "Apply",
- "upload_modal.applying": "Applying…",
- "upload_modal.choose_image": "Choose image",
- "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
- "upload_modal.detect_text": "Detect text from picture",
- "upload_modal.edit_media": "Edit media",
- "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
- "upload_modal.preparing_ocr": "Preparing OCR…",
- "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_form.video_description": "תאר/י עבור לקויי שמיעה ולקויי ראייה",
+ "upload_modal.analyzing_picture": "מנתח תמונה…",
+ "upload_modal.apply": "החל",
+ "upload_modal.applying": "מחיל…",
+ "upload_modal.choose_image": "בחר/י תמונה",
+ "upload_modal.description_placeholder": "דג סקרן שט בים מאוכזב ולפתע מצא חברה",
+ "upload_modal.detect_text": "זהה טקסט מתמונה",
+ "upload_modal.edit_media": "עריכת מדיה",
+ "upload_modal.hint": "הקליקי או גררי את המעגל על גבי התצוגה המקדימה על מנת לבחור בנקודת המוקד שתראה תמיד בכל התמונות הממוזערות.",
+ "upload_modal.preparing_ocr": "מכין OCR…",
+ "upload_modal.preview_label": "תצוגה ({ratio})",
"upload_progress.label": "עולה...",
"video.close": "סגירת וידאו",
- "video.download": "Download file",
+ "video.download": "הורדת קובץ",
"video.exit_fullscreen": "יציאה ממסך מלא",
"video.expand": "להרחיב וידאו",
- "video.fullscreen": "Full screen",
+ "video.fullscreen": "מסך מלא",
"video.hide": "להסתיר וידאו",
"video.mute": "השתקת צליל",
- "video.pause": "Pause",
+ "video.pause": "השהיה",
"video.play": "ניגון",
"video.unmute": "החזרת צליל"
}
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 8a464f7ec..df0085067 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -9,21 +9,21 @@
"account.browse_more_on_origin_server": "मूल प्रोफ़ाइल पर अधिक ब्राउज़ करें",
"account.cancel_follow_request": "फ़ॉलो रिक्वेस्ट रद्द करें",
"account.direct": "प्रत्यक्ष संदेश @{name}",
- "account.disable_notifications": "Stop notifying me when @{name} posts",
+ "account.disable_notifications": "@{name} पोस्ट के लिए मुझे सूचित मत करो",
"account.domain_blocked": "छिपा हुआ डोमेन",
"account.edit_profile": "प्रोफ़ाइल संपादित करें",
- "account.enable_notifications": "Notify me when @{name} posts",
+ "account.enable_notifications": "जब @{name} पोस्ट मौजूद हो सूचित करें",
"account.endorse": "प्रोफ़ाइल पर दिखाए",
"account.follow": "फॉलो करें",
"account.followers": "फॉलोवर",
"account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है",
"account.followers_counter": "{count, plural, one {{counter} अनुगामी} other {{counter} समर्थक}}",
- "account.following": "Following",
+ "account.following": "फॉलोइंग",
"account.following_counter": "{count, plural, one {{counter} निम्नलिखित} other {{counter} निम्नलिखित}}",
"account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।",
"account.follows_you": "आपको फॉलो करता है",
"account.hide_reblogs": "@{name} के बूस्ट छुपाएं",
- "account.joined": "Joined {date}",
+ "account.joined": "शामिल हुये {date}",
"account.link_verified_on": "इस लिंक का स्वामित्व {date} को चेक किया गया था",
"account.locked_info": "यह खाता गोपनीयता स्थिति लॉक करने के लिए सेट है। मालिक मैन्युअल रूप से समीक्षा करता है कि कौन उनको फॉलो कर सकता है।",
"account.media": "मीडिया",
@@ -41,24 +41,24 @@
"account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}",
"account.unblock": "@{name} को अनब्लॉक करें",
"account.unblock_domain": "{domain} दिखाए",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "अनब्लॉक",
"account.unendorse": "प्रोफ़ाइल पर न दिखाए",
"account.unfollow": "अनफॉलो करें",
"account.unmute": "अनम्यूट @{name}",
"account.unmute_notifications": "@{name} के नोटिफिकेशन अनम्यूट करे",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "अनम्यूट",
"account_note.placeholder": "नोट्स जोड़ने के लिए क्लिक करें",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
+ "admin.dashboard.daily_retention": "साईन-अप के बाद उपयोगकर्ता के रिटेंशन दर",
+ "admin.dashboard.monthly_retention": "साईन-अप के बाद उपयोगकर्ता के महीने तक रिटेंशन दर",
+ "admin.dashboard.retention.average": "औसत",
+ "admin.dashboard.retention.cohort": "साईन-अप महिना",
+ "admin.dashboard.retention.cohort_size": "नये उपयोगकर्ता",
"alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें",
"alert.rate_limited.title": "सीमित दर",
"alert.unexpected.message": "एक अप्रत्याशित त्रुटि हुई है!",
"alert.unexpected.title": "उफ़!",
"announcement.announcement": "घोषणा",
- "attachments_list.unprocessed": "(unprocessed)",
+ "attachments_list.unprocessed": "(असंसाधित)",
"autosuggest_hashtag.per_week": "{count} हर सप्ताह",
"boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है",
"bundle_column_error.body": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "स्थानीय ही",
"community.column_settings.media_only": "सिर्फ़ मीडिया",
"community.column_settings.remote_only": "केवल सुदूर",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "और जानें",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "यह टूट् किसी भी हैशटैग के तहत सूचीबद्ध नहीं होगा क्योंकि यह अनलिस्टेड है। हैशटैग द्वारा केवल सार्वजनिक टूट्स खोजे जा सकते हैं।",
"compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।",
"compose_form.lock_disclaimer.lock": "लॉक्ड",
@@ -104,9 +106,9 @@
"compose_form.poll.remove_option": "इस विकल्प को हटाएँ",
"compose_form.poll.switch_to_multiple": "कई विकल्पों की अनुमति देने के लिए पोल बदलें",
"compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें",
- "compose_form.publish": "टूट्",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "परिवर्तनों को सहेजें",
"compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
"compose_form.sensitive.marked": "मीडिया संवेदनशील के रूप में चिह्नित है",
"compose_form.sensitive.unmarked": "मीडिया संवेदनशील के रूप में चिह्नित नहीं है",
@@ -121,8 +123,8 @@
"confirmations.delete.message": "क्या आप वाकई इस स्टेटस को हटाना चाहते हैं?",
"confirmations.delete_list.confirm": "मिटाए",
"confirmations.delete_list.message": "क्या आप वाकई इस लिस्ट को हमेशा के लिये मिटाना चाहते हैं?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.discard_edit_media.confirm": "डिस्कार्ड",
+ "confirmations.discard_edit_media.message": "लिस्ट में जोड़ें",
"confirmations.domain_block.confirm": "संपूर्ण डोमेन छिपाएं",
"confirmations.domain_block.message": "क्या आप वास्तव में, वास्तव में आप पूरे {domain} को ब्लॉक करना चाहते हैं? ज्यादातर मामलों में कुछ लक्षित ब्लॉक या म्यूट पर्याप्त और बेहतर हैं। आप किसी भी सार्वजनिक समय-सीमा या अपनी सूचनाओं में उस डोमेन की सामग्री नहीं देखेंगे। उस डोमेन से आपके फॉलोवर्स को हटा दिया जाएगा।",
"confirmations.logout.confirm": "लॉग आउट करें",
@@ -147,6 +149,7 @@
"embed.instructions": "अपने वेबसाइट पर, निचे दिए कोड को कॉपी करके, इस स्टेटस को एम्बेड करें",
"embed.preview": "यह ऐसा दिखेगा :",
"emoji_button.activity": "गतिविधि",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "निजीकृत",
"emoji_button.flags": "झंडे",
"emoji_button.food": "भोजन एवं पेय",
@@ -160,15 +163,15 @@
"emoji_button.search_results": "खोज परिणाम",
"emoji_button.symbols": "प्रतीक",
"emoji_button.travel": "यात्रा एवं स्थान",
- "empty_column.account_suspended": "Account suspended",
+ "empty_column.account_suspended": "खाता निलंबित",
"empty_column.account_timeline": "सन्नाटा! यहां कोई टूट्स नहीं!",
"empty_column.account_unavailable": "प्रोफाइल उपलब्ध नहीं",
"empty_column.blocks": "आप अभी तक किसी भी यूजर के द्वारा ब्लॉक्ड नहीं हो।",
"empty_column.bookmarked_statuses": "आपके पास अभी तक कोई बुकमार्क नहीं है। जब आप एक बुकमार्क करते हैं, तो यह यहां दिखाई देगा।",
"empty_column.community": "लोकल टाइम्लाइन खाली है, कुछ देखने के लिये सार्वजनिक रूप से कुछ लिखें!",
- "empty_column.direct": "आपके पास कोई सीधा सन्देश नहीं है, जब आप कोई भेजेंगे प्राप्त करेंगे तो यहाँ दिखेगा।",
+ "empty_column.direct": "आपके पास अभी तक कोई सीधा संदेश नहीं है, जब आप भेजेंगे या प्राप्त करेंगे तो ये यहाँ दिखेगा |",
"empty_column.domain_blocks": "अभी तक कोई छुपा हुआ डोमेन नहीं है।",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "कुछ भी अभी ट्रैंडिंग नहीं है, कुछ देर बाद जांचे!",
"empty_column.favourited_statuses": "आपके पास अभी कोई भी चहिता टूट नहीं है. जब आप किसी टूट को पसंद (स्टार) करेंगे, तब वो यहाँ दिखेगा।",
"empty_column.favourites": "अभी तक किसी ने भी इस टूट को पसंद (स्टार) नहीं किया है. जब भी कोई इसे पसंद करेगा, उनका नाम यहाँ दिखेगा।",
"empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "कंपोज़ टेक्स्ट-एरिया पर ध्यान केंद्रित करने के लिए",
"keyboard_shortcuts.description": "विवरण",
- "keyboard_shortcuts.direct": "सीधा सन्देश कॉलम को खोलने के लिए",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "सूची में शामिल करने के लिए",
"keyboard_shortcuts.enter": "स्टेटस खोलने के लिए",
"keyboard_shortcuts.favourite": "पसंदीदा के लिए",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "अगला",
"lightbox.previous": "पिछला",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "सूची से निकालें",
"lists.delete": "सूची हटाएँ",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "पुस्तकचिह्न:",
"navigation_bar.community_timeline": "लोकल टाइम्लाइन",
"navigation_bar.compose": "नया टूट् लिखें",
- "navigation_bar.direct": "सीधा संदेश",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "खोजें",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Adjust status privacy",
"privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "सीधा",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "सार्वजनिक टाइम्लाइन पर भेजें",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "सार्वजनिक",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "अनलिस्टेड",
"refresh": "रीफ्रेश करें",
"regeneration_indicator.label": "लोड हो रहा है...",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "संशोधन करें",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "मिटाए",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index bbe62cf38..1ed57960e 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -70,7 +70,7 @@
"column.blocks": "Blokirani korisnici",
"column.bookmarks": "Knjižne oznake",
"column.community": "Lokalna vremenska crta",
- "column.direct": "Izravne poruke",
+ "column.direct": "Direct messages",
"column.directory": "Pregledavanje profila",
"column.domain_blocks": "Blokirane domene",
"column.favourites": "Favoriti",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Samo lokalno",
"community.column_settings.media_only": "Samo medijski sadržaj",
"community.column_settings.remote_only": "Samo udaljeno",
- "compose_form.direct_message_warning": "Ovaj toot bit će poslan samo spomenutim korisnicima.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Saznajte više",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Ovaj toot neće biti prikazan ni pod jednim hashtagom jer je postavljen kao neprikazan. Samo javni tootovi mogu biti pretraživani pomoći hashtagova.",
"compose_form.lock_disclaimer": "Vaš račun nije {locked}. Svatko Vas može pratiti kako bi vidjeli objave namijenjene Vašim pratiteljima.",
"compose_form.lock_disclaimer.lock": "zaključan",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Ukloni ovu opciju",
"compose_form.poll.switch_to_multiple": "Omogući višestruki odabir opcija ankete",
"compose_form.poll.switch_to_single": "Omogući odabir samo jedne opcije ankete",
- "compose_form.publish": "Tootni",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Označi medijski sadržaj kao osjetljiv",
@@ -122,7 +124,7 @@
"confirmations.delete_list.confirm": "Obriši",
"confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?",
"confirmations.discard_edit_media.confirm": "Odbaciti",
- "confirmations.discard_edit_media.message": "Niste spremili promjene u opisu medija ili u predpregledu, svejedno ih odbaciti?",
+ "confirmations.discard_edit_media.message": "Postoje nespremljene promjene u opisu medija ili u pretpregledu, svejedno ih odbaciti?",
"confirmations.domain_block.confirm": "Blokiraj cijelu domenu",
"confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.",
"confirmations.logout.confirm": "Odjavi se",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Evo kako će izgledati:",
"emoji_button.activity": "Aktivnost",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Prilagođeno",
"emoji_button.flags": "Zastave",
"emoji_button.food": "Hrana i piće",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Još niste blokirali nikoga.",
"empty_column.bookmarked_statuses": "Još nemaš niti jedan označeni toot. Kada označiš jedan, prikazad će se ovdje.",
"empty_column.community": "Lokalna vremenska crta je prazna. Napišite nešto javno da biste pokrenuli stvari!",
- "empty_column.direct": "Nemate još niti jedne direktne poruke. Kada ih pošaljete ili primite, prikazati će se ovdje.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Još nema blokiranih domena.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "za fokusiranje na toot u jednom od stupaca",
"keyboard_shortcuts.compose": "za fokusiranje na tekstualni okvir za stvaranje",
"keyboard_shortcuts.description": "Opis",
- "keyboard_shortcuts.direct": "za otvaranje stupca s izravnim porukama",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "za pomak dolje na listi",
"keyboard_shortcuts.enter": "za otvaranje toota",
"keyboard_shortcuts.favourite": "za označavanje favoritom",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Sljedeće",
"lightbox.previous": "Prethodno",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Dodaj na listu",
"lists.account.remove": "Ukloni s liste",
"lists.delete": "Izbriši listu",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "Lokalna vremenska crta",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "Izravne poruke",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Istraživanje",
"navigation_bar.domain_blocks": "Blokirane domene",
"navigation_bar.edit_profile": "Uredi profil",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Ukloni anketu",
"privacy.change": "Podesi privatnost toota",
"privacy.direct.long": "Vidljivo samo spomenutim korisnicima",
- "privacy.direct.short": "Izravno",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Vidljivo samo pratiteljima",
- "privacy.private.short": "Samo pratitelji",
- "privacy.public.long": "Vidljivo svima, prikazano u javim vremenskim crtama",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Javno",
- "privacy.unlisted.long": "Vidljivo svima, ali se ne prikazuje u javnim vremenskim crtama",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Neprikazano",
"refresh": "Osvježi",
"regeneration_indicator.label": "Učitavanje…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Prijenos datoteka nije dopušten kod anketa.",
"upload_form.audio_description": "Opišite za ljude sa slabim sluhom",
"upload_form.description": "Opišite za ljude sa slabim vidom",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Uredi",
"upload_form.thumbnail": "Promijeni pretpregled",
"upload_form.undo": "Obriši",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index d121d6573..403e9edfe 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -86,14 +86,16 @@
"column_header.moveLeft_settings": "Oszlop elmozdítása balra",
"column_header.moveRight_settings": "Oszlop elmozdítása jobbra",
"column_header.pin": "Kitűzés",
- "column_header.show_settings": "Beállítások mutatása",
+ "column_header.show_settings": "Beállítások megjelenítése",
"column_header.unpin": "Kitűzés eltávolítása",
"column_subheading.settings": "Beállítások",
"community.column_settings.local_only": "Csak helyi",
"community.column_settings.media_only": "Csak média",
"community.column_settings.remote_only": "Csak távoli",
- "compose_form.direct_message_warning": "Ezt a bejegyzést csak a benne megemlített felhasználók láthatják majd.",
+ "compose.language.change": "Nyelv megváltoztatása",
+ "compose.language.search": "Nyelv keresése...",
"compose_form.direct_message_warning_learn_more": "Tudj meg többet",
+ "compose_form.encryption_warning": "A bejegyzések Mastodonon nem használnak végpontok közötti titkosítást. Ne ossz meg semmilyen érzékeny információt Mastodonon.",
"compose_form.hashtag_warning": "Ez a bejegyzésed nem fog megjelenni semmilyen hashtag alatt, mivel listázatlan. Csak a nyilvános bejegyzések kereshetők hashtaggel.",
"compose_form.lock_disclaimer": "A fiókod nincs {locked}. Bárki követni tud, hogy megtekintse a kizárólag követőknek szánt bejegyzéseket.",
"compose_form.lock_disclaimer.lock": "lezárva",
@@ -104,14 +106,14 @@
"compose_form.poll.remove_option": "Lehetőség törlése",
"compose_form.poll.switch_to_multiple": "Szavazás megváltoztatása több választásosra",
"compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra",
- "compose_form.publish": "Tülk",
+ "compose_form.publish": "Közzététel",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Módosítások mentése",
"compose_form.sensitive.hide": "{count, plural, one {Média kényesnek jelölése} other {Média kényesnek jelölése}}",
"compose_form.sensitive.marked": "{count, plural, one {A médiát kényesnek jelölték} other {A médiát kényesnek jelölték}}",
"compose_form.sensitive.unmarked": "{count, plural, one {A médiát nem jelölték kényesnek} other {A médiát nem jelölték kényesnek}}",
- "compose_form.spoiler.marked": "A szöveg figyelmeztetés mögé van rejtve",
- "compose_form.spoiler.unmarked": "A szöveg nem rejtett",
+ "compose_form.spoiler.marked": "Tartalmi figyelmeztetés törlése",
+ "compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása",
"compose_form.spoiler_placeholder": "Írd ide a figyelmeztetést",
"confirmation_modal.cancel": "Mégse",
"confirmations.block.block_and_report": "Letiltás és jelentés",
@@ -147,6 +149,7 @@
"embed.instructions": "Ágyazd be ezt a bejegyzést a weboldaladba az alábbi kód kimásolásával.",
"embed.preview": "Így fog kinézni:",
"emoji_button.activity": "Tevékenység",
+ "emoji_button.clear": "Törlés",
"emoji_button.custom": "Egyéni",
"emoji_button.flags": "Zászlók",
"emoji_button.food": "Étel és Ital",
@@ -219,9 +222,9 @@
"hashtag.column_settings.tag_toggle": "Új címkék felvétele ehhez az oszlophoz",
"home.column_settings.basic": "Alapvető",
"home.column_settings.show_reblogs": "Megtolások mutatása",
- "home.column_settings.show_replies": "Válaszok mutatása",
+ "home.column_settings.show_replies": "Válaszok megjelenítése",
"home.hide_announcements": "Közlemények elrejtése",
- "home.show_announcements": "Közlemények mutatása",
+ "home.show_announcements": "Közlemények megjelenítése",
"intervals.full.days": "{number, plural, one {# nap} other {# nap}}",
"intervals.full.hours": "{number, plural, one {# óra} other {# óra}}",
"intervals.full.minutes": "{number, plural, one {# perc} other {# perc}}",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Fókuszálás egy oszlopra",
"keyboard_shortcuts.compose": "fókuszálás a szerkesztési szövegdobozra",
"keyboard_shortcuts.description": "Leírás",
- "keyboard_shortcuts.direct": "Közvetlen üzenetek oszlopának megnyitása",
+ "keyboard_shortcuts.direct": "közvetlen üzenetek megnyitása",
"keyboard_shortcuts.down": "lefele navigálás a listában",
"keyboard_shortcuts.enter": "Bejegyzés megnyitása",
"keyboard_shortcuts.favourite": "Bejegyzés kedvencnek jelölése",
@@ -252,10 +255,10 @@
"keyboard_shortcuts.reply": "Válasz bejegyzésre",
"keyboard_shortcuts.requests": "követési kérések listájának megnyitása",
"keyboard_shortcuts.search": "fókuszálás a keresőre",
- "keyboard_shortcuts.spoilers": "CW mező mutatása/elrejtése",
+ "keyboard_shortcuts.spoilers": "Tartalmi figyelmeztetés mező megjelenítése/elrejtése",
"keyboard_shortcuts.start": "\"Első lépések\" megnyitása",
- "keyboard_shortcuts.toggle_hidden": "tartalmi figyelmeztetéssel ellátott szöveg mutatása/elrejtése",
- "keyboard_shortcuts.toggle_sensitivity": "média mutatása/elrejtése",
+ "keyboard_shortcuts.toggle_hidden": "Tartalmi figyelmeztetéssel ellátott szöveg megjelenítése/elrejtése",
+ "keyboard_shortcuts.toggle_sensitivity": "Média megjelenítése/elrejtése",
"keyboard_shortcuts.toot": "Új bejegyzés írása",
"keyboard_shortcuts.unfocus": "Szerkesztés/keresés fókuszból való kivétele",
"keyboard_shortcuts.up": "felfelé mozdítás a listában",
@@ -264,6 +267,8 @@
"lightbox.expand": "Képnézet kinagyítása",
"lightbox.next": "Következő",
"lightbox.previous": "Előző",
+ "limited_account_hint.action": "Mindenképpen mutassa a profilt",
+ "limited_account_hint.title": "Ezt a profilt a kiszolgálód moderátorai elrejtették.",
"lists.account.add": "Hozzáadás a listához",
"lists.account.remove": "Eltávolítás a listából",
"lists.delete": "Lista törlése",
@@ -324,7 +329,7 @@
"notifications.column_settings.admin.sign_up": "Új regisztrálók:",
"notifications.column_settings.alert": "Asztali értesítések",
"notifications.column_settings.favourite": "Kedvencek:",
- "notifications.column_settings.filter_bar.advanced": "Minden kategória mutatása",
+ "notifications.column_settings.filter_bar.advanced": "Minden kategória megjelenítése",
"notifications.column_settings.filter_bar.category": "Gyorskereső mező",
"notifications.column_settings.filter_bar.show_bar": "Szűrősáv mutatása",
"notifications.column_settings.follow": "Új követők:",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Szavazás törlése",
"privacy.change": "Bejegyzés láthatóságának módosítása",
"privacy.direct.long": "Csak a megemlített felhasználóknak látható",
- "privacy.direct.short": "Közvetlen",
+ "privacy.direct.short": "Csak megemlítetteknek",
"privacy.private.long": "Csak követőknek látható",
- "privacy.private.short": "Csak követőknek",
- "privacy.public.long": "Mindenki számára látható, nyilvános idővonalakon is szerepel",
+ "privacy.private.short": "Csak követők",
+ "privacy.public.long": "Mindenki számára látható",
"privacy.public.short": "Nyilvános",
- "privacy.unlisted.long": "Ne mutassuk nyilvános idővonalon",
+ "privacy.unlisted.long": "Mindenki számára látható, de kimarad a felfedezős funkciókból",
"privacy.unlisted.short": "Listázatlan",
"refresh": "Frissítés",
"regeneration_indicator.label": "Töltődik…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
"upload_form.audio_description": "Írja le a hallássérültek számára",
"upload_form.description": "Leírás látáskorlátozottak számára",
+ "upload_form.description_missing": "Nincs leírás megadva",
"upload_form.edit": "Szerkesztés",
"upload_form.thumbnail": "Előnézet megváltoztatása",
"upload_form.undo": "Törlés",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 2b7cdf5ac..7d80b18d8 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -18,8 +18,8 @@
"account.followers": "Հետեւողներ",
"account.followers.empty": "Այս օգտատիրոջը դեռ ոչ մէկ չի հետեւում։",
"account.followers_counter": "{count, plural, one {{counter} Հետեւորդ} other {{counter} Հետեւորդ}}",
- "account.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} հետեւած} other {{counter} հետեւած}}",
+ "account.following": "Հետեւած",
+ "account.following_counter": "{count, plural, one {{counter} Հետեւած} other {{counter} Հետեւած}}",
"account.follows.empty": "Այս օգտատէրը դեռ ոչ մէկի չի հետեւում։",
"account.follows_you": "Հետեւում է քեզ",
"account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {{counter} Գրառում} other {{counter} Գրառումներ}}",
"account.unblock": "Ապաարգելափակել @{name}֊ին",
"account.unblock_domain": "Ցուցադրել {domain} թաքցուած տիրոյթի գրառումները",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Արգելաբացել",
"account.unendorse": "Չցուցադրել անձնական էջում",
"account.unfollow": "Ապահետեւել",
"account.unmute": "Ապալռեցնել @{name}֊ին",
"account.unmute_notifications": "Միացնել ծանուցումները @{name}֊ից",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Ապախլացնել",
"account_note.placeholder": "Սեղմէ՛ք գրառելու համար\n",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
@@ -70,7 +70,7 @@
"column.blocks": "Արգելափակուած օգտատէրեր",
"column.bookmarks": "Էջանիշեր",
"column.community": "Տեղական հոսք",
- "column.direct": "Հասցէագրուած հաղորդագրութիւններ",
+ "column.direct": "Հասցէագրուած",
"column.directory": "Զննել անձնական էջերը",
"column.domain_blocks": "Թաքցուած տիրոյթները",
"column.favourites": "Հաւանածներ",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Միայն տեղական",
"community.column_settings.media_only": "Միայն մեդիա",
"community.column_settings.remote_only": "Միայն հեռակայ",
- "compose_form.direct_message_warning": "Այս գրառումը տեսանելի կը լինի միայն նշուած օգտատէրերին։",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Իմանալ աւելին",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Այս գրառումը չի հաշուառուի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարաւոր է որոնել պիտակներով։",
"compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
"compose_form.lock_disclaimer.lock": "փակ",
@@ -104,9 +106,9 @@
"compose_form.poll.remove_option": "Հեռացնել այս տարբերակը",
"compose_form.poll.switch_to_multiple": "Հարցումը դարձնել բազմակի ընտրութեամբ",
"compose_form.poll.switch_to_single": "Հարցումը դարձնել եզակի ընտրութեամբ",
- "compose_form.publish": "Հրապարակել",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "Հրապարակե՜լ",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "Պահպանել փոփոխութիւնները",
"compose_form.sensitive.hide": "Նշել մեդիան որպէս դիւրազգաց",
"compose_form.sensitive.marked": "Մեդիան նշուած է որպէս դիւրազգաց",
"compose_form.sensitive.unmarked": "Մեդիան նշուած չէ որպէս դիւրազգաց",
@@ -147,6 +149,7 @@
"embed.instructions": "Այս գրառումը քո կայքում ներդնելու համար կարող ես պատճէնել ներքեւի կոդը։",
"embed.preview": "Ահա, թէ ինչ տեսք կունենայ այն՝",
"emoji_button.activity": "Զբաղմունքներ",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Յատուկ",
"emoji_button.flags": "Դրօշներ",
"emoji_button.food": "Կերուխում",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Դու դեռ ոչ մէկի չես արգելափակել։",
"empty_column.bookmarked_statuses": "Դու դեռ չունես որեւէ էջանշուած գրառում։ Երբ էջանշես, դրանք կը երեւան այստեղ։",
"empty_column.community": "Տեղական հոսքը դատարկ է։ Հրապարակային մի բան գրի՛ր շարժիչը գործարկելու համար։",
- "empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն այստեղ կերեւայ։",
+ "empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն կերեւայ այստեղ։",
"empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած գրառում։ Երբ հաւանես, դրանք կերեւան այստեղ։",
@@ -187,12 +190,12 @@
"error.unexpected_crash.next_steps_addons": "Փորձիր անջատել յաւելուածները եւ թարմացնել էջը։ Եթե դա չօգնի, կարող ես օգտուել Մաստադոնից այլ դիտարկիչով կամ յաւելուածով։",
"errors.unexpected_crash.copy_stacktrace": "Պատճենել սթաքթրեյսը սեղմատախտակին",
"errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "Որոնման արդիւնքներ",
+ "explore.suggested_follows": "Ձեզ համար",
+ "explore.title": "Բացայայտել",
+ "explore.trending_links": "Նորութիւններ",
+ "explore.trending_statuses": "Գրառումներ",
+ "explore.trending_tags": "Պիտակներ",
"follow_recommendations.done": "Աւարտուած է",
"follow_recommendations.heading": "Հետեւիր այն մարդկանց, որոնց գրառումները կը ցանկանաս տեսնել։ Ահա մի քանի առաջարկ։",
"follow_recommendations.lead": "Քո հոսքում, ժամանակագրական դասաւորութեամբ կը տեսնես այն մարդկանց գրառումները, որոնց հետեւում ես։ Մի վախեցիր սխալուել, դու միշտ կարող ես հեշտութեամբ ապահետեւել մարդկանց։",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "սիւներից մէկի վրայ սեւեռուելու համար",
"keyboard_shortcuts.compose": "շարադրման տիրոյթին սեւեռուելու համար",
"keyboard_shortcuts.description": "Նկարագրութիւն",
- "keyboard_shortcuts.direct": "հասցէագրուած գրուածքների հոսքը բացելու համար",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "ցանկով ներքեւ շարժուելու համար",
"keyboard_shortcuts.enter": "Գրառումը բացելու համար",
"keyboard_shortcuts.favourite": "հաւանելու համար",
@@ -264,6 +267,8 @@
"lightbox.expand": "Բացել պատկերի դիտման պատուհանը",
"lightbox.next": "Յաջորդ",
"lightbox.previous": "Նախորդ",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Աւելացնել ցանկին",
"lists.account.remove": "Հանել ցանկից",
"lists.delete": "Ջնջել ցանկը",
@@ -290,11 +295,11 @@
"navigation_bar.bookmarks": "Էջանիշեր",
"navigation_bar.community_timeline": "Տեղական հոսք",
"navigation_bar.compose": "Ստեղծել նոր գրառում",
- "navigation_bar.direct": "Հասցէագրուած",
+ "navigation_bar.direct": "Հասցէագրուած նամակներ",
"navigation_bar.discover": "Բացայայտել",
"navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ",
"navigation_bar.edit_profile": "Խմբագրել անձնական էջը",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Բացայայտել",
"navigation_bar.favourites": "Հաւանածներ",
"navigation_bar.filters": "Լռեցուած բառեր",
"navigation_bar.follow_requests": "Հետեւելու հայցեր",
@@ -309,7 +314,7 @@
"navigation_bar.preferences": "Նախապատուութիւններ",
"navigation_bar.public_timeline": "Դաշնային հոսք",
"navigation_bar.security": "Անվտանգութիւն",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "{name}-ը գրանցուած է",
"notification.favourite": "{name} հաւանեց գրառումդ",
"notification.follow": "{name} սկսեց հետեւել քեզ",
"notification.follow_request": "{name} քեզ հետեւելու հայց է ուղարկել",
@@ -318,10 +323,10 @@
"notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։",
"notification.reblog": "{name} տարածեց գրառումդ",
"notification.status": "{name} հենց նոր գրառում արեց",
- "notification.update": "{name} edited a post",
+ "notification.update": "{name}-ը փոխել է գրառումը",
"notifications.clear": "Մաքրել ծանուցումները",
"notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապէս մաքրել քո բոլոր ծանուցումները։",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Նոր գրանցումներ՝",
"notifications.column_settings.alert": "Աշխատատիրոյթի ծանուցումներ",
"notifications.column_settings.favourite": "Հաւանածներից՝",
"notifications.column_settings.filter_bar.advanced": "Ցուցադրել բոլոր կատեգորիաները",
@@ -338,7 +343,7 @@
"notifications.column_settings.status": "Նոր գրառումներ։",
"notifications.column_settings.unread_notifications.category": "Չկարդացուած ծանուցումներ",
"notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Խմբագրածներ՝",
"notifications.filter.all": "Բոլորը",
"notifications.filter.boosts": "Տարածածները",
"notifications.filter.favourites": "Հաւանածները",
@@ -362,55 +367,55 @@
"poll.total_votes": "{count, plural, one {# ձայն} other {# ձայն}}",
"poll.vote": "Քուէարկել",
"poll.voted": "Դու քուէարկել ես այս տարբերակի համար",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# ձայն} other {# ձայն}}",
"poll_button.add_poll": "Աւելացնել հարցում",
"poll_button.remove_poll": "Հեռացնել հարցումը",
"privacy.change": "Կարգաւորել գրառման գաղտնիութիւնը",
"privacy.direct.long": "Կը տեսնեն միայն նշուած օգտատէրերը",
- "privacy.direct.short": "Հասցէագրուած",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Կը տեսնեն միայն հետեւորդները",
- "privacy.private.short": "Միայն հետեւողներին",
- "privacy.public.long": "Կը տեսնեն բոլոր, հրապարակային հոսքում",
+ "privacy.private.short": "Միայն հետեւողները",
+ "privacy.public.long": "Տեսանելի բոլորին",
"privacy.public.short": "Հրապարակային",
- "privacy.unlisted.long": "Կը տեսնեն բոլոր, բայց ոչ հրապարակային հոսքում",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Ծածուկ",
"refresh": "Թարմացնել",
"regeneration_indicator.label": "Բեռնւում է…",
"regeneration_indicator.sublabel": "պատրաստւում է հիմնական հոսքդ",
"relative_time.days": "{number}օր",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "{number, plural, one {# օր} other {# օր}} առաջ",
+ "relative_time.full.hours": "{number, plural, one {# ժամ} other {# ժամ}} առաջ",
+ "relative_time.full.just_now": "հէնց նոր",
+ "relative_time.full.minutes": "{number, plural, one {# րոպէ} other {# րոպէ}} առաջ",
+ "relative_time.full.seconds": "{number, plural, one {# վայրկեան} other {# վայրկեան}} առաջ",
"relative_time.hours": "{number}ժ",
"relative_time.just_now": "նոր",
"relative_time.minutes": "{number}ր",
"relative_time.seconds": "{number}վ",
"relative_time.today": "Այսօր",
"reply_indicator.cancel": "Չեղարկել",
- "report.block": "Block",
+ "report.block": "Արգելափակել",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
- "report.categories.spam": "Spam",
+ "report.categories.other": "Այլ",
+ "report.categories.spam": "Սպամ",
"report.categories.violation": "Content violates one or more server rules",
"report.category.subtitle": "Choose the best match",
"report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
+ "report.category.title_account": "հաշիւ",
+ "report.category.title_status": "գրառում",
+ "report.close": "Աւարտել",
"report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Փոխանցել {target}֊ին",
"report.forward_hint": "Այս հաշիւ այլ հանգոյցից է։ Ուղարկե՞մ այնտեղ էլ այս բողոքի անոնիմ պատճէնը։",
- "report.mute": "Mute",
+ "report.mute": "Լռեցնել",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.next": "Յաջորդ",
"report.placeholder": "Լրացուցիչ մեկնաբանութիւններ",
- "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike": "Ինձ դուր չի գալիս",
"report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
+ "report.reasons.other": "Այլ բան է",
"report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
+ "report.reasons.spam": "Սպամ է",
"report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
"report.reasons.violation": "It violates server rules",
"report.reasons.violation_description": "You are aware that it breaks specific rules",
@@ -500,7 +505,7 @@
"time_remaining.moments": "Մնացել է մի քանի վարկեան",
"time_remaining.seconds": "{number, plural, one {# վարկեան} other {# վարկեան}} անց",
"timeline_hint.remote_resource_not_displayed": "{resource} այլ սպասարկիչներից չեն ցուցադրվել:",
- "timeline_hint.resources.followers": "Հետևորդներ",
+ "timeline_hint.resources.followers": "Հետեւորդ",
"timeline_hint.resources.follows": "Հետեւել",
"timeline_hint.resources.statuses": "Հին գրառումներ",
"trends.counter_by_accounts": "{count, plural, one {{counter} մարդ} other {{counter} մարդիկ}} խօսում են",
@@ -515,6 +520,7 @@
"upload_error.poll": "Հարցումների հետ նիշք կցել հնարաւոր չէ։",
"upload_form.audio_description": "Նկարագրիր ձայնագրութեան բովանդակութիւնը լսողական խնդիրներով անձանց համար",
"upload_form.description": "Նկարագիր՝ տեսողական խնդիրներ ունեցողների համար",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Խմբագրել",
"upload_form.thumbnail": "Փոխել պատկերակը",
"upload_form.undo": "Յետարկել",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index ee7810379..10f80ee61 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Hanya lokal",
"community.column_settings.media_only": "Hanya media",
"community.column_settings.remote_only": "Hanya jarak jauh",
- "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
+ "compose.language.change": "Ganti bahasa",
+ "compose.language.search": "Telusuri bahasa...",
"compose_form.direct_message_warning_learn_more": "Pelajari selengkapnya",
+ "compose_form.encryption_warning": "Kiriman di Mastodon tidak dienkripsi end-to-end. Jangan bagikan informasi sensitif melalui Mastodon.",
"compose_form.hashtag_warning": "Toot ini tidak akan ada dalam daftar tagar manapun karena telah diatur sebagai tidak terdaftar. Hanya postingan publik yang bisa dicari dengan tagar.",
"compose_form.lock_disclaimer": "Akun anda tidak {locked}. Semua orang dapat mengikuti anda untuk melihat postingan khusus untuk pengikut anda.",
"compose_form.lock_disclaimer.lock": "terkunci",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Hapus opsi ini",
"compose_form.poll.switch_to_multiple": "Ubah japat menjadi pilihan ganda",
"compose_form.poll.switch_to_single": "Ubah japat menjadi pilihan tunggal",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Terbitkan",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Simpan perubahan",
"compose_form.sensitive.hide": "{count, plural, other {Tandai media sebagai sensitif}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Sematkan kiriman ini di website anda dengan menyalin kode di bawah ini.",
"embed.preview": "Tampilan akan seperti ini nantinya:",
"emoji_button.activity": "Aktivitas",
+ "emoji_button.clear": "Hapus",
"emoji_button.custom": "Kustom",
"emoji_button.flags": "Bendera",
"emoji_button.food": "Makanan & Minuman",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "untuk fokus kepada sebuah status di sebuah kolom",
"keyboard_shortcuts.compose": "untuk fokus ke area penulisan",
"keyboard_shortcuts.description": "Deskripsi",
- "keyboard_shortcuts.direct": "buka kolom pesan langsung",
+ "keyboard_shortcuts.direct": "untuk membuka kolom pesan langsung",
"keyboard_shortcuts.down": "untuk pindah ke bawah dalam sebuah daftar",
"keyboard_shortcuts.enter": "untuk membuka status",
"keyboard_shortcuts.favourite": "untuk memfavoritkan",
@@ -264,6 +267,8 @@
"lightbox.expand": "Besarkan kotak tampilan gambar",
"lightbox.next": "Selanjutnya",
"lightbox.previous": "Sebelumnya",
+ "limited_account_hint.action": "Tetap tampilkan profil",
+ "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator server Anda.",
"lists.account.add": "Tambah ke daftar",
"lists.account.remove": "Hapus dari daftar",
"lists.delete": "Hapus daftar",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Hapus japat",
"privacy.change": "Tentukan privasi status",
"privacy.direct.long": "Kirim hanya ke pengguna yang disebut",
- "privacy.direct.short": "Langsung",
+ "privacy.direct.short": "Orang yang disebutkan saja",
"privacy.private.long": "Kirim postingan hanya kepada pengikut",
- "privacy.private.short": "Pribadi",
- "privacy.public.long": "Kirim ke linimasa publik",
+ "privacy.private.short": "Pengikut saja",
+ "privacy.public.long": "Terlihat oleh semua",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "Tidak ditampilkan di linimasa publik",
+ "privacy.unlisted.long": "Terlihat oleh semua, tapi jangan tampilkan di fitur jelajah",
"privacy.unlisted.short": "Tak Terdaftar",
"refresh": "Segarkan",
"regeneration_indicator.label": "Memuat…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Unggah berkas tak diizinkan di japat ini.",
"upload_form.audio_description": "Penjelasan untuk orang dengan gangguan pendengaran",
"upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas",
+ "upload_form.description_missing": "Tidak ada deskripsi yang ditambahkan",
"upload_form.edit": "Sunting",
"upload_form.thumbnail": "Ubah gambar kecil",
"upload_form.undo": "Undo",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 77c6871a4..3eea9dcca 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -1,237 +1,240 @@
{
- "account.account_note_header": "Note",
- "account.add_or_remove_from_list": "Add or Remove from lists",
- "account.badges.bot": "Bot",
- "account.badges.group": "Group",
+ "account.account_note_header": "Noto",
+ "account.add_or_remove_from_list": "Insertez o removez de listi",
+ "account.badges.bot": "Boto",
+ "account.badges.group": "Grupo",
"account.block": "Blokusar @{name}",
"account.block_domain": "Hide everything from {domain}",
- "account.blocked": "Blocked",
- "account.browse_more_on_origin_server": "Browse more on the original profile",
- "account.cancel_follow_request": "Cancel follow request",
+ "account.blocked": "Restriktita",
+ "account.browse_more_on_origin_server": "Videz pluse che originala profilo",
+ "account.cancel_follow_request": "Removez sequodemando",
"account.direct": "Direct Message @{name}",
- "account.disable_notifications": "Stop notifying me when @{name} posts",
+ "account.disable_notifications": "Cesez avizar me kande @{name} postas",
"account.domain_blocked": "Domain hidden",
"account.edit_profile": "Modifikar profilo",
- "account.enable_notifications": "Notify me when @{name} posts",
- "account.endorse": "Feature on profile",
+ "account.enable_notifications": "Avizez me kande @{name} postas",
+ "account.endorse": "Traito di profilo",
"account.follow": "Sequar",
"account.followers": "Sequanti",
- "account.followers.empty": "No one follows this user yet.",
- "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
- "account.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.follows.empty": "This user doesn't follow anyone yet.",
+ "account.followers.empty": "Nulu sequas ca uzanto til nun.",
+ "account.followers_counter": "{count, plural, one {{counter} Sequanto} other {{counter} Sequanti}}",
+ "account.following": "Sequata",
+ "account.following_counter": "{count, plural, one {{counter} Sequas} other {{counter} Sequanti}}",
+ "account.follows.empty": "Ca uzanto ne sequa irgu til nun.",
"account.follows_you": "Sequas tu",
- "account.hide_reblogs": "Hide boosts from @{name}",
- "account.joined": "Joined {date}",
- "account.link_verified_on": "Ownership of this link was checked on {date}",
- "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
- "account.media": "Media",
+ "account.hide_reblogs": "Celez busti de @{name}",
+ "account.joined": "Juntas ye {date}",
+ "account.link_verified_on": "Proprieteso di ca ligilo kontrolesis ye {date}",
+ "account.locked_info": "La privatesostaco di ca konto fixesas quale lokata. Proprietato manue kontrolas personi qui povas sequar.",
+ "account.media": "Medio",
"account.mention": "Mencionar @{name}",
- "account.moved_to": "{name} has moved to:",
+ "account.moved_to": "{name} movesis a:",
"account.mute": "Celar @{name}",
- "account.mute_notifications": "Mute notifications from @{name}",
- "account.muted": "Muted",
+ "account.mute_notifications": "Silencigez avizi de @{name}",
+ "account.muted": "Silencigata",
"account.posts": "Mesaji",
- "account.posts_with_replies": "Toots with replies",
+ "account.posts_with_replies": "Posti e respondi",
"account.report": "Denuncar @{name}",
"account.requested": "Vartante aprobo",
- "account.share": "Share @{name}'s profile",
- "account.show_reblogs": "Show boosts from @{name}",
- "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+ "account.share": "Partigez profilo di @{name}",
+ "account.show_reblogs": "Montrez busti de @{name}",
+ "account.statuses_counter": "{count, plural, one {{counter} Posto} other {{counter} Posti}}",
"account.unblock": "Desblokusar @{name}",
"account.unblock_domain": "Unhide {domain}",
- "account.unblock_short": "Unblock",
- "account.unendorse": "Don't feature on profile",
+ "account.unblock_short": "Derestriktez",
+ "account.unendorse": "Ne publikigez che profilo",
"account.unfollow": "Ne plus sequar",
"account.unmute": "Ne plus celar @{name}",
- "account.unmute_notifications": "Unmute notifications from @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_notifications": "Desilencigez avizi de @{name}",
+ "account.unmute_short": "Desilencigez",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
- "admin.dashboard.retention.cohort": "Sign-up month",
- "admin.dashboard.retention.cohort_size": "New users",
- "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
- "alert.rate_limited.title": "Rate limited",
- "alert.unexpected.message": "An unexpected error occurred.",
- "alert.unexpected.title": "Oops!",
- "announcement.announcement": "Announcement",
- "attachments_list.unprocessed": "(unprocessed)",
- "autosuggest_hashtag.per_week": "{count} per week",
+ "admin.dashboard.daily_retention": "Dia uzantoretenseso pos registro",
+ "admin.dashboard.monthly_retention": "Monata uzantoreteneso pos registro",
+ "admin.dashboard.retention.average": "Averajo",
+ "admin.dashboard.retention.cohort": "Registromonato",
+ "admin.dashboard.retention.cohort_size": "Nova uzanti",
+ "alert.rate_limited.message": "Riprobez pos {retry_time, time, medium}.",
+ "alert.rate_limited.title": "Limitizita multeso",
+ "alert.unexpected.message": "Neexpektita eroro eventis.",
+ "alert.unexpected.title": "Problemo!",
+ "announcement.announcement": "Anunco",
+ "attachments_list.unprocessed": "(neprocedita)",
+ "autosuggest_hashtag.per_week": "{count} dum singla semano",
"boost_modal.combo": "Tu povas presar sur {combo} por omisar co en la venonta foyo",
- "bundle_column_error.body": "Something went wrong while loading this component.",
- "bundle_column_error.retry": "Try again",
- "bundle_column_error.title": "Network error",
- "bundle_modal_error.close": "Close",
- "bundle_modal_error.message": "Something went wrong while loading this component.",
- "bundle_modal_error.retry": "Try again",
+ "bundle_column_error.body": "Nulo ne functionis dum chargar ca kompozaj.",
+ "bundle_column_error.retry": "Probez itere",
+ "bundle_column_error.title": "Rederor",
+ "bundle_modal_error.close": "Klozez",
+ "bundle_modal_error.message": "Nulo ne functionis dum chargar ca kompozaj.",
+ "bundle_modal_error.retry": "Probez itere",
"column.blocks": "Blokusita uzeri",
- "column.bookmarks": "Bookmarks",
+ "column.bookmarks": "Libromarki",
"column.community": "Lokala tempolineo",
- "column.direct": "Direct messages",
- "column.directory": "Browse profiles",
+ "column.direct": "Direta mesaji",
+ "column.directory": "Videz profili",
"column.domain_blocks": "Hidden domains",
"column.favourites": "Favorati",
"column.follow_requests": "Demandi di sequado",
"column.home": "Hemo",
- "column.lists": "Lists",
+ "column.lists": "Listi",
"column.mutes": "Celita uzeri",
"column.notifications": "Savigi",
"column.pins": "Pinned toot",
"column.public": "Federata tempolineo",
"column_back_button.label": "Retro",
- "column_header.hide_settings": "Hide settings",
- "column_header.moveLeft_settings": "Move column to the left",
- "column_header.moveRight_settings": "Move column to the right",
- "column_header.pin": "Pin",
- "column_header.show_settings": "Show settings",
- "column_header.unpin": "Unpin",
- "column_subheading.settings": "Settings",
- "community.column_settings.local_only": "Local only",
+ "column_header.hide_settings": "Celez ajusti",
+ "column_header.moveLeft_settings": "Movez kolumno a la sinistro",
+ "column_header.moveRight_settings": "Movez kolumno a la dextro",
+ "column_header.pin": "Pinglagez",
+ "column_header.show_settings": "Montrez ajusti",
+ "column_header.unpin": "Depinglagez",
+ "column_subheading.settings": "Ajusti",
+ "community.column_settings.local_only": "Lokala nur",
"community.column_settings.media_only": "Media only",
- "community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
- "compose_form.direct_message_warning_learn_more": "Learn more",
+ "community.column_settings.remote_only": "Fora nur",
+ "compose.language.change": "Chanjez linguo",
+ "compose.language.search": "Trovez linguo...",
+ "compose_form.direct_message_warning_learn_more": "Lernez pluse",
+ "compose_form.encryption_warning": "Posti en Mastodon ne intersequante chifrigesas. Ne partigez irga privata informo che Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
- "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
- "compose_form.lock_disclaimer.lock": "locked",
+ "compose_form.lock_disclaimer": "Vua konto ne esas {locked}. Irgu povas sequar vu por vidar vua sequanto-nura posti.",
+ "compose_form.lock_disclaimer.lock": "klefagesas",
"compose_form.placeholder": "Quo esas en tua spirito?",
- "compose_form.poll.add_option": "Add a choice",
- "compose_form.poll.duration": "Poll duration",
- "compose_form.poll.option_placeholder": "Choice {number}",
- "compose_form.poll.remove_option": "Remove this choice",
- "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
- "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Siflar",
+ "compose_form.poll.add_option": "Insertez selekto",
+ "compose_form.poll.duration": "Votpostoduro",
+ "compose_form.poll.option_placeholder": "Selektato {number}",
+ "compose_form.poll.remove_option": "Efacez ca selektajo",
+ "compose_form.poll.switch_to_multiple": "Chanjez votposto por permisar multiselektaji",
+ "compose_form.poll.switch_to_single": "Chanjez votposto por permisar una selektajo",
+ "compose_form.publish": "Publikigez",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
- "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+ "compose_form.save_changes": "Sparez chanji",
+ "compose_form.sensitive.hide": "{count, plural,one {Markizez medii quale privata} other {Markizez medii quale privata}}",
+ "compose_form.sensitive.marked": "{count, plural,one {Medii markizesis quale privata} other {Medii markizesis quale privata}}",
+ "compose_form.sensitive.unmarked": "{count, plural,one {Medii ne markizesis quale privata} other {Medii ne markizesis quale privata}}",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
"compose_form.spoiler_placeholder": "Averto di kontenajo",
- "confirmation_modal.cancel": "Cancel",
- "confirmations.block.block_and_report": "Block & Report",
- "confirmations.block.confirm": "Block",
- "confirmations.block.message": "Are you sure you want to block {name}?",
- "confirmations.delete.confirm": "Delete",
+ "confirmation_modal.cancel": "Anulez",
+ "confirmations.block.block_and_report": "Restriktez e Raportizez",
+ "confirmations.block.confirm": "Restriktez",
+ "confirmations.block.message": "Ka vu certe volas restrikar {name}?",
+ "confirmations.delete.confirm": "Efacez",
"confirmations.delete.message": "Are you sure you want to delete this status?",
- "confirmations.delete_list.confirm": "Delete",
- "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
- "confirmations.discard_edit_media.confirm": "Discard",
- "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+ "confirmations.delete_list.confirm": "Efacez",
+ "confirmations.delete_list.message": "Ka vu certe volas netempale efacar ca listo?",
+ "confirmations.discard_edit_media.confirm": "Efacez",
+ "confirmations.discard_edit_media.message": "Vu havas nesparita chanji di mediodeskript o prevido, vu volas jus efacar?",
"confirmations.domain_block.confirm": "Hide entire domain",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
- "confirmations.logout.confirm": "Log out",
- "confirmations.logout.message": "Are you sure you want to log out?",
- "confirmations.mute.confirm": "Mute",
- "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
- "confirmations.mute.message": "Are you sure you want to mute {name}?",
- "confirmations.redraft.confirm": "Delete & redraft",
+ "confirmations.logout.confirm": "Ekirez",
+ "confirmations.logout.message": "Ka tu certe volas ekirar?",
+ "confirmations.mute.confirm": "Silencigez",
+ "confirmations.mute.explanation": "Co celigos posti de oli e posti quo mencionas oli, ma ol ankore permisas oli vidar vua posti e sequar vu.",
+ "confirmations.mute.message": "Ka vu certe volas silencigar {name}?",
+ "confirmations.redraft.confirm": "Efacez e riskisez",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
- "confirmations.reply.confirm": "Reply",
- "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
- "confirmations.unfollow.confirm": "Unfollow",
- "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
- "conversation.delete": "Delete conversation",
- "conversation.mark_as_read": "Mark as read",
- "conversation.open": "View conversation",
- "conversation.with": "With {names}",
- "directory.federated": "From known fediverse",
- "directory.local": "From {domain} only",
- "directory.new_arrivals": "New arrivals",
- "directory.recently_active": "Recently active",
+ "confirmations.reply.confirm": "Respondez",
+ "confirmations.reply.message": "Respondar nun remplos mesajo quon vu nun igas. Ka vu certe volas durar?",
+ "confirmations.unfollow.confirm": "Desequez",
+ "confirmations.unfollow.message": "Ka vu certe volas desequar {name}?",
+ "conversation.delete": "Efacez konverso",
+ "conversation.mark_as_read": "Markizez quale lektita",
+ "conversation.open": "Videz konverso",
+ "conversation.with": "Kun {names}",
+ "directory.federated": "De savita fediverso",
+ "directory.local": "De {domain} nur",
+ "directory.new_arrivals": "Nova venanti",
+ "directory.recently_active": "Recenta aktivo",
"embed.instructions": "Embed this status on your website by copying the code below.",
- "embed.preview": "Here is what it will look like:",
- "emoji_button.activity": "Activity",
- "emoji_button.custom": "Custom",
- "emoji_button.flags": "Flags",
- "emoji_button.food": "Food & Drink",
+ "embed.preview": "Co esas quon ol semblos tale:",
+ "emoji_button.activity": "Ago",
+ "emoji_button.clear": "Efacez",
+ "emoji_button.custom": "Kustumizato",
+ "emoji_button.flags": "Flagi",
+ "emoji_button.food": "Manjajo & Drinkajo",
"emoji_button.label": "Insertar emoji",
- "emoji_button.nature": "Nature",
- "emoji_button.not_found": "No matching emojis found",
- "emoji_button.objects": "Objects",
- "emoji_button.people": "People",
- "emoji_button.recent": "Frequently used",
- "emoji_button.search": "Search...",
- "emoji_button.search_results": "Search results",
- "emoji_button.symbols": "Symbols",
- "emoji_button.travel": "Travel & Places",
- "empty_column.account_suspended": "Account suspended",
+ "emoji_button.nature": "Naturo",
+ "emoji_button.not_found": "Nula tala parigata emojii",
+ "emoji_button.objects": "Kozi",
+ "emoji_button.people": "Personi",
+ "emoji_button.recent": "Ofta uzato",
+ "emoji_button.search": "Trovez...",
+ "emoji_button.search_results": "Trovuri",
+ "emoji_button.symbols": "Simboli",
+ "emoji_button.travel": "Vizito & Plasi",
+ "empty_column.account_suspended": "Konto restriktesis",
"empty_column.account_timeline": "No toots here!",
- "empty_column.account_unavailable": "Profile unavailable",
- "empty_column.blocks": "You haven't blocked any users yet.",
+ "empty_column.account_unavailable": "Profilo esas nedisponebla",
+ "empty_column.blocks": "Vu ne restriktis irga uzanti til nun.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "La lokala tempolineo esas vakua. Skribez ulo publike por iniciar la agiveso!",
- "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+ "empty_column.direct": "Vu ne havas irga direta mesaji til nun. Kande vu sendas o ganas, ol montresos hike.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "Nulo esas tendenca nun. Videz itere pose!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
- "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
- "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+ "empty_column.follow_recommendations": "Semblas tale nula sugestato povas facesar por vu. Vu povas probar trovar personi quon vu forsan konocas o exploras tendenca hashtagi.",
+ "empty_column.follow_requests": "Vu ne havas irga sequodemandi til nun. Kande vu ganas talo, ol montresos hike.",
"empty_column.hashtag": "Esas ankore nulo en ta gretovorto.",
- "empty_column.home": "Tu sequas ankore nulu. Vizitez {public} od uzez la serchilo por komencar e renkontrar altra uzeri.",
- "empty_column.home.suggestions": "See some suggestions",
+ "empty_column.home": "Vua hemtempolineo esas vakua! Sequez plu multa personi por plenigar lu. {suggestions}",
+ "empty_column.home.suggestions": "Videz ula sugestati",
"empty_column.list": "There is nothing in this list yet.",
- "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
- "empty_column.mutes": "You haven't muted any users yet.",
+ "empty_column.lists": "Vu ne havas irga listi til nun. Kande vu kreas talo, ol montresos hike.",
+ "empty_column.mutes": "Vu ne silencigis irga uzanti til nun.",
"empty_column.notifications": "Tu havas ankore nula savigo. Komunikez kun altri por debutar la konverso.",
"empty_column.public": "Esas nulo hike! Skribez ulo publike, o manuale sequez uzeri de altra instaluri por plenigar ol.",
- "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
- "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
- "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
- "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
- "errors.unexpected_crash.report_issue": "Report issue",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
- "follow_recommendations.done": "Done",
- "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
- "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+ "error.unexpected_crash.explanation": "Pro eroro en nia kodexo o vidilkonciliebloproblemo, ca pagino ne povas korekte montresar.",
+ "error.unexpected_crash.explanation_addons": "Ca pagino ne povas korekte montresar. Ca eroro posible kauzigesas vidilplusajo o automata tradukutensili.",
+ "error.unexpected_crash.next_steps": "Probez rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.",
+ "error.unexpected_crash.next_steps_addons": "Probez desaktivigar e rifreshar pagino. Se to ne helpas, vu forsan ankore povas uzar Mastodon per diferenta vidilo o provizita softwaro.",
+ "errors.unexpected_crash.copy_stacktrace": "Kopiez amastraso a klipplanko",
+ "errors.unexpected_crash.report_issue": "Reportigez problemo",
+ "explore.search_results": "Trovuri",
+ "explore.suggested_follows": "Por vu",
+ "explore.title": "Explorez",
+ "explore.trending_links": "Niuzi",
+ "explore.trending_statuses": "Posti",
+ "explore.trending_tags": "Hashtagi",
+ "follow_recommendations.done": "Fina",
+ "follow_recommendations.heading": "Sequez personi quo igas posti quon vu volas vidar! Hike esas ula sugestati.",
+ "follow_recommendations.lead": "Posti de personi quon vu sequas kronologiale montresos en vua hemniuzeto. Ne timas igar erori, vu povas desequar personi tam same facila irgatempe!",
"follow_request.authorize": "Yurizar",
"follow_request.reject": "Refuzar",
- "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
- "generic.saved": "Saved",
- "getting_started.developers": "Developers",
- "getting_started.directory": "Profile directory",
- "getting_started.documentation": "Documentation",
+ "follow_requests.unlocked_explanation": "Quankam vua konto ne klefklozesis, la {domain} laborero pensas ke vu forsan volas kontralar sequodemandi de ca konti manuale.",
+ "generic.saved": "Sparesis",
+ "getting_started.developers": "Developeri",
+ "getting_started.directory": "Profilcheflisto",
+ "getting_started.documentation": "Dokumentajo",
"getting_started.heading": "Debuto",
- "getting_started.invite": "Invite people",
+ "getting_started.invite": "Invitez personi",
"getting_started.open_source_notice": "Mastodon esas programaro kun apertita kodexo. Tu povas kontributar o signalar problemi en GitHub ye {github}.",
- "getting_started.security": "Security",
- "getting_started.terms": "Terms of service",
- "hashtag.column_header.tag_mode.all": "and {additional}",
- "hashtag.column_header.tag_mode.any": "or {additional}",
- "hashtag.column_header.tag_mode.none": "without {additional}",
- "hashtag.column_settings.select.no_options_message": "No suggestions found",
- "hashtag.column_settings.select.placeholder": "Enter hashtags…",
- "hashtag.column_settings.tag_mode.all": "All of these",
- "hashtag.column_settings.tag_mode.any": "Any of these",
- "hashtag.column_settings.tag_mode.none": "None of these",
+ "getting_started.security": "Kontoopcioni",
+ "getting_started.terms": "Servkondicioni",
+ "hashtag.column_header.tag_mode.all": "e {additional}",
+ "hashtag.column_header.tag_mode.any": "o {additional}",
+ "hashtag.column_header.tag_mode.none": "sen {additional}",
+ "hashtag.column_settings.select.no_options_message": "Nula sugestati",
+ "hashtag.column_settings.select.placeholder": "Insertez hashtagi…",
+ "hashtag.column_settings.tag_mode.all": "Omna co",
+ "hashtag.column_settings.tag_mode.any": "Irga co",
+ "hashtag.column_settings.tag_mode.none": "Nula co",
"hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"home.column_settings.basic": "Simpla",
"home.column_settings.show_reblogs": "Montrar repeti",
"home.column_settings.show_replies": "Montrar respondi",
- "home.hide_announcements": "Hide announcements",
- "home.show_announcements": "Show announcements",
- "intervals.full.days": "{number, plural, one {# day} other {# days}}",
- "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
- "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+ "home.hide_announcements": "Celez anunci",
+ "home.show_announcements": "Montrez anunci",
+ "intervals.full.days": "{number, plural, one {# dio} other {# dii}}",
+ "intervals.full.hours": "{number, plural, one {# horo} other {# hori}}",
+ "intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}",
"keyboard_shortcuts.back": "to navigate back",
"keyboard_shortcuts.blocked": "to open blocked users list",
"keyboard_shortcuts.boost": "to boost",
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "to focus the compose textarea",
- "keyboard_shortcuts.description": "Description",
- "keyboard_shortcuts.direct": "to open direct messages column",
+ "keyboard_shortcuts.description": "Deskripto",
+ "keyboard_shortcuts.direct": "apertar kolumno di direta mesaji",
"keyboard_shortcuts.down": "to move down in the list",
"keyboard_shortcuts.enter": "to open status",
"keyboard_shortcuts.favourite": "to favourite",
@@ -239,7 +242,7 @@
"keyboard_shortcuts.federated": "to open federated timeline",
"keyboard_shortcuts.heading": "Keyboard Shortcuts",
"keyboard_shortcuts.home": "to open home timeline",
- "keyboard_shortcuts.hotkey": "Hotkey",
+ "keyboard_shortcuts.hotkey": "Rapidklavo",
"keyboard_shortcuts.legend": "to display this legend",
"keyboard_shortcuts.local": "to open local timeline",
"keyboard_shortcuts.mention": "to mention author",
@@ -260,284 +263,287 @@
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
"keyboard_shortcuts.up": "to move up in the list",
"lightbox.close": "Klozar",
- "lightbox.compress": "Compress image view box",
- "lightbox.expand": "Expand image view box",
- "lightbox.next": "Next",
- "lightbox.previous": "Previous",
- "lists.account.add": "Add to list",
- "lists.account.remove": "Remove from list",
- "lists.delete": "Delete list",
- "lists.edit": "Edit list",
- "lists.edit.submit": "Change title",
- "lists.new.create": "Add list",
- "lists.new.title_placeholder": "New list title",
- "lists.replies_policy.followed": "Any followed user",
- "lists.replies_policy.list": "Members of the list",
- "lists.replies_policy.none": "No one",
- "lists.replies_policy.title": "Show replies to:",
- "lists.search": "Search among people you follow",
- "lists.subheading": "Your lists",
- "load_pending": "{count, plural, one {# new item} other {# new items}}",
+ "lightbox.compress": "Kompresez imajvidbuxo",
+ "lightbox.expand": "Expansez imajvidbuxo",
+ "lightbox.next": "Nexta",
+ "lightbox.previous": "Antea",
+ "limited_account_hint.action": "Jus montrez profilo",
+ "limited_account_hint.title": "Ca profilo celesas da jerero di vua servilo.",
+ "lists.account.add": "Insertez a listo",
+ "lists.account.remove": "Efacez de listo",
+ "lists.delete": "Efacez listo",
+ "lists.edit": "Modifikez listo",
+ "lists.edit.submit": "Chanjez titulo",
+ "lists.new.create": "Insertez listo",
+ "lists.new.title_placeholder": "Nova listotitulo",
+ "lists.replies_policy.followed": "Irga sequita uzanto",
+ "lists.replies_policy.list": "Membro di listo",
+ "lists.replies_policy.none": "Nulu",
+ "lists.replies_policy.title": "Montrez respondi a:",
+ "lists.search": "Trovez inter personi quon vu sequas",
+ "lists.subheading": "Vua listi",
+ "load_pending": "{count, plural, one {# nova kozo} other {# nova kozi}}",
"loading_indicator.label": "Kargante...",
"media_gallery.toggle_visible": "Chanjar videbleso",
"missing_indicator.label": "Ne trovita",
- "missing_indicator.sublabel": "This resource could not be found",
- "mute_modal.duration": "Duration",
- "mute_modal.hide_notifications": "Hide notifications from this user?",
- "mute_modal.indefinite": "Indefinite",
- "navigation_bar.apps": "Mobile apps",
+ "missing_indicator.sublabel": "Ca moyeno ne existas",
+ "mute_modal.duration": "Durado",
+ "mute_modal.hide_notifications": "Celez avizi de ca uzanto?",
+ "mute_modal.indefinite": "Nedefinitiva",
+ "navigation_bar.apps": "Smartfonsoftwari",
"navigation_bar.blocks": "Blokusita uzeri",
- "navigation_bar.bookmarks": "Bookmarks",
+ "navigation_bar.bookmarks": "Libromarki",
"navigation_bar.community_timeline": "Lokala tempolineo",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "Direct messages",
- "navigation_bar.discover": "Discover",
+ "navigation_bar.direct": "Direta mesaji",
+ "navigation_bar.discover": "Deskovrez",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "Modifikar profilo",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Explorez",
"navigation_bar.favourites": "Favorati",
- "navigation_bar.filters": "Muted words",
+ "navigation_bar.filters": "Silencigita vorti",
"navigation_bar.follow_requests": "Demandi di sequado",
- "navigation_bar.follows_and_followers": "Follows and followers",
+ "navigation_bar.follows_and_followers": "Sequati e sequanti",
"navigation_bar.info": "Detaloza informi",
- "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
- "navigation_bar.lists": "Lists",
+ "navigation_bar.keyboard_shortcuts": "Rapidklavi",
+ "navigation_bar.lists": "Listi",
"navigation_bar.logout": "Ekirar",
"navigation_bar.mutes": "Celita uzeri",
- "navigation_bar.personal": "Personal",
+ "navigation_bar.personal": "Personala",
"navigation_bar.pins": "Pinned toots",
"navigation_bar.preferences": "Preferi",
"navigation_bar.public_timeline": "Federata tempolineo",
- "navigation_bar.security": "Security",
- "notification.admin.sign_up": "{name} signed up",
+ "navigation_bar.security": "Sekureso",
+ "notification.admin.sign_up": "{name} registresis",
"notification.favourite": "{name} favorizis tua mesajo",
"notification.follow": "{name} sequeskis tu",
- "notification.follow_request": "{name} has requested to follow you",
+ "notification.follow_request": "{name} demandas sequar vu",
"notification.mention": "{name} mencionis tu",
- "notification.own_poll": "Your poll has ended",
- "notification.poll": "A poll you have voted in has ended",
+ "notification.own_poll": "Vua votposto finigis",
+ "notification.poll": "Votposto quo havas vua voto finigis",
"notification.reblog": "{name} repetis tua mesajo",
- "notification.status": "{name} just posted",
- "notification.update": "{name} edited a post",
+ "notification.status": "{name} nove postigis",
+ "notification.update": "{name} modifikis posto",
"notifications.clear": "Efacar savigi",
"notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
- "notifications.column_settings.alert": "Surtabla savigi",
+ "notifications.column_settings.admin.sign_up": "Nova registranti:",
+ "notifications.column_settings.alert": "Desktopavizi",
"notifications.column_settings.favourite": "Favorati:",
- "notifications.column_settings.filter_bar.advanced": "Display all categories",
- "notifications.column_settings.filter_bar.category": "Quick filter bar",
- "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+ "notifications.column_settings.filter_bar.advanced": "Montrez omna kategorii",
+ "notifications.column_settings.filter_bar.category": "Rapidfiltrobaro",
+ "notifications.column_settings.filter_bar.show_bar": "Montrez filtrobaro",
"notifications.column_settings.follow": "Nova sequanti:",
- "notifications.column_settings.follow_request": "New follow requests:",
+ "notifications.column_settings.follow_request": "Nova sequodemandi:",
"notifications.column_settings.mention": "Mencioni:",
- "notifications.column_settings.poll": "Poll results:",
- "notifications.column_settings.push": "Push notifications",
+ "notifications.column_settings.poll": "Votpostorezulti:",
+ "notifications.column_settings.push": "Pulsavizi",
"notifications.column_settings.reblog": "Repeti:",
"notifications.column_settings.show": "Montrar en kolumno",
"notifications.column_settings.sound": "Plear sono",
"notifications.column_settings.status": "New toots:",
- "notifications.column_settings.unread_notifications.category": "Unread notifications",
- "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
- "notifications.filter.all": "All",
- "notifications.filter.boosts": "Boosts",
- "notifications.filter.favourites": "Favourites",
- "notifications.filter.follows": "Follows",
- "notifications.filter.mentions": "Mentions",
- "notifications.filter.polls": "Poll results",
- "notifications.filter.statuses": "Updates from people you follow",
- "notifications.grant_permission": "Grant permission.",
- "notifications.group": "{count} notifications",
- "notifications.mark_as_read": "Mark every notification as read",
- "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
- "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
- "notifications_permission_banner.enable": "Enable desktop notifications",
- "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
- "notifications_permission_banner.title": "Never miss a thing",
- "picture_in_picture.restore": "Put it back",
- "poll.closed": "Closed",
- "poll.refresh": "Refresh",
- "poll.total_people": "{count, plural, one {# person} other {# people}}",
- "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
- "poll.vote": "Vote",
- "poll.voted": "You voted for this answer",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
- "poll_button.add_poll": "Add a poll",
- "poll_button.remove_poll": "Remove poll",
+ "notifications.column_settings.unread_notifications.category": "Nelektita avizi",
+ "notifications.column_settings.unread_notifications.highlight": "Briligez nelektita avizi",
+ "notifications.column_settings.update": "Modifikati:",
+ "notifications.filter.all": "Omna",
+ "notifications.filter.boosts": "Busti",
+ "notifications.filter.favourites": "Favorati",
+ "notifications.filter.follows": "Sequati",
+ "notifications.filter.mentions": "Mencioni",
+ "notifications.filter.polls": "Votpostorezulti",
+ "notifications.filter.statuses": "Novaji de personi quon vu sequas",
+ "notifications.grant_permission": "Donez permiso.",
+ "notifications.group": "{count} avizi",
+ "notifications.mark_as_read": "Markizez singla avizi quale lektita",
+ "notifications.permission_denied": "Desktopavizi esas nedisplonebla pro antea refuzita vidilpermisdemando",
+ "notifications.permission_denied_alert": "Desktopavizi ne povas aktivigesar pro ke vidilpermiso refuzesis",
+ "notifications.permission_required": "Desktopavizi esas nedisplonebla pro ke bezonata permiso ne donesis.",
+ "notifications_permission_banner.enable": "Aktivigez desktopavizi",
+ "notifications_permission_banner.how_to_control": "Por ganar avizi kande Mastodon ne esas apertita, aktivigez dekstopavizi. Vu povas precize regularar quale interakti facas deskstopavizi tra la supera {icon} butono pos oli aktivigesis.",
+ "notifications_permission_banner.title": "Irga kozo ne pasas vu",
+ "picture_in_picture.restore": "Retropozez",
+ "poll.closed": "Klozita",
+ "poll.refresh": "Rifreshez",
+ "poll.total_people": "{count, plural, one {# persono} other {# personi}}",
+ "poll.total_votes": "{count, plural, one {# voto} other {# voti}}",
+ "poll.vote": "Votez",
+ "poll.voted": "Vu ja votis ca respondo",
+ "poll.votes": "{votes, plural, one {# voto} other {# voti}}",
+ "poll_button.add_poll": "Insertez votposto",
+ "poll_button.remove_poll": "Efacez votposto",
"privacy.change": "Aranjar privateso di mesaji",
"privacy.direct.long": "Sendar nur a mencionata uzeri",
- "privacy.direct.short": "Direte",
+ "privacy.direct.short": "Mencionita personi nur",
"privacy.private.long": "Sendar nur a sequanti",
- "privacy.private.short": "Private",
- "privacy.public.long": "Sendar a publika tempolinei",
+ "privacy.private.short": "Sequanti nur",
+ "privacy.public.long": "Videbla da omnu",
"privacy.public.short": "Publike",
- "privacy.unlisted.long": "Ne montrar en publika tempolinei",
+ "privacy.unlisted.long": "Videbla da omnu ma voluntala ne inkluzas deskovrotraiti",
"privacy.unlisted.short": "Ne enlistigota",
- "refresh": "Refresh",
- "regeneration_indicator.label": "Loading…",
- "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+ "refresh": "Rifreshez",
+ "regeneration_indicator.label": "Chargas…",
+ "regeneration_indicator.sublabel": "Vua hemniuzeto preparesas!",
"relative_time.days": "{number}d",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "{number, plural, one {# dio} other {# dii}} ante nun",
+ "relative_time.full.hours": "{number, plural, one {# horo} other {# hori}} ante nun",
+ "relative_time.full.just_now": "jus nun",
+ "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minuti}} ante nun",
+ "relative_time.full.seconds": "{number, plural, one {# sekundo} other {# sekundi}} ante nun",
"relative_time.hours": "{number}h",
- "relative_time.just_now": "now",
+ "relative_time.just_now": "nun",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
- "relative_time.today": "today",
+ "relative_time.today": "hodie",
"reply_indicator.cancel": "Nihiligar",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
- "report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
- "report.forward": "Forward to {target}",
- "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.block": "Restriktez",
+ "report.block_explanation": "Vu ne vidos olia posti. Oli ne povas vidar vua posti o sequar vu. Oli savos ke oli restriktesis.",
+ "report.categories.other": "Altra",
+ "report.categories.spam": "Spamo",
+ "report.categories.violation": "Kontenaj nesequas servilregulo",
+ "report.category.subtitle": "Selektez maxim bona parigato",
+ "report.category.title": "Savigez ni pri quo eventas kun ca {type}",
+ "report.category.title_account": "profilo",
+ "report.category.title_status": "posto",
+ "report.close": "Fina",
+ "report.comment.title": "Ka altra irgo quon vu pensas ke ni debas savar?",
+ "report.forward": "Sendez a {target}",
+ "report.forward_hint": "La konto esas de altra servilo. Vu volas sendar raportkopiur sen nomo ibe anke?",
+ "report.mute": "Silencigez",
+ "report.mute_explanation": "Vu ne vidos olia posti. Oli povas ankore sequar vu e vidar vua posti e ne savar ke oli silencigesis.",
+ "report.next": "Nexta",
"report.placeholder": "Plusa komenti",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "Me ne amas",
+ "report.reasons.dislike_description": "Ol ne esas olo quon vu volas vidar",
+ "report.reasons.other": "Ol esas altra ulo",
+ "report.reasons.other_description": "La problemo ne fitas a altra kategorii",
+ "report.reasons.spam": "Ol esas spamo",
+ "report.reasons.spam_description": "Mala ligili, falsa interago o repetiva repliki",
+ "report.reasons.violation": "Ol nesequas servilreguli",
+ "report.reasons.violation_description": "Vu remarkas ke ol nesequas partikulara reguli",
+ "report.rules.subtitle": "Selektez relatata omno",
+ "report.rules.title": "Quala reguli nesequesas?",
+ "report.statuses.subtitle": "Selektez relatata omno",
+ "report.statuses.title": "Ka existas irga posti quo suportas ca raporto?",
"report.submit": "Sendar",
"report.target": "Denuncante",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Co esas vua opcioni por regularar quo vu vidas che Mastodon:",
+ "report.thanks.take_action_actionable": "Dum ke ni kontrolas co, vu povas demarshar kontra @{name}:",
+ "report.thanks.title": "Ka vu ne volas vidar co?",
+ "report.thanks.title_actionable": "Danko por raportizar, ni kontrolos co.",
+ "report.unfollow": "Desequez @{name}",
+ "report.unfollow_explanation": "Vu sequas ca konto. Por ne vidar olia posti en vua hemniuzeto pluse, desequez oli.",
"search.placeholder": "Serchez",
- "search_popout.search_format": "Advanced search format",
+ "search_popout.search_format": "Avancata trovformato",
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
- "search_popout.tips.hashtag": "hashtag",
+ "search_popout.tips.hashtag": "hashtago",
"search_popout.tips.status": "status",
- "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
- "search_popout.tips.user": "user",
- "search_results.accounts": "People",
- "search_results.all": "All",
- "search_results.hashtags": "Hashtags",
- "search_results.nothing_found": "Could not find anything for these search terms",
- "search_results.statuses": "Toots",
+ "search_popout.tips.text": "Simpla textoretrovenuri quo parigas trovnomi, uzantonomi e hashtagi",
+ "search_popout.tips.user": "uzanto",
+ "search_results.accounts": "Personi",
+ "search_results.all": "Omna",
+ "search_results.hashtags": "Hashtagi",
+ "search_results.nothing_found": "Ne povas ganar irgo per ca trovvorti",
+ "search_results.statuses": "Posti",
"search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
"search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}",
- "status.admin_account": "Open moderation interface for @{name}",
+ "status.admin_account": "Apertez jerintervizajo por @{name}",
"status.admin_status": "Open this status in the moderation interface",
- "status.block": "Block @{name}",
- "status.bookmark": "Bookmark",
- "status.cancel_reblog_private": "Unboost",
- "status.cannot_reblog": "This post cannot be boosted",
+ "status.block": "Restriktez @{name}",
+ "status.bookmark": "Libromarko",
+ "status.cancel_reblog_private": "Debustez",
+ "status.cannot_reblog": "Ca posto ne povas bustesas",
"status.copy": "Copy link to status",
"status.delete": "Efacar",
- "status.detailed_status": "Detailed conversation view",
- "status.direct": "Direct message @{name}",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
- "status.embed": "Embed",
+ "status.detailed_status": "Detala konversvido",
+ "status.direct": "Direta mesajigez @{name}",
+ "status.edit": "Modifikez",
+ "status.edited": "Modifikesis ye {date}",
+ "status.edited_x_times": "Modifikesis {count, plural, one {{count} foyo} other {{count} foyi}}",
+ "status.embed": "Eninsertez",
"status.favourite": "Favorizar",
- "status.filtered": "Filtered",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.filtered": "Filtrita",
+ "status.history.created": "{name} kreis ye {date}",
+ "status.history.edited": "{name} modifikis ye {date}",
"status.load_more": "Kargar pluse",
"status.media_hidden": "Kontenajo celita",
"status.mention": "Mencionar @{name}",
- "status.more": "More",
- "status.mute": "Mute @{name}",
- "status.mute_conversation": "Mute conversation",
+ "status.more": "Pluse",
+ "status.mute": "Silencigez @{name}",
+ "status.mute_conversation": "Silencigez konverso",
"status.open": "Detaligar ca mesajo",
- "status.pin": "Pin on profile",
+ "status.pin": "Pinglagez che profilo",
"status.pinned": "Pinned toot",
- "status.read_more": "Read more",
+ "status.read_more": "Lektez pluse",
"status.reblog": "Repetar",
- "status.reblog_private": "Boost with original visibility",
+ "status.reblog_private": "Bustez kun originala videbleso",
"status.reblogged_by": "{name} repetita",
"status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
- "status.redraft": "Delete & re-draft",
- "status.remove_bookmark": "Remove bookmark",
+ "status.redraft": "Efacez e riskisigez",
+ "status.remove_bookmark": "Efacez libromarko",
"status.reply": "Respondar",
"status.replyAll": "Respondar a filo",
"status.report": "Denuncar @{name}",
"status.sensitive_warning": "Trubliva kontenajo",
- "status.share": "Share",
+ "status.share": "Partigez",
"status.show_less": "Montrar mine",
- "status.show_less_all": "Show less for all",
+ "status.show_less_all": "Montrez min por omno",
"status.show_more": "Montrar plue",
- "status.show_more_all": "Show more for all",
- "status.show_thread": "Show thread",
- "status.uncached_media_warning": "Not available",
- "status.unmute_conversation": "Unmute conversation",
- "status.unpin": "Unpin from profile",
- "suggestions.dismiss": "Dismiss suggestion",
- "suggestions.header": "You might be interested in…",
+ "status.show_more_all": "Montrez pluse por omno",
+ "status.show_thread": "Montrez postaro",
+ "status.uncached_media_warning": "Nedisplonebla",
+ "status.unmute_conversation": "Desilencigez konverso",
+ "status.unpin": "Depinglagez de profilo",
+ "suggestions.dismiss": "Desklozez sugestajo",
+ "suggestions.header": "Vu forsan havas intereso pri…",
"tabs_bar.federated_timeline": "Federata",
"tabs_bar.home": "Hemo",
"tabs_bar.local_timeline": "Lokala",
"tabs_bar.notifications": "Savigi",
- "tabs_bar.search": "Search",
- "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
- "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
- "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
- "time_remaining.moments": "Moments remaining",
- "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
- "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
- "timeline_hint.resources.followers": "Followers",
- "timeline_hint.resources.follows": "Follows",
+ "tabs_bar.search": "Trovez",
+ "time_remaining.days": "{number, plural, one {# dio} other {# dii}} restas",
+ "time_remaining.hours": "{number, plural, one {# horo} other {# hori}} restas",
+ "time_remaining.minutes": "{number, plural, one {# minuto} other {# minuti}} restas",
+ "time_remaining.moments": "Poka sekundi restas",
+ "time_remaining.seconds": "{number, plural, one {# sekundo} other {# sekundi}} restas",
+ "timeline_hint.remote_resource_not_displayed": "{resource} de altra servili ne montresas.",
+ "timeline_hint.resources.followers": "Sequanti",
+ "timeline_hint.resources.follows": "Sequati",
"timeline_hint.resources.statuses": "Older toots",
- "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
- "trends.trending_now": "Trending now",
- "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
- "units.short.billion": "{count}B",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} persono} other {{counter} personi}} parolas",
+ "trends.trending_now": "Tendencigas nun",
+ "ui.beforeunload": "Vua skisato perdesos se vu ekiras Mastodon.",
+ "units.short.billion": "{count}G",
"units.short.million": "{count}M",
"units.short.thousand": "{count}K",
"upload_area.title": "Tranar faligar por kargar",
"upload_button.label": "Adjuntar kontenajo",
- "upload_error.limit": "File upload limit exceeded.",
- "upload_error.poll": "File upload not allowed with polls.",
- "upload_form.audio_description": "Describe for people with hearing loss",
- "upload_form.description": "Describe for the visually impaired",
- "upload_form.edit": "Edit",
- "upload_form.thumbnail": "Change thumbnail",
+ "upload_error.limit": "Failadcharglimito ecesesis.",
+ "upload_error.poll": "Failadchargo ne permisesas kun votposti.",
+ "upload_form.audio_description": "Deskriptez por personi kun audnekapableso",
+ "upload_form.description": "Deskriptez por personi kun vidnekapableso",
+ "upload_form.description_missing": "Deskriptajo ne insertesis",
+ "upload_form.edit": "Modifikez",
+ "upload_form.thumbnail": "Chanjez imajeto",
"upload_form.undo": "Desfacar",
- "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
- "upload_modal.analyzing_picture": "Analyzing picture…",
- "upload_modal.apply": "Apply",
- "upload_modal.applying": "Applying…",
- "upload_modal.choose_image": "Choose image",
- "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
- "upload_modal.detect_text": "Detect text from picture",
- "upload_modal.edit_media": "Edit media",
- "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
- "upload_modal.preparing_ocr": "Preparing OCR…",
- "upload_modal.preview_label": "Preview ({ratio})",
+ "upload_form.video_description": "Deskriptez por personi kun audnekapableso o vidnekapableso",
+ "upload_modal.analyzing_picture": "Analizas imajo…",
+ "upload_modal.apply": "Aplikez",
+ "upload_modal.applying": "Aplikas…",
+ "upload_modal.choose_image": "Selektez imajo",
+ "upload_modal.description_placeholder": "Rapida bruna foxo saltas super la indolenta hundo",
+ "upload_modal.detect_text": "Deskovrez texto de imajo",
+ "upload_modal.edit_media": "Modifikez medii",
+ "upload_modal.hint": "Kliktez o tirez cirklo che prevido por selektar centrala punto quo sempre montresas kun omna imajeti.",
+ "upload_modal.preparing_ocr": "Preparas OCR…",
+ "upload_modal.preview_label": "Previdez ({ratio})",
"upload_progress.label": "Kargante...",
- "video.close": "Close video",
- "video.download": "Download file",
- "video.exit_fullscreen": "Exit full screen",
- "video.expand": "Expand video",
- "video.fullscreen": "Full screen",
- "video.hide": "Hide video",
- "video.mute": "Mute sound",
- "video.pause": "Pause",
- "video.play": "Play",
- "video.unmute": "Unmute sound"
+ "video.close": "Klozez video",
+ "video.download": "Deschargez failo",
+ "video.exit_fullscreen": "Ekirez plena skreno",
+ "video.expand": "Expansez video",
+ "video.fullscreen": "Plena skreno",
+ "video.hide": "Celez video",
+ "video.mute": "Silencigez sono",
+ "video.pause": "Pauzez",
+ "video.play": "Pleez",
+ "video.unmute": "Desilencigez sono"
}
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index bf1b892e6..2cdf3c2c0 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -1,7 +1,7 @@
{
"account.account_note_header": "Minnispunktur",
"account.add_or_remove_from_list": "Bæta við eða fjarlægja af listum",
- "account.badges.bot": "Róbót",
+ "account.badges.bot": "Vélmenni",
"account.badges.group": "Hópur",
"account.block": "Loka á @{name}",
"account.block_domain": "Útiloka lénið {domain}",
@@ -31,7 +31,7 @@
"account.moved_to": "{name} hefur verið færður til:",
"account.mute": "Þagga niður í @{name}",
"account.mute_notifications": "Þagga tilkynningar frá @{name}",
- "account.muted": "Þaggað",
+ "account.muted": "Þaggaður",
"account.posts": "Færslur",
"account.posts_with_replies": "Færslur og svör",
"account.report": "Kæra @{name}",
@@ -71,7 +71,7 @@
"column.bookmarks": "Bókamerki",
"column.community": "Staðvær tímalína",
"column.direct": "Bein skilaboð",
- "column.directory": "Skoða notandasnið",
+ "column.directory": "Vafra notandasnið",
"column.domain_blocks": "Útilokuð lén",
"column.favourites": "Eftirlæti",
"column.follow_requests": "Beiðnir um að fylgjast með",
@@ -92,11 +92,13 @@
"community.column_settings.local_only": "Einungis staðvært",
"community.column_settings.media_only": "Einungis myndskrár",
"community.column_settings.remote_only": "Einungis fjartengt",
- "compose_form.direct_message_warning": "Þessi færsla verður aðeins send á notendur sem minnst er á.",
+ "compose.language.change": "Skipta um tungumál",
+ "compose.language.search": "Leita að tungumálum...",
"compose_form.direct_message_warning_learn_more": "Kanna nánar",
+ "compose_form.encryption_warning": "Færslur á Mastodon eru ekki enda-í-enda dulritaðar. Ekki deila viðkvæmum upplýsingum á Mastodon.",
"compose_form.hashtag_warning": "Þessi færsla verður ekki talin með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum færslum eftir myllumerkjum.",
- "compose_form.lock_disclaimer": "Aðgangurinn þinn er ekki {locked}. Hver sem er getur fylgst með þeim færslum þínum sem einungis eru til fylgjenda þinna.",
- "compose_form.lock_disclaimer.lock": "læst",
+ "compose_form.lock_disclaimer": "Aðgangurinn þinn er ekki {locked}. Hver sem er getur fylgst með þér til að sjá þær færslur sem einungis eru til fylgjenda þinna.",
+ "compose_form.lock_disclaimer.lock": "læstur",
"compose_form.placeholder": "Hvað varstu að hugsa?",
"compose_form.poll.add_option": "Bæta við valkosti",
"compose_form.poll.duration": "Tímalengd könnunar",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Fjarlægja þennan valkost",
"compose_form.poll.switch_to_multiple": "Breyta könnun svo hægt sé að hafa marga valkosti",
"compose_form.poll.switch_to_single": "Breyta könnun svo hægt sé að hafa einn stakan valkost",
- "compose_form.publish": "Tíst",
+ "compose_form.publish": "Birta",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Vista breytingar",
"compose_form.sensitive.hide": "{count, plural, one {Merkja mynd sem viðkvæma} other {Merkja myndir sem viðkvæmar}}",
@@ -130,7 +132,7 @@
"confirmations.mute.confirm": "Þagga",
"confirmations.mute.explanation": "Þetta mun fela færslur frá þeim og þær færslur þar sem minnst er á þau, en það mun samt sem áður gera þeim kleift að sjá færslurnar þínar og að fylgjast með þér.",
"confirmations.mute.message": "Ertu viss um að þú viljir þagga niður í {name}?",
- "confirmations.redraft.confirm": "Eyða og enduvinna drög",
+ "confirmations.redraft.confirm": "Eyða og endurvinna drög",
"confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.",
"confirmations.reply.confirm": "Svara",
"confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?",
@@ -147,7 +149,8 @@
"embed.instructions": "Felldu þessa færslu inn í vefsvæðið þitt með því að afrita kóðann hér fyrir neðan.",
"embed.preview": "Svona mun þetta líta út:",
"emoji_button.activity": "Virkni",
- "emoji_button.custom": "Sérsniðið",
+ "emoji_button.clear": "Hreinsa",
+ "emoji_button.custom": "Sérsniðin",
"emoji_button.flags": "Flögg",
"emoji_button.food": "Matur og drykkur",
"emoji_button.label": "Setja inn tjáningartákn",
@@ -155,7 +158,7 @@
"emoji_button.not_found": "Engin samsvarandi tjáningartákn fundust",
"emoji_button.objects": "Hlutir",
"emoji_button.people": "Fólk",
- "emoji_button.recent": "Oft notað",
+ "emoji_button.recent": "Oft notuð",
"emoji_button.search": "Leita...",
"emoji_button.search_results": "Leitarniðurstöður",
"emoji_button.symbols": "Tákn",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Setja virkni í dálk",
"keyboard_shortcuts.compose": "Setja virkni á textainnsetningarreit",
"keyboard_shortcuts.description": "Lýsing",
- "keyboard_shortcuts.direct": "Opna dálk með beinum skilaboðum",
+ "keyboard_shortcuts.direct": "að opna dálk með beinum skilaboðum",
"keyboard_shortcuts.down": "Fara neðar í listanum",
"keyboard_shortcuts.enter": "Opna færslu",
"keyboard_shortcuts.favourite": "Eftirlætisfærsla",
@@ -264,6 +267,8 @@
"lightbox.expand": "Fletta út myndskoðunarreit",
"lightbox.next": "Næsta",
"lightbox.previous": "Fyrra",
+ "limited_account_hint.action": "Birta notandasniðið samt",
+ "limited_account_hint.title": "Þetta notandasnið hefur verið falið af umsjónarmönnum netþjónsins þíns.",
"lists.account.add": "Bæta á lista",
"lists.account.remove": "Fjarlægja af lista",
"lists.delete": "Eyða lista",
@@ -315,7 +320,7 @@
"notification.follow_request": "{name} hefur beðið um að fylgjast með þér",
"notification.mention": "{name} minntist á þig",
"notification.own_poll": "Könnuninni þinni er lokið",
- "notification.poll": "Könnun sem þú tókst þátt í er lokið",
+ "notification.poll": "Könnun sem þú tókst þátt í er lokin",
"notification.reblog": "{name} endurbirti færsluna þína",
"notification.status": "{name} sendi inn rétt í þessu",
"notification.update": "{name} breytti færslu",
@@ -356,7 +361,7 @@
"notifications_permission_banner.how_to_control": "Til að taka á móti tilkynningum þegar Mastodon er ekki opið, skaltu virkja tilkynningar á skjáborði. Þegar þær eru orðnar virkar geturðu stýrt nákvæmlega hverskonar atvik framleiða tilkynningar með því að nota {icon}-hnappinn hér fyrir ofan.",
"notifications_permission_banner.title": "Aldrei missa af neinu",
"picture_in_picture.restore": "Setja til baka",
- "poll.closed": "Lokað",
+ "poll.closed": "Lokuð",
"poll.refresh": "Endurlesa",
"poll.total_people": "{count, plural, one {# aðili} other {# aðilar}}",
"poll.total_votes": "{count, plural, one {# atkvæði} other {# atkvæði}}",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Fjarlægja könnun",
"privacy.change": "Aðlaga gagnaleynd færslu",
"privacy.direct.long": "Senda einungis á notendur sem minnst er á",
- "privacy.direct.short": "Beint",
+ "privacy.direct.short": "Aðeins fólk sem minnst er á",
"privacy.private.long": "Senda einungis á fylgjendur",
"privacy.private.short": "Einungis fylgjendur",
- "privacy.public.long": "Senda á opinberar tímalínur",
+ "privacy.public.long": "Sýnilegt fyrir alla",
"privacy.public.short": "Opinbert",
- "privacy.unlisted.long": "Ekki senda á opinberar tímalínur",
+ "privacy.unlisted.long": "Sýnilegt öllum, en ekki tekið með í uppgötvunareiginleikum",
"privacy.unlisted.short": "Óskráð",
"refresh": "Endurlesa",
"regeneration_indicator.label": "Hleð inn…",
@@ -472,7 +477,7 @@
"status.reblog_private": "Endurbirta til upphaflegra lesenda",
"status.reblogged_by": "{name} endurbirti",
"status.reblogs.empty": "Enginn hefur ennþá endurbirt þessa færslu. Þegar einhver gerir það, mun það birtast hér.",
- "status.redraft": "Eyða og enduvinna drög",
+ "status.redraft": "Eyða og endurvinna drög",
"status.remove_bookmark": "Fjarlægja bókamerki",
"status.reply": "Svara",
"status.replyAll": "Svara þræði",
@@ -515,6 +520,7 @@
"upload_error.poll": "Innsending skráa er ekki leyfð í könnunum.",
"upload_form.audio_description": "Lýstu þessu fyrir heyrnarskerta",
"upload_form.description": "Lýstu þessu fyrir sjónskerta",
+ "upload_form.description_missing": "Engri lýsingu bætt við",
"upload_form.edit": "Breyta",
"upload_form.thumbnail": "Skipta um smámynd",
"upload_form.undo": "Eyða",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 1985450a5..d28316242 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Solo Locale",
"community.column_settings.media_only": "Solo Media",
"community.column_settings.remote_only": "Solo Remoto",
- "compose_form.direct_message_warning": "Questo post sarà inviato solo agli utenti menzionati.",
+ "compose.language.change": "Cambia lingua",
+ "compose.language.search": "Ricerca lingue...",
"compose_form.direct_message_warning_learn_more": "Scopri di più",
+ "compose_form.encryption_warning": "I messaggi su Mastodon non sono crittografati end-to-end. Non condividere dati sensibili su Mastodon.",
"compose_form.hashtag_warning": "Questo post non sarà elencato sotto alcun hashtag poiché senza elenco. Solo i toot pubblici possono essere ricercati per hashtag.",
"compose_form.lock_disclaimer": "Il tuo profilo non è {locked}. Chiunque può seguirti e vedere le tue pubblicazioni visibili solo dai follower.",
"compose_form.lock_disclaimer.lock": "bloccato",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Rimuovi questa scelta",
"compose_form.poll.switch_to_multiple": "Modifica sondaggio per consentire scelte multiple",
"compose_form.poll.switch_to_single": "Modifica sondaggio per consentire una singola scelta",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Pubblica",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Salva modifiche",
"compose_form.sensitive.hide": "Segna media come sensibile",
@@ -147,8 +149,9 @@
"embed.instructions": "Incorpora questo post sul tuo sito web copiando il codice sotto.",
"embed.preview": "Ecco come apparirà:",
"emoji_button.activity": "Attività",
+ "emoji_button.clear": "Cancella",
"emoji_button.custom": "Personalizzato",
- "emoji_button.flags": "Segnalazioni",
+ "emoji_button.flags": "Bandiere",
"emoji_button.food": "Cibo & Bevande",
"emoji_button.label": "Inserisci emoji",
"emoji_button.nature": "Natura",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Non hai ancora bloccato alcun utente.",
"empty_column.bookmarked_statuses": "Non hai ancora segnato alcun post. Quando ne segni uno, sarà mostrato qui.",
"empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!",
- "empty_column.direct": "Non hai ancora nessun messaggio privato. Quando ne manderai o riceverai qualcuno, apparirà qui.",
+ "empty_column.direct": "Non hai ancora nessun messaggio diretto. Quando ne manderai o riceverai qualcuno, apparirà qui.",
"empty_column.domain_blocks": "Non vi sono domini nascosti.",
"empty_column.explore_statuses": "Nulla è in tendenza in questo momento. Riprova più tardi!",
"empty_column.favourited_statuses": "Non hai ancora segnato nessun post come apprezzato. Quando lo farai, comparirà qui.",
@@ -264,6 +267,8 @@
"lightbox.expand": "Espandi casella di visualizzazione immagine",
"lightbox.next": "Successivo",
"lightbox.previous": "Precedente",
+ "limited_account_hint.action": "Mostra comunque il profilo",
+ "limited_account_hint.title": "Questo profilo è stato nascosto dai moderatori del tuo server.",
"lists.account.add": "Aggiungi alla lista",
"lists.account.remove": "Togli dalla lista",
"lists.delete": "Elimina lista",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Rimuovi sondaggio",
"privacy.change": "Modifica privacy del post",
"privacy.direct.long": "Invia solo a utenti menzionati",
- "privacy.direct.short": "Diretto in privato",
+ "privacy.direct.short": "Solo persone citate",
"privacy.private.long": "Invia solo ai follower",
- "privacy.private.short": "Privato",
- "privacy.public.long": "Invia alla timeline pubblica",
+ "privacy.private.short": "Solo i seguaci",
+ "privacy.public.long": "Visibile a tutti",
"privacy.public.short": "Pubblico",
- "privacy.unlisted.long": "Non mostrare sulla timeline pubblica",
+ "privacy.unlisted.long": "Visibile a tutti, ma escluso dalle funzioni di scoperta",
"privacy.unlisted.short": "Non elencato",
"refresh": "Aggiorna",
"regeneration_indicator.label": "Caricamento in corso…",
@@ -460,7 +465,7 @@
"status.history.edited": "{name} ha modificato {date}",
"status.load_more": "Mostra di più",
"status.media_hidden": "Allegato nascosto",
- "status.mention": "Nomina @{name}",
+ "status.mention": "Menziona @{name}",
"status.more": "Altro",
"status.mute": "Silenzia @{name}",
"status.mute_conversation": "Silenzia conversazione",
@@ -483,7 +488,7 @@
"status.show_less_all": "Mostra meno per tutti",
"status.show_more": "Mostra di più",
"status.show_more_all": "Mostra di più per tutti",
- "status.show_thread": "Mostra thread",
+ "status.show_thread": "Mostra conversazione",
"status.uncached_media_warning": "Non disponibile",
"status.unmute_conversation": "Annulla silenzia conversazione",
"status.unpin": "Non fissare in cima al profilo",
@@ -503,7 +508,7 @@
"timeline_hint.resources.followers": "Follower",
"timeline_hint.resources.follows": "Segue",
"timeline_hint.resources.statuses": "Post meno recenti",
- "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persone}} ne parla·no",
+ "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persone}} ne parlano",
"trends.trending_now": "Di tendenza ora",
"ui.beforeunload": "La bozza andrà persa se esci da Mastodon.",
"units.short.billion": "{count}G",
@@ -515,6 +520,7 @@
"upload_error.poll": "Caricamento file non consentito nei sondaggi.",
"upload_form.audio_description": "Descrizione per persone con difetti uditivi",
"upload_form.description": "Descrizione per utenti con disabilità visive",
+ "upload_form.description_missing": "Nessuna descrizione inserita",
"upload_form.edit": "Modifica",
"upload_form.thumbnail": "Cambia miniatura",
"upload_form.undo": "Cancella",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 4a388f92b..f5bf410e7 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -9,10 +9,10 @@
"account.browse_more_on_origin_server": "リモートで表示",
"account.cancel_follow_request": "フォローリクエストを取り消す",
"account.direct": "@{name}さんにダイレクトメッセージ",
- "account.disable_notifications": "@{name} の投稿時の通知を停止",
+ "account.disable_notifications": "@{name}さんの投稿時の通知を停止",
"account.domain_blocked": "ドメインブロック中",
"account.edit_profile": "プロフィール編集",
- "account.enable_notifications": "@{name} の投稿時に通知",
+ "account.enable_notifications": "@{name}さんの投稿時に通知",
"account.endorse": "プロフィールで紹介する",
"account.follow": "フォロー",
"account.followers": "フォロワー",
@@ -27,7 +27,7 @@
"account.link_verified_on": "このリンクの所有権は{date}に確認されました",
"account.locked_info": "このアカウントは承認制アカウントです。相手が承認するまでフォローは完了しません。",
"account.media": "メディア",
- "account.mention": "@{name}さんに投稿",
+ "account.mention": "@{name}さんにメンション",
"account.moved_to": "{name}さんは引っ越しました:",
"account.mute": "@{name}さんをミュート",
"account.mute_notifications": "@{name}さんからの通知を受け取らない",
@@ -96,8 +96,10 @@
"community.column_settings.local_only": "ローカルのみ表示",
"community.column_settings.media_only": "メディアのみ表示",
"community.column_settings.remote_only": "リモートのみ表示",
- "compose_form.direct_message_warning": "この投稿はメンションされた人にのみ送信されます。",
+ "compose.language.change": "言語を変更",
+ "compose.language.search": "言語を検索...",
"compose_form.direct_message_warning_learn_more": "もっと詳しく",
+ "compose_form.encryption_warning": "Mastodonの投稿はエンドツーエンド暗号化に対応していません。安全に送受信されるべき情報をMastodonで共有しないでください。",
"compose_form.hashtag_warning": "この投稿は公開設定ではないのでハッシュタグの一覧に表示されません。公開投稿だけがハッシュタグで検索できます。",
"compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。",
"compose_form.lock_disclaimer.lock": "承認制",
@@ -108,7 +110,7 @@
"compose_form.poll.remove_option": "この項目を削除",
"compose_form.poll.switch_to_multiple": "複数選択に変更",
"compose_form.poll.switch_to_single": "単一選択に変更",
- "compose_form.publish": "トゥート",
+ "compose_form.publish": "投稿",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "変更を保存",
"compose_form.sensitive.hide": "メディアを閲覧注意にする",
@@ -151,6 +153,7 @@
"embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。",
"embed.preview": "表示例:",
"emoji_button.activity": "活動",
+ "emoji_button.clear": "クリア",
"emoji_button.custom": "カスタム絵文字",
"emoji_button.flags": "国旗",
"emoji_button.food": "食べ物",
@@ -192,7 +195,7 @@
"errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
"errors.unexpected_crash.report_issue": "問題を報告",
"explore.search_results": "検索結果",
- "explore.suggested_follows": "あなたに",
+ "explore.suggested_follows": "おすすめ",
"explore.title": "エクスプローラー",
"explore.trending_links": "ニュース",
"explore.trending_statuses": "投稿",
@@ -202,18 +205,18 @@
"follow_recommendations.lead": "あなたがフォローしている人の投稿は、ホームフィードに時系列で表示されます。いつでも簡単に解除できるので、気軽にフォローしてみてください!",
"follow_request.authorize": "許可",
"follow_request.reject": "拒否",
- "follow_requests.unlocked_explanation": "あなたのアカウントは承認制ではありませんが、{domain} のスタッフはこれらのアカウントからのフォローリクエストの確認が必要であると判断しました。",
+ "follow_requests.unlocked_explanation": "あなたのアカウントは承認制ではありませんが、{domain}のスタッフはこれらのアカウントからのフォローリクエストの確認が必要であると判断しました。",
"generic.saved": "保存しました",
"getting_started.developers": "開発",
"getting_started.directory": "ディレクトリ",
"getting_started.documentation": "ドキュメント",
"getting_started.heading": "スタート",
"getting_started.invite": "招待",
- "getting_started.open_source_notice": "Mastodonはオープンソースソフトウェアです。誰でもGitHub ( {github} ) から開発に参加したり、問題を報告したりできます。",
+ "getting_started.open_source_notice": "Mastodonはオープンソースソフトウェアです。誰でもGitHub ({github}) から開発に参加したり、問題を報告したりできます。",
"getting_started.security": "アカウント設定",
"getting_started.terms": "プライバシーポリシー",
- "hashtag.column_header.tag_mode.all": "と {additional}",
- "hashtag.column_header.tag_mode.any": "か {additional}",
+ "hashtag.column_header.tag_mode.all": "と{additional}",
+ "hashtag.column_header.tag_mode.any": "か{additional}",
"hashtag.column_header.tag_mode.none": "({additional} を除く)",
"hashtag.column_settings.select.no_options_message": "提案はありません",
"hashtag.column_settings.select.placeholder": "ハッシュタグを入力してください…",
@@ -268,6 +271,8 @@
"lightbox.expand": "画像ビューボックスを開く",
"lightbox.next": "次",
"lightbox.previous": "前",
+ "limited_account_hint.action": "構わず表示する",
+ "limited_account_hint.title": "このプロフィールはサーバーのモデレーターによって非表示になっています。",
"lists.account.add": "リストに追加",
"lists.account.remove": "リストから外す",
"lists.delete": "リストを削除",
@@ -281,7 +286,7 @@
"lists.replies_policy.title": "リプライを表示:",
"lists.search": "フォローしている人の中から検索",
"lists.subheading": "あなたのリスト",
- "load_pending": "{count} 件の新着",
+ "load_pending": "{count}件の新着",
"loading_indicator.label": "読み込み中...",
"media_gallery.toggle_visible": "メディアを隠す",
"missing_indicator.label": "見つかりません",
@@ -304,7 +309,7 @@
"navigation_bar.follow_requests": "フォローリクエスト",
"navigation_bar.follows_and_followers": "フォロー・フォロワー",
"navigation_bar.info": "このサーバーについて",
- "navigation_bar.keyboard_shortcuts": "ホットキー",
+ "navigation_bar.keyboard_shortcuts": "キーボードショートカット",
"navigation_bar.lists": "リスト",
"navigation_bar.logout": "ログアウト",
"navigation_bar.mutes": "ミュートしたユーザー",
@@ -314,16 +319,16 @@
"navigation_bar.public_timeline": "連合タイムライン",
"navigation_bar.misc": "その他",
"navigation_bar.security": "セキュリティ",
- "notification.admin.sign_up": "{name} がサインアップしました",
+ "notification.admin.sign_up": "{name}さんがサインアップしました",
"notification.favourite": "{name}さんがあなたの投稿をお気に入りに登録しました",
"notification.follow": "{name}さんにフォローされました",
- "notification.follow_request": "{name} さんがあなたにフォローリクエストしました",
+ "notification.follow_request": "{name}さんがあなたにフォローリクエストしました",
"notification.mention": "{name}さんがあなたに返信しました",
"notification.own_poll": "アンケートが終了しました",
"notification.poll": "アンケートが終了しました",
"notification.reblog": "{name}さんがあなたの投稿をブーストしました",
"notification.status": "{name}さんが投稿しました",
- "notification.update": "{name} が投稿を編集しました",
+ "notification.update": "{name}さんが投稿を編集しました",
"notifications.clear": "通知を消去",
"notifications.clear_confirmation": "本当に通知を消去しますか?",
"notifications.column_settings.admin.sign_up": "新規登録:",
@@ -352,13 +357,13 @@
"notifications.filter.polls": "アンケート結果",
"notifications.filter.statuses": "フォローしている人の新着情報",
"notifications.grant_permission": "権限の付与",
- "notifications.group": "{count} 件の通知",
+ "notifications.group": "{count}件の通知",
"notifications.mark_as_read": "すべて既読にする",
"notifications.permission_denied": "ブラウザの通知が拒否されているためデスクトップ通知は利用できません",
"notifications.permission_denied_alert": "ブラウザの通知が拒否されているためデスクトップ通知を有効にできません",
"notifications.permission_required": "必要な権限が付与されていないため、デスクトップ通知は利用できません。",
"notifications_permission_banner.enable": "デスクトップ通知を有効にする",
- "notifications_permission_banner.how_to_control": "Mastodon を閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。",
+ "notifications_permission_banner.how_to_control": "Mastodonを閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。",
"notifications_permission_banner.title": "お見逃しなく",
"picture_in_picture.restore": "元に戻す",
"poll.closed": "終了",
@@ -371,23 +376,23 @@
"poll_button.add_poll": "アンケートを追加",
"poll_button.remove_poll": "アンケートを削除",
"privacy.change": "公開範囲を変更",
- "privacy.direct.long": "送信した相手のみ閲覧可",
- "privacy.direct.short": "ダイレクト",
+ "privacy.direct.long": "指定された相手のみ閲覧可",
+ "privacy.direct.short": "指定された相手のみ",
"privacy.private.long": "フォロワーのみ閲覧可",
- "privacy.private.short": "フォロワー限定",
- "privacy.public.long": "誰でも閲覧可、公開TLに表示",
+ "privacy.private.short": "フォロワーのみ",
+ "privacy.public.long": "誰でも閲覧可",
"privacy.public.short": "公開",
- "privacy.unlisted.long": "誰でも閲覧可、公開TLに非表示",
+ "privacy.unlisted.long": "誰でも閲覧可、サイレント",
"privacy.unlisted.short": "未収載",
"refresh": "更新",
"regeneration_indicator.label": "読み込み中…",
"regeneration_indicator.sublabel": "ホームタイムラインは準備中です!",
"relative_time.days": "{number}日前",
- "relative_time.full.days": "{number} 日前",
- "relative_time.full.hours": "{number} 時間前",
+ "relative_time.full.days": "{number}日前",
+ "relative_time.full.hours": "{number}時間前",
"relative_time.full.just_now": "今",
- "relative_time.full.minutes": "{number} 分前",
- "relative_time.full.seconds": "{number} 秒前",
+ "relative_time.full.minutes": "{number}分前",
+ "relative_time.full.seconds": "{number}秒前",
"relative_time.hours": "{number}時間前",
"relative_time.just_now": "今",
"relative_time.minutes": "{number}分前",
@@ -405,7 +410,7 @@
"report.category.title_status": "投稿",
"report.close": "完了",
"report.comment.title": "その他に私たちに伝えておくべき事はありますか?",
- "report.forward": "{target} に転送する",
+ "report.forward": "{target}に転送する",
"report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?",
"report.mute": "ミュート",
"report.mute_explanation": "相手の投稿は表示されなくなります。相手は引き続きあなたをフォローして、あなたの投稿を表示することができますが、ミュートされていることはわかりません。",
@@ -426,10 +431,10 @@
"report.submit": "通報する",
"report.target": "{target}さんを通報する",
"report.thanks.take_action": "次のような方法はいかがでしょうか?",
- "report.thanks.take_action_actionable": "私達が確認している間でも、あなたは @{name} さんに対して対応することが出来ます:",
+ "report.thanks.take_action_actionable": "私達が確認している間でも、あなたは@{name}さんに対して対応することが出来ます:",
"report.thanks.title": "見えないようにしたいですか?",
"report.thanks.title_actionable": "ご報告ありがとうございます、追って確認します。",
- "report.unfollow": "@{name}のフォローを解除",
+ "report.unfollow": "@{name}さんのフォローを解除",
"report.unfollow_explanation": "このアカウントをフォローしています。ホームフィードに彼らの投稿を表示しないようにするには、彼らのフォローを外してください。",
"search.placeholder": "検索",
"search_popout.search_format": "高度な検索フォーマット",
@@ -445,7 +450,7 @@
"search_results.statuses": "投稿",
"search_results.statuses_fts_disabled": "このサーバーでは投稿本文の検索は利用できません。",
"search_results.total": "{count, number}件の結果",
- "status.admin_account": "@{name} のモデレーション画面を開く",
+ "status.admin_account": "@{name}さんのモデレーション画面を開く",
"status.admin_status": "この投稿をモデレーション画面で開く",
"status.block": "@{name}さんをブロック",
"status.bookmark": "ブックマーク",
@@ -456,13 +461,13 @@
"status.detailed_status": "詳細な会話ビュー",
"status.direct": "@{name}さんにダイレクトメッセージ",
"status.edit": "編集",
- "status.edited": "{date} 編集済み",
- "status.edited_x_times": "{count} 回編集",
+ "status.edited": "{date}に編集",
+ "status.edited_x_times": "{count}回編集",
"status.embed": "埋め込み",
"status.favourite": "お気に入り",
"status.filtered": "フィルターされました",
- "status.history.created": "{name}さんが {date} に作成",
- "status.history.edited": "{name}さんが {date} に編集",
+ "status.history.created": "{name}さんが{date}に作成",
+ "status.history.edited": "{name}さんが{date}に編集",
"status.load_more": "もっと見る",
"status.media_hidden": "非表示のメディア",
"status.mention": "@{name}さんに投稿",
@@ -508,7 +513,7 @@
"timeline_hint.resources.followers": "フォロワー",
"timeline_hint.resources.follows": "フォロー",
"timeline_hint.resources.statuses": "以前の投稿",
- "trends.counter_by_accounts": "{counter} 人が投稿",
+ "trends.counter_by_accounts": "{counter}人が投稿",
"trends.trending_now": "トレンドタグ",
"ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。",
"units.short.billion": "{count}B",
@@ -518,8 +523,9 @@
"upload_button.label": "メディアを追加 (複数の画像または1つの動画か音声ファイル)",
"upload_error.limit": "アップロードできる上限を超えています。",
"upload_error.poll": "アンケートではファイルをアップロードできません。",
- "upload_form.audio_description": "聴取が難しいユーザーへの説明",
+ "upload_form.audio_description": "聴き取りが難しいユーザーへの説明",
"upload_form.description": "閲覧が難しいユーザーへの説明",
+ "upload_form.description_missing": "説明を追加していません",
"upload_form.edit": "編集",
"upload_form.thumbnail": "サムネイルを変更",
"upload_form.undo": "削除",
@@ -532,7 +538,7 @@
"upload_modal.detect_text": "画像からテキストを検出",
"upload_modal.edit_media": "メディアを編集",
"upload_modal.hint": "サムネイルの焦点にしたい場所をクリックするか円形の枠をその場所にドラッグしてください。",
- "upload_modal.preparing_ocr": "OCR の準備中…",
+ "upload_modal.preparing_ocr": "OCRの準備中…",
"upload_modal.preview_label": "プレビュー ({ratio})",
"upload_progress.label": "アップロード中...",
"video.close": "動画を閉じる",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index f6f3f1e10..d97673fc4 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -70,7 +70,7 @@
"column.blocks": "დაბლოკილი მომხმარებლები",
"column.bookmarks": "Bookmarks",
"column.community": "ლოკალური თაიმლაინი",
- "column.direct": "პირდაპირი წერილები",
+ "column.direct": "Direct messages",
"column.directory": "Browse profiles",
"column.domain_blocks": "დამალული დომენები",
"column.favourites": "ფავორიტები",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "მხოლოდ მედია",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "ეს ტუტი გაეგზავნება მხოლოდ ნახსენებ მომხმარებლებს.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "გაიგე მეტი",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "ეს ტუტი არ მოექცევა ჰეშტეგების ქვეს, რამეთუ ის არაა მითითებული. მხოლოდ ღია ტუტები მოიძებნება ჰეშტეგით.",
"compose_form.lock_disclaimer": "თქვენი ანგარიში არაა {locked}. ნებისმიერს შეიძლია გამოგყვეთ, რომ იხილოს თქვენი მიმდევრებზე გათვლილი პოსტები.",
"compose_form.lock_disclaimer.lock": "ჩაკეტილი",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "ტუტი",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "ეს სტატუსი ჩასვით თქვენს ვებ-საიტზე შემდეგი კოდის კოპირებით.",
"embed.preview": "ესაა თუ როგორც გამოჩნდება:",
"emoji_button.activity": "აქტივობა",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "პერსონალიზირებული",
"emoji_button.flags": "დროშები",
"emoji_button.food": "საჭმელი და სასლმელი",
@@ -166,7 +169,7 @@
"empty_column.blocks": "You haven't blocked any users yet.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "ლოკალური თაიმლაინი ცარიელია. დაწერეთ რაიმე ღიად ან ქენით რაიმე სხვა!",
- "empty_column.direct": "ჯერ პირდაპირი წერილები არ გაქვთ. როდესაც მიიღებთ ან გააგზავნით, გამოჩნდება აქ.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "There are no hidden domains yet.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "შემდეგი",
"lightbox.previous": "წინა",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "სიაში დამატება",
"lists.account.remove": "სიიდან ამოშლა",
"lists.delete": "სიის წაშლა",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "ლოკალური თაიმლაინი",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "პირდაპირი წერილები",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "აღმოაჩინე",
"navigation_bar.domain_blocks": "დამალული დომენები",
"navigation_bar.edit_profile": "შეცვალე პროფილი",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Remove poll",
"privacy.change": "სტატუსის კონფიდენციალურობის მითითება",
"privacy.direct.long": "დაიპოსტოს მხოლოდ დასახელებულ მომხმარებლებთან",
- "privacy.direct.short": "პირდაპირი",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "დაიპოსტოს მხოლოდ მიმდევრებთან",
- "privacy.private.short": "მხოლოდ-მიმდევრებისთვის",
- "privacy.public.long": "დაიპოსტოს საჯარო თაიმლაინებზე",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "საჯარო",
- "privacy.unlisted.long": "არ დაიპოსტოს საჯარო თაიმლაინებზე",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "ჩამოუთვლელი",
"refresh": "Refresh",
"regeneration_indicator.label": "იტვირთება…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "აღწერილობა ვიზუალურად უფასურისთვის",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "გაუქმება",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index d6fcc2c7b..b19bb8e49 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -70,7 +70,7 @@
"column.blocks": "Imiḍanen yettusḥebsen",
"column.bookmarks": "Ticraḍ",
"column.community": "Tasuddemt tadigant",
- "column.direct": "Iznan usriden",
+ "column.direct": "Direct messages",
"column.directory": "Inig deg imaɣnuten",
"column.domain_blocks": "Taɣulin yeffren",
"column.favourites": "Ismenyifen",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Adigan kan",
"community.column_settings.media_only": "Allal n teywalt kan",
"community.column_settings.remote_only": "Anmeggag kan",
- "compose_form.direct_message_warning": "Tajewwaqt-a ad d-tettwasken kan i yimseqdacen i d-yettwabedren.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Issin ugar",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Amiḍan-ik ur yelli ara {locked}. Menwala yezmer ad k-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik.",
"compose_form.lock_disclaimer.lock": "yettwacekkel",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Sfeḍ afran-agi",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Jewweq",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Sekles ibeddilen",
"compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri",
@@ -147,6 +149,7 @@
"embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.",
"embed.preview": "Akka ara d-iban:",
"emoji_button.activity": "Aqeddic",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Udmawan",
"emoji_button.flags": "Innayen",
"emoji_button.food": "Tegwella & Tissit",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.",
"empty_column.bookmarked_statuses": "Ulac tijewwaqin i terniḍ ɣer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.",
"empty_column.community": "Tasuddemt tazayezt tadigant n yisallen d tilemt. Aru ihi kra akken ad tt-teččareḍ!",
- "empty_column.direct": "Ulac ɣur-k ula yiwen n yizen usrid. Ad d-yettwasken da, ticki tuzneḍ neɣ teṭṭfeḍ-d yiwen.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Ulac kra n taɣult yettwaffren ar tura.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Ulac ula yiwet n tjewwaqt deg yismenyifen-ik ar tura. Ticki Tella-d yiwet, ad d-ban da.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.compose": "to focus the compose textarea",
"keyboard_shortcuts.description": "Aglam",
- "keyboard_shortcuts.direct": "akken ad teldiḍ ajgu n yiznan usriden",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "i kennu ɣer wadda n tebdart",
"keyboard_shortcuts.enter": "i tildin n tsuffeɣt",
"keyboard_shortcuts.favourite": "akken ad ternuḍ ɣer yismenyifen",
@@ -264,6 +267,8 @@
"lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna",
"lightbox.next": "Γer zdat",
"lightbox.previous": "Γer deffir",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Rnu ɣer tebdart",
"lists.account.remove": "Kkes seg tebdart",
"lists.delete": "Kkes tabdart",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Ticraḍ",
"navigation_bar.community_timeline": "Tasuddemt tadigant",
"navigation_bar.compose": "Aru tajewwiqt tamaynut",
- "navigation_bar.direct": "Iznan usridden",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Ẓer",
"navigation_bar.domain_blocks": "Tiɣula yeffren",
"navigation_bar.edit_profile": "Ẓreg amaɣnu",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Kkes asenqed",
"privacy.change": "Seggem tabaḍnit n yizen",
"privacy.direct.long": "Bḍu gar yimseqdacen i tbedreḍ kan",
- "privacy.direct.short": "Usrid",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Bḍu i yimeḍfaṛen-ik kan",
- "privacy.private.short": "Imeḍfaṛen kan",
- "privacy.public.long": "Bḍu deg tsuddemt tazayezt",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Azayez",
- "privacy.unlisted.long": "Ur beṭṭu ara deg tsuddemt tazayezt",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "War tabdert",
"refresh": "Smiren",
"regeneration_indicator.label": "Yessalay-d…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Ur ittusireg ara usali n ufaylu s tefranin.",
"upload_form.audio_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt",
"upload_form.description": "Glem-d i yemdaneni yesɛan ugur deg yiẓri",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Ẓreg",
"upload_form.thumbnail": "Beddel tugna",
"upload_form.undo": "Kkes",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 28156f956..1364311ac 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -70,7 +70,7 @@
"column.blocks": "Бұғатталғандар",
"column.bookmarks": "Бетбелгілер",
"column.community": "Жергілікті желі",
- "column.direct": "Жеке хаттар",
+ "column.direct": "Direct messages",
"column.directory": "Профильдерді аралау",
"column.domain_blocks": "Жасырылған домендер",
"column.favourites": "Таңдаулылар",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Тек жергілікті",
"community.column_settings.media_only": "Тек медиа",
"community.column_settings.remote_only": "Тек сыртқы",
- "compose_form.direct_message_warning": "Тек аталған қолданушыларға.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Көбірек білу",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Бұл пост іздеуде хэштегпен шықпайды, өйткені ол бәріне ашық емес. Тек ашық жазбаларды ғана хэштег арқылы іздеп табуға болады.",
"compose_form.lock_disclaimer": "Аккаунтыңыз {locked} емес. Кез келген адам жазылып, сізді оқи алады.",
"compose_form.lock_disclaimer.lock": "жабық",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Бұл жауапты өшір",
"compose_form.poll.switch_to_multiple": "Бірнеше жауап таңдайтындай қылу",
"compose_form.poll.switch_to_single": "Тек бір жауап таңдайтындай қылу",
- "compose_form.publish": "Түрт",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Сезімтал ретінде белгіле",
@@ -147,6 +149,7 @@
"embed.instructions": "Төмендегі кодты көшіріп алу арқылы жазбаны басқа сайттарға да орналастыра аласыз.",
"embed.preview": "Былай көрінетін болады:",
"emoji_button.activity": "Белсенділік",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Жеке",
"emoji_button.flags": "Тулар",
"emoji_button.food": "Тамақ",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Ешкімді бұғаттамағансыз.",
"empty_column.bookmarked_statuses": "Ешқандай жазба Бетбелгілер тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.",
"empty_column.community": "Жергілікті желі бос. Сіз бастап жазыңыз!",
- "empty_column.direct": "Әзірше дым хат жоқ. Өзіңіз жазып көріңіз алдымен.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Бұғатталған домен жоқ.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Ешқандай жазба 'Таңдаулылар' тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "бағандардағы жазбаны оқу",
"keyboard_shortcuts.compose": "пост жазу",
"keyboard_shortcuts.description": "Сипаттама",
- "keyboard_shortcuts.direct": "жеке хаттар бағаны",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "тізімде төмен түсу",
"keyboard_shortcuts.enter": "жазбаны ашу",
"keyboard_shortcuts.favourite": "таңдаулыға қосу",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Келесі",
"lightbox.previous": "Алдыңғы",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Тізімге қосу",
"lists.account.remove": "Тізімнен шығару",
"lists.delete": "Тізімді өшіру",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Бетбелгілер",
"navigation_bar.community_timeline": "Жергілікті желі",
"navigation_bar.compose": "Жаңа жазба бастау",
- "navigation_bar.direct": "Жеке хаттар",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "шарлау",
"navigation_bar.domain_blocks": "Жабық домендер",
"navigation_bar.edit_profile": "Профиль түзету",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Сауалнаманы өшіру",
"privacy.change": "Құпиялылықты реттеу",
"privacy.direct.long": "Аталған адамдарға ғана көрінетін жазба",
- "privacy.direct.short": "Тікелей",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Тек оқырмандарға арналған жазба",
- "privacy.private.short": "Оқырмандарға ғана",
- "privacy.public.long": "Ашық желіге жібер",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Ашық",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Тізімсіз",
"refresh": "Жаңарту",
"regeneration_indicator.label": "Жүктеу…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Сауалнамамен бірге файл жүктеуге болмайды.",
"upload_form.audio_description": "Есту қабілеті нашар адамдарға сипаттама беріңіз",
"upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Түзету",
"upload_form.thumbnail": "Суретті өзгерту",
"upload_form.undo": "Өшіру",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 450944dca..630431d39 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Post to public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 454b3977a..34fabbacf 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -3,7 +3,7 @@
"account.add_or_remove_from_list": "리스트에 추가 혹은 삭제",
"account.badges.bot": "봇",
"account.badges.group": "그룹",
- "account.block": "@{name}을 차단",
+ "account.block": "@{name} 차단",
"account.block_domain": "도메인 {domain}을 차단",
"account.blocked": "차단됨",
"account.browse_more_on_origin_server": "원본 프로필에서 더 탐색하기",
@@ -16,11 +16,11 @@
"account.endorse": "프로필에 추천하기",
"account.follow": "팔로우",
"account.followers": "팔로워",
- "account.followers.empty": "아직 아무도 이 유저를 팔로우하고 있지 않습니다.",
+ "account.followers.empty": "아직 아무도 이 사용자를 팔로우하고 있지 않습니다.",
"account.followers_counter": "{counter} 팔로워",
"account.following": "팔로잉",
"account.following_counter": "{counter} 팔로잉",
- "account.follows.empty": "이 유저는 아직 아무도 팔로우하고 있지 않습니다.",
+ "account.follows.empty": "이 사용자는 아직 아무도 팔로우하고 있지 않습니다.",
"account.follows_you": "날 팔로우합니다",
"account.hide_reblogs": "@{name}의 부스트를 숨기기",
"account.joined": "{date}에 가입함",
@@ -28,7 +28,7 @@
"account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로워를 승인합니다.",
"account.media": "미디어",
"account.mention": "@{name}에게 글쓰기",
- "account.moved_to": "{name}는 계정을 이동했습니다:",
+ "account.moved_to": "{name} 님은 계정을 이동했습니다:",
"account.mute": "@{name} 뮤트",
"account.mute_notifications": "@{name}의 알림을 뮤트",
"account.muted": "뮤트 됨",
@@ -73,7 +73,7 @@
"column.direct": "다이렉트 메시지",
"column.directory": "프로필 둘러보기",
"column.domain_blocks": "차단한 도메인",
- "column.favourites": "즐겨찾기",
+ "column.favourites": "좋아요",
"column.follow_requests": "팔로우 요청",
"column.home": "홈",
"column.lists": "리스트",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "로컬만",
"community.column_settings.media_only": "미디어만",
"community.column_settings.remote_only": "원격만",
- "compose_form.direct_message_warning": "이 게시물은 멘션 된 유저들에게만 보여집니다.",
+ "compose.language.change": "언어 변경",
+ "compose.language.search": "언어 검색...",
"compose_form.direct_message_warning_learn_more": "더 알아보기",
+ "compose_form.encryption_warning": "마스토돈의 게시물들은 종단간 암호화가 되지 않습니다. 민감한 정보를 마스토돈을 통해 전달하지 마세요.",
"compose_form.hashtag_warning": "이 게시물은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 게시물만이 해시태그로 검색 될 수 있습니다.",
"compose_form.lock_disclaimer": "이 계정은 {locked}로 설정 되어 있지 않습니다. 누구나 이 계정을 팔로우 할 수 있으며, 팔로워 공개의 포스팅을 볼 수 있습니다.",
"compose_form.lock_disclaimer.lock": "비공개",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "이 항목 삭제",
"compose_form.poll.switch_to_multiple": "다중 선택이 가능한 투표로 변경",
"compose_form.poll.switch_to_single": "단일 선택 투표로 변경",
- "compose_form.publish": "뿌우",
+ "compose_form.publish": "게시",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "변경사항 저장",
"compose_form.sensitive.hide": "미디어를 민감함으로 설정하기",
@@ -128,10 +130,10 @@
"confirmations.logout.confirm": "로그아웃",
"confirmations.logout.message": "정말로 로그아웃 하시겠습니까?",
"confirmations.mute.confirm": "뮤트",
- "confirmations.mute.explanation": "이 동작은 그의 게시물, 그를 멘션하는 게시물을 숨깁니다, 하지만 여전히 그가 당신의 게시물을 보고 팔로우 할 수 있습니다.",
+ "confirmations.mute.explanation": "이 동작은 해당 계정의 게시물과 해당 계정을 멘션하는 게시물을 숨깁니다, 하지만 여전히 해당 계정이 당신의 게시물을 보고 팔로우 할 수 있습니다.",
"confirmations.mute.message": "정말로 {name}를 뮤트하시겠습니까?",
"confirmations.redraft.confirm": "삭제하고 다시 쓰기",
- "confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 포스트에 대한 부스트와 즐겨찾기를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.",
+ "confirmations.redraft.message": "정말로 이 게시물을 삭제하고 다시 쓰시겠습니까? 해당 게시물에 대한 부스트와 좋아요를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.",
"confirmations.reply.confirm": "답글",
"confirmations.reply.message": "답글을 달기 위해 현재 작성 중인 메시지가 덮어 씌워집니다. 진행하시겠습니까?",
"confirmations.unfollow.confirm": "팔로우 해제",
@@ -140,13 +142,14 @@
"conversation.mark_as_read": "읽은 상태로 표시",
"conversation.open": "대화 보기",
"conversation.with": "{names} 님과",
- "directory.federated": "알려진 별무리로부터",
+ "directory.federated": "알려진 연합우주로부터",
"directory.local": "{domain}에서만",
"directory.new_arrivals": "새로운 사람들",
"directory.recently_active": "최근 활동",
"embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.",
"embed.preview": "다음과 같이 표시됩니다:",
"emoji_button.activity": "활동",
+ "emoji_button.clear": "지우기",
"emoji_button.custom": "커스텀",
"emoji_button.flags": "깃발",
"emoji_button.food": "음식과 마실것",
@@ -169,8 +172,8 @@
"empty_column.direct": "아직 다이렉트 메시지가 없습니다. 다이렉트 메시지를 보내거나 받은 경우, 여기에 표시 됩니다.",
"empty_column.domain_blocks": "아직 차단한 도메인이 없습니다.",
"empty_column.explore_statuses": "아직 유행하는 것이 없습니다. 나중에 다시 확인하세요!",
- "empty_column.favourited_statuses": "아직 즐겨찾기 한 게시물이 없습니다. 게시물을 즐겨찾기 하면 여기에 나타납니다.",
- "empty_column.favourites": "아직 아무도 이 게시물을 즐겨찾기 하지 않았습니다. 누군가 즐겨찾기를 하면 여기에 나타납니다.",
+ "empty_column.favourited_statuses": "아직 마음에 들어한 게시물이 없습니다. 게시물을 좋아요 하면 여기에 나타납니다.",
+ "empty_column.favourites": "아직 아무도 이 게시물을 마음에 들어하지 않았습니다. 누군가 좋아요를 하면 여기에 나타납니다.",
"empty_column.follow_recommendations": "당신을 위한 제안이 생성될 수 없는 것 같습니다. 알 수도 있는 사람을 검색하거나 유행하는 해시태그를 둘러볼 수 있습니다.",
"empty_column.follow_requests": "아직 팔로우 요청이 없습니다. 요청을 받았을 때 여기에 나타납니다.",
"empty_column.hashtag": "이 해시태그는 아직 사용되지 않았습니다.",
@@ -180,7 +183,7 @@
"empty_column.lists": "아직 리스트가 없습니다. 리스트를 만들면 여기에 나타납니다.",
"empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.",
"empty_column.notifications": "아직 알림이 없습니다. 다른 사람들이 당신에게 반응했을 때, 여기에서 볼 수 있습니다.",
- "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 유저를 팔로우 해서 채워보세요",
+ "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 사용자를 팔로우 해서 채워보세요",
"error.unexpected_crash.explanation": "버그 혹은 브라우저 호환성 문제로 이 페이지를 올바르게 표시할 수 없습니다.",
"error.unexpected_crash.explanation_addons": "이 페이지는 올바르게 보여질 수 없습니다. 브라우저 애드온이나 자동 번역 도구 등으로 인해 발생된 에러일 수 있습니다.",
"error.unexpected_crash.next_steps": "페이지를 새로고침 해보세요. 그래도 해결되지 않는 경우, 다른 브라우저나 네이티브 앱으로도 마스토돈을 이용하실 수 있습니다.",
@@ -226,7 +229,7 @@
"intervals.full.hours": "{number} 시간",
"intervals.full.minutes": "{number} 분",
"keyboard_shortcuts.back": "뒤로가기",
- "keyboard_shortcuts.blocked": "차단한 유저 리스트 열기",
+ "keyboard_shortcuts.blocked": "차단된 사용자 목록 열기",
"keyboard_shortcuts.boost": "게시물 부스트",
"keyboard_shortcuts.column": "해당 컬럼에 포커스",
"keyboard_shortcuts.compose": "작성창에 포커스",
@@ -235,7 +238,7 @@
"keyboard_shortcuts.down": "리스트에서 아래로 이동",
"keyboard_shortcuts.enter": "게시물 열기",
"keyboard_shortcuts.favourite": "관심글 지정",
- "keyboard_shortcuts.favourites": "즐겨찾기 목록 열기",
+ "keyboard_shortcuts.favourites": "좋아요 목록 열기",
"keyboard_shortcuts.federated": "연합 타임라인 열기",
"keyboard_shortcuts.heading": "키보드 단축키",
"keyboard_shortcuts.home": "홈 타임라인 열기",
@@ -243,7 +246,7 @@
"keyboard_shortcuts.legend": "이 개요 표시",
"keyboard_shortcuts.local": "로컬 타임라인 열기",
"keyboard_shortcuts.mention": "작성자에게 멘션",
- "keyboard_shortcuts.muted": "뮤트 된 유저 리스트 열기",
+ "keyboard_shortcuts.muted": "뮤트된 사용자 목록 열기",
"keyboard_shortcuts.my_profile": "내 프로필 열기",
"keyboard_shortcuts.notifications": "알림 컬럼 열기",
"keyboard_shortcuts.open_media": "미디어 열기",
@@ -264,6 +267,8 @@
"lightbox.expand": "이미지 박스 확장",
"lightbox.next": "다음",
"lightbox.previous": "이전",
+ "limited_account_hint.action": "그래도 프로필 보기",
+ "limited_account_hint.title": "이 프로필은 이 서버의 중재자에 의해 숨겨진 상태입니다.",
"lists.account.add": "리스트에 추가",
"lists.account.remove": "리스트에서 제거",
"lists.delete": "리스트 삭제",
@@ -295,7 +300,7 @@
"navigation_bar.domain_blocks": "차단한 도메인",
"navigation_bar.edit_profile": "프로필 편집",
"navigation_bar.explore": "탐색하기",
- "navigation_bar.favourites": "즐겨찾기",
+ "navigation_bar.favourites": "좋아요",
"navigation_bar.filters": "뮤트한 단어",
"navigation_bar.follow_requests": "팔로우 요청",
"navigation_bar.follows_and_followers": "팔로우와 팔로워",
@@ -310,7 +315,7 @@
"navigation_bar.public_timeline": "연합 타임라인",
"navigation_bar.security": "보안",
"notification.admin.sign_up": "{name} 님이 가입했습니다",
- "notification.favourite": "{name} 님이 즐겨찾기 했습니다",
+ "notification.favourite": "{name} 님이 당신의 게시물을 마음에 들어합니다",
"notification.follow": "{name} 님이 나를 팔로우 했습니다",
"notification.follow_request": "{name} 님이 팔로우 요청을 보냈습니다",
"notification.mention": "{name} 님이 답글을 보냈습니다",
@@ -323,7 +328,7 @@
"notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?",
"notifications.column_settings.admin.sign_up": "새로운 가입:",
"notifications.column_settings.alert": "데스크탑 알림",
- "notifications.column_settings.favourite": "즐겨찾기:",
+ "notifications.column_settings.favourite": "좋아요:",
"notifications.column_settings.filter_bar.advanced": "카테고리의 모든 종류를 표시",
"notifications.column_settings.filter_bar.category": "퀵 필터 바",
"notifications.column_settings.filter_bar.show_bar": "필터 막대 표시",
@@ -341,7 +346,7 @@
"notifications.column_settings.update": "수정내역:",
"notifications.filter.all": "모두",
"notifications.filter.boosts": "부스트",
- "notifications.filter.favourites": "즐겨찾기",
+ "notifications.filter.favourites": "좋아요",
"notifications.filter.follows": "팔로우",
"notifications.filter.mentions": "멘션",
"notifications.filter.polls": "투표 결과",
@@ -365,14 +370,14 @@
"poll.votes": "{votes} 표",
"poll_button.add_poll": "투표 추가",
"poll_button.remove_poll": "투표 삭제",
- "privacy.change": "포스트의 프라이버시 설정을 변경",
+ "privacy.change": "게시물의 프라이버시 설정을 변경",
"privacy.direct.long": "멘션한 사용자에게만 공개",
- "privacy.direct.short": "다이렉트",
+ "privacy.direct.short": "멘션한 사람들만",
"privacy.private.long": "팔로워에게만 공개",
- "privacy.private.short": "비공개",
- "privacy.public.long": "공개 타임라인에 표시",
+ "privacy.private.short": "팔로워 전용",
+ "privacy.public.long": "모두가 볼 수 있음",
"privacy.public.short": "공개",
- "privacy.unlisted.long": "공개 타임라인에 표시하지 않음",
+ "privacy.unlisted.long": "모두가 볼 수 있지만, 발견하기 기능에서는 제외됨",
"privacy.unlisted.short": "타임라인에 비표시",
"refresh": "새로고침",
"regeneration_indicator.label": "불러오는 중…",
@@ -390,7 +395,7 @@
"relative_time.today": "오늘",
"reply_indicator.cancel": "취소",
"report.block": "차단",
- "report.block_explanation": "당신은 그의 게시물을 보지 않게 됩니다. 그는 당신의 게시물을 보거나 팔로우 할 수 없습니다. 그가 차단되었다는 사실을 알 수 있습니다.",
+ "report.block_explanation": "당신은 해당 계정의 게시물을 보지 않게 됩니다. 해당 계정은 당신의 게시물을 보거나 팔로우 할 수 없습니다. 해당 계정은 자신이 차단되었다는 사실을 알 수 있습니다.",
"report.categories.other": "기타",
"report.categories.spam": "스팸",
"report.categories.violation": "컨텐츠가 한 개 이상의 서버 규칙을 위반합니다",
@@ -403,7 +408,7 @@
"report.forward": "{target}에 포워드 됨",
"report.forward_hint": "이 계정은 다른 서버에 있습니다. 익명화 된 사본을 해당 서버에도 전송할까요?",
"report.mute": "침묵",
- "report.mute_explanation": "당신은 그의 게시물을 보지 않게 됩니다. 그는 여전히 당신을 팔로우 하거나 당신의 게시물을 볼 수 있으며 뮤트 되었는지 알지 못합니다.",
+ "report.mute_explanation": "당신은 해당 계정의 게시물을 보지 않게 됩니다. 해당 계정은 여전히 당신을 팔로우 하거나 당신의 게시물을 볼 수 있으며 해당 계정은 자신이 뮤트 되었는지 알지 못합니다.",
"report.next": "다음",
"report.placeholder": "코멘트",
"report.reasons.dislike": "마음에 안듭니다",
@@ -428,11 +433,11 @@
"report.unfollow_explanation": "당신을 이 계정을 팔로우 하고 있습니다. 홈 피드에서 게시물을 보지 않으려면, 팔로우를 해제하세요.",
"search.placeholder": "검색",
"search_popout.search_format": "고급 검색 방법",
- "search_popout.tips.full_text": "단순한 텍스트 검색은 당신이 작성했거나, 관심글로 지정했거나, 부스트했거나, 멘션을 받은 게시글, 그리고 유저네임, 디스플레이네임, 해시태그를 반환합니다.",
+ "search_popout.tips.full_text": "단순한 텍스트 검색은 당신이 작성했거나, 관심글로 지정했거나, 부스트했거나, 멘션을 받은 게시글, 그리고 사용자명, 표시되는 이름, 해시태그를 반환합니다.",
"search_popout.tips.hashtag": "해시태그",
"search_popout.tips.status": "게시물",
- "search_popout.tips.text": "단순한 텍스트 검색은 관계된 프로필 이름, 유저 이름 그리고 해시태그를 표시합니다",
- "search_popout.tips.user": "유저",
+ "search_popout.tips.text": "단순한 텍스트 검색은 관계된 프로필 이름, 사용자명 그리고 해시태그를 표시합니다",
+ "search_popout.tips.user": "사용자",
"search_results.accounts": "사람",
"search_results.all": "전부",
"search_results.hashtags": "해시태그",
@@ -445,7 +450,7 @@
"status.block": "@{name} 차단",
"status.bookmark": "보관",
"status.cancel_reblog_private": "부스트 취소",
- "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다",
+ "status.cannot_reblog": "이 게시물은 부스트 할 수 없습니다",
"status.copy": "게시물 링크 복사",
"status.delete": "삭제",
"status.detailed_status": "대화 자세히 보기",
@@ -454,7 +459,7 @@
"status.edited": "{date}에 편집됨",
"status.edited_x_times": "{count}번 수정됨",
"status.embed": "공유하기",
- "status.favourite": "즐겨찾기",
+ "status.favourite": "좋아요",
"status.filtered": "필터로 걸러짐",
"status.history.created": "{name} 님이 {date}에 생성함",
"status.history.edited": "{name} 님이 {date}에 수정함",
@@ -515,6 +520,7 @@
"upload_error.poll": "파일 업로드는 투표와 함께 첨부할 수 없습니다.",
"upload_form.audio_description": "청각 장애인을 위한 설명",
"upload_form.description": "시각장애인을 위한 설명",
+ "upload_form.description_missing": "설명이 추가되지 않음",
"upload_form.edit": "편집",
"upload_form.thumbnail": "썸네일 변경",
"upload_form.undo": "삭제",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 0298c51ec..a38f18fa3 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -11,7 +11,7 @@
"account.direct": "Peyamekê bişîne @{name}",
"account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne",
"account.domain_blocked": "Navper hate astengkirin",
- "account.edit_profile": "Profîl serrast bike",
+ "account.edit_profile": "Profîlê serrast bike",
"account.enable_notifications": "Min agahdar bike gava @{name} diweşîne",
"account.endorse": "Taybetiyên li ser profîl",
"account.follow": "Bişopîne",
@@ -70,7 +70,7 @@
"column.blocks": "Bikarhênerên astengkirî",
"column.bookmarks": "Şûnpel",
"column.community": "Demnameya herêmî",
- "column.direct": "Peyamên taybet",
+ "column.direct": "Peyamên rasterast",
"column.directory": "Li profîlan bigere",
"column.domain_blocks": "Navperên astengkirî",
"column.favourites": "Bijarte",
@@ -81,7 +81,7 @@
"column.notifications": "Agahdarî",
"column.pins": "Şandiya derzîkirî",
"column.public": "Demnameyê federalîkirî",
- "column_back_button.label": "Veger",
+ "column_back_button.label": "Vegere",
"column_header.hide_settings": "Sazkariyan veşêre",
"column_header.moveLeft_settings": "Stûnê bilivîne bo çepê",
"column_header.moveRight_settings": "Stûnê bilivîne bo rastê",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Tenê herêmî",
"community.column_settings.media_only": "Tenê media",
"community.column_settings.remote_only": "Tenê ji dûr ve",
- "compose_form.direct_message_warning": "Ev şandî tenê ji bikarhênerên qalkirî re wê were şandin.",
+ "compose.language.change": "Ziman biguherîne",
+ "compose.language.search": "Li zimanan bigere...",
"compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe",
+ "compose_form.encryption_warning": "Şandiyên li ser Mastodon dawî-bi-dawî ne şîfrekirî ne. Li ser Mastodon zanyariyên hestyar parve neke.",
"compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.",
"compose_form.lock_disclaimer": "Ajimêrê te {locked} nîne. Herkes dikare te bişopîne da ku şandiyên te yên tenê şopînerên te ra xûya dibin bibînin.",
"compose_form.lock_disclaimer.lock": "girtî ye",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Vê hilbijarê rake",
"compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
"compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Biweşîne",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Guhertinan tomar bike",
"compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.",
"embed.preview": "Wa ye wê wusa xuya bike:",
"emoji_button.activity": "Çalakî",
+ "emoji_button.clear": "Pak bike",
"emoji_button.custom": "Kesanekirî",
"emoji_button.flags": "Nîşankirî",
"emoji_button.food": "Xwarin û vexwarin",
@@ -204,7 +207,7 @@
"getting_started.directory": "Rêgeha profîlê",
"getting_started.documentation": "Pelbend",
"getting_started.heading": "Destpêkirin",
- "getting_started.invite": "Mirovan Vexwîne",
+ "getting_started.invite": "Kesan vexwîne",
"getting_started.open_source_notice": "Mastodon nermalava çavkaniya vekirî ye. Tu dikarî pirsgirêkan li ser GitHub-ê ragihînî di {github} de an jî dikarî tevkariyê bikî.",
"getting_started.security": "Sazkariyên ajimêr",
"getting_started.terms": "Mercên karûberan",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Stûna balkişandinê",
"keyboard_shortcuts.compose": "Bal bikşîne cîhê nivîsê/textarea",
"keyboard_shortcuts.description": "Danasîn",
- "keyboard_shortcuts.direct": "Ji stûnê peyamên rasterast veke",
+ "keyboard_shortcuts.direct": "ji bo vekirina stûnê peyamên rasterast",
"keyboard_shortcuts.down": "Di rêzokê de dakêşe jêr",
"keyboard_shortcuts.enter": "Şandiyê veke",
"keyboard_shortcuts.favourite": "Şandiya bijarte",
@@ -264,6 +267,8 @@
"lightbox.expand": "Qutîya wêneya nîşan dike fireh bike",
"lightbox.next": "Pêş",
"lightbox.previous": "Paş",
+ "limited_account_hint.action": "Bi heman awayî profîlê nîşan bide",
+ "limited_account_hint.title": "Ev profîl ji aliyê çavêriya li ser rajekarê te hatiye veşartin.",
"lists.account.add": "Tevlî rêzokê bike",
"lists.account.remove": "Ji rêzokê rake",
"lists.delete": "Rêzokê jê bibe",
@@ -293,7 +298,7 @@
"navigation_bar.direct": "Peyamên rasterast",
"navigation_bar.discover": "Vekolê",
"navigation_bar.domain_blocks": "Navparên astengkirî",
- "navigation_bar.edit_profile": "Profîl serrast bike",
+ "navigation_bar.edit_profile": "Profîlê serrast bike",
"navigation_bar.explore": "Vekole",
"navigation_bar.favourites": "Bijarte",
"navigation_bar.filters": "Peyvên bêdengkirî",
@@ -342,7 +347,7 @@
"notifications.filter.all": "Hemû",
"notifications.filter.boosts": "Bilindkirî",
"notifications.filter.favourites": "Bijarte",
- "notifications.filter.follows": "Şopîner",
+ "notifications.filter.follows": "Dişopîne",
"notifications.filter.mentions": "Qalkirin",
"notifications.filter.polls": "Encamên rapirsiyê",
"notifications.filter.statuses": "Ji kesên tu dişopînî re rojanekirin",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Rapirsî yê rake",
"privacy.change": "Nepênîtiya şandiyan biguherîne",
"privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin",
- "privacy.direct.short": "Taybet",
+ "privacy.direct.short": "Tenê kesên qalkirî",
"privacy.private.long": "Tenê bo şopîneran xuyabar e",
"privacy.private.short": "Tenê şopîneran",
- "privacy.public.long": "Ji bo herkesî li berçav e, di demnameyên gelemperî de dê xûyakirin",
+ "privacy.public.long": "Ji bo hemûyan xuyabar e",
"privacy.public.short": "Gelemperî",
- "privacy.unlisted.long": "Ji herkesî ra tê xûya, lê demnameyê gelemperî ra nay xûyakirin",
+ "privacy.unlisted.long": "Ji bo hemûyan xuyabar e, lê ji taybetmendiyên vekolînê veqetiya ye",
"privacy.unlisted.short": "Nerêzok",
"refresh": "Nû bike",
"regeneration_indicator.label": "Tê barkirin…",
@@ -501,7 +506,7 @@
"time_remaining.seconds": "{number, plural, one {# çirke} other {# çirke}} maye",
"timeline_hint.remote_resource_not_displayed": "{resource} Ji rajekerên din nayê dîtin.",
"timeline_hint.resources.followers": "Şopîner",
- "timeline_hint.resources.follows": "Şopîner",
+ "timeline_hint.resources.follows": "Dişopîne",
"timeline_hint.resources.statuses": "Şandiyên kevn",
"trends.counter_by_accounts": "{count, plural, one {{counter} kes} other {{counter} kes}} diaxivin",
"trends.trending_now": "Rojev",
@@ -515,6 +520,7 @@
"upload_error.poll": "Di rapirsîyan de mafê barkirina pelan nayê dayîn.",
"upload_form.audio_description": "Ji bona kesên kêm dibihîsin re pênase bike",
"upload_form.description": "Ji bona astengdarên dîtinê re vebêje",
+ "upload_form.description_missing": "Ti danasîn nehatiye tevlîkirin",
"upload_form.edit": "Serrast bike",
"upload_form.thumbnail": "Wêneyê biçûk biguherîne",
"upload_form.undo": "Jê bibe",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index ca6eed5c1..6a8c9933a 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -70,7 +70,7 @@
"column.blocks": "Devnydhyoryon lettys",
"column.bookmarks": "Folennosow",
"column.community": "Amserlin leel",
- "column.direct": "Messajys didro",
+ "column.direct": "Direct messages",
"column.directory": "Peuri profilys",
"column.domain_blocks": "Gorfarthow lettys",
"column.favourites": "Re drudh",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Leel hepken",
"community.column_settings.media_only": "Myski hepken",
"community.column_settings.remote_only": "A-bell hepken",
- "compose_form.direct_message_warning": "An post ma a vydh danvenys dhe'n dhevnydhyoryon menegys hepken.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Dyski moy",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Ny vydh an post ma diskwedhys yn-dann vòlnos vyth awos y vos mes a rol. Ny yllir hwilas saw poblow postek dre vòlnos.",
"compose_form.lock_disclaimer": "Nyns yw agas akont {locked}. Piwpynag a yll agas holya dhe weles agas postow holyoryon-hepken.",
"compose_form.lock_disclaimer.lock": "Alhwedhys",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Dilea'n dewis ma",
"compose_form.poll.switch_to_multiple": "Chanjya sondyans dhe asa lies dewis",
"compose_form.poll.switch_to_single": "Chanjya sondyans dhe asa unn dewis hepken",
- "compose_form.publish": "Tout",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Merkya myski vel tender} other {Merkya myski vel tender}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Stagewgh an post ma a-berth yn agas gwiasva ow tasskrifa'n kod a-wòles.",
"embed.preview": "Ottomma fatel hevel:",
"emoji_button.activity": "Gwrians",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "A-vusur",
"emoji_button.flags": "Baneryow",
"emoji_button.food": "Bòs & Diwes",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Ny wrussowgh lettya devnydhyoryon vyth hwath.",
"empty_column.bookmarked_statuses": "Nyns eus dhywgh postow gans folennos hwath. Pan wrewgh gorra onan, ev a wra omdhiskwedhes omma.",
"empty_column.community": "An amserlin leel yw gwag. Skrifewgh neppytn yn poblek dh'y lonchya!",
- "empty_column.direct": "Nyns eus dhywgh messajys didro hwath. Pan wrewgh dannvon po degemeres onan, ev a wra omdhiskwedhes omma.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Nyns eus gorfarthow lettys hwath.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Nyns eus dhywgh postow drudh hwath. Pan wrewgh merkya onan vel drudh, ev a wra omdhiskwedhes omma.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Fogella koloven",
"keyboard_shortcuts.compose": "Fogella tekstva gomposya",
"keyboard_shortcuts.description": "Deskrifans",
- "keyboard_shortcuts.direct": "Ygeri koloven messajys didro",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "Movya war-nans y'n rol",
"keyboard_shortcuts.enter": "Ygeri post",
"keyboard_shortcuts.favourite": "Merkya post vel drudh",
@@ -264,6 +267,8 @@
"lightbox.expand": "Efani kist a weles aven",
"lightbox.next": "Nessa",
"lightbox.previous": "Kynsa",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Keworra dhe rol",
"lists.account.remove": "Removya a rol",
"lists.delete": "Dilea rol",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Folennosow",
"navigation_bar.community_timeline": "Amserlin leel",
"navigation_bar.compose": "Komposya post nowydh",
- "navigation_bar.direct": "Messajys didro",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Diskudha",
"navigation_bar.domain_blocks": "Gorfarthow lettys",
"navigation_bar.edit_profile": "Golegi profil",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Dilea sondyans",
"privacy.change": "Chanjya privetter an post",
"privacy.direct.long": "Gweladow dhe'n dhevnydhyoryon menegys hepken",
- "privacy.direct.short": "Didro",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Gweladow dhe holyoryon hepken",
- "privacy.private.short": "Holyoryon-hepken",
- "privacy.public.long": "Gweladow dhe beub, diskwedhys yn amserlinyow poblek",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Poblek",
- "privacy.unlisted.long": "Gweladow dhe beub, a-der yn amserlinyow poblek",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Anrelys",
"refresh": "Daskarga",
"regeneration_indicator.label": "Ow karga…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Nyns yw gesys ughkarga restrennow gans sondyansow.",
"upload_form.audio_description": "Deskrifewgh rag tus vodharek",
"upload_form.description": "Deskrifewgh rag tus dhallek",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Golegi",
"upload_form.thumbnail": "Chanjya avenik",
"upload_form.undo": "Dilea",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index bb432a8af..afff3a79c 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Post to public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index f16df5423..b889948cf 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -26,7 +26,7 @@
"account.joined": "Pievienojās {date}",
"account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}",
"account.locked_info": "Šī konta privātuma statuss ir slēgts. Īpašnieks izskatīs, kurš viņam drīkst sekot.",
- "account.media": "Mediji",
+ "account.media": "Multivide",
"account.mention": "Piemin @{name}",
"account.moved_to": "{name} ir pārcelts uz:",
"account.mute": "Apklusināt @{name}",
@@ -70,7 +70,7 @@
"column.blocks": "Bloķētie lietotāji",
"column.bookmarks": "Grāmatzīmes",
"column.community": "Vietējā ziņu līnija",
- "column.direct": "Privātās ziņas",
+ "column.direct": "Privātie ziņojumi",
"column.directory": "Pārlūkot profilus",
"column.domain_blocks": "Bloķētie domēni",
"column.favourites": "Izlase",
@@ -90,10 +90,12 @@
"column_header.unpin": "Atspraust",
"column_subheading.settings": "Iestatījumi",
"community.column_settings.local_only": "Tikai vietējie",
- "community.column_settings.media_only": "Tikai mediji",
+ "community.column_settings.media_only": "Tikai multivide",
"community.column_settings.remote_only": "Tikai attālinātie",
- "compose_form.direct_message_warning": "Šis ziņojums tiks nosūtīts tikai pieminētajiem lietotājiem.",
+ "compose.language.change": "Mainīt valodu",
+ "compose.language.search": "Meklēt valodas...",
"compose_form.direct_message_warning_learn_more": "Uzzināt vairāk",
+ "compose_form.encryption_warning": "Ziņas vietnē Mastodon nav pilnībā šifrētas. Nedalies ar sensitīvu informāciju caur Mastodon.",
"compose_form.hashtag_warning": "Ziņojumu nebūs iespējams atrast zem haštagiem jo tas nav publisks. Tikai publiskos ziņojumus ir iespējams meklēt pēc tiem.",
"compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var Tev sekot lai apskatītu tikai sekotājiem paredzētos ziņojumus.",
"compose_form.lock_disclaimer.lock": "slēgts",
@@ -104,12 +106,12 @@
"compose_form.poll.remove_option": "Noņemt šo izvēli",
"compose_form.poll.switch_to_multiple": "Maini aptaujas veidu, lai atļautu vairākas izvēles",
"compose_form.poll.switch_to_single": "Maini aptaujas veidu, lai atļautu vienu izvēli",
- "compose_form.publish": "Taurēt",
+ "compose_form.publish": "Publicēt",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Saglabāt izmaiņas",
- "compose_form.sensitive.hide": "{count, plural, one {Atzīmēt mediju kā sensitīvu} other {Atzīmēt medijus kā sensitīvus}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medijs ir atzīmēts kā sensitīvs} other {Mediji ir atzīmēti kā sensitīvi}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medijs nav atzīmēts kā sensitīvs} other {Mediji nav atzīmēti kā sensitīvi}}",
+ "compose_form.sensitive.hide": "{count, plural, one {Atzīmēt multividi kā sensitīvu} other {Atzīmēt multivides kā sensitīvas}}",
+ "compose_form.sensitive.marked": "{count, plural, one {Multivide ir atzīmēta kā sensitīva} other {Multivides ir atzīmētas kā sensitīvas}}",
+ "compose_form.sensitive.unmarked": "{count, plural, one {Multivide nav atzīmēts kā sensitīva} other {Multivides nav atzīmētas kā sensitīvas}}",
"compose_form.spoiler.marked": "Noņemt satura brīdinājumu",
"compose_form.spoiler.unmarked": "Pievienot satura brīdinājumu",
"compose_form.spoiler_placeholder": "Ieraksti savu brīdinājumu šeit",
@@ -122,7 +124,7 @@
"confirmations.delete_list.confirm": "Dzēst",
"confirmations.delete_list.message": "Vai tiešam vēlies neatgriezeniski dzēst šo sarakstu?",
"confirmations.discard_edit_media.confirm": "Izmest",
- "confirmations.discard_edit_media.message": "Vai tev ir nesaglabātas izmaiņas mediju aprakstā vai priekšskatījumā, vai tomēr atmest tās?",
+ "confirmations.discard_edit_media.message": "Vai tev ir nesaglabātas izmaiņas multivides aprakstā vai priekšskatījumā, vai tomēr atmest tās?",
"confirmations.domain_block.confirm": "Bloķēt visu domēnu",
"confirmations.domain_block.message": "Vai tu tiešām, tiešam vēlies bloķēt visu domēnu {domain}? Lielākajā daļā gadījumu pietiek ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.",
"confirmations.logout.confirm": "Iziet",
@@ -147,6 +149,7 @@
"embed.instructions": "Iestrādā šo ziņu savā mājaslapā, kopējot zemāk redzmo kodu.",
"embed.preview": "Tas izskatīsies šādi:",
"emoji_button.activity": "Aktivitāte",
+ "emoji_button.clear": "Notīrīt",
"emoji_button.custom": "Pielāgots",
"emoji_button.flags": "Karogi",
"emoji_button.food": "Ēdieni un dzērieni",
@@ -168,7 +171,7 @@
"empty_column.community": "Vietējā ziņu lenta ir tukša. Uzraksti kaut ko publiski, lai viss notiktu!",
"empty_column.direct": "Patrez tev nav privātu ziņu. Tiklīdz tādu nosūtīsi vai saņemsi, tās parādīsies šeit.",
"empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.",
- "empty_column.explore_statuses": "Pašlaik nekas nav tendēts. Pārbaudiet vēlāk!",
+ "empty_column.explore_statuses": "Pašlaik nekā aktuāla nav. Pārbaudi vēlāk!",
"empty_column.favourited_statuses": "Patreiz tev nav neviena izceltā ieraksta. Kad kādu izcelsi, tas parādīsies šeit.",
"empty_column.favourites": "Neviens šo ziņojumu vel nav izcēlis. Kad būs, tie parādīsies šeit.",
"empty_column.follow_recommendations": "Šķiet, ka tev nevarēja ģenerēt ieteikumus. Vari mēģināt izmantot meklēšanu, lai meklētu cilvēkus, kurus tu varētu pazīt, vai izpētīt populārākās atsauces.",
@@ -185,7 +188,7 @@
"error.unexpected_crash.explanation_addons": "Šo lapu nevarēja parādīt pareizi. Šo kļūdu, iespējams, izraisīja pārlūkprogrammas papildinājums vai automātiskās tulkošanas rīki.",
"error.unexpected_crash.next_steps": "Mēģini atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai vietējo lietotni.",
"error.unexpected_crash.next_steps_addons": "Mēģini tos atspējot un atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai vietējo lietotni.",
- "errors.unexpected_crash.copy_stacktrace": "Iekopēt starpliktuvē",
+ "errors.unexpected_crash.copy_stacktrace": "Kopēt stacktrace uz starpliktuvi",
"errors.unexpected_crash.report_issue": "Ziņot par problēmu",
"explore.search_results": "Meklēšanas rezultāti",
"explore.suggested_follows": "Tev",
@@ -204,7 +207,7 @@
"getting_started.directory": "Profila direktorija",
"getting_started.documentation": "Dokumentācija",
"getting_started.heading": "Darba sākšana",
- "getting_started.invite": "Uzaiciniet cilvēkus",
+ "getting_started.invite": "Uzaicini cilvēkus",
"getting_started.open_source_notice": "Mastodon ir atvērtā koda programmatūra. Tu vari dot savu ieguldījumu vai arī ziņot par problēmām {github}.",
"getting_started.security": "Konta iestatījumi",
"getting_started.terms": "Pakalpojuma noteikumi",
@@ -227,11 +230,11 @@
"intervals.full.minutes": "{number, plural, one {# minūte} other {# minūtes}}",
"keyboard_shortcuts.back": "Pāriet atpakaļ",
"keyboard_shortcuts.blocked": "Atvērt bloķēto lietotāju sarakstu",
- "keyboard_shortcuts.boost": "Palielināt ziņu",
+ "keyboard_shortcuts.boost": "Atbalstīt ziņu",
"keyboard_shortcuts.column": "Fokusēt kolonnu",
"keyboard_shortcuts.compose": "Fokusēt veidojamā teksta lauku",
"keyboard_shortcuts.description": "Apraksts",
- "keyboard_shortcuts.direct": "Atvērt privāto ziņojumu kolonnu",
+ "keyboard_shortcuts.direct": "lai atvērtu privāto ziņojumu kolonnu",
"keyboard_shortcuts.down": "Pārvietot sarakstā uz leju",
"keyboard_shortcuts.enter": "Atvērt ziņu",
"keyboard_shortcuts.favourite": "Pievienot izlasei",
@@ -242,11 +245,11 @@
"keyboard_shortcuts.hotkey": "Ātrais taustiņš",
"keyboard_shortcuts.legend": "Parādīt šo leģendu",
"keyboard_shortcuts.local": "Atvērt vietējo ziņu lenti",
- "keyboard_shortcuts.mention": "Minējuma autors",
+ "keyboard_shortcuts.mention": "Pieminēt autoru",
"keyboard_shortcuts.muted": "Atvērt apklusināto lietotāju sarakstu",
- "keyboard_shortcuts.my_profile": "Atvērt manu profilu",
+ "keyboard_shortcuts.my_profile": "Atvērt savu profilu",
"keyboard_shortcuts.notifications": "Atvērt paziņojumu kolonnu",
- "keyboard_shortcuts.open_media": "Atvērt mediju",
+ "keyboard_shortcuts.open_media": "Atvērt multividi",
"keyboard_shortcuts.pinned": "Atvērt piesprausto ziņu sarakstu",
"keyboard_shortcuts.profile": "Atvērt autora profilu",
"keyboard_shortcuts.reply": "Atbildēt",
@@ -255,15 +258,17 @@
"keyboard_shortcuts.spoilers": "Rādīt/slēpt CW lauku",
"keyboard_shortcuts.start": "Atvērt kolonnu “Darba sākšana”",
"keyboard_shortcuts.toggle_hidden": "Rādīt/slēpt tekstu aiz CW",
- "keyboard_shortcuts.toggle_sensitivity": "Rādīt/slēpt mediju",
- "keyboard_shortcuts.toot": "Sākt jaunu ziņu",
+ "keyboard_shortcuts.toggle_sensitivity": "Rādīt/slēpt multividi",
+ "keyboard_shortcuts.toot": "Sāc jaunu ziņu",
"keyboard_shortcuts.unfocus": "Atfokusēt teksta veidošanu/meklēšanu",
"keyboard_shortcuts.up": "Pārvietot sarakstā uz augšu",
"lightbox.close": "Aizvērt",
- "lightbox.compress": "Saspiest attēla ietvaru",
- "lightbox.expand": "Paplašināt attēla ietvaru",
+ "lightbox.compress": "Saspiest attēla skata lodziņu",
+ "lightbox.expand": "Izvērst attēla skata lodziņu",
"lightbox.next": "Tālāk",
- "lightbox.previous": "Iepriekš",
+ "lightbox.previous": "Iepriekšējais",
+ "limited_account_hint.action": "Tik un tā rādīt profilu",
+ "limited_account_hint.title": "Tava servera moderatori ir paslēpuši šo profilu.",
"lists.account.add": "Pievienot sarakstam",
"lists.account.remove": "Noņemt no saraksta",
"lists.delete": "Dzēst sarakstu",
@@ -271,10 +276,10 @@
"lists.edit.submit": "Mainīt virsrakstu",
"lists.new.create": "Pievienot sarakstu",
"lists.new.title_placeholder": "Jaunais saraksta nosaukums",
- "lists.replies_policy.followed": "Jebkuram lietotājam, kuram seko",
+ "lists.replies_policy.followed": "Jebkurš sekots lietotājs",
"lists.replies_policy.list": "Saraksta dalībnieki",
"lists.replies_policy.none": "Nevienam",
- "lists.replies_policy.title": "Rādīt atbildes:",
+ "lists.replies_policy.title": "Rādīt atbildes uz:",
"lists.search": "Meklēt starp cilvēkiem, kuriem tu seko",
"lists.subheading": "Tavi saraksti",
"load_pending": "{count, plural, one {# jauna lieta} other {# jaunas lietas}}",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Grāmatzīmes",
"navigation_bar.community_timeline": "Vietējā ziņu lenta",
"navigation_bar.compose": "Veidot jaunu ziņu",
- "navigation_bar.direct": "Privātās ziņas",
+ "navigation_bar.direct": "Privātie ziņojumi",
"navigation_bar.discover": "Atklāt",
"navigation_bar.domain_blocks": "Bloķētie domēni",
"navigation_bar.edit_profile": "Rediģēt profilu",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Noņemt aptauju",
"privacy.change": "Mainīt ziņas privātumu",
"privacy.direct.long": "Redzams tikai pieminētajiem lietotājiem",
- "privacy.direct.short": "Tiešs",
+ "privacy.direct.short": "Tikai minētie cilvēki",
"privacy.private.long": "Redzams tikai sekotājiem",
"privacy.private.short": "Tikai sekotājiem",
- "privacy.public.long": "Redzams visiem, rāda publiskajās ziņu lentās",
+ "privacy.public.long": "Redzama visiem",
"privacy.public.short": "Publisks",
- "privacy.unlisted.long": "Redzams visiem, bet ne publiskajās ziņu lentās",
+ "privacy.unlisted.long": "Redzama visiem, bet atteicās no atklāšanas funkcijām",
"privacy.unlisted.short": "Neminētie",
"refresh": "Atsvaidzināt",
"regeneration_indicator.label": "Ielādē…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Datņu augšupielādes aptaujās nav atļautas.",
"upload_form.audio_description": "Aprakstiet cilvēkiem ar dzirdes zudumu",
"upload_form.description": "Aprakstiet vājredzīgajiem",
+ "upload_form.description_missing": "Apraksts nav pievienots",
"upload_form.edit": "Rediģēt",
"upload_form.thumbnail": "Nomainīt sīktēlu",
"upload_form.undo": "Dzēst",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index c6f097134..1b868de07 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -70,7 +70,7 @@
"column.blocks": "Блокирани корисници",
"column.bookmarks": "Bookmarks",
"column.community": "Локална временска зона",
- "column.direct": "Директна порака",
+ "column.direct": "Direct messages",
"column.directory": "Види профили",
"column.domain_blocks": "Скриени домеини",
"column.favourites": "Омилени",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Само медиа",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Научи повеќе",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "заклучен",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Избриши избор",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Тутови",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Обележи медиа како сензитивна",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Активност",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Храна & Пијалаци",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Немате сеуште блокирано корисници.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "Локалниот времеплов е празен. Објавете нешто јавно за да може да почне шоуто!",
- "empty_column.direct": "Немате директни пораки. Кога ќе пратите или примите, ќе се појават тука.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Немате сокриени домеини уште.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Избришете анкета",
"privacy.change": "Штеловај статус на приватност",
"privacy.direct.long": "Објави само на спомнати корисници",
- "privacy.direct.short": "Директно",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Објави само на следбеници",
- "privacy.private.short": "Само следбеници",
- "privacy.public.long": "Објави во јавни времплови",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Јавно",
- "privacy.unlisted.long": "Не објавувај на јавни времеплови",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Необјавено",
"refresh": "Освежи",
"regeneration_indicator.label": "Вчитување…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 1a0f4ac38..674f74dd6 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -70,7 +70,7 @@
"column.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
"column.bookmarks": "ബുക്ക്മാർക്കുകൾ",
"column.community": "പ്രാദേശികമായ സമയരേഖ",
- "column.direct": "നേരിട്ടുള്ള സന്ദേശങ്ങൾ",
+ "column.direct": "Direct messages",
"column.directory": "പ്രൊഫൈലുകൾ മറിച്ചുനോക്കുക",
"column.domain_blocks": "മറയ്ക്കപ്പെട്ട മേഖലകൾ",
"column.favourites": "പ്രിയപ്പെട്ടവ",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "പ്രാദേശികം മാത്രം",
"community.column_settings.media_only": "മാധ്യമങ്ങൾ മാത്രം",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "പരാമർശിക്കപ്പെട്ടിരിക്കുന്ന ഉപയോഗ്താക്കൾക്കെ ഈ ടൂട്ട് അയക്കപ്പെടുകയുള്ളു.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "കൂടുതൽ പഠിക്കുക",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "ഈ ടൂട്ട് പട്ടികയിൽ ഇല്ലാത്തതിനാൽ ഒരു ചർച്ചാവിഷയത്തിന്റെ പട്ടികയിലും പെടുകയില്ല. പരസ്യമായ ടൂട്ടുകൾ മാത്രമേ ചർച്ചാവിഷയം അടിസ്ഥാനമാക്കി തിരയുവാൻ സാധിക്കുകയുള്ളു.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "ലോക്കുചെയ്തു",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "ഈ ഡിവൈസ് മാറ്റുക",
"compose_form.poll.switch_to_multiple": "വോട്ടെടുപ്പിൽ ഒന്നിലധികം ചോയ്സുകൾ ഉൾപ്പെടുതുക",
"compose_form.poll.switch_to_single": "വോട്ടെടുപ്പിൽ ഒരൊറ്റ ചോയ്സ് മാത്രം ആക്കുക",
- "compose_form.publish": "ടൂട്ട്",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{പ്രസിദ്ധീകരിക്കുക}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "ചുവടെയുള്ള കോഡ് പകർത്തിക്കൊണ്ട് നിങ്ങളുടെ വെബ്സൈറ്റിൽ ഈ ടൂട്ട് ഉൾച്ചേർക്കുക.",
"embed.preview": "ഇത് ഇങ്ങനെ കാണപ്പെടും:",
"emoji_button.activity": "പ്രവര്ത്തനം",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "സ്വന്തമായ ഭേദഗതി",
"emoji_button.flags": "കൊടികൾ",
"emoji_button.food": "ഭക്ഷണവും പാനീയവും",
@@ -166,7 +169,7 @@
"empty_column.blocks": "നിങ്ങൾ ഇതുവരെ ഒരു ഉപയോക്താക്കളെയും തടഞ്ഞിട്ടില്ല.",
"empty_column.bookmarked_statuses": "നിങ്ങൾക് ഇതുവരെ അടയാളപ്പെടുത്തിയ ടൂട്ടുകൾ ഇല്ല. അടയാളപ്പെടുത്തിയാൽ അത് ഇവിടെ വരും.",
"empty_column.community": "പ്രാദേശികമായ സമയരേഖ ശൂന്യമാണ്. എന്തെങ്കിലും പരസ്യമായി എഴുതി തുടക്കം കുറിക്കു!",
- "empty_column.direct": "നിങ്ങൾക്ക് ഇതുവരെ നേരിട്ടുള്ള സന്ദേശങ്ങൾ ഒന്നുമില്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് അയക്കുകയോ, നിങ്ങൾക്ക് ലഭിക്കുകയോ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "മറയ്ക്കപ്പെട്ടിരിക്കുന്ന മേഖലകൾ ഇതുവരെ ഇല്ല.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "നിങ്ങൾക്ക് ഇത് വരെ ഒരു പ്രിയപ്പെട്ട ടൂട്ടും ഇല്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് പ്രിയപ്പെടുന്ന പക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "അടുത്തത്",
"lightbox.previous": "പുറകോട്ട്",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "പട്ടികയിലേക്ക് ചേർക്കുക",
"lists.account.remove": "പട്ടികയിൽ നിന്ന് ഒഴിവാക്കുക",
"lists.delete": "പട്ടിക ഒഴിവാക്കുക",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "ബുക്ക്മാർക്കുകൾ",
"navigation_bar.community_timeline": "പ്രാദേശിക സമയരേഖ",
"navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക",
- "navigation_bar.direct": "നേരിട്ടുള്ള സന്ദേശങ്ങൾ",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "കണ്ടെത്തുക",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "പോൾ നീക്കംചെയ്യുക",
"privacy.change": "ടൂട്ട് സ്വകാര്യത ക്രമീകരിക്കുക",
"privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "നേരിട്ട്",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
- "privacy.private.short": "പിന്തുടരുന്നവർക്ക് മാത്രം",
- "privacy.public.long": "Post to public timelines",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "എല്ലാവര്ക്കും",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "പുതുക്കുക",
"regeneration_indicator.label": "ലഭ്യമാക്കുന്നു…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "കേൾവിശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ",
"upload_form.description": "കാഴ്ചശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "തിരുത്തുക",
"upload_form.thumbnail": "ലഘുചിത്രം മാറ്റുക",
"upload_form.undo": "ഇല്ലാതാക്കുക",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index a731ff87b..d9dafa222 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -70,7 +70,7 @@
"column.blocks": "ब्लॉक केलेले खातेधारक",
"column.bookmarks": "Bookmarks",
"column.community": "Local timeline",
- "column.direct": "थेट संदेश",
+ "column.direct": "Direct messages",
"column.directory": "Browse profiles",
"column.domain_blocks": "गुप्त डोमेन्स",
"column.favourites": "आवडते",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "केवळ मीडिया",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "अधिक जाणून घ्या",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "हा पर्याय काढा",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Post to public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 96d300492..c3ca25965 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -70,7 +70,7 @@
"column.blocks": "Pengguna yang disekat",
"column.bookmarks": "Tanda buku",
"column.community": "Garis masa tempatan",
- "column.direct": "Mesej terus",
+ "column.direct": "Direct messages",
"column.directory": "Layari profil",
"column.domain_blocks": "Domain disekat",
"column.favourites": "Kegemaran",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Tempatan sahaja",
"community.column_settings.media_only": "Media sahaja",
"community.column_settings.remote_only": "Jauh sahaja",
- "compose_form.direct_message_warning": "Hantaran ini hanya akan dihantar kepada pengguna yang disebut.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Ketahui lebih lanjut",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Hantaran ini tidak akan disenaraikan di bawah mana-mana tanda pagar kerana ia tidak tersenarai. Hanya hantaran awam sahaja boleh dicari menggunakan tanda pagar.",
"compose_form.lock_disclaimer": "Akaun anda tidak {locked}. Sesiapa pun boleh mengikuti anda untuk melihat hantaran pengikut-sahaja anda.",
"compose_form.lock_disclaimer.lock": "dikunci",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Buang pilihan ini",
"compose_form.poll.switch_to_multiple": "Ubah kepada membenarkan aneka undian",
"compose_form.poll.switch_to_single": "Ubah kepada undian pilihan tunggal",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Tandakan media sbg sensitif} other {Tandakan media sbg sensitif}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Benam hantaran ini di laman sesawang anda dengan menyalin kod berikut.",
"embed.preview": "Begini rupanya nanti:",
"emoji_button.activity": "Aktiviti",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Tersuai",
"emoji_button.flags": "Bendera",
"emoji_button.food": "Makanan & Minuman",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Anda belum menyekat sesiapa.",
"empty_column.bookmarked_statuses": "Anda belum ada hantaran yang ditanda buku. Apabila anda menanda buku sesuatu, ia akan muncul di sini.",
"empty_column.community": "Garis masa tempatan kosong. Tulislah secara awam untuk memulakan sesuatu!",
- "empty_column.direct": "Anda tidak mempunyai mesej terus. Apabila anda menghantar atau menerimanya, ia akan muncul di sini.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Belum ada domain yang disekat.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Anda belum ada hantaran yang digemari. Apabila anda menggemari sesuatu, ia akan muncul di sini.",
@@ -264,6 +267,8 @@
"lightbox.expand": "Besarkan kotak paparan imej",
"lightbox.next": "Seterusnya",
"lightbox.previous": "Sebelumnya",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Tambah ke senarai",
"lists.account.remove": "Buang daripada senarai",
"lists.delete": "Padam senarai",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Tanda buku",
"navigation_bar.community_timeline": "Garis masa tempatan",
"navigation_bar.compose": "Karang hantaran baharu",
- "navigation_bar.direct": "Mesej terus",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Teroka",
"navigation_bar.domain_blocks": "Domain disekat",
"navigation_bar.edit_profile": "Sunting profil",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Buang undian",
"privacy.change": "Ubah privasi hantaran",
"privacy.direct.long": "Hanya boleh dilihat oleh pengguna disebut",
- "privacy.direct.short": "Terus",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Hanya boleh dilihat oleh pengikut",
- "privacy.private.short": "Pengikut sahaja",
- "privacy.public.long": "Boleh dilihat oleh semua orang, ditunjukkan di garis masa awam",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Awam",
- "privacy.unlisted.long": "Boleh dilihat oleh semua orang, tapi jangan tunjukkan di garis masa awam",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Tidak tersenarai",
"refresh": "Muat semula",
"regeneration_indicator.label": "Memuatkan…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Tidak boleh memuat naik fail bersama undian.",
"upload_form.audio_description": "Jelaskan untuk orang yang ada masalah pendengaran",
"upload_form.description": "Jelaskan untuk orang yang ada masalah penglihatan",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Sunting",
"upload_form.thumbnail": "Ubah gambar kecil",
"upload_form.undo": "Padam",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index f30755286..76a631b55 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -9,47 +9,47 @@
"account.browse_more_on_origin_server": "Meer op het originele profiel bekijken",
"account.cancel_follow_request": "Volgverzoek annuleren",
"account.direct": "@{name} een direct bericht sturen",
- "account.disable_notifications": "Geef geen melding meer wanneer @{name} toot",
+ "account.disable_notifications": "Geef geen melding meer wanneer @{name} een bericht plaatst",
"account.domain_blocked": "Domein geblokkeerd",
"account.edit_profile": "Profiel bewerken",
- "account.enable_notifications": "Geef een melding wanneer @{name} toot",
+ "account.enable_notifications": "Geef een melding wanneer @{name} een bericht plaatst",
"account.endorse": "Op profiel weergeven",
"account.follow": "Volgen",
"account.followers": "Volgers",
"account.followers.empty": "Niemand volgt nog deze gebruiker.",
"account.followers_counter": "{count, plural, one {{counter} volger} other {{counter} volgers}}",
- "account.following": "Following",
+ "account.following": "Volgend",
"account.following_counter": "{count, plural, one {{counter} volgend} other {{counter} volgend}}",
"account.follows.empty": "Deze gebruiker volgt nog niemand.",
"account.follows_you": "Volgt jou",
"account.hide_reblogs": "Boosts van @{name} verbergen",
"account.joined": "Geregistreerd in {date}",
"account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}",
- "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.",
+ "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie diegene kan volgen.",
"account.media": "Media",
"account.mention": "@{name} vermelden",
"account.moved_to": "{name} is verhuisd naar:",
"account.mute": "@{name} negeren",
"account.mute_notifications": "Meldingen van @{name} negeren",
"account.muted": "Genegeerd",
- "account.posts": "Toots",
- "account.posts_with_replies": "Toots en reacties",
+ "account.posts": "Berichten",
+ "account.posts_with_replies": "Berichten en reacties",
"account.report": "@{name} rapporteren",
"account.requested": "Wacht op goedkeuring. Klik om het volgverzoek te annuleren",
"account.share": "Profiel van @{name} delen",
"account.show_reblogs": "Boosts van @{name} tonen",
- "account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toots}}",
+ "account.statuses_counter": "{count, plural, one {{counter} bericht} other {{counter} berichten}}",
"account.unblock": "@{name} deblokkeren",
"account.unblock_domain": "{domain} niet langer verbergen",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Deblokkeren",
"account.unendorse": "Niet op profiel weergeven",
"account.unfollow": "Ontvolgen",
"account.unmute": "@{name} niet langer negeren",
"account.unmute_notifications": "Meldingen van @{name} niet langer negeren",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Niet langer negeren",
"account_note.placeholder": "Klik om een opmerking toe te voegen",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.daily_retention": "Retentiegraad van gebruikers per dag, vanaf registratie",
+ "admin.dashboard.monthly_retention": "Retentiegraad van gebruikers per maand, vanaf registratie",
"admin.dashboard.retention.average": "Gemiddelde",
"admin.dashboard.retention.cohort": "Aanmeldingsmaand",
"admin.dashboard.retention.cohort_size": "Nieuwe gebruikers",
@@ -79,7 +79,7 @@
"column.lists": "Lijsten",
"column.mutes": "Genegeerde gebruikers",
"column.notifications": "Meldingen",
- "column.pins": "Vastgezette toots",
+ "column.pins": "Vastgezette berichten",
"column.public": "Globale tijdlijn",
"column_back_button.label": "Terug",
"column_header.hide_settings": "Instellingen verbergen",
@@ -92,10 +92,12 @@
"community.column_settings.local_only": "Alleen lokaal",
"community.column_settings.media_only": "Alleen media",
"community.column_settings.remote_only": "Alleen andere servers",
- "compose_form.direct_message_warning": "Deze toot wordt alleen naar vermelde gebruikers verstuurd.",
+ "compose.language.change": "Taal veranderen",
+ "compose.language.search": "Talen zoeken...",
"compose_form.direct_message_warning_learn_more": "Meer leren",
- "compose_form.hashtag_warning": "Deze toot valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare toots kunnen via hashtags gevonden worden.",
- "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de toots zien die je alleen aan jouw volgers hebt gericht.",
+ "compose_form.encryption_warning": "Berichten op Mastodon worden, net zoals op andere social media, niet end-to-end versleuteld. Deel daarom geen gevoelige informatie via Mastodon.",
+ "compose_form.hashtag_warning": "Dit bericht valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare berichten kunnen via hashtags gevonden worden.",
+ "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de berichten zien die je alleen aan jouw volgers hebt gericht.",
"compose_form.lock_disclaimer.lock": "besloten",
"compose_form.placeholder": "Wat wil je kwijt?",
"compose_form.poll.add_option": "Keuze toevoegen",
@@ -104,9 +106,9 @@
"compose_form.poll.remove_option": "Deze keuze verwijderen",
"compose_form.poll.switch_to_multiple": "Poll wijzigen om meerdere keuzes toe te staan",
"compose_form.poll.switch_to_single": "Poll wijzigen om een enkele keuze toe te staan",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Toot!",
"compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "Wijzigingen opslaan",
"compose_form.sensitive.hide": "{count, plural, one {Media als gevoelig markeren} other {Media als gevoelig markeren}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is als gevoelig gemarkeerd} other {Media is als gevoelig gemarkeerd}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media is niet als gevoelig gemarkeerd} other {Media is niet als gevoelig gemarkeerd}}",
@@ -118,22 +120,22 @@
"confirmations.block.confirm": "Blokkeren",
"confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?",
"confirmations.delete.confirm": "Verwijderen",
- "confirmations.delete.message": "Weet je het zeker dat je deze toot wilt verwijderen?",
+ "confirmations.delete.message": "Weet je het zeker dat je dit bericht wilt verwijderen?",
"confirmations.delete_list.confirm": "Verwijderen",
"confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?",
"confirmations.discard_edit_media.confirm": "Weggooien",
"confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch weggooien?",
"confirmations.domain_block.confirm": "Verberg alles van deze server",
- "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen toots van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.",
+ "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen berichten van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.",
"confirmations.logout.confirm": "Uitloggen",
"confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?",
"confirmations.mute.confirm": "Negeren",
- "confirmations.mute.explanation": "Dit verbergt toots van hen en toots waar hen in wordt vermeld, maar hen kan nog steeds jouw toots bekijken en jou volgen.",
+ "confirmations.mute.explanation": "Dit verbergt diens berichten en berichten waar diegene in wordt vermeld, maar diegene kan nog steeds jouw berichten bekijken en jou volgen.",
"confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?",
"confirmations.redraft.confirm": "Verwijderen en herschrijven",
- "confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op de originele toot zitten niet meer aan de nieuwe toot vast.",
+ "confirmations.redraft.message": "Weet je zeker dat je dit bericht wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en de reacties op het originele bericht raak je kwijt.",
"confirmations.reply.confirm": "Reageren",
- "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
+ "confirmations.reply.message": "Door nu te reageren overschrijf je het bericht dat je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
"confirmations.unfollow.confirm": "Ontvolgen",
"confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
"conversation.delete": "Gesprek verwijderen",
@@ -144,9 +146,10 @@
"directory.local": "Alleen {domain}",
"directory.new_arrivals": "Nieuwe accounts",
"directory.recently_active": "Onlangs actief",
- "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.",
+ "embed.instructions": "Embed dit bericht op jouw website door de onderstaande code te kopiëren.",
"embed.preview": "Zo komt het eruit te zien:",
"emoji_button.activity": "Activiteiten",
+ "emoji_button.clear": "Leegmaken",
"emoji_button.custom": "Lokale emoji’s",
"emoji_button.flags": "Vlaggen",
"emoji_button.food": "Eten en drinken",
@@ -161,41 +164,41 @@
"emoji_button.symbols": "Symbolen",
"emoji_button.travel": "Reizen en locaties",
"empty_column.account_suspended": "Account opgeschort",
- "empty_column.account_timeline": "Hier zijn geen toots!",
+ "empty_column.account_timeline": "Hier zijn geen berichten!",
"empty_column.account_unavailable": "Profiel is niet beschikbaar",
"empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.",
- "empty_column.bookmarked_statuses": "Jij hebt nog geen toots aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.",
- "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de spits af te bijten!",
- "empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.",
+ "empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.",
+ "empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!",
+ "empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, komt deze hier te staan.",
"empty_column.domain_blocks": "Er zijn nog geen geblokkeerde domeinen.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
- "empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.",
+ "empty_column.explore_statuses": "Momenteel zijn er geen trends. Kom later terug!",
+ "empty_column.favourited_statuses": "Jij hebt nog geen favoriete berichten. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
+ "empty_column.favourites": "Niemand heeft dit bericht nog aan diens favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.",
"empty_column.follow_recommendations": "Het lijkt er op dat er geen aanbevelingen voor jou aangemaakt kunnen worden. Je kunt proberen te zoeken naar mensen die je wellicht kent, zoeken op hashtags, de lokale en globale tijdlijnen bekijken of de gebruikersgids doorbladeren.",
"empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.",
"empty_column.hashtag": "Er is nog niks te vinden onder deze hashtag.",
"empty_column.home": "Deze tijdlijn is leeg! Volg meer mensen om het te vullen. {suggestions}",
"empty_column.home.suggestions": "Enkele aanbevelingen bekijken",
- "empty_column.list": "Er is nog niks te zien in deze lijst. Wanneer lijstleden nieuwe toots publiceren, zijn deze hier te zien.",
+ "empty_column.list": "Er is nog niks te zien in deze lijst. Wanneer lijstleden nieuwe berichten plaatsen, zijn deze hier te zien.",
"empty_column.lists": "Jij hebt nog geen enkele lijst. Wanneer je er eentje hebt aangemaakt, valt deze hier te zien.",
"empty_column.mutes": "Jij hebt nog geen gebruikers genegeerd.",
"empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.",
- "empty_column.public": "Er is hier helemaal niks! Toot iets in het openbaar of volg mensen van andere servers om het te vullen",
+ "empty_column.public": "Er is hier helemaal niks! Plaatst een openbaar bericht of volg mensen van andere servers om het te vullen",
"error.unexpected_crash.explanation": "Als gevolg van een bug in onze broncode of als gevolg van een compatibiliteitsprobleem met jouw webbrowser, kan deze pagina niet goed worden weergegeven.",
"error.unexpected_crash.explanation_addons": "Deze pagina kon niet correct geladen worden. Deze fout wordt waarschijnlijk door een browser-add-on of een automatische vertalingshulpmiddel veroorzaakt.",
"error.unexpected_crash.next_steps": "Probeer deze pagina te vernieuwen. Wanneer dit niet helpt is het nog steeds mogelijk om Mastodon in een andere webbrowser of mobiele app te gebruiken.",
"error.unexpected_crash.next_steps_addons": "Probeer deze uit te schakelen en de pagina te verversen. Wanneer dat niet helpt, kun je Mastodon nog altijd met een andere webbrowser of mobiele app gebruiken.",
"errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren",
"errors.unexpected_crash.report_issue": "Technisch probleem melden",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
+ "explore.search_results": "Zoekresultaten",
+ "explore.suggested_follows": "Voor jou",
+ "explore.title": "Verkennen",
+ "explore.trending_links": "Nieuws",
+ "explore.trending_statuses": "Berichten",
"explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Klaar",
- "follow_recommendations.heading": "Volg mensen waarvan je graag toots wil zien! Hier zijn enkele aanbevelingen.",
- "follow_recommendations.lead": "Toots van mensen die je volgt zullen in chronologische volgorde onder start verschijnen. Wees niet bang om hierin fouten te maken, want je kunt mensen op elk moment net zo eenvoudig ontvolgen!",
+ "follow_recommendations.heading": "Volg mensen waarvan je graag berichten wil zien! Hier zijn enkele aanbevelingen.",
+ "follow_recommendations.lead": "Berichten van mensen die je volgt zullen in chronologische volgorde onder start verschijnen. Wees niet bang om hierin fouten te maken, want je kunt mensen op elk moment net zo eenvoudig ontvolgen!",
"follow_request.authorize": "Goedkeuren",
"follow_request.reject": "Afkeuren",
"follow_requests.unlocked_explanation": "Ook al is jouw account niet besloten, de medewerkers van {domain} denken dat jij misschien de volgende volgverzoeken handmatig wil controleren.",
@@ -227,13 +230,13 @@
"intervals.full.minutes": "{number, plural, one {# minuut} other {# minuten}}",
"keyboard_shortcuts.back": "Ga terug",
"keyboard_shortcuts.blocked": "Geblokkeerde gebruikers tonen",
- "keyboard_shortcuts.boost": "Toot boosten",
+ "keyboard_shortcuts.boost": "Bericht boosten",
"keyboard_shortcuts.column": "Op één van de kolommen focussen",
- "keyboard_shortcuts.compose": "Tekstveld voor toots focussen",
+ "keyboard_shortcuts.compose": "Tekstveld om een bericht te schrijven focussen",
"keyboard_shortcuts.description": "Omschrijving",
- "keyboard_shortcuts.direct": "Jouw directe berichten tonen",
+ "keyboard_shortcuts.direct": "Directe berichten tonen",
"keyboard_shortcuts.down": "Naar beneden in de lijst bewegen",
- "keyboard_shortcuts.enter": "Toot volledig tonen",
+ "keyboard_shortcuts.enter": "Volledig bericht tonen",
"keyboard_shortcuts.favourite": "Aan jouw favorieten toevoegen",
"keyboard_shortcuts.favourites": "Favorieten tonen",
"keyboard_shortcuts.federated": "Globale tijdlijn tonen",
@@ -247,7 +250,7 @@
"keyboard_shortcuts.my_profile": "Jouw profiel tonen",
"keyboard_shortcuts.notifications": "Meldingen tonen",
"keyboard_shortcuts.open_media": "Media openen",
- "keyboard_shortcuts.pinned": "Jouw vastgezette toots tonen",
+ "keyboard_shortcuts.pinned": "Jouw vastgemaakte berichten tonen",
"keyboard_shortcuts.profile": "Gebruikersprofiel auteur openen",
"keyboard_shortcuts.reply": "Reageren",
"keyboard_shortcuts.requests": "Jouw volgverzoeken tonen",
@@ -256,7 +259,7 @@
"keyboard_shortcuts.start": "\"Aan de slag\" tonen",
"keyboard_shortcuts.toggle_hidden": "Inhoudswaarschuwing tonen/verbergen",
"keyboard_shortcuts.toggle_sensitivity": "Media tonen/verbergen",
- "keyboard_shortcuts.toot": "Nieuwe toot schrijven",
+ "keyboard_shortcuts.toot": "Nieuw bericht schrijven",
"keyboard_shortcuts.unfocus": "Tekst- en zoekveld ontfocussen",
"keyboard_shortcuts.up": "Naar boven in de lijst bewegen",
"lightbox.close": "Sluiten",
@@ -264,6 +267,8 @@
"lightbox.expand": "Afbeelding groot weergeven",
"lightbox.next": "Volgende",
"lightbox.previous": "Vorige",
+ "limited_account_hint.action": "Alsnog het profiel tonen",
+ "limited_account_hint.title": "Dit profiel is door de moderatoren van jouw server verborgen.",
"lists.account.add": "Aan lijst toevoegen",
"lists.account.remove": "Uit lijst verwijderen",
"lists.delete": "Lijst verwijderen",
@@ -289,12 +294,12 @@
"navigation_bar.blocks": "Geblokkeerde gebruikers",
"navigation_bar.bookmarks": "Bladwijzers",
"navigation_bar.community_timeline": "Lokale tijdlijn",
- "navigation_bar.compose": "Nieuw toot schrijven",
+ "navigation_bar.compose": "Nieuw bericht schrijven",
"navigation_bar.direct": "Directe berichten",
"navigation_bar.discover": "Ontdekken",
"navigation_bar.domain_blocks": "Geblokkeerde domeinen",
"navigation_bar.edit_profile": "Profiel bewerken",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Verkennen",
"navigation_bar.favourites": "Favorieten",
"navigation_bar.filters": "Filters",
"navigation_bar.follow_requests": "Volgverzoeken",
@@ -305,23 +310,23 @@
"navigation_bar.logout": "Uitloggen",
"navigation_bar.mutes": "Genegeerde gebruikers",
"navigation_bar.personal": "Persoonlijk",
- "navigation_bar.pins": "Vastgezette toots",
+ "navigation_bar.pins": "Vastgemaakte berichten",
"navigation_bar.preferences": "Instellingen",
"navigation_bar.public_timeline": "Globale tijdlijn",
"navigation_bar.security": "Beveiliging",
- "notification.admin.sign_up": "{name} signed up",
- "notification.favourite": "{name} voegde jouw toot als favoriet toe",
+ "notification.admin.sign_up": "{name} heeft zich aangemeld",
+ "notification.favourite": "{name} voegde jouw bericht als favoriet toe",
"notification.follow": "{name} volgt jou nu",
"notification.follow_request": "{name} wil jou graag volgen",
"notification.mention": "{name} vermeldde jou",
"notification.own_poll": "Jouw poll is beëindigd",
"notification.poll": "Een poll waaraan jij hebt meegedaan is beëindigd",
- "notification.reblog": "{name} boostte jouw toot",
- "notification.status": "{name} heeft zojuist een toot geplaatst",
- "notification.update": "{name} edited a post",
+ "notification.reblog": "{name} boostte jouw bericht",
+ "notification.status": "{name} heeft zojuist een bericht geplaatst",
+ "notification.update": "{name} heeft een bericht bewerkt",
"notifications.clear": "Meldingen verwijderen",
"notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Nieuwe aanmeldingen:",
"notifications.column_settings.alert": "Desktopmeldingen",
"notifications.column_settings.favourite": "Favorieten:",
"notifications.column_settings.filter_bar.advanced": "Alle categorieën tonen",
@@ -335,10 +340,10 @@
"notifications.column_settings.reblog": "Boosts:",
"notifications.column_settings.show": "In kolom tonen",
"notifications.column_settings.sound": "Geluid afspelen",
- "notifications.column_settings.status": "Nieuwe toots:",
+ "notifications.column_settings.status": "Nieuwe berichten:",
"notifications.column_settings.unread_notifications.category": "Ongelezen meldingen",
"notifications.column_settings.unread_notifications.highlight": "Ongelezen meldingen markeren",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Bewerkingen:",
"notifications.filter.all": "Alles",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favorieten",
@@ -365,113 +370,113 @@
"poll.votes": "{votes, plural, one {# stem} other {# stemmen}}",
"poll_button.add_poll": "Poll toevoegen",
"poll_button.remove_poll": "Poll verwijderen",
- "privacy.change": "Zichtbaarheid van toot aanpassen",
+ "privacy.change": "Zichtbaarheid van bericht aanpassen",
"privacy.direct.long": "Alleen aan vermelde gebruikers tonen",
- "privacy.direct.short": "Direct",
+ "privacy.direct.short": "Alleen aan vermelde gebruikers tonen",
"privacy.private.long": "Alleen aan volgers tonen",
"privacy.private.short": "Alleen volgers",
- "privacy.public.long": "Voor iedereen zichtbaar en op openbare tijdlijnen tonen",
+ "privacy.public.long": "Voor iedereen zichtbaar",
"privacy.public.short": "Openbaar",
- "privacy.unlisted.long": "Voor iedereen zichtbaar, maar niet op openbare tijdlijnen tonen",
+ "privacy.unlisted.long": "Voor iedereen zichtbaar, maar niet onder trends, hashtags en op openbare tijdlijnen",
"privacy.unlisted.short": "Minder openbaar",
"refresh": "Vernieuwen",
"regeneration_indicator.label": "Aan het laden…",
"regeneration_indicator.sublabel": "Jouw tijdlijn wordt aangemaakt!",
"relative_time.days": "{number}d",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "{number, plural, one {# dag} other {# dagen}} geleden",
+ "relative_time.full.hours": "{number, plural, one {# uur} other {# uur}} geleden",
+ "relative_time.full.just_now": "zojuist",
+ "relative_time.full.minutes": "{number, plural, one {# minuut} other {# minuten}} geleden",
+ "relative_time.full.seconds": "{number, plural, one {# seconde} other {# seconden}} geleden",
"relative_time.hours": "{number}u",
"relative_time.just_now": "nu",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "vandaag",
"reply_indicator.cancel": "Annuleren",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
+ "report.block": "Blokkeren",
+ "report.block_explanation": "Je kunt diens berichten niet zien. Je kunt door diegene niet gevolgd worden en jouw berichten zijn onzichtbaar. Diegene kan zien dat die door jou is geblokkeerd.",
+ "report.categories.other": "Overig",
"report.categories.spam": "Spam",
- "report.categories.violation": "Content violates one or more server rules",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.categories.violation": "De inhoud overtreedt een of meerdere serverregels",
+ "report.category.subtitle": "Kies wat het meeste overeenkomt",
+ "report.category.title": "Vertel ons wat er met dit {type} aan de hand is",
+ "report.category.title_account": "profiel",
+ "report.category.title_status": "bericht",
+ "report.close": "Klaar",
+ "report.comment.title": "Zijn er nog andere dingen waarvan je denkt dat wij dat moeten weten?",
"report.forward": "Naar {target} doorsturen",
"report.forward_hint": "Het account bevindt zich op een andere server. Wil je daar eveneens een geanonimiseerde kopie van deze rapportage naar toe sturen?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "Negeren",
+ "report.mute_explanation": "Je kunt diens berichten niet zien. Je kunt nog wel gevolgd worden en jouw berichten zijn nog zichtbaar, maar diegene kan niet zien dat die wordt genegeerd.",
+ "report.next": "Volgende",
"report.placeholder": "Extra opmerkingen",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.dislike": "Ik vind het niet leuk",
+ "report.reasons.dislike_description": "Het is iets wat je niet wilt zien",
+ "report.reasons.other": "Het is iets anders",
+ "report.reasons.other_description": "Het probleem past niet in een andere categorie",
+ "report.reasons.spam": "Het is spam",
+ "report.reasons.spam_description": "Schadelijke links, reclame, misleiding of herhalende antwoorden",
+ "report.reasons.violation": "Het schendt de serverregels",
+ "report.reasons.violation_description": "Je weet dat het specifieke regels schendt",
+ "report.rules.subtitle": "Selecteer wat van toepassing is",
+ "report.rules.title": "Welke regels worden geschonden?",
+ "report.statuses.subtitle": "Selecteer wat van toepassing is",
+ "report.statuses.title": "Zijn er berichten die deze rapportage ondersteunen?",
"report.submit": "Verzenden",
"report.target": "{target} rapporteren",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Hier zijn jouw opties waarmee je kunt bepalen wat je in Mastodon wilt zien:",
+ "report.thanks.take_action_actionable": "Terwijl wij jouw rapportage beroordelen, kun je deze acties ondernemen tegen @{name}:",
+ "report.thanks.title": "Wil je dit niet zien?",
+ "report.thanks.title_actionable": "Dank je voor het rapporteren. Wij gaan er naar kijken.",
+ "report.unfollow": "@{name} ontvolgen",
+ "report.unfollow_explanation": "Je volgt dit account. Om diens berichten niet meer op jouw starttijdlijn te zien, kun je diegene ontvolgen.",
"search.placeholder": "Zoeken",
"search_popout.search_format": "Geavanceerd zoeken",
- "search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken in jouw toots, gebooste toots, favorieten en in toots waarin je bent vermeldt, en tevens naar gebruikersnamen, weergavenamen en hashtags.",
+ "search_popout.tips.full_text": "Gebruik gewone tekst om te zoeken in jouw berichten, gebooste berichten, favorieten en in berichten waarin je bent vermeldt, en tevens naar gebruikersnamen, weergavenamen en hashtags.",
"search_popout.tips.hashtag": "hashtag",
- "search_popout.tips.status": "toot",
+ "search_popout.tips.status": "bericht",
"search_popout.tips.text": "Gebruik gewone tekst om te zoeken op weergavenamen, gebruikersnamen en hashtags",
"search_popout.tips.user": "gebruiker",
"search_results.accounts": "Gebruikers",
- "search_results.all": "All",
+ "search_results.all": "Alles",
"search_results.hashtags": "Hashtags",
- "search_results.nothing_found": "Could not find anything for these search terms",
- "search_results.statuses": "Toots",
- "search_results.statuses_fts_disabled": "Het zoeken in toots is op deze Mastodon-server niet ingeschakeld.",
+ "search_results.nothing_found": "Deze zoektermen leveren geen resultaat op",
+ "search_results.statuses": "Berichten",
+ "search_results.statuses_fts_disabled": "Het zoeken in berichten is op deze Mastodon-server niet ingeschakeld.",
"search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
"status.admin_account": "Moderatie-omgeving van @{name} openen",
- "status.admin_status": "Deze toot in de moderatie-omgeving openen",
+ "status.admin_status": "Dit bericht in de moderatie-omgeving openen",
"status.block": "@{name} blokkeren",
"status.bookmark": "Bladwijzer toevoegen",
"status.cancel_reblog_private": "Niet langer boosten",
- "status.cannot_reblog": "Deze toot kan niet geboost worden",
- "status.copy": "Link naar toot kopiëren",
+ "status.cannot_reblog": "Dit bericht kan niet geboost worden",
+ "status.copy": "Link naar bericht kopiëren",
"status.delete": "Verwijderen",
"status.detailed_status": "Uitgebreide gespreksweergave",
"status.direct": "@{name} een direct bericht sturen",
- "status.edit": "Edit",
- "status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edit": "Bewerken",
+ "status.edited": "Bewerkt op {date}",
+ "status.edited_x_times": "{count, plural, one {{count} keer} other {{count} keer}} bewerkt",
"status.embed": "Insluiten",
"status.favourite": "Favoriet",
"status.filtered": "Gefilterd",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "{name} plaatste dit {date}",
+ "status.history.edited": "{name} bewerkte dit {date}",
"status.load_more": "Meer laden",
"status.media_hidden": "Media verborgen",
"status.mention": "@{name} vermelden",
"status.more": "Meer",
"status.mute": "@{name} negeren",
"status.mute_conversation": "Negeer gesprek",
- "status.open": "Volledige toot tonen",
+ "status.open": "Volledig bericht tonen",
"status.pin": "Aan profielpagina vastmaken",
- "status.pinned": "Vastgemaakte toot",
+ "status.pinned": "Vastgemaakt bericht",
"status.read_more": "Meer lezen",
"status.reblog": "Boosten",
"status.reblog_private": "Boost naar oorspronkelijke ontvangers",
"status.reblogged_by": "{name} boostte",
- "status.reblogs.empty": "Niemand heeft deze toot nog geboost. Wanneer iemand dit doet, valt dat hier te zien.",
+ "status.reblogs.empty": "Niemand heeft dit bericht nog geboost. Wanneer iemand dit doet, valt dat hier te zien.",
"status.redraft": "Verwijderen en herschrijven",
"status.remove_bookmark": "Bladwijzer verwijderen",
"status.reply": "Reageren",
@@ -502,7 +507,7 @@
"timeline_hint.remote_resource_not_displayed": "{resource} van andere servers worden niet getoond.",
"timeline_hint.resources.followers": "Volgers",
"timeline_hint.resources.follows": "Volgend",
- "timeline_hint.resources.statuses": "Oudere toots",
+ "timeline_hint.resources.statuses": "Oudere berichten",
"trends.counter_by_accounts": "{count, plural, one {{counter} persoon} other {{counter} personen}} zijn aan het praten",
"trends.trending_now": "Huidige trends",
"ui.beforeunload": "Je concept gaat verloren wanneer je Mastodon verlaat.",
@@ -515,6 +520,7 @@
"upload_error.poll": "Het uploaden van bestanden is in polls niet toegestaan.",
"upload_form.audio_description": "Omschrijf dit voor mensen met een auditieve beperking",
"upload_form.description": "Omschrijf dit voor mensen met een visuele beperking",
+ "upload_form.description_missing": "Geen omschrijving toegevoegd",
"upload_form.edit": "Bewerken",
"upload_form.thumbnail": "Miniatuurafbeelding wijzigen",
"upload_form.undo": "Verwijderen",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 40a961c5e..cd802bed0 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -18,7 +18,7 @@
"account.followers": "Fylgjarar",
"account.followers.empty": "Ingen fylgjer denne brukaren enno.",
"account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}",
- "account.following": "Following",
+ "account.following": "Følger",
"account.following_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjar}}",
"account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.",
"account.follows_you": "Fylgjer deg",
@@ -41,16 +41,16 @@
"account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tut}}",
"account.unblock": "Slutt å blokera @{name}",
"account.unblock_domain": "Vis {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Opphev blokkering",
"account.unendorse": "Ikkje framhev på profil",
"account.unfollow": "Slutt å fylgja",
"account.unmute": "Av-demp @{name}",
"account.unmute_notifications": "Vis varsel frå @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Opphev demping",
"account_note.placeholder": "Klikk for å leggja til merknad",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
+ "admin.dashboard.retention.average": "Gjennomsnitt",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "Nye brukere",
"alert.rate_limited.message": "Ver venleg å prøva igjen etter {retry_time, time, medium}.",
@@ -70,7 +70,7 @@
"column.blocks": "Blokkerte brukarar",
"column.bookmarks": "Bokmerke",
"column.community": "Lokal tidsline",
- "column.direct": "Meldingar",
+ "column.direct": "Direct messages",
"column.directory": "Sjå gjennom profilar",
"column.domain_blocks": "Gøymde domene",
"column.favourites": "Favorittar",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Berre lokalt",
"community.column_settings.media_only": "Berre media",
"community.column_settings.remote_only": "Berre eksternt",
- "compose_form.direct_message_warning": "Dette tutet vert berre synleg for nemnde brukarar.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Lær meir",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Dette tutet vert ikkje oppført under nokon emneknagg sidan det ikkje er oppført. Berre offentlege tut kan verta søkt etter med emneknagg.",
"compose_form.lock_disclaimer": "Kontoen din er ikkje {locked}. Kven som helst kan fylgja deg for å sjå innlegga dine som berre visast til fylgjarar.",
"compose_form.lock_disclaimer.lock": "låst",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Ta vekk dette valet",
"compose_form.poll.switch_to_multiple": "Endre avstemninga til å tillate fleirval",
"compose_form.poll.switch_to_single": "Endra avstemninga til tillate berre eitt val",
- "compose_form.publish": "Tut",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Merk medium som sensitivt",
@@ -147,6 +149,7 @@
"embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden under.",
"embed.preview": "Slik bid det å sjå ut:",
"emoji_button.activity": "Aktivitet",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Eige",
"emoji_button.flags": "Flagg",
"emoji_button.food": "Mat & drikke",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Du har ikkje blokkert nokon brukarar enno.",
"empty_column.bookmarked_statuses": "Du har ikkje nokon bokmerkte tut enno. Når du bokmerkjer eit, dukkar det opp her.",
"empty_column.community": "Den lokale samtiden er tom. Skriv noko offentleg å få ballen til å rulle!",
- "empty_column.direct": "Du har ingen direktemeldingar ennå. Når du sender eller får ein vil den dukke opp her.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Det er ingen gøymde domene ennå.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Du har ingen favoritt-tut ennå. Når du merkjer ein som favoritt, så dukkar det opp her.",
@@ -187,11 +190,11 @@
"error.unexpected_crash.next_steps_addons": "Prøv å deaktivere dem og laste siden på nytt. Hvis det ikke hjelper, kan du fremdeles bruke Mastodon via en annen nettleser eller en annen app.",
"errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace til utklippstavla",
"errors.unexpected_crash.report_issue": "Rapporter problem",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
+ "explore.search_results": "Søkeresultater",
+ "explore.suggested_follows": "For deg",
+ "explore.title": "Utforsk",
+ "explore.trending_links": "Nyheter",
+ "explore.trending_statuses": "Innlegg",
"explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Ferdig",
"follow_recommendations.heading": "Følg folk du ønsker å se innlegg fra! Her er noen forslag.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "for å fokusera på ein status i ei av kolonnane",
"keyboard_shortcuts.compose": "for å fokusera tekstfeltet for skriving",
"keyboard_shortcuts.description": "Skildring",
- "keyboard_shortcuts.direct": "for å opna direktemeldingskolonna",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "for å flytta seg opp og ned i lista",
"keyboard_shortcuts.enter": "for å opna status",
"keyboard_shortcuts.favourite": "for å merkja som favoritt",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ekspander bildevisning boks",
"lightbox.next": "Neste",
"lightbox.previous": "Førre",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Legg til i liste",
"lists.account.remove": "Fjern frå liste",
"lists.delete": "Slett liste",
@@ -290,11 +295,11 @@
"navigation_bar.bookmarks": "Bokmerke",
"navigation_bar.community_timeline": "Lokal tidsline",
"navigation_bar.compose": "Lag eit nytt tut",
- "navigation_bar.direct": "Direktemeldingar",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Oppdag",
"navigation_bar.domain_blocks": "Skjulte domene",
"navigation_bar.edit_profile": "Rediger profil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Utforsk",
"navigation_bar.favourites": "Favorittar",
"navigation_bar.filters": "Målbundne ord",
"navigation_bar.follow_requests": "Fylgjeførespurnader",
@@ -338,7 +343,7 @@
"notifications.column_settings.status": "Nye tuter:",
"notifications.column_settings.unread_notifications.category": "Unread notifications",
"notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Redigeringer:",
"notifications.filter.all": "Alle",
"notifications.filter.boosts": "Framhevingar",
"notifications.filter.favourites": "Favorittar",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Fjern røyst",
"privacy.change": "Juster status-synlegheit",
"privacy.direct.long": "Legg berre ut for nemnde brukarar",
- "privacy.direct.short": "Direkte",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Post kun til følgjarar",
- "privacy.private.short": "Kun følgjarar",
- "privacy.public.long": "Post til offentlege tidslinjer",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Offentleg",
- "privacy.unlisted.long": "Ikkje post til offentlege tidslinjer",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Uoppført",
"refresh": "Oppdater",
"regeneration_indicator.label": "Lastar…",
@@ -389,28 +394,28 @@
"relative_time.seconds": "{number}sek",
"relative_time.today": "i dag",
"reply_indicator.cancel": "Avbryt",
- "report.block": "Block",
+ "report.block": "Blokker",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Other",
- "report.categories.spam": "Spam",
+ "report.categories.spam": "Søppelpost",
"report.categories.violation": "Content violates one or more server rules",
"report.category.subtitle": "Choose the best match",
"report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "innlegg",
+ "report.close": "Utført",
"report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Vidaresend til {target}",
"report.forward_hint": "Kontoen er frå ein annan tenar. Vil du senda ein anonymisert kopi av rapporten dit òg?",
- "report.mute": "Mute",
+ "report.mute": "Demp",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.next": "Neste",
"report.placeholder": "Tilleggskommentarar",
- "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike": "Jeg liker det ikke",
"report.reasons.dislike_description": "It is not something you want to see",
"report.reasons.other": "It's something else",
"report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
+ "report.reasons.spam": "Det er spam",
"report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
"report.reasons.violation": "It violates server rules",
"report.reasons.violation_description": "You are aware that it breaks specific rules",
@@ -515,6 +520,7 @@
"upload_error.poll": "Filopplasting ikkje tillate med meiningsmålingar.",
"upload_form.audio_description": "Grei ut for folk med nedsett høyrsel",
"upload_form.description": "Skildr for synshemja",
+ "upload_form.description_missing": "Ingen beskrivelse lagt til",
"upload_form.edit": "Rediger",
"upload_form.thumbnail": "Bytt miniatyrbilete",
"upload_form.undo": "Slett",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index e4474f6d9..c188a868b 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -18,7 +18,7 @@
"account.followers": "Følgere",
"account.followers.empty": "Ingen følger denne brukeren ennå.",
"account.followers_counter": "{count, plural, one {{counter} følger} other {{counter} følgere}}",
- "account.following": "Following",
+ "account.following": "Følger",
"account.following_counter": "{count, plural, one {{counter} som følges} other {{counter} som følges}}",
"account.follows.empty": "Denne brukeren følger ikke noen enda.",
"account.follows_you": "Følger deg",
@@ -41,16 +41,16 @@
"account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tuter}}",
"account.unblock": "Avblokker @{name}",
"account.unblock_domain": "Vis {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Opphev blokkering",
"account.unendorse": "Ikke vis frem på profilen",
"account.unfollow": "Avfølg",
"account.unmute": "Avdemp @{name}",
"account.unmute_notifications": "Vis varsler fra @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Opphev demping",
"account_note.placeholder": "Klikk for å legge til et notat",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
- "admin.dashboard.retention.average": "Average",
+ "admin.dashboard.retention.average": "Gjennomsnitt",
"admin.dashboard.retention.cohort": "Sign-up month",
"admin.dashboard.retention.cohort_size": "Nye brukere",
"alert.rate_limited.message": "Vennligst prøv igjen etter kl. {retry_time, time, medium}.",
@@ -70,7 +70,7 @@
"column.blocks": "Blokkerte brukere",
"column.bookmarks": "Bokmerker",
"column.community": "Lokal tidslinje",
- "column.direct": "Direktemeldinger",
+ "column.direct": "Direct messages",
"column.directory": "Bla gjennom profiler",
"column.domain_blocks": "Skjulte domener",
"column.favourites": "Likt",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Kun lokalt",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Kun eksternt",
- "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Lær mer",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Denne tuten blir ikke listet under noen emneknagger da den er ulistet. Kun offentlige tuter kan søktes etter med emneknagg.",
"compose_form.lock_disclaimer": "Din konto er ikke {locked}. Hvem som helst kan følge deg og se dine private poster.",
"compose_form.lock_disclaimer.lock": "låst",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Fjern dette valget",
"compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg",
"compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg",
- "compose_form.publish": "Tut",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Merk media som sensitivt",
@@ -147,6 +149,7 @@
"embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.",
"embed.preview": "Slik kommer det til å se ut:",
"emoji_button.activity": "Aktivitet",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Tilpasset",
"emoji_button.flags": "Flagg",
"emoji_button.food": "Mat og drikke",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Du har ikke blokkert noen brukere enda.",
"empty_column.bookmarked_statuses": "Du har ikke bokmerket noen tuter enda. Når du bokmerker en, vil den dukke opp her.",
"empty_column.community": "Den lokale tidslinjen er tom. Skriv noe offentlig for å få snøballen til å rulle!",
- "empty_column.direct": "Du har ingen direktemeldinger enda. Når du mottar eller sender en, vil den dukke opp her.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Det er ingen skjulte domener enda.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Du har ikke likt noen tuter enda. Når du liker en, vil den dukke opp her.",
@@ -187,11 +190,11 @@
"error.unexpected_crash.next_steps_addons": "Prøv å deaktivere dem og laste siden på nytt. Hvis det ikke hjelper, kan du fremdeles bruke Mastodon via en annen nettleser eller en annen app.",
"errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace-en til utklippstavlen",
"errors.unexpected_crash.report_issue": "Rapporter en feil",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
+ "explore.search_results": "Søkeresultater",
+ "explore.suggested_follows": "For deg",
+ "explore.title": "Utforsk",
+ "explore.trending_links": "Nyheter",
+ "explore.trending_statuses": "Innlegg",
"explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Utført",
"follow_recommendations.heading": "Følg folk du ønsker å se innlegg fra! Her er noen forslag.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "å fokusere en status i en av kolonnene",
"keyboard_shortcuts.compose": "å fokusere komponeringsfeltet",
"keyboard_shortcuts.description": "Beskrivelse",
- "keyboard_shortcuts.direct": "åpne direktemeldingskolonnen",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "for å flytte ned i listen",
"keyboard_shortcuts.enter": "å åpne status",
"keyboard_shortcuts.favourite": "for å favorittmarkere",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ekspander bildevisning boks",
"lightbox.next": "Neste",
"lightbox.previous": "Forrige",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Legg til i listen",
"lists.account.remove": "Fjern fra listen",
"lists.delete": "Slett listen",
@@ -290,11 +295,11 @@
"navigation_bar.bookmarks": "Bokmerker",
"navigation_bar.community_timeline": "Lokal tidslinje",
"navigation_bar.compose": "Skriv en ny tut",
- "navigation_bar.direct": "Direktemeldinger",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Oppdag",
"navigation_bar.domain_blocks": "Skjulte domener",
"navigation_bar.edit_profile": "Rediger profil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Utforsk",
"navigation_bar.favourites": "Favoritter",
"navigation_bar.filters": "Stilnede ord",
"navigation_bar.follow_requests": "Følgeforespørsler",
@@ -338,7 +343,7 @@
"notifications.column_settings.status": "Nye tuter:",
"notifications.column_settings.unread_notifications.category": "Unread notifications",
"notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Redigeringer:",
"notifications.filter.all": "Alle",
"notifications.filter.boosts": "Fremhevinger",
"notifications.filter.favourites": "Favoritter",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Fjern avstemningen",
"privacy.change": "Justér synlighet",
"privacy.direct.long": "Post kun til nevnte brukere",
- "privacy.direct.short": "Direkte",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Post kun til følgere",
- "privacy.private.short": "Privat",
- "privacy.public.long": "Post kun til offentlige tidslinjer",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Offentlig",
- "privacy.unlisted.long": "Ikke vis i offentlige tidslinjer",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Uoppført",
"refresh": "Oppfrisk",
"regeneration_indicator.label": "Laster…",
@@ -389,28 +394,28 @@
"relative_time.seconds": "{number}s",
"relative_time.today": "i dag",
"reply_indicator.cancel": "Avbryt",
- "report.block": "Block",
+ "report.block": "Blokker",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.other": "Other",
- "report.categories.spam": "Spam",
+ "report.categories.spam": "Søppelpost",
"report.categories.violation": "Content violates one or more server rules",
"report.category.subtitle": "Choose the best match",
"report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
+ "report.category.title_account": "profil",
+ "report.category.title_status": "innlegg",
+ "report.close": "Utført",
"report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Videresend til {target}",
"report.forward_hint": "Denne kontoen er fra en annen tjener. Vil du sende en anonymisert kopi av rapporten dit også?",
- "report.mute": "Mute",
+ "report.mute": "Demp",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.next": "Neste",
"report.placeholder": "Tilleggskommentarer",
- "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike": "Jeg liker det ikke",
"report.reasons.dislike_description": "It is not something you want to see",
"report.reasons.other": "It's something else",
"report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
+ "report.reasons.spam": "Det er spam",
"report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
"report.reasons.violation": "It violates server rules",
"report.reasons.violation_description": "You are aware that it breaks specific rules",
@@ -515,6 +520,7 @@
"upload_error.poll": "Filopplasting inni avstemninger er ikke tillatt.",
"upload_form.audio_description": "Beskriv det for folk med hørselstap",
"upload_form.description": "Beskriv for synshemmede",
+ "upload_form.description_missing": "Ingen beskrivelse lagt til",
"upload_form.edit": "Rediger",
"upload_form.thumbnail": "Endre miniatyrbilde",
"upload_form.undo": "Angre",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index ff819e0fd..3a57a5c3f 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -18,7 +18,7 @@
"account.followers": "Seguidors",
"account.followers.empty": "Degun sèc pas aqueste utilizaire pel moment.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
- "account.following": "Following",
+ "account.following": "Abonat",
"account.following_counter": "{count, plural, one {{counter} Abonaments} other {{counter} Abonaments}}",
"account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.",
"account.follows_you": "Vos sèc",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
"account.unblock": "Desblocar @{name}",
"account.unblock_domain": "Desblocar {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Desblocat",
"account.unendorse": "Mostrar pas pel perfil",
"account.unfollow": "Quitar de sègre",
"account.unmute": "Quitar de rescondre @{name}",
"account.unmute_notifications": "Mostrar las notificacions de @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Tornar afichar",
"account_note.placeholder": "Clicar per ajustar una nòta",
"admin.dashboard.daily_retention": "User retention rate by day after sign-up",
"admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Sonque local",
"community.column_settings.media_only": "Solament los mèdias",
"community.column_settings.remote_only": "Sonque alonhat",
- "compose_form.direct_message_warning": "Sols los mencionats poiràn veire aqueste tut.",
+ "compose.language.change": "Cambiar de lenga",
+ "compose.language.search": "Recercar de lengas...",
"compose_form.direct_message_warning_learn_more": "Ne saber mai",
+ "compose_form.encryption_warning": "Las pubicacions sus Mastodon son pas chifradas del cap a la fin. Partegetz pas d’informacions sensiblas sus Mastodon.",
"compose_form.hashtag_warning": "Aqueste tut serà pas ligat a cap d’etiqueta estant qu’es pas listat. Òm pòt pas cercar que los tuts publics per etiqueta.",
"compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo mond pòt vos sègre e veire los estatuts reservats als seguidors.",
"compose_form.lock_disclaimer.lock": "clavat",
@@ -104,9 +106,9 @@
"compose_form.poll.remove_option": "Levar aquesta opcion",
"compose_form.poll.switch_to_multiple": "Cambiar lo sondatge per permetre de causidas multiplas",
"compose_form.poll.switch_to_single": "Cambiar lo sondatge per permetre una sola causida",
- "compose_form.publish": "Tut",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish} !",
- "compose_form.save_changes": "Save changes",
+ "compose_form.save_changes": "Salvar los cambiaments",
"compose_form.sensitive.hide": "Marcar coma sensible",
"compose_form.sensitive.marked": "Lo mèdia es marcat coma sensible",
"compose_form.sensitive.unmarked": "Lo mèdia es pas marcat coma sensible",
@@ -147,6 +149,7 @@
"embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.",
"embed.preview": "Semblarà aquò :",
"emoji_button.activity": "Activitats",
+ "emoji_button.clear": "Escafar",
"emoji_button.custom": "Personalizats",
"emoji_button.flags": "Drapèus",
"emoji_button.food": "Beure e manjar",
@@ -187,12 +190,12 @@
"error.unexpected_crash.next_steps_addons": "Ensajatz de los desactivar o actualizatz la pagina. Se aquò ajuda pas, podètz ensajar d’utilizar Mastodon via un autre navigador o una aplicacion nativa.",
"errors.unexpected_crash.copy_stacktrace": "Copiar las traças al quichapapièrs",
"errors.unexpected_crash.report_issue": "Senhalar un problèma",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "Resultats de recèrca",
+ "explore.suggested_follows": "Per vos",
+ "explore.title": "Explorar",
+ "explore.trending_links": "Novèlas",
+ "explore.trending_statuses": "Publicacions",
+ "explore.trending_tags": "Etiquetas",
"follow_recommendations.done": "Acabat",
"follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
"follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "centrar un estatut a una colomna",
"keyboard_shortcuts.compose": "anar al camp tèxte",
"keyboard_shortcuts.description": "descripcion",
- "keyboard_shortcuts.direct": "dobrir la colomna de messatges dirèctes",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "far davalar dins la lista",
"keyboard_shortcuts.enter": "dobrir los estatuts",
"keyboard_shortcuts.favourite": "apondre als favorits",
@@ -264,6 +267,8 @@
"lightbox.expand": "Espandir la fenèstra de visualizacion d’imatge",
"lightbox.next": "Seguent",
"lightbox.previous": "Precedent",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Ajustar a la lista",
"lists.account.remove": "Levar de la lista",
"lists.delete": "Suprimir la lista",
@@ -294,7 +299,7 @@
"navigation_bar.discover": "Trobar",
"navigation_bar.domain_blocks": "Domenis resconduts",
"navigation_bar.edit_profile": "Modificar lo perfil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favorits",
"navigation_bar.filters": "Mots ignorats",
"navigation_bar.follow_requests": "Demandas d’abonament",
@@ -309,7 +314,7 @@
"navigation_bar.preferences": "Preferéncias",
"navigation_bar.public_timeline": "Flux public global",
"navigation_bar.security": "Seguretat",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "{name} se marquèt",
"notification.favourite": "{name} a ajustat a sos favorits",
"notification.follow": "{name} vos sèc",
"notification.follow_request": "{name} a demandat a vos sègre",
@@ -318,7 +323,7 @@
"notification.poll": "Avètz participat a un sondatge que ven de s’acabar",
"notification.reblog": "{name} a partejat vòstre estatut",
"notification.status": "{name} ven de publicar",
- "notification.update": "{name} edited a post",
+ "notification.update": "{name} modiquè sa publicacion",
"notifications.clear": "Escafar",
"notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?",
"notifications.column_settings.admin.sign_up": "New sign-ups:",
@@ -362,51 +367,51 @@
"poll.total_votes": "{count, plural, one {# vòte} other {# vòtes}}",
"poll.vote": "Votar",
"poll.voted": "Avètz votat per aquesta responsa",
- "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+ "poll.votes": "{votes, plural, one {# vòte} other {# vòtes}}",
"poll_button.add_poll": "Ajustar un sondatge",
"poll_button.remove_poll": "Levar lo sondatge",
"privacy.change": "Ajustar la confidencialitat del messatge",
"privacy.direct.long": "Mostrar pas qu’a las personas mencionadas",
- "privacy.direct.short": "Dirècte",
+ "privacy.direct.short": "Sonque per las personas mencionadas",
"privacy.private.long": "Mostrar pas qu’a vòstres seguidors",
- "privacy.private.short": "Privat",
- "privacy.public.long": "Mostrar dins los fluxes publics",
+ "privacy.private.short": "Sonque pels seguidors",
+ "privacy.public.long": "Visiblas per totes",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Mostrar pas dins los fluxes publics",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Pas-listat",
"refresh": "Actualizar",
"regeneration_indicator.label": "Cargament…",
"regeneration_indicator.sublabel": "Sèm a preparar vòstre flux d’acuèlh !",
"relative_time.days": "fa {number}d",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
- "relative_time.full.just_now": "just now",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.days": "{number, plural, one {# jorn} other {# jorns}} ago",
+ "relative_time.full.hours": "fa {number, plural, one {# ora} other {# oras}}",
+ "relative_time.full.just_now": "ara",
+ "relative_time.full.minutes": "fa {number, plural, one {# minuta} other {# minutas}}",
+ "relative_time.full.seconds": "fa {number, plural, one {# segonda} other {# segondas}}",
"relative_time.hours": "fa {number}h",
"relative_time.just_now": "ara",
"relative_time.minutes": "fa {number} min",
"relative_time.seconds": "fa {number}s",
"relative_time.today": "uèi",
"reply_indicator.cancel": "Anullar",
- "report.block": "Block",
+ "report.block": "Blocar",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
- "report.categories.other": "Other",
+ "report.categories.other": "Autre",
"report.categories.spam": "Spam",
"report.categories.violation": "Content violates one or more server rules",
"report.category.subtitle": "Choose the best match",
"report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
- "report.category.title_status": "post",
- "report.close": "Done",
+ "report.category.title_account": "perfil",
+ "report.category.title_status": "publicacion",
+ "report.close": "Acabat",
"report.comment.title": "Is there anything else you think we should know?",
"report.forward": "Far sègre a {target}",
"report.forward_hint": "Lo compte ven d’un autre servidor. Volètz mandar una còpia anonima del rapòrt enlai tanben ?",
- "report.mute": "Mute",
+ "report.mute": "Amudir",
"report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.next": "Seguent",
"report.placeholder": "Comentaris addicionals",
- "report.reasons.dislike": "I don't like it",
+ "report.reasons.dislike": "M’agrada pas",
"report.reasons.dislike_description": "It is not something you want to see",
"report.reasons.other": "It's something else",
"report.reasons.other_description": "The issue does not fit into other categories",
@@ -422,9 +427,9 @@
"report.target": "Senhalar {target}",
"report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
+ "report.thanks.title": "Volètz pas veire aquò ?",
"report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
+ "report.unfollow": "Quitar de sègre {name}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Recercar",
"search_popout.search_format": "Format recèrca avançada",
@@ -434,7 +439,7 @@
"search_popout.tips.text": "Lo tèxte brut tòrna escais, noms d’utilizaire e etiquetas correspondents",
"search_popout.tips.user": "utilizaire",
"search_results.accounts": "Gents",
- "search_results.all": "All",
+ "search_results.all": "Tot",
"search_results.hashtags": "Etiquetas",
"search_results.nothing_found": "Could not find anything for these search terms",
"search_results.statuses": "Tuts",
@@ -450,14 +455,14 @@
"status.delete": "Escafar",
"status.detailed_status": "Vista detalhada de la convèrsa",
"status.direct": "Messatge per @{name}",
- "status.edit": "Edit",
+ "status.edit": "Modificar",
"status.edited": "Edited {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edited_x_times": "Modificat {count, plural, un {{count} còp} other {{count} còps}}",
"status.embed": "Embarcar",
"status.favourite": "Apondre als favorits",
"status.filtered": "Filtrat",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "{name} o creèt lo {date}",
+ "status.history.edited": "{name} o modifiquèt lo {date}",
"status.load_more": "Cargar mai",
"status.media_hidden": "Mèdia rescondut",
"status.mention": "Mencionar",
@@ -515,6 +520,7 @@
"upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.",
"upload_form.audio_description": "Descriure per las personas amb pèrdas auditivas",
"upload_form.description": "Descripcion pels mal vesents",
+ "upload_form.description_missing": "Cap de descripcion pas aponduda",
"upload_form.edit": "Modificar",
"upload_form.thumbnail": "Cambiar la vinheta",
"upload_form.undo": "Suprimir",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index 088b5ff36..658a3318e 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 445f919db..2878f7104 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -48,8 +48,8 @@
"account.unmute_notifications": "Cofnij wyciszenie powiadomień od @{name}",
"account.unmute_short": "Włącz dźwięki",
"account_note.placeholder": "Naciśnij aby dodać notatkę",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników po dniach od rejestracji",
+ "admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników po miesiącach od rejestracji",
"admin.dashboard.retention.average": "Średnia",
"admin.dashboard.retention.cohort": "Miesiąc rejestracji",
"admin.dashboard.retention.cohort_size": "Nowi użytkownicy",
@@ -96,9 +96,11 @@
"community.column_settings.local_only": "Tylko Lokalne",
"community.column_settings.media_only": "Tylko zawartość multimedialna",
"community.column_settings.remote_only": "Tylko Zdalne",
- "compose_form.direct_message_warning": "Ten wpis będzie widoczny tylko dla wszystkich wspomnianych użytkowników.",
+ "compose.language.change": "Zmień język",
+ "compose.language.search": "Szukaj języków...",
"compose_form.direct_message_warning_learn_more": "Dowiedz się więcej",
- "compose_form.hashtag_warning": "Ten wpis nie będzie widoczny pod podanymi hashtagami, ponieważ jest oznaczony jako niewidoczny. Tylko publiczne wpisy mogą zostać znalezione z użyciem hashtagów.",
+ "compose_form.encryption_warning": "Posty na Mastodon nie są szyfrowane end-to-end. Nie udostępniaj żadnych wrażliwych informacji przez Mastodon.",
+ "compose_form.hashtag_warning": "Ten wpis nie będzie widoczny pod podanymi hasztagami, ponieważ jest oznaczony jako niewidoczny. Tylko publiczne wpisy mogą zostać znalezione z użyciem hasztagów.",
"compose_form.lock_disclaimer": "Twoje konto nie jest {locked}. Każdy, kto Cię śledzi, może wyświetlać Twoje wpisy przeznaczone tylko dla śledzących.",
"compose_form.lock_disclaimer.lock": "zablokowane",
"compose_form.placeholder": "Co Ci chodzi po głowie?",
@@ -108,7 +110,7 @@
"compose_form.poll.remove_option": "Usuń tę opcję",
"compose_form.poll.switch_to_multiple": "Pozwól na wybranie wielu opcji",
"compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji",
- "compose_form.publish": "Wyślij",
+ "compose_form.publish": "Opublikuj",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Zapisz zmiany",
"compose_form.sensitive.hide": "Oznacz multimedia jako wrażliwe",
@@ -151,6 +153,7 @@
"embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.",
"embed.preview": "Tak będzie to wyglądać:",
"emoji_button.activity": "Aktywność",
+ "emoji_button.clear": "Wyczyść",
"emoji_button.custom": "Niestandardowe",
"emoji_button.flags": "Flagi",
"emoji_button.food": "Żywność i napoje",
@@ -172,12 +175,12 @@
"empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!",
"empty_column.direct": "Nie masz żadnych wiadomości bezpośrednich. Kiedy dostaniesz lub wyślesz jakąś, pojawi się ona tutaj.",
"empty_column.domain_blocks": "Brak ukrytych domen.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "Nic nie jest w tej chwili popularne. Sprawdź później!",
"empty_column.favourited_statuses": "Nie dodałeś(-aś) żadnego wpisu do ulubionych. Kiedy to zrobisz, pojawi się on tutaj.",
"empty_column.favourites": "Nikt nie dodał tego wpisu do ulubionych. Gdy ktoś to zrobi, pojawi się tutaj.",
- "empty_column.follow_recommendations": "Wygląda na to, że nie można wygenerować dla Ciebie żadnych sugestii. Możesz spróbować wyszukać osoby, które znasz, lub przeglądać popularne hashtagi.",
+ "empty_column.follow_recommendations": "Wygląda na to, że nie można wygenerować dla Ciebie żadnych sugestii. Możesz spróbować wyszukać osoby, które znasz, lub przeglądać popularne hasztagi.",
"empty_column.follow_requests": "Nie masz żadnych próśb o możliwość śledzenia. Kiedy ktoś utworzy ją, pojawi się tutaj.",
- "empty_column.hashtag": "Nie ma wpisów oznaczonych tym hashtagiem. Możesz napisać pierwszy(-a)!",
+ "empty_column.hashtag": "Nie ma wpisów oznaczonych tym hasztagiem. Możesz napisać pierwszy(-a).",
"empty_column.home": "Nie śledzisz nikogo. Odwiedź globalną oś czasu lub użyj wyszukiwarki, aby znaleźć interesujące Cię profile.",
"empty_column.home.suggestions": "Zobacz kilka sugestii",
"empty_column.list": "Nie ma nic na tej liście. Kiedy członkowie listy dodadzą nowe wpisy, pojawia się one tutaj.",
@@ -191,12 +194,12 @@
"error.unexpected_crash.next_steps_addons": "Spróbuj je wyłączyć lub odświeżyć stronę. Jeśli to nie pomoże, możesz wciąż korzystać z Mastodona w innej przeglądarce lub natywnej aplikacji.",
"errors.unexpected_crash.copy_stacktrace": "Skopiuj ślad stosu do schowka",
"errors.unexpected_crash.report_issue": "Zgłoś problem",
- "explore.search_results": "Search results",
- "explore.suggested_follows": "For you",
- "explore.title": "Explore",
- "explore.trending_links": "News",
- "explore.trending_statuses": "Posts",
- "explore.trending_tags": "Hashtags",
+ "explore.search_results": "Wyniki wyszukiwania",
+ "explore.suggested_follows": "Dla ciebie",
+ "explore.title": "Odkrywaj",
+ "explore.trending_links": "Aktualności",
+ "explore.trending_statuses": "Posty",
+ "explore.trending_tags": "Hasztagi",
"follow_recommendations.done": "Gotowe",
"follow_recommendations.heading": "Śledź ludzi, których wpisy chcesz czytać. Oto kilka propozycji.",
"follow_recommendations.lead": "Wpisy osób, które śledzisz będą pojawiać się w porządku chronologicznym na stronie głównej. Nie bój się popełniać błędów, możesz bez problemu przestać śledzić każdego w każdej chwili!",
@@ -216,7 +219,7 @@
"hashtag.column_header.tag_mode.any": "lub {additional}",
"hashtag.column_header.tag_mode.none": "bez {additional}",
"hashtag.column_settings.select.no_options_message": "Nie odnaleziono sugestii",
- "hashtag.column_settings.select.placeholder": "Wprowadź hashtagi…",
+ "hashtag.column_settings.select.placeholder": "Wprowadź hasztagi…",
"hashtag.column_settings.tag_mode.all": "Wszystkie",
"hashtag.column_settings.tag_mode.any": "Dowolne",
"hashtag.column_settings.tag_mode.none": "Żadne",
@@ -268,6 +271,8 @@
"lightbox.expand": "Rozwiń pole widoku obrazu",
"lightbox.next": "Następne",
"lightbox.previous": "Poprzednie",
+ "limited_account_hint.action": "Pokaż profil mimo wszystko",
+ "limited_account_hint.title": "Ten profil został ukryty przez moderatorów Twojego serwera.",
"lists.account.add": "Dodaj do listy",
"lists.account.remove": "Usunąć z listy",
"lists.delete": "Usuń listę",
@@ -298,7 +303,7 @@
"navigation_bar.discover": "Odkrywaj",
"navigation_bar.domain_blocks": "Ukryte domeny",
"navigation_bar.edit_profile": "Edytuj profil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Odkrywaj",
"navigation_bar.favourites": "Ulubione",
"navigation_bar.filters": "Wyciszone słowa",
"navigation_bar.follow_requests": "Prośby o śledzenie",
@@ -314,7 +319,7 @@
"navigation_bar.preferences": "Preferencje",
"navigation_bar.public_timeline": "Globalna oś czasu",
"navigation_bar.security": "Bezpieczeństwo",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "Użytkownik {name} zarejestrował się",
"notification.favourite": "{name} dodał(a) Twój wpis do ulubionych",
"notification.follow": "{name} zaczął(-ęła) Cię śledzić",
"notification.follow_request": "{name} poprosił(a) o możliwość śledzenia Cię",
@@ -326,7 +331,7 @@
"notification.update": "{name} edytował post",
"notifications.clear": "Wyczyść powiadomienia",
"notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Nowe rejestracje:",
"notifications.column_settings.alert": "Powiadomienia na pulpicie",
"notifications.column_settings.favourite": "Dodanie do ulubionych:",
"notifications.column_settings.filter_bar.advanced": "Wyświetl wszystkie kategorie",
@@ -372,12 +377,12 @@
"poll_button.remove_poll": "Usuń głosowanie",
"privacy.change": "Dostosuj widoczność wpisów",
"privacy.direct.long": "Widoczny tylko dla wspomnianych",
- "privacy.direct.short": "Bezpośrednio",
+ "privacy.direct.short": "Tylko wspomniane osoby",
"privacy.private.long": "Widoczny tylko dla osób, które Cię śledzą",
- "privacy.private.short": "Tylko dla śledzących",
- "privacy.public.long": "Widoczny na publicznych osiach czasu",
+ "privacy.private.short": "Tylko śledzący",
+ "privacy.public.long": "Widoczne dla każdego",
"privacy.public.short": "Publiczny",
- "privacy.unlisted.long": "Niewidoczny na publicznych osiach czasu",
+ "privacy.unlisted.long": "Widoczne dla każdego, z wyłączeniem funkcji odkrywania",
"privacy.unlisted.short": "Niewidoczny",
"refresh": "Odśwież",
"regeneration_indicator.label": "Ładuję…",
@@ -394,54 +399,54 @@
"relative_time.seconds": "{number} s.",
"relative_time.today": "dzisiaj",
"reply_indicator.cancel": "Anuluj",
- "report.block": "Block",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block": "Zablokuj",
+ "report.block_explanation": "Nie zobaczysz ich postów. Nie będą mogli zobaczyć Twoich postów ani cię śledzić. Będą mogli domyślić się, że są zablokowani.",
"report.categories.other": "Inne",
"report.categories.spam": "Spam",
"report.categories.violation": "Zawartość narusza co najmniej jedną zasadę serwera",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
- "report.category.title_account": "profile",
+ "report.category.subtitle": "Wybierz najbardziej pasującą opcję",
+ "report.category.title": "Powiedz, co się dzieje z tym {type}",
+ "report.category.title_account": "profil",
"report.category.title_status": "post",
- "report.close": "Done",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.close": "Gotowe",
+ "report.comment.title": "Czy jest jeszcze coś, co uważasz, że powinniśmy wiedzieć?",
"report.forward": "Przekaż na {target}",
"report.forward_hint": "To konto znajduje się na innej instancji. Czy chcesz wysłać anonimową kopię zgłoszenia rnież na nią?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
- "report.next": "Next",
+ "report.mute": "Wycisz",
+ "report.mute_explanation": "Nie zobaczysz ich wpisów. Mimo to będą mogli wciąż śledzić cię i widzieć twoje wpisy, ale nie będą widzieli, że są wyciszeni.",
+ "report.next": "Dalej",
"report.placeholder": "Dodatkowe komentarze",
- "report.reasons.dislike": "I don't like it",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
- "report.reasons.other_description": "The issue does not fit into other categories",
- "report.reasons.spam": "It's spam",
+ "report.reasons.dislike": "Nie podoba mi się to",
+ "report.reasons.dislike_description": "Nie jest to coś, co chciałoby się zobaczyć",
+ "report.reasons.other": "Coś innego",
+ "report.reasons.other_description": "Zgłoszenie nie pasuje do żadnej z pozostałych kategorii",
+ "report.reasons.spam": "To spam",
"report.reasons.spam_description": "Niebezpieczne linki, fałszywe zaangażowanie lub powtarzające się odpowiedzi",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.violation": "Narusza to zasady serwera",
+ "report.reasons.violation_description": "Zdajesz sobie sprawę, że narusza to szczególne zasady",
+ "report.rules.subtitle": "Wybierz wszystkie pasujące",
+ "report.rules.title": "Które zasady zostały złamane?",
+ "report.statuses.subtitle": "Wybierz wszystkie pasujące",
+ "report.statuses.title": "Czy są jakieś wpisy, które obrazują opisany w zgłoszeniu problem?",
"report.submit": "Wyślij",
"report.target": "Zgłaszanie {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Oto opcje, dzięki którym możesz kontrolować, co widzisz na Mastodon:",
+ "report.thanks.take_action_actionable": "W trakcie jak będziemy się przyglądać tej sprawie, możesz podjąć akcje przeciwko @{name}:",
+ "report.thanks.title": "Nie chcesz tego widzieć?",
+ "report.thanks.title_actionable": "Dziękujemy za zgłoszenie. Przyjrzymy się tej sprawie.",
+ "report.unfollow": "Przestań śledzić @{name}",
+ "report.unfollow_explanation": "Śledzisz to konto. Jeśli nie chcesz już widzieć postów z tego konta w swojej głównej osi czasu, przestań je śledzić.",
"search.placeholder": "Szukaj",
"search_popout.search_format": "Zaawansowane wyszukiwanie",
"search_popout.tips.full_text": "Pozwala na wyszukiwanie wpisów które napisałeś(-aś), dodałeś(-aś) do ulubionych lub podbiłeś(-aś), w których o Tobie wspomniano, oraz pasujące nazwy użytkowników, pełne nazwy i hashtagi.",
"search_popout.tips.hashtag": "hasztag",
"search_popout.tips.status": "wpis",
- "search_popout.tips.text": "Proste wyszukiwanie pasujących pseudonimów, nazw użytkowników i hashtagów",
+ "search_popout.tips.text": "Proste wyszukiwanie pasujących pseudonimów, nazw użytkowników i hasztagów",
"search_popout.tips.user": "użytkownik",
"search_results.accounts": "Ludzie",
- "search_results.all": "All",
- "search_results.hashtags": "Hashtagi",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.all": "Wszystkie",
+ "search_results.hashtags": "Hasztagi",
+ "search_results.nothing_found": "Nie znaleziono innych wyników dla tego wyszukania",
"search_results.statuses": "Wpisy",
"search_results.statuses_fts_disabled": "Szukanie wpisów przy pomocy ich zawartości nie jest włączone na tym serwerze Mastodona.",
"search_results.total": "{count, number} {count, plural, one {wynik} few {wyniki} many {wyników} more {wyników}}",
@@ -457,12 +462,12 @@
"status.direct": "Wyślij wiadomość bezpośrednią do @{name}",
"status.edit": "Edytuj",
"status.edited": "Edytowano {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edited_x_times": "Edytowano {count, plural, one {{count} raz} other {{count} razy}}",
"status.embed": "Osadź",
"status.favourite": "Dodaj do ulubionych",
"status.filtered": "Filtrowany(-a)",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "{name} utworzył(a) {date}",
+ "status.history.edited": "{name} edytował(a) {date}",
"status.load_more": "Załaduj więcej",
"status.media_hidden": "Zawartość multimedialna ukryta",
"status.mention": "Wspomnij o @{name}",
@@ -520,6 +525,7 @@
"upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.",
"upload_form.audio_description": "Opisz dla osób niesłyszących i niedosłyszących",
"upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących",
+ "upload_form.description_missing": "Nie dodano opisu",
"upload_form.edit": "Edytuj",
"upload_form.thumbnail": "Zmień miniaturę",
"upload_form.undo": "Usuń",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index c597aa20d..bdf973e04 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -18,7 +18,7 @@
"account.followers": "Seguidores",
"account.followers.empty": "Nada aqui.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
- "account.following": "Following",
+ "account.following": "Seguindo",
"account.following_counter": "{count, plural, one {segue {counter}} other {segue {counter}}}",
"account.follows.empty": "Nada aqui.",
"account.follows_you": "te segue",
@@ -41,14 +41,14 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Desbloquear @{name}",
"account.unblock_domain": "Desbloquear domínio {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Desbloquear",
"account.unendorse": "Remover",
"account.unfollow": "Deixar de seguir",
"account.unmute": "Dessilenciar @{name}",
"account.unmute_notifications": "Mostrar notificações de @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Reativar",
"account_note.placeholder": "Nota pessoal sobre este perfil aqui",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+ "admin.dashboard.daily_retention": "Taxa de retenção de usuários por dia, após a inscrição",
"admin.dashboard.monthly_retention": "Taxa de retenção de usuários por mês, após a inscrição",
"admin.dashboard.retention.average": "Média",
"admin.dashboard.retention.cohort": "Mês de inscrição",
@@ -70,7 +70,7 @@
"column.blocks": "Usuários bloqueados",
"column.bookmarks": "Salvos",
"column.community": "Linha local",
- "column.direct": "Toots Diretos",
+ "column.direct": "Mensagens diretas",
"column.directory": "Explorar perfis",
"column.domain_blocks": "Domínios bloqueados",
"column.favourites": "Favoritos",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Somente local",
"community.column_settings.media_only": "Somente mídia",
"community.column_settings.remote_only": "Somente global",
- "compose_form.direct_message_warning": "Este toot só será enviado aos usuários mencionados.",
+ "compose.language.change": "Alterar idioma",
+ "compose.language.search": "Pesquisar idiomas...",
"compose_form.direct_message_warning_learn_more": "Saiba mais",
+ "compose_form.encryption_warning": "Postagens no Mastodon não são criptografadas de ponta-a-ponta. Não compartilhe nenhuma informação sensível no Mastodon.",
"compose_form.hashtag_warning": "Este toot não aparecerá em nenhuma hashtag porque está como não-listado. Somente toots públicos podem ser pesquisados por hashtag.",
"compose_form.lock_disclaimer": "Seu perfil não está {locked}. Qualquer um pode te seguir e ver os toots privados.",
"compose_form.lock_disclaimer.lock": "trancado",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remover opção",
"compose_form.poll.switch_to_multiple": "Permitir múltiplas escolhas",
"compose_form.poll.switch_to_single": "Opção única",
- "compose_form.publish": "TOOT",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Salvar alterações",
"compose_form.sensitive.hide": "{count, plural, one {Marcar mídia como sensível} other {Marcar mídias como sensível}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Incorpore este toot no seu site ao copiar o código abaixo.",
"embed.preview": "Aqui está como vai ficar:",
"emoji_button.activity": "Atividade",
+ "emoji_button.clear": "Limpar",
"emoji_button.custom": "Personalizados",
"emoji_button.flags": "Bandeiras",
"emoji_button.food": "Comida e Bebida",
@@ -166,9 +169,9 @@
"empty_column.blocks": "Nada aqui.",
"empty_column.bookmarked_statuses": "Nada aqui. Quando você salvar um toot, ele aparecerá aqui.",
"empty_column.community": "A linha local está vazia. Publique algo para começar!",
- "empty_column.direct": "Nada aqui. Quando você enviar ou receber toots diretos, eles aparecerão aqui.",
+ "empty_column.direct": "Você ainda não tem mensagens diretas. Quando você enviar ou receber uma, será exibida aqui.",
"empty_column.domain_blocks": "Nada aqui.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+ "empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!",
"empty_column.favourited_statuses": "Nada aqui. Quando você favoritar um toot, ele aparecerá aqui.",
"empty_column.favourites": "Nada aqui. Quando alguém favoritar, o autor aparecerá aqui.",
"empty_column.follow_recommendations": "Parece que não há sugestões para você. Tente usar a pesquisa para encontrar pessoas que você possa conhecer ou explorar hashtags.",
@@ -190,7 +193,7 @@
"explore.search_results": "Resultado da pesquisa",
"explore.suggested_follows": "Para você",
"explore.title": "Explorar",
- "explore.trending_links": "Novidades",
+ "explore.trending_links": "Notícias",
"explore.trending_statuses": "Posts",
"explore.trending_tags": "Hashtags",
"follow_recommendations.done": "Salvar",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "focar na coluna",
"keyboard_shortcuts.compose": "focar no compositor",
"keyboard_shortcuts.description": "Descrição",
- "keyboard_shortcuts.direct": "abrir toots diretos",
+ "keyboard_shortcuts.direct": "para abrir a coluna de mensagens diretas",
"keyboard_shortcuts.down": "mover para baixo",
"keyboard_shortcuts.enter": "abrir toot",
"keyboard_shortcuts.favourite": "favoritar toot",
@@ -264,6 +267,8 @@
"lightbox.expand": "Abrir imagem",
"lightbox.next": "Próximo",
"lightbox.previous": "Anterior",
+ "limited_account_hint.action": "Exibir perfil mesmo assim",
+ "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do seu servidor.",
"lists.account.add": "Adicionar à lista",
"lists.account.remove": "Remover da lista",
"lists.delete": "Excluir lista",
@@ -290,11 +295,11 @@
"navigation_bar.bookmarks": "Salvos",
"navigation_bar.community_timeline": "Linha do tempo local",
"navigation_bar.compose": "Compor novo toot",
- "navigation_bar.direct": "Toots diretos",
+ "navigation_bar.direct": "Mensagens diretas",
"navigation_bar.discover": "Descobrir",
"navigation_bar.domain_blocks": "Domínios bloqueados",
"navigation_bar.edit_profile": "Editar perfil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palavras filtradas",
"navigation_bar.follow_requests": "Seguidores pendentes",
@@ -338,7 +343,7 @@
"notifications.column_settings.status": "Novos toots:",
"notifications.column_settings.unread_notifications.category": "Notificações não lidas",
"notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas",
- "notifications.column_settings.update": "Edits:",
+ "notifications.column_settings.update": "Editar:",
"notifications.filter.all": "Tudo",
"notifications.filter.boosts": "Boosts",
"notifications.filter.favourites": "Favoritos",
@@ -367,22 +372,22 @@
"poll_button.remove_poll": "Remover enquete",
"privacy.change": "Alterar privacidade do toot",
"privacy.direct.long": "Postar só para usuários mencionados",
- "privacy.direct.short": "Direto",
+ "privacy.direct.short": "Apenas pessoas mencionadas",
"privacy.private.long": "Postar só para seguidores",
- "privacy.private.short": "Privado",
- "privacy.public.long": "Postar em linhas públicas",
+ "privacy.private.short": "Apenas seguidores",
+ "privacy.public.long": "Visível para todos",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Não postar em linhas públicas",
+ "privacy.unlisted.long": "Visível para todos, mas desativou os recursos de descoberta",
"privacy.unlisted.short": "Não-listado",
"refresh": "Atualizar",
"regeneration_indicator.label": "Carregando…",
"regeneration_indicator.sublabel": "Sua página inicial está sendo preparada!",
"relative_time.days": "{number}d",
- "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
- "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+ "relative_time.full.days": "{number, plural, one {# dia} other {# dias}} atrás",
+ "relative_time.full.hours": "{number, plural, one {# hora} other {# horas}} atrás",
"relative_time.full.just_now": "agora mesmo",
- "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
- "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+ "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minutos}} atrás",
+ "relative_time.full.seconds": "{number, plural, one {# segundo} other {# segundos}} atrás",
"relative_time.hours": "{number}h",
"relative_time.just_now": "agora",
"relative_time.minutes": "{number}m",
@@ -390,42 +395,42 @@
"relative_time.today": "hoje",
"reply_indicator.cancel": "Cancelar",
"report.block": "Bloquear",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block_explanation": "Você não verá suas postagens. Eles não poderão ver suas postagens ou segui-lo. Eles serão capazes de perceber que estão bloqueados.",
"report.categories.other": "Outro",
"report.categories.spam": "Spam",
"report.categories.violation": "O conteúdo viola uma ou mais regras do servidor",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.subtitle": "Escolha a alternativa de melhor correspondência",
+ "report.category.title": "Conte-nos o que está acontecendo com esse {type}",
"report.category.title_account": "perfil",
"report.category.title_status": "publicação",
"report.close": "Concluído",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.comment.title": "Há algo mais que você acredita que devemos saber?",
"report.forward": "Encaminhar para {target}",
"report.forward_hint": "A conta está em outra instância. Enviar uma cópia anônima da denúncia para lá?",
"report.mute": "Silenciar",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.mute_explanation": "Você não verá suas postagens. Eles ainda podem seguir você e ver suas postagens e não saberão que estão silenciados.",
"report.next": "Próximo",
"report.placeholder": "Comentários adicionais aqui",
"report.reasons.dislike": "Eu não gosto disso",
- "report.reasons.dislike_description": "It is not something you want to see",
- "report.reasons.other": "It's something else",
+ "report.reasons.dislike_description": "Não é algo que você quer ver",
+ "report.reasons.other": "É outra coisa",
"report.reasons.other_description": "O problema não se encaixa em outras categorias",
"report.reasons.spam": "É spam",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
+ "report.reasons.spam_description": "Links maliciosos, envolvimento falso ou respostas repetitivas",
+ "report.reasons.violation": "Viola as regras do servidor",
"report.reasons.violation_description": "Você está ciente de que isso quebra regras específicas",
"report.rules.subtitle": "Selecione tudo que se aplica",
- "report.rules.title": "Which rules are being violated?",
+ "report.rules.title": "Que regras estão sendo violadas?",
"report.statuses.subtitle": "Selecione tudo que se aplica",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.statuses.title": "Existem postagens que respaldam esse relatório?",
"report.submit": "Enviar",
"report.target": "Denunciando {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+ "report.thanks.take_action": "Aqui estão suas opções para controlar o que você vê no Mastodon:",
"report.thanks.take_action_actionable": "Enquanto revisamos isso, você pode tomar medidas contra @{name}:",
"report.thanks.title": "Não quer ver isto?",
"report.thanks.title_actionable": "Obrigado por reportar. Vamos analisar.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.unfollow": "Deixar de seguir @{name}",
+ "report.unfollow_explanation": "Você está seguindo esta conta. Para não mais ver os posts dele em sua página inicial, deixe de segui-lo.",
"search.placeholder": "Pesquisar",
"search_popout.search_format": "Formato de pesquisa avançada",
"search_popout.tips.full_text": "Texto simples retorna toots que você escreveu, favoritou, deu boost, ou em que foi mencionado, assim como nomes de usuário e de exibição, e hashtags correspondentes.",
@@ -452,7 +457,7 @@
"status.direct": "Enviar toot direto para @{name}",
"status.edit": "Editar",
"status.edited": "Editado em {date}",
- "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+ "status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}",
"status.embed": "Incorporar",
"status.favourite": "Favoritar",
"status.filtered": "Filtrado",
@@ -515,6 +520,7 @@
"upload_error.poll": "Mídias não podem ser anexadas em toots com enquetes.",
"upload_form.audio_description": "Descrever para deficientes auditivos",
"upload_form.description": "Descrever para deficientes visuais",
+ "upload_form.description_missing": "Nenhuma descrição adicionada",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Alterar miniatura",
"upload_form.undo": "Excluir",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 4e06401ec..90285a70f 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local apenas",
"community.column_settings.media_only": "Somente media",
"community.column_settings.remote_only": "Remoto apenas",
- "compose_form.direct_message_warning": "Esta publicação será enviada apenas para os utilizadores mencionados.",
+ "compose.language.change": "Alterar idioma",
+ "compose.language.search": "Pesquisar idiomas...",
"compose_form.direct_message_warning_learn_more": "Conhecer mais",
+ "compose_form.encryption_warning": "As publicações no Mastodon não são encriptadas ponta a ponta. Não partilhe nenhuma informação sensível através do Mastodon.",
"compose_form.hashtag_warning": "Este toot não será listado em nenhuma hashtag por ser não listado. Apenas toots públics podem ser pesquisados por hashtag.",
"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": "bloqueado",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Eliminar esta opção",
"compose_form.poll.switch_to_multiple": "Alterar a votação para permitir múltiplas escolhas",
"compose_form.poll.switch_to_single": "Alterar a votação para permitir uma única escolha",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publicar",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Guardar alterações",
"compose_form.sensitive.hide": "Marcar media como sensível",
@@ -147,6 +149,7 @@
"embed.instructions": "Incorpore esta publicação no seu site copiando o código abaixo.",
"embed.preview": "Podes ver aqui como irá ficar:",
"emoji_button.activity": "Actividade",
+ "emoji_button.clear": "Limpar",
"emoji_button.custom": "Personalizar",
"emoji_button.flags": "Bandeiras",
"emoji_button.food": "Comida & Bebida",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expandir caixa de visualização de imagem",
"lightbox.next": "Próximo",
"lightbox.previous": "Anterior",
+ "limited_account_hint.action": "Exibir perfil mesmo assim",
+ "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do seu servidor.",
"lists.account.add": "Adicionar à lista",
"lists.account.remove": "Remover da lista",
"lists.delete": "Eliminar lista",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Remover votação",
"privacy.change": "Ajustar a privacidade da publicação",
"privacy.direct.long": "Apenas para utilizadores mencionados",
- "privacy.direct.short": "Directo",
+ "privacy.direct.short": "Apenas pessoas mencionadas",
"privacy.private.long": "Apenas para os seguidores",
- "privacy.private.short": "Privado",
- "privacy.public.long": "Publicar em todos os feeds",
+ "privacy.private.short": "Apenas seguidores",
+ "privacy.public.long": "Visível para todos",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Não publicar nos feeds públicos",
+ "privacy.unlisted.long": "Visível para todos, mas não incluir em funcionalidades de divulgação",
"privacy.unlisted.short": "Não listar",
"refresh": "Actualizar",
"regeneration_indicator.label": "A carregar…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Carregamento de ficheiros não é permitido em votações.",
"upload_form.audio_description": "Descreva para pessoas com diminuição da acuidade auditiva",
"upload_form.description": "Descrição da imagem para pessoas com dificuldades visuais",
+ "upload_form.description_missing": "Nenhuma descrição adicionada",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Alterar miniatura",
"upload_form.undo": "Eliminar",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index bd91f19b9..34328e65b 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -70,7 +70,7 @@
"column.blocks": "Utilizatori blocați",
"column.bookmarks": "Marcaje",
"column.community": "Cronologie locală",
- "column.direct": "Mesaje directe",
+ "column.direct": "Direct messages",
"column.directory": "Explorează profiluri",
"column.domain_blocks": "Domenii blocate",
"column.favourites": "Favorite",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Doar local",
"community.column_settings.media_only": "Doar media",
"community.column_settings.remote_only": "Doar la distanţă",
- "compose_form.direct_message_warning": "Această postare va fi trimisă doar utilizatorilor menționați.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Află mai multe",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Această postare nu va fi listată sub niciun hashtag deoarece este nelistată. Doar postările publice pot fi căutate cu un hashtag.",
"compose_form.lock_disclaimer": "Contul tău nu este {locked}. Oricine se poate abona la tine pentru a îți vedea postările numai pentru abonați.",
"compose_form.lock_disclaimer.lock": "privat",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Elimină acestă opțiune",
"compose_form.poll.switch_to_multiple": "Modifică sondajul pentru a permite mai multe opțiuni",
"compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune",
- "compose_form.publish": "Postează",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Marchează conținutul media ca fiind sensibil} few {Marchează conținuturile media ca fiind sensibile} other {Marchează conținuturile media ca fiind sensibile}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Integrează această postare în site-ul tău copiind codul de mai jos.",
"embed.preview": "Iată cum va arăta:",
"emoji_button.activity": "Activități",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Personalizați",
"emoji_button.flags": "Steaguri",
"emoji_button.food": "Alimente și băuturi",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Momentan nu ai blocat niciun utilizator.",
"empty_column.bookmarked_statuses": "Momentan nu ai nicio postare marcată. Când vei marca una, va apărea aici.",
"empty_column.community": "Nu există nimic în cronologia locală. Postează ceva public pentru a sparge gheața!",
- "empty_column.direct": "Momentan nu ai niciun mesaj direct. Când trimiți sau primești un mesaj, va apărea aici.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Momentan nu există domenii blocate.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Momentan nu ai nicio postare favorită. Când vei adăuga una, va apărea aici.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "Focalizează pe coloană",
"keyboard_shortcuts.compose": "Focalizează pe zona de text",
"keyboard_shortcuts.description": "Descriere",
- "keyboard_shortcuts.direct": "Deschide coloana de mesaje directe",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "Coboară în listă",
"keyboard_shortcuts.enter": "Deschide postarea",
"keyboard_shortcuts.favourite": "Adaugă postarea la favorite",
@@ -264,6 +267,8 @@
"lightbox.expand": "Deschide panoul de vizualizare a imaginilor",
"lightbox.next": "Înainte",
"lightbox.previous": "Înapoi",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Adaugă în listă",
"lists.account.remove": "Elimină din listă",
"lists.delete": "Șterge lista",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Marcaje",
"navigation_bar.community_timeline": "Cronologie locală",
"navigation_bar.compose": "Compune o nouă postare",
- "navigation_bar.direct": "Mesaje directe",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Descoperă",
"navigation_bar.domain_blocks": "Domenii blocate",
"navigation_bar.edit_profile": "Modifică profilul",
@@ -369,10 +374,10 @@
"privacy.direct.long": "Vizibil doar pentru utilizatorii menționați",
"privacy.direct.short": "Direct",
"privacy.private.long": "Vizibil doar pentru abonați",
- "privacy.private.short": "Doar abonați",
- "privacy.public.long": "Vizibil pentru toți, afișat în cronologiile publice",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Vizibil pentru toți, dar nu și în cronologiile publice",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Nelistat",
"refresh": "Reîncarcă",
"regeneration_indicator.label": "Se încarcă…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Încărcarea fișierului nu este permisă cu sondaje.",
"upload_form.audio_description": "Descrie pentru persoanele cu deficiență a auzului",
"upload_form.description": "Adaugă o descriere pentru persoanele cu deficiențe de vedere",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Modifică",
"upload_form.thumbnail": "Schimbă miniatura",
"upload_form.undo": "Șterge",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 79fac6eb5..d6927e0e4 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Только локальные",
"community.column_settings.media_only": "Только с медиафайлами",
"community.column_settings.remote_only": "Только удалённые",
- "compose_form.direct_message_warning": "Адресованные посты отправляются и видны только упомянутым в них пользователям.",
+ "compose.language.change": "Изменить язык",
+ "compose.language.search": "Поиск языков...",
"compose_form.direct_message_warning_learn_more": "Подробнее",
+ "compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь конфиденциальной информацией через Mastodon.",
"compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.",
"compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
"compose_form.lock_disclaimer.lock": "не закрыта",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Убрать этот вариант",
"compose_form.poll.switch_to_multiple": "Разрешить выбор нескольких вариантов",
"compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
- "compose_form.publish": "Запостить",
+ "compose_form.publish": "Опубликовать",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Сохранить",
"compose_form.sensitive.hide": "{count, plural, one {Отметить медифайл как деликатный} other {Отметить медифайлы как деликатные}}",
@@ -122,7 +124,7 @@
"confirmations.delete_list.confirm": "Удалить",
"confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
"confirmations.discard_edit_media.confirm": "Отменить",
- "confirmations.discard_edit_media.message": "У вас имеются несохранённые изменения превью и описания медиафайла, отменить их?",
+ "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения описания мультимедиа или предпросмотра, отменить их?",
"confirmations.domain_block.confirm": "Да, заблокировать узел",
"confirmations.domain_block.message": "Вы точно уверены, что хотите скрыть все посты с узла {domain}? В большинстве случаев пары блокировок и скрытий вполне достаточно.\n\nПри блокировке узла, вы перестанете получать уведомления оттуда, все посты будут скрыты из публичных лент, а подписчики убраны.",
"confirmations.logout.confirm": "Выйти",
@@ -147,6 +149,7 @@
"embed.instructions": "Встройте этот пост на свой сайт, скопировав следующий код:",
"embed.preview": "Так это будет выглядеть:",
"emoji_button.activity": "Занятия",
+ "emoji_button.clear": "Очистить",
"emoji_button.custom": "С этого узла",
"emoji_button.flags": "Флаги",
"emoji_button.food": "Еда и напитки",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "фокус на одном из столбцов",
"keyboard_shortcuts.compose": "фокус на поле ввода",
"keyboard_shortcuts.description": "Описание",
- "keyboard_shortcuts.direct": "чтобы показать колонку личных сообщений",
+ "keyboard_shortcuts.direct": "чтобы открыть колонку с личными сообщениями",
"keyboard_shortcuts.down": "вниз по списку",
"keyboard_shortcuts.enter": "открыть пост",
"keyboard_shortcuts.favourite": "в избранное",
@@ -264,6 +267,8 @@
"lightbox.expand": "Развернуть окно просмотра изображений",
"lightbox.next": "Далее",
"lightbox.previous": "Назад",
+ "limited_account_hint.action": "Все равно показать профиль",
+ "limited_account_hint.title": "Этот профиль был скрыт модераторами вашего сервера.",
"lists.account.add": "Добавить в список",
"lists.account.remove": "Убрать из списка",
"lists.delete": "Удалить список",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Удалить опрос",
"privacy.change": "Изменить видимость поста",
"privacy.direct.long": "Показать только упомянутым",
- "privacy.direct.short": "Адресованный",
+ "privacy.direct.short": "Только упомянутые",
"privacy.private.long": "Показать только подписчикам",
- "privacy.private.short": "Приватный",
- "privacy.public.long": "Показать в публичных лентах",
+ "privacy.private.short": "Для подписчиков",
+ "privacy.public.long": "Виден всем",
"privacy.public.short": "Публичный",
- "privacy.unlisted.long": "Не показывать в публичных лентах",
+ "privacy.unlisted.long": "Виден всем, но не через функции обзора",
"privacy.unlisted.short": "Скрытый",
"refresh": "Обновить",
"regeneration_indicator.label": "Загрузка…",
@@ -436,7 +441,7 @@
"search_results.accounts": "Люди",
"search_results.all": "Все",
"search_results.hashtags": "Хэштеги",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "Ничего не найдено по этому запросу",
"search_results.statuses": "Посты",
"search_results.statuses_fts_disabled": "Поиск постов по их содержанию не поддерживается данным сервером Mastodon.",
"search_results.total": "{count, number} {count, plural, one {результат} few {результата} many {результатов} other {результатов}}",
@@ -515,6 +520,7 @@
"upload_error.poll": "К опросам нельзя прикреплять файлы.",
"upload_form.audio_description": "Опишите аудиофайл для людей с нарушением слуха",
"upload_form.description": "Добавьте описание для людей с нарушениями зрения:",
+ "upload_form.description_missing": "Описание не добавлено",
"upload_form.edit": "Изменить",
"upload_form.thumbnail": "Изменить обложку",
"upload_form.undo": "Отменить",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index e1910d283..f0861f9bc 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -70,7 +70,7 @@
"column.blocks": "निषिद्धभोक्तारः",
"column.bookmarks": "पुटचिह्नानि",
"column.community": "स्थानीयसमयतालिका",
- "column.direct": "प्रत्यक्षसन्देशाः",
+ "column.direct": "Direct messages",
"column.directory": "व्यक्तित्वानि दृश्यन्ताम्",
"column.domain_blocks": "निषिद्धप्रदेशाः",
"column.favourites": "प्रियाः",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "केवलं स्थानीयम्",
"community.column_settings.media_only": "सामग्री केवलम्",
"community.column_settings.remote_only": "दर्गमः केवलम्",
- "compose_form.direct_message_warning": "दौत्यमेतत्केवलमुल्लेखितजनानां कृते वर्तते",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "अधिकं ज्ञायताम्",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "न कस्मिन्नपि प्रचलितवस्तुषु सूचितमिदं दौत्यम् । केवलं सार्वजनिकदौत्यानि प्रचलितवस्तुचिह्नेन अन्वेषयितुं शक्यते ।",
"compose_form.lock_disclaimer": "तव लेखा न प्रवेष्टुमशक्या {locked} । कोऽप्यनुसर्ता ते केवलमनुसर्तृृणां कृते स्थितानि दौत्यानि द्रष्टुं शक्नोति ।",
"compose_form.lock_disclaimer.lock": "अवरुद्धः",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "मतमेतन्नश्यताम्",
"compose_form.poll.switch_to_multiple": "मतदानं परिवर्तयित्वा बहुवैकल्पिकमतदानं क्रियताम्",
"compose_form.poll.switch_to_single": "मतदानं परिवर्तयित्वा निर्विकल्पमतदानं क्रियताम्",
- "compose_form.publish": "दौत्यम्",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "संवेदनशीलसामग्रीत्यङ्यताम्",
@@ -147,6 +149,7 @@
"embed.instructions": "दौत्यमेतत् स्वीयजालस्थाने स्थापयितुमधो लिखितो विध्यादेशो युज्यताम्",
"embed.preview": "अत्रैवं दृश्यते तत्:",
"emoji_button.activity": "आचरणम्",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "स्वीयानुकूलम्",
"emoji_button.flags": "ध्वजाः",
"emoji_button.food": "भोजनं पेयञ्च",
@@ -166,7 +169,7 @@
"empty_column.blocks": "नैकोऽप्युपभोक्ता निषिद्धो वर्तते",
"empty_column.bookmarked_statuses": "नैकमपि पुटचिह्नयुक्तदौत्यानि सन्ति । यदा भविष्यति तदत्र दृश्यते ।",
"empty_column.community": "स्थानीयसमयतालिका रिक्ता । सार्वजनिकत्वेनाऽत्र किमपि लिख्यताम् ।",
- "empty_column.direct": "नैकोऽपि प्रत्यक्षसन्देशो वर्तते । यदा प्रेष्यते वा प्राप्यतेऽत्र दृश्यते",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "न निषिद्धप्रदेशाः सन्ति ।",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "न प्रियदौत्यानि सन्ति । यदा प्रीतिरित्यङ्क्यतेऽत्र दृश्यते ।",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 1c29dfb79..202caa5ca 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -70,7 +70,7 @@
"column.blocks": "Persones blocadas",
"column.bookmarks": "Sinnalibros",
"column.community": "Lìnia de tempus locale",
- "column.direct": "Messàgios diretos",
+ "column.direct": "Direct messages",
"column.directory": "Nàviga in is profilos",
"column.domain_blocks": "Domìnios blocados",
"column.favourites": "Preferidos",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Isceti locale",
"community.column_settings.media_only": "Isceti multimediale",
"community.column_settings.remote_only": "Isceti remotu",
- "compose_form.direct_message_warning": "Custa publicatzione at a èssere imbiada isceti a is persones mentovadas.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Àteras informatziones",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Custa publicatzione no at a èssere ammustrada in peruna eticheta, dae chi no est listada. Isceti is publicatziones pùblicas podent èssere chircadas cun etichetas.",
"compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.",
"compose_form.lock_disclaimer.lock": "blocadu",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Boga custa optzione",
"compose_form.poll.switch_to_multiple": "Muda su sondàgiu pro permìtere multi-optziones",
"compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti",
- "compose_form.publish": "Tut",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Marca elementu multimediale comente a sensìbile} other {Marca elementos multimediales comente sensìbiles}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Inserta custa publicatzione in su situ web tuo copiende su còdighe de suta.",
"embed.preview": "At a aparèssere aici:",
"emoji_button.activity": "Atividade",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Personalizadu",
"emoji_button.flags": "Banderas",
"emoji_button.food": "Mandigòngiu e bufòngiu",
@@ -166,7 +169,7 @@
"empty_column.blocks": "No as blocadu ancora nemos.",
"empty_column.bookmarked_statuses": "Non tenes ancora peruna publicatzione in is marcadores. Cando nd'as a agiùnghere una, at a èssere ammustrada inoghe.",
"empty_column.community": "Sa lìnia de tempus locale est bòida. Iscrie inoghe pro cumintzare sa festa!",
- "empty_column.direct": "Non tenes ancora perunu messàgiu deretu. Cando nd'as a imbiare o nd'as a retzire unu, at a èssere ammustradu inoghe.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Non tenes ancora perunu domìniu blocadu.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Non tenes ancora peruna publicatzione in is preferidos. Cando nd'as a agiùnghere una, at a èssere ammustrada inoghe.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "pro atzentrare una publicatzione in una de is colunnas",
"keyboard_shortcuts.compose": "pro atzentrare in s'àrea de cumpositzione de testu",
"keyboard_shortcuts.description": "Descritzione",
- "keyboard_shortcuts.direct": "pro abèrrere sa colunna de messàgios diretos",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "pro mòere in bàsciu in sa lista",
"keyboard_shortcuts.enter": "pro abèrrere una publicatzione",
"keyboard_shortcuts.favourite": "pro marcare comente a preferidu",
@@ -264,6 +267,8 @@
"lightbox.expand": "Ismànnia sa casella de visualizatzione de is immàgines",
"lightbox.next": "Imbeniente",
"lightbox.previous": "Pretzedente",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Agiunghe a sa lista",
"lists.account.remove": "Boga dae sa lista",
"lists.delete": "Cantzella sa lista",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Sinnalibros",
"navigation_bar.community_timeline": "Lìnia de tempus locale",
"navigation_bar.compose": "Cumpone una publicatzione noa",
- "navigation_bar.direct": "Messàgios diretos",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Iscoberi",
"navigation_bar.domain_blocks": "Domìnios blocados",
"navigation_bar.edit_profile": "Modìfica profilu",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Cantzella su sondàgiu",
"privacy.change": "Modìfica s'istadu de riservadesa",
"privacy.direct.long": "Visìbile isceti pro is persones mentovadas",
- "privacy.direct.short": "Deretu",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Visìbile isceti pro chie ti sighit",
- "privacy.private.short": "Isceti pro chie ti sighit",
- "privacy.public.long": "Visìbile pro chie si siat, ammustra in lìnias de tempus pùblicas",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Pùblicu",
- "privacy.unlisted.long": "Visìbile pro chie si siat, però no ammustres in lìnias de tempus pùblicas",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Esclùidu de sa lista",
"refresh": "Atualiza",
"regeneration_indicator.label": "Carrighende…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Non si permitit s'imbiu de archìvios in is sondàgios.",
"upload_form.audio_description": "Descritzione pro persones cun pèrdida auditiva",
"upload_form.description": "Descritzione pro persones cun problemas visuales",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Modìfica",
"upload_form.thumbnail": "Càmbia sa miniadura",
"upload_form.undo": "Cantzella",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index a74105406..4d9e0d3b5 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -70,7 +70,7 @@
"column.blocks": "අවහිර කළ පරිශීලකයින්",
"column.bookmarks": "පොත් යොමු",
"column.community": "Local timeline",
- "column.direct": "සෘජු පණිවිඩ",
+ "column.direct": "Direct messages",
"column.directory": "පැතිකඩයන් පිරික්සන්න",
"column.domain_blocks": "අවහිර කළ වසම්",
"column.favourites": "ප්රියතමයන්",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "ස්ථානීයව පමණයි",
"community.column_settings.media_only": "මාධ්ය පමණයි",
"community.column_settings.remote_only": "දුරස්ථව පමණයි",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "තව දැනගන්න",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "අගුළු දමා ඇත",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "මෙම තේරීම ඉවත් කරන්න",
"compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න",
"compose_form.poll.switch_to_single": "තනි තේරීමකට ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න",
- "compose_form.publish": "පිඹින්න",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න} other {මාධ්ය සංවේදී ලෙස සලකුණු කරන්න}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "ක්රියාකාරකම",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "අභිරුචි",
"emoji_button.flags": "Flags",
"emoji_button.food": "ආහාර සහ පාන",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "ඊළඟ",
"lightbox.previous": "පෙර",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "ලැයිස්තුවට එකතු කරන්න",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "පොත් යොමු",
"navigation_bar.community_timeline": "Local timeline",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "සෘජු පණිවිඩ",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "පැතිකඩ සංස්කරණය",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Adjust status privacy",
"privacy.direct.long": "Visible for mentioned users only",
- "privacy.direct.short": "සෘජු",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "ප්රසිද්ධ",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "නැවුම් කරන්න",
"regeneration_indicator.label": "පූරණය වෙමින්…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "සංස්කරණය",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 860e65413..861722c2f 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -32,7 +32,7 @@
"account.mute": "Nevšímaj si @{name}",
"account.mute_notifications": "Stĺm oboznámenia od @{name}",
"account.muted": "Nevšímaný/á",
- "account.posts": "Príspevky",
+ "account.posts": "Príspevky/ov",
"account.posts_with_replies": "Príspevky, aj s odpoveďami",
"account.report": "Nahlás @{name}",
"account.requested": "Čaká na schválenie. Klikni pre zrušenie žiadosti",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Iba miestna",
"community.column_settings.media_only": "Iba médiá",
"community.column_settings.remote_only": "Iba odľahlé",
- "compose_form.direct_message_warning": "Tento príspevok bude boslaný iba spomenutým užívateľom.",
+ "compose.language.change": "Zmeň jazyk",
+ "compose.language.search": "Hľadaj medzi jazykmi...",
"compose_form.direct_message_warning_learn_more": "Zisti viac",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.",
"compose_form.lock_disclaimer": "Tvoj účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.",
"compose_form.lock_disclaimer.lock": "zamknutý",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Odstráň túto voľbu",
"compose_form.poll.switch_to_multiple": "Zmeň anketu pre povolenie viacerých možností",
"compose_form.poll.switch_to_single": "Zmeň anketu na takú s jedinou voľbou",
- "compose_form.publish": "Pošli",
+ "compose_form.publish": "Zverejni",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Ulož zmeny",
"compose_form.sensitive.hide": "Označ médiá ako chúlostivé",
@@ -147,6 +149,7 @@
"embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.",
"embed.preview": "Tu je ako to bude vyzerať:",
"emoji_button.activity": "Aktivita",
+ "emoji_button.clear": "Vyčisti",
"emoji_button.custom": "Vlastné",
"emoji_button.flags": "Vlajky",
"emoji_button.food": "Jedlá a nápoje",
@@ -189,8 +192,8 @@
"errors.unexpected_crash.report_issue": "Nahlás problém",
"explore.search_results": "Výsledky hľadania",
"explore.suggested_follows": "Pre teba",
- "explore.title": "Explore",
- "explore.trending_links": "News",
+ "explore.title": "Objavuj",
+ "explore.trending_links": "Novinky",
"explore.trending_statuses": "Príspevky",
"explore.trending_tags": "Haštagy",
"follow_recommendations.done": "Hotovo",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "zameraj sa na príspevok v jednom zo stĺpcov",
"keyboard_shortcuts.compose": "zameraj sa na písaciu plochu",
"keyboard_shortcuts.description": "Popis",
- "keyboard_shortcuts.direct": "pre otvorenie panelu priamých správ",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "posunúť sa dole v zozname",
"keyboard_shortcuts.enter": "Otvor príspevok",
"keyboard_shortcuts.favourite": "pridaj do obľúbených",
@@ -264,6 +267,8 @@
"lightbox.expand": "Rozšíriť náhľad obrázku",
"lightbox.next": "Ďalšie",
"lightbox.previous": "Predchádzajúci",
+ "limited_account_hint.action": "Ukáž profil aj tak",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Pridaj do zoznamu",
"lists.account.remove": "Odober zo zoznamu",
"lists.delete": "Vymaž list",
@@ -294,7 +299,7 @@
"navigation_bar.discover": "Objavuj",
"navigation_bar.domain_blocks": "Skryté domény",
"navigation_bar.edit_profile": "Uprav profil",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Objavuj",
"navigation_bar.favourites": "Obľúbené",
"navigation_bar.filters": "Filtrované slová",
"navigation_bar.follow_requests": "Žiadosti o sledovanie",
@@ -309,7 +314,7 @@
"navigation_bar.preferences": "Nastavenia",
"navigation_bar.public_timeline": "Federovaná časová os",
"navigation_bar.security": "Zabezbečenie",
- "notification.admin.sign_up": "{name} signed up",
+ "notification.admin.sign_up": "{name} sa zaregistroval/a",
"notification.favourite": "{name} si obľúbil/a tvoj príspevok",
"notification.follow": "{name} ťa začal/a následovať",
"notification.follow_request": "{name} žiada ťa následovať",
@@ -318,10 +323,10 @@
"notification.poll": "Anketa v ktorej si hlasoval/a sa skončila",
"notification.reblog": "{name} zdieľal/a tvoj príspevok",
"notification.status": "{name} práve uverejnil/a",
- "notification.update": "{name} edited a post",
+ "notification.update": "{name} upravil/a príspevok",
"notifications.clear": "Vyčisti oboznámenia",
"notifications.clear_confirmation": "Naozaj chceš nenávratne prečistiť všetky tvoje oboznámenia?",
- "notifications.column_settings.admin.sign_up": "New sign-ups:",
+ "notifications.column_settings.admin.sign_up": "Nové registrácie:",
"notifications.column_settings.alert": "Oboznámenia na ploche",
"notifications.column_settings.favourite": "Obľúbené:",
"notifications.column_settings.filter_bar.advanced": "Zobraz všetky kategórie",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Odstráň anketu",
"privacy.change": "Uprav súkromie príspevku",
"privacy.direct.long": "Pošli iba spomenutým užívateľom",
- "privacy.direct.short": "Súkromne",
+ "privacy.direct.short": "Iba spomenutým ľudom",
"privacy.private.long": "Pošli iba následovateľom",
"privacy.private.short": "Iba pre sledujúcich",
- "privacy.public.long": "Pošli všetkým verejne",
+ "privacy.public.long": "Viditeľné pre všetkých",
"privacy.public.short": "Verejné",
- "privacy.unlisted.long": "Neposielaj do verejných časových osí",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Verejne, ale nezobraziť v osi",
"refresh": "Obnoviť",
"regeneration_indicator.label": "Načítava sa…",
@@ -456,8 +461,8 @@
"status.embed": "Vložiť",
"status.favourite": "Páči sa mi",
"status.filtered": "Filtrované",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "{name} vytvoril/a {date}",
+ "status.history.edited": "{name} upravil/a {date}",
"status.load_more": "Ukáž viac",
"status.media_hidden": "Skryté médiá",
"status.mention": "Spomeň @{name}",
@@ -515,6 +520,7 @@
"upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.",
"upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu",
"upload_form.description": "Opis pre slabo vidiacich",
+ "upload_form.description_missing": "Nepridaný žiadny popis",
"upload_form.edit": "Uprav",
"upload_form.thumbnail": "Zmeniť miniatúru",
"upload_form.undo": "Vymaž",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 92a3ffcc9..b094abfff 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -18,11 +18,11 @@
"account.followers": "Sledilci",
"account.followers.empty": "Nihče ne sledi temu uporabniku.",
"account.followers_counter": "{count, plural, one {ima {count} sledilca} two {ima {count} sledilca} few {ima {count} sledilcev} other {ima {count} sledilce}}",
- "account.following": "Following",
+ "account.following": "Sledim",
"account.following_counter": "{count, plural, one {sledi {count} osebi} two {sledi {count} osebama} few {sledi {count} osebam} other {sledi {count} osebam}}",
"account.follows.empty": "Ta uporabnik še ne sledi nikomur.",
"account.follows_you": "Vam sledi",
- "account.hide_reblogs": "Skrij spodbude od @{name}",
+ "account.hide_reblogs": "Skrij izpostavitve od @{name}",
"account.joined": "Pridružen/a {date}",
"account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}",
"account.locked_info": "Stanje zasebnosti računa je nastavljeno na zaklenjeno. Lastnik ročno pregleda, kdo ga lahko spremlja.",
@@ -32,12 +32,12 @@
"account.mute": "Utišaj @{name}",
"account.mute_notifications": "Utišaj obvestila od @{name}",
"account.muted": "Utišan",
- "account.posts": "Tuti",
- "account.posts_with_replies": "Tuti in odgovori",
+ "account.posts": "Objave",
+ "account.posts_with_replies": "Objave in odgovori",
"account.report": "Prijavi @{name}",
"account.requested": "Čakanje na odobritev. Kliknite, da prekličete prošnjo za sledenje",
"account.share": "Delite profil osebe @{name}",
- "account.show_reblogs": "Pokaži spodbude osebe @{name}",
+ "account.show_reblogs": "Pokaži izpostavitve osebe @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unblock": "Odblokiraj @{name}",
"account.unblock_domain": "Razkrij {domain}",
@@ -46,10 +46,10 @@
"account.unfollow": "Prenehaj slediti",
"account.unmute": "Odtišaj @{name}",
"account.unmute_notifications": "Vklopi obvestila od @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Odtišaj",
"account_note.placeholder": "Click to add a note",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.daily_retention": "Mera ohranjanja uporabnikov po dnevih od registracije",
+ "admin.dashboard.monthly_retention": "Mera ohranjanja uporabnikov po mesecih od registracije",
"admin.dashboard.retention.average": "Povprečje",
"admin.dashboard.retention.cohort": "Mesec prijave",
"admin.dashboard.retention.cohort_size": "Novi uporabniki",
@@ -79,7 +79,7 @@
"column.lists": "Seznami",
"column.mutes": "Utišani uporabniki",
"column.notifications": "Obvestila",
- "column.pins": "Pripeti tuti",
+ "column.pins": "Pripete objave",
"column.public": "Združena časovnica",
"column_back_button.label": "Nazaj",
"column_header.hide_settings": "Skrij nastavitve",
@@ -92,9 +92,11 @@
"community.column_settings.local_only": "Samo krajevno",
"community.column_settings.media_only": "Samo mediji",
"community.column_settings.remote_only": "Samo oddaljeno",
- "compose_form.direct_message_warning": "Ta tut bo viden le vsem omenjenim uporabnikom.",
- "compose_form.direct_message_warning_learn_more": "Nauči se več",
- "compose_form.hashtag_warning": "Ta tut ne bo naveden pod nobenim ključnikom, ker ni javen. Samo javne tute lahko iščete s ključniki.",
+ "compose.language.change": "Spremeni jezik",
+ "compose.language.search": "Poišči jezik ...",
+ "compose_form.direct_message_warning_learn_more": "Izvej več",
+ "compose_form.encryption_warning": "Objave na Mastodonu niso šifrirane od kraja do kraja. Prek Mastodona ne delite nobenih občutljivih informacij.",
+ "compose_form.hashtag_warning": "Ta objava ne bo navedena pod nobenim ključnikom, ker ni javen. Samo javne objave lahko iščete s ključniki.",
"compose_form.lock_disclaimer": "Vaš račun ni {locked}. Vsakdo vam lahko sledi in si ogleda objave, ki so namenjene samo sledilcem.",
"compose_form.lock_disclaimer.lock": "zaklenjen",
"compose_form.placeholder": "O čem razmišljaš?",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Odstrani to izbiro",
"compose_form.poll.switch_to_multiple": "Spremenite anketo, da omogočite več izbir",
"compose_form.poll.switch_to_single": "Spremenite anketo, da omogočite eno izbiro",
- "compose_form.publish": "Tutni",
+ "compose_form.publish": "Objavi",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Shrani spremembe",
"compose_form.sensitive.hide": "Označi medij kot občutljiv",
@@ -118,7 +120,7 @@
"confirmations.block.confirm": "Blokiraj",
"confirmations.block.message": "Ali ste prepričani, da želite blokirati {name}?",
"confirmations.delete.confirm": "Izbriši",
- "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to stanje?",
+ "confirmations.delete.message": "Ali ste prepričani, da želite izbrisati to objavo?",
"confirmations.delete_list.confirm": "Izbriši",
"confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?",
"confirmations.discard_edit_media.confirm": "Opusti",
@@ -131,7 +133,7 @@
"confirmations.mute.explanation": "S tem boste skrili objave pred njimi in objave, ki jih omenjajo, še vedno pa bodo lahko videli vaše objave in vam sledili.",
"confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?",
"confirmations.redraft.confirm": "Izbriši in preoblikuj",
- "confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in spodbude bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.",
+ "confirmations.redraft.message": "Ali ste prepričani, da želite izbrisati ta status in ga preoblikovati? Vzljubi in izpostavitve bodo izgubljeni, odgovori na izvirno objavo pa bodo osiroteli.",
"confirmations.reply.confirm": "Odgovori",
"confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?",
"confirmations.unfollow.confirm": "Prenehaj slediti",
@@ -147,6 +149,7 @@
"embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.",
"embed.preview": "Tako bo izgledalo:",
"emoji_button.activity": "Dejavnost",
+ "emoji_button.clear": "Počisti",
"emoji_button.custom": "Po meri",
"emoji_button.flags": "Zastave",
"emoji_button.food": "Hrana in Pijača",
@@ -161,7 +164,7 @@
"emoji_button.symbols": "Simboli",
"emoji_button.travel": "Potovanja in Kraji",
"empty_column.account_suspended": "Račun je suspendiran",
- "empty_column.account_timeline": "Tukaj ni tutov!",
+ "empty_column.account_timeline": "Tukaj ni objav!",
"empty_column.account_unavailable": "Profil ni na voljo",
"empty_column.blocks": "Niste še blokirali nobenega uporabnika.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
@@ -169,8 +172,8 @@
"empty_column.direct": "Nimate še nobenih neposrednih sporočil. Ko ga boste poslali ali prejeli, se bo prikazal tukaj.",
"empty_column.domain_blocks": "Še vedno ni skritih domen.",
"empty_column.explore_statuses": "Trenutno ni nič v trendu. Preverite znova kasneje!",
- "empty_column.favourited_statuses": "Nimate priljubljenih tutov. Ko boste vzljubili kakšnega, se bo prikazal tukaj.",
- "empty_column.favourites": "Nihče še ni vzljubil tega tuta. Ko ga bo nekdo, se bo pojavil tukaj.",
+ "empty_column.favourited_statuses": "Nimate priljubljenih objav. Ko boste vzljubili kakšno, bo prikazana tukaj.",
+ "empty_column.favourites": "Nihče še ni vzljubil te objave. Ko jo bo nekdo, se bo pojavila tukaj.",
"empty_column.follow_recommendations": "Kaže, da za vas ni mogoče pripraviti nobenih predlogov. Poskusite uporabiti iskanje, da poiščete osebe, ki jih poznate, ali raziščete ključnike, ki so v trendu.",
"empty_column.follow_requests": "Nimate prošenj za sledenje. Ko boste prejeli kakšno, se bo prikazala tukaj.",
"empty_column.hashtag": "V tem ključniku še ni nič.",
@@ -218,7 +221,7 @@
"hashtag.column_settings.tag_mode.none": "Nič od naštetega",
"hashtag.column_settings.tag_toggle": "Za ta stolpec vključi dodatne oznake",
"home.column_settings.basic": "Osnovno",
- "home.column_settings.show_reblogs": "Pokaži spodbude",
+ "home.column_settings.show_reblogs": "Pokaži izpostavitve",
"home.column_settings.show_replies": "Pokaži odgovore",
"home.hide_announcements": "Skrij objave",
"home.show_announcements": "Prikaži objave",
@@ -227,7 +230,7 @@
"intervals.full.minutes": "{number, plural, one {# minuta} two {# minuti} few {# minute} other {# minut}}",
"keyboard_shortcuts.back": "pojdi nazaj",
"keyboard_shortcuts.blocked": "odpri seznam blokiranih uporabnikov",
- "keyboard_shortcuts.boost": "spodbudi",
+ "keyboard_shortcuts.boost": "Izpostavi objavo",
"keyboard_shortcuts.column": "fokusiraj na status v enemu od stolpcev",
"keyboard_shortcuts.compose": "fokusiraj na območje za sestavljanje besedila",
"keyboard_shortcuts.description": "Opis",
@@ -241,13 +244,13 @@
"keyboard_shortcuts.home": "odpri domačo časovnico",
"keyboard_shortcuts.hotkey": "Hitra tipka",
"keyboard_shortcuts.legend": "pokaži to legendo",
- "keyboard_shortcuts.local": "odpri lokalno časovnico",
+ "keyboard_shortcuts.local": "Odpri krajevno časovnico",
"keyboard_shortcuts.mention": "omeni avtorja",
"keyboard_shortcuts.muted": "odpri seznam utišanih uporabnikov",
"keyboard_shortcuts.my_profile": "odpri svoj profil",
"keyboard_shortcuts.notifications": "odpri stolpec z obvestili",
"keyboard_shortcuts.open_media": "to open media",
- "keyboard_shortcuts.pinned": "odpri seznam pripetih tutov",
+ "keyboard_shortcuts.pinned": "Odpri seznam pripetih objav",
"keyboard_shortcuts.profile": "odpri avtorjev profil",
"keyboard_shortcuts.reply": "odgovori",
"keyboard_shortcuts.requests": "odpri seznam s prošnjami za sledenje",
@@ -256,7 +259,7 @@
"keyboard_shortcuts.start": "odpri stolpec \"začni\"",
"keyboard_shortcuts.toggle_hidden": "prikaži/skrij besedilo za CW",
"keyboard_shortcuts.toggle_sensitivity": "prikaži/skrij medije",
- "keyboard_shortcuts.toot": "začni povsem nov tut",
+ "keyboard_shortcuts.toot": "Začni povsem novo objavo",
"keyboard_shortcuts.unfocus": "odfokusiraj območje za sestavljanje besedila/iskanje",
"keyboard_shortcuts.up": "premakni se navzgor po seznamu",
"lightbox.close": "Zapri",
@@ -264,6 +267,8 @@
"lightbox.expand": "Razširi ogledno polje slike",
"lightbox.next": "Naslednji",
"lightbox.previous": "Prejšnji",
+ "limited_account_hint.action": "Vseeno pokaži profil",
+ "limited_account_hint.title": "Profil so moderatorji vašega strežnika skrili.",
"lists.account.add": "Dodaj na seznam",
"lists.account.remove": "Odstrani s seznama",
"lists.delete": "Izbriši seznam",
@@ -289,7 +294,7 @@
"navigation_bar.blocks": "Blokirani uporabniki",
"navigation_bar.bookmarks": "Zaznamki",
"navigation_bar.community_timeline": "Lokalna časovnica",
- "navigation_bar.compose": "Sestavi nov tut",
+ "navigation_bar.compose": "Sestavi novo objavo",
"navigation_bar.direct": "Neposredna sporočila",
"navigation_bar.discover": "Odkrijte",
"navigation_bar.domain_blocks": "Skrite domene",
@@ -305,7 +310,7 @@
"navigation_bar.logout": "Odjava",
"navigation_bar.mutes": "Utišani uporabniki",
"navigation_bar.personal": "Osebno",
- "navigation_bar.pins": "Pripeti tuti",
+ "navigation_bar.pins": "Pripete objave",
"navigation_bar.preferences": "Nastavitve",
"navigation_bar.public_timeline": "Združena časovnica",
"navigation_bar.security": "Varnost",
@@ -316,7 +321,7 @@
"notification.mention": "{name} vas je omenil/a",
"notification.own_poll": "Vaša anketa se je končala",
"notification.poll": "Glasovanje, v katerem ste sodelovali, se je končalo",
- "notification.reblog": "{name} je spodbudil/a vaš status",
+ "notification.reblog": "{name} je izpostavila/a vašo objavo",
"notification.status": "{name} je pravkar objavil/a",
"notification.update": "{name} je uredil(a) objavo",
"notifications.clear": "Počisti obvestila",
@@ -332,7 +337,7 @@
"notifications.column_settings.mention": "Omembe:",
"notifications.column_settings.poll": "Rezultati glasovanja:",
"notifications.column_settings.push": "Potisna obvestila",
- "notifications.column_settings.reblog": "Spodbude:",
+ "notifications.column_settings.reblog": "Izpostavitve:",
"notifications.column_settings.show": "Prikaži v stolpcu",
"notifications.column_settings.sound": "Predvajaj zvok",
"notifications.column_settings.status": "New toots:",
@@ -340,7 +345,7 @@
"notifications.column_settings.unread_notifications.highlight": "Poudari neprebrana obvestila",
"notifications.column_settings.update": "Urejanja:",
"notifications.filter.all": "Vse",
- "notifications.filter.boosts": "Spodbude",
+ "notifications.filter.boosts": "Izpostavitev",
"notifications.filter.favourites": "Priljubljeni",
"notifications.filter.follows": "Sledi",
"notifications.filter.mentions": "Omembe",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Odstrani anketo",
"privacy.change": "Prilagodi zasebnost statusa",
"privacy.direct.long": "Objavi samo omenjenim uporabnikom",
- "privacy.direct.short": "Neposredno",
+ "privacy.direct.short": "Samo omenjeni",
"privacy.private.long": "Objavi samo sledilcem",
"privacy.private.short": "Samo sledilci",
- "privacy.public.long": "Objavi na javne časovnice",
+ "privacy.public.long": "Vidno vsem",
"privacy.public.short": "Javno",
- "privacy.unlisted.long": "Ne objavi na javne časovnice",
+ "privacy.unlisted.long": "Vidno za vse, vendar izključeno iz funkcionalnosti odkrivanja",
"privacy.unlisted.short": "Ni prikazano",
"refresh": "Osveži",
"regeneration_indicator.label": "Nalaganje…",
@@ -428,24 +433,24 @@
"report.unfollow_explanation": "Temu računu sledite. Da ne boste več videli njegovih objav v svojem domačem viru, mu prenehajte slediti.",
"search.placeholder": "Iskanje",
"search_popout.search_format": "Napredna oblika iskanja",
- "search_popout.tips.full_text": "Enostavno besedilo vrne statuse, ki ste jih napisali, vzljubili, spodbudili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.",
+ "search_popout.tips.full_text": "Enostavno besedilo vrne objave, ki ste jih napisali, vzljubili, izpostavili ali ste bili v njih omenjeni, kot tudi ujemajoča se uporabniška imena, prikazna imena in ključnike.",
"search_popout.tips.hashtag": "ključnik",
- "search_popout.tips.status": "stanje",
+ "search_popout.tips.status": "objava",
"search_popout.tips.text": "Enostavno besedilo vrne ujemajoča se prikazna imena, uporabniška imena in ključnike",
"search_popout.tips.user": "uporabnik",
"search_results.accounts": "Ljudje",
"search_results.all": "Vse",
"search_results.hashtags": "Ključniki",
"search_results.nothing_found": "Za ta iskalni niz ni zadetkov",
- "search_results.statuses": "Tuti",
- "search_results.statuses_fts_disabled": "Iskanje tutov po njihovi vsebini ni omogočeno na tem strežniku Mastodon.",
+ "search_results.statuses": "Objave",
+ "search_results.statuses_fts_disabled": "Iskanje objav po njihovi vsebini ni omogočeno na tem strežniku Mastodon.",
"search_results.total": "{count, number} {count, plural, one {rezultat} other {rezultatov}}",
"status.admin_account": "Odpri vmesnik za moderiranje za @{name}",
"status.admin_status": "Odpri status v vmesniku za moderiranje",
"status.block": "Blokiraj @{name}",
"status.bookmark": "Dodaj med zaznamke",
- "status.cancel_reblog_private": "Prekini spodbudo",
- "status.cannot_reblog": "Te objave ni mogoče spodbuditi",
+ "status.cancel_reblog_private": "Prekliči izpostavitev",
+ "status.cannot_reblog": "Te objave ni mogoče izpostaviti",
"status.copy": "Kopiraj povezavo do statusa",
"status.delete": "Izbriši",
"status.detailed_status": "Podroben pogled pogovora",
@@ -466,12 +471,12 @@
"status.mute_conversation": "Utišaj pogovor",
"status.open": "Razširi ta status",
"status.pin": "Pripni na profil",
- "status.pinned": "Pripeti tut",
+ "status.pinned": "Pripeta objava",
"status.read_more": "Preberi več",
- "status.reblog": "Spodbudi",
- "status.reblog_private": "Spodbudi izvirnemu občinstvu",
- "status.reblogged_by": "{name} spodbuja",
- "status.reblogs.empty": "Nihče še ni spodbudil tega tuta. Ko se bo to zgodilo, se bodo pojavili tukaj.",
+ "status.reblog": "Izpostavi",
+ "status.reblog_private": "Izpostavi z izvirno vidljivostjo",
+ "status.reblogged_by": "{name} je izpostavil/a",
+ "status.reblogs.empty": "Nihče še ni izpostavil te objave. Ko se bo to zgodilo, se bodo pojavile tukaj.",
"status.redraft": "Izbriši in preoblikuj",
"status.remove_bookmark": "Odstrani zaznamek",
"status.reply": "Odgovori",
@@ -491,7 +496,7 @@
"suggestions.header": "Morda bi vas zanimalo…",
"tabs_bar.federated_timeline": "Združeno",
"tabs_bar.home": "Domov",
- "tabs_bar.local_timeline": "Lokalno",
+ "tabs_bar.local_timeline": "Krajevno",
"tabs_bar.notifications": "Obvestila",
"tabs_bar.search": "Iskanje",
"time_remaining.days": "{number, plural, one {# dan} other {# dni}} je ostalo",
@@ -515,6 +520,7 @@
"upload_error.poll": "Prenos datoteke z anketami ni dovoljen.",
"upload_form.audio_description": "Opiši za osebe z okvaro sluha",
"upload_form.description": "Opišite za slabovidne",
+ "upload_form.description_missing": "Noben opis ni bil dodan",
"upload_form.edit": "Uredi",
"upload_form.thumbnail": "Spremeni sličico",
"upload_form.undo": "Izbriši",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index d1047f5da..ba354e98b 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -18,7 +18,7 @@
"account.followers": "Ndjekës",
"account.followers.empty": "Këtë përdorues ende s’e ndjek kush.",
"account.followers_counter": "{count, plural, one {{counter} Ndjekës} other {{counter} Ndjekës}}",
- "account.following": "Following",
+ "account.following": "Ndjekje",
"account.following_counter": "{count, plural, one {{counter} i Ndjekur} other {{counter} të Ndjekur}}",
"account.follows.empty": "Ky përdorues ende s’ndjek kënd.",
"account.follows_you": "Ju ndjek",
@@ -41,12 +41,12 @@
"account.statuses_counter": "{count, plural, one {{counter} Mesazh} other {{counter} Mesazhe}}",
"account.unblock": "Zhbllokoje @{name}",
"account.unblock_domain": "Zhblloko përkatësinë {domain}",
- "account.unblock_short": "Unblock",
+ "account.unblock_short": "Zhbllokoje",
"account.unendorse": "Mos e përfshi në profil",
"account.unfollow": "Resht së ndjekuri",
"account.unmute": "Ktheji zërin @{name}",
"account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Çheshtoje",
"account_note.placeholder": "Klikoni për të shtuar shënim",
"admin.dashboard.daily_retention": "Shkallë mbajtjeje përdoruesi, në ditë, pas regjistrimit",
"admin.dashboard.monthly_retention": "Shkallë mbajtjeje përdoruesi, në muaj, pas regjistrimit",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Vetëm vendore",
"community.column_settings.media_only": "Vetëm Media",
"community.column_settings.remote_only": "Vetëm të largëta",
- "compose_form.direct_message_warning": "Ky mesazh do t’u dërgohet përdoruesve të përmendur.",
+ "compose.language.change": "Ndryshoni gjuhën",
+ "compose.language.search": "Kërkoni te gjuhët…",
"compose_form.direct_message_warning_learn_more": "Mësoni më tepër",
+ "compose_form.encryption_warning": "Postimet në Mastodon nuk fshehtëzohen skaj-më-skaj. Mos ndani me të tjerë gjëra me spec në Mastodon.",
"compose_form.hashtag_warning": "Ky mesazh s’do të paraqitet nën ndonjë hashtag, ngaqë s’i është caktuar ndonjë. Vetëm mesazhet publike mund të kërkohen sipas hashtagësh.",
"compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.",
"compose_form.lock_disclaimer.lock": "e kyçur",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Hiqe këtë zgjedhje",
"compose_form.poll.switch_to_multiple": "Ndrysho votimin për të lejuar shumë zgjedhje",
"compose_form.poll.switch_to_single": "Ndrysho votimin për të lejuar vetëm një zgjedhje",
- "compose_form.publish": "Mesazh",
+ "compose_form.publish": "Botoje",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Ruaji ndryshimet",
"compose_form.sensitive.hide": "{count, plural, one {Vëri shenjë medias si rezervat} other {Vëru shenjë mediave si rezervat}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.",
"embed.preview": "Ja si do të duket:",
"emoji_button.activity": "Veprimtari",
+ "emoji_button.clear": "Spastroje",
"emoji_button.custom": "Vetjak",
"emoji_button.flags": "Flamuj",
"emoji_button.food": "Ushqim & Pije",
@@ -166,7 +169,7 @@
"empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.",
"empty_column.bookmarked_statuses": "S’keni faqeruajtur ende ndonjë mesazh. Kur faqeruani një të tillë, ai do të shfaqet këtu.",
"empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!",
- "empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejt. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.",
+ "empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejtë. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.",
"empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.",
"empty_column.explore_statuses": "Asgjë në modë tani. Kontrolloni më vonë!",
"empty_column.favourited_statuses": "S’keni ende ndonjë mesazh të parapëlqyer. Kur parapëlqeni një të tillë, ai do të shfaqet këtu.",
@@ -225,45 +228,47 @@
"intervals.full.days": "{number, plural, one {# ditë} other {# ditë}}",
"intervals.full.hours": "{number, plural, one {# orë} other {# orë}}",
"intervals.full.minutes": "{number, plural, one {# minutë} other {# minuta}}",
- "keyboard_shortcuts.back": "për shkuarje mbrapsht",
- "keyboard_shortcuts.blocked": "për hapje liste përdoruesish të bllokuar",
- "keyboard_shortcuts.boost": "për përforcim",
- "keyboard_shortcuts.column": "për kalim fokusi mbi një gjendje te një nga shtyllat",
- "keyboard_shortcuts.compose": "për kalim fokusi te fusha e hartimit të mesazheve",
+ "keyboard_shortcuts.back": "Për shkuarje mbrapsht",
+ "keyboard_shortcuts.blocked": "Për hapje liste përdoruesish të bllokuar",
+ "keyboard_shortcuts.boost": "Përforcim postimi",
+ "keyboard_shortcuts.column": "Fokusi mbi një shtyllë",
+ "keyboard_shortcuts.compose": "Fokusi te fusha e hartimit të mesazheve",
"keyboard_shortcuts.description": "Përshkrim",
"keyboard_shortcuts.direct": "për hapje shtylle mesazhesh të drejtpërdrejtë",
- "keyboard_shortcuts.down": "për zbritje poshtë nëpër listë",
- "keyboard_shortcuts.enter": "për hapje gjendjeje",
- "keyboard_shortcuts.favourite": "për t’i vënë shenjë si të parapëlqyer",
- "keyboard_shortcuts.favourites": "për hapje liste të parapëlqyerish",
- "keyboard_shortcuts.federated": "për hapje rrjedhe kohore të të federuarve",
+ "keyboard_shortcuts.down": "Për zbritje poshtë nëpër listë",
+ "keyboard_shortcuts.enter": "Për hapje postimi",
+ "keyboard_shortcuts.favourite": "Për t’i vënë shenjë si të parapëlqyer një postimi",
+ "keyboard_shortcuts.favourites": "Për hapje liste të parapëlqyerish",
+ "keyboard_shortcuts.federated": "Për hapje rrjedhe kohore të të federuarve",
"keyboard_shortcuts.heading": "Shkurtore tastiere",
- "keyboard_shortcuts.home": "për hapje rrjedhe kohore vetjake",
+ "keyboard_shortcuts.home": "Për hapje rrjedhe kohore vetjake",
"keyboard_shortcuts.hotkey": "Tast përkatës",
- "keyboard_shortcuts.legend": "për shfaqje të kësaj legjende",
- "keyboard_shortcuts.local": "për hapje rrjedhe kohore vendore",
- "keyboard_shortcuts.mention": "për përmendje të autorit",
- "keyboard_shortcuts.muted": "për hapje liste përdoruesish të heshtuar",
- "keyboard_shortcuts.my_profile": "për hapjen e profilit tuaj",
- "keyboard_shortcuts.notifications": "për hapje shtylle njoftimesh",
- "keyboard_shortcuts.open_media": "për hapje mediash",
- "keyboard_shortcuts.pinned": "për hapje liste mesazhesh të fiksuar",
- "keyboard_shortcuts.profile": "për hapje të profilit të autorit",
- "keyboard_shortcuts.reply": "për t’u përgjigjur",
- "keyboard_shortcuts.requests": "për hapje liste kërkesash për ndjekje",
- "keyboard_shortcuts.search": "për kalim fokusi te kërkimi",
- "keyboard_shortcuts.spoilers": "për shfaqje/fshehje fushe CW",
- "keyboard_shortcuts.start": "për hapjen e shtyllës “fillojani”",
- "keyboard_shortcuts.toggle_hidden": "për shfaqje/fshehje teksti pas CW",
- "keyboard_shortcuts.toggle_sensitivity": "për shfaqje/fshehje mediash",
- "keyboard_shortcuts.toot": "për të filluar një mesazh fringo të ri",
- "keyboard_shortcuts.unfocus": "për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve",
- "keyboard_shortcuts.up": "për ngjitje sipër nëpër listë",
+ "keyboard_shortcuts.legend": "Për shfaqje të kësaj legjende",
+ "keyboard_shortcuts.local": "Për hapje rrjedhe kohore vendore",
+ "keyboard_shortcuts.mention": "Për përmendje të autorit",
+ "keyboard_shortcuts.muted": "Për hapje liste përdoruesish të heshtuar",
+ "keyboard_shortcuts.my_profile": "Për hapjen e profilit tuaj",
+ "keyboard_shortcuts.notifications": "Për hapje shtylle njoftimesh",
+ "keyboard_shortcuts.open_media": "Për hapje mediash",
+ "keyboard_shortcuts.pinned": "Për hapje liste mesazhesh të fiksuar",
+ "keyboard_shortcuts.profile": "Për hapje të profilit të autorit",
+ "keyboard_shortcuts.reply": "Për t’iu përgjigjur një postimi",
+ "keyboard_shortcuts.requests": "Për hapje liste kërkesash për ndjekje",
+ "keyboard_shortcuts.search": "Për kalim fokusi te kërkimi",
+ "keyboard_shortcuts.spoilers": "Për shfaqje/fshehje fushe CW",
+ "keyboard_shortcuts.start": "Për hapjen e shtyllës “fillojani”",
+ "keyboard_shortcuts.toggle_hidden": "Për shfaqje/fshehje teksti pas CW",
+ "keyboard_shortcuts.toggle_sensitivity": "Për shfaqje/fshehje mediash",
+ "keyboard_shortcuts.toot": "Për të filluar një mesazh të ri",
+ "keyboard_shortcuts.unfocus": "Për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve",
+ "keyboard_shortcuts.up": "Për ngjitje sipër nëpër listë",
"lightbox.close": "Mbylle",
"lightbox.compress": "Ngjeshe kuadratin e parjes së figurave",
"lightbox.expand": "Zgjeroje kuadratin e parjes së figurave",
"lightbox.next": "Pasuesja",
"lightbox.previous": "E mëparshmja",
+ "limited_account_hint.action": "Shfaqe profilin sido qoftë",
+ "limited_account_hint.title": "Ky profil është fshehur nga moderatorët e shërbyesit tuaj.",
"lists.account.add": "Shto në listë",
"lists.account.remove": "Hiqe nga lista",
"lists.delete": "Fshije listën",
@@ -294,7 +299,7 @@
"navigation_bar.discover": "Zbuloni",
"navigation_bar.domain_blocks": "Përkatësi të bllokuara",
"navigation_bar.edit_profile": "Përpunoni profilin",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Eksploroni",
"navigation_bar.favourites": "Të parapëlqyer",
"navigation_bar.filters": "Fjalë të heshtuara",
"navigation_bar.follow_requests": "Kërkesa për ndjekje",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Hiqe pyetësorin",
"privacy.change": "Rregulloni privatësi mesazhesh",
"privacy.direct.long": "I dukshëm vetëm për përdorues të përmendur",
- "privacy.direct.short": "I drejtpërdrejtë",
+ "privacy.direct.short": "Vetëm për personat e përmendur",
"privacy.private.long": "I dukshëm vetëm për ndjekës",
- "privacy.private.short": "Vetëm ndjekësve",
- "privacy.public.long": "I dukshëm për të tërë, shfaqur në rrjedha kohore publike",
+ "privacy.private.short": "Vetëm ndjekës",
+ "privacy.public.long": "I dukshëm për të tërë",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "I dukshëm për të tërë, por jo në rrjedha kohore publike",
+ "privacy.unlisted.long": "I dukshëm për të tërë, por lënë jashtë nga veçoritë e zbulimit",
"privacy.unlisted.short": "Jo në lista",
"refresh": "Rifreskoje",
"regeneration_indicator.label": "Po ngarkohet…",
@@ -515,6 +520,7 @@
"upload_error.poll": "Me pyetësorët s’lejohet ngarkim kartelash.",
"upload_form.audio_description": "Përshkruajeni për persona me dëgjim të kufizuar",
"upload_form.description": "Përshkruajeni për persona me probleme shikimi",
+ "upload_form.description_missing": "S’u shtua përshkrim",
"upload_form.edit": "Përpunoni",
"upload_form.thumbnail": "Ndryshoni miniaturën",
"upload_form.undo": "Fshije",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 332352cc1..498cbf963 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Vaš nalog nije {locked}. Svako može da Vas zaprati i da vidi objave namenjene samo Vašim pratiocima.",
"compose_form.lock_disclaimer.lock": "zaključan",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Tutni",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.",
"embed.preview": "Ovako će da izgleda:",
"emoji_button.activity": "Aktivnost",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Proizvoljno",
"emoji_button.flags": "Zastave",
"emoji_button.food": "Hrana & piće",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Sledeći",
"lightbox.previous": "Prethodni",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Dodaj na listu",
"lists.account.remove": "Ukloni sa liste",
"lists.delete": "Obriši listu",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Podesi status privatnosti",
"privacy.direct.long": "Objavi samo korisnicima koji su pomenuti",
- "privacy.direct.short": "Direktno",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Objavi samo pratiocima",
- "privacy.private.short": "Samo za pratioce",
- "privacy.public.long": "Objavi na javnoj lajni",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Javno",
- "privacy.unlisted.long": "Ne objavljuj na javnim lajnama",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Neizlistano",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Opiši za slabovide osobe",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Opozovi",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index e7f1e54cc..1e6ec2086 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -70,7 +70,7 @@
"column.blocks": "Блокирани корисници",
"column.bookmarks": "Обележивачи",
"column.community": "Локална временска линија",
- "column.direct": "Директне поруке",
+ "column.direct": "Direct messages",
"column.directory": "Претражи налоге",
"column.domain_blocks": "Скривени домени",
"column.favourites": "Омиљене",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Само локално",
"community.column_settings.media_only": "Само Медији",
"community.column_settings.remote_only": "Само удаљено",
- "compose_form.direct_message_warning": "Ова труба ће бити послата споменутим корисницима.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Сазнајте више",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Ова труба неће бити излистана под било којом тарабом јер је сакривена. Само јавне трубе могу бити претражене тарабом.",
"compose_form.lock_disclaimer": "Ваш налог није {locked}. Свако може да Вас запрати и да види објаве намењене само Вашим пратиоцима.",
"compose_form.lock_disclaimer.lock": "закључан",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Одстрани овај избор",
"compose_form.poll.switch_to_multiple": "Промените анкету да бисте омогућили више избора",
"compose_form.poll.switch_to_single": "Промените анкету да бисте омогућили један избор",
- "compose_form.publish": "Труби",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "Означи мултимедију као осетљиву",
@@ -147,6 +149,7 @@
"embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.",
"embed.preview": "Овако ће да изгледа:",
"emoji_button.activity": "Активност",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Произвољно",
"emoji_button.flags": "Заставе",
"emoji_button.food": "Храна и пиће",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Још увек немате блокираних корисника.",
"empty_column.bookmarked_statuses": "Још увек немате обележене трубе. Када их обележите, појавиће се овде.",
"empty_column.community": "Локална временска линија је празна. Напишите нешто јавно да започнете!",
- "empty_column.direct": "Још увек немате директних порука. Када пошаљете или примите једну, појавиће се овде.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "Још увек нема сакривених домена.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "Још увек немате труба које су вам се свиделе. Када вам се једна свиди, појавиће се овде.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "да се пребаците на статус у једној од колона",
"keyboard_shortcuts.compose": "да се пребаците на писање новог тута",
"keyboard_shortcuts.description": "Опис",
- "keyboard_shortcuts.direct": "да отворите колону за директне поруке",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "да се померите на доле у листи",
"keyboard_shortcuts.enter": "да отворите статус",
"keyboard_shortcuts.favourite": "да означите као омиљено",
@@ -264,6 +267,8 @@
"lightbox.expand": "Увећај преглед слике",
"lightbox.next": "Следећи",
"lightbox.previous": "Претходни",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Додај на листу",
"lists.account.remove": "Уклони са листе",
"lists.delete": "Обриши листу",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Маркери",
"navigation_bar.community_timeline": "Локална временска линија",
"navigation_bar.compose": "Саставите нову трубу",
- "navigation_bar.direct": "Директне поруке",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Откриј",
"navigation_bar.domain_blocks": "Сакривени домени",
"navigation_bar.edit_profile": "Измени налог",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Уклони анкету",
"privacy.change": "Подеси статус приватности",
"privacy.direct.long": "Објави само корисницима који су поменути",
- "privacy.direct.short": "Директно",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Објави само пратиоцима",
- "privacy.private.short": "Само за пратиоце",
- "privacy.public.long": "Објави на јавној лајни",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Јавно",
- "privacy.unlisted.long": "Не објављуј на јавним временским линијама",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Неизлистано",
"refresh": "Освежи",
"regeneration_indicator.label": "Учитавање…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Опишите за особе са оштећеним видом",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Уреди",
"upload_form.thumbnail": "Промени приказ слика",
"upload_form.undo": "Обриши",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 65e547183..46baa722e 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -32,8 +32,8 @@
"account.mute": "Tysta @{name}",
"account.mute_notifications": "Stäng av notifieringar från @{name}",
"account.muted": "Tystad",
- "account.posts": "Tutningar",
- "account.posts_with_replies": "Tutningar och svar",
+ "account.posts": "Inlägg",
+ "account.posts_with_replies": "Inlägg och svar",
"account.report": "Rapportera @{name}",
"account.requested": "Inväntar godkännande. Klicka för att avbryta följarförfrågan",
"account.share": "Dela @{name}s profil",
@@ -80,7 +80,7 @@
"column.mutes": "Tystade användare",
"column.notifications": "Aviseringar",
"column.pins": "Nålade toots",
- "column.public": "Förenad tidslinje",
+ "column.public": "Federerad tidslinje",
"column_back_button.label": "Tillbaka",
"column_header.hide_settings": "Dölj inställningar",
"column_header.moveLeft_settings": "Flytta kolumnen åt vänster",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Endast lokalt",
"community.column_settings.media_only": "Endast media",
"community.column_settings.remote_only": "Endast fjärr",
- "compose_form.direct_message_warning": "Denna tutning kommer endast skickas till de nämnda användarna.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Lär dig mer",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "Denna toot kommer inte att visas under någon hashtag eftersom den är onoterad. Endast offentliga toots kan sökas med hashtag.",
"compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig för att se dina inlägg som endast är för följare.",
"compose_form.lock_disclaimer.lock": "låst",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Ta bort detta val",
"compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val",
"compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val",
- "compose_form.publish": "Tut",
+ "compose_form.publish": "Publicera",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Spara ändringar",
"compose_form.sensitive.hide": "Markera media som känsligt",
@@ -147,6 +149,7 @@
"embed.instructions": "Lägg in denna status på din webbplats genom att kopiera koden nedan.",
"embed.preview": "Så här kommer det att se ut:",
"emoji_button.activity": "Aktivitet",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Anpassad",
"emoji_button.flags": "Flaggor",
"emoji_button.food": "Mat & dryck",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Du har ännu ej blockerat några användare.",
"empty_column.bookmarked_statuses": "Du har inte bokmärkt några tutar än. När du gör ett bokmärke kommer det synas här.",
"empty_column.community": "Den lokala tidslinjen är tom. Skriv något offentligt för att sätta bollen i rullning!",
- "empty_column.direct": "Du har inga direktmeddelanden än. När du skickar eller tar emot ett kommer det att visas här.",
+ "empty_column.direct": "Du har inga direktmeddelanden. När du skickar eller tar emot ett direktmeddelande kommer det att visas här.",
"empty_column.domain_blocks": "Det finns ännu inga dolda domäner.",
"empty_column.explore_statuses": "Ingenting är trendigt just nu. Kom tillbaka senare!",
"empty_column.favourited_statuses": "Du har inga favoritmarkerade toots än. När du favoritmarkerar en kommer den visas här.",
@@ -236,7 +239,7 @@
"keyboard_shortcuts.enter": "för att öppna en status",
"keyboard_shortcuts.favourite": "för att sätta som favorit",
"keyboard_shortcuts.favourites": "för att öppna Favoriter",
- "keyboard_shortcuts.federated": "för att öppna Förenad tidslinje",
+ "keyboard_shortcuts.federated": "Öppna federerad tidslinje",
"keyboard_shortcuts.heading": "Tangentbordsgenvägar",
"keyboard_shortcuts.home": "för att öppna Hem-tidslinjen",
"keyboard_shortcuts.hotkey": "Kommando",
@@ -247,7 +250,7 @@
"keyboard_shortcuts.my_profile": "för att öppna din profil",
"keyboard_shortcuts.notifications": "för att öppna Meddelanden",
"keyboard_shortcuts.open_media": "öppna media",
- "keyboard_shortcuts.pinned": "för att öppna Nålade toots",
+ "keyboard_shortcuts.pinned": "för att öppna nålade inlägg",
"keyboard_shortcuts.profile": "för att öppna skaparens profil",
"keyboard_shortcuts.reply": "för att svara",
"keyboard_shortcuts.requests": "för att öppna Följförfrågningar",
@@ -264,6 +267,8 @@
"lightbox.expand": "Utöka bildvyrutan",
"lightbox.next": "Nästa",
"lightbox.previous": "Tidigare",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Lägg till i lista",
"lists.account.remove": "Ta bort från lista",
"lists.delete": "Radera lista",
@@ -307,7 +312,7 @@
"navigation_bar.personal": "Personligt",
"navigation_bar.pins": "Nålade inlägg (toots)",
"navigation_bar.preferences": "Inställningar",
- "navigation_bar.public_timeline": "Förenad tidslinje",
+ "navigation_bar.public_timeline": "Federerad tidslinje",
"navigation_bar.security": "Säkerhet",
"notification.admin.sign_up": "{name} registrerade sig",
"notification.favourite": "{name} favoriserade din status",
@@ -335,7 +340,7 @@
"notifications.column_settings.reblog": "Knuffar:",
"notifications.column_settings.show": "Visa i kolumnen",
"notifications.column_settings.sound": "Spela upp ljud",
- "notifications.column_settings.status": "Nya tutor:",
+ "notifications.column_settings.status": "Nya inlägg:",
"notifications.column_settings.unread_notifications.category": "O-lästa aviseringar",
"notifications.column_settings.unread_notifications.highlight": "Markera o-lästa aviseringar",
"notifications.column_settings.update": "Redigeringar:",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Ta bort omröstning",
"privacy.change": "Justera sekretess",
"privacy.direct.long": "Skicka endast till nämnda användare",
- "privacy.direct.short": "Direkt",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Endast synligt för följare",
"privacy.private.short": "Endast följare",
- "privacy.public.long": "Skicka till publik tidslinje",
+ "privacy.public.long": "Synlig för alla",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "Skicka inte till publik tidslinje",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Olistad",
"refresh": "Läs om",
"regeneration_indicator.label": "Laddar…",
@@ -423,7 +428,7 @@
"report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
"report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
"report.thanks.title": "Vill du inte se det här?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+ "report.thanks.title_actionable": "Tack för att du rapporterar, vi kommer att titta på detta.",
"report.unfollow": "Sluta följ @{username}",
"report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
"search.placeholder": "Sök",
@@ -436,8 +441,8 @@
"search_results.accounts": "Människor",
"search_results.all": "Alla",
"search_results.hashtags": "Hashtaggar",
- "search_results.nothing_found": "Could not find anything for these search terms",
- "search_results.statuses": "Tutor",
+ "search_results.nothing_found": "Kunde inte hitta något för dessa sökord",
+ "search_results.statuses": "Inlägg",
"search_results.statuses_fts_disabled": "Att söka toots med deras innehåll är inte möjligt på denna Mastodon-server.",
"search_results.total": "{count, number} {count, plural, ett {result} andra {results}}",
"status.admin_account": "Öppet modereringsgränssnitt för @{name}",
@@ -451,13 +456,13 @@
"status.detailed_status": "Detaljerad samtalsvy",
"status.direct": "Direktmeddela @{name}",
"status.edit": "Redigera",
- "status.edited": "Edited {date}",
+ "status.edited": "Ändrad {date}",
"status.edited_x_times": "Redigerad {count, plural, one {{count} gång} other {{count} gånger}}",
"status.embed": "Bädda in",
"status.favourite": "Favorit",
"status.filtered": "Filtrerat",
- "status.history.created": "{name} created {date}",
- "status.history.edited": "{name} edited {date}",
+ "status.history.created": "{name} skapade {date}",
+ "status.history.edited": "{name} redigerade {date}",
"status.load_more": "Ladda fler",
"status.media_hidden": "Media dold",
"status.mention": "Omnämn @{name}",
@@ -489,7 +494,7 @@
"status.unpin": "Ångra fäst i profil",
"suggestions.dismiss": "Avfärda förslag",
"suggestions.header": "Du kanske är intresserad av…",
- "tabs_bar.federated_timeline": "Förenad",
+ "tabs_bar.federated_timeline": "Federerad",
"tabs_bar.home": "Hem",
"tabs_bar.local_timeline": "Lokal",
"tabs_bar.notifications": "Aviseringar",
@@ -515,6 +520,7 @@
"upload_error.poll": "Filuppladdning tillåts inte med omröstningar.",
"upload_form.audio_description": "Beskriv för personer med hörselnedsättning",
"upload_form.description": "Beskriv för synskadade",
+ "upload_form.description_missing": "Beskrivning saknas",
"upload_form.edit": "Redigera",
"upload_form.thumbnail": "Ändra miniatyr",
"upload_form.undo": "Radera",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index 088b5ff36..658a3318e 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 3c4bcb234..68b11b61b 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -70,7 +70,7 @@
"column.blocks": "தடுக்கப்பட்ட பயனர்கள்",
"column.bookmarks": "அடையாளக்குறிகள்",
"column.community": "சுய நிகழ்வு காலவரிசை",
- "column.direct": "நேர் சேதிகள்",
+ "column.direct": "Direct messages",
"column.directory": "சுயவிவரங்களை உலாவு",
"column.domain_blocks": "மறைந்திருக்கும் திரளங்கள்",
"column.favourites": "பிடித்தவைகள்",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "அருகிலிருந்து மட்டுமே",
"community.column_settings.media_only": "படங்கள் மட்டுமே",
"community.column_settings.remote_only": "தொலைவிலிருந்து மட்டுமே",
- "compose_form.direct_message_warning": "இந்த டூட் இதில் குறிப்பிடப்பட்டுள்ள பயனர்களுக்கு மட்டுமே அனுப்பப்படும்.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "மேலும் அறிய",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "இது ஒரு பட்டியலிடப்படாத டூட் என்பதால் எந்த ஹேஷ்டேகின் கீழும் வராது. ஹேஷ்டேகின் மூலம் பொதுவில் உள்ள டூட்டுகளை மட்டுமே தேட முடியும்.",
"compose_form.lock_disclaimer": "உங்கள் கணக்கு {locked} செய்யப்படவில்லை. உங்கள் பதிவுகளை யார் வேண்டுமானாலும் பின்தொடர்ந்து காணலாம்.",
"compose_form.lock_disclaimer.lock": "பூட்டப்பட்டது",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "இந்தத் தேர்வை அகற்று",
"compose_form.poll.switch_to_multiple": "பல தேர்வுகளை அனுமதிக்குமாறு மாற்று",
"compose_form.poll.switch_to_single": "ஒரே ஒரு தேர்வை மட்டும் அனுமதிக்குமாறு மாற்று",
- "compose_form.publish": "டூட்",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "அனைவருக்கும் ஏற்றப் படம் இல்லை எனக் குறியிடு",
@@ -147,6 +149,7 @@
"embed.instructions": "இந்தப் பதிவை உங்கள் வலைதளத்தில் பொதிக்கக் கீழே உள்ள வரிகளை காப்பி செய்யவும்.",
"embed.preview": "பார்க்க இப்படி இருக்கும்:",
"emoji_button.activity": "செயல்பாடு",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "தனிப்பயன்",
"emoji_button.flags": "கொடிகள்",
"emoji_button.food": "உணவு மற்றும் பானம்",
@@ -166,7 +169,7 @@
"empty_column.blocks": "நீங்கள் இதுவரை எந்தப் பயனர்களையும் முடக்கியிருக்கவில்லை.",
"empty_column.bookmarked_statuses": "உங்களிடம் அடையாளக்குறியிட்ட டூட்டுகள் எவையும் இல்லை. அடையாளக்குறியிட்ட பிறகு அவை இங்கே காட்டப்படும்.",
"empty_column.community": "உங்கள் மாஸ்டடான் முச்சந்தியில் யாரும் இல்லை. எதையேனும் எழுதி ஆட்டத்தைத் துவக்குங்கள்!",
- "empty_column.direct": "உங்கள் தனிப்பெட்டியில் செய்திகள் ஏதும் இல்லை. செய்தியை நீங்கள் அனுப்பும்போதோ அல்லது பெறும்போதோ, அது இங்கே காண்பிக்கப்படும்.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "தடுக்கப்பட்டக் களங்கள் இதுவரை இல்லை.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "உங்களுக்குப் பிடித்த டூட்டுகள் இதுவரை இல்லை. ஒரு டூட்டில் நீங்கள் விருப்பக்குறி இட்டால், அது இங்கே காண்பிக்கப்படும்.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "ஏதேனும் ஒரு நெடுவரிசையில் உள்ள டூட்டுல் கவனம் செலுத்த",
"keyboard_shortcuts.compose": "பதிவு எழுதும் பெட்டியில் கவனம் செலுத்த",
"keyboard_shortcuts.description": "விவரம்",
- "keyboard_shortcuts.direct": "தனிப்பெட்டியைத் திறக்க",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "பட்டியலின் கீழே செல்ல",
"keyboard_shortcuts.enter": "டூட்டைத் திறக்க",
"keyboard_shortcuts.favourite": "விருப்பக்குறி இட",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "அடுத்த",
"lightbox.previous": "சென்ற",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "பட்டியலில் சேர்",
"lists.account.remove": "பட்டியலில் இருந்து அகற்று",
"lists.delete": "பட்டியலை நீக்கு",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "அடையாளக்குறிகள்",
"navigation_bar.community_timeline": "உள்ளூர் காலக்கெடு",
"navigation_bar.compose": "புதியவற்றை எழுதுக toot",
- "navigation_bar.direct": "நேரடி செய்திகள்",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "கண்டு பிடி",
"navigation_bar.domain_blocks": "மறைந்த களங்கள்",
"navigation_bar.edit_profile": "சுயவிவரத்தைத் திருத்தவும்",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "வாக்கெடுப்பை அகற்று",
"privacy.change": "நிலை தனியுரிமை",
"privacy.direct.long": "குறிப்பிடப்பட்ட பயனர்களுக்கு மட்டுமே இடுகையிடவும்",
- "privacy.direct.short": "நடத்து",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "பின்தொடர்பவர்களுக்கு மட்டுமே இடுகை",
- "privacy.private.short": "பின்பற்றுபவர்கள் மட்டும்",
- "privacy.public.long": "பொது நேரங்களுக்கான இடுகை",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "பொது",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "பட்டியலிடப்படாத",
"refresh": "புதுப்பி",
"regeneration_indicator.label": "சுமையேற்றம்…",
@@ -515,6 +520,7 @@
"upload_error.poll": "கோப்பு பதிவேற்றம் அனுமதிக்கப்படவில்லை.",
"upload_form.audio_description": "செவித்திறன் குறைபாடு உள்ளவர்களுக்காக விளக்குக",
"upload_form.description": "பார்வையற்ற விவரிக்கவும்",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "தொகு",
"upload_form.thumbnail": "சிறுபடத்தை மாற்ற",
"upload_form.undo": "நீக்கு",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 2f8936a9c..89683cb63 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 05af59c6a..c84ecd00d 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -70,7 +70,7 @@
"column.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు",
"column.bookmarks": "Bookmarks",
"column.community": "స్థానిక కాలక్రమం",
- "column.direct": "ప్రత్యక్ష సందేశాలు",
+ "column.direct": "Direct messages",
"column.directory": "Browse profiles",
"column.domain_blocks": "దాచిన డొమైన్లు",
"column.favourites": "ఇష్టపడినవి",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "మీడియా మాత్రమే",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "ఈ టూట్ పేర్కొన్న వినియోగదారులకు మాత్రమే పంపబడుతుంది.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "మరింత తెలుసుకోండి",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "ఈ టూట్ అన్లిస్టెడ్ కాబట్టి ఏ హాష్ ట్యాగ్ క్రిందకూ రాదు. పబ్లిక్ టూట్ లను మాత్రమే హాష్ ట్యాగ్ ద్వారా శోధించవచ్చు.",
"compose_form.lock_disclaimer": "మీ ఖాతా {locked} చేయబడలేదు. ఎవరైనా మిమ్మల్ని అనుసరించి మీ అనుచరులకు-మాత్రమే పోస్ట్లను వీక్షించవచ్చు.",
"compose_form.lock_disclaimer.lock": "బిగించబడినది",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "ఈ ఎంపికను తొలగించు",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "టూట్",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.",
"embed.preview": "అది ఈ క్రింది విధంగా కనిపిస్తుంది:",
"emoji_button.activity": "కార్యకలాపాలు",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "అనుకూలీకరించిన",
"emoji_button.flags": "ఫ్లాగ్స్",
"emoji_button.food": "ఆహారం & పానీయం",
@@ -166,7 +169,7 @@
"empty_column.blocks": "మీరు ఇంకా ఏ వినియోగదారులనూ బ్లాక్ చేయలేదు.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "స్థానిక కాలక్రమం ఖాళీగా ఉంది. మొదలుపెట్టడానికి బహిరంగంగా ఏదో ఒకటి వ్రాయండి!",
- "empty_column.direct": "మీకు ఇంకా ఏ ప్రత్యక్ష సందేశాలు లేవు. మీరు ఒకదాన్ని పంపినప్పుడు లేదా స్వీకరించినప్పుడు, అది ఇక్కడ చూపబడుతుంది.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "దాచబడిన డొమైన్లు ఇంకా ఏమీ లేవు.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "మీకు ఇష్టపడిన టూట్లు ఇంకా ఎమీ లేవు. మీరు ఒకదానిని ఇష్టపడినప్పుడు, అది ఇక్కడ కనిపిస్తుంది.",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "నిలువు వరుసలలో ఒకదానిపై దృష్టి పెట్టడానికి",
"keyboard_shortcuts.compose": "కంపోజ్ టెక్స్ట్ఏరియా పై దృష్టి పెట్టడానికి",
"keyboard_shortcuts.description": "Description",
- "keyboard_shortcuts.direct": "నేరుగా పంపిన సందేశాల నిలువు వరుసను తెరువడానికి",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "జాబితాలో క్రిందికి వెళ్ళడానికి",
"keyboard_shortcuts.enter": "to open status",
"keyboard_shortcuts.favourite": "ఇష్టపడడానికి",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "తరువాత",
"lightbox.previous": "మునుపటి",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "జాబితాకు జోడించు",
"lists.account.remove": "జాబితా నుండి తొలగించు",
"lists.delete": "జాబితాను తొలగించు",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "స్థానిక కాలక్రమం",
"navigation_bar.compose": "కొత్త టూట్ను రాయండి",
- "navigation_bar.direct": "ప్రత్యక్ష సందేశాలు",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "కనుగొను",
"navigation_bar.domain_blocks": "దాచిన డొమైన్లు",
"navigation_bar.edit_profile": "ప్రొఫైల్ని సవరించండి",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "ఎన్నికను తొలగించు",
"privacy.change": "స్టేటస్ గోప్యతను సర్దుబాటు చేయండి",
"privacy.direct.long": "పేర్కొన్న వినియోగదారులకు మాత్రమే పోస్ట్ చేయి",
- "privacy.direct.short": "ప్రత్యక్ష",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "అనుచరులకు మాత్రమే పోస్ట్ చేయి",
- "privacy.private.short": "అనుచరులకు మాత్రమే",
- "privacy.public.long": "ప్రజా కాలక్రమాలకు పోస్ట్ చేయండి",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "ప్రజా",
- "privacy.unlisted.long": "ప్రజా కాలక్రమాలలో చూపించవద్దు",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "జాబితా చేయబడనిది",
"refresh": "Refresh",
"regeneration_indicator.label": "లోడ్ అవుతోంది…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "తొలగించు",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index f7eddd11b..b4e85be06 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "ในเซิร์ฟเวอร์เท่านั้น",
"community.column_settings.media_only": "สื่อเท่านั้น",
"community.column_settings.remote_only": "ระยะไกลเท่านั้น",
- "compose_form.direct_message_warning": "จะส่งโพสต์นี้ไปยังผู้ใช้ที่กล่าวถึงเท่านั้น",
+ "compose.language.change": "เปลี่ยนภาษา",
+ "compose.language.search": "ค้นหาภาษา...",
"compose_form.direct_message_warning_learn_more": "เรียนรู้เพิ่มเติม",
+ "compose_form.encryption_warning": "โพสต์ใน Mastodon ไม่ได้เข้ารหัสแบบต้นทางถึงปลายทาง อย่าแบ่งปันข้อมูลที่ละเอียดอ่อนใด ๆ ผ่าน Mastodon",
"compose_form.hashtag_warning": "จะไม่แสดงรายการโพสต์นี้ภายใต้แฮชแท็กใด ๆ เนื่องจากไม่อยู่ในรายการ เฉพาะโพสต์สาธารณะเท่านั้นที่สามารถค้นหาได้โดยแฮชแท็ก",
"compose_form.lock_disclaimer": "บัญชีของคุณไม่ได้ {locked} ใครก็ตามสามารถติดตามคุณเพื่อดูโพสต์สำหรับผู้ติดตามเท่านั้นของคุณ",
"compose_form.lock_disclaimer.lock": "ล็อคอยู่",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "เอาตัวเลือกนี้ออก",
"compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายตัวเลือก",
"compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว",
- "compose_form.publish": "โพสต์",
+ "compose_form.publish": "เผยแพร่",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "บันทึกการเปลี่ยนแปลง",
"compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
@@ -128,7 +130,7 @@
"confirmations.logout.confirm": "ออกจากระบบ",
"confirmations.logout.message": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?",
"confirmations.mute.confirm": "ซ่อน",
- "confirmations.mute.explanation": "นี่จะซ่อนโพสต์จากเขาและโพสต์ที่กล่าวถึงเขา แต่จะยังอนุญาตให้เขาเห็นโพสต์ของคุณและติดตามคุณ",
+ "confirmations.mute.explanation": "นี่จะซ่อนโพสต์จากเขาและโพสต์ที่กล่าวถึงเขา แต่จะยังคงอนุญาตให้เขาเห็นโพสต์ของคุณและติดตามคุณ",
"confirmations.mute.message": "คุณแน่ใจหรือไม่ว่าต้องการซ่อน {name}?",
"confirmations.redraft.confirm": "ลบแล้วร่างใหม่",
"confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน",
@@ -147,6 +149,7 @@
"embed.instructions": "ฝังโพสต์นี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง",
"embed.preview": "นี่คือลักษณะที่จะปรากฏ:",
"emoji_button.activity": "กิจกรรม",
+ "emoji_button.clear": "ล้าง",
"emoji_button.custom": "กำหนดเอง",
"emoji_button.flags": "ธง",
"emoji_button.food": "อาหารและเครื่องดื่ม",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "โฟกัสคอลัมน์",
"keyboard_shortcuts.compose": "โฟกัสพื้นที่เขียนข้อความ",
"keyboard_shortcuts.description": "คำอธิบาย",
- "keyboard_shortcuts.direct": "เปิดคอลัมน์ข้อความโดยตรง",
+ "keyboard_shortcuts.direct": "เพื่อเปิดคอลัมน์ข้อความโดยตรง",
"keyboard_shortcuts.down": "ย้ายลงในรายการ",
"keyboard_shortcuts.enter": "เปิดโพสต์",
"keyboard_shortcuts.favourite": "ชื่นชอบโพสต์",
@@ -264,6 +267,8 @@
"lightbox.expand": "ขยายกล่องดูภาพ",
"lightbox.next": "ถัดไป",
"lightbox.previous": "ก่อนหน้า",
+ "limited_account_hint.action": "แสดงโปรไฟล์ต่อไป",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "เพิ่มไปยังรายการ",
"lists.account.remove": "เอาออกจากรายการ",
"lists.delete": "ลบรายการ",
@@ -349,9 +354,9 @@
"notifications.grant_permission": "ให้สิทธิอนุญาต",
"notifications.group": "{count} การแจ้งเตือน",
"notifications.mark_as_read": "ทำเครื่องหมายทุกการแจ้งเตือนว่าอ่านแล้ว",
- "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
- "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
- "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+ "notifications.permission_denied": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากมีการปฏิเสธคำขอสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้",
+ "notifications.permission_denied_alert": "ไม่สามารถเปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป เนื่องจากมีการปฏิเสธสิทธิอนุญาตเบราว์เซอร์ก่อนหน้านี้",
+ "notifications.permission_required": "การแจ้งเตือนบนเดสก์ท็อปไม่พร้อมใช้งานเนื่องจากไม่ได้ให้สิทธิอนุญาตที่จำเป็น",
"notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป",
"notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
"notifications_permission_banner.title": "ไม่พลาดสิ่งใด",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก",
"privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์",
"privacy.direct.long": "ปรากฏแก่ผู้ใช้ที่กล่าวถึงเท่านั้น",
- "privacy.direct.short": "โดยตรง",
+ "privacy.direct.short": "ผู้คนที่กล่าวถึงเท่านั้น",
"privacy.private.long": "ปรากฏแก่ผู้ติดตามเท่านั้น",
"privacy.private.short": "ผู้ติดตามเท่านั้น",
- "privacy.public.long": "ปรากฏแก่ทุกคน แสดงในเส้นเวลาสาธารณะ",
+ "privacy.public.long": "ปรากฏแก่ทั้งหมด",
"privacy.public.short": "สาธารณะ",
- "privacy.unlisted.long": "ปรากฏแก่ทุกคน แต่ไม่อยู่ในเส้นเวลาสาธารณะ",
+ "privacy.unlisted.long": "ปรากฏแก่ทั้งหมด แต่เลือกไม่รับคุณลักษณะการค้นพบ",
"privacy.unlisted.short": "ไม่อยู่ในรายการ",
"refresh": "รีเฟรช",
"regeneration_indicator.label": "กำลังโหลด…",
@@ -403,7 +408,7 @@
"report.forward": "ส่งต่อไปยัง {target}",
"report.forward_hint": "บัญชีมาจากเซิร์ฟเวอร์อื่น ส่งสำเนาของรายงานที่ไม่ระบุตัวตนไปที่นั่นด้วย?",
"report.mute": "ซ่อน",
- "report.mute_explanation": "คุณจะไม่เห็นโพสต์ของเขา เขายังสามารถติดตามคุณและเห็นโพสต์ของคุณและจะไม่ทราบว่ามีการซ่อนเขา",
+ "report.mute_explanation": "คุณจะไม่เห็นโพสต์ของเขา เขายังคงสามารถติดตามคุณและเห็นโพสต์ของคุณและจะไม่ทราบว่ามีการซ่อนเขา",
"report.next": "ถัดไป",
"report.placeholder": "ความคิดเห็นเพิ่มเติม",
"report.reasons.dislike": "ฉันไม่ชอบโพสต์",
@@ -513,12 +518,13 @@
"upload_button.label": "เพิ่มไฟล์ภาพ, วิดีโอ หรือเสียง",
"upload_error.limit": "เกินขีดจำกัดการอัปโหลดไฟล์",
"upload_error.poll": "ไม่อนุญาตให้อัปโหลดไฟล์กับการลงคะแนน",
- "upload_form.audio_description": "อธิบายสำหรับผู้สูญเสียการได้ยิน",
+ "upload_form.audio_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยิน",
"upload_form.description": "อธิบายสำหรับผู้บกพร่องทางการมองเห็น",
+ "upload_form.description_missing": "ไม่มีการเพิ่มคำอธิบาย",
"upload_form.edit": "แก้ไข",
"upload_form.thumbnail": "เปลี่ยนภาพขนาดย่อ",
"upload_form.undo": "ลบ",
- "upload_form.video_description": "อธิบายสำหรับผู้สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น",
+ "upload_form.video_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น",
"upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…",
"upload_modal.apply": "นำไปใช้",
"upload_modal.applying": "กำลังนำไปใช้…",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 96d6f83c3..c813ee1c2 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -9,11 +9,11 @@
"account.browse_more_on_origin_server": "Orijinal profilde daha fazlasına göz atın",
"account.cancel_follow_request": "Takip isteğini iptal et",
"account.direct": "@{name} adlı kişiye mesaj gönder",
- "account.disable_notifications": "@{name} gönderi atınca bana bildirmeyi durdur",
+ "account.disable_notifications": "@{name} kişisinin gönderi bildirimlerini kapat",
"account.domain_blocked": "Alan adı engellendi",
"account.edit_profile": "Profili düzenle",
- "account.enable_notifications": "@{name} gönderi atınca bana bildir",
- "account.endorse": "Profildeki özellik",
+ "account.enable_notifications": "@{name} kişisinin gönderi bildirimlerini aç",
+ "account.endorse": "Profilimde öne çıkar",
"account.follow": "Takip et",
"account.followers": "Takipçi",
"account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.",
@@ -25,7 +25,7 @@
"account.hide_reblogs": "@{name} kişisinin boostlarını gizle",
"account.joined": "{date} tarihinde katıldı",
"account.link_verified_on": "Bu bağlantının sahipliği {date} tarihinde kontrol edildi",
- "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceliyor.",
+ "account.locked_info": "Bu hesabın gizlilik durumu gizli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini manuel olarak onaylıyor.",
"account.media": "Medya",
"account.mention": "@{name} kişisinden bahset",
"account.moved_to": "{name} şuraya taşındı:",
@@ -42,7 +42,7 @@
"account.unblock": "@{name} adlı kişinin engelini kaldır",
"account.unblock_domain": "{domain} alan adının engelini kaldır",
"account.unblock_short": "Engeli kaldır",
- "account.unendorse": "Profilde gösterme",
+ "account.unendorse": "Profilimde öne çıkarma",
"account.unfollow": "Takibi bırak",
"account.unmute": "@{name} adlı kişinin sesini aç",
"account.unmute_notifications": "@{name} adlı kişinin bildirimlerini aç",
@@ -70,7 +70,7 @@
"column.blocks": "Engellenen kullanıcılar",
"column.bookmarks": "Yer İmleri",
"column.community": "Yerel zaman tüneli",
- "column.direct": "Direkt Mesajlar",
+ "column.direct": "Doğrudan iletiler",
"column.directory": "Profillere göz at",
"column.domain_blocks": "Engellenen alan adları",
"column.favourites": "Favoriler",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Sadece yerel",
"community.column_settings.media_only": "Sadece medya",
"community.column_settings.remote_only": "Sadece uzak",
- "compose_form.direct_message_warning": "Bu gönderi sadece belirtilen kullanıcılara gönderilecektir.",
+ "compose.language.change": "Dili değiştir",
+ "compose.language.search": "Dilleri ara...",
"compose_form.direct_message_warning_learn_more": "Daha fazla bilgi edinin",
+ "compose_form.encryption_warning": "Mastodondaki gönderiler uçtan uca şifrelemeli değildir. Mastodon üzerinden hassas olabilecek bir bilginizi paylaşmayın.",
"compose_form.hashtag_warning": "Bu gönderi liste dışı olduğu için hiç bir etikette yer almayacak. Sadece herkese açık gönderiler etiketlerde bulunabilir.",
"compose_form.lock_disclaimer": "Hesabın {locked} değil. Yalnızca takipçilere özel gönderilerini görüntülemek için herkes seni takip edebilir.",
"compose_form.lock_disclaimer.lock": "kilitli",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Bu seçeneği kaldır",
"compose_form.poll.switch_to_multiple": "Birden çok seçeneğe izin vermek için anketi değiştir",
"compose_form.poll.switch_to_single": "Tek bir seçeneğe izin vermek için anketi değiştir",
- "compose_form.publish": "Tootla",
+ "compose_form.publish": "Yayınla",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Değişiklikleri kaydet",
"compose_form.sensitive.hide": "{count, plural, one {Medyayı hassas olarak işaretle} other {Medyayı hassas olarak işaretle}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.",
"embed.preview": "İşte nasıl görüneceği:",
"emoji_button.activity": "Aktivite",
+ "emoji_button.clear": "Temizle",
"emoji_button.custom": "Özel",
"emoji_button.flags": "Bayraklar",
"emoji_button.food": "Yiyecek ve İçecek",
@@ -166,17 +169,17 @@
"empty_column.blocks": "Henüz herhangi bir kullanıcıyı engellemedin.",
"empty_column.bookmarked_statuses": "Henüz yer imine eklediğin toot yok. Bir tanesi yer imine eklendiğinde burada görünür.",
"empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!",
- "empty_column.direct": "Henüz direkt mesajın yok. Bir tane gönderdiğinde veya aldığında burada görünür.",
- "empty_column.domain_blocks": "Henüz hiçbir gizli alan adı yok.",
+ "empty_column.direct": "Henüz doğrudan iletiniz yok. Bir tane gönderdiğinizde veya aldığınız burada listelenecekler.",
+ "empty_column.domain_blocks": "Henüz engellenmiş bir alan adı yok.",
"empty_column.explore_statuses": "Şu an öne çıkan birşey yok. Daha sonra tekrar bakın!",
"empty_column.favourited_statuses": "Favori tootun yok. Favori tootun olduğunda burada görünür.",
"empty_column.favourites": "Kimse bu gönderiyi favorilerine eklememiş. Biri eklediğinde burada görünecek.",
"empty_column.follow_recommendations": "Öyle görünüyor ki sizin için hiçbir öneri oluşturulamıyor. Tanıdığınız kişileri aramak için aramayı kullanabilir veya öne çıkanlara bakabilirsiniz.",
"empty_column.follow_requests": "Hiç takip isteğiniz yok. Bir tane aldığınızda burada görünecek.",
- "empty_column.hashtag": "Henüz bu hashtag’e sahip hiçbir gönderi yok.",
+ "empty_column.hashtag": "Henüz bu etikete sahip hiçbir gönderi yok.",
"empty_column.home": "Ana zaman tünelin boş! Akışını doldurmak için daha fazla kişiyi takip et. {suggestions}",
"empty_column.home.suggestions": "Bazı önerileri görün",
- "empty_column.list": "Bu listede henüz hiçbir şey yok.",
+ "empty_column.list": "Henüz bu listede bir şey yok. Bu listenin üyeleri bir şey paylaşığında burada gözükecek.",
"empty_column.lists": "Henüz listen yok. Liste oluşturduğunda burada görünür.",
"empty_column.mutes": "Henüz bir kullanıcıyı sessize almadınız.",
"empty_column.notifications": "Henüz bildiriminiz yok. Sohbete başlamak için başkalarıyla etkileşim kurun.",
@@ -227,21 +230,21 @@
"intervals.full.minutes": "{number, plural, one {# dakika} other {# dakika}}",
"keyboard_shortcuts.back": "geriye gitmek için",
"keyboard_shortcuts.blocked": "engellenen kullanıcılar listesini açmak için",
- "keyboard_shortcuts.boost": "Gönderiyi teşvik et",
+ "keyboard_shortcuts.boost": "gönderiyi boostla",
"keyboard_shortcuts.column": "sütunlardan birindeki duruma odaklanmak için",
"keyboard_shortcuts.compose": "yazma alanına odaklanmak için",
"keyboard_shortcuts.description": "Açıklama",
- "keyboard_shortcuts.direct": "direkt mesajlar sütununu açmak için",
+ "keyboard_shortcuts.direct": "doğrudan iletiler sütununu açmak için",
"keyboard_shortcuts.down": "listede aşağıya inmek için",
- "keyboard_shortcuts.enter": "Gönderiyi aç",
- "keyboard_shortcuts.favourite": "Gönderiyi beğen",
+ "keyboard_shortcuts.enter": "gönderiyi aç",
+ "keyboard_shortcuts.favourite": "gönderiyi favorilerine ekle",
"keyboard_shortcuts.favourites": "favoriler listesini açmak için",
- "keyboard_shortcuts.federated": "federe edilmiş zaman tünelini açmak için",
+ "keyboard_shortcuts.federated": "federe akışı aç",
"keyboard_shortcuts.heading": "Klavye kısayolları",
- "keyboard_shortcuts.home": "anasayfa zaman çizelgesini açmak için",
+ "keyboard_shortcuts.home": "ana akışı aç",
"keyboard_shortcuts.hotkey": "Kısayol tuşu",
"keyboard_shortcuts.legend": "bu efsaneyi görüntülemek için",
- "keyboard_shortcuts.local": "yerel zaman tünelini açmak için",
+ "keyboard_shortcuts.local": "yerel akışı aç",
"keyboard_shortcuts.mention": "yazardan bahsetmek için",
"keyboard_shortcuts.muted": "sessize alınmış kullanıcı listesini açmak için",
"keyboard_shortcuts.my_profile": "profilinizi açmak için",
@@ -249,7 +252,7 @@
"keyboard_shortcuts.open_media": "medyayı açmak için",
"keyboard_shortcuts.pinned": "Sabitlenmiş gönderilerin listesini aç",
"keyboard_shortcuts.profile": "yazarın profilini açmak için",
- "keyboard_shortcuts.reply": "Gönderiyi yanıtla",
+ "keyboard_shortcuts.reply": "gönderiyi yanıtla",
"keyboard_shortcuts.requests": "takip istekleri listesini açmak için",
"keyboard_shortcuts.search": "aramaya odaklanmak için",
"keyboard_shortcuts.spoilers": "CW alanını göstermek/gizlemek için",
@@ -264,6 +267,8 @@
"lightbox.expand": "Resim görüntüleme kutusunu genişlet",
"lightbox.next": "Sonraki",
"lightbox.previous": "Önceki",
+ "limited_account_hint.action": "Yine de profili göster",
+ "limited_account_hint.title": "Bu profil sunucunuzun moderatörleri tarafından gizlendi.",
"lists.account.add": "Listeye ekle",
"lists.account.remove": "Listeden kaldır",
"lists.delete": "Listeyi sil",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Yer İmleri",
"navigation_bar.community_timeline": "Yerel Zaman Tüneli",
"navigation_bar.compose": "Yeni gönderi yaz",
- "navigation_bar.direct": "Direkt Mesajlar",
+ "navigation_bar.direct": "Doğrudan iletiler",
"navigation_bar.discover": "Keşfet",
"navigation_bar.domain_blocks": "Engellenen alan adları",
"navigation_bar.edit_profile": "Profili düzenle",
@@ -310,20 +315,20 @@
"navigation_bar.public_timeline": "Federe zaman tüneli",
"navigation_bar.security": "Güvenlik",
"notification.admin.sign_up": "{name} kaydoldu",
- "notification.favourite": "{name} gönderini beğendi",
+ "notification.favourite": "{name} gönderini favorilerine ekledi",
"notification.follow": "{name} seni takip etti",
"notification.follow_request": "{name} size takip isteği gönderdi",
"notification.mention": "{name} senden bahsetti",
"notification.own_poll": "Anketiniz sona erdi",
"notification.poll": "Oy verdiğiniz bir anket sona erdi",
- "notification.reblog": "{name} gönderini teşvik etti",
+ "notification.reblog": "{name} gönderini boostladı",
"notification.status": "{name} az önce gönderdi",
"notification.update": "{name} bir gönderiyi düzenledi",
"notifications.clear": "Bildirimleri temizle",
"notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?",
"notifications.column_settings.admin.sign_up": "Yeni kayıtlar:",
"notifications.column_settings.alert": "Masaüstü bildirimleri",
- "notifications.column_settings.favourite": "Beğeniler:",
+ "notifications.column_settings.favourite": "Favoriler:",
"notifications.column_settings.filter_bar.advanced": "Tüm kategorileri görüntüle",
"notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu",
"notifications.column_settings.filter_bar.show_bar": "Süzme çubuğunu göster",
@@ -341,7 +346,7 @@
"notifications.column_settings.update": "Düzenlemeler:",
"notifications.filter.all": "Tümü",
"notifications.filter.boosts": "Boostlar",
- "notifications.filter.favourites": "Beğeniler",
+ "notifications.filter.favourites": "Favoriler",
"notifications.filter.follows": "Takip edilenler",
"notifications.filter.mentions": "Bahsetmeler",
"notifications.filter.polls": "Anket sonuçları",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "Anketi kaldır",
"privacy.change": "Gönderi gizliliğini değiştir",
"privacy.direct.long": "Sadece bahsedilen kullanıcılar için görünür",
- "privacy.direct.short": "Direkt",
+ "privacy.direct.short": "Sadece bahsedilen kişiler",
"privacy.private.long": "Sadece takipçiler için görünür",
"privacy.private.short": "Sadece takipçiler",
- "privacy.public.long": "Herkese görünür, herkese açık zaman çizelgelerinde gösterilir",
+ "privacy.public.long": "Herkese açık",
"privacy.public.short": "Herkese açık",
- "privacy.unlisted.long": "Herkese görünür, ancak genel zaman çizelgelerinde gösterilmez",
+ "privacy.unlisted.long": "Keşfet harici herkese açık",
"privacy.unlisted.short": "Listelenmemiş",
"refresh": "Yenile",
"regeneration_indicator.label": "Yükleniyor…",
@@ -383,7 +388,7 @@
"relative_time.full.just_now": "şimdi",
"relative_time.full.minutes": "{number, plural, one {# dakika} other {# dakika}} önce",
"relative_time.full.seconds": "{number, plural, one {# saniye} other {# saniye}} önce",
- "relative_time.hours": "{number}sa",
+ "relative_time.hours": "{number}s",
"relative_time.just_now": "şimdi",
"relative_time.minutes": "{number}dk",
"relative_time.seconds": "{number}sn",
@@ -454,7 +459,7 @@
"status.edited": "{date} tarihinde düzenlenmiş",
"status.edited_x_times": "{count, plural, one {{count} kez} other {{count} kez}} düzenlendi",
"status.embed": "Gömülü",
- "status.favourite": "Beğen",
+ "status.favourite": "Favorilerine ekle",
"status.filtered": "Filtrelenmiş",
"status.history.created": "{name} oluşturdu {date}",
"status.history.edited": "{name} düzenledi {date}",
@@ -507,14 +512,15 @@
"trends.trending_now": "Şu an gündemde",
"ui.beforeunload": "Mastodon'u terk ederseniz taslağınız kaybolacak.",
"units.short.billion": "{count}Mr",
- "units.short.million": "{count}Mn",
- "units.short.thousand": "{count}Mn",
+ "units.short.million": "{count}M",
+ "units.short.thousand": "{count}Bin",
"upload_area.title": "Karşıya yükleme için sürükle bırak yapınız",
"upload_button.label": "Resim, video veya ses dosyası ekleyin",
"upload_error.limit": "Dosya yükleme sınırı aşıldı.",
"upload_error.poll": "Anketlerde dosya yüklemesine izin verilmez.",
"upload_form.audio_description": "İşitme kaybı olan kişiler için tarif edin",
"upload_form.description": "Görme engelliler için açıklama",
+ "upload_form.description_missing": "Açıklama eklenmedi",
"upload_form.edit": "Düzenle",
"upload_form.thumbnail": "Küçük resmi değiştir",
"upload_form.undo": "Sil",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index 06936f110..862325f1c 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -4,31 +4,31 @@
"account.badges.bot": "Бот",
"account.badges.group": "Төркем",
"account.block": "@{name} блоклау",
- "account.block_domain": "Block domain {domain}",
+ "account.block_domain": "{domain} доменын блоклау",
"account.blocked": "Блокланган",
"account.browse_more_on_origin_server": "Тулырак оригинал профилендә карап була",
- "account.cancel_follow_request": "Cancel follow request",
- "account.direct": "Direct message @{name}",
- "account.disable_notifications": "Stop notifying me when @{name} posts",
- "account.domain_blocked": "Domain blocked",
+ "account.cancel_follow_request": "Язылуга сорауны бетерү",
+ "account.direct": "@{name} өчен яңа хат",
+ "account.disable_notifications": "@{name} язулары өчен белдерүләр сүндерү",
+ "account.domain_blocked": "Домен блокланган",
"account.edit_profile": "Профильны үзгәртү",
- "account.enable_notifications": "Notify me when @{name} posts",
- "account.endorse": "Feature on profile",
+ "account.enable_notifications": "@{name} язулары өчен белдерүләр яндыру",
+ "account.endorse": "Профильдә рекомендацияләү",
"account.follow": "Языл",
- "account.followers": "Followers",
- "account.followers.empty": "No one follows this user yet.",
- "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
- "account.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
- "account.follows.empty": "This user doesn't follow anyone yet.",
+ "account.followers": "Язылучылар",
+ "account.followers.empty": "Әле беркем дә язылмаган.",
+ "account.followers_counter": "{count, plural,one {{counter} Язылучы} other {{counter} Язылучы}}",
+ "account.following": "Язылган",
+ "account.following_counter": "{count, plural, one {{counter} Язылган} other {{counter} Язылган}}",
+ "account.follows.empty": "Беркемгә дә язылмаган әле.",
"account.follows_you": "Сезгә язылган",
"account.hide_reblogs": "Hide boosts from @{name}",
- "account.joined": "Joined {date}",
+ "account.joined": "{date} көнендә теркәлде",
"account.link_verified_on": "Ownership of this link was checked on {date}",
- "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+ "account.locked_info": "Бу - ябык аккаунт. Аны язылучылар гына күрә ала.",
"account.media": "Медиа",
- "account.mention": "Mention @{name}",
- "account.moved_to": "{name} has moved to:",
+ "account.mention": "@{name} искәртү",
+ "account.moved_to": "{name} монда күчте:",
"account.mute": "Mute @{name}",
"account.mute_notifications": "Mute notifications from @{name}",
"account.muted": "Muted",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Активлык",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Куелган",
"emoji_button.flags": "Байраклар",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Киләсе",
"lightbox.previous": "Алдагы",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Исемлектән бетерергә",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Яңарту",
"regeneration_indicator.label": "Йөкләү...",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Үзгәртү",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Бетерү",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index 088b5ff36..658a3318e 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Local only",
"community.column_settings.media_only": "Media only",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "Learn more",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "Flags",
"emoji_button.food": "Food & Drink",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 876f8aa8a..32d5dce84 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -6,32 +6,32 @@
"account.block": "Заблокувати @{name}",
"account.block_domain": "Заблокувати домен {domain}",
"account.blocked": "Заблоковані",
- "account.browse_more_on_origin_server": "Переглянути більше в оригіналі",
+ "account.browse_more_on_origin_server": "Переглянути більше в оригінальному профілі",
"account.cancel_follow_request": "Скасувати запит на підписку",
- "account.direct": "Пряме повідомлення @{name}",
+ "account.direct": "Надіслати пряме повідомлення @{name}",
"account.disable_notifications": "Не повідомляти мене про дописи @{name}",
- "account.domain_blocked": "Домен приховано",
+ "account.domain_blocked": "Домен заблоковано",
"account.edit_profile": "Редагувати профіль",
"account.enable_notifications": "Повідомляти мене про дописи @{name}",
- "account.endorse": "Публікувати у профілі",
+ "account.endorse": "Рекомендувати у профілі",
"account.follow": "Підписатися",
"account.followers": "Підписники",
- "account.followers.empty": "Ніхто ще не підписався на цього користувача.",
- "account.followers_counter": "{count, plural, one {{counter} Підписник} few {{counter} Підписники} many {{counter} Підписників} other {{counter} Підписники}}",
- "account.following": "Following",
- "account.following_counter": "{count, plural, one {{counter} Підписка} few {{counter} Підписки} many {{counter} Підписок} other {{counter} Підписки}}",
+ "account.followers.empty": "Ніхто ще не підписаний на цього користувача.",
+ "account.followers_counter": "{count, plural, one {{counter} підписник} few {{counter} підписника} many {{counter} підписників} other {{counter} підписники}}",
+ "account.following": "Ви стежите",
+ "account.following_counter": "{count, plural, one {{counter} підписка} few {{counter} підписки} many {{counter} підписок} other {{counter} підписки}}",
"account.follows.empty": "Цей користувач ще ні на кого не підписався.",
- "account.follows_you": "Підписаний(-а) на вас",
- "account.hide_reblogs": "Сховати передмухи від @{name}",
- "account.joined": "Долучення {date}",
+ "account.follows_you": "Підписані на вас",
+ "account.hide_reblogs": "Сховати поширення від @{name}",
+ "account.joined": "Долучилися {date}",
"account.link_verified_on": "Права власності на це посилання були перевірені {date}",
- "account.locked_info": "Статус конфіденційності цього облікового запису встановлено у заблокований. Власник вручну переглядає, хто може за ним стежити.",
+ "account.locked_info": "Це закритий обліковий запис. Власник вручну обирає, хто може на нього підписуватися.",
"account.media": "Медіа",
"account.mention": "Згадати @{name}",
"account.moved_to": "{name} переїхав на:",
- "account.mute": "Заглушити @{name}",
+ "account.mute": "Приховати @{name}",
"account.mute_notifications": "Не показувати сповіщення від @{name}",
- "account.muted": "Заглушений",
+ "account.muted": "Нехтується",
"account.posts": "Дмухи",
"account.posts_with_replies": "Дмухи й відповіді",
"account.report": "Поскаржитися на @{name}",
@@ -44,42 +44,42 @@
"account.unblock_short": "Розблокувати",
"account.unendorse": "Не публікувати у профілі",
"account.unfollow": "Відписатися",
- "account.unmute": "Зняти глушення з @{name}",
+ "account.unmute": "Не нехтувати @{name}",
"account.unmute_notifications": "Показувати сповіщення від @{name}",
- "account.unmute_short": "Unmute",
+ "account.unmute_short": "Не нехтувати",
"account_note.placeholder": "Коментарі відсутні",
- "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
- "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+ "admin.dashboard.daily_retention": "Щоденний показник утримання користувачів після реєстрації",
+ "admin.dashboard.monthly_retention": "Щомісячний показник утримання користувачів після реєстрації",
"admin.dashboard.retention.average": "Середнє",
"admin.dashboard.retention.cohort": "Місяць реєстрації",
"admin.dashboard.retention.cohort_size": "Нові користувачі",
"alert.rate_limited.message": "Спробуйте ще раз через {retry_time, time, medium}.",
"alert.rate_limited.title": "Швидкість обмежена",
- "alert.unexpected.message": "Трапилась неочікувана помилка.",
+ "alert.unexpected.message": "Сталася неочікувана помилка.",
"alert.unexpected.title": "Ой!",
"announcement.announcement": "Оголошення",
"attachments_list.unprocessed": "(не оброблено)",
"autosuggest_hashtag.per_week": "{count} в тиждень",
"boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
- "bundle_column_error.body": "Щось пішло не так під час завантаження компоненту.",
+ "bundle_column_error.body": "Щось пішло не так під час завантаження цього компоненту.",
"bundle_column_error.retry": "Спробуйте ще раз",
"bundle_column_error.title": "Помилка мережі",
"bundle_modal_error.close": "Закрити",
- "bundle_modal_error.message": "Щось пішло не так під час завантаження компоненту.",
+ "bundle_modal_error.message": "Щось пішло не так під час завантаження цього компоненту.",
"bundle_modal_error.retry": "Спробувати ще раз",
"column.blocks": "Заблоковані користувачі",
"column.bookmarks": "Закладки",
"column.community": "Локальна стрічка",
"column.direct": "Прямі повідомлення",
"column.directory": "Переглянути профілі",
- "column.domain_blocks": "Приховані домени",
+ "column.domain_blocks": "Заблоковані домени",
"column.favourites": "Вподобане",
"column.follow_requests": "Запити на підписку",
"column.home": "Головна",
"column.lists": "Списки",
- "column.mutes": "Заглушені користувачі",
+ "column.mutes": "Нехтувані користувачі",
"column.notifications": "Сповіщення",
- "column.pins": "Закріплені дмухи",
+ "column.pins": "Закріплені дописи",
"column.public": "Глобальна стрічка",
"column_back_button.label": "Назад",
"column_header.hide_settings": "Приховати налаштування",
@@ -89,22 +89,24 @@
"column_header.show_settings": "Показати налаштування",
"column_header.unpin": "Відкріпити",
"column_subheading.settings": "Налаштування",
- "community.column_settings.local_only": "Тільки локальні",
- "community.column_settings.media_only": "Тільки медіа",
- "community.column_settings.remote_only": "Тільки видалені",
- "compose_form.direct_message_warning": "Цей дмух буде видимий тільки згаданим користувачам.",
+ "community.column_settings.local_only": "Лише локальні",
+ "community.column_settings.media_only": "Лише з медіа",
+ "community.column_settings.remote_only": "Лише віддалені",
+ "compose.language.change": "Змінити мову",
+ "compose.language.search": "Шукати мови...",
"compose_form.direct_message_warning_learn_more": "Дізнатися більше",
- "compose_form.hashtag_warning": "Цей дмух не буде відображений у жодній стрічці хештеґу, оскільки він прихований. Тільки публічні дмухи можуть бути знайдені за хештеґом.",
- "compose_form.lock_disclaimer": "Ваш акаунт не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші приватні пости.",
+ "compose_form.encryption_warning": "Дописи на Mastodon не захищені шифруванням. Не поширюйте жодну делікатну інформацію.",
+ "compose_form.hashtag_warning": "Цей допис не буде зображений у жодній стрічці гештеґу, оскільки він прихований. Тільки публічні дописи можуть бути знайдені за гештеґом.",
+ "compose_form.lock_disclaimer": "Ваш обліковий запис не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші дописи для підписників.",
"compose_form.lock_disclaimer.lock": "приватний",
"compose_form.placeholder": "Що у вас на думці?",
"compose_form.poll.add_option": "Додати варіант",
"compose_form.poll.duration": "Тривалість опитування",
"compose_form.poll.option_placeholder": "Варіант {number}",
"compose_form.poll.remove_option": "Видалити цей варіант",
- "compose_form.poll.switch_to_multiple": "Перемкнути у режим вибору декількох відповідей",
+ "compose_form.poll.switch_to_multiple": "Дозволити вибір декількох відповідей",
"compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
- "compose_form.publish": "Дмухнути",
+ "compose_form.publish": "Опублікувати",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Зберегти зміни",
"compose_form.sensitive.hide": "{count, plural, one {Позначити медіа делікатним} other {Позначити медіа делікатними}}",
@@ -123,67 +125,68 @@
"confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?",
"confirmations.discard_edit_media.confirm": "Відкинути",
"confirmations.discard_edit_media.message": "У вас є незбережені зміни в описі медіа або попереднього перегляду, все одно відкинути їх?",
- "confirmations.domain_block.confirm": "Сховати весь домен",
- "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати/заглушити лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.",
+ "confirmations.domain_block.confirm": "Заблокувати весь домен",
+ "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати або приховати лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.",
"confirmations.logout.confirm": "Вийти",
"confirmations.logout.message": "Ви впевнені, що хочете вийти?",
- "confirmations.mute.confirm": "Заглушити",
- "confirmations.mute.explanation": "Це приховає пости від них і пости зі згадками про них, проте вони все одно матимуть змогу бачити ваші пости і підписуватися на вас.",
- "confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?",
- "confirmations.redraft.confirm": "Видалити та перестворити",
- "confirmations.redraft.message": "Ви впевнені, що хочете видалити допис і перестворити його? Ви втратите всі відповіді, передмухи та вподобайки допису.",
+ "confirmations.mute.confirm": "Нехтуавти",
+ "confirmations.mute.explanation": "Це сховає дописи від них і дописи зі згадками про них, проте вони все одно матимуть змогу бачити ваші дописи й підписуватися на вас.",
+ "confirmations.mute.message": "Ви впевнені, що хочете приховати {name}?",
+ "confirmations.redraft.confirm": "Видалити та виправити",
+ "confirmations.redraft.message": "Ви впевнені, що хочете відредагувати допис? Ви втратите всі відповіді, поширення та вподобайки допису.",
"confirmations.reply.confirm": "Відповісти",
- "confirmations.reply.message": "Поточна відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?",
+ "confirmations.reply.message": "Нова відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?",
"confirmations.unfollow.confirm": "Відписатися",
"confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?",
- "conversation.delete": "Видалити цю бесіду",
+ "conversation.delete": "Видалити бесіду",
"conversation.mark_as_read": "Позначити як прочитане",
"conversation.open": "Переглянути бесіду",
"conversation.with": "З {names}",
"directory.federated": "З відомого федесвіту",
- "directory.local": "Тільки з домену {domain}",
+ "directory.local": "Лише з домену {domain}",
"directory.new_arrivals": "Нові надходження",
- "directory.recently_active": "Активні нещодавно",
- "embed.instructions": "Вбудуйте цей статус до вашого вебсайту, скопіювавши код нижче.",
+ "directory.recently_active": "Нещодавно активні",
+ "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.",
"embed.preview": "Ось як він виглядатиме:",
- "emoji_button.activity": "Заняття",
- "emoji_button.custom": "Особливі",
+ "emoji_button.activity": "Діяльність",
+ "emoji_button.clear": "Очистити",
+ "emoji_button.custom": "Власні",
"emoji_button.flags": "Прапори",
"emoji_button.food": "Їжа та напої",
- "emoji_button.label": "Вставити емодзі",
+ "emoji_button.label": "Вставити емоджі",
"emoji_button.nature": "Природа",
- "emoji_button.not_found": "Немає емодзі!! (╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "Немає емоджі!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "Предмети",
"emoji_button.people": "Люди",
"emoji_button.recent": "Часто використовувані",
"emoji_button.search": "Шукати...",
"emoji_button.search_results": "Результати пошуку",
"emoji_button.symbols": "Символи",
- "emoji_button.travel": "Подорожі",
+ "emoji_button.travel": "Подорожі та місця",
"empty_column.account_suspended": "Обліковий запис заблоковано",
- "empty_column.account_timeline": "Тут дмухалок немає!",
+ "empty_column.account_timeline": "Тут немає дописів!",
"empty_column.account_unavailable": "Профіль недоступний",
"empty_column.blocks": "Ви ще не заблокували жодного користувача.",
- "empty_column.bookmarked_statuses": "У вас ще немає дмухів у закладках. Коли ви щось додасте до заклкдок, воно з'явиться тут.",
+ "empty_column.bookmarked_statuses": "У вас ще немає дописів у закладках. Коли ви щось додасте до закладок, воно з'явиться тут.",
"empty_column.community": "Локальна стрічка пуста. Напишіть щось, щоб розігріти народ!",
- "empty_column.direct": "У вас ще немає прямих повідомлень. Коли ви відправите чи отримаєте якесь, воно з'явиться тут.",
+ "empty_column.direct": "У вас ще немає прямих повідомлень. Коли ви щось отримаєте чи надішлете, воно з'явиться тут.",
"empty_column.domain_blocks": "Тут поки немає прихованих доменів.",
- "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
- "empty_column.favourited_statuses": "У вас ще немає вподобаних дмухів. Коли ви щось вподобаєте, воно з'явиться тут.",
- "empty_column.favourites": "Ніхто ще не вподобав цього дмуху. Коли хтось це зробить, вони з'являться тут.",
- "empty_column.follow_recommendations": "Схоже, для вас не буде створено жодної пропозиції. Ви можете спробувати скористатися пошуком людей, яких ви можете знати або переглянути популярні хештеґи.",
+ "empty_column.explore_statuses": "Нема нічого популярного. Подивіться пізніше!",
+ "empty_column.favourited_statuses": "У вас ще немає вподобаних дописів. Коли ви щось вподобаєте, воно з'явиться тут.",
+ "empty_column.favourites": "Ніхто ще не вподобав цей допис. Коли хтось це зробить, він з'явиться тут.",
+ "empty_column.follow_recommendations": "Схоже, для вас не було створено жодної пропозиції. Ви можете спробувати скористатися пошуком людей, яких ви можете знати, або переглянути популярні гештеґи.",
"empty_column.follow_requests": "У вас ще немає запитів на підписку. Коли ви їх отримаєте, вони з'являться тут.",
- "empty_column.hashtag": "Дописів з цим хештегом поки не існує.",
- "empty_column.home": "Ви поки ні на кого не підписані. Погортайте {public}, або скористуйтесь пошуком, щоб освоїтися та познайомитися з іншими користувачами.",
+ "empty_column.hashtag": "Дописів з цим гештеґом поки не існує.",
+ "empty_column.home": "Ваша стрічка порожня! Підпишіться на інших, щоб її заповнити. {suggestions}",
"empty_column.home.suggestions": "Переглянути пропозиції",
- "empty_column.list": "Немає нічого в цьому списку. Коли його учасники дмухнуть нові статуси, вони з'являться тут.",
+ "empty_column.list": "Цей список порожній. Коли його учасники додадуть нові дописи, вони з'являться тут.",
"empty_column.lists": "У вас ще немає списків. Коли ви їх створите, вони з'являться тут.",
- "empty_column.mutes": "Ви ще не заглушили жодного користувача.",
+ "empty_column.mutes": "Ви ще не нехтуєте жодного користувача.",
"empty_column.notifications": "У вас ще немає сповіщень. Переписуйтесь з іншими користувачами, щоб почати розмову.",
- "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших інстанцій, щоб заповнити стрічку",
- "error.unexpected_crash.explanation": "Ця сторінка не може бути коректно відображена через баґ у нашому коді або через проблему сумісності браузера.",
+ "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших серверів, щоб заповнити стрічку",
+ "error.unexpected_crash.explanation": "Через помилку у нашому коді або несумісність браузера, ця сторінка не може бути зображена коректно.",
"error.unexpected_crash.explanation_addons": "Неможливо правильно показати цю сторінку. Ймовірно, цю помилку викликано додатком браузера або автоматичним засобом перекладу.",
- "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний додаток.",
+ "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний застосунок.",
"error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.",
"errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
"errors.unexpected_crash.report_issue": "Повідомити про проблему",
@@ -203,53 +206,53 @@
"getting_started.developers": "Розробникам",
"getting_started.directory": "Каталог профілів",
"getting_started.documentation": "Документація",
- "getting_started.heading": "Ласкаво просимо",
- "getting_started.invite": "Запросіть людей",
- "getting_started.open_source_notice": "Mastodon — програма з відкритим сирцевим кодом. Ви можете допомогти проекту, або повідомити про проблеми на GitHub за адресою {github}.",
- "getting_started.security": "Безпека",
+ "getting_started.heading": "Розпочати",
+ "getting_started.invite": "Запросити людей",
+ "getting_started.open_source_notice": "Mastodon — програма з відкритим сирцевим кодом. Ви можете допомогти проєкту, або повідомити про проблеми на GitHub: {github}.",
+ "getting_started.security": "Налаштування облікового запису",
"getting_started.terms": "Умови використання",
"hashtag.column_header.tag_mode.all": "та {additional}",
"hashtag.column_header.tag_mode.any": "або {additional}",
"hashtag.column_header.tag_mode.none": "без {additional}",
- "hashtag.column_settings.select.no_options_message": "Не знайдено пропозицій",
- "hashtag.column_settings.select.placeholder": "Введіть хештеґи…",
- "hashtag.column_settings.tag_mode.all": "Усі ці",
- "hashtag.column_settings.tag_mode.any": "Який-небудь з цих",
- "hashtag.column_settings.tag_mode.none": "Жоден з цих",
- "hashtag.column_settings.tag_toggle": "Додайте додаткові теґи до цього стовпчика",
+ "hashtag.column_settings.select.no_options_message": "Пропозицій не знайдено",
+ "hashtag.column_settings.select.placeholder": "Введіть гештеґи…",
+ "hashtag.column_settings.tag_mode.all": "Усе зі списку",
+ "hashtag.column_settings.tag_mode.any": "Який-небудь зі списку",
+ "hashtag.column_settings.tag_mode.none": "Жоден зі списку",
+ "hashtag.column_settings.tag_toggle": "Додати додаткові теґи до цього стовпчика",
"home.column_settings.basic": "Основні",
- "home.column_settings.show_reblogs": "Показувати передмухи",
+ "home.column_settings.show_reblogs": "Показувати поширення",
"home.column_settings.show_replies": "Показувати відповіді",
"home.hide_announcements": "Приховати оголошення",
"home.show_announcements": "Показати оголошення",
"intervals.full.days": "{number, plural, one {# день} few {# дні} other {# днів}}",
"intervals.full.hours": "{number, plural, one {# година} few {# години} other {# годин}}",
"intervals.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}",
- "keyboard_shortcuts.back": "переходити назад",
- "keyboard_shortcuts.blocked": "відкрити список заблокованих користувачів",
- "keyboard_shortcuts.boost": "передмухувати",
- "keyboard_shortcuts.column": "фокусуватися на одній з колонок",
- "keyboard_shortcuts.compose": "фокусуватися на полі введення",
+ "keyboard_shortcuts.back": "Перейти назад",
+ "keyboard_shortcuts.blocked": "Відкрити список заблокованих користувачів",
+ "keyboard_shortcuts.boost": "Поширити допис",
+ "keyboard_shortcuts.column": "Фокусуватися на одній з колонок",
+ "keyboard_shortcuts.compose": "Фокусуватися на полі введення",
"keyboard_shortcuts.description": "Опис",
- "keyboard_shortcuts.direct": "відкрити колонку прямих повідомлень",
- "keyboard_shortcuts.down": "рухатися вниз стрічкою",
- "keyboard_shortcuts.enter": "відкрити статус",
- "keyboard_shortcuts.favourite": "вподобати",
- "keyboard_shortcuts.favourites": "відкрити список улюбленого",
- "keyboard_shortcuts.federated": "відкрити глобальну стрічку",
- "keyboard_shortcuts.heading": "Гарячі клавіші",
- "keyboard_shortcuts.home": "відкрити домашню стрічку",
+ "keyboard_shortcuts.direct": "щоб відкрити колонку прямих повідомлень",
+ "keyboard_shortcuts.down": "Рухатися вниз стрічкою",
+ "keyboard_shortcuts.enter": "Відкрити допис",
+ "keyboard_shortcuts.favourite": "Вподобати допис",
+ "keyboard_shortcuts.favourites": "Відкрити список вподобаного",
+ "keyboard_shortcuts.federated": "Відкрити глобальну стрічку",
+ "keyboard_shortcuts.heading": "Комбінації клавіш",
+ "keyboard_shortcuts.home": "Відкрити домашню стрічку",
"keyboard_shortcuts.hotkey": "Гаряча клавіша",
- "keyboard_shortcuts.legend": "показати підказку",
- "keyboard_shortcuts.local": "відкрити локальну стрічку",
- "keyboard_shortcuts.mention": "згадати автора",
- "keyboard_shortcuts.muted": "відкрити список заглушених користувачів",
- "keyboard_shortcuts.my_profile": "відкрити ваш профіль",
- "keyboard_shortcuts.notifications": "відкрити колонку сповіщень",
- "keyboard_shortcuts.open_media": "відкрити медіа",
- "keyboard_shortcuts.pinned": "відкрити список закріплених дмухів",
- "keyboard_shortcuts.profile": "відкрити профіль автора",
- "keyboard_shortcuts.reply": "відповісти",
+ "keyboard_shortcuts.legend": "Показати легенду",
+ "keyboard_shortcuts.local": "Відкрити локальну стрічку",
+ "keyboard_shortcuts.mention": "Згадати автора",
+ "keyboard_shortcuts.muted": "Відкрити список нехтуваних користувачів",
+ "keyboard_shortcuts.my_profile": "Відкрити ваш профіль",
+ "keyboard_shortcuts.notifications": "Відкрити колонку сповіщень",
+ "keyboard_shortcuts.open_media": "Відкрити медіа",
+ "keyboard_shortcuts.pinned": "Відкрити список закріплених дописів",
+ "keyboard_shortcuts.profile": "Відкрити профіль автора",
+ "keyboard_shortcuts.reply": "Відповісти",
"keyboard_shortcuts.requests": "відкрити список бажаючих підписатися",
"keyboard_shortcuts.search": "сфокусуватися на пошуку",
"keyboard_shortcuts.spoilers": "показати/приховати поле CW",
@@ -264,6 +267,8 @@
"lightbox.expand": "Розгорнути поле перегляду зображень",
"lightbox.next": "Далі",
"lightbox.previous": "Назад",
+ "limited_account_hint.action": "Усе одно показати профіль",
+ "limited_account_hint.title": "Цей профіль прихований модераторами вашого сервера.",
"lists.account.add": "Додати до списку",
"lists.account.remove": "Видалити зі списку",
"lists.delete": "Видалити список",
@@ -283,44 +288,44 @@
"missing_indicator.label": "Не знайдено",
"missing_indicator.sublabel": "Ресурс не знайдений",
"mute_modal.duration": "Тривалість",
- "mute_modal.hide_notifications": "Приховати сповіщення від користувача?",
+ "mute_modal.hide_notifications": "Сховати сповіщення від користувача?",
"mute_modal.indefinite": "Не визначено",
- "navigation_bar.apps": "Мобільні додатки",
+ "navigation_bar.apps": "Мобільні застосунки",
"navigation_bar.blocks": "Заблоковані користувачі",
"navigation_bar.bookmarks": "Закладки",
"navigation_bar.community_timeline": "Локальна стрічка",
- "navigation_bar.compose": "Написати новий дмух",
+ "navigation_bar.compose": "Написати новий допис",
"navigation_bar.direct": "Прямі повідомлення",
- "navigation_bar.discover": "Знайти",
- "navigation_bar.domain_blocks": "Приховані домени",
+ "navigation_bar.discover": "Дослідити",
+ "navigation_bar.domain_blocks": "Заблоковані домени",
"navigation_bar.edit_profile": "Редагувати профіль",
- "navigation_bar.explore": "Explore",
+ "navigation_bar.explore": "Огляд",
"navigation_bar.favourites": "Вподобане",
"navigation_bar.filters": "Приховані слова",
"navigation_bar.follow_requests": "Запити на підписку",
- "navigation_bar.follows_and_followers": "Підписки і підписники",
- "navigation_bar.info": "Про сайт",
+ "navigation_bar.follows_and_followers": "Підписки та підписники",
+ "navigation_bar.info": "Про цей сервер",
"navigation_bar.keyboard_shortcuts": "Гарячі клавіші",
"navigation_bar.lists": "Списки",
"navigation_bar.logout": "Вийти",
- "navigation_bar.mutes": "Заглушені користувачі",
+ "navigation_bar.mutes": "Нехтувані користувачі",
"navigation_bar.personal": "Особисте",
- "navigation_bar.pins": "Закріплені дмухи",
+ "navigation_bar.pins": "Закріплені дописи",
"navigation_bar.preferences": "Налаштування",
"navigation_bar.public_timeline": "Глобальна стрічка",
"navigation_bar.security": "Безпека",
- "notification.admin.sign_up": "{name} приєднується",
- "notification.favourite": "{name} вподобав(-ла) ваш допис",
- "notification.follow": "{name} підписався(-лась) на вас",
- "notification.follow_request": "{name} відправив(-ла) запит на підписку",
- "notification.mention": "{name} згадав(-ла) вас",
+ "notification.admin.sign_up": "{name} приєдналися",
+ "notification.favourite": "{name} вподобали ваш допис",
+ "notification.follow": "{name} підписалися на вас",
+ "notification.follow_request": "{name} відправили запит на підписку",
+ "notification.mention": "{name} згадали вас",
"notification.own_poll": "Ваше опитування завершено",
"notification.poll": "Опитування, у якому ви голосували, закінчилося",
- "notification.reblog": "{name} передмухнув(-ла) Ваш допис",
+ "notification.reblog": "{name} поширили ваш допис",
"notification.status": "{name} щойно дописує",
"notification.update": "{name} змінює допис",
"notifications.clear": "Очистити сповіщення",
- "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
+ "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщення?",
"notifications.column_settings.admin.sign_up": "Нові реєстрації:",
"notifications.column_settings.alert": "Сповіщення на комп'ютері",
"notifications.column_settings.favourite": "Вподобане:",
@@ -361,22 +366,22 @@
"poll.total_people": "{count, plural, one {# особа} other {# осіб}}",
"poll.total_votes": "{count, plural, one {# голос} few {# голоси} many {# голосів} other {# голосів}}",
"poll.vote": "Проголосувати",
- "poll.voted": "Ви голосували за цю відповідь",
+ "poll.voted": "Ви проголосували за цю відповідь",
"poll.votes": "{votes, plural, one {# голос} few {# голоси} many {# голосів} other {# голоса}}",
"poll_button.add_poll": "Додати опитування",
"poll_button.remove_poll": "Видалити опитування",
"privacy.change": "Змінити видимість допису",
"privacy.direct.long": "Показати тільки згаданим користувачам",
- "privacy.direct.short": "Особисто",
+ "privacy.direct.short": "Лише згадані люди",
"privacy.private.long": "Показати тільки підписникам",
"privacy.private.short": "Тільки для підписників",
- "privacy.public.long": "Показувати у публічних стрічках",
+ "privacy.public.long": "Видимий для всіх",
"privacy.public.short": "Публічно",
- "privacy.unlisted.long": "Не показувати у публічних стрічках",
+ "privacy.unlisted.long": "Видимий для всіх, але не через можливості виявлення",
"privacy.unlisted.short": "Прихований",
"refresh": "Оновити",
"regeneration_indicator.label": "Завантаження…",
- "regeneration_indicator.sublabel": "Ваша домашня стрічка готується!",
+ "regeneration_indicator.sublabel": "Хвилинку, ми готуємо вашу стрічку!",
"relative_time.days": "{number}д",
"relative_time.full.days": "{number, plural, one {# день} few {# дні} other {# днів}} тому",
"relative_time.full.hours": "{number, plural, one {# година} few {# години} other {# годин}} тому",
@@ -390,42 +395,42 @@
"relative_time.today": "сьогодні",
"reply_indicator.cancel": "Відмінити",
"report.block": "Заблокувати",
- "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+ "report.block_explanation": "Ви не будете бачити дописи цього користувача, а вони не зможуть бачити ваші дописи або підписуватися на вас. Вони будуть бачити, що ви їх заблокували.",
"report.categories.other": "Інше",
"report.categories.spam": "Спам",
"report.categories.violation": "Контент порушує одне або кілька правил сервера",
- "report.category.subtitle": "Choose the best match",
- "report.category.title": "Tell us what's going on with this {type}",
+ "report.category.subtitle": "Оберіть найкращий збіг",
+ "report.category.title": "Розкажіть нам, що не так з цим {type}",
"report.category.title_account": "профіль",
"report.category.title_status": "допис",
"report.close": "Готово",
- "report.comment.title": "Is there anything else you think we should know?",
+ "report.comment.title": "Чи є щось, що нам потрібно знати?",
"report.forward": "Надіслати до {target}",
"report.forward_hint": "Це акаунт з іншого серверу. Відправити анонімізовану копію скарги і туди?",
- "report.mute": "Mute",
- "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+ "report.mute": "Нехтувати",
+ "report.mute_explanation": "Ви не побачите їхніх дописів. Вони все ще можуть стежити за вами, бачити ваші дописи та не знатимуть про нехтування.",
"report.next": "Далі",
"report.placeholder": "Додаткові коментарі",
"report.reasons.dislike": "Мені це не подобається",
- "report.reasons.dislike_description": "It is not something you want to see",
+ "report.reasons.dislike_description": "Вам би не хотілося це бачити",
"report.reasons.other": "Це щось інше",
- "report.reasons.other_description": "The issue does not fit into other categories",
+ "report.reasons.other_description": "Ця проблема не відповідає жодній іншій категорії",
"report.reasons.spam": "Це спам",
- "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
- "report.reasons.violation": "It violates server rules",
- "report.reasons.violation_description": "You are aware that it breaks specific rules",
- "report.rules.subtitle": "Select all that apply",
- "report.rules.title": "Which rules are being violated?",
- "report.statuses.subtitle": "Select all that apply",
- "report.statuses.title": "Are there any posts that back up this report?",
+ "report.reasons.spam_description": "Шкідливі посилання, фальшиві взаємодії, або повідомлення, що повторюються",
+ "report.reasons.violation": "Порушує правила сервера",
+ "report.reasons.violation_description": "Ви впевнені, що це порушує певні правила",
+ "report.rules.subtitle": "Виберіть усі варіанти, що підходять",
+ "report.rules.title": "Які правила порушено?",
+ "report.statuses.subtitle": "Виберіть усі варіанти, що підходять",
+ "report.statuses.title": "Чи є дописи, які належать до цієї скарги?",
"report.submit": "Відправити",
"report.target": "Скаржимося на {target}",
- "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
- "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
- "report.thanks.title": "Don't want to see this?",
- "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
- "report.unfollow": "Unfollow @{name}",
- "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+ "report.thanks.take_action": "Ось ваші варіанти управління тим, що ви бачите в Mastodon:",
+ "report.thanks.take_action_actionable": "Поки ми переглядаємо це, ви можете вжити власних заходів проти @{name}:",
+ "report.thanks.title": "Не хочете це бачити?",
+ "report.thanks.title_actionable": "Дякуємо за скаргу, ми розглянемо її.",
+ "report.unfollow": "Відписатися від @{name}",
+ "report.unfollow_explanation": "Ви підписані на цього користувача. Щоб більше не бачити їхні дописи у вашій стрічці, відпишіться від них.",
"search.placeholder": "Пошук",
"search_popout.search_format": "Розширений формат пошуку",
"search_popout.tips.full_text": "Пошук за текстом знаходить статуси, які ви написали, вподобали, передмухнули, або в яких вас згадували. Також він знаходить імена користувачів, реальні імена та хештеґи.",
@@ -436,9 +441,9 @@
"search_results.accounts": "Люди",
"search_results.all": "Усе",
"search_results.hashtags": "Хештеґи",
- "search_results.nothing_found": "Could not find anything for these search terms",
+ "search_results.nothing_found": "Нічого не вдалося знайти за цими пошуковими термінами",
"search_results.statuses": "Дмухів",
- "search_results.statuses_fts_disabled": "Пошук дмухів за вмістом недоступний на цьому сервері Mastodon.",
+ "search_results.statuses_fts_disabled": "Пошук дописів за вмістом недоступний на даному сервері Mastodon.",
"search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}",
"status.admin_account": "Відкрити інтерфейс модерації для @{name}",
"status.admin_status": "Відкрити цей статус в інтерфейсі модерації",
@@ -462,8 +467,8 @@
"status.media_hidden": "Медіа приховано",
"status.mention": "Згадати @{name}",
"status.more": "Більше",
- "status.mute": "Заглушити @{name}",
- "status.mute_conversation": "Заглушити діалог",
+ "status.mute": "Приховати @{name}",
+ "status.mute_conversation": "Ігнорувати діалог",
"status.open": "Розгорнути допис",
"status.pin": "Закріпити у профілі",
"status.pinned": "Закріплений дмух",
@@ -485,7 +490,7 @@
"status.show_more_all": "Показувати більше для всіх",
"status.show_thread": "Показати ланцюжок",
"status.uncached_media_warning": "Недоступно",
- "status.unmute_conversation": "Зняти глушення з діалогу",
+ "status.unmute_conversation": "Не ігнорувати діалог",
"status.unpin": "Відкріпити від профілю",
"suggestions.dismiss": "Відхилити пропозицію",
"suggestions.header": "Вас може зацікавити…",
@@ -499,41 +504,42 @@
"time_remaining.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}",
"time_remaining.moments": "Залишилось секунд",
"time_remaining.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}}",
- "timeline_hint.remote_resource_not_displayed": "{resource} з інших серверів не відображається.",
+ "timeline_hint.remote_resource_not_displayed": "{resource} з інших серверів не зображується.",
"timeline_hint.resources.followers": "Підписники",
"timeline_hint.resources.follows": "Підписки",
- "timeline_hint.resources.statuses": "Старіші дмухи",
+ "timeline_hint.resources.statuses": "Попередні дописи",
"trends.counter_by_accounts": "{count, plural, one {{counter} особа обговорює} few {{counter} особи обговорюють} many {{counter} осіб обговорюють} other {{counter} особи обговорюють}}",
"trends.trending_now": "Актуальні",
"ui.beforeunload": "Вашу чернетку буде втрачено, якщо ви покинете Mastodon.",
- "units.short.billion": "{count} млрд",
- "units.short.million": "{count} млн",
- "units.short.thousand": "{count} тис",
+ "units.short.billion": "{count} млрд.",
+ "units.short.million": "{count} млн.",
+ "units.short.thousand": "{count} тис.",
"upload_area.title": "Перетягніть сюди, щоб завантажити",
- "upload_button.label": "Додати медіа",
+ "upload_button.label": "Додати зображення, відео або аудіо",
"upload_error.limit": "Ліміт завантаження файлів перевищено.",
"upload_error.poll": "Не можна завантажувати файли до опитувань.",
"upload_form.audio_description": "Опишіть для людей із вадами слуху",
"upload_form.description": "Опишіть для людей з вадами зору",
+ "upload_form.description_missing": "Немає опису",
"upload_form.edit": "Змінити",
"upload_form.thumbnail": "Змінити мініатюру",
"upload_form.undo": "Видалити",
"upload_form.video_description": "Опишіть для людей із вадами слуху або зору",
- "upload_modal.analyzing_picture": "Аналізуємо малюнок…",
+ "upload_modal.analyzing_picture": "Аналізуємо зображення…",
"upload_modal.apply": "Застосувати",
"upload_modal.applying": "Застосування…",
"upload_modal.choose_image": "Вибрати зображення",
"upload_modal.description_placeholder": "Щурячий бугай із їжаком-харцизом в'ючись підписали ґешефт у єнах",
- "upload_modal.detect_text": "Виявити текст на малюнку",
+ "upload_modal.detect_text": "Виявити текст на зображенні",
"upload_modal.edit_media": "Редагувати медіа",
- "upload_modal.hint": "Клацніть або перетягніть коло на превью, щоб обрати точку, яку буде завжди видно на мініатюрах.",
+ "upload_modal.hint": "Клацніть або перетягніть коло на превʼю, щоб обрати точку, яку буде завжди видно на мініатюрах.",
"upload_modal.preparing_ocr": "Підготовка OCR…",
"upload_modal.preview_label": "Переглянути ({ratio})",
"upload_progress.label": "Завантаження...",
"video.close": "Закрити відео",
- "video.download": "Завантаження файла",
+ "video.download": "Завантажити файл",
"video.exit_fullscreen": "Вийти з повноекранного режиму",
- "video.expand": "Розширити відео",
+ "video.expand": "Розгорнути відео",
"video.fullscreen": "На весь екран",
"video.hide": "Приховати відео",
"video.mute": "Вимкнути звук",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index e5aad2355..d4daaceb3 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -70,7 +70,7 @@
"column.blocks": "مسدود صارفین",
"column.bookmarks": "بُک مارکس",
"column.community": "مقامی زمانی جدول",
- "column.direct": "راست پیغام",
+ "column.direct": "Direct messages",
"column.directory": "مشخصات کا مطالعہ کریں",
"column.domain_blocks": "پوشیدہ ڈومین",
"column.favourites": "پسندیدہ",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "صرف مقامی",
"community.column_settings.media_only": "وسائل فقط",
"community.column_settings.remote_only": "صرف خارجی",
- "compose_form.direct_message_warning": "یہ ٹوٹ صرف مذکورہ صارفین کو بھیجا جائے گا.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "مزید جانیں",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "چونکہ یہ ٹوٹ غیر مندرجہ ہے لہذا یہ کسی بھی ہیش ٹیگ کے تحت درج نہیں کیا جائے گا. ہیش ٹیگ کے تحت صرف \nعمومی ٹوٹ تلاش کئے جا سکتے ہیں.",
"compose_form.lock_disclaimer": "آپ کا اکاؤنٹ {locked} نہیں ہے. کوئی بھی آپ کے مخصوص برائے پیروکار ٹوٹ دیکھنے کی خاطر آپ کی پیروی کر سکتا ہے.",
"compose_form.lock_disclaimer.lock": "مقفل",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "یہ انتخاب ہٹا دیں",
"compose_form.poll.switch_to_multiple": "متعدد انتخاب کی اجازت دینے کے لیے پول تبدیل کریں",
"compose_form.poll.switch_to_single": "کسی ایک انتخاب کے لیے پول تبدیل کریں",
- "compose_form.publish": "ٹوٹ",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "وسائل کو حساس نشاندہ کریں",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "یہ اس طرح نظر آئے گا:",
"emoji_button.activity": "سرگرمی",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "حسب منشا",
"emoji_button.flags": "پرچم",
"emoji_button.food": "عذا و مشروب",
@@ -166,7 +169,7 @@
"empty_column.blocks": "آپ نے ابھی کسی صارف کو مسدود نہیں کیا ہے.",
"empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "مقامی جدول خالی ہے. کچھ تحریر کریں تاکہ بات آگے بڑھے!",
- "empty_column.direct": "آپ کیلئے کوئی راست پیغام نہیں ہے. جب آپ بھیجیں گے یا وصول کریں گے، یہاں نظر آئےگا.",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "ابھی تک کوئی چھپا ہوا ڈومین نہیں ہے.",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "آپ کا کوئی پسندیدہ ٹوٹ نہیں ہے. جب آپ پسند کریں گے، یہاں نظر آئےگا.",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "Add to list",
"lists.account.remove": "Remove from list",
"lists.delete": "Delete list",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "بُک مارکس",
"navigation_bar.community_timeline": "مقامی ٹائم لائن",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "براہ راست پیغامات",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "دریافت کریں",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "پروفائل میں ترمیم کریں",
@@ -370,9 +375,9 @@
"privacy.direct.short": "Direct",
"privacy.private.long": "Post to followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Post to public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Do not show in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "Loading…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index d47033881..e4e7c233b 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -9,10 +9,10 @@
"account.browse_more_on_origin_server": "Truy cập trang của người này",
"account.cancel_follow_request": "Hủy yêu cầu theo dõi",
"account.direct": "Nhắn riêng @{name}",
- "account.disable_notifications": "Không thông báo khi @{name} đăng tút",
+ "account.disable_notifications": "Tắt thông báo khi @{name} đăng tút",
"account.domain_blocked": "Người đã chặn",
- "account.edit_profile": "Chỉnh sửa trang cá nhân",
- "account.enable_notifications": "Thông báo khi @{name} đăng tút",
+ "account.edit_profile": "Sửa hồ sơ",
+ "account.enable_notifications": "Nhận thông báo khi @{name} đăng tút",
"account.endorse": "Tôn vinh người này",
"account.follow": "Theo dõi",
"account.followers": "Người theo dõi",
@@ -22,13 +22,13 @@
"account.following_counter": "{count, plural, one {{counter} Theo dõi} other {{counter} Theo dõi}}",
"account.follows.empty": "Người này chưa theo dõi ai.",
"account.follows_you": "Đang theo dõi bạn",
- "account.hide_reblogs": "Ẩn tút do @{name} đăng lại",
+ "account.hide_reblogs": "Ẩn tút @{name} đăng lại",
"account.joined": "Đã tham gia {date}",
- "account.link_verified_on": "Liên kết này đã được xác thực vào {date}",
+ "account.link_verified_on": "Liên kết này đã được xác minh vào {date}",
"account.locked_info": "Đây là tài khoản riêng tư. Họ sẽ tự mình xét duyệt các yêu cầu theo dõi.",
"account.media": "Media",
"account.mention": "Nhắc đến @{name}",
- "account.moved_to": "{name} đã đổi thành:",
+ "account.moved_to": "{name} đã chuyển sang:",
"account.mute": "Ẩn @{name}",
"account.mute_notifications": "Tắt thông báo từ @{name}",
"account.muted": "Đã ẩn",
@@ -57,7 +57,7 @@
"alert.rate_limited.title": "Vượt giới hạn",
"alert.unexpected.message": "Đã xảy ra lỗi không mong muốn.",
"alert.unexpected.title": "Ốiii!",
- "announcement.announcement": "Thông báo chung",
+ "announcement.announcement": "Có gì mới?",
"attachments_list.unprocessed": "(chưa xử lí)",
"autosuggest_hashtag.per_week": "{count} mỗi tuần",
"boost_modal.combo": "Nhấn {combo} để bỏ qua bước này",
@@ -70,7 +70,7 @@
"column.blocks": "Người đã chặn",
"column.bookmarks": "Đã lưu",
"column.community": "Máy chủ của bạn",
- "column.direct": "Tin nhắn",
+ "column.direct": "Nhắn riêng",
"column.directory": "Tìm người cùng sở thích",
"column.domain_blocks": "Máy chủ đã chặn",
"column.favourites": "Thích",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "Chỉ máy chủ của bạn",
"community.column_settings.media_only": "Chỉ xem media",
"community.column_settings.remote_only": "Chỉ người dùng ở máy chủ khác",
- "compose_form.direct_message_warning": "Tút này sẽ chỉ gửi cho người được nhắc đến.",
+ "compose.language.change": "Đổi ngôn ngữ",
+ "compose.language.search": "Tìm ngôn ngữ...",
"compose_form.direct_message_warning_learn_more": "Tìm hiểu thêm",
+ "compose_form.encryption_warning": "Các tút trên Mastodon không được mã hóa đầu cuối. Không chia sẻ bất kỳ thông tin nhạy cảm nào qua Mastodon.",
"compose_form.hashtag_warning": "Tút này sẽ không xuất hiện công khai. Chỉ những tút công khai mới có thể được tìm kiếm thông qua hashtag.",
"compose_form.lock_disclaimer": "Tài khoản của bạn không {locked}. Bất cứ ai cũng có thể theo dõi và xem tút riêng tư của bạn.",
"compose_form.lock_disclaimer.lock": "khóa",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Xóa lựa chọn này",
"compose_form.poll.switch_to_multiple": "Có thể chọn nhiều lựa chọn",
"compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn",
- "compose_form.publish": "Đăng tút",
+ "compose_form.publish": "Đăng",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Lưu thay đổi",
"compose_form.sensitive.hide": "{count, plural, other {Đánh dấu nội dung nhạy cảm}}",
@@ -112,13 +114,13 @@
"compose_form.sensitive.unmarked": "{count, plural, other {Nội dung này bình thường}}",
"compose_form.spoiler.marked": "Hủy nội dung ẩn",
"compose_form.spoiler.unmarked": "Tạo nội dung ẩn",
- "compose_form.spoiler_placeholder": "Viết nội dung ẩn của bạn ở đây",
+ "compose_form.spoiler_placeholder": "Lời dẫn cho nội dung ẩn",
"confirmation_modal.cancel": "Hủy bỏ",
"confirmations.block.block_and_report": "Chặn & Báo cáo",
"confirmations.block.confirm": "Chặn",
"confirmations.block.message": "Bạn có thật sự muốn chặn {name}?",
"confirmations.delete.confirm": "Xóa bỏ",
- "confirmations.delete.message": "Bạn \bthật sự muốn xóa tút này?",
+ "confirmations.delete.message": "Bạn thật sự muốn xóa tút này?",
"confirmations.delete_list.confirm": "Xóa bỏ",
"confirmations.delete_list.message": "Bạn thật sự muốn xóa vĩnh viễn danh sách này?",
"confirmations.discard_edit_media.confirm": "Bỏ qua",
@@ -147,6 +149,7 @@
"embed.instructions": "Sao chép đoạn mã dưới đây và chèn vào trang web của bạn.",
"embed.preview": "Nó sẽ hiển thị như vầy:",
"emoji_button.activity": "Hoạt động",
+ "emoji_button.clear": "Xóa",
"emoji_button.custom": "Độc đáo",
"emoji_button.flags": "Cờ",
"emoji_button.food": "Ăn uống",
@@ -166,7 +169,7 @@
"empty_column.blocks": "Bạn chưa chặn bất cứ ai.",
"empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.",
"empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!",
- "empty_column.direct": "Bạn chưa có tin nhắn nào. Khi bạn gửi hoặc nhận tin nhắn, nó sẽ hiển thị ở đây.",
+ "empty_column.direct": "Bạn chưa có tin nhắn riêng nào. Khi bạn gửi hoặc nhận một tin nhắn riêng, nó sẽ xuất hiện ở đây.",
"empty_column.domain_blocks": "Chưa ẩn bất kỳ máy chủ nào.",
"empty_column.explore_statuses": "Chưa có xu hướng nào. Kiểm tra lại sau!",
"empty_column.favourited_statuses": "Bạn chưa thích tút nào. Hãy thử đi, nó sẽ xuất hiện ở đây.",
@@ -220,18 +223,18 @@
"home.column_settings.basic": "Tùy chỉnh",
"home.column_settings.show_reblogs": "Hiện những lượt đăng lại",
"home.column_settings.show_replies": "Hiện những tút dạng trả lời",
- "home.hide_announcements": "Ẩn thông báo",
- "home.show_announcements": "Hiện thông báo",
+ "home.hide_announcements": "Ẩn thông báo máy chủ",
+ "home.show_announcements": "Hiện thông báo máy chủ",
"intervals.full.days": "{number, plural, other {# ngày}}",
"intervals.full.hours": "{number, plural, other {# giờ}}",
"intervals.full.minutes": "{number, plural, other {# phút}}",
"keyboard_shortcuts.back": "trở lại",
"keyboard_shortcuts.blocked": "mở danh sách người đã chặn",
- "keyboard_shortcuts.boost": "Đăng lại",
+ "keyboard_shortcuts.boost": "đăng lại",
"keyboard_shortcuts.column": "mở các mục",
"keyboard_shortcuts.compose": "mở khung soạn tút",
"keyboard_shortcuts.description": "Mô tả",
- "keyboard_shortcuts.direct": "mở mục tin nhắn",
+ "keyboard_shortcuts.direct": "để mở cột tin nhắn",
"keyboard_shortcuts.down": "di chuyển xuống dưới danh sách",
"keyboard_shortcuts.enter": "viết tút mới",
"keyboard_shortcuts.favourite": "thích",
@@ -244,11 +247,11 @@
"keyboard_shortcuts.local": "mở máy chủ của bạn",
"keyboard_shortcuts.mention": "nhắc đến ai đó",
"keyboard_shortcuts.muted": "mở danh sách người đã ẩn",
- "keyboard_shortcuts.my_profile": "mở trang cá nhân của bạn",
+ "keyboard_shortcuts.my_profile": "mở hồ sơ của bạn",
"keyboard_shortcuts.notifications": "mở mục thông báo",
"keyboard_shortcuts.open_media": "mở ảnh hoặc video",
"keyboard_shortcuts.pinned": "mở danh sách tút ghim",
- "keyboard_shortcuts.profile": "mở trang cá nhân của người viết tút",
+ "keyboard_shortcuts.profile": "mở hồ sơ của người viết tút",
"keyboard_shortcuts.reply": "trả lời",
"keyboard_shortcuts.requests": "mở danh sách yêu cầu theo dõi",
"keyboard_shortcuts.search": "mở tìm kiếm",
@@ -264,6 +267,8 @@
"lightbox.expand": "Phóng to hình",
"lightbox.next": "Tiếp",
"lightbox.previous": "Trước",
+ "limited_account_hint.action": "Vẫn cứ xem",
+ "limited_account_hint.title": "Người này bị ẩn bởi kiểm duyệt viên máy chủ.",
"lists.account.add": "Thêm vào danh sách",
"lists.account.remove": "Xóa khỏi danh sách",
"lists.delete": "Xóa danh sách",
@@ -293,7 +298,7 @@
"navigation_bar.direct": "Tin nhắn",
"navigation_bar.discover": "Khám phá",
"navigation_bar.domain_blocks": "Máy chủ đã ẩn",
- "navigation_bar.edit_profile": "Trang cá nhân",
+ "navigation_bar.edit_profile": "Sửa hồ sơ",
"navigation_bar.explore": "Xu hướng",
"navigation_bar.favourites": "Thích",
"navigation_bar.filters": "Bộ lọc từ ngữ",
@@ -367,22 +372,22 @@
"poll_button.remove_poll": "Hủy cuộc bình chọn",
"privacy.change": "Thay đổi quyền riêng tư",
"privacy.direct.long": "Chỉ người được nhắc đến mới thấy",
- "privacy.direct.short": "Nhắn riêng",
+ "privacy.direct.short": "Chỉ người được nhắc",
"privacy.private.long": "Dành riêng cho người theo dõi",
- "privacy.private.short": "Riêng tư",
- "privacy.public.long": "Hiện trên bảng tin máy chủ",
+ "privacy.private.short": "Chỉ người theo dõi",
+ "privacy.public.long": "Hiển thị với mọi người",
"privacy.public.short": "Công khai",
- "privacy.unlisted.long": "Không hiện trên bảng tin máy chủ",
+ "privacy.unlisted.long": "Hiển thị với mọi người, nhưng không hiện trong tính năng khám phá",
"privacy.unlisted.short": "Hạn chế",
"refresh": "Làm mới",
"regeneration_indicator.label": "Đang tải…",
"regeneration_indicator.sublabel": "Bảng tin của bạn đang được cập nhật!",
"relative_time.days": "{number} ngày",
- "relative_time.full.days": "{number, plural, other {# ngày}} trước",
- "relative_time.full.hours": "{number, plural, other {# giờ}} trước",
+ "relative_time.full.days": "{number, plural, other {# ngày}}",
+ "relative_time.full.hours": "{number, plural, other {# giờ}}",
"relative_time.full.just_now": "vừa xong",
- "relative_time.full.minutes": "{number, plural, other {# phút}} trước",
- "relative_time.full.seconds": "{number, plural, other {# giây}} trước",
+ "relative_time.full.minutes": "{number, plural, other {# phút}}",
+ "relative_time.full.seconds": "{number, plural, other {#s}}",
"relative_time.hours": "{number} giờ",
"relative_time.just_now": "vừa xong",
"relative_time.minutes": "{number} phút",
@@ -414,9 +419,9 @@
"report.reasons.spam_description": "Liên kết độc hại, tạo tương tác giả hoặc trả lời lặp đi lặp lại",
"report.reasons.violation": "Vi phạm quy tắc máy chủ",
"report.reasons.violation_description": "Bạn nhận thấy nó vi phạm quy tắc máy chủ",
- "report.rules.subtitle": "Chọn tất cả những áp dụng",
+ "report.rules.subtitle": "Chọn tất cả những gì phù hợp",
"report.rules.title": "Vi phạm quy tắc nào?",
- "report.statuses.subtitle": "Chọn tất cả những áp dụng",
+ "report.statuses.subtitle": "Chọn tất cả những gì phù hợp",
"report.statuses.title": "Bạn muốn gửi tút nào kèm báo cáo này?",
"report.submit": "Gửi đi",
"report.target": "Báo cáo {target}",
@@ -458,14 +463,14 @@
"status.filtered": "Bộ lọc",
"status.history.created": "{name} tạo lúc {date}",
"status.history.edited": "{name} sửa lúc {date}",
- "status.load_more": "Xem thêm",
+ "status.load_more": "Tải thêm",
"status.media_hidden": "Đã ẩn",
"status.mention": "Nhắc đến @{name}",
"status.more": "Thêm",
"status.mute": "Ẩn @{name}",
"status.mute_conversation": "Không quan tâm nữa",
"status.open": "Xem nguyên văn",
- "status.pin": "Ghim lên trang cá nhân",
+ "status.pin": "Ghim lên hồ sơ",
"status.pinned": "Tút đã ghim",
"status.read_more": "Đọc tiếp",
"status.reblog": "Đăng lại",
@@ -486,7 +491,7 @@
"status.show_thread": "Xem chuỗi tút này",
"status.uncached_media_warning": "Uncached",
"status.unmute_conversation": "Quan tâm",
- "status.unpin": "Bỏ ghim trên trang cá nhân",
+ "status.unpin": "Bỏ ghim trên hồ sơ",
"suggestions.dismiss": "Tắt đề xuất",
"suggestions.header": "Có thể bạn quan tâm…",
"tabs_bar.federated_timeline": "Thế giới",
@@ -515,6 +520,7 @@
"upload_error.poll": "Không cho phép đính kèm tập tin.",
"upload_form.audio_description": "Mô tả cho người mất thính giác",
"upload_form.description": "Mô tả cho người khiếm thị",
+ "upload_form.description_missing": "Chưa thêm mô tả",
"upload_form.edit": "Biên tập",
"upload_form.thumbnail": "Đổi ảnh thumbnail",
"upload_form.undo": "Xóa bỏ",
diff --git a/app/javascript/mastodon/locales/whitelist_en-GB.json b/app/javascript/mastodon/locales/whitelist_en-GB.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_en-GB.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/whitelist_fy.json b/app/javascript/mastodon/locales/whitelist_fy.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_fy.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index b321d1525..c6528fbe7 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "ⵖⴰⵙ ⴰⴷⵖⴰⵔⴰⵏ",
"community.column_settings.media_only": "ⵖⴰⵙ ⵉⵙⵏⵖⵎⵉⵙⵏ",
"community.column_settings.remote_only": "Remote only",
- "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "ⵙⵙⵏ ⵓⴳⴳⴰⵔ",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "ⵉⵜⵜⵓⵔⴳⵍ",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Toot",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -147,6 +149,7 @@
"embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "Custom",
"emoji_button.flags": "ⵉⵛⵏⵢⴰⵍⵏ",
"emoji_button.food": "ⵓⵜⵛⵉ & ⵜⵉⵙⵙⵉ",
@@ -264,6 +267,8 @@
"lightbox.expand": "Expand image view box",
"lightbox.next": "Next",
"lightbox.previous": "Previous",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "ⵔⵏⵓ ⵖⵔ ⵜⵍⴳⴰⵎⵜ",
"lists.account.remove": "ⴽⴽⵙ ⵙⴳ ⵜⵍⴳⴰⵎⵜ",
"lists.delete": "ⴽⴽⵙ ⵜⴰⵍⴳⴰⵎⵜ",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "Local timeline",
"navigation_bar.compose": "Compose new toot",
- "navigation_bar.direct": "ⵜⵓⵣⵉⵏⵉⵏ ⵜⵓⵙⵔⵉⴷⵉⵏ",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Hidden domains",
"navigation_bar.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "ⵙⵙⵉⵜⵢ ⵉⴷⵣ",
"privacy.change": "Adjust status privacy",
"privacy.direct.long": "Visible for mentioned users only",
- "privacy.direct.short": "ⵜⵓⵔⴷⵉⵜ",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "Visible for followers only",
"privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all, shown in public timelines",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "ⵜⴰⴳⴷⵓⴷⴰⵏⵜ",
- "privacy.unlisted.long": "Visible for all, but not in public timelines",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "Unlisted",
"refresh": "Refresh",
"regeneration_indicator.label": "ⴰⵣⴷⴰⵎ…",
@@ -515,6 +520,7 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "ⵙⵏⴼⵍ",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.undo": "ⴽⴽⵙ",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 9e306688e..a7bf96f9e 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -1,6 +1,6 @@
{
"account.account_note_header": "备注",
- "account.add_or_remove_from_list": "从列表中添加或删除",
+ "account.add_or_remove_from_list": "从列表中添加或移除",
"account.badges.bot": "机器人",
"account.badges.group": "群组",
"account.block": "屏蔽 @{name}",
@@ -22,10 +22,10 @@
"account.following_counter": "正在关注 {counter} 人",
"account.follows.empty": "此用户目前尚未关注任何人。",
"account.follows_you": "关注了你",
- "account.hide_reblogs": "隐藏来自 @{name} 的转嘟",
+ "account.hide_reblogs": "隐藏来自 @{name} 的转贴",
"account.joined": "加入于 {date}",
"account.link_verified_on": "此链接的所有权已在 {date} 检查",
- "account.locked_info": "此账户已锁嘟。账户的主人会手动审核关注者。",
+ "account.locked_info": "此账户已锁嘟。账户所有者会手动审核关注者。",
"account.media": "媒体",
"account.mention": "提及 @{name}",
"account.moved_to": "{name} 已经迁移到:",
@@ -36,12 +36,12 @@
"account.posts_with_replies": "嘟文和回复",
"account.report": "举报 @{name}",
"account.requested": "正在等待对方同意。点击以取消发送关注请求",
- "account.share": "分享 @{name} 的个人资料",
+ "account.share": "分享 @{name} 的个人资料页",
"account.show_reblogs": "显示来自 @{name} 的转嘟",
"account.statuses_counter": "{counter} 条嘟文",
- "account.unblock": "解除屏蔽 @{name}",
+ "account.unblock": "取消屏蔽 @{name}",
"account.unblock_domain": "不再屏蔽 {domain} 实例",
- "account.unblock_short": "移出黑名单",
+ "account.unblock_short": "取消屏蔽",
"account.unendorse": "不在个人资料中推荐此用户",
"account.unfollow": "取消关注",
"account.unmute": "不再隐藏 @{name}",
@@ -51,7 +51,7 @@
"admin.dashboard.daily_retention": "注册后用户留存率(按日计算)",
"admin.dashboard.monthly_retention": "注册后用户留存率(按月计算)",
"admin.dashboard.retention.average": "平均",
- "admin.dashboard.retention.cohort": "注册月",
+ "admin.dashboard.retention.cohort": "注册月份",
"admin.dashboard.retention.cohort_size": "新用户",
"alert.rate_limited.message": "请在{retry_time, time, medium}后重试。",
"alert.rate_limited.title": "频率受限",
@@ -72,7 +72,7 @@
"column.community": "本站时间轴",
"column.direct": "私信",
"column.directory": "浏览用户资料",
- "column.domain_blocks": "已屏蔽的网站",
+ "column.domain_blocks": "已屏蔽的域名",
"column.favourites": "喜欢",
"column.follow_requests": "关注请求",
"column.home": "主页",
@@ -89,30 +89,32 @@
"column_header.show_settings": "显示设置",
"column_header.unpin": "取消置顶",
"column_subheading.settings": "设置",
- "community.column_settings.local_only": "只显示本站",
- "community.column_settings.media_only": "仅媒体",
- "community.column_settings.remote_only": "只显示外站",
- "compose_form.direct_message_warning": "这条嘟文仅对所有被提及的用户可见。",
+ "community.column_settings.local_only": "仅限本站",
+ "community.column_settings.media_only": "仅限媒体",
+ "community.column_settings.remote_only": "仅限外部",
+ "compose.language.change": "更改语言",
+ "compose.language.search": "搜索语言...",
"compose_form.direct_message_warning_learn_more": "了解详情",
+ "compose_form.encryption_warning": "Mastodon 上的嘟文并未端到端加密。请不要在 Mastodon 上分享敏感信息。",
"compose_form.hashtag_warning": "这条嘟文被设置为“不公开”,因此它不会出现在任何话题标签的列表下。只有公开的嘟文才能通过话题标签进行搜索。",
"compose_form.lock_disclaimer": "你的帐户没有{locked}。任何人都可以在关注你后立即查看仅关注者可见的嘟文。",
"compose_form.lock_disclaimer.lock": "开启保护",
- "compose_form.placeholder": "在想啥?",
- "compose_form.poll.add_option": "添加选项",
+ "compose_form.placeholder": "在想些什么?",
+ "compose_form.poll.add_option": "添加一个选项",
"compose_form.poll.duration": "投票持续时间",
"compose_form.poll.option_placeholder": "选项 {number}",
- "compose_form.poll.remove_option": "移除这个选项",
+ "compose_form.poll.remove_option": "移除此选项",
"compose_form.poll.switch_to_multiple": "将投票改为多选",
"compose_form.poll.switch_to_single": "将投票改为单选",
- "compose_form.publish": "嘟嘟",
+ "compose_form.publish": "发布",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "保存更改",
- "compose_form.sensitive.hide": "标记媒体为敏感内容",
- "compose_form.sensitive.marked": "媒体已被标记为敏感内容",
+ "compose_form.sensitive.hide": "{count, plural, one {将媒体标记为敏感内容} other {将媒体标记为敏感内容}}",
+ "compose_form.sensitive.marked": "{count, plural, one {媒体已被标记为敏感内容} other {媒体已被标记为敏感内容}}",
"compose_form.sensitive.unmarked": "媒体未被标记为敏感内容",
- "compose_form.spoiler.marked": "正文已被折叠在警告信息之后",
- "compose_form.spoiler.unmarked": "正文未被折叠",
- "compose_form.spoiler_placeholder": "折叠部分的警告消息",
+ "compose_form.spoiler.marked": "移除内容警告",
+ "compose_form.spoiler.unmarked": "添加内容警告",
+ "compose_form.spoiler_placeholder": "写下你的警告",
"confirmation_modal.cancel": "取消",
"confirmations.block.block_and_report": "屏蔽与举报",
"confirmations.block.confirm": "屏蔽",
@@ -120,15 +122,15 @@
"confirmations.delete.confirm": "删除",
"confirmations.delete.message": "你确定要删除这条嘟文吗?",
"confirmations.delete_list.confirm": "删除",
- "confirmations.delete_list.message": "你确定要永久删除这个列表吗?",
+ "confirmations.delete_list.message": "你确定要永久删除此列表吗?",
"confirmations.discard_edit_media.confirm": "丢弃",
"confirmations.discard_edit_media.message": "您还有未保存的媒体描述或预览修改,仍然丢弃它们吗?",
- "confirmations.domain_block.confirm": "隐藏整个网站的内容",
+ "confirmations.domain_block.confirm": "屏蔽整个域名",
"confirmations.domain_block.message": "你真的确定要屏蔽所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。",
"confirmations.logout.confirm": "登出",
"confirmations.logout.message": "你确定要登出吗?",
"confirmations.mute.confirm": "隐藏",
- "confirmations.mute.explanation": "这将隐藏他们的嘟文以及提到他们的嘟文,但他们仍可以看到你的嘟文并关注你。",
+ "confirmations.mute.explanation": "这将隐藏来自他们的嘟文以及提到他们的嘟文,但他们仍可以看到你的嘟文并关注你。",
"confirmations.mute.message": "你确定要隐藏 {name} 吗?",
"confirmations.redraft.confirm": "删除并重新编辑",
"confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将会失去关联。",
@@ -140,19 +142,20 @@
"conversation.mark_as_read": "标记为已读",
"conversation.open": "查看对话",
"conversation.with": "与 {names}",
- "directory.federated": "来自联邦宇宙的已知部分",
+ "directory.federated": "来自已知联邦宇宙",
"directory.local": "仅来自 {domain}",
"directory.new_arrivals": "新来者",
"directory.recently_active": "最近活跃",
- "embed.instructions": "要在你的网站上嵌入此嘟文,请复制以下代码。",
+ "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。",
"embed.preview": "它会像这样显示出来:",
"emoji_button.activity": "活动",
+ "emoji_button.clear": "清除",
"emoji_button.custom": "自定义",
"emoji_button.flags": "旗帜",
"emoji_button.food": "食物和饮料",
- "emoji_button.label": "加入表情符号",
+ "emoji_button.label": "插入表情符号",
"emoji_button.nature": "自然",
- "emoji_button.not_found": "木有这个表情符号!(╯°□°)╯︵ ┻━┻",
+ "emoji_button.not_found": "没有找到匹配的表情符号",
"emoji_button.objects": "物体",
"emoji_button.people": "人物",
"emoji_button.recent": "常用",
@@ -160,23 +163,23 @@
"emoji_button.search_results": "搜索结果",
"emoji_button.symbols": "符号",
"emoji_button.travel": "旅行和地点",
- "empty_column.account_suspended": "账户被封禁",
+ "empty_column.account_suspended": "账户已停用",
"empty_column.account_timeline": "这里没有嘟文!",
"empty_column.account_unavailable": "个人资料不可用",
- "empty_column.blocks": "你目前没有屏蔽任何用户。",
+ "empty_column.blocks": "你还未屏蔽任何用户。",
"empty_column.bookmarked_statuses": "你还没有给任何嘟文添加过书签。在你添加书签后,嘟文就会显示在这里。",
"empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!",
- "empty_column.direct": "你还没有使用过私信。当你发出或者收到私信时,它会在这里显示。",
- "empty_column.domain_blocks": "目前没有被隐藏的站点。",
+ "empty_column.direct": "你还未使用过私信。当你发出或者收到私信时,它将显示在此。",
+ "empty_column.domain_blocks": "暂且没有被屏蔽的站点。",
"empty_column.explore_statuses": "目前没有热门话题,稍后再来看看吧!",
"empty_column.favourited_statuses": "你还没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。",
"empty_column.favourites": "没有人喜欢过这条嘟文。如果有人喜欢了,就会显示在这里。",
"empty_column.follow_recommendations": "似乎无法为你生成任何建议。你可以尝试使用搜索寻找你可能知道的人或探索热门标签。",
- "empty_column.follow_requests": "你没有收到新的关注请求。收到了之后就会显示在这里。",
+ "empty_column.follow_requests": "你没有收到新的关注请求。收到后将显示在此。",
"empty_column.hashtag": "这个话题标签下暂时没有内容。",
"empty_column.home": "你的主页时间线是空的!快去关注更多人吧。 {suggestions}",
"empty_column.home.suggestions": "查看一些建议",
- "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的的新嘟文将会在这里显示。",
+ "empty_column.list": "此列表中暂时没有内容。列表中用户所发送的新嘟文将会在这里显示。",
"empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。",
"empty_column.mutes": "你没有隐藏任何用户。",
"empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
@@ -188,7 +191,7 @@
"errors.unexpected_crash.copy_stacktrace": "把堆栈跟踪信息复制到剪贴板",
"errors.unexpected_crash.report_issue": "报告问题",
"explore.search_results": "搜索结果",
- "explore.suggested_follows": "为您推荐",
+ "explore.suggested_follows": "为你推荐",
"explore.title": "探索",
"explore.trending_links": "最新消息",
"explore.trending_statuses": "嘟文",
@@ -196,9 +199,9 @@
"follow_recommendations.done": "完成",
"follow_recommendations.heading": "关注你感兴趣的用户!这里有一些推荐。",
"follow_recommendations.lead": "你关注的人的嘟文将按时间顺序在你的主页上显示。 别担心,你可以随时取消关注!",
- "follow_request.authorize": "同意",
+ "follow_request.authorize": "授权",
"follow_request.reject": "拒绝",
- "follow_requests.unlocked_explanation": "虽说你没有锁嘟,但是 {domain} 的工作人员觉得你可能想手工审核关注请求。",
+ "follow_requests.unlocked_explanation": "尽管你没有锁嘟,但是 {domain} 的工作人员认为你也许会想手动审核审核这些账号的关注请求。",
"generic.saved": "已保存",
"getting_started.developers": "开发",
"getting_started.directory": "用户目录",
@@ -206,7 +209,7 @@
"getting_started.heading": "开始使用",
"getting_started.invite": "邀请用户",
"getting_started.open_source_notice": "Mastodon 是开源软件。欢迎前往 GitHub({github})贡献代码或反馈问题。",
- "getting_started.security": "帐户安全",
+ "getting_started.security": "账号设置",
"getting_started.terms": "使用条款",
"hashtag.column_header.tag_mode.all": "以及 {additional}",
"hashtag.column_header.tag_mode.any": "或是 {additional}",
@@ -215,7 +218,7 @@
"hashtag.column_settings.select.placeholder": "输入话题标签…",
"hashtag.column_settings.tag_mode.all": "全部",
"hashtag.column_settings.tag_mode.any": "任一",
- "hashtag.column_settings.tag_mode.none": "全都不要",
+ "hashtag.column_settings.tag_mode.none": "无一",
"hashtag.column_settings.tag_toggle": "在此栏加入额外的标签",
"home.column_settings.basic": "基本设置",
"home.column_settings.show_reblogs": "显示转嘟",
@@ -228,8 +231,8 @@
"keyboard_shortcuts.back": "返回上一页",
"keyboard_shortcuts.blocked": "打开被屏蔽用户列表",
"keyboard_shortcuts.boost": "转嘟",
- "keyboard_shortcuts.column": "选择某一栏中的嘟文",
- "keyboard_shortcuts.compose": "选择嘟文撰写框",
+ "keyboard_shortcuts.column": "选择某栏",
+ "keyboard_shortcuts.compose": "选择输入框",
"keyboard_shortcuts.description": "说明",
"keyboard_shortcuts.direct": "打开私信栏",
"keyboard_shortcuts.down": "在列表中让光标下移",
@@ -243,7 +246,7 @@
"keyboard_shortcuts.legend": "显示此列表",
"keyboard_shortcuts.local": "打开本站时间轴",
"keyboard_shortcuts.mention": "提及嘟文作者",
- "keyboard_shortcuts.muted": "打开已隐藏用户列表",
+ "keyboard_shortcuts.muted": "打开已静音的用户列表",
"keyboard_shortcuts.my_profile": "打开你的个人资料",
"keyboard_shortcuts.notifications": "打开通知栏",
"keyboard_shortcuts.open_media": "打开媒体",
@@ -257,13 +260,15 @@
"keyboard_shortcuts.toggle_hidden": "显示或隐藏被折叠的正文",
"keyboard_shortcuts.toggle_sensitivity": "显示/隐藏媒体",
"keyboard_shortcuts.toot": "发送新嘟文",
- "keyboard_shortcuts.unfocus": "取消输入",
+ "keyboard_shortcuts.unfocus": "取消输入/搜索",
"keyboard_shortcuts.up": "在列表中让光标上移",
"lightbox.close": "关闭",
"lightbox.compress": "返回图片全览",
"lightbox.expand": "放大查看图片",
"lightbox.next": "下一个",
"lightbox.previous": "上一个",
+ "limited_account_hint.action": "仍然显示个人资料",
+ "limited_account_hint.title": "此个人资料已被服务器监察员隐藏。",
"lists.account.add": "添加到列表",
"lists.account.remove": "从列表中移除",
"lists.delete": "删除列表",
@@ -279,10 +284,10 @@
"lists.subheading": "你的列表",
"load_pending": "{count} 项",
"loading_indicator.label": "加载中……",
- "media_gallery.toggle_visible": "隐藏 {number} 张图片",
+ "media_gallery.toggle_visible": "隐藏图片",
"missing_indicator.label": "找不到内容",
"missing_indicator.sublabel": "无法找到此资源",
- "mute_modal.duration": "持续期间",
+ "mute_modal.duration": "持续时长",
"mute_modal.hide_notifications": "同时隐藏来自这个用户的通知?",
"mute_modal.indefinite": "无期限",
"navigation_bar.apps": "移动应用",
@@ -292,7 +297,7 @@
"navigation_bar.compose": "撰写新嘟文",
"navigation_bar.direct": "私信",
"navigation_bar.discover": "发现",
- "navigation_bar.domain_blocks": "已屏蔽的网站",
+ "navigation_bar.domain_blocks": "已屏蔽的域名",
"navigation_bar.edit_profile": "修改个人资料",
"navigation_bar.explore": "探索",
"navigation_bar.favourites": "喜欢",
@@ -316,23 +321,23 @@
"notification.mention": "{name} 提及了你",
"notification.own_poll": "你的投票已经结束",
"notification.poll": "你参与的一个投票已经结束",
- "notification.reblog": "{name} 转嘟了你的嘟文",
+ "notification.reblog": "{name} 转发了你的嘟文",
"notification.status": "{name} 刚刚发嘟",
"notification.update": "{name} 编辑了嘟文",
"notifications.clear": "清空通知列表",
"notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
"notifications.column_settings.admin.sign_up": "新注册:",
"notifications.column_settings.alert": "桌面通知",
- "notifications.column_settings.favourite": "当你的嘟文被喜欢时:",
+ "notifications.column_settings.favourite": "喜欢:",
"notifications.column_settings.filter_bar.advanced": "显示所有类别",
"notifications.column_settings.filter_bar.category": "快速过滤栏",
"notifications.column_settings.filter_bar.show_bar": "显示过滤栏",
- "notifications.column_settings.follow": "当有人关注你时:",
- "notifications.column_settings.follow_request": "新的关注请求:",
- "notifications.column_settings.mention": "当有人在嘟文中提及你时:",
+ "notifications.column_settings.follow": "新关注者:",
+ "notifications.column_settings.follow_request": "新关注请求:",
+ "notifications.column_settings.mention": "提及:",
"notifications.column_settings.poll": "投票结果:",
"notifications.column_settings.push": "推送通知",
- "notifications.column_settings.reblog": "当有人转嘟了你的嘟文时:",
+ "notifications.column_settings.reblog": "转嘟:",
"notifications.column_settings.show": "在通知栏显示",
"notifications.column_settings.sound": "播放音效",
"notifications.column_settings.status": "新嘟文:",
@@ -358,7 +363,7 @@
"picture_in_picture.restore": "恢复",
"poll.closed": "已关闭",
"poll.refresh": "刷新",
- "poll.total_people": "{count}人",
+ "poll.total_people": "{count} 人",
"poll.total_votes": "{count} 票",
"poll.vote": "投票",
"poll.voted": "你已经对这个答案投过票了",
@@ -367,30 +372,30 @@
"poll_button.remove_poll": "移除投票",
"privacy.change": "设置嘟文的可见范围",
"privacy.direct.long": "只有被提及的用户能看到",
- "privacy.direct.short": "私信",
- "privacy.private.long": "只有关注你的用户能看到",
+ "privacy.direct.short": "仅提到的人",
+ "privacy.private.long": "仅对关注者可见",
"privacy.private.short": "仅关注者",
- "privacy.public.long": "所有人可见,并会出现在公共时间轴上",
+ "privacy.public.long": "所有人可见",
"privacy.public.short": "公开",
- "privacy.unlisted.long": "所有人可见,但不会出现在公共时间轴上",
+ "privacy.unlisted.long": "对所有人可见,但不加入探索功能",
"privacy.unlisted.short": "不公开",
"refresh": "刷新",
"regeneration_indicator.label": "加载中……",
"regeneration_indicator.sublabel": "你的主页动态正在准备中!",
- "relative_time.days": "{number}天",
+ "relative_time.days": "{number} 天",
"relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前",
"relative_time.full.hours": "{number, plural, one {# 小时} other {# 小时}}前",
"relative_time.full.just_now": "刚刚",
"relative_time.full.minutes": "{number, plural, one {# 分钟} other {# 分钟}}前",
"relative_time.full.seconds": "{number, plural, one {# 秒} other {# 秒}}前",
- "relative_time.hours": "{number}时",
+ "relative_time.hours": "{number} 时",
"relative_time.just_now": "刚刚",
- "relative_time.minutes": "{number}分",
- "relative_time.seconds": "{number}秒",
+ "relative_time.minutes": "{number} 分",
+ "relative_time.seconds": "{number} 秒",
"relative_time.today": "今天",
"reply_indicator.cancel": "取消",
"report.block": "屏蔽",
- "report.block_explanation": "你不会看到他们的帖子。他们也将无法看到你的帖子或关注你。他们将能够判断他们被屏蔽了。",
+ "report.block_explanation": "你将无法看到他们的帖子。他们也将无法看到你的帖子或关注你。他们将能够判断出他们被屏蔽了。",
"report.categories.other": "其他",
"report.categories.spam": "垃圾信息",
"report.categories.violation": "内容违反一条或多条服务器规则",
@@ -402,8 +407,8 @@
"report.comment.title": "还有什么你认为我们应该知道的吗?",
"report.forward": "转发举报至 {target}",
"report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?",
- "report.mute": "静音",
- "report.mute_explanation": "你将不会看到他们的嘟文。他们仍然可以关注你并看到你的嘟文,但他们不会知道他们被静音了。",
+ "report.mute": "隐藏",
+ "report.mute_explanation": "你将不会看到他们的嘟文。他们仍然可以关注你并看到你的嘟文,但他们不会知道你忽略了来自他们的信息。",
"report.next": "下一步",
"report.placeholder": "备注",
"report.reasons.dislike": "我不喜欢它",
@@ -417,7 +422,7 @@
"report.rules.subtitle": "选择所有适用选项",
"report.rules.title": "哪些规则被违反了?",
"report.statuses.subtitle": "选择所有适用选项",
- "report.statuses.title": "是否有任何嘟文可以支持这一报告?",
+ "report.statuses.title": "有任何帖子可以支持此报告吗?",
"report.submit": "提交",
"report.target": "举报 {target}",
"report.thanks.take_action": "以下是您控制您在 Mastodon 上能看到哪些内容的选项:",
@@ -425,10 +430,10 @@
"report.thanks.title": "不想看到这个内容?",
"report.thanks.title_actionable": "感谢提交举报,我们将会进行处理。",
"report.unfollow": "取消关注 @{name}",
- "report.unfollow_explanation": "你正在关注这个账户。如果要想在你的主页上不再看到他们的嘟文,请取消对他们的关注。",
+ "report.unfollow_explanation": "你正在关注此账户。如果要想在你的主页上不再看到他们的帖子,取消对他们的关注即可。",
"search.placeholder": "搜索",
"search_popout.search_format": "高级搜索格式",
- "search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的嘟文,以及其他用户公开的用户名、昵称和话题标签。",
+ "search_popout.tips.full_text": "输入关键词检索所有你发送、喜欢、转嘟过或提及到你的帖子,以及其他用户公开的用户名、昵称和话题标签。",
"search_popout.tips.hashtag": "话题标签",
"search_popout.tips.status": "嘟文",
"search_popout.tips.text": "输入关键词检索昵称、用户名和话题标签",
@@ -438,18 +443,18 @@
"search_results.hashtags": "话题标签",
"search_results.nothing_found": "无法找到符合这些搜索词的任何内容",
"search_results.statuses": "嘟文",
- "search_results.statuses_fts_disabled": "此Mastodon服务器未启用嘟文内容搜索。",
+ "search_results.statuses_fts_disabled": "此 Mastodon 服务器未启用帖子内容搜索。",
"search_results.total": "共 {count, number} 个结果",
"status.admin_account": "打开 @{name} 的管理界面",
- "status.admin_status": "打开这条嘟文的管理界面",
+ "status.admin_status": "打开此帖的管理界面",
"status.block": "屏蔽 @{name}",
"status.bookmark": "添加到书签",
- "status.cancel_reblog_private": "取消转嘟",
+ "status.cancel_reblog_private": "取消转贴",
"status.cannot_reblog": "这条嘟文不允许被转嘟",
"status.copy": "复制嘟文链接",
"status.delete": "删除",
- "status.detailed_status": "对话详情",
- "status.direct": "发送私信给 @{name}",
+ "status.detailed_status": "详细的对话视图",
+ "status.direct": "私信 @{name}",
"status.edit": "编辑",
"status.edited": "编辑于 {date}",
"status.edited_x_times": "共编辑 {count, plural, one {{count} 次} other {{count} 次}}",
@@ -463,11 +468,11 @@
"status.mention": "提及 @{name}",
"status.more": "更多",
"status.mute": "隐藏 @{name}",
- "status.mute_conversation": "将此对话静音",
+ "status.mute_conversation": "禁用此对话的消息提醒",
"status.open": "展开嘟文",
"status.pin": "在个人资料页面置顶",
"status.pinned": "置顶嘟文",
- "status.read_more": "阅读全文",
+ "status.read_more": "查看更多",
"status.reblog": "转嘟",
"status.reblog_private": "转嘟(可见者不变)",
"status.reblogged_by": "{name} 转嘟了",
@@ -480,18 +485,18 @@
"status.sensitive_warning": "敏感内容",
"status.share": "分享",
"status.show_less": "隐藏内容",
- "status.show_less_all": "隐藏所有内容",
+ "status.show_less_all": "隐藏全部内容",
"status.show_more": "显示更多",
- "status.show_more_all": "显示所有内容",
+ "status.show_more_all": "显示全部内容",
"status.show_thread": "显示全部对话",
"status.uncached_media_warning": "暂不可用",
- "status.unmute_conversation": "将此对话解除静音",
+ "status.unmute_conversation": "恢复此对话的通知提醒",
"status.unpin": "在个人资料页面取消置顶",
"suggestions.dismiss": "关闭建议",
"suggestions.header": "你可能会感兴趣…",
"tabs_bar.federated_timeline": "跨站",
"tabs_bar.home": "主页",
- "tabs_bar.local_timeline": "本站",
+ "tabs_bar.local_timeline": "本地",
"tabs_bar.notifications": "通知",
"tabs_bar.search": "搜索",
"time_remaining.days": "剩余 {number, plural, one {# 天} other {# 天}}",
@@ -506,15 +511,16 @@
"trends.counter_by_accounts": "{count, plural, one {{counter} 人} other {{counter} 人}}正在讨论",
"trends.trending_now": "现在流行",
"ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会丢失。",
- "units.short.billion": "{count}B",
- "units.short.million": "{count}M",
- "units.short.thousand": "{count}K",
+ "units.short.billion": "{count} B",
+ "units.short.million": "{count} M",
+ "units.short.thousand": "{count} K",
"upload_area.title": "将文件拖放到此处开始上传",
"upload_button.label": "上传图片、视频或音频",
"upload_error.limit": "文件大小超过限制。",
"upload_error.poll": "投票中不允许上传文件。",
"upload_form.audio_description": "为听障人士添加文字描述",
"upload_form.description": "为视觉障碍人士添加文字说明",
+ "upload_form.description_missing": "没有添加描述",
"upload_form.edit": "编辑",
"upload_form.thumbnail": "更改缩略图",
"upload_form.undo": "删除",
@@ -523,13 +529,13 @@
"upload_modal.apply": "应用",
"upload_modal.applying": "正在应用…",
"upload_modal.choose_image": "选择图像",
- "upload_modal.description_placeholder": "天地玄黄 宇宙洪荒 日月盈仄 辰宿列张",
+ "upload_modal.description_placeholder": "快狐跨懒狗",
"upload_modal.detect_text": "从图片中检测文本",
"upload_modal.edit_media": "编辑媒体",
"upload_modal.hint": "在预览图上点击或拖动圆圈,以选择缩略图的焦点。",
- "upload_modal.preparing_ocr": "正在准备文字识别……",
+ "upload_modal.preparing_ocr": "正在准备文字识别…",
"upload_modal.preview_label": "预览 ({ratio})",
- "upload_progress.label": "上传中……",
+ "upload_progress.label": "上传中…",
"video.close": "关闭视频",
"video.download": "下载文件",
"video.exit_fullscreen": "退出全屏",
@@ -539,5 +545,5 @@
"video.mute": "静音",
"video.pause": "暂停",
"video.play": "播放",
- "video.unmute": "取消静音"
+ "video.unmute": "解除禁音"
}
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index b60560cd1..d757b9daf 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -70,7 +70,7 @@
"column.blocks": "封鎖名單",
"column.bookmarks": "書籤",
"column.community": "本站時間軸",
- "column.direct": "個人訊息",
+ "column.direct": "Direct messages",
"column.directory": "瀏覽個人資料",
"column.domain_blocks": "封鎖的服務站",
"column.favourites": "最愛的文章",
@@ -92,8 +92,10 @@
"community.column_settings.local_only": "只顯示本站",
"community.column_settings.media_only": "只顯示多媒體",
"community.column_settings.remote_only": "只顯示外站",
- "compose_form.direct_message_warning": "這文章只有被提及的使用者才可以看到。",
+ "compose.language.change": "Change language",
+ "compose.language.search": "Search languages...",
"compose_form.direct_message_warning_learn_more": "了解更多",
+ "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。",
"compose_form.lock_disclaimer": "你的用戶狀態沒有{locked},任何人都能立即關注你,然後看到「只有關注者能看」的文章。",
"compose_form.lock_disclaimer.lock": "鎖定",
@@ -104,7 +106,7 @@
"compose_form.poll.remove_option": "移除此選擇",
"compose_form.poll.switch_to_multiple": "變更投票為允許多個選項",
"compose_form.poll.switch_to_single": "變更投票為限定單一選項",
- "compose_form.publish": "發文",
+ "compose_form.publish": "Publish",
"compose_form.publish_loud": "{publish}!",
"compose_form.save_changes": "Save changes",
"compose_form.sensitive.hide": "標記媒體為敏感內容",
@@ -147,6 +149,7 @@
"embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。",
"embed.preview": "看上去會是這樣:",
"emoji_button.activity": "活動",
+ "emoji_button.clear": "Clear",
"emoji_button.custom": "自訂",
"emoji_button.flags": "旗幟",
"emoji_button.food": "飲飲食食",
@@ -166,7 +169,7 @@
"empty_column.blocks": "你還沒有封鎖任何使用者。",
"empty_column.bookmarked_statuses": "你還沒建立任何書籤。這裡將會顯示你建立的書籤。",
"empty_column.community": "本站時間軸暫時未有內容,快寫一點東西來搶頭香啊!",
- "empty_column.direct": "你沒有個人訊息。當你發出或接收個人訊息,就會在這裡出現。",
+ "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
"empty_column.domain_blocks": "尚未隱藏任何網域。",
"empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
"empty_column.favourited_statuses": "你還沒收藏任何文章。這裡將會顯示你收藏的嘟文。",
@@ -231,7 +234,7 @@
"keyboard_shortcuts.column": "把標示移動到其中一列",
"keyboard_shortcuts.compose": "把標示移動到文字輸入區",
"keyboard_shortcuts.description": "描述",
- "keyboard_shortcuts.direct": "開啟私訊欄",
+ "keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "在列表往下移動",
"keyboard_shortcuts.enter": "打開文章",
"keyboard_shortcuts.favourite": "收藏文章",
@@ -264,6 +267,8 @@
"lightbox.expand": "擴大檢視",
"lightbox.next": "下一頁",
"lightbox.previous": "上一頁",
+ "limited_account_hint.action": "Show profile anyway",
+ "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
"lists.account.add": "新增到列表",
"lists.account.remove": "從列表刪除",
"lists.delete": "刪除列表",
@@ -290,7 +295,7 @@
"navigation_bar.bookmarks": "書籤",
"navigation_bar.community_timeline": "本站時間軸",
"navigation_bar.compose": "撰寫新文章",
- "navigation_bar.direct": "個人訊息",
+ "navigation_bar.direct": "Direct messages",
"navigation_bar.discover": "探索",
"navigation_bar.domain_blocks": "封鎖的服務站",
"navigation_bar.edit_profile": "修改個人資料",
@@ -367,12 +372,12 @@
"poll_button.remove_poll": "移除投票",
"privacy.change": "調整私隱設定",
"privacy.direct.long": "只有提及的使用者能看到",
- "privacy.direct.short": "私人訊息",
+ "privacy.direct.short": "Direct",
"privacy.private.long": "只有你的關注者能看到",
- "privacy.private.short": "關注者",
- "privacy.public.long": "在公共時間軸顯示",
+ "privacy.private.short": "Followers-only",
+ "privacy.public.long": "Visible for all",
"privacy.public.short": "公共",
- "privacy.unlisted.long": "公開,但不在公共時間軸顯示",
+ "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
"privacy.unlisted.short": "公開",
"refresh": "重新整理",
"regeneration_indicator.label": "載入中……",
@@ -515,6 +520,7 @@
"upload_error.poll": "不允許在投票上傳檔案。",
"upload_form.audio_description": "簡單描述內容給聽障人士",
"upload_form.description": "為視覺障礙人士添加文字說明",
+ "upload_form.description_missing": "No description added",
"upload_form.edit": "編輯",
"upload_form.thumbnail": "更改預覽圖",
"upload_form.undo": "刪除",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index f9366fe17..17d0b9998 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -1,19 +1,19 @@
{
"account.account_note_header": "備註",
- "account.add_or_remove_from_list": "從名單中新增或移除",
+ "account.add_or_remove_from_list": "從列表中新增或移除",
"account.badges.bot": "機器人",
"account.badges.group": "群組",
"account.block": "封鎖 @{name}",
"account.block_domain": "封鎖來自 {domain} 網域的所有內容",
"account.blocked": "已封鎖",
- "account.browse_more_on_origin_server": "在該伺服器的個人檔案頁上瀏覽更多",
+ "account.browse_more_on_origin_server": "於該伺服器的個人檔案頁上瀏覽更多",
"account.cancel_follow_request": "取消跟隨請求",
"account.direct": "傳私訊給 @{name}",
"account.disable_notifications": "取消來自 @{name} 嘟文的通知",
"account.domain_blocked": "已封鎖網域",
- "account.edit_profile": "編輯個人資料",
+ "account.edit_profile": "編輯個人檔案",
"account.enable_notifications": "當 @{name} 嘟文時通知我",
- "account.endorse": "在個人資料推薦對方",
+ "account.endorse": "在個人檔案推薦對方",
"account.follow": "跟隨",
"account.followers": "跟隨者",
"account.followers.empty": "尚未有人跟隨這位使用者。",
@@ -25,7 +25,7 @@
"account.hide_reblogs": "隱藏來自 @{name} 的轉嘟",
"account.joined": "加入於 {date}",
"account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限",
- "account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳戶的人。",
+ "account.locked_info": "此帳戶的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳號的人。",
"account.media": "媒體",
"account.mention": "提及 @{name}",
"account.moved_to": "{name} 已遷移至:",
@@ -36,13 +36,13 @@
"account.posts_with_replies": "嘟文與回覆",
"account.report": "檢舉 @{name}",
"account.requested": "正在等待核准。按一下以取消跟隨請求",
- "account.share": "分享 @{name} 的個人資料",
+ "account.share": "分享 @{name} 的個人檔案",
"account.show_reblogs": "顯示來自 @{name} 的嘟文",
"account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文",
"account.unblock": "取消封鎖 @{name}",
"account.unblock_domain": "取消封鎖域名 {domain}",
"account.unblock_short": "解除封鎖",
- "account.unendorse": "不再於個人資料頁面推薦對方",
+ "account.unendorse": "不再於個人檔案頁面推薦對方",
"account.unfollow": "取消跟隨",
"account.unmute": "取消靜音 @{name}",
"account.unmute_notifications": "重新接收來自 @{name} 的通知",
@@ -53,7 +53,7 @@
"admin.dashboard.retention.average": "平均",
"admin.dashboard.retention.cohort": "註冊月份",
"admin.dashboard.retention.cohort_size": "新使用者",
- "alert.rate_limited.message": "請在 {retry_time, time, medium} 後重試",
+ "alert.rate_limited.message": "請在 {retry_time, time, medium} 後重試。",
"alert.rate_limited.title": "已限速",
"alert.unexpected.message": "發生了非預期的錯誤。",
"alert.unexpected.title": "哎呀!",
@@ -69,14 +69,14 @@
"bundle_modal_error.retry": "重試",
"column.blocks": "已封鎖的使用者",
"column.bookmarks": "書籤",
- "column.community": "本機時間軸",
+ "column.community": "本站時間軸",
"column.direct": "私訊",
- "column.directory": "瀏覽個人資料",
+ "column.directory": "瀏覽個人檔案",
"column.domain_blocks": "已封鎖的網域",
"column.favourites": "最愛",
"column.follow_requests": "跟隨請求",
"column.home": "首頁",
- "column.lists": "名單",
+ "column.lists": "列表",
"column.mutes": "已靜音的使用者",
"column.notifications": "通知",
"column.pins": "釘選的嘟文",
@@ -89,13 +89,15 @@
"column_header.show_settings": "顯示設定",
"column_header.unpin": "取消釘選",
"column_subheading.settings": "設定",
- "community.column_settings.local_only": "只有本機",
+ "community.column_settings.local_only": "只有本站",
"community.column_settings.media_only": "只有媒體",
"community.column_settings.remote_only": "只有遠端",
- "compose_form.direct_message_warning": "這條嘟文只有被提及的使用者才看得到。",
+ "compose.language.change": "變更語言",
+ "compose.language.search": "搜尋語言...",
"compose_form.direct_message_warning_learn_more": "了解更多",
+ "compose_form.encryption_warning": "Mastodon 上的嘟文並未端到端加密。請不要透過 Mastodon 分享任何敏感資訊。",
"compose_form.hashtag_warning": "由於這則嘟文設定為「不公開」,它將不會被列於任何主題標籤下。只有公開的嘟文才能藉由主題標籤找到。",
- "compose_form.lock_disclaimer": "您的帳戶尚未{locked}。任何人都能關注您並看到您設定成只有跟隨者能看的嘟文。",
+ "compose_form.lock_disclaimer": "您的帳號尚未 {locked}。任何人皆能跟隨您並看到您設定成只有跟隨者能看的嘟文。",
"compose_form.lock_disclaimer.lock": "上鎖",
"compose_form.placeholder": "正在想些什麼嗎?",
"compose_form.poll.add_option": "新增選項",
@@ -116,26 +118,26 @@
"confirmation_modal.cancel": "取消",
"confirmations.block.block_and_report": "封鎖並檢舉",
"confirmations.block.confirm": "封鎖",
- "confirmations.block.message": "確定要封鎖 {name} 嗎?",
+ "confirmations.block.message": "您確定要封鎖 {name} ?",
"confirmations.delete.confirm": "刪除",
"confirmations.delete.message": "您確定要刪除這則嘟文?",
"confirmations.delete_list.confirm": "刪除",
- "confirmations.delete_list.message": "確定永久刪除此名單?",
+ "confirmations.delete_list.message": "您確定要永久刪除此列表?",
"confirmations.discard_edit_media.confirm": "捨棄",
"confirmations.discard_edit_media.message": "您在媒體描述或預覽區塊有未儲存的變更。是否要捨棄這些變更?",
"confirmations.domain_block.confirm": "隱藏整個域名",
- "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳帳戶能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。",
+ "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 網域嗎?大部分情況下,您只需要封鎖或靜音少數特定的帳號能滿足需求了。您將不能在任何公開的時間軸及通知中看到來自此網域的內容。您來自該網域的跟隨者也將被移除。",
"confirmations.logout.confirm": "登出",
- "confirmations.logout.message": "確定要登出嗎?",
+ "confirmations.logout.message": "您確定要登出嗎?",
"confirmations.mute.confirm": "靜音",
"confirmations.mute.explanation": "這將會隱藏來自他們的嘟文與通知,但是他們還是可以查閱您的嘟文與跟隨您。",
- "confirmations.mute.message": "確定靜音 {name} ?",
+ "confirmations.mute.message": "您確定要靜音 {name} ?",
"confirmations.redraft.confirm": "刪除並重新編輯",
- "confirmations.redraft.message": "確定刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及最愛,且回覆這則的嘟文將會變成獨立的嘟文。",
+ "confirmations.redraft.message": "您確定要刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及最愛,且回覆這則的嘟文將會變成獨立的嘟文。",
"confirmations.reply.confirm": "回覆",
"confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?",
"confirmations.unfollow.confirm": "取消跟隨",
- "confirmations.unfollow.message": "確定要取消跟隨 {name} 嗎?",
+ "confirmations.unfollow.message": "您確定要取消跟隨 {name} 嗎?",
"conversation.delete": "刪除對話",
"conversation.mark_as_read": "標記為已讀",
"conversation.open": "檢視對話",
@@ -147,6 +149,7 @@
"embed.instructions": "要在您的網站嵌入此嘟文,請複製以下程式碼。",
"embed.preview": "它將顯示成這樣:",
"emoji_button.activity": "活動",
+ "emoji_button.clear": "清除",
"emoji_button.custom": "自訂",
"emoji_button.flags": "旗幟",
"emoji_button.food": "食物 & 飲料",
@@ -160,12 +163,12 @@
"emoji_button.search_results": "搜尋結果",
"emoji_button.symbols": "符號",
"emoji_button.travel": "旅遊與地點",
- "empty_column.account_suspended": "帳戶被暫停",
+ "empty_column.account_suspended": "帳號被暫停",
"empty_column.account_timeline": "這裡還沒有嘟文!",
- "empty_column.account_unavailable": "無法取得個人資料",
+ "empty_column.account_unavailable": "無法取得個人檔案",
"empty_column.blocks": "您還沒有封鎖任何使用者。",
"empty_column.bookmarked_statuses": "您還沒建立任何書籤。當您建立書簽時,它將於此顯示。",
- "empty_column.community": "本機時間軸是空的。快公開嘟些文搶頭香啊!",
+ "empty_column.community": "本站時間軸是空的。快公開嘟些文搶頭香啊!",
"empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。",
"empty_column.domain_blocks": "尚未封鎖任何網域。",
"empty_column.explore_statuses": "目前沒有熱門討論,請稍候再回來看看!",
@@ -176,8 +179,8 @@
"empty_column.hashtag": "這個主題標籤下什麼也沒有。",
"empty_column.home": "您的首頁時間軸是空的!前往 {suggestions} 或使用搜尋功能來認識其他人。",
"empty_column.home.suggestions": "檢視部份建議",
- "empty_column.list": "這份名單還沒有東西。當此名單的成員嘟出了新的嘟文時,它們就會顯示於此。",
- "empty_column.lists": "您還沒有建立任何名單。這裡將會顯示您所建立的名單。",
+ "empty_column.list": "這份列表下什麼也沒有。當此列表的成員嘟出了新的嘟文時,它們就會顯示於此。",
+ "empty_column.lists": "您還沒有建立任何列表。這裡將會顯示您所建立的列表。",
"empty_column.mutes": "您尚未靜音任何使用者。",
"empty_column.notifications": "您尚未收到任何通知,和別人互動開啟對話吧。",
"empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或著自己跟隨其他伺服器的使用者後就會有嘟文出現了",
@@ -194,19 +197,19 @@
"explore.trending_statuses": "嘟文",
"explore.trending_tags": "主題標籤",
"follow_recommendations.done": "完成",
- "follow_recommendations.heading": "跟隨您想檢視其貼文的人!這裡有一些建議。",
- "follow_recommendations.lead": "來自您跟隨的人的貼文將會按時間順序顯示在您的家 feed 上。不要害怕犯錯,您隨時都可以取消跟隨其他人!",
+ "follow_recommendations.heading": "跟隨您想檢視其嘟文的人!這裡有一些建議。",
+ "follow_recommendations.lead": "來自您跟隨的人之嘟文將會按時間順序顯示在您的首頁時間軸上。不要害怕犯錯,您隨時都可以取消跟隨其他人!",
"follow_request.authorize": "授權",
"follow_request.reject": "拒絕",
- "follow_requests.unlocked_explanation": "即便您的帳戶未被鎖定,{domain} 的管理員認為您可能想要自己審核這些帳戶的跟隨請求。",
+ "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的管理員認為您可能想要自己審核這些帳號的跟隨請求。",
"generic.saved": "已儲存",
"getting_started.developers": "開發者",
- "getting_started.directory": "個人資料目錄",
+ "getting_started.directory": "個人檔案目錄",
"getting_started.documentation": "文件",
"getting_started.heading": "開始使用",
"getting_started.invite": "邀請使用者",
"getting_started.open_source_notice": "Mastodon 是開源軟體。您可以在 GitHub {github} 上貢獻或是回報問題。",
- "getting_started.security": "帳戶安全性設定",
+ "getting_started.security": "帳號安全性設定",
"getting_started.terms": "服務條款",
"hashtag.column_header.tag_mode.all": "以及 {additional}",
"hashtag.column_header.tag_mode.any": "或是 {additional}",
@@ -232,68 +235,70 @@
"keyboard_shortcuts.compose": "將焦點移至撰寫文字區塊",
"keyboard_shortcuts.description": "說明",
"keyboard_shortcuts.direct": "開啟私訊欄",
- "keyboard_shortcuts.down": "在名單中往下移動",
+ "keyboard_shortcuts.down": "在列表中往下移動",
"keyboard_shortcuts.enter": "檢視嘟文",
"keyboard_shortcuts.favourite": "加到最愛",
- "keyboard_shortcuts.favourites": "開啟最愛名單",
+ "keyboard_shortcuts.favourites": "開啟最愛列表",
"keyboard_shortcuts.federated": "開啟聯邦時間軸",
"keyboard_shortcuts.heading": "鍵盤快速鍵",
"keyboard_shortcuts.home": "開啟首頁時間軸",
"keyboard_shortcuts.hotkey": "快速鍵",
"keyboard_shortcuts.legend": "顯示此圖例",
- "keyboard_shortcuts.local": "開啟本機時間軸",
+ "keyboard_shortcuts.local": "開啟本站時間軸",
"keyboard_shortcuts.mention": "提及作者",
- "keyboard_shortcuts.muted": "開啟靜音使用者名單",
- "keyboard_shortcuts.my_profile": "開啟個人資料頁面",
+ "keyboard_shortcuts.muted": "開啟靜音使用者列表",
+ "keyboard_shortcuts.my_profile": "開啟個人檔案頁面",
"keyboard_shortcuts.notifications": "開啟通知欄",
"keyboard_shortcuts.open_media": "開啟媒體",
- "keyboard_shortcuts.pinned": "開啟釘選的嘟文名單",
- "keyboard_shortcuts.profile": "開啟作者的個人資料頁面",
+ "keyboard_shortcuts.pinned": "開啟釘選的嘟文列表",
+ "keyboard_shortcuts.profile": "開啟作者的個人檔案頁面",
"keyboard_shortcuts.reply": "回應嘟文",
- "keyboard_shortcuts.requests": "開啟跟隨請求名單",
+ "keyboard_shortcuts.requests": "開啟跟隨請求列表",
"keyboard_shortcuts.search": "將焦點移至搜尋框",
"keyboard_shortcuts.spoilers": "顯示或隱藏被折疊的正文",
"keyboard_shortcuts.start": "開啟「開始使用」欄位",
- "keyboard_shortcuts.toggle_hidden": "顯示/隱藏在內容警告之後的正文",
- "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體",
+ "keyboard_shortcuts.toggle_hidden": "顯示或隱藏在內容警告之後的正文",
+ "keyboard_shortcuts.toggle_sensitivity": "顯示或隱藏媒體",
"keyboard_shortcuts.toot": "開始發出新嘟文",
"keyboard_shortcuts.unfocus": "取消輸入文字區塊 / 搜尋的焦點",
- "keyboard_shortcuts.up": "在名單中往上移動",
+ "keyboard_shortcuts.up": "在列表中往上移動",
"lightbox.close": "關閉",
"lightbox.compress": "折疊圖片檢視框",
"lightbox.expand": "展開圖片檢視框",
"lightbox.next": "下一步",
"lightbox.previous": "上一步",
- "lists.account.add": "新增至名單",
- "lists.account.remove": "從名單中移除",
- "lists.delete": "刪除名單",
- "lists.edit": "編輯名單",
+ "limited_account_hint.action": "一律顯示個人檔案",
+ "limited_account_hint.title": "此個人檔案已被您伺服器的管理員隱藏。",
+ "lists.account.add": "新增至列表",
+ "lists.account.remove": "從列表中移除",
+ "lists.delete": "刪除列表",
+ "lists.edit": "編輯列表",
"lists.edit.submit": "變更標題",
- "lists.new.create": "新增名單",
- "lists.new.title_placeholder": "新名單標題",
+ "lists.new.create": "新增列表",
+ "lists.new.title_placeholder": "新列表標題",
"lists.replies_policy.followed": "任何跟隨的使用者",
- "lists.replies_policy.list": "名單成員",
+ "lists.replies_policy.list": "列表成員",
"lists.replies_policy.none": "沒有人",
"lists.replies_policy.title": "顯示回覆:",
"lists.search": "搜尋您跟隨的使用者",
- "lists.subheading": "您的名單",
+ "lists.subheading": "您的列表",
"load_pending": "{count, plural, one {# 個新項目} other {# 個新項目}}",
"loading_indicator.label": "讀取中...",
"media_gallery.toggle_visible": "切換可見性",
"missing_indicator.label": "找不到",
"missing_indicator.sublabel": "找不到此資源",
"mute_modal.duration": "持續時間",
- "mute_modal.hide_notifications": "隱藏來自這位使用者的通知?",
+ "mute_modal.hide_notifications": "是否隱藏來自這位使用者的通知?",
"mute_modal.indefinite": "無期限",
"navigation_bar.apps": "行動應用程式",
"navigation_bar.blocks": "封鎖使用者",
"navigation_bar.bookmarks": "書籤",
- "navigation_bar.community_timeline": "本機時間軸",
+ "navigation_bar.community_timeline": "本站時間軸",
"navigation_bar.compose": "撰寫新嘟文",
"navigation_bar.direct": "私訊",
"navigation_bar.discover": "探索",
"navigation_bar.domain_blocks": "隱藏的網域",
- "navigation_bar.edit_profile": "編輯個人資料",
+ "navigation_bar.edit_profile": "編輯個人檔案",
"navigation_bar.explore": "探索",
"navigation_bar.favourites": "最愛",
"navigation_bar.filters": "靜音詞彙",
@@ -301,7 +306,7 @@
"navigation_bar.follows_and_followers": "跟隨中與跟隨者",
"navigation_bar.info": "關於此伺服器",
"navigation_bar.keyboard_shortcuts": "快速鍵",
- "navigation_bar.lists": "名單",
+ "navigation_bar.lists": "列表",
"navigation_bar.logout": "登出",
"navigation_bar.mutes": "靜音的使用者",
"navigation_bar.personal": "個人",
@@ -320,7 +325,7 @@
"notification.status": "{name} 剛剛嘟文",
"notification.update": "{name} 編輯了嘟文",
"notifications.clear": "清除通知",
- "notifications.clear_confirmation": "確定要永久清除您的通知嗎?",
+ "notifications.clear_confirmation": "您確定要永久清除您的通知嗎?",
"notifications.column_settings.admin.sign_up": "新註冊帳號:",
"notifications.column_settings.alert": "桌面通知",
"notifications.column_settings.favourite": "最愛:",
@@ -345,13 +350,13 @@
"notifications.filter.follows": "跟隨的使用者",
"notifications.filter.mentions": "提及",
"notifications.filter.polls": "投票結果",
- "notifications.filter.statuses": "已跟隨使用者的最新動態",
+ "notifications.filter.statuses": "您跟隨的使用者之最新動態",
"notifications.grant_permission": "授予權限",
"notifications.group": "{count} 條通知",
"notifications.mark_as_read": "將所有通知都標記為已讀",
"notifications.permission_denied": "由於之前拒絕了瀏覽器請求,因此桌面通知不可用",
- "notifications.permission_denied_alert": "因為之前瀏覽器權限被拒絕,無法啟用桌面通知",
- "notifications.permission_required": "因為尚未授予所需的權限,所以桌面通知不可用。",
+ "notifications.permission_denied_alert": "由於之前瀏覽器權限被拒絕,無法啟用桌面通知",
+ "notifications.permission_required": "由於尚未授予所需的權限,所以桌面通知不可用。",
"notifications_permission_banner.enable": "啟用桌面通知",
"notifications_permission_banner.how_to_control": "啟用桌面通知以在 Mastodon 沒有開啟的時候接收通知。在已經啟用桌面通知的時候,您可以透過上面的 {icon} 按鈕準確的控制哪些類型的互動會產生桌面通知。",
"notifications_permission_banner.title": "不要錯過任何東西!",
@@ -367,30 +372,30 @@
"poll_button.remove_poll": "移除投票",
"privacy.change": "調整嘟文隱私狀態",
"privacy.direct.long": "只有被提及的使用者能看到",
- "privacy.direct.short": "私訊",
+ "privacy.direct.short": "僅限提及的人",
"privacy.private.long": "只有跟隨您的使用者能看到",
- "privacy.private.short": "僅跟隨者",
- "privacy.public.long": "公開,且顯示於公開時間軸",
+ "privacy.private.short": "僅限跟隨者",
+ "privacy.public.long": "對所有人可見",
"privacy.public.short": "公開",
- "privacy.unlisted.long": "公開,但不會顯示在公開時間軸",
+ "privacy.unlisted.long": "對所有人可見,但選擇退出探索功能",
"privacy.unlisted.short": "不公開",
"refresh": "重新整理",
"regeneration_indicator.label": "載入中…",
- "regeneration_indicator.sublabel": "您的主頁時間軸正在準備中!",
+ "regeneration_indicator.sublabel": "您的首頁時間軸正在準備中!",
"relative_time.days": "{number} 天",
"relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前",
"relative_time.full.hours": "{number, plural, one {# 小時} other {# 小時}}前",
"relative_time.full.just_now": "剛剛",
"relative_time.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}前",
"relative_time.full.seconds": "{number, plural, one {# 秒} other {# 秒}}前",
- "relative_time.hours": "{number}小時前",
+ "relative_time.hours": "{number} 小時前",
"relative_time.just_now": "剛剛",
- "relative_time.minutes": "{number} 分前",
+ "relative_time.minutes": "{number} 分鐘前",
"relative_time.seconds": "{number} 秒",
"relative_time.today": "今天",
"reply_indicator.cancel": "取消",
"report.block": "封鎖",
- "report.block_explanation": "您將不再看到他們的嘟文。他們將無法看到您的嘟文或是跟隨您。他們會被告知他們已被封鎖。",
+ "report.block_explanation": "您將不再看到他們的嘟文。他們將無法看到您的嘟文或是跟隨您。他們會發現他們已被封鎖。",
"report.categories.other": "其他",
"report.categories.spam": "垃圾訊息",
"report.categories.violation": "內容違反一項或多項伺服器條款",
@@ -401,7 +406,7 @@
"report.close": "已完成",
"report.comment.title": "有什麼其他您想讓我們知道的嗎?",
"report.forward": "轉寄到 {target}",
- "report.forward_hint": "這個帳戶屬於其他伺服器。要像該伺服器發送匿名的檢舉訊息嗎?",
+ "report.forward_hint": "這個帳號屬於其他伺服器。要向該伺服器發送匿名的檢舉訊息嗎?",
"report.mute": "靜音",
"report.mute_explanation": "您將不再看到他們的嘟文。他們仍能可以跟隨您以及察看您的嘟文,並且不會知道他們已被靜音。",
"report.next": "繼續",
@@ -425,13 +430,13 @@
"report.thanks.title": "不想再看到這個?",
"report.thanks.title_actionable": "感謝您的檢舉,我們將會著手處理。",
"report.unfollow": "取消跟隨 @{name}",
- "report.unfollow_explanation": "您正在跟隨此帳號。如不欲於首頁再見到他們的嘟文,請取消跟隨。",
+ "report.unfollow_explanation": "您正在跟隨此帳號。如不欲於首頁時間軸再見到他們的嘟文,請取消跟隨。",
"search.placeholder": "搜尋",
"search_popout.search_format": "進階搜尋格式",
- "search_popout.tips.full_text": "輸入簡單的文字,搜尋由您撰寫、最愛、轉嘟或提您的嘟文,以及與關鍵詞匹配的使用者名稱、帳戶顯示名稱和主題標籤。",
+ "search_popout.tips.full_text": "輸入簡單的文字,搜尋由您撰寫、最愛、轉嘟或提您的嘟文,以及與關鍵詞匹配的使用者名稱、帳號顯示名稱和主題標籤。",
"search_popout.tips.hashtag": "主題標籤",
"search_popout.tips.status": "嘟文",
- "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤",
+ "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳號名稱與標籤",
"search_popout.tips.user": "使用者",
"search_results.accounts": "使用者",
"search_results.all": "全部",
@@ -465,14 +470,14 @@
"status.mute": "靜音 @{name}",
"status.mute_conversation": "靜音對話",
"status.open": "展開此嘟文",
- "status.pin": "釘選到個人資料頁",
+ "status.pin": "釘選到個人檔案頁面",
"status.pinned": "釘選的嘟文",
"status.read_more": "閱讀更多",
"status.reblog": "轉嘟",
"status.reblog_private": "轉嘟給原有關注者",
"status.reblogged_by": "{name} 轉嘟了",
"status.reblogs.empty": "還沒有人轉嘟過這則嘟文。當有人轉嘟時,它將於此顯示。",
- "status.redraft": "刪除 & 編輯",
+ "status.redraft": "刪除並重新編輯",
"status.remove_bookmark": "移除書籤",
"status.reply": "回覆",
"status.replyAll": "回覆討論串",
@@ -486,17 +491,17 @@
"status.show_thread": "顯示討論串",
"status.uncached_media_warning": "無法使用",
"status.unmute_conversation": "解除此對話的靜音",
- "status.unpin": "從個人頁面解除釘選",
+ "status.unpin": "從個人檔案頁面解除釘選",
"suggestions.dismiss": "關閉建議",
"suggestions.header": "您可能對這些東西有興趣…",
"tabs_bar.federated_timeline": "聯邦宇宙",
"tabs_bar.home": "首頁",
- "tabs_bar.local_timeline": "本機",
+ "tabs_bar.local_timeline": "本站",
"tabs_bar.notifications": "通知",
"tabs_bar.search": "搜尋",
- "time_remaining.days": "剩餘{number, plural, one {# 天} other {# 天}}",
- "time_remaining.hours": "剩餘{number, plural, one {# 小時} other {# 小時}}",
- "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}",
+ "time_remaining.days": "剩餘 {number, plural, one {# 天} other {# 天}}",
+ "time_remaining.hours": "剩餘 {number, plural, one {# 小時} other {# 小時}}",
+ "time_remaining.minutes": "剩餘 {number, plural, one {# 分鐘} other {# 分鐘}}",
"time_remaining.moments": "剩餘時間",
"time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}",
"timeline_hint.remote_resource_not_displayed": "不會顯示來自其他伺服器的 {resource}",
@@ -504,7 +509,7 @@
"timeline_hint.resources.follows": "正在跟隨",
"timeline_hint.resources.statuses": "更早的嘟文",
"trends.counter_by_accounts": "{count, plural,one {{counter} 人}other {{counter} 人}}正在討論",
- "trends.trending_now": "目前趨勢",
+ "trends.trending_now": "現正熱門",
"ui.beforeunload": "如果離開 Mastodon,您的草稿將會不見。",
"units.short.billion": "{count}B",
"units.short.million": "{count}M",
@@ -515,10 +520,11 @@
"upload_error.poll": "不允許在投票中上傳檔案。",
"upload_form.audio_description": "描述內容給聽障人士",
"upload_form.description": "為視障人士增加文字說明",
+ "upload_form.description_missing": "沒有任何描述",
"upload_form.edit": "編輯",
"upload_form.thumbnail": "更改預覽圖",
"upload_form.undo": "刪除",
- "upload_form.video_description": "描述給聽障或視障人士",
+ "upload_form.video_description": "描述內容給聽障或視障人士",
"upload_modal.analyzing_picture": "正在分析圖片…",
"upload_modal.apply": "套用",
"upload_modal.applying": "正在套用⋯⋯",
diff --git a/app/javascript/mastodon/reducers/accounts.js b/app/javascript/mastodon/reducers/accounts.js
index 530ed8e60..b5589668c 100644
--- a/app/javascript/mastodon/reducers/accounts.js
+++ b/app/javascript/mastodon/reducers/accounts.js
@@ -1,4 +1,5 @@
-import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
+import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from 'mastodon/actions/importer';
+import { ACCOUNT_REVEAL } from 'mastodon/actions/accounts';
import { Map as ImmutableMap, fromJS } from 'immutable';
const initialState = ImmutableMap();
@@ -10,6 +11,8 @@ const normalizeAccount = (state, account) => {
delete account.following_count;
delete account.statuses_count;
+ account.hidden = state.getIn([account.id, 'hidden']) === false ? false : account.limited;
+
return state.set(account.id, fromJS(account));
};
@@ -27,6 +30,8 @@ export default function accounts(state = initialState, action) {
return normalizeAccount(state, action.account);
case ACCOUNTS_IMPORT:
return normalizeAccounts(state, action.accounts);
+ case ACCOUNT_REVEAL:
+ return state.setIn([action.id, 'hidden'], false);
default:
return state;
}
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index ea882a71f..7aac87b5c 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -28,6 +28,7 @@ import {
COMPOSE_SPOILERNESS_CHANGE,
COMPOSE_SPOILER_TEXT_CHANGE,
COMPOSE_VISIBILITY_CHANGE,
+ COMPOSE_LANGUAGE_CHANGE,
COMPOSE_COMPOSING_CHANGE,
COMPOSE_EMOJI_INSERT,
COMPOSE_UPLOAD_CHANGE_REQUEST,
@@ -79,6 +80,7 @@ const initialState = ImmutableMap({
suggestions: ImmutableList(),
default_privacy: 'public',
default_sensitive: false,
+ default_language: 'en',
resetFileKey: Math.floor((Math.random() * 0x10000)),
idempotencyKey: null,
tagHistory: ImmutableList(),
@@ -117,7 +119,8 @@ function clearAll(state) {
map.set('is_changing_upload', false);
map.set('in_reply_to', null);
map.set('privacy', state.get('default_privacy'));
- map.set('sensitive', false);
+ map.set('sensitive', state.get('default_sensitive'));
+ map.set('language', state.get('default_language'));
map.update('media_attachments', list => list.clear());
map.set('poll', null);
map.set('idempotencyKey', uuid());
@@ -325,6 +328,10 @@ export default function compose(state = initialState, action) {
map.set('preselectDate', new Date());
map.set('idempotencyKey', uuid());
+ if (action.status.get('language')) {
+ map.set('language', action.status.get('language'));
+ }
+
if (action.status.get('spoiler_text').length > 0) {
map.set('spoiler', true);
map.set('spoiler_text', action.status.get('spoiler_text'));
@@ -440,6 +447,7 @@ export default function compose(state = initialState, action) {
map.set('caretPosition', null);
map.set('idempotencyKey', uuid());
map.set('sensitive', action.status.get('sensitive'));
+ map.set('language', action.status.get('language'));
if (action.status.get('spoiler_text').length > 0) {
map.set('spoiler', true);
@@ -468,6 +476,7 @@ export default function compose(state = initialState, action) {
map.set('caretPosition', null);
map.set('idempotencyKey', uuid());
map.set('sensitive', action.status.get('sensitive'));
+ map.set('language', action.status.get('language'));
if (action.spoiler_text.length > 0) {
map.set('spoiler', true);
@@ -497,6 +506,8 @@ export default function compose(state = initialState, action) {
return state.updateIn(['poll', 'options'], options => options.delete(action.index));
case COMPOSE_POLL_SETTINGS_CHANGE:
return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple));
+ case COMPOSE_LANGUAGE_CHANGE:
+ return state.set('language', action.language);
default:
return state;
}
diff --git a/app/javascript/mastodon/reducers/filters.js b/app/javascript/mastodon/reducers/filters.js
index 33f0c6732..14b704027 100644
--- a/app/javascript/mastodon/reducers/filters.js
+++ b/app/javascript/mastodon/reducers/filters.js
@@ -1,10 +1,34 @@
-import { FILTERS_FETCH_SUCCESS } from '../actions/filters';
-import { List as ImmutableList, fromJS } from 'immutable';
+import { FILTERS_IMPORT } from '../actions/importer';
+import { Map as ImmutableMap, is, fromJS } from 'immutable';
-export default function filters(state = ImmutableList(), action) {
+const normalizeFilter = (state, filter) => {
+ const normalizedFilter = fromJS({
+ id: filter.id,
+ title: filter.title,
+ context: filter.context,
+ filter_action: filter.filter_action,
+ expires_at: filter.expires_at ? Date.parse(filter.expires_at) : null,
+ });
+
+ if (is(state.get(filter.id), normalizedFilter)) {
+ return state;
+ } else {
+ return state.set(filter.id, normalizedFilter);
+ }
+};
+
+const normalizeFilters = (state, filters) => {
+ filters.forEach(filter => {
+ state = normalizeFilter(state, filter);
+ });
+
+ return state;
+};
+
+export default function filters(state = ImmutableMap(), action) {
switch(action.type) {
- case FILTERS_FETCH_SUCCESS:
- return fromJS(action.filters);
+ case FILTERS_IMPORT:
+ return normalizeFilters(state, action.filters);
default:
return state;
}
diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js
index b587b6d0f..4b460bc10 100644
--- a/app/javascript/mastodon/reducers/notifications.js
+++ b/app/javascript/mastodon/reducers/notifications.js
@@ -28,7 +28,7 @@ import {
} from '../actions/app';
import { DOMAIN_BLOCK_SUCCESS } from 'mastodon/actions/domain_blocks';
import { TIMELINE_DELETE, TIMELINE_DISCONNECT } from '../actions/timelines';
-import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
+import { fromJS, Map as ImmutableMap, List as ImmutableList } from 'immutable';
import compareId from '../compare_id';
const initialState = ImmutableMap({
@@ -52,6 +52,7 @@ const notificationToMap = notification => ImmutableMap({
account: notification.account.id,
created_at: notification.created_at,
status: notification.status ? notification.status.id : null,
+ report: notification.report ? fromJS(notification.report) : null,
});
const normalizeNotification = (state, notification, usePendingItems) => {
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 39639f3dc..f9d3236e4 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -3,6 +3,7 @@ import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications';
import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE, COLUMN_PARAMS_CHANGE } from '../actions/columns';
import { STORE_HYDRATE } from '../actions/store';
import { EMOJI_USE } from '../actions/emojis';
+import { LANGUAGE_USE } from '../actions/languages';
import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists';
import { Map as ImmutableMap, fromJS } from 'immutable';
import uuid from '../uuid';
@@ -38,6 +39,7 @@ const initialState = ImmutableMap({
status: false,
update: false,
'admin.sign_up': false,
+ 'admin.report': false,
}),
quickFilter: ImmutableMap({
@@ -59,6 +61,7 @@ const initialState = ImmutableMap({
status: true,
update: true,
'admin.sign_up': true,
+ 'admin.report': true,
}),
sounds: ImmutableMap({
@@ -71,6 +74,7 @@ const initialState = ImmutableMap({
status: true,
update: true,
'admin.sign_up': true,
+ 'admin.report': true,
}),
}),
@@ -129,6 +133,8 @@ const changeColumnParams = (state, uuid, path, value) => {
const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false);
+const updateFrequentLanguages = (state, language) => state.update('frequentlyUsedLanguages', ImmutableMap(), map => map.update(language, 0, count => count + 1)).set('saved', false);
+
const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId));
export default function settings(state = initialState, action) {
@@ -154,6 +160,8 @@ export default function settings(state = initialState, action) {
return changeColumnParams(state, action.uuid, action.path, action.value);
case EMOJI_USE:
return updateFrequentEmojis(state, action.emoji);
+ case LANGUAGE_USE:
+ return updateFrequentLanguages(state, action.language);
case SETTING_SAVE:
return state.set('saved', true);
case LIST_FETCH_FAIL:
diff --git a/app/javascript/mastodon/reducers/status_lists.js b/app/javascript/mastodon/reducers/status_lists.js
index 49bc94a40..a7c56cc19 100644
--- a/app/javascript/mastodon/reducers/status_lists.js
+++ b/app/javascript/mastodon/reducers/status_lists.js
@@ -21,6 +21,9 @@ import {
TRENDS_STATUSES_FETCH_REQUEST,
TRENDS_STATUSES_FETCH_SUCCESS,
TRENDS_STATUSES_FETCH_FAIL,
+ TRENDS_STATUSES_EXPAND_REQUEST,
+ TRENDS_STATUSES_EXPAND_SUCCESS,
+ TRENDS_STATUSES_EXPAND_FAIL,
} from '../actions/trends';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import {
@@ -111,11 +114,15 @@ export default function statusLists(state = initialState, action) {
case BOOKMARKED_STATUSES_EXPAND_SUCCESS:
return appendToList(state, 'bookmarks', action.statuses, action.next);
case TRENDS_STATUSES_FETCH_REQUEST:
+ case TRENDS_STATUSES_EXPAND_REQUEST:
return state.setIn(['trending', 'isLoading'], true);
case TRENDS_STATUSES_FETCH_FAIL:
+ case TRENDS_STATUSES_EXPAND_FAIL:
return state.setIn(['trending', 'isLoading'], false);
case TRENDS_STATUSES_FETCH_SUCCESS:
return normalizeList(state, 'trending', action.statuses, action.next);
+ case TRENDS_STATUSES_EXPAND_SUCCESS:
+ return appendToList(state, 'trending', action.statuses, action.next);
case FAVOURITE_SUCCESS:
return prependOneToList(state, 'favourites', action.status);
case UNFAVOURITE_SUCCESS:
diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js
index b66c19fd5..d72109e69 100644
--- a/app/javascript/mastodon/reducers/timelines.js
+++ b/app/javascript/mastodon/reducers/timelines.js
@@ -16,7 +16,7 @@ import {
ACCOUNT_MUTE_SUCCESS,
ACCOUNT_UNFOLLOW_SUCCESS,
} from '../actions/accounts';
-import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
import compareId from '../compare_id';
const initialState = ImmutableMap();
@@ -32,6 +32,13 @@ const initialTimeline = ImmutableMap({
});
const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, isLoadingRecent, usePendingItems) => {
+ // This method is pretty tricky because:
+ // - existing items in the timeline might be out of order
+ // - the existing timeline may have gaps, most often explicitly noted with a `null` item
+ // - ideally, we don't want it to reorder existing items of the timeline
+ // - `statuses` may include items that are already included in the timeline
+ // - this function can be called either to fill in a gap, or load newer items
+
return state.update(timeline, initialTimeline, map => map.withMutations(mMap => {
mMap.set('isLoading', false);
mMap.set('isPartial', isPartial);
@@ -46,15 +53,42 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is
mMap.update(usePendingItems ? 'pendingItems' : 'items', ImmutableList(), oldIds => {
const newIds = statuses.map(status => status.get('id'));
+ // Now this gets tricky, as we don't necessarily know for sure where the gap to fill is
+ // and some items in the timeline may not be properly ordered.
+
+ // However, we know that `newIds.last()` is the oldest item that was requested and that
+ // there is no “hole” between `newIds.last()` and `newIds.first()`.
+
+ // First, find the furthest (if properly sorted, oldest) item in the timeline that is
+ // newer than the oldest fetched one, as it's most likely that it delimits the gap.
+ // Start the gap *after* that item.
const lastIndex = oldIds.findLastIndex(id => id !== null && compareId(id, newIds.last()) >= 0) + 1;
- const firstIndex = oldIds.take(lastIndex).findLastIndex(id => id !== null && compareId(id, newIds.first()) > 0);
- if (firstIndex < 0) {
- return (isPartial ? newIds.unshift(null) : newIds).concat(oldIds.skip(lastIndex));
+ // Then, try to find the furthest (if properly sorted, oldest) item in the timeline that
+ // is newer than the most recent fetched one, as it delimits a section comprised of only
+ // items older or within `newIds` (or that were deleted from the server, so should be removed
+ // anyway).
+ // Stop the gap *after* that item.
+ const firstIndex = oldIds.take(lastIndex).findLastIndex(id => id !== null && compareId(id, newIds.first()) > 0) + 1;
+
+ let insertedIds = ImmutableOrderedSet(newIds).withMutations(insertedIds => {
+ // It is possible, though unlikely, that the slice we are replacing contains items older
+ // than the elements we got from the API. Get them and add them back at the back of the
+ // slice.
+ const olderIds = oldIds.slice(firstIndex, lastIndex).filter(id => id !== null && compareId(id, newIds.last()) < 0);
+ insertedIds.union(olderIds);
+
+ // Make sure we aren't inserting duplicates
+ insertedIds.subtract(oldIds.take(firstIndex), oldIds.skip(lastIndex));
+ }).toList();
+
+ // Finally, insert a gap marker if the data is marked as partial by the server
+ if (isPartial && (firstIndex === 0 || oldIds.get(firstIndex - 1) !== null)) {
+ insertedIds = insertedIds.unshift(null);
}
- return oldIds.take(firstIndex + 1).concat(
- isPartial && oldIds.get(firstIndex) !== null ? newIds.unshift(null) : newIds,
+ return oldIds.take(firstIndex).concat(
+ insertedIds,
oldIds.skip(lastIndex),
);
});
@@ -137,6 +171,17 @@ const updateTop = (state, timeline, top) => {
}));
};
+const reconnectTimeline = (state, usePendingItems) => {
+ if (state.get('online')) {
+ return state;
+ }
+
+ return state.withMutations(mMap => {
+ mMap.update(usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items);
+ mMap.set('online', true);
+ });
+};
+
export default function timelines(state = initialState, action) {
switch(action.type) {
case TIMELINE_LOAD_PENDING:
@@ -162,7 +207,7 @@ export default function timelines(state = initialState, action) {
case TIMELINE_SCROLL_TOP:
return updateTop(state, action.timeline, action.top);
case TIMELINE_CONNECT:
- return state.update(action.timeline, initialTimeline, map => map.set('online', true));
+ return state.update(action.timeline, initialTimeline, map => reconnectTimeline(map, action.usePendingItems));
case TIMELINE_DISCONNECT:
return state.update(
action.timeline,
diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js
index 1e19db65d..187e3306d 100644
--- a/app/javascript/mastodon/selectors/index.js
+++ b/app/javascript/mastodon/selectors/index.js
@@ -1,5 +1,5 @@
import { createSelector } from 'reselect';
-import { List as ImmutableList, Map as ImmutableMap, is } from 'immutable';
+import { List as ImmutableList, Map as ImmutableMap } from 'immutable';
import { me } from '../initial_state';
const getAccountBase = (state, id) => state.getIn(['accounts', id], null);
@@ -37,52 +37,15 @@ const toServerSideType = columnType => {
}
};
-const escapeRegExp = string =>
- string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+const getFilters = (state, { contextType }) => {
+ if (!contextType) return null;
-const regexFromFilters = filters => {
- if (filters.size === 0) {
- return null;
- }
-
- return new RegExp(filters.map(filter => {
- let expr = escapeRegExp(filter.get('phrase'));
-
- if (filter.get('whole_word')) {
- if (/^[\w]/.test(expr)) {
- expr = `\\b${expr}`;
- }
-
- if (/[\w]$/.test(expr)) {
- expr = `${expr}\\b`;
- }
- }
-
- return expr;
- }).join('|'), 'i');
-};
-
-// Memoize the filter regexps for each valid server contextType
-const makeGetFiltersRegex = () => {
- let memo = {};
-
- return (state, { contextType }) => {
- if (!contextType) return ImmutableList();
+ const serverSideType = toServerSideType(contextType);
+ const now = new Date();
- const serverSideType = toServerSideType(contextType);
- const filters = state.get('filters', ImmutableList()).filter(filter => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || Date.parse(filter.get('expires_at')) > (new Date())));
-
- if (!memo[serverSideType] || !is(memo[serverSideType].filters, filters)) {
- const dropRegex = regexFromFilters(filters.filter(filter => filter.get('irreversible')));
- const regex = regexFromFilters(filters);
- memo[serverSideType] = { filters: filters, results: [dropRegex, regex] };
- }
- return memo[serverSideType].results;
- };
+ return state.get('filters').filter((filter) => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || filter.get('expires_at') > now));
};
-export const getFiltersRegex = makeGetFiltersRegex();
-
export const makeGetStatus = () => {
return createSelector(
[
@@ -90,10 +53,10 @@ export const makeGetStatus = () => {
(state, { id }) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]),
- getFiltersRegex,
+ getFilters,
],
- (statusBase, statusReblog, accountBase, accountReblog, filtersRegex) => {
+ (statusBase, statusReblog, accountBase, accountReblog, filters) => {
if (!statusBase) {
return null;
}
@@ -104,18 +67,21 @@ export const makeGetStatus = () => {
statusReblog = null;
}
- const dropRegex = (accountReblog || accountBase).get('id') !== me && filtersRegex[0];
- if (dropRegex && dropRegex.test(statusBase.get('reblog') ? statusReblog.get('search_index') : statusBase.get('search_index'))) {
- return null;
+ let filtered = false;
+ if ((accountReblog || accountBase).get('id') !== me && filters) {
+ let filterResults = statusReblog?.get('filtered') || statusBase.get('filtered') || ImmutableList();
+ if (filterResults.some((result) => filters.getIn([result.get('filter'), 'filter_action']) === 'hide')) {
+ return null;
+ }
+ if (!filterResults.isEmpty()) {
+ filtered = filterResults.map(result => filters.getIn([result.get('filter'), 'title']));
+ }
}
- const regex = (accountReblog || accountBase).get('id') !== me && filtersRegex[1];
- const filtered = regex && regex.test(statusBase.get('reblog') ? statusReblog.get('search_index') : statusBase.get('search_index'));
-
return statusBase.withMutations(map => {
map.set('reblog', statusReblog);
map.set('account', accountBase);
- map.set('filtered', filtered);
+ map.set('matched_filters', filtered);
});
},
);
@@ -152,14 +118,15 @@ export const getAlerts = createSelector([getAlertsBase], (base) => {
return arr;
});
-export const makeGetNotification = () => {
- return createSelector([
- (_, base) => base,
- (state, _, accountId) => state.getIn(['accounts', accountId]),
- ], (base, account) => {
- return base.set('account', account);
- });
-};
+export const makeGetNotification = () => createSelector([
+ (_, base) => base,
+ (state, _, accountId) => state.getIn(['accounts', accountId]),
+], (base, account) => base.set('account', account));
+
+export const makeGetReport = () => createSelector([
+ (_, base) => base,
+ (state, _, targetAccountId) => state.getIn(['accounts', targetAccountId]),
+], (base, targetAccount) => base.set('target_account', targetAccount));
export const getAccountGallery = createSelector([
(state, id) => state.getIn(['timelines', `account:${id}:media`, 'items'], ImmutableList()),
@@ -175,3 +142,11 @@ export const getAccountGallery = createSelector([
return medias;
});
+
+export const getAccountHidden = createSelector([
+ (state, id) => state.getIn(['accounts', id, 'hidden']),
+ (state, id) => state.getIn(['relationships', id, 'following']) || state.getIn(['relationships', id, 'requested']),
+ (state, id) => id === me,
+], (hidden, followingOrRequested, isSelf) => {
+ return hidden && !(isSelf || followingOrRequested);
+});
diff --git a/app/javascript/mastodon/utils/resize_image.js b/app/javascript/mastodon/utils/resize_image.js
index 22ff86801..fb8c3c11e 100644
--- a/app/javascript/mastodon/utils/resize_image.js
+++ b/app/javascript/mastodon/utils/resize_image.js
@@ -109,7 +109,7 @@ const loadImage = inputFile => new Promise((resolve, reject) => {
});
const getOrientation = (img, type = 'image/png') => new Promise(resolve => {
- if (type !== 'image/jpeg') {
+ if (!['image/jpeg', 'image/webp'].includes(type)) {
resolve(1);
return;
}
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index be467a8e2..4f60f04c1 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -3,6 +3,7 @@ import loadPolyfills from '../mastodon/load_polyfills';
import ready from '../mastodon/ready';
import { start } from '../mastodon/common';
import loadKeyboardExtensions from '../mastodon/load_keyboard_extensions';
+import 'cocoon-js-vanilla';
start();
diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss
index 8ebc45b62..bbea06195 100644
--- a/app/javascript/styles/application.scss
+++ b/app/javascript/styles/application.scss
@@ -6,6 +6,7 @@
@import 'mastodon/reset';
@import 'mastodon/basics';
+@import 'mastodon/branding';
@import 'mastodon/containers';
@import 'mastodon/lists';
@import 'mastodon/footer';
@@ -17,7 +18,6 @@
@import 'mastodon/boost';
@import 'mastodon/components';
@import 'mastodon/polls';
-@import 'mastodon/introduction';
@import 'mastodon/modal';
@import 'mastodon/emoji_picker';
@import 'mastodon/about';
diff --git a/app/javascript/styles/contrast/variables.scss b/app/javascript/styles/contrast/variables.scss
index cfe3b21db..9edfd6d8d 100644
--- a/app/javascript/styles/contrast/variables.scss
+++ b/app/javascript/styles/contrast/variables.scss
@@ -4,19 +4,17 @@ $black: #000000;
$classic-base-color: #282c37;
$classic-primary-color: #9baec8;
$classic-secondary-color: #d9e1e8;
-$classic-highlight-color: #2b90d9;
+$classic-highlight-color: #6364ff;
$ui-base-color: $classic-base-color !default;
$ui-primary-color: $classic-primary-color !default;
$ui-secondary-color: $classic-secondary-color !default;
-
-// Differences
-$ui-highlight-color: #2b5fd9;
+$ui-highlight-color: $classic-highlight-color !default;
$darker-text-color: lighten($ui-primary-color, 20%) !default;
$dark-text-color: lighten($ui-primary-color, 12%) !default;
$secondary-text-color: lighten($ui-secondary-color, 6%) !default;
-$highlight-text-color: $classic-highlight-color !default;
+$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
$action-button-color: #8d9ac2;
$inverted-text-color: $black !default;
diff --git a/app/javascript/styles/fonts/montserrat.scss b/app/javascript/styles/fonts/montserrat.scss
index 2abcb0c2b..03f67ed3f 100644
--- a/app/javascript/styles/fonts/montserrat.scss
+++ b/app/javascript/styles/fonts/montserrat.scss
@@ -1,6 +1,7 @@
@font-face {
- font-family: 'mastodon-font-display';
- src: local('Montserrat'),
+ font-family: mastodon-font-display;
+ src:
+ local('Montserrat'),
url('~fonts/montserrat/Montserrat-Regular.woff2') format('woff2'),
url('~fonts/montserrat/Montserrat-Regular.woff') format('woff'),
url('~fonts/montserrat/Montserrat-Regular.ttf') format('truetype');
@@ -10,8 +11,9 @@
}
@font-face {
- font-family: 'mastodon-font-display';
- src: local('Montserrat Medium'),
+ font-family: mastodon-font-display;
+ src:
+ local('Montserrat Medium'),
url('~fonts/montserrat/Montserrat-Medium.ttf') format('truetype');
font-weight: 500;
font-display: swap;
diff --git a/app/javascript/styles/fonts/roboto-mono.scss b/app/javascript/styles/fonts/roboto-mono.scss
index a9513dcce..909d1a13e 100644
--- a/app/javascript/styles/fonts/roboto-mono.scss
+++ b/app/javascript/styles/fonts/roboto-mono.scss
@@ -1,6 +1,7 @@
@font-face {
- font-family: 'mastodon-font-monospace';
- src: local('Roboto Mono'),
+ font-family: mastodon-font-monospace;
+ src:
+ local('Roboto Mono'),
url('~fonts/roboto-mono/robotomono-regular-webfont.woff2') format('woff2'),
url('~fonts/roboto-mono/robotomono-regular-webfont.woff') format('woff'),
url('~fonts/roboto-mono/robotomono-regular-webfont.ttf') format('truetype'),
diff --git a/app/javascript/styles/fonts/roboto.scss b/app/javascript/styles/fonts/roboto.scss
index 817b448c1..0ccc43094 100644
--- a/app/javascript/styles/fonts/roboto.scss
+++ b/app/javascript/styles/fonts/roboto.scss
@@ -1,6 +1,7 @@
@font-face {
- font-family: 'mastodon-font-sans-serif';
- src: local('Roboto Italic'),
+ font-family: mastodon-font-sans-serif;
+ src:
+ local('Roboto Italic'),
url('~fonts/roboto/roboto-italic-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-italic-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
@@ -11,8 +12,9 @@
}
@font-face {
- font-family: 'mastodon-font-sans-serif';
- src: local('Roboto Bold'),
+ font-family: mastodon-font-sans-serif;
+ src:
+ local('Roboto Bold'),
url('~fonts/roboto/roboto-bold-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-bold-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
@@ -23,8 +25,9 @@
}
@font-face {
- font-family: 'mastodon-font-sans-serif';
- src: local('Roboto Medium'),
+ font-family: mastodon-font-sans-serif;
+ src:
+ local('Roboto Medium'),
url('~fonts/roboto/roboto-medium-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-medium-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
@@ -35,8 +38,9 @@
}
@font-face {
- font-family: 'mastodon-font-sans-serif';
- src: local('Roboto'),
+ font-family: mastodon-font-sans-serif;
+ src:
+ local('Roboto'),
url('~fonts/roboto/roboto-regular-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-regular-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss
index 34852178e..18fe522eb 100644
--- a/app/javascript/styles/mailer.scss
+++ b/app/javascript/styles/mailer.scss
@@ -435,6 +435,10 @@ h5 {
background: $success-green;
}
+ &.warning-icon td {
+ background: $gold-star;
+ }
+
&.alert-icon td {
background: $error-red;
}
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 2c8162b28..0bc6247ef 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -330,6 +330,7 @@ html {
.actions-modal ul li:not(:empty) a:focus button,
.actions-modal ul li:not(:empty) a:hover,
.actions-modal ul li:not(:empty) a:hover button,
+.language-dropdown__dropdown__results__item.active,
.admin-wrapper .sidebar ul .simple-navigation-active-leaf a,
.simple_form .block-button,
.simple_form .button,
@@ -337,6 +338,14 @@ html {
color: $white;
}
+.language-dropdown__dropdown__results__item .language-dropdown__dropdown__results__item__common-name {
+ color: lighten($ui-base-color, 8%);
+}
+
+.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item__common-name {
+ color: darken($ui-base-color, 12%);
+}
+
.dropdown-menu__separator,
.dropdown-menu__item.edited-timestamp__history__item,
.dropdown-menu__container__header,
@@ -371,12 +380,13 @@ html {
border: 1px solid lighten($ui-base-color, 8%);
}
-.reactions-bar__item {
- &:hover,
- &:focus,
- &:active {
- background-color: $ui-base-color;
- }
+.reactions-bar__item:hover,
+.reactions-bar__item:focus,
+.reactions-bar__item:active,
+.language-dropdown__dropdown__results__item:hover,
+.language-dropdown__dropdown__results__item:focus,
+.language-dropdown__dropdown__results__item:active {
+ background-color: $ui-base-color;
}
.reactions-bar__item.active {
@@ -532,10 +542,10 @@ html {
}
.simple_form {
- input[type=text],
- input[type=number],
- input[type=email],
- input[type=password],
+ input[type="text"],
+ input[type="number"],
+ input[type="email"],
+ input[type="password"],
textarea {
&:hover {
border-color: lighten($ui-base-color, 12%);
diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss
index bc039ff03..cae065878 100644
--- a/app/javascript/styles/mastodon-light/variables.scss
+++ b/app/javascript/styles/mastodon-light/variables.scss
@@ -5,7 +5,7 @@ $white: #ffffff;
$classic-base-color: #282c37;
$classic-primary-color: #9baec8;
$classic-secondary-color: #d9e1e8;
-$classic-highlight-color: #2b90d9;
+$classic-highlight-color: #6364ff;
// Differences
$success-green: lighten(#3c754d, 8%);
@@ -17,10 +17,11 @@ $ui-base-color: $classic-secondary-color !default;
$ui-base-lighter-color: #b0c0cf;
$ui-primary-color: #9bcbed;
$ui-secondary-color: $classic-base-color !default;
-$ui-highlight-color: #2b90d9;
+$ui-highlight-color: $classic-highlight-color !default;
$primary-text-color: $black !default;
$darker-text-color: $classic-base-color !default;
+$highlight-text-color: darken($ui-highlight-color, 8%) !default;
$dark-text-color: #444b5d;
$action-button-color: #606984;
@@ -28,10 +29,10 @@ $inverted-text-color: $black !default;
$lighter-text-color: $classic-base-color !default;
$light-text-color: #444b5d;
-//Newly added colors
+// Newly added colors
$account-background-color: $white !default;
-//Invert darkened and lightened colors
+// Invert darkened and lightened colors
@function darken($color, $amount) {
@return hsl(hue($color), saturation($color), lightness($color) + $amount);
}
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index 9f2a1a3af..c82be742d 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -41,7 +41,7 @@ $small-breakpoint: 960px;
p {
margin-top: 0;
- margin-bottom: .85em;
+ margin-bottom: 0.85em;
&:last-child {
margin-bottom: 0;
@@ -73,7 +73,7 @@ $small-breakpoint: 960px;
h6 {
font-family: $font-display, sans-serif;
margin-top: 1.275em;
- margin-bottom: .85em;
+ margin-bottom: 0.85em;
font-weight: 500;
color: $secondary-text-color;
}
@@ -436,7 +436,7 @@ $small-breakpoint: 960px;
width: 100%;
height: 0;
border: 0;
- border-bottom: 1px solid rgba($ui-base-lighter-color, .6);
+ border-bottom: 1px solid rgba($ui-base-lighter-color, 0.6);
margin: 20px 0;
&.spacer {
@@ -688,7 +688,7 @@ $small-breakpoint: 960px;
align-items: center;
padding: 50px;
- svg {
+ .logo {
fill: $primary-text-color;
height: 52px;
}
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 27be22f1b..f606bfa4a 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -75,6 +75,13 @@ $content-width: 840px;
height: 100px;
}
+ .logo--wordmark {
+ display: inherit;
+ margin: inherit;
+ width: inherit;
+ height: 20px;
+ }
+
@media screen and (max-width: $no-columns-breakpoint) {
& > a:first-child {
display: none;
@@ -133,12 +140,12 @@ $content-width: 840px;
.simple-navigation-active-leaf a {
color: $primary-text-color;
- background-color: $ui-highlight-color;
+ background-color: darken($ui-highlight-color, 2%);
border-bottom: 0;
border-radius: 0;
&:hover {
- background-color: lighten($ui-highlight-color, 5%);
+ background-color: $ui-highlight-color;
}
}
}
@@ -183,12 +190,9 @@ $content-width: 840px;
&-heading {
display: flex;
-
padding-bottom: 36px;
border-bottom: 1px solid lighten($ui-base-color, 8%);
-
margin: -15px -15px 40px 0;
-
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
@@ -206,6 +210,14 @@ $content-width: 840px;
}
}
+ h2 small {
+ font-size: 12px;
+ display: block;
+ font-weight: 500;
+ color: $darker-text-color;
+ line-height: 18px;
+ }
+
@media screen and (max-width: $no-columns-breakpoint) {
border-bottom: 0;
padding-bottom: 0;
@@ -294,7 +306,7 @@ $content-width: 840px;
width: 100%;
height: 0;
border: 0;
- border-bottom: 1px solid rgba($ui-base-lighter-color, .6);
+ border-bottom: 1px solid rgba($ui-base-lighter-color, 0.6);
margin: 20px 0;
&.spacer {
@@ -896,7 +908,7 @@ a.name-tag,
border: 0;
a {
- color: lighten($ui-highlight-color, 8%);
+ color: $highlight-text-color;
}
dl:first-child .verified {
@@ -919,7 +931,8 @@ a.name-tag,
text-align: center;
}
-.applications-list__item {
+.applications-list__item,
+.filters-list__item {
padding: 15px 0;
background: $ui-base-color;
border: 1px solid lighten($ui-base-color, 4%);
@@ -927,7 +940,8 @@ a.name-tag,
margin-top: 15px;
}
-.announcements-list {
+.announcements-list,
+.filters-list {
border: 1px solid lighten($ui-base-color, 4%);
border-radius: 4px;
@@ -980,6 +994,33 @@ a.name-tag,
}
}
+.filters-list__item {
+ &__title {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 0;
+ }
+
+ &__permissions {
+ margin-top: 0;
+ margin-bottom: 10px;
+ }
+
+ .expiration {
+ font-size: 13px;
+ }
+
+ &.expired {
+ .expiration {
+ color: lighten($error-red, 12%);
+ }
+
+ .permissions-list__item__icon {
+ color: $dark-text-color;
+ }
+ }
+}
+
.dashboard__counters.admin-account-counters {
margin-top: 10px;
}
diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss
index 9e63b1d31..413a1cdd6 100644
--- a/app/javascript/styles/mastodon/basics.scss
+++ b/app/javascript/styles/mastodon/basics.scss
@@ -16,7 +16,7 @@ body {
text-rendering: optimizelegibility;
font-feature-settings: "kern";
text-size-adjust: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0%);
-webkit-tap-highlight-color: transparent;
&.system-font {
@@ -31,7 +31,7 @@ body {
// Droid Sans => Older Androids (<4.0)
// Helvetica Neue => Older macOS <10.11
// $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", $font-sans-serif, sans-serif;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", $font-sans-serif, sans-serif;
}
&.app-body {
@@ -202,7 +202,7 @@ button {
}
p {
- margin-bottom: .85em;
+ margin-bottom: 0.85em;
&:last-child {
margin-bottom: 0;
@@ -256,7 +256,17 @@ button {
}
.logo-resources {
- display: none;
+ // Not using display: none because of https://bugs.chromium.org/p/chromium/issues/detail?id=258029
+ visibility: hidden;
+ user-select: none;
+ pointer-events: none;
+ width: 0;
+ height: 0;
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: -1000;
}
// NoScript adds a __ns__pop2top class to the full ancestry of blocked elements,
diff --git a/app/javascript/styles/mastodon/branding.scss b/app/javascript/styles/mastodon/branding.scss
new file mode 100644
index 000000000..d1bddc68b
--- /dev/null
+++ b/app/javascript/styles/mastodon/branding.scss
@@ -0,0 +1,3 @@
+.logo {
+ color: $primary-text-color;
+}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 713d24c0f..26f4c54a3 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -42,7 +42,7 @@
}
.button {
- background-color: $ui-highlight-color;
+ background-color: darken($ui-highlight-color, 2%);
border: 10px none;
border-radius: 4px;
box-sizing: border-box;
@@ -60,20 +60,16 @@
text-align: center;
text-decoration: none;
text-overflow: ellipsis;
- transition: all 100ms ease-in;
white-space: nowrap;
width: auto;
&:active,
&:focus,
&:hover {
- background-color: lighten($ui-highlight-color, 10%);
- transition: all 200ms ease-out;
+ background-color: $ui-highlight-color;
}
&--destructive {
- transition: none;
-
&:active,
&:focus,
&:hover {
@@ -341,7 +337,6 @@
&__sensitive-button {
padding: 10px;
padding-top: 0;
-
font-size: 14px;
font-weight: 500;
@@ -349,7 +344,7 @@
color: $highlight-text-color;
}
- input[type=checkbox] {
+ input[type="checkbox"] {
display: none;
}
@@ -709,7 +704,7 @@
font-size: inherit;
vertical-align: middle;
object-fit: contain;
- margin: -.2ex .15em .2ex;
+ margin: -0.2ex 0.15em 0.2ex;
width: 16px;
height: 16px;
@@ -830,7 +825,7 @@
}
a.unhandled-link {
- color: lighten($ui-highlight-color, 8%);
+ color: $highlight-text-color;
}
.status__content__spoiler-link {
@@ -900,7 +895,7 @@
}
&.unhandled-link {
- color: lighten($ui-highlight-color, 8%);
+ color: $highlight-text-color;
}
}
}
@@ -913,7 +908,7 @@
display: block;
font-size: 15px;
line-height: 20px;
- color: lighten($ui-highlight-color, 8%);
+ color: $highlight-text-color;
border: 0;
background: transparent;
padding: 0;
@@ -964,6 +959,21 @@
width: 100%;
clear: both;
border-bottom: 1px solid lighten($ui-base-color, 8%);
+
+ &__button {
+ display: inline;
+ color: lighten($ui-highlight-color, 8%);
+ border: 0;
+ background: transparent;
+ padding: 0;
+ font-size: inherit;
+ line-height: inherit;
+
+ &:hover,
+ &:active {
+ text-decoration: underline;
+ }
+ }
}
.status__prepend-icon-wrapper {
@@ -1009,6 +1019,43 @@
.audio-player {
margin-top: 8px;
}
+
+ &.light {
+ .status__relative-time,
+ .status__visibility-icon {
+ color: $light-text-color;
+ }
+
+ .status__display-name {
+ color: $inverted-text-color;
+ }
+
+ .display-name {
+ color: $light-text-color;
+
+ strong {
+ color: $inverted-text-color;
+ }
+ }
+
+ .status__content {
+ color: $inverted-text-color;
+
+ a {
+ color: $highlight-text-color;
+ }
+
+ a.status__content__spoiler-link {
+ color: $primary-text-color;
+ background: $ui-primary-color;
+
+ &:hover,
+ &:focus {
+ background: lighten($ui-primary-color, 8%);
+ }
+ }
+ }
+ }
}
.status__relative-time,
@@ -1154,43 +1201,6 @@
.audio-player {
margin-top: 8px;
}
-
- &.light {
- .status__relative-time,
- .status__visibility-icon {
- color: $light-text-color;
- }
-
- .status__display-name {
- color: $inverted-text-color;
- }
-
- .display-name {
- color: $light-text-color;
-
- strong {
- color: $inverted-text-color;
- }
- }
-
- .status__content {
- color: $inverted-text-color;
-
- a {
- color: $highlight-text-color;
- }
-
- a.status__content__spoiler-link {
- color: $primary-text-color;
- background: $ui-primary-color;
-
- &:hover,
- &:focus {
- background: lighten($ui-primary-color, 8%);
- }
- }
- }
- }
}
.detailed-status__meta {
@@ -1313,9 +1323,9 @@
.account__avatar {
@include avatar-radius;
+
display: block;
position: relative;
-
width: 36px;
height: 36px;
background-size: 36px 36px;
@@ -1328,6 +1338,7 @@
&-composite {
@include avatar-radius;
+
border-radius: 50%;
overflow: hidden;
position: relative;
@@ -1359,12 +1370,15 @@ a .account__avatar {
.account__avatar-overlay {
@include avatar-size(48px);
+ position: relative;
+
&-base {
@include avatar-radius;
@include avatar-size(36px);
img {
@include avatar-radius;
+
width: 100%;
height: 100%;
}
@@ -1381,6 +1395,7 @@ a .account__avatar {
img {
@include avatar-radius;
+
width: 100%;
height: 100%;
}
@@ -1622,6 +1637,33 @@ a.account__display-name {
}
}
+.notification__report {
+ padding: 8px 10px;
+ padding-left: 68px;
+ position: relative;
+ border-bottom: 1px solid lighten($ui-base-color, 8%);
+ min-height: 54px;
+
+ &__details {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: $darker-text-color;
+ font-size: 15px;
+ line-height: 22px;
+
+ strong {
+ font-weight: 500;
+ }
+ }
+
+ &__avatar {
+ position: absolute;
+ left: 10px;
+ top: 10px;
+ }
+}
+
.notification__message {
margin: 0 10px 0 68px;
padding: 8px 0 0;
@@ -2328,7 +2370,7 @@ a.account__display-name {
.scrollable {
overflow: visible;
- @supports(display: grid) {
+ @supports (display: grid) {
contain: content;
}
}
@@ -2362,6 +2404,16 @@ a.account__display-name {
padding-top: 15px;
}
+ .notification__report {
+ padding: 15px 15px 15px (48px + 15px * 2);
+ min-height: 48px + 2px;
+
+ &__avatar {
+ left: 15px;
+ top: 17px;
+ }
+ }
+
.status {
padding: 15px 15px 15px (48px + 15px * 2);
min-height: 48px + 2px;
@@ -2435,7 +2487,7 @@ a.account__display-name {
height: 3.9375rem;
bottom: 1.3125rem;
right: 1.3125rem;
- background: darken($ui-highlight-color, 3%);
+ background: darken($ui-highlight-color, 2%);
color: $white;
border-radius: 50%;
font-size: 21px;
@@ -2446,7 +2498,7 @@ a.account__display-name {
&:hover,
&:focus,
&:active {
- background: lighten($ui-highlight-color, 7%);
+ background: $ui-highlight-color;
}
}
@@ -2469,6 +2521,10 @@ a.account__display-name {
.columns-area__panels__pane--compositional {
display: none;
}
+
+ .with-fab .scrollable .item-list:last-child {
+ padding-bottom: 5.25rem;
+ }
}
@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {
@@ -2532,7 +2588,6 @@ a.account__display-name {
padding: 40px;
.logo {
- fill: $primary-text-color;
width: 50px;
margin: 0 auto;
margin-bottom: 40px;
@@ -2747,7 +2802,7 @@ a.account__display-name {
overflow-y: auto;
}
- @supports(display: grid) { // hack to fix Chrome <57
+ @supports (display: grid) { // hack to fix Chrome <57
contain: strict;
}
@@ -2768,7 +2823,7 @@ a.account__display-name {
}
.scrollable.fullscreen {
- @supports(display: grid) { // hack to fix Chrome <57
+ @supports (display: grid) { // hack to fix Chrome <57
contain: none;
}
}
@@ -2876,11 +2931,11 @@ a.account__display-name {
}
.react-toggle--checked .react-toggle-track {
- background-color: $ui-highlight-color;
+ background-color: darken($ui-highlight-color, 2%);
}
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
- background-color: lighten($ui-highlight-color, 10%);
+ background-color: $ui-highlight-color;
}
.react-toggle-track-check {
@@ -2969,7 +3024,7 @@ a.account__display-name {
}
&.active {
- color: $ui-highlight-color;
+ color: $highlight-text-color;
}
}
}
@@ -3402,14 +3457,14 @@ a.status-card.compact:hover {
}
a {
- color: lighten($ui-highlight-color, 8%);
+ color: $highlight-text-color;
text-decoration: none;
&:hover,
&:focus,
&:active {
text-decoration: underline;
- color: lighten($ui-highlight-color, 12%);
+ color: lighten($highlight-text-color, 4%);
}
}
}
@@ -3976,6 +4031,7 @@ a.status-card.compact:hover {
&__menu {
@include search-popout;
+
padding: 0;
background: $ui-secondary-color;
}
@@ -4033,6 +4089,15 @@ a.status-card.compact:hover {
vertical-align: middle;
}
+.limited-account-hint {
+ p {
+ color: $secondary-text-color;
+ font-size: 15px;
+ font-weight: 500;
+ margin-bottom: 20px;
+ }
+}
+
.empty-column-indicator,
.error-column,
.follow_requests-unlocked_explanation {
@@ -4048,12 +4113,12 @@ a.status-card.compact:hover {
align-items: center;
justify-content: center;
- @supports(display: grid) { // hack to fix Chrome <57
+ @supports (display: grid) { // hack to fix Chrome <57
contain: strict;
}
& > span {
- max-width: 400px;
+ max-width: 500px;
}
a {
@@ -4336,7 +4401,6 @@ a.status-card.compact:hover {
background: $simple-background-color;
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
border-radius: 4px;
- margin-left: 40px;
overflow: hidden;
z-index: 2;
@@ -4437,6 +4501,71 @@ a.status-card.compact:hover {
}
}
+.language-dropdown {
+ &__dropdown {
+ position: absolute;
+ background: $simple-background-color;
+ box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
+ border-radius: 4px;
+ overflow: hidden;
+ z-index: 2;
+
+ &.top {
+ transform-origin: 50% 100%;
+ }
+
+ &.bottom {
+ transform-origin: 50% 0;
+ }
+
+ .emoji-mart-search {
+ padding-right: 10px;
+ }
+
+ .emoji-mart-search-icon {
+ right: 10px + 5px;
+ }
+
+ .emoji-mart-scroll {
+ padding: 0 10px 10px;
+ }
+
+ &__results {
+ &__item {
+ cursor: pointer;
+ color: $inverted-text-color;
+ font-weight: 500;
+ padding: 10px;
+ border-radius: 4px;
+
+ &:focus,
+ &:active,
+ &:hover {
+ background: $ui-secondary-color;
+ }
+
+ &__common-name {
+ color: $darker-text-color;
+ }
+
+ &.active {
+ background: $ui-highlight-color;
+ color: $primary-text-color;
+ outline: 0;
+
+ .language-dropdown__dropdown__results__item__common-name {
+ color: $secondary-text-color;
+ }
+
+ &:hover {
+ background: lighten($ui-highlight-color, 4%);
+ }
+ }
+ }
+ }
+ }
+}
+
.search {
position: relative;
}
@@ -4801,7 +4930,7 @@ a.status-card.compact:hover {
padding: 0;
border: 0;
font-size: 0;
- transition: opacity .2s ease-in-out;
+ transition: opacity 0.2s ease-in-out;
&.active {
opacity: 1;
@@ -4856,7 +4985,6 @@ a.status-card.compact:hover {
height: 100%;
box-sizing: border-box;
padding: 25px;
- display: none;
flex-direction: column;
align-items: center;
justify-content: center;
@@ -5197,7 +5325,6 @@ a.status-card.compact:hover {
display: block;
box-sizing: border-box;
width: 100%;
- margin: 0;
color: $inverted-text-color;
background: $simple-background-color;
padding: 10px;
@@ -5329,7 +5456,6 @@ a.status-card.compact:hover {
font-family: inherit;
font-size: 14px;
resize: none;
- border: 0;
outline: 0;
border-radius: 4px;
border: 1px solid $ui-secondary-color;
@@ -5598,7 +5724,7 @@ a.status-card.compact:hover {
.loading-bar {
background-color: $highlight-text-color;
height: 3px;
- position: absolute;
+ position: fixed;
top: 0;
left: 0;
z-index: 9999;
@@ -5780,6 +5906,7 @@ a.status-card.compact:hover {
overflow: hidden;
position: absolute;
}
+
/* End Media Gallery */
.detailed,
@@ -5792,7 +5919,6 @@ a.status-card.compact:hover {
.video-player__volume__handle {
bottom: 23px;
}
-
}
.audio-player {
@@ -5914,7 +6040,7 @@ a.status-card.compact:hover {
background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);
padding: 0 15px;
opacity: 0;
- transition: opacity .1s ease;
+ transition: opacity 0.1s ease;
&.active {
opacity: 1;
@@ -5989,7 +6115,6 @@ a.status-card.compact:hover {
.player-button {
display: inline-block;
outline: 0;
-
flex: 0 0 auto;
background: transparent;
padding: 5px;
@@ -6160,7 +6285,7 @@ a.status-card.compact:hover {
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
.no-reduce-motion & {
- transition: opacity .1s ease;
+ transition: opacity 0.1s ease;
}
&.active {
@@ -6328,14 +6453,13 @@ a.status-card.compact:hover {
display: inline-block;
padding: 6px 0;
line-height: 18px;
- cursor: default;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
- input[type=radio],
- input[type=checkbox] {
+ input[type="radio"],
+ input[type="checkbox"] {
display: none;
}
@@ -6353,8 +6477,8 @@ a.status-card.compact:hover {
vertical-align: middle;
&.checked {
- border-color: lighten($ui-highlight-color, 8%);
- background: lighten($ui-highlight-color, 8%);
+ border-color: lighten($ui-highlight-color, 4%);
+ background: lighten($ui-highlight-color, 4%);
}
}
}
@@ -6428,14 +6552,16 @@ noscript {
.navigation-bar__actions {
& > .icon-button.close {
will-change: opacity transform;
- transition: opacity $duration * 0.5 $delay,
- transform $duration $delay;
+ transition:
+ opacity $duration * 0.5 $delay,
+ transform $duration $delay;
}
& > .compose__action-bar .icon-button {
will-change: opacity transform;
- transition: opacity $duration * 0.5 $delay + $duration * 0.5,
- transform $duration $delay;
+ transition:
+ opacity $duration * 0.5 $delay + $duration * 0.5,
+ transform $duration $delay;
}
}
}
@@ -7209,7 +7335,7 @@ noscript {
border-radius: 50%;
width: 0.625rem;
height: 0.625rem;
- margin: -.1ex .15em .1ex;
+ margin: -0.1ex 0.15em 0.1ex;
}
&__content {
@@ -7472,7 +7598,6 @@ noscript {
position: absolute;
top: 0;
left: 0;
- pointer-events: 0;
width: 100%;
height: 100%;
border-left: 2px solid $highlight-text-color;
diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss
index 81459f5ba..5703a64e3 100644
--- a/app/javascript/styles/mastodon/containers.scss
+++ b/app/javascript/styles/mastodon/containers.scss
@@ -20,8 +20,7 @@
justify-content: center;
align-items: center;
- svg {
- fill: $primary-text-color;
+ .logo {
height: 42px;
margin-right: 10px;
}
@@ -320,7 +319,7 @@
display: block;
padding: 15px;
- svg {
+ .logo {
display: block;
height: 18px;
width: auto;
@@ -792,7 +791,7 @@
border-top: 0;
a {
- color: lighten($ui-highlight-color, 8%);
+ color: $highlight-text-color;
}
dl:first-child .verified {
diff --git a/app/javascript/styles/mastodon/dashboard.scss b/app/javascript/styles/mastodon/dashboard.scss
index 0a881bc10..c21fc9eba 100644
--- a/app/javascript/styles/mastodon/dashboard.scss
+++ b/app/javascript/styles/mastodon/dashboard.scss
@@ -37,7 +37,6 @@
text-align: center;
font-weight: 500;
font-size: 24px;
- line-height: 21px;
color: $primary-text-color;
font-family: $font-display, sans-serif;
margin-bottom: 20px;
@@ -83,7 +82,7 @@
display: flex;
align-items: baseline;
border-radius: 4px;
- background: $ui-highlight-color;
+ background: darken($ui-highlight-color, 2%);
color: $primary-text-color;
transition: all 100ms ease-in;
font-size: 14px;
@@ -96,7 +95,7 @@
&:active,
&:focus,
&:hover {
- background-color: lighten($ui-highlight-color, 10%);
+ background-color: $ui-highlight-color;
transition: all 200ms ease-out;
}
diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss
index e73057465..24061d2ca 100644
--- a/app/javascript/styles/mastodon/emoji_picker.scss
+++ b/app/javascript/styles/mastodon/emoji_picker.scss
@@ -46,7 +46,7 @@
text-align: center;
padding: 12px 4px;
overflow: hidden;
- transition: color .1s ease-out;
+ transition: color 0.1s ease-out;
cursor: pointer;
background: transparent;
border: 0;
@@ -242,8 +242,8 @@
padding: 5px 6px;
padding-top: 70px;
- .emoji-mart-no-results-label {
- margin-top: .2em;
+ .emoji-mart-no-results-label {
+ margin-top: 0.2em;
}
.emoji-mart-emoji:hover::before {
diff --git a/app/javascript/styles/mastodon/footer.scss b/app/javascript/styles/mastodon/footer.scss
index 073ebda7e..0c3e42033 100644
--- a/app/javascript/styles/mastodon/footer.scss
+++ b/app/javascript/styles/mastodon/footer.scss
@@ -132,19 +132,19 @@
}
.brand {
- svg {
+ .logo {
display: block;
height: 36px;
width: auto;
margin: 0 auto;
- fill: lighten($ui-base-color, 34%);
+ color: lighten($ui-base-color, 34%);
}
&:hover,
&:focus,
&:active {
- svg {
- fill: lighten($ui-base-color, 38%);
+ .logo {
+ color: lighten($ui-base-color, 38%);
}
}
}
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index 90d56b075..da699dd25 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -352,7 +352,7 @@ code {
flex: 1 1 auto;
}
- input[type=checkbox] {
+ input[type="checkbox"] {
position: absolute;
left: 0;
top: 5px;
@@ -368,11 +368,11 @@ code {
border-radius: 4px;
}
- input[type=text],
- input[type=number],
- input[type=email],
- input[type=password],
- input[type=url],
+ input[type="text"],
+ input[type="number"],
+ input[type="email"],
+ input[type="password"],
+ input[type="url"],
textarea {
box-sizing: border-box;
font-size: 16px;
@@ -410,10 +410,10 @@ code {
}
}
- input[type=text],
- input[type=number],
- input[type=email],
- input[type=password] {
+ input[type="text"],
+ input[type="number"],
+ input[type="email"],
+ input[type="password"] {
&:focus:invalid:not(:placeholder-shown),
&:required:invalid:not(:placeholder-shown) {
border-color: lighten($error-red, 12%);
@@ -425,10 +425,10 @@ code {
color: lighten($error-red, 12%);
}
- input[type=text],
- input[type=number],
- input[type=email],
- input[type=password],
+ input[type="text"],
+ input[type="number"],
+ input[type="email"],
+ input[type="password"],
textarea,
select {
border-color: lighten($error-red, 12%);
@@ -463,14 +463,14 @@ code {
width: 100%;
border: 0;
border-radius: 4px;
- background: $ui-highlight-color;
+ background: darken($ui-highlight-color, 2%);
color: $primary-text-color;
font-size: 18px;
line-height: inherit;
height: auto;
padding: 10px;
- text-transform: uppercase;
text-decoration: none;
+ text-transform: uppercase;
text-align: center;
box-sizing: border-box;
cursor: pointer;
@@ -483,13 +483,10 @@ code {
margin-right: 0;
}
- &:hover {
- background-color: lighten($ui-highlight-color, 5%);
- }
-
&:active,
- &:focus {
- background-color: darken($ui-highlight-color, 5%);
+ &:focus,
+ &:hover {
+ background-color: $ui-highlight-color;
}
&:disabled:hover {
@@ -1000,7 +997,7 @@ code {
flex: 1 1 auto;
}
- input[type=text] {
+ input[type="text"] {
background: transparent;
border: 0;
padding: 10px;
@@ -1073,3 +1070,34 @@ code {
}
}
}
+
+.keywords-table {
+ thead {
+ th {
+ white-space: nowrap;
+ }
+
+ th:first-child {
+ width: 100%;
+ }
+ }
+
+ tfoot {
+ td {
+ border: 0;
+ }
+ }
+
+ .input.string {
+ margin-bottom: 0;
+ }
+
+ .label_input__wrapper {
+ margin-top: 10px;
+ }
+
+ .table-action-link {
+ margin-top: 10px;
+ white-space: nowrap;
+ }
+}
diff --git a/app/javascript/styles/mastodon/introduction.scss b/app/javascript/styles/mastodon/introduction.scss
deleted file mode 100644
index b44ae7306..000000000
--- a/app/javascript/styles/mastodon/introduction.scss
+++ /dev/null
@@ -1,154 +0,0 @@
-.introduction {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- height: 100vh;
- background: $ui-base-color;
-
- @media screen and (max-width: 920px) {
- display: block !important;
- }
-
- &__pager {
- background: darken($ui-base-color, 8%);
- box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
- overflow: hidden;
- }
-
- &__pager,
- &__frame {
- border-radius: 10px;
- width: 50vw;
- min-width: 920px;
-
- @media screen and (max-width: 920px) {
- min-width: 0;
- width: 100%;
- border-radius: 0;
- box-shadow: none;
- }
- }
-
- &__frame-wrapper {
- opacity: 0;
- transition: opacity 500ms linear;
-
- &.active {
- opacity: 1;
- transition: opacity 50ms linear;
- }
- }
-
- &__frame {
- overflow: hidden;
- }
-
- &__illustration {
- height: 50vh;
-
- @media screen and (max-width: 630px) {
- height: auto;
- }
-
- img {
- object-fit: cover;
- display: block;
- margin: 0;
- width: 100%;
- height: 100%;
- }
- }
-
- &__text {
- border-top: 2px solid $ui-highlight-color;
-
- &--columnized {
- display: flex;
-
- & > div {
- flex: 1 1 33.33%;
- text-align: center;
- padding: 25px;
- padding-bottom: 30px;
- }
-
- @media screen and (max-width: 630px) {
- display: block;
- padding: 15px 0;
- padding-bottom: 20px;
-
- & > div {
- padding: 10px 25px;
- }
- }
- }
-
- h3 {
- font-size: 24px;
- line-height: 1.5;
- font-weight: 700;
- margin-bottom: 10px;
- }
-
- p {
- font-size: 16px;
- line-height: 24px;
- font-weight: 400;
- color: $darker-text-color;
-
- code {
- display: inline-block;
- background: darken($ui-base-color, 8%);
- font-size: 15px;
- border: 1px solid lighten($ui-base-color, 8%);
- border-radius: 2px;
- padding: 1px 3px;
- }
- }
-
- &--centered {
- padding: 25px;
- padding-bottom: 30px;
- text-align: center;
- }
- }
-
- &__dots {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 25px;
-
- @media screen and (max-width: 630px) {
- display: none;
- }
- }
-
- &__dot {
- width: 14px;
- height: 14px;
- border-radius: 14px;
- border: 1px solid $ui-highlight-color;
- background: transparent;
- margin: 0 3px;
- cursor: pointer;
-
- &:hover {
- background: lighten($ui-base-color, 8%);
- }
-
- &.active {
- cursor: default;
- background: $ui-highlight-color;
- }
- }
-
- &__action {
- padding: 25px;
- padding-top: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-}
diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss
index a719044ea..f553c5501 100644
--- a/app/javascript/styles/mastodon/polls.scss
+++ b/app/javascript/styles/mastodon/polls.scss
@@ -64,8 +64,8 @@
max-width: calc(100% - 45px - 25px);
}
- input[type=radio],
- input[type=checkbox] {
+ input[type="radio"],
+ input[type="checkbox"] {
display: none;
}
@@ -73,7 +73,7 @@
flex: 1 1 auto;
}
- input[type=text] {
+ input[type="text"] {
display: block;
box-sizing: border-box;
width: 100%;
@@ -109,7 +109,6 @@
box-sizing: border-box;
width: 18px;
height: 18px;
- flex: 0 0 auto;
margin-right: 10px;
top: -1px;
border-radius: 50%;
@@ -198,7 +197,7 @@
&:active,
&:focus {
- background-color: rgba($dark-text-color, .1);
+ background-color: rgba($dark-text-color, 0.1);
}
}
diff --git a/app/javascript/styles/mastodon/statuses.scss b/app/javascript/styles/mastodon/statuses.scss
index 078714325..a3237a630 100644
--- a/app/javascript/styles/mastodon/statuses.scss
+++ b/app/javascript/styles/mastodon/statuses.scss
@@ -80,7 +80,7 @@
.button.logo-button {
flex: 0 auto;
font-size: 14px;
- background: $ui-highlight-color;
+ background: darken($ui-highlight-color, 2%);
color: $primary-text-color;
text-transform: none;
line-height: 1.2;
@@ -104,7 +104,7 @@
&:active,
&:focus,
&:hover {
- background: lighten($ui-highlight-color, 10%);
+ background: $ui-highlight-color;
}
&:disabled,
@@ -139,7 +139,7 @@ a.button.logo-button {
.embed,
.public-layout {
- .status__content[data-spoiler=folded] {
+ .status__content[data-spoiler="folded"] {
.e-content {
display: none;
}
diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss
index f463419c8..be2c900ea 100644
--- a/app/javascript/styles/mastodon/variables.scss
+++ b/app/javascript/styles/mastodon/variables.scss
@@ -12,7 +12,7 @@ $red-bookmark: $warning-red;
$classic-base-color: #282c37; // Midnight Express
$classic-primary-color: #9baec8; // Echo Blue
$classic-secondary-color: #d9e1e8; // Pattens Blue
-$classic-highlight-color: #2b90d9; // Summer Sky
+$classic-highlight-color: #6364ff; // Brand purple
// Variables for defaults in UI
$base-shadow-color: $black !default;
@@ -34,10 +34,11 @@ $primary-text-color: $white !default;
$darker-text-color: $ui-primary-color !default;
$dark-text-color: $ui-base-lighter-color !default;
$secondary-text-color: $ui-secondary-color !default;
-$highlight-text-color: $ui-highlight-color !default;
+$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
$action-button-color: $ui-base-lighter-color !default;
$passive-text-color: $gold-star !default;
$active-passive-text-color: $success-green !default;
+
// For texts on inverted backgrounds
$inverted-text-color: $ui-base-color !default;
$lighter-text-color: $ui-base-lighter-color !default;
@@ -48,6 +49,7 @@ $cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW;
// Variables for components
$media-modal-media-max-width: 100%;
+
// put margins on top and bottom of image to avoid the screen covered by image.
$media-modal-media-max-height: 80%;
diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss
index fdf2e59b6..66d451303 100644
--- a/app/javascript/styles/win95.scss
+++ b/app/javascript/styles/win95.scss
@@ -9,6 +9,7 @@ $win95-mid-grey: #808080;
$win95-window-header: #00007f;
$win95-tooltip-yellow: #ffffcc;
$win95-blue: blue;
+$win95-cyan: #008080;
$ui-base-lighter-color: $win95-dark-grey;
$ui-highlight-color: $win95-window-header;
@@ -21,6 +22,12 @@ $ui-highlight-color: $win95-window-header;
border-radius:0px;
}
+@mixin win95-border-outset-sides-only() {
+ border-left: 2px solid #efefef;
+ border-right: 2px solid #404040;
+ border-radius:0px;
+}
+
@mixin win95-outset() {
box-shadow: inset -1px -1px 0px #000000,
inset 1px 1px 0px #ffffff,
@@ -29,6 +36,12 @@ $ui-highlight-color: $win95-window-header;
border-radius:0px;
}
+@mixin win95-outset-no-highlight() {
+ box-shadow: inset -1px -1px 0px #000000,
+ inset -2px -2px 0px #808080;
+ border-radius:0px;
+}
+
@mixin win95-border-inset() {
border-left: 2px solid #404040;
border-top: 2px solid #404040;
@@ -54,6 +67,7 @@ $ui-highlight-color: $win95-window-header;
border-radius:0px;
}
+
@mixin win95-tab() {
box-shadow: inset -1px 0px 0px #000000,
inset 1px 0px 0px #ffffff,
@@ -66,8 +80,14 @@ $ui-highlight-color: $win95-window-header;
border-top-right-radius: 1px;
}
+@mixin win95-border-groove() {
+ border-radius: 0px;
+ border: 2px groove #bfbfbf;
+}
+
@mixin win95-reset() {
box-shadow: unset;
+ border: 0px solid transparent;
}
@font-face {
@@ -80,49 +100,98 @@ $ui-highlight-color: $win95-window-header;
/* borrowed from cybrespace style: wider columns and full column width images */
@media screen and (min-width: 1300px) {
- .column {
+ .drawer {
+ width: 17%; /* Not part of the flex fun */
+ max-width: 400px;
+ min-width: 330px;
+ }
+ .layout-multiple-columns .column {
flex-grow: 1 !important;
max-width: 400px;
}
+}
- .drawer {
- width: 17%;
- max-width: 400px;
- min-width: 330px;
+/* Don't show outline around statuses if we're in
+ * mouse or touch mode (rather than keyboard) */
+[data-whatinput="mouse"], [data-whatinput="touch"] {
+ .status__content:focus, .status:focus,
+ .status__wrapper:focus, .status__content__text:focus {
+ outline: none;
}
}
-.media-gallery,
-.video-player {
- max-height:30vh;
- height:30vh !important;
- position:relative;
- margin-top:20px;
- margin-left:-68px;
- width: calc(100% + 80px) !important;
- max-width: calc(100% + 80px);
+/* Less emphatic show more */
+.status__content__read-more-button {
+ font-size: 14px;
+ color: $dark-text-color;
+
+ .status__prepend-icon {
+ padding-right: 4px;
+ }
+}
+
+/* Show a little arrowey thing after the time in a
+ * status to signal that you can click it to see
+ * a detailed view */
+.status time:after,
+.detailed-status__datetime span:after {
+ font: normal normal normal 14px/1 FontAwesome;
+ content: "\00a0\00a0\f08e";
+}
+
+/* Don't display the elephant mascot (we have our
+ * own, thanks) */
+.drawer__inner__mastodon {
+ display: none;
+}
+
+/* Let the compose area/drawer be short, but
+ * expand if necessary */
+.drawer .drawer__inner {
+ overflow: visible;
+ height:inherit;
+ background-image: none;
+}
+.drawer__pager {
+ overflow-y:auto;
+}
+
+/* Put a reasonable background on the single-column compose form */
+.layout-single-column .compose-panel {
+ background-color: $ui-base-color;
+ height: auto;
+ max-height: 100%;
+ overflow-y: visible;
+ margin-top: 65px;
}
-.detailed-status .media-gallery,
-.detailed-status .video-player {
- margin-left:-5px;
- width: calc(100% + 9px);
- max-width: calc(100% + 9px);
+/* Better distinguish the search bar */
+.layout-single-column .compose-panel .search {
+ position:relative;
+ top: -55px;
+ margin-bottom: -55px;
}
-.video-player video {
- transform: unset;
- top: unset;
+/* Use display: none instead of visibility:hidden
+ * to hide the suggested follows list on non-mobile */
+@media screen and (min-width: 630px) {
+ .search-results .trends {
+ display:none;
+ }
}
-.detailed-status .media-spoiler,
-.status .media-spoiler {
- height: 100%!important;
- vertical-align: middle;
+/* Don't display the weird triangles on the modal layout,
+ * because they look strange on cybrespace themes. */
+.modal-layout__mastodon {
+ display:none;
}
/* main win95 style */
+html {
+ scrollbar-color: $win95-mid-grey transparent;
+}
+
body {
font-size:13px;
font-family: "MS Sans Serif", "premillenium", sans-serif;
@@ -132,7 +201,7 @@ body {
.ui,
.ui .columns-area,
body.admin {
- background: #008080;
+ background: $win95-cyan;
}
.loading-bar {
@@ -140,6 +209,10 @@ body.admin {
background-color: #000080;
}
+.tabs-bar__wrapper {
+ background-color: $win95-cyan;
+}
+
.tabs-bar {
background: $win95-bg;
@include win95-outset();
@@ -214,10 +287,6 @@ body.admin {
z-index:2;
}
-.column {
- max-height:100vh;
-}
-
.column > .scrollable {
background: $win95-bg;
@include win95-border-outset();
@@ -231,7 +300,7 @@ body.admin {
}
.column-header {
- padding:2px;
+ padding:0px;
font-size:13px;
background:#7f7f7f;
@include win95-border-outset();
@@ -239,6 +308,12 @@ body.admin {
color:white;
font-weight:bold;
align-items:baseline;
+ min-height: 24px;
+}
+
+.column-header > button {
+ padding: 0px;
+ min-height: 22px;
}
.column-header__wrapper.active {
@@ -259,18 +334,22 @@ body.admin {
.column-header__buttons {
max-height: 20px;
- margin-right:0px;
+ margin: 2px;
+ margin-left: -2px;
+}
+
+.column-header__buttons button {
+ margin-left: 2px;
}
.column-header__button {
background: $win95-bg;
color: black;
+ @include win95-outset();
+
line-height:0px;
font-size:14px;
- max-height:20px;
- padding:0px 2px;
- margin-top:2px;
- @include win95-outset();
+ padding:0px 4px;
&:hover {
color: black;
@@ -282,24 +361,34 @@ body.admin {
background-color:#7f7f7f;
}
-.column-header__back-button {
+// selectivity -- needs to override .column-header > button
+.column-header .column-header__back-button {
background: $win95-bg;
color: black;
padding:2px;
- max-height:20px;
- margin-top:2px;
+ padding-right: 4px;
+ max-height: 20px;
+ min-height: unset;
+ margin: 2px;
@include win95-outset();
- font-size:13px;
+ font-size: 13px;
+ line-height: 17px;
font-weight:bold;
}
+.column-header__buttons .column-header__back-button {
+ margin: 0;
+}
+
.column-back-button {
background:$win95-bg;
color:black;
@include win95-outset();
- padding:2px;
font-size:13px;
font-weight:bold;
+
+ padding: 2px;
+ height: 26px;
}
.column-back-button--slim-button {
@@ -307,8 +396,8 @@ body.admin {
top:-22px;
right:4px;
max-height:20px;
- max-width:60px;
- padding:0px 2px;
+ padding: 1px 6px 0 2px;
+ box-sizing: border-box;
}
.column-back-button__icon {
@@ -331,10 +420,9 @@ body.admin {
}
.column-header__collapsible__extra div[role="group"] {
- border: 2px groove $win95-bg;
- border-radius:4px;
- margin-bottom:8px;
- padding:4px;
+ border: 2px groove #eee;
+ margin-bottom: 11px;
+ padding: 4px;
}
.column-inline-form {
@@ -342,19 +430,37 @@ body.admin {
@include win95-border-outset();
border-bottom-width:0px;
border-top-width:0px;
+
+ align-items: baseline;
+}
+
+.column-inline-form .icon-button {
+ font-size: 14px!important;
+ line-height: 17px!important;
+}
+
+.column-inline-form .setting-text {
+ line-height: 17px;
+ padding-left: 4px;
}
.column-settings__section {
color:black;
font-weight:bold;
font-size:11px;
- position:relative;
- top: -12px;
- left:4px;
- background-color:$win95-bg;
+}
+
+[role="group"] .column-settings__section {
display:inline-block;
- padding:0px 4px;
- margin-bottom:0px;
+ background-color:$win95-bg;
+ position:relative;
+
+ top: -14px;
+ top: calc(-1em - 0.5ex);
+ left: 4px;
+
+ padding: 0px 4px;
+ margin-bottom: 0px;
}
.setting-meta__label, .setting-toggle__label {
@@ -448,8 +554,7 @@ body.admin {
}
.missing-indicator > div {
- background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC')
- no-repeat;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC') no-repeat;
background-position:center center;
}
@@ -459,6 +564,34 @@ body.admin {
color: black;
}
+.notification__filter-bar {
+ background: $win95-bg;
+ @include win95-border-outset-sides-only();
+ padding-top: 10px;
+ padding-left: 10px;
+ padding-right: 10px;
+ border-bottom: 2px solid #efefef;
+ overflow-y: visible;
+
+ button {
+ background: transparent;
+ color: black;
+ padding: 8px 0;
+ align-self: end;
+ @include win95-tab();
+
+ &.active {
+ color: black;
+ top: 2px;
+ background-color: $win95-bg;
+
+ &::before, &::after {
+ display:none;
+ }
+ }
+ }
+}
+
.status__wrapper {
border: 2px groove $win95-bg;
margin:4px;
@@ -473,11 +606,37 @@ body.admin {
}
.status.status-direct {
- background-color:$win95-bg;
+ background:$win95-bg;
+ &:focus, &:active {
+ background:$win95-bg;
+ }
+
+ &:not(.read) {
+ background: white;
+ }
+}
+.focusable:focus .status.status-direct {
+ background:$win95-bg;
}
-.status__content {
+[data-whatinput="mouse"], [data-whatinput="touch"] {
+ .status__content:focus, .status:focus,
+ .status__wrapper:focus, .status__content__text:focus {
+ background-color: $win95-bg;
+ }
+
+ .status.status-direct, .detailed-status {
+ &:not(.read) {
+ .status__content:focus {
+ background-color: white;
+ }
+ }
+ }
+}
+
+.status__content, .reply-indicator__content {
font-size:13px;
+ color: black;
}
.status.light .status__relative-time,
@@ -573,6 +732,7 @@ body.admin {
justify-items:left;
padding-left:4px;
}
+
.icon-button {
background:$win95-bg;
@include win95-border-outset();
@@ -636,15 +796,15 @@ body.admin {
padding-right:25px;
}
-.status-card {
+.status-card, .status-card.compact, a.status-card, a.status-card.compact {
border-radius:0px;
background:white;
border: 1px solid black;
color:black;
-}
-.status-card:hover {
- background-color:white;
+ &:hover {
+ background-color:white;
+ }
}
.status-card__title {
@@ -681,7 +841,7 @@ body.admin {
}
.account {
- border-bottom: 2px groove $win95-bg;
+ border-bottom: none;
}
.reply-indicator__content .status__content__spoiler-link, .status__content .status__content__spoiler-link {
@@ -715,6 +875,7 @@ body.admin {
font-weight:bold;
}
+
.drawer__header {
background: $win95-bg;
@include win95-border-outset();
@@ -819,6 +980,23 @@ body.admin {
color:blue;
}
+.search-results__section h5:before {
+ display: none;
+}
+
+.search-results__section h5 {
+ background: #bfbfbf;
+ span {
+ color: black;
+ padding: 0px 2px;
+ }
+}
+
+.search-results__section {
+ border: 3px groove white;
+ margin: 11px 6px 9px 3px;
+}
+
.search-results__section .account:hover,
.search-results__section .account:hover .account__display-name,
.search-results__section .account:hover .account__display-name strong,
@@ -839,6 +1017,11 @@ body.admin {
}
}
+.trends__item__name a,
+.trends__item__current {
+ color: black;
+}
+
.drawer__inner,
.drawer__inner.darker {
background-color:$win95-bg;
@@ -893,6 +1076,10 @@ body.admin {
border-left: 2px groove $win95-bg;
}
+.compose-form__poll-wrapper .icon-button.disabled {
+ color: $win95-mid-grey;
+}
+
.privacy-dropdown.active .privacy-dropdown__value.active,
.advanced-options-dropdown.open .advanced-options-dropdown__value {
background: $win95-bg;
@@ -932,32 +1119,34 @@ body.admin {
font-weight:bold;
}
-.compose-form__warning::before {
- content:"Tip:";
- font-weight:bold;
- display:block;
- position:absolute;
- top:-10px;
- background-color:$win95-bg;
- font-size:11px;
- padding: 0px 5px;
-}
+.compose-form {
+ .compose-form__warning::before {
+ content:"Tip:";
+ font-weight:bold;
+ display:block;
+ position:absolute;
+ top:-10px;
+ background-color:$win95-bg;
+ font-size:11px;
+ padding: 0px 5px;
+ }
-.compose-form__warning {
- position:relative;
- box-shadow:unset;
- border:2px groove $win95-bg;
- background-color:$win95-bg;
- color:black;
-}
+ .compose-form__warning {
+ position:relative;
+ box-shadow:unset;
+ border:2px groove $win95-bg;
+ background-color:$win95-bg;
+ color:black;
+ }
-.compose-form__warning a {
- color:blue;
-}
+ .compose-form__warning a {
+ color:blue;
+ }
-.compose-form__warning strong {
- color:black;
- text-decoration:underline;
+ .compose-form__warning strong {
+ color:black;
+ text-decoration:underline;
+ }
}
.compose-form__buttons button.active:last-child {
@@ -1052,67 +1241,95 @@ body.admin {
}
-#Getting-started {
- background-color:$win95-bg;
- @include win95-inset();
- border-bottom-width:0px;
+.button.button-secondary {
+ background-color: $win95-bg;
}
-#Getting-started::before {
- content:"Start";
+.column-link {
+ background-color:transparent;
color:black;
- font-weight:bold;
- font-size:15px;
- width:80%;
- text-align:center;
- display:block;
- position:absolute;
- right:2px;
+ &:hover {
+ background-color: $win95-window-header;
+ color:white;
+ }
}
-#Getting-started {
+.column-link__badge {
+ background-image: url('~images/alert_badge.png');
+ background-repeat: no-repeat;
+ background-size:contain;
+ background-color:transparent;
+ border-radius:0;
+ box-sizing: border-box;
+ width: 24px;
+ height:24px;
+ padding-top:4px;
+ padding-left:0px;
+ padding-right:1px;
+ text-align:center;
position:relative;
- padding:5px 15px;
- width:60px;
- font-size:0px;
- color:$win95-bg;
+ top:2px;
+}
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=");
- background-repeat:no-repeat;
- background-position:8%;
- background-clip:padding-box;
- background-size:auto 50%;
+.column-link:hover .column-link__badge {
+ color:black;
}
.column-subheading {
background-color:$win95-bg;
color:black;
- border-bottom: 2px groove $win95-bg;
- text-transform: none;
- font-size: 16px;
+ @include win95-border-outset-sides-only;
}
-.column-link {
- background-color:transparent;
- color:black;
- &:hover {
- background-color: $win95-window-header;
- color:white;
- }
+.column {
+ overflow-y:auto;
+}
+
+.getting-started {
+ background: none;
+ position:relative;
+ top:-30px;
+ padding-top:30px;
+ z-index:10;
+ overflow-y:auto;
+ background-color: $win95-cyan;
}
.getting-started__wrapper {
+ padding-top:0px;
+
+ box-shadow: inset -1px 0px 0px #000000,
+ inset 1px 1px 0px #ffffff,
+ inset -2px 0px 0px #808080,
+ inset 2px 2px 0px #dfdfdf;
+ border-radius:0px;
+
+ background-color:$win95-bg;
+ border-bottom: 2px groove $win95-bg;
+
+ height: unset !important;
+
+ .navigation-bar {
+ padding-left: 45px;
+ }
+
.column-subheading {
font-size:0px;
margin:0px;
padding:0px;
+ background-color: transparent;
+ color:black;
+ border-bottom: 2px groove $win95-bg;
+ text-transform: none;
}
- .column-link {
+}
+
+.column-link {
background-size:32px 32px;
background-repeat:no-repeat;
background-position: 36px 50%;
- padding-left:40px;
+ padding-left:45px;
&:hover {
background-size:32px 32px;
@@ -1125,18 +1342,158 @@ body.admin {
width:32px;
}
}
+
+.getting-started__wrapper::before {
+ content: "Start";
+ display:block;
+ color:black;
+ font-weight:bold;
+ font-size:15px;
+ position:absolute;
+ top:0px;
+ left:0px;
+ padding:5px 15px;
+ width:50px;
+ font-size:16px;
+ padding-left:25px;
+ background-color:$win95-bg;
+ z-index:12;
+
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=");
+ background-repeat:no-repeat;
+ background-position:8%;
+ background-clip:padding-box;
+ background-size:auto 50%;
+
+ @include win95-border-inset();
}
-.column-link[href="/web/timelines/public"] {
- background-image: url("~images/icon_public.png");
- &:hover { background-image: url("~images/icon_public.png"); }
+
+@media screen and (min-width: 360px) {
+ .getting-started__wrapper{
+ margin-bottom:0px;
+ }
}
-.column-link[href="/web/timelines/public/local"] {
- background-image: url("~images/icon_local.png");
- &:hover { background-image: url("~images/icon_local.png"); }
+
+@media screen and (max-width: 360px) {
+ .getting-started {
+ top:0px;
+ padding-top:0px;
+ }
+
+ .getting-started__wrapper::before {
+ display:none;
+ }
}
-.column-link[href="/web/pinned"] {
- background-image: url("~images/icon_pin.png");
+
+.getting-started__footer {
+ background-color: $win95-bg;
+ padding:0px;
+ padding-bottom:10px;
+ position:relative;
+ top:0px;
+
+ @include win95-outset-no-highlight();
+
+ p {
+ margin-left: 45px;
+ }
+
+ ul {
+ display:block;
+ li {
+ cursor:pointer;
+ display:block;
+ font-size:0px;
+ padding:0px;
+ line-height:0;
+ a {
+ padding:15px;
+ padding-left:77px;
+ line-height:1em;
+ font-size:16px;
+ display:block;
+ color:black;
+ background-size:32px 32px;
+ background-repeat:no-repeat;
+ background-position: 36px 50%;
+ &:hover {
+ text-decoration:none;
+ }
+ }
+
+ &:hover {
+ background-color: $win95-window-header;
+ a {
+ color:white;
+ }
+ }
+ }
+ }
+}
+
+.getting-started__footer::after {
+ content:"Mastodon 95";
+ font-weight:bold;
+ font-size:23px;
+ color:white;
+ line-height:30px;
+ padding-left:20px;
+ padding-right:40px;
+
+ left:0px;
+ box-sizing:border-box;
+ bottom:-32px;
+ display:block;
+ position:absolute;
+ background-color:#7f7f7f;
+ width:1000px;
+ height:32px;
+
+ z-index:11;
+
+ border-left: 2px solid #404040;
+ border-top: 2px solid #efefef;
+ border-right: 2px solid #efefef;
+ border-radius:0px;
+
+ -ms-transform: rotate(-90deg);
+
+ -webkit-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+ transform-origin:top left;
+}
+
+.layout-single-column .getting-started__footer::after {
+ display: none;
+}
+
+.getting-started__wrapper + .flex-spacer {
+ display:none;
+}
+
+.column-link[href="/web/timelines/home"] {
+ background-image: url("~images/icon_home.png");
+ &:hover { background-image: url("~images/icon_home.png"); }
+}
+.column-link[href="/web/notifications"] {
+ background-image: url("~images/icon_notifications.png");
+ &:hover { background-image: url("~images/icon_notifications.png"); }
+}
+.column-link[href="/web/timelines/public"] {
+ background-image: url("~images/icon_public.png");
+ &:hover { background-image: url("~images/icon_public.png"); }
+}
+.column-link[href="/web/timelines/public/local"] {
+ background-image: url("~images/icon_local.png");
+ &:hover { background-image: url("~images/icon_local.png"); }
+}
+.column-link[href="/web/timelines/direct"] {
+ background-image: url("~images/icon_direct.png");
+ &:hover { background-image: url("~images/icon_direct.png"); }
+}
+.column-link[href="/web/pinned"] {
+ background-image: url("~images/icon_pin.png");
&:hover { background-image: url("~images/icon_pin.png"); }
}
.column-link[href="/web/favourites"] {
@@ -1151,62 +1508,62 @@ body.admin {
background-image: url("~images/icon_follow_requests.png");
&:hover { background-image: url("~images/icon_follow_requests.png"); }
}
-.column-link[href="/web/keyboard-shortcuts"] {
- background-image: url("~images/icon_keyboard_shortcuts.png");
- &:hover { background-image: url("~images/icon_keyboard_shortcuts.png"); }
-}
.column-link[href="/web/blocks"] {
background-image: url("~images/icon_blocks.png");
&:hover { background-image: url("~images/icon_blocks.png"); }
}
+.column-link[href="/web/domain_blocks"] {
+ background-image: url("~images/icon_domain_blocks.png");
+ &:hover { background-image: url("~images/icon_domain_blocks.png"); }
+}
.column-link[href="/web/mutes"] {
background-image: url("~images/icon_mutes.png");
&:hover { background-image: url("~images/icon_mutes.png"); }
}
-.column-link[href="/settings/preferences"] {
- background-image: url("~images/icon_settings.png");
- &:hover { background-image: url("~images/icon_settings.png"); }
+.column-link[href="/web/directory"] {
+ background-image: url("~images/icon_profile_directory.png");
+ &:hover { background-image: url("~images/icon_profile_directory.png"); }
+}
+.column-link[href="/web/bookmarks"] {
+ background-image: url("~images/icon_bookmarks.png");
+ &:hover { background-image: url("~images/icon_bookmarks.png"); }
+}
+
+.getting-started__footer ul li a[href="/web/keyboard-shortcuts"] {
+ background-image: url("~images/icon_keyboard_shortcuts.png");
+ &:hover { background-image: url("~images/icon_keyboard_shortcuts.png"); }
}
-.column-link[href="/about/more"] {
+.getting-started__footer ul li a[href="/invites"] {
+ background-image: url("~images/icon_invite.png");
+ &:hover { background-image: url("~images/icon_invite.png"); }
+}
+.getting-started__footer ul li a[href="/terms"] {
+ background-image: url("~images/icon_tos.png");
+ &:hover { background-image: url("~images/icon_tos.png"); }
+}
+.getting-started__footer ul li a[href="https://docs.joinmastodon.org"] {
+ background-image: url("~images/icon_docs.png");
+ &:hover { background-image: url("~images/icon_docs.png"); }
+}
+.getting-started__footer ul li a[href="/about/more"] {
background-image: url("~images/icon_about.png");
&:hover { background-image: url("~images/icon_about.png"); }
}
-.column-link[href="/auth/sign_out"] {
+.getting-started__footer ul li a[href="/auth/sign_out"] {
background-image: url("~images/icon_logout.png");
&:hover { background-image: url("~images/icon_logout.png"); }
}
-
-.getting-started__footer {
- display:none;
+.getting-started__footer ul li a[href="https://joinmastodon.org/apps"] {
+ background-image: url("~images/icon_mobile_apps.png");
+ &:hover { background-image: url("~images/icon_mobile_apps.png"); }
}
-
-.getting-started__wrapper::before {
- content:"Mastodon 95";
- font-weight:bold;
- font-size:23px;
- color:white;
- line-height:30px;
- padding-left:20px;
- padding-right:40px;
-
- left:0px;
- bottom:-30px;
- display:block;
- position:absolute;
- background-color:#7f7f7f;
- width:200%;
- height:30px;
-
- -ms-transform: rotate(-90deg);
-
- -webkit-transform: rotate(-90deg);
- transform: rotate(-90deg);
- transform-origin:top left;
+.getting-started__footer ul li a[href="/settings/applications"] {
+ background-image: url("~images/icon_developers.png");
+ &:hover { background-image: url("~images/icon_developers.png"); }
}
-
-.getting-started__wrapper {
- @include win95-border-outset();
- background-color:$win95-bg;
+.getting-started__footer ul li a[href="/auth/edit"] {
+ background-image: url("~images/icon_settings.png");
+ &:hover { background-image: url("~images/icon_settings.png"); }
}
.column .static-content.getting-started {
@@ -1225,12 +1582,37 @@ body.admin {
color:white;
}
+.account__header__fields {
+ border-left: 1px solid black;
+ border-top: 1px solid black;
+
+ dt {
+ background-color:$win95-bg;
+ color:black;
+ border-top: 1px solid #ffffff;
+ border-bottom: 1px solid $win95-mid-grey;
+ border-right: 1px solid $win95-mid-grey;
+ }
+ dd {
+ background-color:white;
+ border: 1px solid $win95-bg;
+ color:black;
+ }
+ dd,dt {
+ padding: 5px 8px;
+ }
+}
+
.account-authorize__wrapper {
border: 2px groove $win95-bg;
margin: 2px;
padding:2px;
}
+.domain .domain__domain-name strong {
+ color: black;
+}
+
.account--panel {
background-color: $win95-bg;
border:0px;
@@ -1263,18 +1645,75 @@ body.admin {
@include win95-inset();
}
+.account__section-headline {
+ background: $win95-bg;
+ margin-top: 5px;
+
+ & > a {
+ @include win95-tab();
+ color: black;
+ padding: 5px;
+
+ &.active {
+ background: $win95-bg;
+ @include win95-inset();
+ color: black;
+
+ &:before, &:after {
+ display: none;
+ }
+ }
+ }
+}
+
.dropdown--active .dropdown__content > ul,
.dropdown-menu {
background:$win95-tooltip-yellow;
border-radius:0px;
border:1px solid black;
box-shadow:unset;
+ margin-top: 6px;
}
.dropdown-menu a {
background-color:transparent;
}
+.dropdown-menu__arrow {
+ &.bottom {
+ border-bottom-color: $win95-tooltip-yellow;
+ }
+
+ &.top {
+ border-top-color: $win95-tooltip-yellow;
+ }
+
+ &:before {
+ position: relative;
+ border: 0 solid transparent;
+ display: block;
+ content: '';
+ left: -8px;
+ z-index: -1;
+ }
+
+ &.bottom::before {
+ border-bottom-color: black;
+ border-width: 0 8px 6px;
+ bottom: 1px;
+ }
+
+ &.top::before {
+ border-top-color: black;
+ border-width: 6px 8px 0;
+ top: -5px;
+ }
+}
+
+.dropdown-menu {
+ margin-top: 6px;
+}
+
.dropdown--active::after {
display:none;
}
@@ -1301,11 +1740,11 @@ body.admin {
}
.detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left {
- left:unset;
+ left: unset;
}
-.dropdown > .icon-button, .detailed-status__button > .icon-button,
-.status__action-bar > .icon-button, .star-icon i {
+.dropdown > .icon-button, .detailed-status__action-bar .icon-button,
+.status__action-bar .icon-button, .star-icon i {
/* i don't know what's going on with the inline
styles someone should look at the react code */
height: 25px !important;
@@ -1313,39 +1752,52 @@ body.admin {
box-sizing: border-box;
}
-.status__action-bar-button .fa-floppy-o {
- padding-top: 2px;
+.icon-button {
+ height: auto!important;
+ width: auto!important;
}
-.status__action-bar-dropdown {
- position: relative;
- top: -3px;
+.status__action-bar-dropdown .icon-button {
+ position: relative;
+ top: -1px;
}
-.detailed-status__action-bar-dropdown .dropdown {
- position: relative;
- top: -4px;
+.fa-user-plus, .fa-user-times {
+ padding: 2px 0px 2px 1px;
+}
+
+.fa-ellipsis-h {
+ padding-top: 3px;
+}
+
+.status__action-bar-button .fa-floppy-o {
+ padding-top: 2px;
}
.notification .status__action-bar {
- border-bottom: none;
+ border-bottom: none;
}
.notification .status {
- margin-bottom: 4px;
+ margin-bottom: 4px;
}
.status__wrapper .status {
- margin-bottom: 3px;
+ margin-bottom: 3px;
}
.status__wrapper {
- margin-bottom: 8px;
+ margin-bottom: 8px;
+}
+
+.status__prepend {
+ color: black;
+ font-size: 13px;
}
.icon-button .fa-retweet {
- position: relative;
- top: -1px;
+ position: relative;
+ top: -1px;
}
.embed-modal, .error-modal, .onboarding-modal,
@@ -1389,6 +1841,13 @@ body.admin {
text-align:left;
}
+.media-modal .media-modal__close {
+ font-size: 14px!important;
+ line-height: 17px!important;
+ margin-right: 4vw;
+ margin-top: 4vh;
+}
+
.confirmation-modal__action-bar {
.confirmation-modal__cancel-button {
color:black;
@@ -1412,11 +1871,42 @@ body.admin {
@include win95-inset();
}
+.report-modal__target .media-modal__close {
+ top: 3px;
+ right: 0px;
+ font-size: 12px!important;
+ line-height: 13px!important;
+}
+
+.report-modal__comment p {
+ font-size: 12px;
+ margin-bottom: 1em;
+ padding-left: 3px;
+}
+
+.report-modal__comment .setting-text.light {
+ border-radius: 0;
+}
+
+.report-modal__container {
+ margin-right: 2px;
+}
+
+.report-modal::before {
+ height: 22px;
+ line-height: 23px;
+}
+
+.status-check-box__status .media-gallery {
+ margin: unset;
+}
+
.modal-root__overlay,
.account__header > div {
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII=');
}
+
.admin-wrapper::before {
position:absolute;
top:0px;
@@ -1439,6 +1929,7 @@ body.admin {
@include win95-outset();
width:70vw;
height:80vh;
+ min-height:80vh;
margin:10vh auto;
color: black;
padding-top:24px;
@@ -1466,6 +1957,7 @@ body.admin {
.admin-wrapper .sidebar-wrapper {
position:static;
height:auto;
+ min-height:auto;
flex: 0 0 auto;
margin:2px;
}
@@ -1473,12 +1965,15 @@ body.admin {
.admin-wrapper .content-wrapper {
flex: 1 1 auto;
width:calc(100% - 20px);
+ max-width:calc(100% - 20px);
@include win95-border-outset();
position:relative;
margin-left:10px;
margin-right:10px;
margin-bottom:40px;
box-sizing:border-box;
+ overflow-y:scroll;
+ height: 100%;
}
.admin-wrapper .content {
@@ -1489,6 +1984,9 @@ body.admin {
box-sizing:border-box;
position:relative;
}
+.admin-wrapper .content h4 {
+ color: black;
+}
.admin-wrapper .sidebar {
position:static;
@@ -1611,6 +2109,10 @@ body.admin {
}
}
+.admin-wrapper .sidebar ul .simple-navigation-active-leaf a:hover {
+ background: $win95-bg;
+}
+
@media screen and (max-width: 1520px) {
.admin-wrapper .sidebar > ul > li > ul {
max-width:1000px;
@@ -1657,7 +2159,20 @@ body.admin {
@include win95-border-slight-inset();
}
+.admin-wrapper .table th, .table td {
+ background-color:transparent;
+}
+
+.admin-wrapper button.table-action-link,
+.admin-wrapper a.table-action-link,
+.admin-wrapper button.table-action-link:hover,
+.admin-wrapper a.table-action-link:hover,
+.admin-wrapper a.name-tag,
+.admin-wrapper .name-tag,
+.admin-wrapper a.inline-name-tag,
+.admin-wrapper .inline-name-tag,
.admin-wrapper .content h2,
+.admin-wrapper .content h3,
.simple_form .input.with_label .label_input > label,
.admin-wrapper .content h6,
.admin-wrapper .content > p,
@@ -1671,10 +2186,48 @@ body.admin {
a.table-action-link,
a.table-action-link:hover,
.simple_form .input.with_block_label > label,
-.simple_form p.hint {
+.simple_form p.hint,
+.admin-wrapper .content > p strong,
+.simple_form .input.with_floating_label .label_input > label,
+.admin-wrapper .content .fields-group h6 {
color:black;
}
+.report-card {
+ background: white;
+ border: 1px solid black;
+ border-radius: 0px;
+}
+
+.report-card__summary__item:hover {
+ background: white;
+}
+
+.report-card__summary__item__content a {
+ color: black;
+}
+
+.directory__tag > a, .directory__tag > div,
+.directory__tag > a:hover, .directory__tag > a:active, .directory__tag > a:focus {
+ background: white;
+ border: 1px solid black;
+ border-radius: 0px;
+}
+
+.admin-wrapper .content .directory__tag h4 {
+ color: black;
+}
+
+.simple_form .hint code {
+ background: $win95-bg;
+ border-radius: 0px;
+}
+
+.input-copy {
+ background: transparent;
+ border: 0px solid transparent;
+}
+
.table > tbody > tr:nth-child(2n+1) > td,
.table > tbody > tr:nth-child(2n+1) > th {
background-color:white;
@@ -1729,6 +2282,12 @@ a.table-action-link:hover,
background: $win95-bg;
}
+.simple_form select {
+ background: white;
+ border-radius: 0px;
+ color: black;
+}
+
.filters .filter-subset {
border: 2px groove $win95-bg;
padding:2px;
@@ -1761,3 +2320,365 @@ a.table-action-link:hover,
color:black;
border-bottom: 0px solid transparent;
}
+
+.drawer__inner__mastodon {
+ display: none;
+}
+
+.list-editor h4 {
+ padding: 2px;
+ color: white;
+ font-size: 14px;
+ font-weight: bold;
+ background: #00007f;
+ border-radius: 0;
+}
+
+.list-editor {
+ @include win95-border-outset();
+ box-shadow: unset;
+}
+
+.list-editor .drawer__inner {
+ @include win95-inset();
+ border-radius: 0;
+}
+
+.batch-table__toolbar {
+ border-radius: 0px;
+ background-color:white;
+ border: 1px solid black;
+}
+
+.batch-table__row {
+ border: 1px solid black;
+ background-color: white;
+
+ &:hover {
+ background-color: white;
+ }
+}
+
+.batch-table__row:nth-child(2n) {
+ background-color: white;
+}
+
+.dashboard__counters > div > div,
+.dashboard__counters > div > a {
+ background-color: $win95-bg;
+ border: 1px solid black;
+ border-radius: 1px;
+ color:black;
+
+ &:hover {
+ background-color: $win95-bg;
+ }
+}
+
+.dashboard__counters__label,
+.dashboard__widgets a:not(.name-tag),
+.dashboard__counters__num {
+ color:black;
+}
+
+.card {
+ & > a, & > a:hover {
+ box-shadow: none;
+
+ .card__img {
+ border-radius: 0px;
+ border: 1px solid black;
+ }
+
+ .card__bar {
+ @include win95-outset();
+ background-color: $win95-bg;
+
+ .display-name {
+ strong, span {
+ color:black;
+ }
+ }
+ }
+ }
+}
+
+/* Public layout stuff */
+body {
+ background: $win95-cyan;
+}
+
+.public-layout {
+ max-width: 960px;
+ margin:10px auto;
+ background: $win95-bg;
+ padding:0px;
+ @include win95-outset();
+
+ .header {
+ background: $win95-window-header;
+ @include win95-border-outset();
+ height: 22px;
+ margin: 0px;
+ padding:0px;
+ border-radius: 0px;
+
+ .brand {
+ padding: 2px;
+ }
+
+ .nav-button {
+ @include win95-outset();
+ background: $win95-bg;
+ color:black;
+ margin: 2px;
+ margin-bottom: 0px;
+ &:hover {
+ background: $win95-bg;
+ color:black;
+ }
+ }
+ }
+ .footer {
+ background: none;
+ &, h4, ul a, .grid .column-2 h4 a {
+ color: black;
+ }
+ }
+
+ .button.logo-button {
+ @include win95-outset();
+ background: $win95-bg;
+ color:black;
+ &:hover {
+ background: $win95-bg;
+ color:black;
+ }
+ svg {
+ visibility:hidden;
+ }
+ &, &:hover {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII=");
+ background-repeat:no-repeat;
+ background-position:8%;
+ background-clip:padding-box;
+ background-size:auto 50%;
+ }
+ }
+
+ .public-account-header {
+ @include win95-reset();
+ padding: 4px;
+ .public-account-header__image {
+ @include win95-border-slight-inset();
+ border-radius: 0px;
+ }
+ }
+
+ .public-account-header__bar {
+ &, &:before {
+ background: transparent;
+ }
+ .avatar img {
+ @include win95-border-slight-inset();
+ filter: saturate(1.8) brightness(1.1);
+ border-radius: 0px;
+ background: darken($win95-bg, 9.09%);
+ }
+ }
+ .public-account-header__extra__links {
+ margin-top: 0px;
+ a, a strong {
+ color: black;
+ }
+ }
+
+ .public-account-header__tabs {
+ position: relative;
+ }
+
+ .public-account-header__tabs__name {
+ display: inline-block;
+ position: relative;
+ background: $win95-tooltip-yellow;
+ border: 1px solid black;
+ padding: 4px;
+
+ h1, h1 small {
+ color:black;
+ text-shadow: unset;
+ text-overflow: unset;
+ }
+
+ margin-bottom: 24px;
+
+ &:after {
+ content: "";
+ display:block;
+ position:absolute;
+ left: 0px;
+ bottom: -20px;
+ width: 0px;
+ height: 0px;
+ border-left: 20px solid $win95-tooltip-yellow;
+ border-bottom: 20px solid transparent;
+ }
+ &:before {
+ content: "";
+ display:block;
+ position:absolute;
+ left: -1px;
+ bottom: -22px;
+ width: 0px;
+ height: 0px;
+ border-left: 22px solid black;
+ border-bottom: 22px solid transparent;
+ }
+ }
+
+ .public-account-header__tabs__tabs {
+ .details-counters {
+ @include win95-border-groove();
+ .counter {
+ .counter-number, .counter-label {
+ color: black;
+ }
+ &:after {
+ border-bottom-width: 0px;
+ }
+ &.active {
+ @include win95-border-slight-inset();
+ }
+ }
+ }
+ }
+
+ .public-account-bio {
+ @include win95-reset();
+ @include win95-border-groove();
+ background: $win95-bg;
+ margin-right: 10px;
+ .account__header__content, .roles {
+ color: black;
+ }
+ }
+ .public-account-bio__extra {
+ color: black;
+ }
+
+ .status__prepend {
+ padding-top:5px;
+ }
+ .status__content ,
+ .reply-indicator__content {
+ .status__content__spoiler-link {
+ color: $win95-dark-grey;
+ }
+ }
+ .account__section-headline {
+ margin-left: 10px;
+ }
+ .card-grid {
+ margin-left: 10px;
+ }
+ .status {
+ padding: 15px 15px 55px 78px;
+ }
+}
+
+@media screen and (max-width: 1255px) {
+ .container {
+ width: 100%;
+ padding: 0px;
+ }
+}
+
+.hero-widget {
+ box-shadow: none;
+ @include win95-border-groove();
+ background: $win95-bg;
+ padding: 8px;
+ margin-right: 10px;
+ margin-top: 10px;
+}
+.hero-widget__text {
+ background: none;
+ color: black;
+}
+.hero-widget__img {
+ background: none;
+ border-radius: 0px;
+ border: 1px solid black;
+ img {
+ border-radius: 0px;
+ }
+}
+
+.activity-stream {
+ @include win95-reset();
+ @include win95-border-groove();
+
+ background: $win95-bg;
+ margin-top: 10px;
+ margin-left: 10px;
+ .entry {
+ background: none;
+ &:first-child:last-child, &:first-child {
+ .detailed-status, .status, .load-more {
+ border-radius: 0px;
+ }
+ }
+ }
+}
+
+.nothing-here {
+ @include win95-reset();
+ background: transparent;
+ color: black;
+}
+
+.flash-message.notice {
+ border: 1px solid black;
+ background: $win95-tooltip-yellow;
+ color:black;
+}
+
+.layout-single-column .compose-panel {
+ background: $win95-bg;
+}
+
+.layout-single-column .status__wrapper .status {
+ padding-bottom: 50px;
+}
+
+::-webkit-scrollbar {
+ width: 14px;
+}
+
+::-webkit-scrollbar-track {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAAAAABX3VL4AAAADklEQVQIW2P4f4DhwH8ACoADf0PlskQAAAAASUVORK5CYII=');
+
+ &:hover {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAAAAABX3VL4AAAADklEQVQIW2P4f4DhwH8ACoADf0PlskQAAAAASUVORK5CYII=');
+ }
+}
+
+::-webkit-scrollbar-thumb {
+ background: #bfbfbf;
+ border-color: #efefef #404040 #404040 #efefef;
+ border-style: solid;
+ border-width: 2px;
+
+ &:hover {
+ background: #bfbfbf;
+ border-color: #efefef #404040 #404040 #efefef;
+ border-style: solid;
+ border-width: 2px;
+ }
+
+ &:active {
+ background: #bfbfbf;
+ border-color: #404040 #efefef #efefef #404040;
+ }
+}
+
diff --git a/app/lib/access_token_extension.rb b/app/lib/access_token_extension.rb
index 2cafaaa20..f51bde492 100644
--- a/app/lib/access_token_extension.rb
+++ b/app/lib/access_token_extension.rb
@@ -4,6 +4,8 @@ module AccessTokenExtension
extend ActiveSupport::Concern
included do
+ include Redisable
+
after_commit :push_to_streaming_api
end
@@ -16,6 +18,6 @@ module AccessTokenExtension
end
def push_to_streaming_api
- Redis.current.publish("timeline:access_token:#{id}", Oj.dump(event: :kill)) if revoked? || destroyed?
+ redis.publish("timeline:access_token:#{id}", Oj.dump(event: :kill)) if revoked? || destroyed?
end
end
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index f599e1b58..7ff06ea39 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -3,6 +3,7 @@
class ActivityPub::Activity
include JsonLdHelper
include Redisable
+ include Lockable
SUPPORTED_TYPES = %w(Note Question).freeze
CONVERTED_TYPES = %w(Image Audio Video Article Page Event).freeze
@@ -157,22 +158,6 @@ class ActivityPub::Activity
end
end
- def lock_or_return(key, expire_after = 2.hours.seconds)
- yield if redis.set(key, true, nx: true, ex: expire_after)
- ensure
- redis.del(key)
- end
-
- def lock_or_fail(key, expire_after = 15.minutes.seconds)
- RedisLock.acquire({ redis: Redis.current, key: key, autorelease: expire_after }) do |lock|
- if lock.acquired?
- yield
- else
- raise Mastodon::RaceConditionError
- end
- end
- end
-
def fetch?
!@options[:delivery]
end
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 0674b1083..e6674be8a 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -4,7 +4,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
def perform
return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
- lock_or_fail("announce:#{@object['id']}") do
+ with_lock("announce:#{value_or_id(@object)}") do
original_status = status_from_object
return reject_payload! if original_status.nil? || !announceable?(original_status)
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 71d66b3bd..e859c15d6 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class ActivityPub::Activity::Create < ActivityPub::Activity
+ include FormattingHelper
+
def perform
dereference_object!
@@ -45,7 +47,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def create_status
return reject_payload! if unsupported_object_type? || invalid_origin?(object_uri) || tombstone_exists? || !related_to_local_activity?
- lock_or_fail("create:#{object_uri}") do
+ with_lock("create:#{object_uri}") do
return if delete_arrived_first?(object_uri) || poll_vote?
@status = find_existing_status
@@ -115,7 +117,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
language: @status_parser.language,
spoiler_text: converted_object_type? ? '' : (@status_parser.spoiler_text || ''),
created_at: @status_parser.created_at,
- edited_at: @status_parser.edited_at,
+ edited_at: @status_parser.edited_at && @status_parser.edited_at != @status_parser.created_at ? @status_parser.edited_at : nil,
override_timestamps: @options[:override_timestamps],
reply: @status_parser.reply,
sensitive: @account.sensitized? || @status_parser.sensitive || false,
@@ -313,7 +315,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
poll = replied_to_status.preloadable_poll
already_voted = true
- lock_or_fail("vote:#{replied_to_status.poll_id}:#{@account.id}") do
+ with_lock("vote:#{replied_to_status.poll_id}:#{@account.id}") do
already_voted = poll.votes.where(account: @account).exists?
poll.votes.create!(account: @account, choice: poll.options.index(@object['name']), uri: object_uri)
end
@@ -367,7 +369,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def converted_text
- Formatter.instance.linkify([@status_parser.title.presence, @status_parser.spoiler_text.presence, @status_parser.url || @status_parser.uri].compact.join("\n\n"))
+ linkify([@status_parser.title.presence, @status_parser.spoiler_text.presence, @status_parser.url || @status_parser.uri].compact.join("\n\n"))
end
def unsupported_media_type?(mime_type)
diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb
index f5ef863f3..871eb3966 100644
--- a/app/lib/activitypub/activity/delete.rb
+++ b/app/lib/activitypub/activity/delete.rb
@@ -12,7 +12,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
private
def delete_person
- lock_or_return("delete_in_progress:#{@account.id}") do
+ with_lock("delete_in_progress:#{@account.id}", autorelease: 2.hours, raise_on_failure: false) do
DeleteAccountService.new.call(@account, reserve_username: false, skip_activitypub: true)
end
end
@@ -20,14 +20,14 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
def delete_note
return if object_uri.nil?
- lock_or_return("delete_status_in_progress:#{object_uri}", 5.minutes.seconds) do
+ with_lock("delete_status_in_progress:#{object_uri}", raise_on_failure: false) do
unless invalid_origin?(object_uri)
# This lock ensures a concurrent `ActivityPub::Activity::Create` either
# does not create a status at all, or has finished saving it to the
# database before we try to load it.
# Without the lock, `delete_later!` could be called after `delete_arrived_first?`
# and `Status.find` before `Status.create!`
- lock_or_fail("create:#{object_uri}") { delete_later!(object_uri) }
+ with_lock("create:#{object_uri}") { delete_later!(object_uri) }
Tombstone.find_or_create_by(uri: object_uri, account: @account)
end
diff --git a/app/lib/activitypub/parser/media_attachment_parser.rb b/app/lib/activitypub/parser/media_attachment_parser.rb
index 1798e58a4..656be84b7 100644
--- a/app/lib/activitypub/parser/media_attachment_parser.rb
+++ b/app/lib/activitypub/parser/media_attachment_parser.rb
@@ -27,7 +27,9 @@ class ActivityPub::Parser::MediaAttachmentParser
end
def description
- @json['summary'].presence || @json['name'].presence
+ str = @json['summary'].presence || @json['name'].presence
+ str = str.strip[0...MediaAttachment::MAX_DESCRIPTION_LENGTH] if str.present?
+ str
end
def focus
@@ -48,7 +50,7 @@ class ActivityPub::Parser::MediaAttachmentParser
components = begin
blurhash = @json['blurhash']
- if blurhash.present? && /^[\w#$%*+-.:;=?@\[\]^{|}~]+$/.match?(blurhash)
+ if blurhash.present? && /^[\w#$%*+,-.:;=?@\[\]^{|}~]+$/.match?(blurhash)
Blurhash.components(blurhash)
end
end
diff --git a/app/lib/admin/system_check.rb b/app/lib/admin/system_check.rb
index afb20cb47..877a42ef6 100644
--- a/app/lib/admin/system_check.rb
+++ b/app/lib/admin/system_check.rb
@@ -5,6 +5,7 @@ class Admin::SystemCheck
Admin::SystemCheck::DatabaseSchemaCheck,
Admin::SystemCheck::SidekiqProcessCheck,
Admin::SystemCheck::RulesCheck,
+ Admin::SystemCheck::ElasticsearchCheck,
].freeze
def self.perform
diff --git a/app/lib/admin/system_check/elasticsearch_check.rb b/app/lib/admin/system_check/elasticsearch_check.rb
new file mode 100644
index 000000000..1b48a5415
--- /dev/null
+++ b/app/lib/admin/system_check/elasticsearch_check.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
+ def pass?
+ return true unless Chewy.enabled?
+
+ running_version.present? && compatible_version?
+ end
+
+ def message
+ if running_version.present?
+ Admin::SystemCheck::Message.new(:elasticsearch_version_check, I18n.t('admin.system_checks.elasticsearch_version_check.version_comparison', running_version: running_version, required_version: required_version))
+ else
+ Admin::SystemCheck::Message.new(:elasticsearch_running_check)
+ end
+ end
+
+ private
+
+ def running_version
+ @running_version ||= begin
+ Chewy.client.info['version']['number']
+ rescue Faraday::ConnectionFailed
+ nil
+ end
+ end
+
+ def required_version
+ '7.x'
+ end
+
+ def compatible_version?
+ Gem::Version.new(running_version) >= Gem::Version.new(required_version)
+ end
+
+ def missing_queues
+ @missing_queues ||= Sidekiq::ProcessSet.new.reduce(SIDEKIQ_QUEUES) { |queues, process| queues - process['queues'] }
+ end
+end
diff --git a/app/lib/advanced_text_formatter.rb b/app/lib/advanced_text_formatter.rb
new file mode 100644
index 000000000..dcaf34b91
--- /dev/null
+++ b/app/lib/advanced_text_formatter.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: true
+
+class AdvancedTextFormatter < TextFormatter
+ class HTMLRenderer < Redcarpet::Render::HTML
+ def initialize(options, &block)
+ super(options)
+ @format_link = block
+ end
+
+ def block_code(code, _language)
+ <<~HTML
+
#{ERB::Util.h(code).gsub("\n", ' ')}
+ HTML
+ end
+
+ def autolink(link, link_type)
+ return link if link_type == :email
+ @format_link.call(link)
+ end
+ end
+
+ # @param [String] text
+ # @param [Hash] options
+ # @option options [Boolean] :multiline
+ # @option options [Boolean] :with_domains
+ # @option options [Boolean] :with_rel_me
+ # @option options [Array] :preloaded_accounts
+ # @option options [String] :content_type
+ def initialize(text, options = {})
+ content_type = options.delete(:content_type)
+ super(text, options)
+
+ @text = format_markdown(text) if content_type == 'text/markdown'
+ end
+
+ # Differs from TextFormatter by not messing with newline after parsing
+ def to_s
+ return ''.html_safe if text.blank?
+
+ html = rewrite do |entity|
+ if entity[:url]
+ link_to_url(entity)
+ elsif entity[:hashtag]
+ link_to_hashtag(entity)
+ elsif entity[:screen_name]
+ link_to_mention(entity)
+ end
+ end
+
+ html.html_safe # rubocop:disable Rails/OutputSafety
+ end
+
+ # Differs from `TextFormatter` by skipping HTML tags and entities
+ def entities
+ @entities ||= begin
+ gaps = []
+ total_offset = 0
+
+ escaped = text.gsub(/<[^>]*>|[0-9]+;/) do |match|
+ total_offset += match.length - 1
+ end_offset = Regexp.last_match.end(0)
+ gaps << [end_offset - total_offset, total_offset]
+ ' '
+ end
+
+ Extractor.extract_entities_with_indices(escaped, extract_url_without_protocol: false).map do |entity|
+ start_pos, end_pos = entity[:indices]
+ offset_idx = gaps.rindex { |gap| gap.first <= start_pos }
+ offset = offset_idx.nil? ? 0 : gaps[offset_idx].last
+ entity.merge(indices: [start_pos + offset, end_pos + offset])
+ end
+ end
+ end
+
+ private
+
+ # Differs from `TextFormatter` in that it keeps HTML; but it sanitizes at the end to remain safe
+ def rewrite
+ entities.sort_by! do |entity|
+ entity[:indices].first
+ end
+
+ result = ''.dup
+
+ last_index = entities.reduce(0) do |index, entity|
+ indices = entity[:indices]
+ result << text[index...indices.first]
+ result << yield(entity)
+ indices.last
+ end
+
+ result << text[last_index..-1]
+
+ Sanitize.fragment(result, Sanitize::Config::MASTODON_OUTGOING)
+ end
+
+ def format_markdown(html)
+ html = markdown_formatter.render(html)
+ html.delete("\r").delete("\n")
+ end
+
+ def markdown_formatter
+ extensions = {
+ autolink: true,
+ no_intra_emphasis: true,
+ fenced_code_blocks: true,
+ disable_indented_code_blocks: true,
+ strikethrough: true,
+ lax_spacing: true,
+ space_after_headers: true,
+ superscript: true,
+ underline: true,
+ highlight: true,
+ footnotes: false,
+ }
+
+ renderer = HTMLRenderer.new({
+ filter_html: false,
+ escape_html: false,
+ no_images: true,
+ no_styles: true,
+ safe_links_only: true,
+ hard_wrap: true,
+ link_attributes: { target: '_blank', rel: 'nofollow noopener' },
+ }) do |url|
+ link_to_url({ url: url })
+ end
+
+ Redcarpet::Markdown.new(renderer, extensions)
+ end
+end
diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb
index a1fea6430..d61ec0e6e 100644
--- a/app/lib/application_extension.rb
+++ b/app/lib/application_extension.rb
@@ -12,4 +12,8 @@ module ApplicationExtension
def most_recently_used_access_token
@most_recently_used_access_token ||= access_tokens.where.not(last_used_at: nil).order(last_used_at: :desc).first
end
+
+ def confirmation_redirect_uri
+ redirect_uri.lines.first.strip
+ end
end
diff --git a/app/lib/delivery_failure_tracker.rb b/app/lib/delivery_failure_tracker.rb
index 7b800fc0b..7c4e28eb7 100644
--- a/app/lib/delivery_failure_tracker.rb
+++ b/app/lib/delivery_failure_tracker.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class DeliveryFailureTracker
+ include Redisable
+
FAILURE_DAYS_THRESHOLD = 7
def initialize(url_or_host)
@@ -8,21 +10,21 @@ class DeliveryFailureTracker
end
def track_failure!
- Redis.current.sadd(exhausted_deliveries_key, today)
+ redis.sadd(exhausted_deliveries_key, today)
UnavailableDomain.create(domain: @host) if reached_failure_threshold?
end
def track_success!
- Redis.current.del(exhausted_deliveries_key)
+ redis.del(exhausted_deliveries_key)
UnavailableDomain.find_by(domain: @host)&.destroy
end
def clear_failures!
- Redis.current.del(exhausted_deliveries_key)
+ redis.del(exhausted_deliveries_key)
end
def days
- Redis.current.scard(exhausted_deliveries_key) || 0
+ redis.scard(exhausted_deliveries_key) || 0
end
def available?
@@ -30,12 +32,14 @@ class DeliveryFailureTracker
end
def exhausted_deliveries_days
- @exhausted_deliveries_days ||= Redis.current.smembers(exhausted_deliveries_key).sort.map { |date| Date.new(date.slice(0, 4).to_i, date.slice(4, 2).to_i, date.slice(6, 2).to_i) }
+ @exhausted_deliveries_days ||= redis.smembers(exhausted_deliveries_key).sort.map { |date| Date.new(date.slice(0, 4).to_i, date.slice(4, 2).to_i, date.slice(6, 2).to_i) }
end
alias reset! track_success!
class << self
+ include Redisable
+
def without_unavailable(urls)
unavailable_domains_map = Rails.cache.fetch('unavailable_domains') { UnavailableDomain.pluck(:domain).index_with(true) }
@@ -54,7 +58,7 @@ class DeliveryFailureTracker
end
def warning_domains
- domains = Redis.current.keys(exhausted_deliveries_key_by('*')).map do |key|
+ domains = redis.keys(exhausted_deliveries_key_by('*')).map do |key|
key.delete_prefix(exhausted_deliveries_key_by(''))
end
@@ -62,7 +66,7 @@ class DeliveryFailureTracker
end
def warning_domains_map
- warning_domains.index_with { |domain| Redis.current.scard(exhausted_deliveries_key_by(domain)) }
+ warning_domains.index_with { |domain| redis.scard(exhausted_deliveries_key_by(domain)) }
end
private
diff --git a/app/lib/emoji_formatter.rb b/app/lib/emoji_formatter.rb
new file mode 100644
index 000000000..194849c23
--- /dev/null
+++ b/app/lib/emoji_formatter.rb
@@ -0,0 +1,114 @@
+# frozen_string_literal: true
+
+class EmojiFormatter
+ include RoutingHelper
+
+ DISALLOWED_BOUNDING_REGEX = /[[:alnum:]:]/.freeze
+
+ attr_reader :html, :custom_emojis, :options
+
+ # @param [ActiveSupport::SafeBuffer] html
+ # @param [Array] custom_emojis
+ # @param [Hash] options
+ # @option options [Boolean] :animate
+ # @option options [String] :style
+ def initialize(html, custom_emojis, options = {})
+ raise ArgumentError unless html.html_safe?
+
+ @html = html
+ @custom_emojis = custom_emojis
+ @options = options
+ end
+
+ def to_s
+ return html if custom_emojis.empty? || html.blank?
+
+ i = -1
+ tag_open_index = nil
+ inside_shortname = false
+ shortname_start_index = -1
+ invisible_depth = 0
+ last_index = 0
+ result = ''.dup
+
+ while i + 1 < html.size
+ i += 1
+
+ if invisible_depth.zero? && inside_shortname && html[i] == ':'
+ inside_shortname = false
+ shortcode = html[shortname_start_index + 1..i - 1]
+ char_after = html[i + 1]
+
+ next unless (char_after.nil? || !DISALLOWED_BOUNDING_REGEX.match?(char_after)) && (emoji = emoji_map[shortcode])
+
+ result << html[last_index..shortname_start_index - 1] if shortname_start_index.positive?
+ result << image_for_emoji(shortcode, emoji)
+ last_index = i + 1
+ elsif tag_open_index && html[i] == '>'
+ tag = html[tag_open_index..i]
+ tag_open_index = nil
+
+ if invisible_depth.positive?
+ invisible_depth += count_tag_nesting(tag)
+ elsif tag == ''
+ invisible_depth = 1
+ end
+ elsif html[i] == '<'
+ tag_open_index = i
+ inside_shortname = false
+ elsif !tag_open_index && html[i] == ':' && (i.zero? || !DISALLOWED_BOUNDING_REGEX.match?(html[i - 1]))
+ inside_shortname = true
+ shortname_start_index = i
+ end
+ end
+
+ result << html[last_index..-1]
+
+ result.html_safe # rubocop:disable Rails/OutputSafety
+ end
+
+ private
+
+ def emoji_map
+ @emoji_map ||= custom_emojis.each_with_object({}) { |e, h| h[e.shortcode] = [full_asset_url(e.image.url), full_asset_url(e.image.url(:static))] }
+ end
+
+ def count_tag_nesting(tag)
+ if tag[1] == '/'
+ -1
+ elsif tag[-2] == '/'
+ 0
+ else
+ 1
+ end
+ end
+
+ def image_for_emoji(shortcode, emoji)
+ original_url, static_url = emoji
+
+ image_tag(
+ animate? ? original_url : static_url,
+ image_attributes.merge(alt: ":#{shortcode}:", title: ":#{shortcode}:", data: image_data_attributes(original_url, static_url))
+ )
+ end
+
+ def image_attributes
+ { rel: 'emoji', draggable: false, width: 16, height: 16, class: image_class_names, style: image_style }
+ end
+
+ def image_data_attributes(original_url, static_url)
+ { original: original_url, static: static_url } unless animate?
+ end
+
+ def image_class_names
+ animate? ? 'emojione' : 'emojione custom-emoji'
+ end
+
+ def image_style
+ @options[:style]
+ end
+
+ def animate?
+ @options[:animate] || @options.key?(:style)
+ end
+end
diff --git a/app/lib/extractor.rb b/app/lib/extractor.rb
index 8020aa916..aea60dae5 100644
--- a/app/lib/extractor.rb
+++ b/app/lib/extractor.rb
@@ -1,22 +1,44 @@
# frozen_string_literal: true
module Extractor
+ MAX_DOMAIN_LENGTH = 253
+
extend Twitter::TwitterText::Extractor
module_function
- # :yields: username, list_slug, start, end
+ def extract_entities_with_indices(text, options = {}, &block)
+ entities = begin
+ extract_urls_with_indices(text, options) +
+ extract_hashtags_with_indices(text, check_url_overlap: false) +
+ extract_mentions_or_lists_with_indices(text) +
+ extract_extra_uris_with_indices(text)
+ end
+
+ return [] if entities.empty?
+
+ entities = remove_overlapping_entities(entities)
+ entities.each(&block) if block_given?
+ entities
+ end
+
def extract_mentions_or_lists_with_indices(text)
- return [] unless Twitter::TwitterText::Regex[:at_signs].match?(text)
+ return [] unless text && Twitter::TwitterText::Regex[:at_signs].match?(text)
possible_entries = []
- text.to_s.scan(Account::MENTION_RE) do |screen_name, _|
+ text.scan(Account::MENTION_RE) do |screen_name, _|
match_data = $LAST_MATCH_INFO
- after = $'
+ after = $'
+
unless Twitter::TwitterText::Regex[:end_mention_match].match?(after)
+ _, domain = screen_name.split('@')
+
+ next if domain.present? && domain.length > MAX_DOMAIN_LENGTH
+
start_position = match_data.char_begin(1) - 1
- end_position = match_data.char_end(1)
+ end_position = match_data.char_end(1)
+
possible_entries << {
screen_name: screen_name,
indices: [start_position, end_position],
@@ -29,36 +51,70 @@ module Extractor
yield mention[:screen_name], mention[:indices].first, mention[:indices].last
end
end
+
possible_entries
end
- def extract_hashtags_with_indices(text, **)
- return [] unless /#/.match?(text)
+ def extract_hashtags_with_indices(text, _options = {})
+ return [] unless text&.index('#')
+
+ possible_entries = []
- tags = []
text.scan(Tag::HASHTAG_RE) do |hash_text, _|
- match_data = $LAST_MATCH_INFO
+ match_data = $LAST_MATCH_INFO
start_position = match_data.char_begin(1) - 1
- end_position = match_data.char_end(1)
- after = $'
+ end_position = match_data.char_end(1)
+ after = $'
+
if %r{\A://}.match?(after)
hash_text.match(/(.+)(https?\Z)/) do |matched|
- hash_text = matched[1]
+ hash_text = matched[1]
end_position -= matched[2].codepoint_length
end
end
- tags << {
+ possible_entries << {
hashtag: hash_text,
indices: [start_position, end_position],
}
end
- tags.each { |tag| yield tag[:hashtag], tag[:indices].first, tag[:indices].last } if block_given?
- tags
+ if block_given?
+ possible_entries.each do |tag|
+ yield tag[:hashtag], tag[:indices].first, tag[:indices].last
+ end
+ end
+
+ possible_entries
end
def extract_cashtags_with_indices(_text)
- [] # always returns empty array
+ []
+ end
+
+ def extract_extra_uris_with_indices(text)
+ return [] unless text&.index(':')
+
+ possible_entries = []
+
+ text.scan(Twitter::TwitterText::Regex[:valid_extended_uri]) do
+ valid_uri_match_data = $LAST_MATCH_INFO
+
+ start_position = valid_uri_match_data.char_begin(3)
+ end_position = valid_uri_match_data.char_end(3)
+
+ possible_entries << {
+ url: valid_uri_match_data[3],
+ indices: [start_position, end_position],
+ }
+ end
+
+ if block_given?
+ possible_entries.each do |url|
+ yield url[:url], url[:indices].first, url[:indices].last
+ end
+ end
+
+ possible_entries
end
end
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index efc9da34b..4633786ca 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -132,7 +132,7 @@ class FeedManager
def merge_into_home(from_account, into_account)
timeline_key = key(:home, into_account.id)
aggregate = into_account.user&.aggregates_reblogs?
- query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
+ query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
@@ -158,7 +158,7 @@ class FeedManager
def merge_into_list(from_account, list)
timeline_key = key(:list, list.id)
aggregate = list.account.user&.aggregates_reblogs?
- query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
+ query = from_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, :media_attachments, reblog: :account).limit(FeedManager::MAX_ITEMS / 4)
if redis.zcard(timeline_key) >= FeedManager::MAX_ITEMS / 4
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
@@ -182,10 +182,10 @@ class FeedManager
# @param [Account] into_account
# @return [void]
def unmerge_from_home(from_account, into_account)
- timeline_key = key(:home, into_account.id)
- oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true)&.first&.last&.to_i || 0
+ timeline_key = key(:home, into_account.id)
+ timeline_status_ids = redis.zrange(timeline_key, 0, -1)
- from_account.statuses.select('id, reblog_of_id').where('id > ?', oldest_home_score).reorder(nil).find_each do |status|
+ from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status|
remove_from_feed(:home, into_account.id, status, into_account.user&.aggregates_reblogs?)
end
end
@@ -195,10 +195,10 @@ class FeedManager
# @param [List] list
# @return [void]
def unmerge_from_list(from_account, list)
- timeline_key = key(:list, list.id)
- oldest_list_score = redis.zrange(timeline_key, 0, 0, with_scores: true)&.first&.last&.to_i || 0
+ timeline_key = key(:list, list.id)
+ timeline_status_ids = redis.zrange(timeline_key, 0, -1)
- from_account.statuses.select('id, reblog_of_id').where('id > ?', oldest_list_score).reorder(nil).find_each do |status|
+ from_account.statuses.select('id, reblog_of_id').where(id: timeline_status_ids).reorder(nil).find_each do |status|
remove_from_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?)
end
end
@@ -268,7 +268,7 @@ class FeedManager
account.following.includes(:account_stat).find_each do |target_account|
if redis.zcard(timeline_key) >= limit
oldest_home_score = redis.zrange(timeline_key, 0, 0, with_scores: true).first.last.to_i
- last_status_score = Mastodon::Snowflake.id_at(account.last_status_at)
+ last_status_score = Mastodon::Snowflake.id_at(target_account.last_status_at)
# If the feed is full and this account has not posted more recently
# than the last item on the feed, then we can skip the whole account
@@ -276,7 +276,7 @@ class FeedManager
next if last_status_score < oldest_home_score
end
- statuses = target_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, reblog: :account).limit(limit)
+ statuses = target_account.statuses.where(visibility: [:public, :unlisted, :private]).includes(:preloadable_poll, :media_attachments, reblog: :account).limit(limit)
crutches = build_crutches(account.id, statuses)
statuses.each do |status|
@@ -401,7 +401,6 @@ class FeedManager
def filter_from_home?(status, receiver_id, crutches)
return false if receiver_id == status.account_id
return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?)
- return true if phrase_filtered?(status, receiver_id, :home)
check_for_blocks = crutches[:active_mentions][status.id] || []
check_for_blocks.concat([status.account_id])
@@ -437,7 +436,6 @@ class FeedManager
# @return [Boolean]
def filter_from_mentions?(status, receiver_id)
return true if receiver_id == status.account_id
- return true if phrase_filtered?(status, receiver_id, :notifications)
# This filter is called from NotifyService, but already after the sender of
# the notification has been checked for mute/block. Therefore, it's not
@@ -476,42 +474,6 @@ class FeedManager
false
end
- # Check if the status hits a phrase filter
- # @param [Status] status
- # @param [Integer] receiver_id
- # @param [Symbol] context
- # @return [Boolean]
- def phrase_filtered?(status, receiver_id, context)
- active_filters = Rails.cache.fetch("filters:#{receiver_id}") { CustomFilter.where(account_id: receiver_id).active_irreversible.to_a }.to_a
-
- active_filters.select! { |filter| filter.context.include?(context.to_s) && !filter.expired? }
-
- active_filters.map! do |filter|
- if filter.whole_word
- sb = /\A[[:word:]]/.match?(filter.phrase) ? '\b' : ''
- eb = /[[:word:]]\z/.match?(filter.phrase) ? '\b' : ''
-
- /(?mix:#{sb}#{Regexp.escape(filter.phrase)}#{eb})/
- else
- /#{Regexp.escape(filter.phrase)}/i
- end
- end
-
- return false if active_filters.empty?
-
- combined_regex = Regexp.union(active_filters)
- status = status.reblog if status.reblog?
-
- combined_text = [
- Formatter.instance.plaintext(status),
- status.spoiler_text,
- status.preloadable_poll ? status.preloadable_poll.options.join("\n\n") : nil,
- status.ordered_media_attachments.map(&:description).join("\n\n"),
- ].compact.join("\n\n")
-
- combined_regex.match?(combined_text)
- end
-
# Adds a status to an account's feed, returning true if a status was
# added, and false if it was not added to the feed. Note that this is
# an internal helper: callers must call trim or push updates if
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
deleted file mode 100644
index dfa493ed5..000000000
--- a/app/lib/formatter.rb
+++ /dev/null
@@ -1,382 +0,0 @@
-# frozen_string_literal: true
-
-require 'singleton'
-
-class HTMLRenderer < Redcarpet::Render::HTML
- def block_code(code, language)
- "
#{encode(code).gsub("\n", " ")}
"
- end
-
- def autolink(link, link_type)
- return link if link_type == :email
- Formatter.instance.link_url(link)
- rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
- encode(link)
- end
-
- private
-
- def html_entities
- @html_entities ||= HTMLEntities.new
- end
-
- def encode(html)
- html_entities.encode(html)
- end
-end
-
-class Formatter
- include Singleton
- include RoutingHelper
-
- include ActionView::Helpers::TextHelper
-
- def format(status, **options)
- if status.respond_to?(:reblog?) && status.reblog?
- prepend_reblog = status.reblog.account.acct
- status = status.proper
- else
- prepend_reblog = false
- end
-
- raw_content = status.text
-
- if options[:inline_poll_options] && status.preloadable_poll
- raw_content = raw_content + "\n\n" + status.preloadable_poll.options.map { |title| "[ ] #{title}" }.join("\n")
- end
-
- return '' if raw_content.blank?
-
- unless status.local?
- html = reformat(raw_content)
- html = encode_custom_emojis(html, status.emojis, options[:autoplay]) if options[:custom_emojify]
- return html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- linkable_accounts = status.respond_to?(:active_mentions) ? status.active_mentions.map(&:account) : []
- linkable_accounts << status.account
-
- html = raw_content
- html = "RT @#{prepend_reblog} #{html}" if prepend_reblog
- html = format_markdown(html) if status.content_type == 'text/markdown'
- html = encode_and_link_urls(html, linkable_accounts, keep_html: %w(text/markdown text/html).include?(status.content_type))
- html = reformat(html, true) if %w(text/markdown text/html).include?(status.content_type)
- html = encode_custom_emojis(html, status.emojis, options[:autoplay]) if options[:custom_emojify]
-
- unless %w(text/markdown text/html).include?(status.content_type)
- html = simple_format(html, {}, sanitize: false)
- html = html.delete("\n")
- end
-
- html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- def format_markdown(html)
- html = markdown_formatter.render(html)
- html.delete("\r").delete("\n")
- end
-
- def reformat(html, outgoing = false)
- sanitize(html, Sanitize::Config::MASTODON_STRICT.merge(outgoing: outgoing))
- rescue ArgumentError
- ''
- end
-
- def plaintext(status)
- return status.text if status.local?
-
- text = status.text.gsub(/( | |<\/p>)+/) { |match| "#{match}\n" }
- strip_tags(text)
- end
-
- def simplified_format(account, **options)
- return '' if account.note.blank?
-
- html = account.local? ? linkify(account.note) : reformat(account.note)
- html = encode_custom_emojis(html, account.emojis, options[:autoplay]) if options[:custom_emojify]
- html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- def sanitize(html, config)
- Sanitize.fragment(html, config)
- end
-
- def format_spoiler(status, **options)
- html = encode(status.spoiler_text)
- html = encode_custom_emojis(html, status.emojis, options[:autoplay])
- html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- def format_poll_option(status, option, **options)
- html = encode(option.title)
- html = encode_custom_emojis(html, status.emojis, options[:autoplay])
- html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- def format_display_name(account, **options)
- html = encode(account.display_name.presence || account.username)
- html = encode_custom_emojis(html, account.emojis, options[:autoplay]) if options[:custom_emojify]
- html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- def format_field(account, str, **options)
- html = account.local? ? encode_and_link_urls(str, me: true, with_domain: true) : reformat(str)
- html = encode_custom_emojis(html, account.emojis, options[:autoplay]) if options[:custom_emojify]
- html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- def linkify(text)
- html = encode_and_link_urls(text)
- html = simple_format(html, {}, sanitize: false)
- html = html.delete("\n")
-
- html.html_safe # rubocop:disable Rails/OutputSafety
- end
-
- def link_url(url)
- "#{link_html(url)}"
- end
-
- private
-
- def markdown_formatter
- extensions = {
- autolink: true,
- no_intra_emphasis: true,
- fenced_code_blocks: true,
- disable_indented_code_blocks: true,
- strikethrough: true,
- lax_spacing: true,
- space_after_headers: true,
- superscript: true,
- underline: true,
- highlight: true,
- footnotes: false,
- }
-
- renderer = HTMLRenderer.new({
- filter_html: false,
- escape_html: false,
- no_images: true,
- no_styles: true,
- safe_links_only: true,
- hard_wrap: true,
- link_attributes: { target: '_blank', rel: 'nofollow noopener' },
- })
-
- Redcarpet::Markdown.new(renderer, extensions)
- end
-
- def html_entities
- @html_entities ||= HTMLEntities.new
- end
-
- def encode(html)
- html_entities.encode(html)
- end
-
- def encode_and_link_urls(html, accounts = nil, options = {})
- if accounts.is_a?(Hash)
- options = accounts
- accounts = nil
- end
-
- entities = options[:keep_html] ? html_friendly_extractor(html) : utf8_friendly_extractor(html, extract_url_without_protocol: false)
-
- rewrite(html.dup, entities, options[:keep_html]) do |entity|
- if entity[:url]
- link_to_url(entity, options)
- elsif entity[:hashtag]
- link_to_hashtag(entity)
- elsif entity[:screen_name]
- link_to_mention(entity, accounts, options)
- end
- end
- end
-
- def count_tag_nesting(tag)
- if tag[1] == '/' then -1
- elsif tag[-2] == '/' then 0
- else 1
- end
- end
-
- # rubocop:disable Metrics/BlockNesting
- def encode_custom_emojis(html, emojis, animate = false)
- return html if emojis.empty?
-
- emoji_map = emojis.each_with_object({}) { |e, h| h[e.shortcode] = [full_asset_url(e.image.url), full_asset_url(e.image.url(:static))] }
-
- i = -1
- tag_open_index = nil
- inside_shortname = false
- shortname_start_index = -1
- invisible_depth = 0
-
- while i + 1 < html.size
- i += 1
-
- if invisible_depth.zero? && inside_shortname && html[i] == ':'
- shortcode = html[shortname_start_index + 1..i - 1]
- emoji = emoji_map[shortcode]
-
- if emoji
- original_url, static_url = emoji
- replacement = begin
- if animate
- image_tag(original_url, draggable: false, class: 'emojione', alt: ":#{shortcode}:", title: ":#{shortcode}:")
- else
- image_tag(original_url, draggable: false, class: 'emojione custom-emoji', alt: ":#{shortcode}:", title: ":#{shortcode}:", data: { original: original_url, static: static_url })
- end
- end
- before_html = shortname_start_index.positive? ? html[0..shortname_start_index - 1] : ''
- html = before_html + replacement + html[i + 1..-1]
- i += replacement.size - (shortcode.size + 2) - 1
- else
- i -= 1
- end
-
- inside_shortname = false
- elsif tag_open_index && html[i] == '>'
- tag = html[tag_open_index..i]
- tag_open_index = nil
- if invisible_depth.positive?
- invisible_depth += count_tag_nesting(tag)
- elsif tag == ''
- invisible_depth = 1
- end
- elsif html[i] == '<'
- tag_open_index = i
- inside_shortname = false
- elsif !tag_open_index && html[i] == ':'
- inside_shortname = true
- shortname_start_index = i
- end
- end
-
- html
- end
- # rubocop:enable Metrics/BlockNesting
-
- def rewrite(text, entities, keep_html = false)
- text = text.to_s
-
- # Sort by start index
- entities = entities.sort_by do |entity|
- indices = entity.respond_to?(:indices) ? entity.indices : entity[:indices]
- indices.first
- end
-
- result = []
-
- last_index = entities.reduce(0) do |index, entity|
- indices = entity.respond_to?(:indices) ? entity.indices : entity[:indices]
- result << (keep_html ? text[index...indices.first] : encode(text[index...indices.first]))
- result << yield(entity)
- indices.last
- end
-
- result << (keep_html ? text[last_index..-1] : encode(text[last_index..-1]))
-
- result.flatten.join
- end
-
- def utf8_friendly_extractor(text, options = {})
- # Note: I couldn't obtain list_slug with @user/list-name format
- # for mention so this requires additional check
- special = Extractor.extract_urls_with_indices(text, options)
- standard = Extractor.extract_entities_with_indices(text, options)
- extra = Extractor.extract_extra_uris_with_indices(text, options)
-
- Extractor.remove_overlapping_entities(special + standard + extra)
- end
-
- def html_friendly_extractor(html, options = {})
- gaps = []
- total_offset = 0
-
- escaped = html.gsub(/<[^>]*>|[0-9]+;/) do |match|
- total_offset += match.length - 1
- end_offset = Regexp.last_match.end(0)
- gaps << [end_offset - total_offset, total_offset]
- "\u200b"
- end
-
- entities = Extractor.extract_hashtags_with_indices(escaped, :check_url_overlap => false) +
- Extractor.extract_mentions_or_lists_with_indices(escaped)
- Extractor.remove_overlapping_entities(entities).map do |extract|
- pos = extract[:indices].first
- offset_idx = gaps.rindex { |gap| gap.first <= pos }
- offset = offset_idx.nil? ? 0 : gaps[offset_idx].last
- next extract.merge(
- :indices => [extract[:indices].first + offset, extract[:indices].last + offset]
- )
- end
- end
-
- def link_to_url(entity, options = {})
- url = Addressable::URI.parse(entity[:url])
- html_attrs = { target: '_blank', rel: 'nofollow noopener noreferrer' }
-
- html_attrs[:rel] = "me #{html_attrs[:rel]}" if options[:me]
-
- Twitter::TwitterText::Autolink.send(:link_to_text, entity, link_html(entity[:url]), url, html_attrs)
- rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
- encode(entity[:url])
- end
-
- def link_to_mention(entity, linkable_accounts, options = {})
- acct = entity[:screen_name]
-
- return link_to_account(acct, options) unless linkable_accounts
-
- same_username_hits = 0
- account = nil
- username, domain = acct.split('@')
- domain = nil if TagManager.instance.local_domain?(domain)
-
- linkable_accounts.each do |item|
- same_username = item.username.casecmp(username).zero?
- same_domain = item.domain.nil? ? domain.nil? : item.domain.casecmp(domain)&.zero?
-
- if same_username && !same_domain
- same_username_hits += 1
- elsif same_username && same_domain
- account = item
- end
- end
-
- account ? mention_html(account, with_domain: same_username_hits.positive? || options[:with_domain]) : "@#{encode(acct)}"
- end
-
- def link_to_account(acct, options = {})
- username, domain = acct.split('@')
-
- domain = nil if TagManager.instance.local_domain?(domain)
- account = EntityCache.instance.mention(username, domain)
-
- account ? mention_html(account, with_domain: options[:with_domain]) : "@#{encode(acct)}"
- end
-
- def link_to_hashtag(entity)
- hashtag_html(entity[:hashtag])
- end
-
- def link_html(url)
- url = Addressable::URI.parse(url).to_s
- prefix = url.match(/\A(https?:\/\/(www\.)?|xmpp:)/).to_s
- text = url[prefix.length, 30]
- suffix = url[prefix.length + 30..-1]
- cutoff = url[prefix.length..-1].length > 30
-
- "#{encode(prefix)}#{encode(text)}#{encode(suffix)}"
- end
-
- def hashtag_html(tag)
- "##{encode(tag)}"
- end
-
- def mention_html(account, with_domain: false)
- "@#{encode(with_domain ? account.pretty_acct : account.username)}"
- end
-end
diff --git a/app/lib/html_aware_formatter.rb b/app/lib/html_aware_formatter.rb
new file mode 100644
index 000000000..7a1cd0340
--- /dev/null
+++ b/app/lib/html_aware_formatter.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+class HtmlAwareFormatter
+ attr_reader :text, :local, :options
+
+ alias local? local
+
+ # @param [String] text
+ # @param [Boolean] local
+ # @param [Hash] options
+ def initialize(text, local, options = {})
+ @text = text
+ @local = local
+ @options = options
+ end
+
+ def to_s
+ return ''.html_safe if text.blank?
+
+ if local?
+ linkify
+ else
+ reformat.html_safe # rubocop:disable Rails/OutputSafety
+ end
+ rescue ArgumentError
+ ''.html_safe
+ end
+
+ private
+
+ def reformat
+ Sanitize.fragment(text, Sanitize::Config::MASTODON_STRICT)
+ end
+
+ def linkify
+ if %w(text/markdown text/html).include?(@options[:content_type])
+ AdvancedTextFormatter.new(text, options).to_s
+ else
+ TextFormatter.new(text, options).to_s
+ end
+ end
+end
diff --git a/app/lib/importer/accounts_index_importer.rb b/app/lib/importer/accounts_index_importer.rb
new file mode 100644
index 000000000..792a31b1b
--- /dev/null
+++ b/app/lib/importer/accounts_index_importer.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class Importer::AccountsIndexImporter < Importer::BaseImporter
+ def import!
+ scope.includes(:account_stat).find_in_batches(batch_size: @batch_size) do |tmp|
+ in_work_unit(tmp) do |accounts|
+ bulk = Chewy::Index::Import::BulkBuilder.new(index, to_index: accounts).bulk_body
+
+ indexed = bulk.select { |entry| entry[:index] }.size
+ deleted = bulk.select { |entry| entry[:delete] }.size
+
+ Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+ [indexed, deleted]
+ end
+ end
+
+ wait!
+ end
+
+ private
+
+ def index
+ AccountsIndex
+ end
+
+ def scope
+ Account.searchable
+ end
+end
diff --git a/app/lib/importer/base_importer.rb b/app/lib/importer/base_importer.rb
new file mode 100644
index 000000000..ea522c600
--- /dev/null
+++ b/app/lib/importer/base_importer.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+class Importer::BaseImporter
+ # @param [Integer] batch_size
+ # @param [Concurrent::ThreadPoolExecutor] executor
+ def initialize(batch_size:, executor:)
+ @batch_size = batch_size
+ @executor = executor
+ @wait_for = Concurrent::Set.new
+ end
+
+ # Callback to run when a concurrent work unit completes
+ # @param [Proc]
+ def on_progress(&block)
+ @on_progress = block
+ end
+
+ # Callback to run when a concurrent work unit fails
+ # @param [Proc]
+ def on_failure(&block)
+ @on_failure = block
+ end
+
+ # Reduce resource usage during and improve speed of indexing
+ def optimize_for_import!
+ Chewy.client.indices.put_settings index: index.index_name, body: { index: { refresh_interval: -1 } }
+ end
+
+ # Restore original index settings
+ def optimize_for_search!
+ Chewy.client.indices.put_settings index: index.index_name, body: { index: { refresh_interval: index.settings_hash[:settings][:index][:refresh_interval] } }
+ end
+
+ # Estimate the amount of documents that would be indexed. Not exact!
+ # @returns [Integer]
+ def estimate!
+ ActiveRecord::Base.connection_pool.with_connection { |connection| connection.select_one("SELECT reltuples AS estimate FROM pg_class WHERE relname = '#{index.adapter.target.table_name}'")['estimate'].to_i }
+ end
+
+ # Import data from the database into the index
+ def import!
+ raise NotImplementedError
+ end
+
+ # Remove documents from the index that no longer exist in the database
+ def clean_up!
+ index.scroll_batches do |documents|
+ ids = documents.map { |doc| doc['_id'] }
+ existence_map = index.adapter.target.where(id: ids).pluck(:id).each_with_object({}) { |id, map| map[id.to_s] = true }
+ tmp = ids.reject { |id| existence_map[id] }
+
+ next if tmp.empty?
+
+ in_work_unit(tmp) do |deleted_ids|
+ bulk = Chewy::Index::Import::BulkBuilder.new(index, delete: deleted_ids).bulk_body
+
+ Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+ [0, bulk.size]
+ end
+ end
+
+ wait!
+ end
+
+ protected
+
+ def in_work_unit(*args, &block)
+ work_unit = Concurrent::Promises.future_on(@executor, *args, &block)
+
+ work_unit.on_fulfillment!(&@on_progress)
+ work_unit.on_rejection!(&@on_failure)
+ work_unit.on_resolution! { @wait_for.delete(work_unit) }
+
+ @wait_for << work_unit
+ rescue Concurrent::RejectedExecutionError
+ sleep(0.1) && retry # Backpressure
+ end
+
+ def wait!
+ Concurrent::Promises.zip(*@wait_for).wait
+ end
+
+ def index
+ raise NotImplementedError
+ end
+end
diff --git a/app/lib/importer/statuses_index_importer.rb b/app/lib/importer/statuses_index_importer.rb
new file mode 100644
index 000000000..7c6532560
--- /dev/null
+++ b/app/lib/importer/statuses_index_importer.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+class Importer::StatusesIndexImporter < Importer::BaseImporter
+ def import!
+ # The idea is that instead of iterating over all statuses in the database
+ # and calculating the searchable_by for each of them (majority of which
+ # would be empty), we approach the index from the other end
+
+ scopes.each do |scope|
+ # We could be tempted to keep track of status IDs we have already processed
+ # from a different scope to avoid indexing them multiple times, but that
+ # could end up being a very large array
+
+ scope.find_in_batches(batch_size: @batch_size) do |tmp|
+ in_work_unit(tmp.map(&:status_id)) do |status_ids|
+ bulk = ActiveRecord::Base.connection_pool.with_connection do
+ Chewy::Index::Import::BulkBuilder.new(index, to_index: Status.includes(:media_attachments, :preloadable_poll).where(id: status_ids)).bulk_body
+ end
+
+ indexed = 0
+ deleted = 0
+
+ # We can't use the delete_if proc to do the filtering because delete_if
+ # is called before rendering the data and we need to filter based
+ # on the results of the filter, so this filtering happens here instead
+ bulk.map! do |entry|
+ new_entry = begin
+ if entry[:index] && entry.dig(:index, :data, 'searchable_by').blank?
+ { delete: entry[:index].except(:data) }
+ else
+ entry
+ end
+ end
+
+ if new_entry[:index]
+ indexed += 1
+ else
+ deleted += 1
+ end
+
+ new_entry
+ end
+
+ Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+ [indexed, deleted]
+ end
+ end
+ end
+
+ wait!
+ end
+
+ private
+
+ def index
+ StatusesIndex
+ end
+
+ def scopes
+ [
+ local_statuses_scope,
+ local_mentions_scope,
+ local_favourites_scope,
+ local_votes_scope,
+ local_bookmarks_scope,
+ ]
+ end
+
+ def local_mentions_scope
+ Mention.where(account: Account.local, silent: false).select(:id, :status_id)
+ end
+
+ def local_favourites_scope
+ Favourite.where(account: Account.local).select(:id, :status_id)
+ end
+
+ def local_bookmarks_scope
+ Bookmark.select(:id, :status_id)
+ end
+
+ def local_votes_scope
+ Poll.joins(:votes).where(votes: { account: Account.local }).select('polls.id, polls.status_id')
+ end
+
+ def local_statuses_scope
+ Status.local.select('id, coalesce(reblog_of_id, id) as status_id')
+ end
+end
diff --git a/app/lib/importer/tags_index_importer.rb b/app/lib/importer/tags_index_importer.rb
new file mode 100644
index 000000000..f5bd8f052
--- /dev/null
+++ b/app/lib/importer/tags_index_importer.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class Importer::TagsIndexImporter < Importer::BaseImporter
+ def import!
+ index.adapter.default_scope.find_in_batches(batch_size: @batch_size) do |tmp|
+ in_work_unit(tmp) do |tags|
+ bulk = Chewy::Index::Import::BulkBuilder.new(index, to_index: tags).bulk_body
+
+ indexed = bulk.select { |entry| entry[:index] }.size
+ deleted = bulk.select { |entry| entry[:delete] }.size
+
+ Chewy::Index::Import::BulkRequest.new(index).perform(bulk)
+
+ [indexed, deleted]
+ end
+ end
+
+ wait!
+ end
+
+ private
+
+ def index
+ TagsIndex
+ end
+end
diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb
index fabbd244d..b0c4e4f42 100644
--- a/app/lib/link_details_extractor.rb
+++ b/app/lib/link_details_extractor.rb
@@ -208,7 +208,7 @@ class LinkDetailsExtractor
end
def valid_url_or_nil(str, same_origin_only: false)
- return if str.blank?
+ return if str.blank? || str == 'null'
url = @original_url + Addressable::URI.parse(str)
diff --git a/app/lib/plain_text_formatter.rb b/app/lib/plain_text_formatter.rb
new file mode 100644
index 000000000..08aa29696
--- /dev/null
+++ b/app/lib/plain_text_formatter.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class PlainTextFormatter
+ include ActionView::Helpers::TextHelper
+
+ NEWLINE_TAGS_RE = /( | |<\/p>)+/.freeze
+
+ attr_reader :text, :local
+
+ alias local? local
+
+ def initialize(text, local)
+ @text = text
+ @local = local
+ end
+
+ def to_s
+ if local?
+ text
+ else
+ strip_tags(insert_newlines).chomp
+ end
+ end
+
+ private
+
+ def insert_newlines
+ text.gsub(NEWLINE_TAGS_RE) { |match| "#{match}\n" }
+ end
+end
diff --git a/app/lib/redis_configuration.rb b/app/lib/redis_configuration.rb
new file mode 100644
index 000000000..e14d6c8b6
--- /dev/null
+++ b/app/lib/redis_configuration.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+class RedisConfiguration
+ class << self
+ def establish_pool(new_pool_size)
+ @pool&.shutdown(&:close)
+ @pool = ConnectionPool.new(size: new_pool_size) { new.connection }
+ end
+
+ def with
+ pool.with { |redis| yield redis }
+ end
+
+ def pool
+ @pool ||= establish_pool(pool_size)
+ end
+
+ def pool_size
+ if Sidekiq.server?
+ Sidekiq.options[:concurrency]
+ else
+ ENV['MAX_THREADS'] || 5
+ end
+ end
+ end
+
+ def connection
+ if namespace?
+ Redis::Namespace.new(namespace, redis: raw_connection)
+ else
+ raw_connection
+ end
+ end
+
+ def namespace?
+ namespace.present?
+ end
+
+ def namespace
+ ENV.fetch('REDIS_NAMESPACE', nil)
+ end
+
+ def url
+ ENV['REDIS_URL']
+ end
+
+ private
+
+ def raw_connection
+ Redis.new(url: url, driver: :hiredis)
+ end
+end
diff --git a/app/lib/rss/builder.rb b/app/lib/rss/builder.rb
new file mode 100644
index 000000000..a9b3f08c5
--- /dev/null
+++ b/app/lib/rss/builder.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+class RSS::Builder
+ attr_reader :dsl
+
+ def self.build
+ new.tap do |builder|
+ yield builder.dsl
+ end.to_xml
+ end
+
+ def initialize
+ @dsl = RSS::Channel.new
+ end
+
+ def to_xml
+ (''.dup << Ox.dump(wrap_in_document, effort: :tolerant)).force_encoding('UTF-8')
+ end
+
+ private
+
+ def wrap_in_document
+ Ox::Document.new(version: '1.0').tap do |document|
+ document << Ox::Element.new('rss').tap do |rss|
+ rss['version'] = '2.0'
+ rss['xmlns:webfeeds'] = 'http://webfeeds.org/rss/1.0'
+ rss['xmlns:media'] = 'http://search.yahoo.com/mrss/'
+
+ rss << @dsl.to_element
+ end
+ end
+ end
+end
diff --git a/app/lib/rss/channel.rb b/app/lib/rss/channel.rb
new file mode 100644
index 000000000..1dba94e47
--- /dev/null
+++ b/app/lib/rss/channel.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+class RSS::Channel < RSS::Element
+ def initialize
+ super()
+
+ @root = create_element('channel')
+ end
+
+ def title(str)
+ append_element('title', str)
+ end
+
+ def link(str)
+ append_element('link', str)
+ end
+
+ def last_build_date(date)
+ append_element('lastBuildDate', date.to_formatted_s(:rfc822))
+ end
+
+ def image(url, title, link)
+ append_element('image') do |image|
+ image << create_element('url', url)
+ image << create_element('title', title)
+ image << create_element('link', link)
+ end
+ end
+
+ def description(str)
+ append_element('description', str)
+ end
+
+ def generator(str)
+ append_element('generator', str)
+ end
+
+ def icon(str)
+ append_element('webfeeds:icon', str)
+ end
+
+ def logo(str)
+ append_element('webfeeds:logo', str)
+ end
+
+ def item(&block)
+ @root << RSS::Item.with(&block)
+ end
+end
diff --git a/app/lib/rss/element.rb b/app/lib/rss/element.rb
new file mode 100644
index 000000000..7142fa039
--- /dev/null
+++ b/app/lib/rss/element.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class RSS::Element
+ def self.with(*args, &block)
+ new(*args).tap(&block).to_element
+ end
+
+ def create_element(name, content = nil)
+ Ox::Element.new(name).tap do |element|
+ yield element if block_given?
+ element << content if content.present?
+ end
+ end
+
+ def append_element(name, content = nil)
+ @root << create_element(name, content).tap do |element|
+ yield element if block_given?
+ end
+ end
+
+ def to_element
+ @root
+ end
+end
diff --git a/app/lib/rss/item.rb b/app/lib/rss/item.rb
new file mode 100644
index 000000000..c02991ace
--- /dev/null
+++ b/app/lib/rss/item.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class RSS::Item < RSS::Element
+ def initialize
+ super()
+
+ @root = create_element('item')
+ end
+
+ def title(str)
+ append_element('title', str)
+ end
+
+ def link(str)
+ append_element('guid', str) do |guid|
+ guid['isPermaLink'] = 'true'
+ end
+
+ append_element('link', str)
+ end
+
+ def pub_date(date)
+ append_element('pubDate', date.to_formatted_s(:rfc822))
+ end
+
+ def description(str)
+ append_element('description', str)
+ end
+
+ def category(str)
+ append_element('category', str)
+ end
+
+ def enclosure(url, type, size)
+ append_element('enclosure') do |enclosure|
+ enclosure['url'] = url
+ enclosure['length'] = size
+ enclosure['type'] = type
+ end
+ end
+
+ def media_content(url, type, size, &block)
+ @root << RSS::MediaContent.with(url, type, size, &block)
+ end
+end
diff --git a/app/lib/rss/media_content.rb b/app/lib/rss/media_content.rb
new file mode 100644
index 000000000..f281fe29e
--- /dev/null
+++ b/app/lib/rss/media_content.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class RSS::MediaContent < RSS::Element
+ def initialize(url, type, size)
+ super()
+
+ @root = create_element('media:content') do |content|
+ content['url'] = url
+ content['type'] = type
+ content['fileSize'] = size
+ end
+ end
+
+ def medium(str)
+ @root['medium'] = str
+ end
+
+ def rating(str)
+ append_element('media:rating', str) do |rating|
+ rating['scheme'] = 'urn:simple'
+ end
+ end
+
+ def description(str)
+ append_element('media:description', str) do |description|
+ description['type'] = 'plain'
+ end
+ end
+
+ def thumbnail(str)
+ append_element('media:thumbnail') do |thumbnail|
+ thumbnail['url'] = str
+ end
+ end
+end
diff --git a/app/lib/rss/serializer.rb b/app/lib/rss/serializer.rb
deleted file mode 100644
index 7e3ed1f17..000000000
--- a/app/lib/rss/serializer.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-class RSS::Serializer
- private
-
- def render_statuses(builder, statuses)
- statuses.each do |status|
- builder.item do |item|
- item.title(status_title(status))
- .link(ActivityPub::TagManager.instance.url_for(status))
- .pub_date(status.created_at)
- .description(status.spoiler_text.presence || Formatter.instance.format(status, inline_poll_options: true).to_str)
-
- status.ordered_media_attachments.each do |media|
- item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size)
- end
- end
- end
- end
-
- def status_title(status)
- return "#{status.account.acct} deleted status" if status.destroyed?
-
- preview = status.proper.spoiler_text.presence || status.proper.text
- if preview.length > 30 || preview[0, 30].include?("\n")
- preview = preview[0, 30]
- preview = preview[0, preview.index("\n").presence || 30] + '…'
- end
-
- preview = "#{status.proper.spoiler_text.present? ? 'CW ' : ''}“#{preview}”#{status.proper.sensitive? ? ' (sensitive)' : ''}"
-
- if status.reblog?
- "#{status.account.acct} boosted #{status.reblog.account.acct}: #{preview}"
- else
- "#{status.account.acct}: #{preview}"
- end
- end
-end
diff --git a/app/lib/rss_builder.rb b/app/lib/rss_builder.rb
deleted file mode 100644
index 63ddba2e8..000000000
--- a/app/lib/rss_builder.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-# frozen_string_literal: true
-
-class RSSBuilder
- class ItemBuilder
- def initialize
- @item = Ox::Element.new('item')
- end
-
- def title(str)
- @item << (Ox::Element.new('title') << str)
-
- self
- end
-
- def link(str)
- @item << Ox::Element.new('guid').tap do |guid|
- guid['isPermalink'] = 'true'
- guid << str
- end
-
- @item << (Ox::Element.new('link') << str)
-
- self
- end
-
- def pub_date(date)
- @item << (Ox::Element.new('pubDate') << date.to_formatted_s(:rfc822))
-
- self
- end
-
- def description(str)
- @item << (Ox::Element.new('description') << str)
-
- self
- end
-
- def enclosure(url, type, size)
- @item << Ox::Element.new('enclosure').tap do |enclosure|
- enclosure['url'] = url
- enclosure['length'] = size
- enclosure['type'] = type
- end
-
- self
- end
-
- def to_element
- @item
- end
- end
-
- def initialize
- @document = Ox::Document.new(version: '1.0')
- @channel = Ox::Element.new('channel')
-
- @document << (rss << @channel)
- end
-
- def title(str)
- @channel << (Ox::Element.new('title') << str)
-
- self
- end
-
- def link(str)
- @channel << (Ox::Element.new('link') << str)
-
- self
- end
-
- def image(str)
- @channel << Ox::Element.new('image').tap do |image|
- image << (Ox::Element.new('url') << str)
- image << (Ox::Element.new('title') << '')
- image << (Ox::Element.new('link') << '')
- end
-
- @channel << (Ox::Element.new('webfeeds:icon') << str)
-
- self
- end
-
- def cover(str)
- @channel << Ox::Element.new('webfeeds:cover').tap do |cover|
- cover['image'] = str
- end
-
- self
- end
-
- def logo(str)
- @channel << (Ox::Element.new('webfeeds:logo') << str)
-
- self
- end
-
- def accent_color(str)
- @channel << (Ox::Element.new('webfeeds:accentColor') << str)
-
- self
- end
-
- def description(str)
- @channel << (Ox::Element.new('description') << str)
-
- self
- end
-
- def item
- @channel << ItemBuilder.new.tap do |item|
- yield item
- end.to_element
-
- self
- end
-
- def to_xml
- ('' + Ox.dump(@document, effort: :tolerant)).force_encoding('UTF-8')
- end
-
- private
-
- def rss
- Ox::Element.new('rss').tap do |rss|
- rss['version'] = '2.0'
- rss['xmlns:webfeeds'] = 'http://webfeeds.org/rss/1.0'
- end
- end
-end
diff --git a/app/lib/search_query_transformer.rb b/app/lib/search_query_transformer.rb
index c685d7b6f..aef05e9d9 100644
--- a/app/lib/search_query_transformer.rb
+++ b/app/lib/search_query_transformer.rb
@@ -88,14 +88,14 @@ class SearchQueryTransformer < Parslet::Transform
case prefix
when 'from'
@filter = :account_id
- username, domain = term.split('@')
- account = Account.find_remote(username, domain)
- raise "Account not found: #{term}" unless account
+ username, domain = term.gsub(/\A@/, '').split('@')
+ domain = nil if TagManager.instance.local_domain?(domain)
+ account = Account.find_remote!(username, domain)
@term = account.id
else
- raise "Unknown prefix: #{prefix}"
+ raise Mastodon::SyntaxError
end
end
end
diff --git a/app/lib/suspicious_sign_in_detector.rb b/app/lib/suspicious_sign_in_detector.rb
new file mode 100644
index 000000000..1af5188c6
--- /dev/null
+++ b/app/lib/suspicious_sign_in_detector.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+class SuspiciousSignInDetector
+ IPV6_TOLERANCE_MASK = 64
+ IPV4_TOLERANCE_MASK = 16
+
+ def initialize(user)
+ @user = user
+ end
+
+ def suspicious?(request)
+ !sufficient_security_measures? && !freshly_signed_up? && !previously_seen_ip?(request)
+ end
+
+ private
+
+ def sufficient_security_measures?
+ @user.otp_required_for_login?
+ end
+
+ def previously_seen_ip?(request)
+ @user.ips.where('ip <<= ?', masked_ip(request)).exists?
+ end
+
+ def freshly_signed_up?
+ @user.current_sign_in_at.blank?
+ end
+
+ def masked_ip(request)
+ masked_ip_addr = begin
+ ip_addr = IPAddr.new(request.remote_ip)
+
+ if ip_addr.ipv6?
+ ip_addr.mask(IPV6_TOLERANCE_MASK)
+ else
+ ip_addr.mask(IPV4_TOLERANCE_MASK)
+ end
+ end
+
+ "#{masked_ip_addr}/#{masked_ip_addr.prefix}"
+ end
+end
diff --git a/app/lib/text_formatter.rb b/app/lib/text_formatter.rb
new file mode 100644
index 000000000..48e2fc233
--- /dev/null
+++ b/app/lib/text_formatter.rb
@@ -0,0 +1,158 @@
+# frozen_string_literal: true
+
+class TextFormatter
+ include ActionView::Helpers::TextHelper
+ include ERB::Util
+ include RoutingHelper
+
+ URL_PREFIX_REGEX = /\A(https?:\/\/(www\.)?|xmpp:)/.freeze
+
+ DEFAULT_REL = %w(nofollow noopener noreferrer).freeze
+
+ DEFAULT_OPTIONS = {
+ multiline: true,
+ }.freeze
+
+ attr_reader :text, :options
+
+ # @param [String] text
+ # @param [Hash] options
+ # @option options [Boolean] :multiline
+ # @option options [Boolean] :with_domains
+ # @option options [Boolean] :with_rel_me
+ # @option options [Array] :preloaded_accounts
+ def initialize(text, options = {})
+ @text = text
+ @options = DEFAULT_OPTIONS.merge(options)
+ end
+
+ def entities
+ @entities ||= Extractor.extract_entities_with_indices(text, extract_url_without_protocol: false)
+ end
+
+ def to_s
+ return ''.html_safe if text.blank?
+
+ html = rewrite do |entity|
+ if entity[:url]
+ link_to_url(entity)
+ elsif entity[:hashtag]
+ link_to_hashtag(entity)
+ elsif entity[:screen_name]
+ link_to_mention(entity)
+ end
+ end
+
+ html = simple_format(html, {}, sanitize: false).delete("\n") if multiline?
+
+ html.html_safe # rubocop:disable Rails/OutputSafety
+ end
+
+ private
+
+ def rewrite
+ entities.sort_by! do |entity|
+ entity[:indices].first
+ end
+
+ result = ''.dup
+
+ last_index = entities.reduce(0) do |index, entity|
+ indices = entity[:indices]
+ result << h(text[index...indices.first])
+ result << yield(entity)
+ indices.last
+ end
+
+ result << h(text[last_index..-1])
+
+ result
+ end
+
+ def link_to_url(entity)
+ url = Addressable::URI.parse(entity[:url]).to_s
+ rel = with_rel_me? ? (DEFAULT_REL + %w(me)) : DEFAULT_REL
+
+ prefix = url.match(URL_PREFIX_REGEX).to_s
+ display_url = url[prefix.length, 30]
+ suffix = url[prefix.length + 30..-1]
+ cutoff = url[prefix.length..-1].length > 30
+
+ <<~HTML.squish
+ #{h(prefix)}#{h(display_url)}#{h(suffix)}
+ HTML
+ rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
+ h(entity[:url])
+ end
+
+ def link_to_hashtag(entity)
+ hashtag = entity[:hashtag]
+ url = tag_url(hashtag)
+
+ <<~HTML.squish
+ ##{h(hashtag)}
+ HTML
+ end
+
+ def link_to_mention(entity)
+ username, domain = entity[:screen_name].split('@')
+ domain = nil if local_domain?(domain)
+ account = nil
+
+ if preloaded_accounts?
+ same_username_hits = 0
+
+ preloaded_accounts.each do |other_account|
+ same_username = other_account.username.casecmp(username).zero?
+ same_domain = other_account.domain.nil? ? domain.nil? : other_account.domain.casecmp(domain)&.zero?
+
+ if same_username && !same_domain
+ same_username_hits += 1
+ elsif same_username && same_domain
+ account = other_account
+ end
+ end
+ else
+ account = entity_cache.mention(username, domain)
+ end
+
+ return "@#{h(entity[:screen_name])}" if account.nil?
+
+ url = ActivityPub::TagManager.instance.url_for(account)
+ display_username = same_username_hits&.positive? || with_domains? ? account.pretty_acct : account.username
+
+ <<~HTML.squish
+ @#{h(display_username)}
+ HTML
+ end
+
+ def entity_cache
+ @entity_cache ||= EntityCache.instance
+ end
+
+ def tag_manager
+ @tag_manager ||= TagManager.instance
+ end
+
+ delegate :local_domain?, to: :tag_manager
+
+ def multiline?
+ options[:multiline]
+ end
+
+ def with_domains?
+ options[:with_domains]
+ end
+
+ def with_rel_me?
+ options[:with_rel_me]
+ end
+
+ def preloaded_accounts
+ options[:preloaded_accounts]
+ end
+
+ def preloaded_accounts?
+ preloaded_accounts.present?
+ end
+end
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
index d8015e50d..1d70ed36a 100644
--- a/app/lib/user_settings_decorator.rb
+++ b/app/lib/user_settings_decorator.rb
@@ -34,7 +34,6 @@ class UserSettingsDecorator
user.settings['noindex'] = noindex_preference if change?('setting_noindex')
user.settings['flavour'] = flavour_preference if change?('setting_flavour')
user.settings['skin'] = skin_preference if change?('setting_skin')
- user.settings['hide_network'] = hide_network_preference if change?('setting_hide_network')
user.settings['aggregate_reblogs'] = aggregate_reblogs_preference if change?('setting_aggregate_reblogs')
user.settings['show_application'] = show_application_preference if change?('setting_show_application')
user.settings['advanced_layout'] = advanced_layout_preference if change?('setting_advanced_layout')
@@ -43,6 +42,7 @@ class UserSettingsDecorator
user.settings['use_pending_items'] = use_pending_items_preference if change?('setting_use_pending_items')
user.settings['trends'] = trends_preference if change?('setting_trends')
user.settings['crop_images'] = crop_images_preference if change?('setting_crop_images')
+ user.settings['always_send_emails'] = always_send_emails_preference if change?('setting_always_send_emails')
end
def merged_notification_emails
@@ -117,10 +117,6 @@ class UserSettingsDecorator
settings['setting_skin']
end
- def hide_network_preference
- boolean_cast_setting 'setting_hide_network'
- end
-
def show_application_preference
boolean_cast_setting 'setting_show_application'
end
@@ -157,6 +153,10 @@ class UserSettingsDecorator
boolean_cast_setting 'setting_crop_images'
end
+ def always_send_emails_preference
+ boolean_cast_setting 'setting_always_send_emails'
+ end
+
def boolean_cast_setting(key)
ActiveModel::Type::Boolean.new.cast(settings[key])
end
diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb
index 1ffb5b4bf..a681e0815 100644
--- a/app/lib/webfinger.rb
+++ b/app/lib/webfinger.rb
@@ -6,8 +6,13 @@ class Webfinger
class RedirectError < StandardError; end
class Response
- def initialize(body)
+ attr_reader :uri
+
+ def initialize(uri, body)
+ @uri = uri
@json = Oj.load(body, mode: :strict)
+
+ validate_response!
end
def subject
@@ -23,6 +28,10 @@ class Webfinger
def links
@links ||= @json['links'].index_by { |link| link['rel'] }
end
+
+ def validate_response!
+ raise Webfinger::Error, "Missing subject in response for #{@uri}" if subject.blank?
+ end
end
def initialize(uri)
@@ -34,7 +43,7 @@ class Webfinger
end
def perform
- Response.new(body_from_webfinger)
+ Response.new(@uri, body_from_webfinger)
rescue Oj::ParseError
raise Webfinger::Error, "Invalid JSON in response for #{@uri}"
rescue Addressable::URI::InvalidURIError
diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb
index cc585c3b7..a37682eca 100644
--- a/app/mailers/application_mailer.rb
+++ b/app/mailers/application_mailer.rb
@@ -5,6 +5,7 @@ class ApplicationMailer < ActionMailer::Base
helper :application
helper :instance
+ helper :formatting
protected
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index 1a823328c..09e2b7c53 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -7,6 +7,7 @@ class UserMailer < Devise::Mailer
helper :application
helper :instance
helper :statuses
+ helper :formatting
helper RoutingHelper
@@ -17,7 +18,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.unconfirmed_email.presence || @resource.email,
subject: I18n.t(@resource.pending_reconfirmation? ? 'devise.mailer.reconfirmation_instructions.subject' : 'devise.mailer.confirmation_instructions.subject', instance: @instance),
template_name: @resource.pending_reconfirmation? ? 'reconfirmation_instructions' : 'confirmation_instructions'
@@ -31,7 +32,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.reset_password_instructions.subject')
end
end
@@ -42,7 +43,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.password_change.subject')
end
end
@@ -53,7 +54,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.email_changed.subject')
end
end
@@ -64,7 +65,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_enabled.subject')
end
end
@@ -75,7 +76,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_disabled.subject')
end
end
@@ -86,7 +87,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_recovery_codes_changed.subject')
end
end
@@ -97,7 +98,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.webauthn_enabled.subject')
end
end
@@ -108,7 +109,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.webauthn_disabled.subject')
end
end
@@ -120,7 +121,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.webauthn_credential.added.subject')
end
end
@@ -132,7 +133,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('devise.mailer.webauthn_credential.deleted.subject')
end
end
@@ -143,7 +144,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('user_mailer.welcome.subject')
end
end
@@ -155,7 +156,7 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication?
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('user_mailer.backup_ready.subject')
end
end
@@ -166,10 +167,8 @@ class UserMailer < Devise::Mailer
@instance = Rails.configuration.x.local_domain
@statuses = @warning.statuses.includes(:account, :preloadable_poll, :media_attachments, active_mentions: [:account])
- I18n.with_locale(@resource.locale || I18n.default_locale) do
- mail to: @resource.email,
- subject: I18n.t("user_mailer.warning.subject.#{@warning.action}", acct: "@#{user.account.local_username_and_domain}"),
- reply_to: ENV['SMTP_REPLY_TO']
+ I18n.with_locale(locale) do
+ mail to: @resource.email, subject: I18n.t("user_mailer.warning.subject.#{@warning.action}", acct: "@#{user.account.local_username_and_domain}")
end
end
@@ -178,7 +177,7 @@ class UserMailer < Devise::Mailer
@instance = Rails.configuration.x.local_domain
@appeal = appeal
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('user_mailer.appeal_approved.subject', date: l(@appeal.created_at))
end
end
@@ -188,12 +187,12 @@ class UserMailer < Devise::Mailer
@instance = Rails.configuration.x.local_domain
@appeal = appeal
- I18n.with_locale(@resource.locale || I18n.default_locale) do
+ I18n.with_locale(locale) do
mail to: @resource.email, subject: I18n.t('user_mailer.appeal_rejected.subject', date: l(@appeal.created_at))
end
end
- def sign_in_token(user, remote_ip, user_agent, timestamp)
+ def suspicious_sign_in(user, remote_ip, user_agent, timestamp)
@resource = user
@instance = Rails.configuration.x.local_domain
@remote_ip = remote_ip
@@ -201,12 +200,14 @@ class UserMailer < Devise::Mailer
@detection = Browser.new(user_agent)
@timestamp = timestamp.to_time.utc
- return unless @resource.active_for_authentication?
-
- I18n.with_locale(@resource.locale || I18n.default_locale) do
- mail to: @resource.email,
- subject: I18n.t('user_mailer.sign_in_token.subject'),
- reply_to: ENV['SMTP_REPLY_TO']
+ I18n.with_locale(locale) do
+ mail to: @resource.email, subject: I18n.t('user_mailer.suspicious_sign_in.subject')
end
end
+
+ private
+
+ def locale
+ @resource.locale.presence || I18n.default_locale
+ end
end
diff --git a/app/models/account.rb b/app/models/account.rb
index dfbe0b8bc..688e6fabd 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -79,7 +79,7 @@ class Account < ApplicationRecord
MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i
MAX_NOTE_LENGTH = (ENV['MAX_BIO_CHARS'] || 500).to_i
- MAX_FIELDS = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i
+ DEFAULT_FIELDS_SIZE = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i
enum protocol: [:ostatus, :activitypub]
enum suspension_origin: [:local, :remote], _prefix: true
@@ -92,10 +92,10 @@ class Account < ApplicationRecord
# Local user validations
validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: 30 }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
- validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? }
+ validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? }
validates :note, note_length: { maximum: MAX_NOTE_LENGTH }, if: -> { local? && will_save_change_to_note? }
- validates :fields, length: { maximum: MAX_FIELDS }, if: -> { local? && will_save_change_to_fields? }
+ validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? }
scope :remote, -> { where.not(domain: nil) }
scope :local, -> { where(domain: nil) }
@@ -113,7 +113,8 @@ class Account < ApplicationRecord
scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) }
scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
- scope :searchable, -> { without_suspended.where(moved_to_account_id: nil) }
+ scope :without_unapproved, -> { left_outer_joins(:user).remote.or(left_outer_joins(:user).merge(User.approved.confirmed)) }
+ scope :searchable, -> { without_unapproved.without_suspended.where(moved_to_account_id: nil) }
scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).left_outer_joins(:account_stat) }
scope :followable_by, ->(account) { joins(arel_table.join(Follow.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(Follow.arel_table[:target_account_id]).and(Follow.arel_table[:account_id].eq(account.id))).join_sources).where(Follow.arel_table[:id].eq(nil)).joins(arel_table.join(FollowRequest.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(FollowRequest.arel_table[:target_account_id]).and(FollowRequest.arel_table[:account_id].eq(account.id))).join_sources).where(FollowRequest.arel_table[:id].eq(nil)) }
scope :by_recent_status, -> { order(Arel.sql('(case when account_stats.last_status_at is null then 1 else 0 end) asc, account_stats.last_status_at desc, accounts.id desc')) }
@@ -132,13 +133,13 @@ class Account < ApplicationRecord
:approved?,
:pending?,
:disabled?,
+ :unconfirmed?,
:unconfirmed_or_pending?,
:role,
:admin?,
:moderator?,
:staff?,
:locale,
- :hides_network?,
:shows_application?,
to: :user,
prefix: true,
@@ -197,7 +198,7 @@ class Account < ApplicationRecord
end
def searchable?
- !(suspended? || moved?)
+ !(suspended? || moved?) && (!local? || (approved? && confirmed?))
end
def possibly_stale?
@@ -329,12 +330,12 @@ class Account < ApplicationRecord
end
def build_fields
- return if fields.size >= MAX_FIELDS
+ return if fields.size >= DEFAULT_FIELDS_SIZE
tmp = self[:fields] || []
tmp = [] if tmp.is_a?(Hash)
- (MAX_FIELDS - tmp.size).times do
+ (DEFAULT_FIELDS_SIZE - tmp.size).times do
tmp << { name: '', value: '' }
end
@@ -463,9 +464,11 @@ class Account < ApplicationRecord
accounts.*,
ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank
FROM accounts
+ LEFT JOIN users ON accounts.id = users.account_id
WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH}
AND accounts.suspended_at IS NULL
AND accounts.moved_to_account_id IS NULL
+ AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL))
ORDER BY rank DESC
LIMIT :limit OFFSET :offset
SQL
@@ -541,9 +544,11 @@ class Account < ApplicationRecord
(count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank
FROM accounts
LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = :id) OR (accounts.id = f.target_account_id AND f.account_id = :id)
+ LEFT JOIN users ON accounts.id = users.account_id
WHERE to_tsquery('simple', :tsquery) @@ #{TEXTSEARCH}
AND accounts.suspended_at IS NULL
AND accounts.moved_to_account_id IS NULL
+ AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL))
GROUP BY accounts.id
ORDER BY rank DESC
LIMIT :limit OFFSET :offset
@@ -561,6 +566,12 @@ class Account < ApplicationRecord
before_validation :prepare_username, on: :create
before_destroy :clean_feed_manager
+ def ensure_keys!
+ return unless local? && private_key.blank? && public_key.blank?
+ generate_keys
+ save!
+ end
+
private
def prepare_contents
diff --git a/app/models/account_alias.rb b/app/models/account_alias.rb
index 3d659142a..b421c66e2 100644
--- a/app/models/account_alias.rb
+++ b/app/models/account_alias.rb
@@ -28,6 +28,11 @@ class AccountAlias < ApplicationRecord
super(val.start_with?('@') ? val[1..-1] : val)
end
+ def pretty_acct
+ username, domain = acct.split('@')
+ domain.nil? ? username : "#{username}@#{Addressable::IDNA.to_unicode(domain)}"
+ end
+
private
def set_uri
diff --git a/app/models/account_conversation.rb b/app/models/account_conversation.rb
index 56fd13543..45e74bbeb 100644
--- a/app/models/account_conversation.rb
+++ b/app/models/account_conversation.rb
@@ -14,6 +14,8 @@
#
class AccountConversation < ApplicationRecord
+ include Redisable
+
after_commit :push_to_streaming_api
belongs_to :account
@@ -109,7 +111,7 @@ class AccountConversation < ApplicationRecord
end
def subscribed_to_timeline?
- Redis.current.exists?("subscribed:#{streaming_channel}")
+ redis.exists?("subscribed:#{streaming_channel}")
end
def streaming_channel
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index 9da1522dd..ec309ce09 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -80,6 +80,10 @@ class AccountFilter
accounts_with_users.merge(User.pending)
when 'suspended'
Account.suspended
+ when 'disabled'
+ accounts_with_users.merge(User.disabled)
+ when 'silenced'
+ Account.silenced
else
raise "Unknown status: #{value}"
end
diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb
index ded32c9c6..06291c9f3 100644
--- a/app/models/account_migration.rb
+++ b/app/models/account_migration.rb
@@ -15,6 +15,7 @@
class AccountMigration < ApplicationRecord
include Redisable
+ include Lockable
COOLDOWN_PERIOD = 30.days.freeze
@@ -41,12 +42,8 @@ class AccountMigration < ApplicationRecord
return false unless errors.empty?
- RedisLock.acquire(lock_options) do |lock|
- if lock.acquired?
- save
- else
- raise Mastodon::RaceConditionError
- end
+ with_lock("account_migration:#{account.id}") do
+ save
end
end
@@ -83,8 +80,4 @@ class AccountMigration < ApplicationRecord
def validate_migration_cooldown
errors.add(:base, I18n.t('migrations.errors.on_cooldown')) if account.migrations.within_cooldown.exists?
end
-
- def lock_options
- { redis: redis, key: "account_migration:#{account.id}" }
- end
end
diff --git a/app/models/account_stat.rb b/app/models/account_stat.rb
index b49827267..a5d71a5b8 100644
--- a/app/models/account_stat.rb
+++ b/app/models/account_stat.rb
@@ -20,4 +20,16 @@ class AccountStat < ApplicationRecord
belongs_to :account, inverse_of: :account_stat
update_index('accounts', :account)
+
+ def following_count
+ [attributes['following_count'], 0].max
+ end
+
+ def followers_count
+ [attributes['followers_count'], 0].max
+ end
+
+ def statuses_count
+ [attributes['statuses_count'], 0].max
+ end
end
diff --git a/app/models/account_suggestions/global_source.rb b/app/models/account_suggestions/global_source.rb
index 7bca530d4..651041d67 100644
--- a/app/models/account_suggestions/global_source.rb
+++ b/app/models/account_suggestions/global_source.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class AccountSuggestions::GlobalSource < AccountSuggestions::Source
+ include Redisable
+
def key
:global
end
@@ -28,7 +30,7 @@ class AccountSuggestions::GlobalSource < AccountSuggestions::Source
end
def account_ids_for_locale(locale)
- Redis.current.zrevrange("follow_recommendations:#{locale}", 0, -1).map(&:to_i)
+ redis.zrevrange("follow_recommendations:#{locale}", 0, -1).map(&:to_i)
end
def to_ordered_list_key(account)
diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb
index 850ea6d82..aed3bc0c7 100644
--- a/app/models/admin/account_action.rb
+++ b/app/models/admin/account_action.rb
@@ -92,6 +92,10 @@ class Admin::AccountAction
text: text_for_warning,
status_ids: status_ids
)
+
+ # A log entry is only interesting if the warning contains
+ # custom text from someone. Otherwise it's just noise.
+ log_action(:create, @warning) if @warning.text.present? && type == 'none'
end
def process_reports!
@@ -160,8 +164,8 @@ class Admin::AccountAction
def reports
@reports ||= begin
- if type == 'none' && with_report?
- [report]
+ if type == 'none'
+ with_report? ? [report] : []
else
Report.where(target_account: target_account).unresolved
end
diff --git a/app/models/admin/action_log.rb b/app/models/admin/action_log.rb
index 852bff713..401bfd9ac 100644
--- a/app/models/admin/action_log.rb
+++ b/app/models/admin/action_log.rb
@@ -1,4 +1,5 @@
# frozen_string_literal: true
+
# == Schema Information
#
# Table name: admin_action_logs
diff --git a/app/models/admin/import.rb b/app/models/admin/import.rb
new file mode 100644
index 000000000..c305be237
--- /dev/null
+++ b/app/models/admin/import.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# A non-activerecord helper class for csv upload
+class Admin::Import
+ extend ActiveModel::Callbacks
+ include ActiveModel::Model
+ include Paperclip::Glue
+
+ FILE_TYPES = %w(text/plain text/csv application/csv).freeze
+
+ # Paperclip required callbacks
+ define_model_callbacks :save, only: [:after]
+ define_model_callbacks :destroy, only: [:before, :after]
+
+ attr_accessor :data_file_name, :data_content_type
+
+ has_attached_file :data
+ validates_attachment_content_type :data, content_type: FILE_TYPES
+ validates_attachment_presence :data
+ validates_with AdminImportValidator, on: :create
+
+ def save
+ run_callbacks :save
+ end
+
+ def destroy
+ run_callbacks :destroy
+ end
+end
diff --git a/app/models/admin/status_batch_action.rb b/app/models/admin/status_batch_action.rb
index 631af183c..7bf6fa6da 100644
--- a/app/models/admin/status_batch_action.rb
+++ b/app/models/admin/status_batch_action.rb
@@ -103,7 +103,7 @@ class Admin::StatusBatchAction
def handle_report!
@report = Report.new(report_params) unless with_report?
- @report.status_ids = (@report.status_ids + status_ids.map(&:to_i)).uniq
+ @report.status_ids = (@report.status_ids + allowed_status_ids).uniq
@report.save!
@report_id = @report.id
@@ -135,4 +135,8 @@ class Admin::StatusBatchAction
def report_params
{ account: current_account, target_account: target_account }
end
+
+ def allowed_status_ids
+ AccountStatusesFilter.new(@report.target_account, current_account).results.with_discarded.where(id: status_ids).pluck(:id)
+ end
end
diff --git a/app/models/concerns/account_avatar.rb b/app/models/concerns/account_avatar.rb
index 1af53ed23..0cfd9167c 100644
--- a/app/models/concerns/account_avatar.rb
+++ b/app/models/concerns/account_avatar.rb
@@ -3,7 +3,7 @@
module AccountAvatar
extend ActiveSupport::Concern
- IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
+ IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
LIMIT = 2.megabytes
class_methods do
diff --git a/app/models/concerns/account_finder_concern.rb b/app/models/concerns/account_finder_concern.rb
index 0dadddad1..e8b804934 100644
--- a/app/models/concerns/account_finder_concern.rb
+++ b/app/models/concerns/account_finder_concern.rb
@@ -13,7 +13,7 @@ module AccountFinderConcern
end
def representative
- Account.find(-99)
+ Account.find(-99).tap(&:ensure_keys!)
rescue ActiveRecord::RecordNotFound
Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain)
end
diff --git a/app/models/concerns/account_header.rb b/app/models/concerns/account_header.rb
index 72a3d0566..a8c0a28ef 100644
--- a/app/models/concerns/account_header.rb
+++ b/app/models/concerns/account_header.rb
@@ -3,7 +3,7 @@
module AccountHeader
extend ActiveSupport::Concern
- IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
+ IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
LIMIT = 2.megabytes
MAX_PIXELS = 750_000 # 1500x500px
diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb
index ad1665dc4..a7401362f 100644
--- a/app/models/concerns/account_interactions.rb
+++ b/app/models/concerns/account_interactions.rb
@@ -247,6 +247,19 @@ module AccountInteractions
account_pins.where(target_account: account).exists?
end
+ def status_matches_filters(status)
+ active_filters = CustomFilter.cached_filters_for(id)
+
+ filter_matches = active_filters.filter_map do |filter, rules|
+ next if rules[:keywords].blank?
+
+ match = rules[:keywords].match(status.proper.searchable_text)
+ FilterResultPresenter.new(filter: filter, keyword_matches: [match.to_s]) unless match.nil?
+ end
+
+ filter_matches
+ end
+
def followers_for_local_distribution
followers.local
.joins(:user)
diff --git a/app/models/concerns/lockable.rb b/app/models/concerns/lockable.rb
new file mode 100644
index 000000000..55a9714ca
--- /dev/null
+++ b/app/models/concerns/lockable.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Lockable
+ # @param [String] lock_name
+ # @param [ActiveSupport::Duration] autorelease Automatically release the lock after this time
+ # @param [Boolean] raise_on_failure Raise an error if a lock cannot be acquired, or fail silently
+ # @raise [Mastodon::RaceConditionError]
+ def with_lock(lock_name, autorelease: 15.minutes, raise_on_failure: true)
+ with_redis do |redis|
+ RedisLock.acquire(redis: redis, key: "lock:#{lock_name}", autorelease: autorelease.seconds) do |lock|
+ if lock.acquired?
+ yield
+ elsif raise_on_failure
+ raise Mastodon::RaceConditionError, "Could not acquire lock for #{lock_name}, try again later"
+ end
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/redisable.rb b/app/models/concerns/redisable.rb
index c6cf97359..0dad3abb2 100644
--- a/app/models/concerns/redisable.rb
+++ b/app/models/concerns/redisable.rb
@@ -1,11 +1,11 @@
# frozen_string_literal: true
module Redisable
- extend ActiveSupport::Concern
-
- private
-
def redis
- Redis.current
+ Thread.current[:redis] ||= RedisConfiguration.pool.checkout
+ end
+
+ def with_redis(&block)
+ RedisConfiguration.with(&block)
end
end
diff --git a/app/models/concerns/status_snapshot_concern.rb b/app/models/concerns/status_snapshot_concern.rb
new file mode 100644
index 000000000..c728db7c3
--- /dev/null
+++ b/app/models/concerns/status_snapshot_concern.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module StatusSnapshotConcern
+ extend ActiveSupport::Concern
+
+ included do
+ has_many :edits, class_name: 'StatusEdit', inverse_of: :status, dependent: :destroy
+ end
+
+ def edited?
+ edited_at.present?
+ end
+
+ def build_snapshot(account_id: nil, at_time: nil, rate_limit: true)
+ # We don't use `edits#new` here to avoid it having saved when the
+ # status is saved, since we want to control that manually
+
+ StatusEdit.new(
+ status_id: id,
+ text: text,
+ spoiler_text: spoiler_text,
+ sensitive: sensitive,
+ ordered_media_attachment_ids: ordered_media_attachment_ids&.dup || media_attachments.pluck(:id),
+ media_descriptions: ordered_media_attachments.map(&:description),
+ poll_options: preloadable_poll&.options&.dup,
+ account_id: account_id || self.account_id,
+ content_type: content_type,
+ created_at: at_time || edited_at,
+ rate_limit: rate_limit
+ )
+ end
+
+ def snapshot!(**options)
+ build_snapshot(**options).save!
+ end
+end
diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index d7349dc6a..196ae0297 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -32,7 +32,7 @@ class CustomEmoji < ApplicationRecord
:(#{SHORTCODE_RE_FRAGMENT}):
(?=[^[:alnum:]:]|$)/x
- IMAGE_MIME_TYPES = %w(image/png image/gif).freeze
+ IMAGE_MIME_TYPES = %w(image/png image/gif image/webp).freeze
belongs_to :category, class_name: 'CustomEmojiCategory', optional: true
has_one :local_counterpart, -> { where(domain: nil) }, class_name: 'CustomEmoji', primary_key: :shortcode, foreign_key: :shortcode
diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index 9d0f3729b..e98ed7df9 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -3,18 +3,22 @@
#
# Table name: custom_filters
#
-# id :bigint(8) not null, primary key
-# account_id :bigint(8)
-# expires_at :datetime
-# phrase :text default(""), not null
-# context :string default([]), not null, is an Array
-# whole_word :boolean default(TRUE), not null
-# irreversible :boolean default(FALSE), not null
-# created_at :datetime not null
-# updated_at :datetime not null
+# id :bigint not null, primary key
+# account_id :bigint
+# expires_at :datetime
+# phrase :text default(""), not null
+# context :string default([]), not null, is an Array
+# created_at :datetime not null
+# updated_at :datetime not null
+# action :integer default(0), not null
#
class CustomFilter < ApplicationRecord
+ self.ignored_columns = %w(whole_word irreversible)
+
+ alias_attribute :title, :phrase
+ alias_attribute :filter_action, :action
+
VALID_CONTEXTS = %w(
home
notifications
@@ -24,17 +28,22 @@ class CustomFilter < ApplicationRecord
).freeze
include Expireable
+ include Redisable
+
+ enum action: [:warn, :hide], _suffix: :action
belongs_to :account
+ has_many :keywords, class_name: 'CustomFilterKeyword', foreign_key: :custom_filter_id, inverse_of: :custom_filter, dependent: :destroy
+ accepts_nested_attributes_for :keywords, reject_if: :all_blank, allow_destroy: true
- validates :phrase, :context, presence: true
+ validates :title, :context, presence: true
validate :context_must_be_valid
- validate :irreversible_must_be_within_context
-
- scope :active_irreversible, -> { where(irreversible: true).where(Arel.sql('expires_at IS NULL OR expires_at > NOW()')) }
before_validation :clean_up_contexts
- after_commit :remove_cache
+
+ before_save :prepare_cache_invalidation!
+ before_destroy :prepare_cache_invalidation!
+ after_commit :invalidate_cache!
def expires_in
return @expires_in if defined?(@expires_in)
@@ -43,22 +52,55 @@ class CustomFilter < ApplicationRecord
[30.minutes, 1.hour, 6.hours, 12.hours, 1.day, 1.week].find { |expires_in| expires_in.from_now >= expires_at }
end
+ def irreversible=(value)
+ self.action = value ? :hide : :warn
+ end
+
+ def irreversible?
+ hide_action?
+ end
+
+ def self.cached_filters_for(account_id)
+ active_filters = Rails.cache.fetch("filters:v3:#{account_id}") do
+ scope = CustomFilterKeyword.includes(:custom_filter).where(custom_filter: { account_id: account_id }).where(Arel.sql('expires_at IS NULL OR expires_at > NOW()'))
+ scope.to_a.group_by(&:custom_filter).map do |filter, keywords|
+ keywords.map! do |keyword|
+ if keyword.whole_word
+ sb = /\A[[:word:]]/.match?(keyword.keyword) ? '\b' : ''
+ eb = /[[:word:]]\z/.match?(keyword.keyword) ? '\b' : ''
+
+ /(?mix:#{sb}#{Regexp.escape(keyword.keyword)}#{eb})/
+ else
+ /#{Regexp.escape(keyword.keyword)}/i
+ end
+ end
+ [filter, { keywords: Regexp.union(keywords) }]
+ end
+ end.to_a
+
+ active_filters.select { |custom_filter, _| !custom_filter.expired? }
+ end
+
+ def prepare_cache_invalidation!
+ @should_invalidate_cache = true
+ end
+
+ def invalidate_cache!
+ return unless @should_invalidate_cache
+ @should_invalidate_cache = false
+
+ Rails.cache.delete("filters:v3:#{account_id}")
+ redis.publish("timeline:#{account_id}", Oj.dump(event: :filters_changed))
+ redis.publish("timeline:system:#{account_id}", Oj.dump(event: :filters_changed))
+ end
+
private
def clean_up_contexts
self.context = Array(context).map(&:strip).filter_map(&:presence)
end
- def remove_cache
- Rails.cache.delete("filters:#{account_id}")
- Redis.current.publish("timeline:#{account_id}", Oj.dump(event: :filters_changed))
- end
-
def context_must_be_valid
errors.add(:context, I18n.t('filters.errors.invalid_context')) if context.empty? || context.any? { |c| !VALID_CONTEXTS.include?(c) }
end
-
- def irreversible_must_be_within_context
- errors.add(:irreversible, I18n.t('filters.errors.invalid_irreversible')) if irreversible? && !context.include?('home') && !context.include?('notifications')
- end
end
diff --git a/app/models/custom_filter_keyword.rb b/app/models/custom_filter_keyword.rb
new file mode 100644
index 000000000..bf5c55746
--- /dev/null
+++ b/app/models/custom_filter_keyword.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: custom_filter_keywords
+#
+# id :bigint not null, primary key
+# custom_filter_id :bigint not null
+# keyword :text default(""), not null
+# whole_word :boolean default(TRUE), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+
+class CustomFilterKeyword < ApplicationRecord
+ belongs_to :custom_filter
+
+ validates :keyword, presence: true
+
+ alias_attribute :phrase, :keyword
+
+ before_save :prepare_cache_invalidation!
+ before_destroy :prepare_cache_invalidation!
+ after_commit :invalidate_cache!
+
+ private
+
+ def prepare_cache_invalidation!
+ custom_filter.prepare_cache_invalidation!
+ end
+
+ def invalidate_cache!
+ custom_filter.invalidate_cache!
+ end
+end
diff --git a/app/models/domain_allow.rb b/app/models/domain_allow.rb
index 4b0a89c18..7a0acbe32 100644
--- a/app/models/domain_allow.rb
+++ b/app/models/domain_allow.rb
@@ -11,6 +11,7 @@
#
class DomainAllow < ApplicationRecord
+ include Paginable
include DomainNormalizable
include DomainMaterializable
@@ -23,6 +24,10 @@ class DomainAllow < ApplicationRecord
!rule_for(domain).nil?
end
+ def allowed_domains
+ select(:domain)
+ end
+
def rule_for(domain)
return if domain.blank?
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index 2b797ef91..a15206b5e 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -16,6 +16,7 @@
#
class DomainBlock < ApplicationRecord
+ include Paginable
include DomainNormalizable
include DomainMaterializable
diff --git a/app/models/email_domain_block.rb b/app/models/email_domain_block.rb
index 36e7e62ab..0e1e663c1 100644
--- a/app/models/email_domain_block.rb
+++ b/app/models/email_domain_block.rb
@@ -3,16 +3,19 @@
#
# Table name: email_domain_blocks
#
-# id :bigint(8) not null, primary key
-# domain :string default(""), not null
-# created_at :datetime not null
-# updated_at :datetime not null
-# parent_id :bigint(8)
-# ips :inet is an Array
-# last_refresh_at :datetime
+# id :bigint(8) not null, primary key
+# domain :string default(""), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+# parent_id :bigint(8)
#
class EmailDomainBlock < ApplicationRecord
+ self.ignored_columns = %w(
+ ips
+ last_refresh_at
+ )
+
include DomainNormalizable
belongs_to :parent, class_name: 'EmailDomainBlock', optional: true
@@ -27,7 +30,7 @@ class EmailDomainBlock < ApplicationRecord
@history ||= Trends::History.new('email_domain_blocks', id)
end
- def self.block?(domain_or_domains, ips: [], attempt_ip: nil)
+ def self.block?(domain_or_domains, attempt_ip: nil)
domains = Array(domain_or_domains).map do |str|
domain = begin
if str.include?('@')
@@ -48,10 +51,7 @@ class EmailDomainBlock < ApplicationRecord
blocked = domains.any?(&:nil?)
- scope = where(domain: domains)
- scope = scope.or(where('ips && ARRAY[?]::inet[]', ips)) if ips.any?
-
- scope.find_each do |block|
+ where(domain: domains).find_each do |block|
blocked = true
block.history.add(attempt_ip) if attempt_ip.present?
end
diff --git a/app/models/encrypted_message.rb b/app/models/encrypted_message.rb
index aa4182b4e..7b4e32283 100644
--- a/app/models/encrypted_message.rb
+++ b/app/models/encrypted_message.rb
@@ -19,6 +19,7 @@ class EncryptedMessage < ApplicationRecord
self.inheritance_column = nil
include Paginable
+ include Redisable
scope :up_to, ->(id) { where(arel_table[:id].lteq(id)) }
@@ -38,7 +39,7 @@ class EncryptedMessage < ApplicationRecord
end
def subscribed_to_timeline?
- Redis.current.exists?("subscribed:#{streaming_channel}")
+ redis.exists?("subscribed:#{streaming_channel}")
end
def streaming_channel
diff --git a/app/models/follow_recommendation_filter.rb b/app/models/follow_recommendation_filter.rb
index acf03cd84..531332614 100644
--- a/app/models/follow_recommendation_filter.rb
+++ b/app/models/follow_recommendation_filter.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class FollowRecommendationFilter
+ include Redisable
+
KEYS = %i(
language
status
@@ -17,7 +19,7 @@ class FollowRecommendationFilter
if params['status'] == 'suppressed'
Account.joins(:follow_recommendation_suppression).order(FollowRecommendationSuppression.arel_table[:id].desc).to_a
else
- account_ids = Redis.current.zrevrange("follow_recommendations:#{@language}", 0, -1).map(&:to_i)
+ account_ids = redis.zrevrange("follow_recommendations:#{@language}", 0, -1).map(&:to_i)
accounts = Account.where(id: account_ids).index_by(&:id)
account_ids.map { |id| accounts[id] }.compact
diff --git a/app/models/form/domain_block_batch.rb b/app/models/form/domain_block_batch.rb
new file mode 100644
index 000000000..39012df51
--- /dev/null
+++ b/app/models/form/domain_block_batch.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class Form::DomainBlockBatch
+ include ActiveModel::Model
+ include Authorization
+ include AccountableConcern
+
+ attr_accessor :domain_blocks_attributes, :action, :current_account
+
+ def save
+ case action
+ when 'save'
+ save!
+ end
+ end
+
+ private
+
+ def domain_blocks
+ @domain_blocks ||= domain_blocks_attributes.values.filter_map do |attributes|
+ DomainBlock.new(attributes.without('enabled')) if ActiveModel::Type::Boolean.new.cast(attributes['enabled'])
+ end
+ end
+
+ def save!
+ domain_blocks.each do |domain_block|
+ authorize(domain_block, :create?)
+ next if DomainBlock.rule_for(domain_block.domain).present?
+
+ domain_block.save!
+ DomainBlockWorker.perform_async(domain_block.id)
+ log_action :create, domain_block
+ end
+ end
+end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 533e403c0..3cc340f59 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -44,7 +44,7 @@ class MediaAttachment < ApplicationRecord
MAX_VIDEO_MATRIX_LIMIT = 2_304_000 # 1920x1200px
MAX_VIDEO_FRAME_RATE = 60
- IMAGE_FILE_EXTENSIONS = %w(.jpg .jpeg .png .gif).freeze
+ IMAGE_FILE_EXTENSIONS = %w(.jpg .jpeg .png .gif .webp).freeze
VIDEO_FILE_EXTENSIONS = %w(.webm .mp4 .m4v .mov).freeze
AUDIO_FILE_EXTENSIONS = %w(.ogg .oga .mp3 .wav .flac .opus .aac .m4a .3gp .wma).freeze
@@ -55,10 +55,10 @@ class MediaAttachment < ApplicationRecord
small
).freeze
- IMAGE_MIME_TYPES = %w(image/jpeg image/png image/gif).freeze
+ IMAGE_MIME_TYPES = %w(image/jpeg image/png image/gif image/webp).freeze
VIDEO_MIME_TYPES = %w(video/webm video/mp4 video/quicktime video/ogg).freeze
VIDEO_CONVERTIBLE_MIME_TYPES = %w(video/webm video/quicktime).freeze
- AUDIO_MIME_TYPES = %w(audio/wave audio/wav audio/x-wav audio/x-pn-wave audio/ogg audio/vorbis audio/mpeg audio/mp3 audio/webm audio/flac audio/aac audio/m4a audio/x-m4a audio/mp4 audio/3gpp video/x-ms-asf).freeze
+ AUDIO_MIME_TYPES = %w(audio/wave audio/wav audio/x-wav audio/x-pn-wave audio/vnd.wave audio/ogg audio/vorbis audio/mpeg audio/mp3 audio/webm audio/flac audio/aac audio/m4a audio/x-m4a audio/mp4 audio/3gpp video/x-ms-asf).freeze
BLURHASH_OPTIONS = {
x_comp: 4,
@@ -187,7 +187,7 @@ class MediaAttachment < ApplicationRecord
remotable_attachment :thumbnail, IMAGE_LIMIT, suppress_errors: true, download_on_assign: false
validates :account, presence: true
- validates :description, length: { maximum: MAX_DESCRIPTION_LENGTH }, if: :local?
+ validates :description, length: { maximum: MAX_DESCRIPTION_LENGTH }
validates :file, presence: true, if: :local?
validates :thumbnail, absence: true, if: -> { local? && !audio_or_video? }
@@ -260,7 +260,6 @@ class MediaAttachment < ApplicationRecord
after_commit :enqueue_processing, on: :create
after_commit :reset_parent_cache, on: :update
- before_create :prepare_description, unless: :local?
before_create :set_unknown_type
before_create :set_processing
@@ -308,10 +307,6 @@ class MediaAttachment < ApplicationRecord
self.type = :unknown if file.blank? && !type_changed?
end
- def prepare_description
- self.description = description.strip[0...MAX_DESCRIPTION_LENGTH] unless description.nil?
- end
-
def set_type_and_extension
self.type = begin
if VIDEO_MIME_TYPES.include?(file_content_type)
diff --git a/app/models/mute.rb b/app/models/mute.rb
index fe8b6f42c..578345ef6 100644
--- a/app/models/mute.rb
+++ b/app/models/mute.rb
@@ -6,7 +6,6 @@
# id :bigint(8) not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
-# hide_notifications :boolean default(TRUE), not null
# account_id :bigint(8) not null
# target_account_id :bigint(8) not null
# hide_notifications :boolean default(TRUE), not null
diff --git a/app/models/notification.rb b/app/models/notification.rb
index ba94b54d1..bbc63c1c0 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -37,6 +37,7 @@ class Notification < ApplicationRecord
poll
update
admin.sign_up
+ admin.report
).freeze
TARGET_STATUS_INCLUDES_BY_TYPE = {
@@ -46,6 +47,7 @@ class Notification < ApplicationRecord
favourite: [favourite: :status],
poll: [poll: :status],
update: :status,
+ 'admin.report': [report: :target_account],
}.freeze
belongs_to :account, optional: true
@@ -58,6 +60,7 @@ class Notification < ApplicationRecord
belongs_to :follow_request, foreign_key: 'activity_id', optional: true
belongs_to :favourite, foreign_key: 'activity_id', optional: true
belongs_to :poll, foreign_key: 'activity_id', optional: true
+ belongs_to :report, foreign_key: 'activity_id', optional: true
validates :type, inclusion: { in: TYPES }
@@ -146,7 +149,7 @@ class Notification < ApplicationRecord
return unless new_record?
case activity_type
- when 'Status', 'Follow', 'Favourite', 'FollowRequest', 'Poll'
+ when 'Status', 'Follow', 'Favourite', 'FollowRequest', 'Poll', 'Report'
self.from_account_id = activity&.account_id
when 'Mention'
self.from_account_id = activity&.status&.account_id
diff --git a/app/models/poll.rb b/app/models/poll.rb
index ba08309a1..1a326e452 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -39,13 +39,12 @@ class Poll < ApplicationRecord
before_validation :prepare_options, if: :local?
before_validation :prepare_votes_count
-
- after_initialize :prepare_cached_tallies
+ before_validation :prepare_cached_tallies
after_commit :reset_parent_cache, on: :update
def loaded_options
- options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? cached_tallies[key] : nil) }
+ options.map.with_index { |title, key| Option.new(self, key.to_s, title, show_totals_now? ? (cached_tallies[key] || 0) : nil) }
end
def possibly_stale?
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index 0d2c32c35..c49c51a1b 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -34,7 +34,7 @@
class PreviewCard < ApplicationRecord
include Attachmentable
- IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
+ IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
LIMIT = 1.megabytes
BLURHASH_OPTIONS = {
diff --git a/app/models/report.rb b/app/models/report.rb
index 6d4166540..2efb6d4a7 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -55,6 +55,8 @@ class Report < ApplicationRecord
before_validation :set_uri, only: :create
+ after_create_commit :trigger_webhooks
+
def object_type
:flag
end
@@ -143,4 +145,8 @@ class Report < ApplicationRecord
errors.add(:rule_ids, I18n.t('reports.errors.invalid_rules')) unless rules.size == rule_ids&.size
end
+
+ def trigger_webhooks
+ TriggerWebhookWorker.perform_async('report.created', 'Report', id)
+ end
end
diff --git a/app/models/status.rb b/app/models/status.rb
index b979252b3..3efa23ae2 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -37,6 +37,7 @@ class Status < ApplicationRecord
include Paginable
include Cacheable
include StatusThreadingConcern
+ include StatusSnapshotConcern
include RateLimitable
rate_limit by: :account, family: :statuses
@@ -61,8 +62,6 @@ class Status < ApplicationRecord
belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true
belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true
- has_many :edits, class_name: 'StatusEdit', inverse_of: :status, dependent: :destroy
-
has_many :favourites, inverse_of: :status, dependent: :destroy
has_many :bookmarks, inverse_of: :status, dependent: :destroy
has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy
@@ -151,16 +150,27 @@ class Status < ApplicationRecord
ids += favourites.where(account: Account.local).pluck(:account_id)
ids += reblogs.where(account: Account.local).pluck(:account_id)
ids += bookmarks.where(account: Account.local).pluck(:account_id)
+ ids += poll.votes.where(account: Account.local).pluck(:account_id) if poll.present?
else
ids += preloaded.mentions[id] || []
ids += preloaded.favourites[id] || []
ids += preloaded.reblogs[id] || []
ids += preloaded.bookmarks[id] || []
+ ids += preloaded.votes[id] || []
end
ids.uniq
end
+ def searchable_text
+ [
+ spoiler_text,
+ FormattingHelper.extract_status_plain_text(self),
+ preloadable_poll ? preloadable_poll.options.join("\n\n") : nil,
+ ordered_media_attachments.map(&:description).join("\n\n"),
+ ].compact.join("\n\n")
+ end
+
def reply?
!in_reply_to_id.nil? || attributes['reply']
end
@@ -217,25 +227,6 @@ class Status < ApplicationRecord
public_visibility? || unlisted_visibility?
end
- def snapshot!(account_id: nil, at_time: nil, rate_limit: true)
- edits.create!(
- text: text,
- spoiler_text: spoiler_text,
- sensitive: sensitive,
- ordered_media_attachment_ids: ordered_media_attachment_ids || media_attachments.pluck(:id),
- media_descriptions: ordered_media_attachments.map(&:description),
- poll_options: preloadable_poll&.options,
- account_id: account_id || self.account_id,
- content_type: content_type,
- created_at: at_time || edited_at,
- rate_limit: rate_limit
- )
- end
-
- def edited?
- edited_at.present?
- end
-
alias sign? distributable?
def with_media?
@@ -268,7 +259,7 @@ class Status < ApplicationRecord
media_attachments
else
map = media_attachments.index_by(&:id)
- ordered_media_attachment_ids.map { |media_attachment_id| map[media_attachment_id] }
+ ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] }
end
end
@@ -331,10 +322,6 @@ class Status < ApplicationRecord
visibilities.keys - %w(direct limited)
end
- def in_chosen_languages(account)
- where(language: nil).or where(language: account.chosen_languages)
- end
-
def as_direct_timeline(account, limit = 20, max_id = nil, since_id = nil, cache_ids = false)
# direct timeline is mix of direct message from_me and to_me.
# 2 queries are executed with pagination.
@@ -524,7 +511,7 @@ class Status < ApplicationRecord
end
def set_poll_id
- update_column(:poll_id, poll.id) unless poll.nil?
+ update_column(:poll_id, poll.id) if association(:poll).loaded? && poll.present?
end
def set_visibility
diff --git a/app/models/status_stat.rb b/app/models/status_stat.rb
index 024c467e7..437861d1c 100644
--- a/app/models/status_stat.rb
+++ b/app/models/status_stat.rb
@@ -17,6 +17,18 @@ class StatusStat < ApplicationRecord
after_commit :reset_parent_cache
+ def replies_count
+ [attributes['replies_count'], 0].max
+ end
+
+ def reblogs_count
+ [attributes['reblogs_count'], 0].max
+ end
+
+ def favourites_count
+ [attributes['favourites_count'], 0].max
+ end
+
private
def reset_parent_cache
diff --git a/app/models/trends.rb b/app/models/trends.rb
index 0be900b04..0fff66a9f 100644
--- a/app/models/trends.rb
+++ b/app/models/trends.rb
@@ -33,8 +33,8 @@ module Trends
statuses_requiring_review = statuses.request_review
User.staff.includes(:account).find_each do |user|
- links = user.allows_trending_tags_review_emails? ? links_requiring_review : []
- tags = user.allows_trending_links_review_emails? ? tags_requiring_review : []
+ links = user.allows_trending_links_review_emails? ? links_requiring_review : []
+ tags = user.allows_trending_tags_review_emails? ? tags_requiring_review : []
statuses = user.allows_trending_statuses_review_emails? ? statuses_requiring_review : []
next if links.empty? && tags.empty? && statuses.empty?
diff --git a/app/models/trends/base.rb b/app/models/trends/base.rb
index 7ed13228d..047111248 100644
--- a/app/models/trends/base.rb
+++ b/app/models/trends/base.rb
@@ -37,12 +37,12 @@ class Trends::Base
Trends::Query.new(key_prefix, klass)
end
- def score(id)
- redis.zscore("#{key_prefix}:all", id) || 0
+ def score(id, locale: nil)
+ redis.zscore([key_prefix, 'all', locale].compact.join(':'), id) || 0
end
- def rank(id)
- redis.zrevrank("#{key_prefix}:allowed", id)
+ def rank(id, locale: nil)
+ redis.zrevrank([key_prefix, 'allowed', locale].compact.join(':'), id)
end
def currently_trending_ids(allowed, limit)
@@ -64,33 +64,38 @@ class Trends::Base
redis.expire(used_key(at_time), 1.day.seconds)
end
- def trim_older_items
- redis.zremrangebyscore("#{key_prefix}:all", '-inf', '(1')
- redis.zremrangebyscore("#{key_prefix}:allowed", '-inf', '(1')
- end
-
def score_at_rank(rank)
redis.zrevrange("#{key_prefix}:allowed", 0, rank, with_scores: true).last&.last || 0
end
- # @param [Integer] id
- # @param [Float] score
- # @param [Hash] subsets
- def add_to_and_remove_from_subsets(id, score, subsets = {})
- subsets.each_key do |subset|
- key = [key_prefix, subset].compact.join(':')
+ def replace_items(suffix, items)
+ tmp_prefix = "#{key_prefix}:tmp:#{SecureRandom.alphanumeric(6)}#{suffix}"
+ allowed_items = filter_for_allowed_items(items)
+
+ redis.pipelined do |pipeline|
+ items.each { |item| pipeline.zadd("#{tmp_prefix}:all", item[:score], item[:item].id) }
+ allowed_items.each { |item| pipeline.zadd("#{tmp_prefix}:allowed", item[:score], item[:item].id) }
- if score.positive? && subsets[subset]
- redis.zadd(key, score, id)
- else
- redis.zrem(key, id)
- end
+ rename_set(pipeline, "#{tmp_prefix}:all", "#{key_prefix}:all#{suffix}", items)
+ rename_set(pipeline, "#{tmp_prefix}:allowed", "#{key_prefix}:allowed#{suffix}", allowed_items)
end
end
+ def filter_for_allowed_items(items)
+ raise NotImplementedError
+ end
+
private
def used_key(at_time)
"#{key_prefix}:used:#{at_time.beginning_of_day.to_i}"
end
+
+ def rename_set(pipeline, from_key, to_key, set_items)
+ if set_items.empty?
+ pipeline.del(to_key)
+ else
+ pipeline.rename(from_key, to_key)
+ end
+ end
end
diff --git a/app/models/trends/history.rb b/app/models/trends/history.rb
index 608e33792..74723e35c 100644
--- a/app/models/trends/history.rb
+++ b/app/models/trends/history.rb
@@ -11,11 +11,11 @@ class Trends::History
end
def uses
- redis.mget(*@days.map { |day| day.key_for(:uses) }).map(&:to_i).sum
+ with_redis { |redis| redis.mget(*@days.map { |day| day.key_for(:uses) }).map(&:to_i).sum }
end
def accounts
- redis.pfcount(*@days.map { |day| day.key_for(:accounts) })
+ with_redis { |redis| redis.pfcount(*@days.map { |day| day.key_for(:accounts) }) }
end
end
@@ -33,19 +33,21 @@ class Trends::History
attr_reader :day
def accounts
- redis.pfcount(key_for(:accounts))
+ with_redis { |redis| redis.pfcount(key_for(:accounts)) }
end
def uses
- redis.get(key_for(:uses))&.to_i || 0
+ with_redis { |redis| redis.get(key_for(:uses))&.to_i || 0 }
end
def add(account_id)
- redis.pipelined do
- redis.incrby(key_for(:uses), 1)
- redis.pfadd(key_for(:accounts), account_id)
- redis.expire(key_for(:uses), EXPIRE_AFTER)
- redis.expire(key_for(:accounts), EXPIRE_AFTER)
+ with_redis do |redis|
+ redis.pipelined do |pipeline|
+ pipeline.incrby(key_for(:uses), 1)
+ pipeline.pfadd(key_for(:accounts), account_id)
+ pipeline.expire(key_for(:uses), EXPIRE_AFTER)
+ pipeline.expire(key_for(:accounts), EXPIRE_AFTER)
+ end
end
end
diff --git a/app/models/trends/links.rb b/app/models/trends/links.rb
index 62308e706..604894cd6 100644
--- a/app/models/trends/links.rb
+++ b/app/models/trends/links.rb
@@ -8,14 +8,15 @@ class Trends::Links < Trends::Base
review_threshold: 3,
max_score_cooldown: 2.days.freeze,
max_score_halflife: 8.hours.freeze,
+ decay_threshold: 1,
}
def register(status, at_time = Time.now.utc)
- original_status = status.reblog? ? status.reblog : status
+ original_status = status.proper
- return unless original_status.public_visibility? && status.public_visibility? &&
- !original_status.account.silenced? && !status.account.silenced? &&
- !original_status.spoiler_text?
+ return unless (original_status.public_visibility? && status.public_visibility?) &&
+ !(original_status.account.silenced? || status.account.silenced?) &&
+ !(original_status.spoiler_text? || original_status.sensitive?)
original_status.preview_cards.each do |preview_card|
add(preview_card, status.account_id, at_time) if preview_card.appropriate_for_trends?
@@ -30,7 +31,6 @@ class Trends::Links < Trends::Base
def refresh(at_time = Time.now.utc)
preview_cards = PreviewCard.where(id: (recently_used_ids(at_time) + currently_trending_ids(false, -1)).uniq)
calculate_scores(preview_cards, at_time)
- trim_older_items
end
def request_review
@@ -62,6 +62,9 @@ class Trends::Links < Trends::Base
private
def calculate_scores(preview_cards, at_time)
+ global_items = []
+ locale_items = Hash.new { |h, key| h[key] = [] }
+
preview_cards.each do |preview_card|
expected = preview_card.history.get(at_time - 1.day).accounts.to_f
expected = 1.0 if expected.zero?
@@ -88,31 +91,23 @@ class Trends::Links < Trends::Base
decaying_score = max_score * (0.5**((at_time.to_f - max_time.to_f) / options[:max_score_halflife].to_f))
- add_to_and_remove_from_subsets(preview_card.id, decaying_score, {
- all: true,
- allowed: preview_card.trendable?,
- })
-
- next unless valid_locale?(preview_card.language)
+ next unless decaying_score >= options[:decay_threshold]
- add_to_and_remove_from_subsets(preview_card.id, decaying_score, {
- "all:#{preview_card.language}" => true,
- "allowed:#{preview_card.language}" => preview_card.trendable?,
- })
+ global_items << { score: decaying_score, item: preview_card }
+ locale_items[preview_card.language] << { score: decaying_score, item: preview_card } if valid_locale?(preview_card.language)
end
- # Clean up localized sets by calculating the intersection with the main
- # set. We do this instead of just deleting the localized sets to avoid
- # having moments where the API returns empty results
+ replace_items('', global_items)
- redis.pipelined do
- Trends.available_locales.each do |locale|
- redis.zinterstore("#{key_prefix}:all:#{locale}", ["#{key_prefix}:all:#{locale}", "#{key_prefix}:all"], aggregate: 'max')
- redis.zinterstore("#{key_prefix}:allowed:#{locale}", ["#{key_prefix}:allowed:#{locale}", "#{key_prefix}:all"], aggregate: 'max')
- end
+ Trends.available_locales.each do |locale|
+ replace_items(":#{locale}", locale_items[locale])
end
end
+ def filter_for_allowed_items(items)
+ items.select { |item| item[:item].trendable? }
+ end
+
def would_be_trending?(id)
score(id) > score_at_rank(options[:review_threshold] - 1)
end
diff --git a/app/models/trends/query.rb b/app/models/trends/query.rb
index 64a4c0c1f..cd5571bc6 100644
--- a/app/models/trends/query.rb
+++ b/app/models/trends/query.rb
@@ -14,8 +14,8 @@ class Trends::Query
@records = []
@loaded = false
@allowed = false
- @limit = -1
- @offset = 0
+ @limit = nil
+ @offset = nil
end
def allowed!
@@ -37,7 +37,7 @@ class Trends::Query
end
def offset!(value)
- @offset = value
+ @offset = value.to_i
self
end
@@ -46,7 +46,7 @@ class Trends::Query
end
def limit!(value)
- @limit = value
+ @limit = value.to_i
self
end
@@ -59,7 +59,7 @@ class Trends::Query
@records
end
- delegate :each, :empty?, :first, :last, to: :records
+ delegate :each, :empty?, :first, :last, :size, to: :records
def to_ary
records.dup
@@ -73,7 +73,10 @@ class Trends::Query
if tmp_ids.empty?
klass.none
else
- klass.joins("join unnest(array[#{tmp_ids.join(',')}]) with ordinality as x (id, ordering) on #{klass.table_name}.id = x.id").reorder('x.ordering')
+ scope = klass.joins("join unnest(array[#{tmp_ids.join(',')}]) with ordinality as x (id, ordering) on #{klass.table_name}.id = x.id").reorder('x.ordering')
+ scope = scope.offset(@offset) if @offset.present?
+ scope = scope.limit(@limit) if @limit.present?
+ scope
end
end
@@ -93,7 +96,7 @@ class Trends::Query
end
def ids
- redis.zrevrange(key, @offset, @limit.positive? ? @limit - 1 : @limit).map(&:to_i)
+ redis.zrevrange(key, 0, -1).map(&:to_i)
end
def perform_queries
diff --git a/app/models/trends/statuses.rb b/app/models/trends/statuses.rb
index e9c48a06b..1b9e9259a 100644
--- a/app/models/trends/statuses.rb
+++ b/app/models/trends/statuses.rb
@@ -7,6 +7,7 @@ class Trends::Statuses < Trends::Base
threshold: 5,
review_threshold: 3,
score_halflife: 2.hours.freeze,
+ decay_threshold: 0.3,
}
class Query < Trends::Query
@@ -22,30 +23,16 @@ class Trends::Statuses < Trends::Base
private
def apply_scopes(scope)
- scope.includes(:account)
- end
-
- def perform_queries
- return super if @account.nil?
-
- statuses = super
- account_ids = statuses.map(&:account_id)
- account_domains = statuses.map(&:account_domain)
-
- preloaded_relations = {
- blocking: Account.blocking_map(account_ids, @account.id),
- blocked_by: Account.blocked_by_map(account_ids, @account.id),
- muting: Account.muting_map(account_ids, @account.id),
- following: Account.following_map(account_ids, @account.id),
- domain_blocking_by_domain: Account.domain_blocking_map_by_domain(account_domains, @account.id),
- }
-
- statuses.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? }
+ if @account.nil?
+ scope
+ else
+ scope.not_excluded_by_account(@account).not_domain_blocked_by_account(@account)
+ end
end
end
def register(status, at_time = Time.now.utc)
- add(status.proper, status.account_id, at_time) if eligible?(status)
+ add(status.proper, status.account_id, at_time) if eligible?(status.proper)
end
def add(status, _account_id, at_time = Time.now.utc)
@@ -62,7 +49,6 @@ class Trends::Statuses < Trends::Base
def refresh(at_time = Time.now.utc)
statuses = Status.where(id: (recently_used_ids(at_time) + currently_trending_ids(false, -1)).uniq).includes(:account, :media_attachments)
calculate_scores(statuses, at_time)
- trim_older_items
end
def request_review
@@ -89,53 +75,47 @@ class Trends::Statuses < Trends::Base
private
def eligible?(status)
- original_status = status.proper
-
- original_status.public_visibility? &&
- original_status.account.discoverable? && !original_status.account.silenced? &&
- (original_status.spoiler_text.blank? || Setting.trending_status_cw) && !original_status.sensitive? && !original_status.reply?
+ status.public_visibility? && status.account.discoverable? && !status.account.silenced? && (status.spoiler_text.blank? || Setting.trending_status_cw) && !status.sensitive? && !status.reply?
end
def calculate_scores(statuses, at_time)
- redis.pipelined do
- statuses.each do |status|
- expected = 1.0
- observed = (status.reblogs_count + status.favourites_count).to_f
-
- score = begin
- if expected > observed || observed < options[:threshold]
- 0
- else
- ((observed - expected)**2) / expected
- end
+ global_items = []
+ locale_items = Hash.new { |h, key| h[key] = [] }
+
+ statuses.each do |status|
+ expected = 1.0
+ observed = (status.reblogs_count + status.favourites_count).to_f
+
+ score = begin
+ if expected > observed || observed < options[:threshold]
+ 0
+ else
+ ((observed - expected)**2) / expected
end
+ end
- decaying_score = score * (0.5**((at_time.to_f - status.created_at.to_f) / options[:score_halflife].to_f))
-
- add_to_and_remove_from_subsets(status.id, decaying_score, {
- all: true,
- allowed: status.trendable? && status.account.discoverable?,
- })
+ decaying_score = score * (0.5**((at_time.to_f - status.created_at.to_f) / options[:score_halflife].to_f))
- next unless valid_locale?(status.language)
+ next unless decaying_score >= options[:decay_threshold]
- add_to_and_remove_from_subsets(status.id, decaying_score, {
- "all:#{status.language}" => true,
- "allowed:#{status.language}" => status.trendable? && status.account.discoverable?,
- })
- end
+ global_items << { score: decaying_score, item: status }
+ locale_items[status.language] << { account_id: status.account_id, score: decaying_score, item: status } if valid_locale?(status.language)
+ end
- # Clean up localized sets by calculating the intersection with the main
- # set. We do this instead of just deleting the localized sets to avoid
- # having moments where the API returns empty results
+ replace_items('', global_items)
- Trends.available_locales.each do |locale|
- redis.zinterstore("#{key_prefix}:all:#{locale}", ["#{key_prefix}:all:#{locale}", "#{key_prefix}:all"], aggregate: 'max')
- redis.zinterstore("#{key_prefix}:allowed:#{locale}", ["#{key_prefix}:allowed:#{locale}", "#{key_prefix}:all"], aggregate: 'max')
- end
+ Trends.available_locales.each do |locale|
+ replace_items(":#{locale}", locale_items[locale])
end
end
+ def filter_for_allowed_items(items)
+ # Show only one status per account, pick the one with the highest score
+ # that's also eligible to trend
+
+ items.group_by { |item| item[:account_id] }.values.filter_map { |account_items| account_items.select { |item| item[:item].trendable? && item[:item].account.discoverable? }.max_by { |item| item[:score] } }
+ end
+
def would_be_trending?(id)
score(id) > score_at_rank(options[:review_threshold] - 1)
end
diff --git a/app/models/trends/tags.rb b/app/models/trends/tags.rb
index 3caa58815..19ade52ba 100644
--- a/app/models/trends/tags.rb
+++ b/app/models/trends/tags.rb
@@ -8,6 +8,7 @@ class Trends::Tags < Trends::Base
review_threshold: 3,
max_score_cooldown: 2.days.freeze,
max_score_halflife: 4.hours.freeze,
+ decay_threshold: 1,
}
def register(status, at_time = Time.now.utc)
@@ -26,7 +27,6 @@ class Trends::Tags < Trends::Base
def refresh(at_time = Time.now.utc)
tags = Tag.where(id: (recently_used_ids(at_time) + currently_trending_ids(false, -1)).uniq)
calculate_scores(tags, at_time)
- trim_older_items
end
def request_review
@@ -53,6 +53,8 @@ class Trends::Tags < Trends::Base
private
def calculate_scores(tags, at_time)
+ items = []
+
tags.each do |tag|
expected = tag.history.get(at_time - 1.day).accounts.to_f
expected = 1.0 if expected.zero?
@@ -79,11 +81,16 @@ class Trends::Tags < Trends::Base
decaying_score = max_score * (0.5**((at_time.to_f - max_time.to_f) / options[:max_score_halflife].to_f))
- add_to_and_remove_from_subsets(tag.id, decaying_score, {
- all: true,
- allowed: tag.trendable?,
- })
+ next unless decaying_score >= options[:decay_threshold]
+
+ items << { score: decaying_score, item: tag }
end
+
+ replace_items('', items)
+ end
+
+ def filter_for_allowed_items(items)
+ items.select { |item| item[:item].trendable? }
end
def would_be_trending?(id)
diff --git a/app/models/user.rb b/app/models/user.rb
index f657f1b27..6d2d94625 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -26,7 +26,6 @@
# otp_required_for_login :boolean default(FALSE), not null
# last_emailed_at :datetime
# otp_backup_codes :string is an Array
-# filtered_languages :string default([]), not null, is an Array
# account_id :bigint(8) not null
# disabled :boolean default(FALSE), not null
# moderator :boolean default(FALSE), not null
@@ -38,7 +37,6 @@
# sign_in_token_sent_at :datetime
# webauthn_id :string
# sign_up_ip :inet
-# skip_sign_in_token :boolean
#
class User < ApplicationRecord
@@ -47,10 +45,14 @@ class User < ApplicationRecord
remember_token
current_sign_in_ip
last_sign_in_ip
+ skip_sign_in_token
+ filtered_languages
)
include Settings::Extend
include UserRoles
+ include Redisable
+ include LanguagesHelper
# The home and list feeds will be stored in Redis for this amount
# of time, and status fan-out to followers will include only people
@@ -91,11 +93,11 @@ class User < ApplicationRecord
validates :invite_request, presence: true, on: :create, if: :invite_text_required?
validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale?
- validates_with BlacklistedEmailValidator, on: :create
+ validates_with BlacklistedEmailValidator, if: -> { !confirmed? }
validates_with EmailMxValidator, if: :validate_email_dns?
validates :agreement, acceptance: { allow_nil: false, accept: [true, 'true', '1'] }, on: :create
- # Those are honeypot/antispam fields
+ # Honeypot/anti-spam fields
attr_accessor :registration_form_time, :website, :confirm_password
validates_with RegistrationFormTimeValidator, on: :create
@@ -117,6 +119,7 @@ class User < ApplicationRecord
before_validation :sanitize_languages
before_create :set_approved
after_commit :send_pending_devise_notifications
+ after_create_commit :trigger_webhooks
# This avoids a deprecation warning from Rails 5.1
# It seems possible that a future release of devise-two-factor will
@@ -129,10 +132,10 @@ class User < ApplicationRecord
:reduce_motion, :system_font_ui, :noindex, :flavour, :skin, :display_media, :hide_followers_count,
:expand_spoilers, :default_language, :aggregate_reblogs, :show_application,
:advanced_layout, :use_blurhash, :use_pending_items, :trends, :crop_images,
- :disable_swiping, :default_content_type, :system_emoji_font,
+ :disable_swiping, :always_send_emails, :default_content_type, :system_emoji_font,
to: :settings, prefix: :setting, allow_nil: false
- attr_reader :invite_code, :sign_in_token_attempt
+ attr_reader :invite_code
attr_writer :external, :bypass_invite_request_check
def confirmed?
@@ -179,7 +182,9 @@ class User < ApplicationRecord
end
def update_sign_in!(new_sign_in: false)
- old_current, new_current = current_sign_in_at, Time.now.utc
+ old_current = current_sign_in_at
+ new_current = Time.now.utc
+
self.last_sign_in_at = old_current || new_current
self.current_sign_in_at = new_current
@@ -200,16 +205,16 @@ class User < ApplicationRecord
!account.memorial?
end
- def suspicious_sign_in?(ip)
- !otp_required_for_login? && !skip_sign_in_token? && current_sign_in_at.present? && !ips.where(ip: ip).exists?
- end
-
def functional?
confirmed? && approved? && !disabled? && !account.suspended? && !account.memorial?
end
+ def unconfirmed?
+ !confirmed?
+ end
+
def unconfirmed_or_pending?
- !(confirmed? && approved?)
+ unconfirmed? || pending?
end
def inactive_message
@@ -246,7 +251,7 @@ class User < ApplicationRecord
end
def preferred_posting_language
- settings.default_language || locale
+ valid_locale_cascade(settings.default_language, locale)
end
def setting_default_privacy
@@ -372,15 +377,6 @@ class User < ApplicationRecord
setting_display_media == 'hide_all'
end
- def sign_in_token_expired?
- sign_in_token_sent_at.nil? || sign_in_token_sent_at < 5.minutes.ago
- end
-
- def generate_sign_in_token
- self.sign_in_token = Devise.friendly_token(6)
- self.sign_in_token_sent_at = Time.now.utc
- end
-
protected
def send_devise_notification(notification, *args, **kwargs)
@@ -472,7 +468,7 @@ class User < ApplicationRecord
end
def regenerate_feed!
- RegenerationWorker.perform_async(account_id) if Redis.current.set("account:#{account_id}:regeneration", true, nx: true, ex: 1.day.seconds)
+ RegenerationWorker.perform_async(account_id) if redis.set("account:#{account_id}:regeneration", true, nx: true, ex: 1.day.seconds)
end
def needs_feed_update?
@@ -486,4 +482,8 @@ class User < ApplicationRecord
def invite_text_required?
Setting.require_invite_text && !invited? && !external? && !bypass_invite_request_check?
end
+
+ def trigger_webhooks
+ TriggerWebhookWorker.perform_async('account.created', 'Account', account_id)
+ end
end
diff --git a/app/models/webhook.rb b/app/models/webhook.rb
new file mode 100644
index 000000000..431edd75d
--- /dev/null
+++ b/app/models/webhook.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: webhooks
+#
+# id :bigint(8) not null, primary key
+# url :string not null
+# events :string default([]), not null, is an Array
+# secret :string default(""), not null
+# enabled :boolean default(TRUE), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+
+class Webhook < ApplicationRecord
+ EVENTS = %w(
+ account.created
+ report.created
+ ).freeze
+
+ scope :enabled, -> { where(enabled: true) }
+
+ validates :url, presence: true, url: true
+ validates :secret, presence: true, length: { minimum: 12 }
+ validates :events, presence: true
+
+ validate :validate_events
+
+ before_validation :strip_events
+ before_validation :generate_secret
+
+ def rotate_secret!
+ update!(secret: SecureRandom.hex(20))
+ end
+
+ def enable!
+ update!(enabled: true)
+ end
+
+ def disable!
+ update!(enabled: false)
+ end
+
+ private
+
+ def validate_events
+ errors.add(:events, :invalid) if events.any? { |e| !EVENTS.include?(e) }
+ end
+
+ def strip_events
+ self.events = events.map { |str| str.strip.presence }.compact if events.present?
+ end
+
+ def generate_secret
+ self.secret = SecureRandom.hex(20) if secret.blank?
+ end
+end
diff --git a/app/policies/domain_allow_policy.rb b/app/policies/domain_allow_policy.rb
index 5030453bb..7a5b5d780 100644
--- a/app/policies/domain_allow_policy.rb
+++ b/app/policies/domain_allow_policy.rb
@@ -1,6 +1,14 @@
# frozen_string_literal: true
class DomainAllowPolicy < ApplicationPolicy
+ def index?
+ admin?
+ end
+
+ def show?
+ admin?
+ end
+
def create?
admin?
end
diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb
index d3a3b36c0..75d95a90b 100644
--- a/app/policies/status_policy.rb
+++ b/app/policies/status_policy.rb
@@ -97,7 +97,7 @@ class StatusPolicy < ApplicationPolicy
def author
record.account
end
-
+
def local_only?
record.local_only?
end
diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb
index 92e2c4f4b..140905e1f 100644
--- a/app/policies/user_policy.rb
+++ b/app/policies/user_policy.rb
@@ -13,14 +13,6 @@ class UserPolicy < ApplicationPolicy
admin? && !record.staff?
end
- def disable_sign_in_token_auth?
- staff?
- end
-
- def enable_sign_in_token_auth?
- staff?
- end
-
def confirm?
staff? && !record.confirmed?
end
diff --git a/app/policies/webhook_policy.rb b/app/policies/webhook_policy.rb
new file mode 100644
index 000000000..2c55703a1
--- /dev/null
+++ b/app/policies/webhook_policy.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class WebhookPolicy < ApplicationPolicy
+ def index?
+ admin?
+ end
+
+ def create?
+ admin?
+ end
+
+ def show?
+ admin?
+ end
+
+ def update?
+ admin?
+ end
+
+ def enable?
+ admin?
+ end
+
+ def disable?
+ admin?
+ end
+
+ def rotate_secret?
+ admin?
+ end
+
+ def destroy?
+ admin?
+ end
+end
diff --git a/app/presenters/filter_result_presenter.rb b/app/presenters/filter_result_presenter.rb
new file mode 100644
index 000000000..677225f5e
--- /dev/null
+++ b/app/presenters/filter_result_presenter.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class FilterResultPresenter < ActiveModelSerializers::Model
+ attributes :filter, :keyword_matches
+end
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index a0f1ebd0a..3e85faa92 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -44,15 +44,6 @@ class InstancePresenter
Mastodon::Version
end
- def commit_hash
- current_release_file = Pathname.new('CURRENT_RELEASE').expand_path
- if current_release_file.file?
- IO.read(current_release_file).strip!
- else
- ''
- end
- end
-
def source_url
Mastodon::Version.source_url
end
diff --git a/app/presenters/status_relationships_presenter.rb b/app/presenters/status_relationships_presenter.rb
index 4163bb098..d7ffb1954 100644
--- a/app/presenters/status_relationships_presenter.rb
+++ b/app/presenters/status_relationships_presenter.rb
@@ -2,7 +2,7 @@
class StatusRelationshipsPresenter
attr_reader :reblogs_map, :favourites_map, :mutes_map, :pins_map,
- :bookmarks_map
+ :bookmarks_map, :filters_map
def initialize(statuses, current_account_id = nil, **options)
if current_account_id.nil?
@@ -11,12 +11,14 @@ class StatusRelationshipsPresenter
@bookmarks_map = {}
@mutes_map = {}
@pins_map = {}
+ @filters_map = {}
else
statuses = statuses.compact
status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id] }.uniq.compact
conversation_ids = statuses.filter_map(&:conversation_id).uniq
pinnable_status_ids = statuses.map(&:proper).filter_map { |s| s.id if s.account_id == current_account_id && %w(public unlisted private).include?(s.visibility) }
+ @filters_map = build_filters_map(statuses, current_account_id).merge(options[:filters_map] || {})
@reblogs_map = Status.reblogs_map(status_ids, current_account_id).merge(options[:reblogs_map] || {})
@favourites_map = Status.favourites_map(status_ids, current_account_id).merge(options[:favourites_map] || {})
@bookmarks_map = Status.bookmarks_map(status_ids, current_account_id).merge(options[:bookmarks_map] || {})
@@ -24,4 +26,24 @@ class StatusRelationshipsPresenter
@pins_map = Status.pins_map(pinnable_status_ids, current_account_id).merge(options[:pins_map] || {})
end
end
+
+ private
+
+ def build_filters_map(statuses, current_account_id)
+ active_filters = CustomFilter.cached_filters_for(current_account_id)
+
+ @filters_map = statuses.each_with_object({}) do |status, h|
+ filter_matches = active_filters.filter_map do |filter, rules|
+ next if rules[:keywords].blank?
+
+ match = rules[:keywords].match(status.proper.searchable_text)
+ FilterResultPresenter.new(filter: filter, keyword_matches: [match.to_s]) unless match.nil?
+ end
+
+ unless filter_matches.empty?
+ h[status.id] = filter_matches
+ h[status.reblog_of_id] = filter_matches if status.reblog?
+ end
+ end
+ end
end
diff --git a/app/presenters/webhooks/event_presenter.rb b/app/presenters/webhooks/event_presenter.rb
new file mode 100644
index 000000000..dac14a3f0
--- /dev/null
+++ b/app/presenters/webhooks/event_presenter.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class Webhooks::EventPresenter < ActiveModelSerializers::Model
+ attributes :type, :created_at, :object
+
+ def initialize(type, object)
+ super()
+
+ @type = type
+ @created_at = Time.now.utc
+ @object = object
+ end
+end
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index 48707aa16..e6dd8040e 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -2,6 +2,7 @@
class ActivityPub::ActorSerializer < ActivityPub::Serializer
include RoutingHelper
+ include FormattingHelper
context :security
@@ -102,7 +103,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end
def summary
- object.suspended? ? '' : Formatter.instance.simplified_format(object)
+ object.suspended? ? '' : account_bio_format(object)
end
def icon
@@ -185,6 +186,8 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end
class Account::FieldSerializer < ActivityPub::Serializer
+ include FormattingHelper
+
attributes :type, :name, :value
def type
@@ -192,7 +195,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
end
def value
- Formatter.instance.format_field(object.account, object.value)
+ account_field_value_format(object)
end
end
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index 05f2ee14f..ca067ed9b 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class ActivityPub::NoteSerializer < ActivityPub::Serializer
+ include FormattingHelper
+
context_extensions :atom_uri, :conversation, :sensitive, :voters_count, :direct_message
attributes :id, :type, :summary,
@@ -50,11 +52,11 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
end
def content
- Formatter.instance.format(object)
+ status_content_format(object)
end
def content_map
- { object.language => Formatter.instance.format(object) }
+ { object.language => content }
end
def replies
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index a05164641..5eab02dbc 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -3,7 +3,8 @@
class InitialStateSerializer < ActiveModel::Serializer
attributes :meta, :compose, :accounts,
:media_attachments, :settings,
- :max_toot_chars, :poll_limits
+ :max_toot_chars, :poll_limits,
+ :languages
has_one :push_subscription, serializer: REST::WebPushSubscriptionSerializer
@@ -76,6 +77,7 @@ class InitialStateSerializer < ActiveModel::Serializer
store[:me] = object.current_account.id.to_s
store[:default_privacy] = object.visibility || object.current_account.user.setting_default_privacy
store[:default_sensitive] = object.current_account.user.setting_default_sensitive
+ store[:default_language] = object.current_account.user.preferred_posting_language
end
store[:text] = object.text if object.text
@@ -94,6 +96,10 @@ class InitialStateSerializer < ActiveModel::Serializer
{ accept_content_types: MediaAttachment.supported_file_extensions + MediaAttachment.supported_mime_types }
end
+ def languages
+ LanguagesHelper::SUPPORTED_LOCALES.map { |(key, value)| [key, value[0], value[1]] }
+ end
+
private
def instance_presenter
diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index 4786aa760..9827323a8 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -4,7 +4,19 @@ class ManifestSerializer < ActiveModel::Serializer
include RoutingHelper
include ActionView::Helpers::TextHelper
- attributes :name, :short_name, :description,
+ ICON_SIZES = %w(
+ 36
+ 48
+ 72
+ 96
+ 144
+ 192
+ 256
+ 384
+ 512
+ ).freeze
+
+ attributes :name, :short_name,
:icons, :theme_color, :background_color,
:display, :start_url, :scope,
:share_target, :shortcuts
@@ -17,22 +29,18 @@ class ManifestSerializer < ActiveModel::Serializer
object.site_title
end
- def description
- strip_tags(object.site_short_description.presence || I18n.t('about.about_mastodon_html'))
- end
-
def icons
- [
+ ICON_SIZES.map do |size|
{
- src: '/android-chrome-192x192.png',
- sizes: '192x192',
+ src: full_pack_url("media/icons/android-chrome-#{size}x#{size}.png"),
+ sizes: "#{size}x#{size}",
type: 'image/png',
- },
- ]
+ }
+ end
end
def theme_color
- '#282c37'
+ '#6364FF'
end
def background_color
@@ -44,7 +52,7 @@ class ManifestSerializer < ActiveModel::Serializer
end
def start_url
- '/web/timelines/home'
+ '/web/home'
end
def scope
@@ -68,37 +76,12 @@ class ManifestSerializer < ActiveModel::Serializer
def shortcuts
[
{
- name: 'New toot',
- url: '/web/statuses/new',
- icons: [
- {
- src: '/shortcuts/new-status.png',
- type: 'image/png',
- sizes: '192x192',
- },
- ],
+ name: 'Compose new post',
+ url: '/web/publish',
},
{
name: 'Notifications',
url: '/web/notifications',
- icons: [
- {
- src: '/shortcuts/notifications.png',
- type: 'image/png',
- sizes: '192x192',
- },
- ],
- },
- {
- name: 'Direct messages',
- url: '/web/timelines/direct',
- icons: [
- {
- src: '/shortcuts/direct.png',
- type: 'image/png',
- sizes: '192x192',
- },
- ],
},
]
end
diff --git a/app/serializers/nodeinfo/serializer.rb b/app/serializers/nodeinfo/serializer.rb
index 7ff8aabec..afae7f00a 100644
--- a/app/serializers/nodeinfo/serializer.rb
+++ b/app/serializers/nodeinfo/serializer.rb
@@ -3,7 +3,7 @@
class NodeInfo::Serializer < ActiveModel::Serializer
include RoutingHelper
- attributes :version, :software, :protocols, :usage, :open_registrations
+ attributes :version, :software, :protocols, :services, :usage, :open_registrations, :metadata
def version
'2.0'
@@ -37,6 +37,10 @@ class NodeInfo::Serializer < ActiveModel::Serializer
Setting.registrations_mode != 'none' && !Rails.configuration.x.single_user_mode
end
+ def metadata
+ []
+ end
+
private
def instance_presenter
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index 36886181f..e644a3f91 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -2,6 +2,7 @@
class REST::AccountSerializer < ActiveModel::Serializer
include RoutingHelper
+ include FormattingHelper
attributes :id, :username, :acct, :display_name, :locked, :bot, :discoverable, :group, :created_at,
:note, :url, :avatar, :avatar_static, :header, :header_static,
@@ -12,12 +13,15 @@ class REST::AccountSerializer < ActiveModel::Serializer
has_many :emojis, serializer: REST::CustomEmojiSerializer
attribute :suspended, if: :suspended?
+ attribute :silenced, key: :limited, if: :silenced?
class FieldSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
attributes :name, :value, :verified_at
def value
- Formatter.instance.format_field(object.account, object.value)
+ account_field_value_format(object)
end
end
@@ -32,7 +36,7 @@ class REST::AccountSerializer < ActiveModel::Serializer
end
def note
- object.suspended? ? '' : Formatter.instance.simplified_format(object)
+ object.suspended? ? '' : account_bio_format(object)
end
def url
@@ -99,7 +103,11 @@ class REST::AccountSerializer < ActiveModel::Serializer
object.suspended?
end
- delegate :suspended?, to: :object
+ def silenced
+ object.silenced?
+ end
+
+ delegate :suspended?, :silenced?, to: :object
def moved_and_not_nested?
object.moved? && object.moved_to_account.moved_to_account_id.nil?
diff --git a/app/serializers/rest/admin/domain_allow_serializer.rb b/app/serializers/rest/admin/domain_allow_serializer.rb
new file mode 100644
index 000000000..ebdf33815
--- /dev/null
+++ b/app/serializers/rest/admin/domain_allow_serializer.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class REST::Admin::DomainAllowSerializer < ActiveModel::Serializer
+ attributes :id, :domain, :created_at
+
+ def id
+ object.id.to_s
+ end
+end
diff --git a/app/serializers/rest/admin/domain_block_serializer.rb b/app/serializers/rest/admin/domain_block_serializer.rb
new file mode 100644
index 000000000..b955d008a
--- /dev/null
+++ b/app/serializers/rest/admin/domain_block_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class REST::Admin::DomainBlockSerializer < ActiveModel::Serializer
+ attributes :id, :domain, :created_at, :severity,
+ :reject_media, :reject_reports,
+ :private_comment, :public_comment, :obfuscate
+
+ def id
+ object.id.to_s
+ end
+end
diff --git a/app/serializers/rest/admin/existing_domain_block_error_serializer.rb b/app/serializers/rest/admin/existing_domain_block_error_serializer.rb
new file mode 100644
index 000000000..629566dad
--- /dev/null
+++ b/app/serializers/rest/admin/existing_domain_block_error_serializer.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class REST::Admin::ExistingDomainBlockErrorSerializer < ActiveModel::Serializer
+ attributes :error
+
+ has_one :existing_domain_block, serializer: REST::Admin::DomainBlockSerializer
+
+ def error
+ I18n.t('admin.domain_blocks.existing_domain_block', name: existing_domain_block.domain)
+ end
+
+ def existing_domain_block
+ object
+ end
+end
diff --git a/app/serializers/rest/admin/report_serializer.rb b/app/serializers/rest/admin/report_serializer.rb
index 74bc0c520..44b4726e4 100644
--- a/app/serializers/rest/admin/report_serializer.rb
+++ b/app/serializers/rest/admin/report_serializer.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
class REST::Admin::ReportSerializer < ActiveModel::Serializer
- attributes :id, :action_taken, :category, :comment, :created_at, :updated_at
+ attributes :id, :action_taken, :action_taken_at, :category, :comment,
+ :forwarded, :created_at, :updated_at
has_one :account, serializer: REST::Admin::AccountSerializer
has_one :target_account, serializer: REST::Admin::AccountSerializer
diff --git a/app/serializers/rest/admin/webhook_event_serializer.rb b/app/serializers/rest/admin/webhook_event_serializer.rb
new file mode 100644
index 000000000..fe0ac23f9
--- /dev/null
+++ b/app/serializers/rest/admin/webhook_event_serializer.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class REST::Admin::WebhookEventSerializer < ActiveModel::Serializer
+ def self.serializer_for(model, options)
+ case model.class.name
+ when 'Account'
+ REST::Admin::AccountSerializer
+ when 'Report'
+ REST::Admin::ReportSerializer
+ else
+ super
+ end
+ end
+
+ attributes :event, :created_at
+
+ has_one :virtual_object, key: :object
+
+ def virtual_object
+ object.object
+ end
+
+ def event
+ object.type
+ end
+end
diff --git a/app/serializers/rest/announcement_serializer.rb b/app/serializers/rest/announcement_serializer.rb
index 9343b97d2..23b2fa514 100644
--- a/app/serializers/rest/announcement_serializer.rb
+++ b/app/serializers/rest/announcement_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class REST::AnnouncementSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
attributes :id, :content, :starts_at, :ends_at, :all_day,
:published_at, :updated_at
@@ -25,7 +27,7 @@ class REST::AnnouncementSerializer < ActiveModel::Serializer
end
def content
- Formatter.instance.linkify(object.text)
+ linkify(object.text)
end
def reactions
diff --git a/app/serializers/rest/filter_keyword_serializer.rb b/app/serializers/rest/filter_keyword_serializer.rb
new file mode 100644
index 000000000..dd2ebac6e
--- /dev/null
+++ b/app/serializers/rest/filter_keyword_serializer.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class REST::FilterKeywordSerializer < ActiveModel::Serializer
+ attributes :id, :keyword, :whole_word
+
+ def id
+ object.id.to_s
+ end
+end
diff --git a/app/serializers/rest/filter_result_serializer.rb b/app/serializers/rest/filter_result_serializer.rb
new file mode 100644
index 000000000..0ef4db79a
--- /dev/null
+++ b/app/serializers/rest/filter_result_serializer.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+class REST::FilterResultSerializer < ActiveModel::Serializer
+ belongs_to :filter, serializer: REST::FilterSerializer
+ has_many :keyword_matches
+end
diff --git a/app/serializers/rest/filter_serializer.rb b/app/serializers/rest/filter_serializer.rb
index 57205630b..98d7edb17 100644
--- a/app/serializers/rest/filter_serializer.rb
+++ b/app/serializers/rest/filter_serializer.rb
@@ -1,10 +1,14 @@
# frozen_string_literal: true
class REST::FilterSerializer < ActiveModel::Serializer
- attributes :id, :phrase, :context, :whole_word, :expires_at,
- :irreversible
+ attributes :id, :title, :context, :expires_at, :filter_action
+ has_many :keywords, serializer: REST::FilterKeywordSerializer, if: :rules_requested?
def id
object.id.to_s
end
+
+ def rules_requested?
+ instance_options[:rules_requested]
+ end
end
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index 48bbb55c8..2c8cd7734 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -39,7 +39,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
end
def thumbnail
- instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url) : full_pack_url('media/images/preview.jpg')
+ instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url) : full_pack_url('media/images/preview.png')
end
def max_toot_chars
diff --git a/app/serializers/rest/notification_serializer.rb b/app/serializers/rest/notification_serializer.rb
index 69b81f6de..137fc53dd 100644
--- a/app/serializers/rest/notification_serializer.rb
+++ b/app/serializers/rest/notification_serializer.rb
@@ -5,6 +5,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer
belongs_to :from_account, key: :account, serializer: REST::AccountSerializer
belongs_to :target_status, key: :status, if: :status_type?, serializer: REST::StatusSerializer
+ belongs_to :report, if: :report_type?, serializer: REST::ReportSerializer
def id
object.id.to_s
@@ -13,4 +14,8 @@ class REST::NotificationSerializer < ActiveModel::Serializer
def status_type?
[:favourite, :reblog, :status, :mention, :poll, :update].include?(object.type)
end
+
+ def report_type?
+ object.type == :'admin.report'
+ end
end
diff --git a/app/serializers/rest/preferences_serializer.rb b/app/serializers/rest/preferences_serializer.rb
index 119f0e06d..874bd990d 100644
--- a/app/serializers/rest/preferences_serializer.rb
+++ b/app/serializers/rest/preferences_serializer.rb
@@ -17,7 +17,7 @@ class REST::PreferencesSerializer < ActiveModel::Serializer
end
def posting_default_language
- object.user.setting_default_language.presence
+ object.user.preferred_posting_language
end
def reading_default_sensitive_media
diff --git a/app/serializers/rest/report_serializer.rb b/app/serializers/rest/report_serializer.rb
index ecb88d653..de68dfc6d 100644
--- a/app/serializers/rest/report_serializer.rb
+++ b/app/serializers/rest/report_serializer.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
class REST::ReportSerializer < ActiveModel::Serializer
- attributes :id, :action_taken
+ attributes :id, :action_taken, :action_taken_at, :category, :comment,
+ :forwarded, :created_at, :status_ids, :rule_ids
+
+ has_one :target_account, serializer: REST::AccountSerializer
def id
object.id.to_s
diff --git a/app/serializers/rest/status_edit_serializer.rb b/app/serializers/rest/status_edit_serializer.rb
index 05ccd5e94..f7a48797d 100644
--- a/app/serializers/rest/status_edit_serializer.rb
+++ b/app/serializers/rest/status_edit_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class REST::StatusEditSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
has_one :account, serializer: REST::AccountSerializer
attributes :content, :spoiler_text, :sensitive, :created_at
@@ -11,7 +13,7 @@ class REST::StatusEditSerializer < ActiveModel::Serializer
attribute :poll, if: -> { object.poll_options.present? }
def content
- Formatter.instance.format(object)
+ status_content_format(object)
end
def poll
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index 0a00ed77e..659c45b83 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class REST::StatusSerializer < ActiveModel::Serializer
+ include FormattingHelper
+
attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
:sensitive, :spoiler_text, :visibility, :language,
:uri, :url, :replies_count, :reblogs_count,
@@ -12,6 +14,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
attribute :bookmarked, if: :current_user?
attribute :pinned, if: :pinnable?
attribute :local_only if :local?
+ has_many :filtered, serializer: REST::FilterResultSerializer, if: :current_user?
attribute :content, unless: :source_requested?
attribute :text, if: :source_requested?
@@ -73,7 +76,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
end
def content
- Formatter.instance.format(object)
+ status_content_format(object)
end
def url
@@ -120,6 +123,14 @@ class REST::StatusSerializer < ActiveModel::Serializer
end
end
+ def filtered
+ if instance_options && instance_options[:relationships]
+ instance_options[:relationships].filters_map[object.id] || []
+ else
+ current_user.account.status_matches_filters(object)
+ end
+ end
+
def pinnable?
current_user? &&
current_user.account_id == object.account_id &&
@@ -137,6 +148,10 @@ class REST::StatusSerializer < ActiveModel::Serializer
class ApplicationSerializer < ActiveModel::Serializer
attributes :name, :website
+
+ def website
+ object.website.presence
+ end
end
class MentionSerializer < ActiveModel::Serializer
diff --git a/app/serializers/rest/v1/filter_serializer.rb b/app/serializers/rest/v1/filter_serializer.rb
new file mode 100644
index 000000000..455f17efd
--- /dev/null
+++ b/app/serializers/rest/v1/filter_serializer.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class REST::V1::FilterSerializer < ActiveModel::Serializer
+ attributes :id, :phrase, :context, :whole_word, :expires_at,
+ :irreversible
+
+ delegate :context, :expires_at, to: :custom_filter
+
+ def id
+ object.id.to_s
+ end
+
+ def phrase
+ object.keyword
+ end
+
+ def irreversible
+ custom_filter.irreversible?
+ end
+
+ private
+
+ def custom_filter
+ object.custom_filter
+ end
+end
diff --git a/app/serializers/rss/account_serializer.rb b/app/serializers/rss/account_serializer.rb
deleted file mode 100644
index 81e24af0d..000000000
--- a/app/serializers/rss/account_serializer.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class RSS::AccountSerializer < RSS::Serializer
- include ActionView::Helpers::NumberHelper
- include AccountsHelper
- include RoutingHelper
-
- def render(account, statuses, tag)
- builder = RSSBuilder.new
-
- builder.title("#{display_name(account)} (@#{account.local_username_and_domain})")
- .description(account_description(account))
- .link(tag.present? ? short_account_tag_url(account, tag) : short_account_url(account))
- .logo(full_pack_url('media/images/logo.svg'))
- .accent_color('2b90d9')
-
- builder.image(full_asset_url(account.avatar.url(:original))) if account.avatar?
- builder.cover(full_asset_url(account.header.url(:original))) if account.header?
-
- render_statuses(builder, statuses)
-
- builder.to_xml
- end
-
- def self.render(account, statuses, tag)
- new.render(account, statuses, tag)
- end
-end
diff --git a/app/serializers/rss/tag_serializer.rb b/app/serializers/rss/tag_serializer.rb
deleted file mode 100644
index e549ac367..000000000
--- a/app/serializers/rss/tag_serializer.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class RSS::TagSerializer < RSS::Serializer
- include ActionView::Helpers::NumberHelper
- include ActionView::Helpers::SanitizeHelper
- include RoutingHelper
-
- def render(tag, statuses)
- builder = RSSBuilder.new
-
- builder.title("##{tag.name}")
- .description(strip_tags(I18n.t('about.about_hashtag_html', hashtag: tag.name)))
- .link(tag_url(tag))
- .logo(full_pack_url('media/images/logo.svg'))
- .accent_color('2b90d9')
-
- render_statuses(builder, statuses)
-
- builder.to_xml
- end
-
- def self.render(tag, statuses)
- new.render(tag, statuses)
- end
-end
diff --git a/app/serializers/web/notification_serializer.rb b/app/serializers/web/notification_serializer.rb
index ee83ec8b2..c5a908b19 100644
--- a/app/serializers/web/notification_serializer.rb
+++ b/app/serializers/web/notification_serializer.rb
@@ -34,6 +34,6 @@ class Web::NotificationSerializer < ActiveModel::Serializer
def body
str = strip_tags(object.target_status&.spoiler_text&.presence || object.target_status&.text || object.from_account.note)
- truncate(HTMLEntities.new.decode(str.to_str), length: 140) # Do not encode entities, since this value will not be used in HTML
+ truncate(HTMLEntities.new.decode(str.to_str), length: 140, escape: false) # Do not encode entities, since this value will not be used in HTML
end
end
diff --git a/app/services/activitypub/fetch_featured_collection_service.rb b/app/services/activitypub/fetch_featured_collection_service.rb
index 780741feb..37d05e055 100644
--- a/app/services/activitypub/fetch_featured_collection_service.rb
+++ b/app/services/activitypub/fetch_featured_collection_service.rb
@@ -7,24 +7,48 @@ class ActivityPub::FetchFeaturedCollectionService < BaseService
return if account.featured_collection_url.blank? || account.suspended? || account.local?
@account = account
- @json = fetch_resource(@account.featured_collection_url, true)
+ @json = fetch_resource(@account.featured_collection_url, true, local_follower)
- return unless supported_context?
+ return unless supported_context?(@json)
- case @json['type']
+ process_items(collection_items(@json))
+ end
+
+ private
+
+ def collection_items(collection)
+ collection = fetch_collection(collection['first']) if collection['first'].present?
+ return unless collection.is_a?(Hash)
+
+ case collection['type']
when 'Collection', 'CollectionPage'
- process_items @json['items']
+ collection['items']
when 'OrderedCollection', 'OrderedCollectionPage'
- process_items @json['orderedItems']
+ collection['orderedItems']
end
end
- private
+ def fetch_collection(collection_or_uri)
+ return collection_or_uri if collection_or_uri.is_a?(Hash)
+ return if invalid_origin?(collection_or_uri)
+
+ fetch_resource_without_id_validation(collection_or_uri, local_follower, true)
+ end
def process_items(items)
- status_ids = items.map { |item| value_or_id(item) }
- .filter_map { |uri| ActivityPub::FetchRemoteStatusService.new.call(uri, on_behalf_of: local_follower) unless ActivityPub::TagManager.instance.local_uri?(uri) }
- .filter_map { |status| status.id if status.account_id == @account.id }
+ status_ids = items.filter_map do |item|
+ uri = value_or_id(item)
+ next if ActivityPub::TagManager.instance.local_uri?(uri)
+
+ status = ActivityPub::FetchRemoteStatusService.new.call(uri, on_behalf_of: local_follower)
+ next unless status&.account_id == @account.id
+
+ status.id
+ rescue ActiveRecord::RecordInvalid => e
+ Rails.logger.debug "Invalid pinned status #{uri}: #{e.message}"
+ nil
+ end
+
to_remove = []
to_add = status_ids
@@ -43,11 +67,9 @@ class ActivityPub::FetchFeaturedCollectionService < BaseService
end
end
- def supported_context?
- super(@json)
- end
-
def local_follower
- @local_follower ||= @account.followers.local.without_suspended.first
+ return @local_follower if defined?(@local_follower)
+
+ @local_follower = @account.followers.local.without_suspended.first
end
end
diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb
index 9672b3d2b..803098245 100644
--- a/app/services/activitypub/fetch_remote_status_service.rb
+++ b/app/services/activitypub/fetch_remote_status_service.rb
@@ -30,6 +30,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService
end
return if activity_json.nil? || object_uri.nil? || !trustworthy_attribution?(@json['id'], actor_uri)
+ return ActivityPub::TagManager.instance.uri_to_resource(object_uri, Status) if ActivityPub::TagManager.instance.local_uri?(object_uri)
actor = account_from_uri(actor_uri)
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index ec5140720..4449a5427 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -3,6 +3,8 @@
class ActivityPub::ProcessAccountService < BaseService
include JsonLdHelper
include DomainControlHelper
+ include Redisable
+ include Lockable
# Should be called with confirmed valid JSON
# and WebFinger-resolved username and domain
@@ -16,22 +18,18 @@ class ActivityPub::ProcessAccountService < BaseService
@domain = domain
@collections = {}
- RedisLock.acquire(lock_options) do |lock|
- if lock.acquired?
- @account = Account.remote.find_by(uri: @uri) if @options[:only_key]
- @account ||= Account.find_remote(@username, @domain)
- @old_public_key = @account&.public_key
- @old_protocol = @account&.protocol
- @suspension_changed = false
-
- create_account if @account.nil?
- update_account
- process_tags
-
- process_duplicate_accounts! if @options[:verified_webfinger]
- else
- raise Mastodon::RaceConditionError
- end
+ with_lock("process_account:#{@uri}") do
+ @account = Account.remote.find_by(uri: @uri) if @options[:only_key]
+ @account ||= Account.find_remote(@username, @domain)
+ @old_public_key = @account&.public_key
+ @old_protocol = @account&.protocol
+ @suspension_changed = false
+
+ create_account if @account.nil?
+ update_account
+ process_tags
+
+ process_duplicate_accounts! if @options[:verified_webfinger]
end
return if @account.nil?
@@ -288,10 +286,6 @@ class ActivityPub::ProcessAccountService < BaseService
!@old_protocol.nil? && @old_protocol != @account.protocol
end
- def lock_options
- { redis: Redis.current, key: "process_account:#{@uri}", autorelease: 15.minutes.seconds }
- end
-
def process_tags
return if @json['tag'].blank?
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index b966c4068..74fa38454 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -2,8 +2,12 @@
class ActivityPub::ProcessStatusUpdateService < BaseService
include JsonLdHelper
+ include Redisable
+ include Lockable
def call(status, json)
+ raise ArgumentError, 'Status has unsaved changes' if status.changed?
+
@json = json
@status_parser = ActivityPub::Parser::StatusParser.new(@json)
@uri = @status_parser.uri
@@ -15,37 +19,48 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
# Only native types can be updated at the moment
return @status if !expected_type? || already_updated_more_recently?
- last_edit_date = status.edited_at.presence || status.created_at
+ if @status_parser.edited_at.present? && (@status.edited_at.nil? || @status_parser.edited_at > @status.edited_at)
+ handle_explicit_update!
+ else
+ handle_implicit_update!
+ end
- # Only allow processing one create/update per status at a time
- RedisLock.acquire(lock_options) do |lock|
- if lock.acquired?
- Status.transaction do
- create_previous_edit!
- update_media_attachments!
- update_poll!
- update_immediate_attributes!
- update_metadata!
- create_edit!
- end
+ @status
+ end
- queue_poll_notifications!
+ private
- next unless significant_changes?
+ def handle_explicit_update!
+ last_edit_date = @status.edited_at.presence || @status.created_at
- reset_preview_card!
- broadcast_updates!
- else
- raise Mastodon::RaceConditionError
+ # Only allow processing one create/update per status at a time
+ with_lock("create:#{@uri}") do
+ Status.transaction do
+ record_previous_edit!
+ update_media_attachments!
+ update_poll!
+ update_immediate_attributes!
+ update_metadata!
+ create_edits!
end
- end
- forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date
+ queue_poll_notifications!
- @status
+ next unless significant_changes?
+
+ reset_preview_card!
+ broadcast_updates!
+ end
+
+ forward_activity! if significant_changes? && @status_parser.edited_at > last_edit_date
end
- private
+ def handle_implicit_update!
+ with_lock("create:#{@uri}") do
+ update_poll!(allow_significant_changes: false)
+ queue_poll_notifications!
+ end
+ end
def update_media_attachments!
previous_media_attachments = @status.media_attachments.to_a
@@ -93,7 +108,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@media_attachments_changed = true if @status.ordered_media_attachment_ids != previous_media_attachments_ids
end
- def update_poll!
+ def update_poll!(allow_significant_changes: true)
previous_poll = @status.preloadable_poll
@previous_expires_at = previous_poll&.expires_at
poll_parser = ActivityPub::Parser::PollParser.new(@json)
@@ -104,6 +119,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
# If for some reasons the options were changed, it invalidates all previous
# votes, so we need to remove them
@poll_changed = true if poll_parser.significantly_changes?(poll)
+ return if @poll_changed && !allow_significant_changes
poll.last_fetched_at = Time.now.utc
poll.options = poll_parser.options
@@ -116,6 +132,8 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@status.poll_id = poll.id
elsif previous_poll.present?
+ return unless allow_significant_changes
+
previous_poll.destroy!
@poll_changed = true
@status.poll_id = nil
@@ -127,7 +145,10 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@status.spoiler_text = @status_parser.spoiler_text || ''
@status.sensitive = @account.sensitized? || @status_parser.sensitive || false
@status.language = @status_parser.language
- @status.edited_at = @status_parser.edited_at || Time.now.utc if significant_changes?
+
+ @significant_changes = text_significantly_changed? || @status.spoiler_text_changed? || @media_attachments_changed || @poll_changed
+
+ @status.edited_at = @status_parser.edited_at if significant_changes?
@status.save!
end
@@ -212,23 +233,14 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
equals_or_includes_any?(@json['type'], %w(Note Question))
end
- def lock_options
- { redis: Redis.current, key: "create:#{@uri}", autorelease: 15.minutes.seconds }
+ def record_previous_edit!
+ @previous_edit = @status.build_snapshot(at_time: @status.created_at, rate_limit: false) if @status.edits.empty?
end
- def create_previous_edit!
- # We only need to create a previous edit when no previous edits exist, e.g.
- # when the status has never been edited. For other cases, we always create
- # an edit, so the step can be skipped
-
- return if @status.edits.any?
-
- @status.snapshot!(at_time: @status.created_at, rate_limit: false)
- end
-
- def create_edit!
+ def create_edits!
return unless significant_changes?
+ @previous_edit&.save!
@status.snapshot!(account_id: @account.id, rate_limit: false)
end
@@ -243,7 +255,14 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
end
def significant_changes?
- @status.text_changed? || @status.text_previously_changed? || @status.spoiler_text_changed? || @status.spoiler_text_previously_changed? || @media_attachments_changed || @poll_changed
+ @significant_changes
+ end
+
+ def text_significantly_changed?
+ return false unless @status.text_changed?
+
+ old, new = @status.text_change
+ HtmlAwareFormatter.new(old, false).to_s != HtmlAwareFormatter.new(new, false).to_s
end
def already_updated_more_recently?
diff --git a/app/services/appeal_service.rb b/app/services/appeal_service.rb
index 1397c50f5..cef9be05f 100644
--- a/app/services/appeal_service.rb
+++ b/app/services/appeal_service.rb
@@ -14,7 +14,8 @@ class AppealService < BaseService
private
def create_appeal!
- @appeal = @strike.create_appeal!(
+ @appeal = Appeal.create!(
+ strike: @strike,
text: @text,
account: @strike.target_account
)
diff --git a/app/services/approve_appeal_service.rb b/app/services/approve_appeal_service.rb
index 37a08b46e..96aaaa7d0 100644
--- a/app/services/approve_appeal_service.rb
+++ b/app/services/approve_appeal_service.rb
@@ -52,8 +52,9 @@ class ApproveAppealService < BaseService
end
def undo_mark_statuses_as_sensitive!
+ representative_account = Account.representative
@strike.statuses.includes(:media_attachments).each do |status|
- UpdateStatusService.new.call(status, @current_account.id, sensitive: false) if status.with_media?
+ UpdateStatusService.new.call(status, representative_account.id, sensitive: false) if status.with_media?
end
end
diff --git a/app/services/base_service.rb b/app/services/base_service.rb
index 99e8c875f..b0c0f9ec4 100644
--- a/app/services/base_service.rb
+++ b/app/services/base_service.rb
@@ -5,4 +5,8 @@ class BaseService
include ActionView::Helpers::SanitizeHelper
include RoutingHelper
+
+ def call(*)
+ raise NotImplementedError
+ end
end
diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb
index f182cb83e..9d6d7e784 100644
--- a/app/services/fan_out_on_write_service.rb
+++ b/app/services/fan_out_on_write_service.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class FanOutOnWriteService < BaseService
+ include Redisable
+
# Push a status into home and mentions feeds
# @param [Status] status
# @param [Hash] options
@@ -107,20 +109,20 @@ class FanOutOnWriteService < BaseService
def broadcast_to_hashtag_streams!
@status.tags.pluck(:name).each do |hashtag|
- Redis.current.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}", anonymous_payload)
- Redis.current.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}:local", anonymous_payload) if @status.local?
+ redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}", anonymous_payload)
+ redis.publish("timeline:hashtag:#{hashtag.mb_chars.downcase}:local", anonymous_payload) if @status.local?
end
end
def broadcast_to_public_streams!
return if @status.reply? && @status.in_reply_to_account_id != @account.id && !Setting.show_replies_in_public_timelines
- Redis.current.publish('timeline:public', anonymous_payload)
- Redis.current.publish(@status.local? ? 'timeline:public:local' : 'timeline:public:remote', anonymous_payload)
+ redis.publish('timeline:public', anonymous_payload)
+ redis.publish(@status.local? ? 'timeline:public:local' : 'timeline:public:remote', anonymous_payload)
if @status.with_media?
- Redis.current.publish('timeline:public:media', anonymous_payload)
- Redis.current.publish(@status.local? ? 'timeline:public:local:media' : 'timeline:public:remote:media', anonymous_payload)
+ redis.publish('timeline:public:media', anonymous_payload)
+ redis.publish(@status.local? ? 'timeline:public:local:media' : 'timeline:public:remote:media', anonymous_payload)
end
end
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 239ab9b93..e5b5b730e 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -1,6 +1,9 @@
# frozen_string_literal: true
class FetchLinkCardService < BaseService
+ include Redisable
+ include Lockable
+
URL_PATTERN = %r{
(#{Twitter::TwitterText::Regex[:valid_url_preceding_chars]}) # $1 preceding chars
( # $2 URL
@@ -20,13 +23,9 @@ class FetchLinkCardService < BaseService
@url = @original_url.to_s
- RedisLock.acquire(lock_options) do |lock|
- if lock.acquired?
- @card = PreviewCard.find_by(url: @url)
- process_url if @card.nil? || @card.updated_at <= 2.weeks.ago || @card.missing_image?
- else
- raise Mastodon::RaceConditionError
- end
+ with_lock("fetch:#{@original_url}") do
+ @card = PreviewCard.find_by(url: @url)
+ process_url if @card.nil? || @card.updated_at <= 2.weeks.ago || @card.missing_image?
end
attach_card if @card&.persisted?
@@ -134,7 +133,7 @@ class FetchLinkCardService < BaseService
when 'video'
@card.width = embed[:width].presence || 0
@card.height = embed[:height].presence || 0
- @card.html = Formatter.instance.sanitize(embed[:html], Sanitize::Config::MASTODON_OEMBED)
+ @card.html = Sanitize.fragment(embed[:html], Sanitize::Config::MASTODON_OEMBED)
@card.image_remote_url = (url + embed[:thumbnail_url]).to_s if embed[:thumbnail_url].present?
when 'rich'
# Most providers rely on } }
+
+ it 'does not include the HTML in the URL' do
+ is_expected.to include '"http://example.com/blahblahblahblah/a"'
+ end
+
+ it 'does not include a script tag' do
+ is_expected.to_not include '' }
+
+ it 'does not include a script tag' do
+ is_expected.to_not include '} }
-
- it 'does not include the HTML in the URL' do
- is_expected.to include '"http://example.com/blahblahblahblah/a"'
- end
-
- it 'escapes the HTML' do
- is_expected.to include '<script>alert("Hello")</script>'
- end
- end
-
- context 'given text containing HTML code (script tag)' do
- let(:text) { '' }
-
- it 'escapes the HTML' do
- is_expected.to include '
<script>alert("Hello")</script>
'
- end
- end
-
- context 'given text containing HTML (XSS attack)' do
- let(:text) { %q{} }
-
- it 'escapes the HTML' do
- is_expected.to include '
<img src="javascript:alert('XSS');">
'
- end
- end
-
- context 'given an invalid URL' do
- let(:text) { 'http://www\.google\.com' }
-
- it 'outputs the raw URL' do
- is_expected.to eq '
http://www\.google\.com
'
- end
- end
-
- context 'given text containing a hashtag' do
- let(:text) { '#hashtag' }
-
- it 'creates a hashtag link' do
- is_expected.to include '/tags/hashtag" class="mention hashtag" rel="tag">#hashtag'
- end
- end
-
- context 'given text containing a hashtag with Unicode chars' do
- let(:text) { '#hashtagタグ' }
-
- it 'creates a hashtag link' do
- is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#hashtagタグ'
- end
- end
-
- context 'given a stand-alone xmpp: URI' do
- let(:text) { 'xmpp:user@instance.com' }
-
- it 'matches the full URI' do
- is_expected.to include 'href="xmpp:user@instance.com"'
- end
- end
-
- context 'given a an xmpp: URI with a query-string' do
- let(:text) { 'please join xmpp:muc@instance.com?join right now' }
-
- it 'matches the full URI' do
- is_expected.to include 'href="xmpp:muc@instance.com?join"'
- end
- end
-
- context 'given text containing a magnet: URI' do
- let(:text) { 'wikipedia gives this example of a magnet uri: magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a' }
-
- it 'matches the full URI' do
- is_expected.to include 'href="magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a"'
- end
- end
- end
-
- describe '#format_spoiler' do
- subject { Formatter.instance.format_spoiler(status) }
-
- context 'given a post containing plain text' do
- let(:status) { Fabricate(:status, text: 'text', spoiler_text: 'Secret!', uri: nil) }
-
- it 'Returns the spoiler text' do
- is_expected.to eq 'Secret!'
- end
- end
-
- context 'given a post with an emoji shortcode at the start' do
- let!(:emoji) { Fabricate(:custom_emoji) }
- let(:status) { Fabricate(:status, text: 'text', spoiler_text: ':coolcat: Secret!', uri: nil) }
- let(:text) { ':coolcat: Beep boop' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/@alice Hello world'
- end
- end
-
- context 'given a post containing plain text' do
- let(:status) { Fabricate(:status, text: 'text', uri: nil) }
-
- it 'paragraphizes the text' do
- is_expected.to eq '
text
'
- end
- end
-
- context 'given a post containing line feeds' do
- let(:status) { Fabricate(:status, text: "line\nfeed", uri: nil) }
-
- it 'removes line feeds' do
- is_expected.not_to include "\n"
- end
- end
-
- context 'given a post containing linkable mentions' do
- let(:status) { Fabricate(:status, mentions: [ Fabricate(:mention, account: local_account) ], text: '@alice') }
-
- it 'creates a mention link' do
- is_expected.to include '@alice'
- end
- end
-
- context 'given a post containing unlinkable mentions' do
- let(:status) { Fabricate(:status, text: '@alice', uri: nil) }
-
- it 'does not create a mention link' do
- is_expected.to include '@alice'
- end
- end
-
- context do
- let(:content_type) { 'text/plain' }
-
- subject do
- status = Fabricate(:status, text: text, content_type: content_type, uri: nil)
- Formatter.instance.format(status)
- end
-
- context 'given an invalid URL (invalid port)' do
- let(:text) { 'https://foo.bar:X/' }
- let(:content_type) { 'text/markdown' }
-
- it 'outputs the raw URL' do
- is_expected.to eq '
https://foo.bar:X/
'
- end
- end
-
- include_examples 'encode and link URLs'
- end
-
- context 'given a post with custom_emojify option' do
- let!(:emoji) { Fabricate(:custom_emoji) }
- let(:status) { Fabricate(:status, account: local_account, text: text) }
-
- subject { Formatter.instance.format(status, custom_emojify: true) }
-
- context 'given a post with an emoji shortcode at the start' do
- let(:text) { ':coolcat: Beep boop' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/
:coolcat: Beep boop ' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/
Beep :coolcat: boop
' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/Beep :coolcat::coolcat:' }
-
- it 'does not touch the shortcodes' do
- is_expected.to match(/
:coolcat::coolcat:<\/p>/)
- end
- end
-
- context 'given a post with an emoji shortcode at the end' do
- let(:text) { '
Beep boop :coolcat:
' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/ alert("Hello")' }
-
- it 'strips the scripts' do
- is_expected.to_not include ''
- end
- end
-
- context 'given a post containing malicious classes' do
- let(:text) { 'Show more' }
-
- it 'strips the malicious classes' do
- is_expected.to_not include 'status__content__spoiler-link'
- end
- end
- end
-
- describe '#plaintext' do
- subject { Formatter.instance.plaintext(status) }
-
- context 'given a post with local status' do
- let(:status) { Fabricate(:status, text: '
a text by a nerd who uses an HTML tag in text
', content_type: content_type, uri: nil) }
- let(:content_type) { 'text/plain' }
-
- it 'returns the raw text' do
- is_expected.to eq '
a text by a nerd who uses an HTML tag in text
'
- end
- end
-
- context 'given a post with remote status' do
- let(:status) { Fabricate(:status, account: remote_account, text: '') }
-
- it 'returns tag-stripped text' do
- is_expected.to eq ''
- end
- end
- end
-
- describe '#simplified_format' do
- subject { Formatter.instance.simplified_format(account) }
-
- context 'given a post with local status' do
- let(:account) { Fabricate(:account, domain: nil, note: text) }
-
- context 'given a post containing linkable mentions for local accounts' do
- let(:text) { '@alice' }
-
- before { local_account }
-
- it 'creates a mention link' do
- is_expected.to eq '
'
- end
- end
-
- context 'given a post containing linkable mentions for remote accounts' do
- let(:text) { '@bob@remote.test' }
-
- before { remote_account }
-
- it 'creates a mention link' do
- is_expected.to eq '
'
- end
- end
-
- context 'given a post containing unlinkable mentions' do
- let(:text) { '@alice' }
-
- it 'does not create a mention link' do
- is_expected.to eq '
@alice
'
- end
- end
-
- context 'given a post with custom_emojify option' do
- let!(:emoji) { Fabricate(:custom_emoji) }
-
- before { account.note = text }
- subject { Formatter.instance.simplified_format(account, custom_emojify: true) }
-
- context 'given a post with an emoji shortcode at the start' do
- let(:text) { ':coolcat: Beep boop' }
-
- it 'converts the shortcode to an image tag' do
- is_expected.to match(/
alert("Hello")' }
- let(:account) { Fabricate(:account, domain: 'remote', note: text) }
-
- it 'reformats' do
- is_expected.to_not include ''
- end
-
- context 'with custom_emojify option' do
- let!(:emoji) { Fabricate(:custom_emoji, domain: remote_account.domain) }
-
- before { remote_account.note = text }
-
- subject { Formatter.instance.simplified_format(remote_account, custom_emojify: true) }
-
- context 'given a post with an emoji shortcode at the start' do
- let(:text) { '
:coolcat: Beep boop ' }
-
- it 'converts shortcode to image tag' do
- is_expected.to match(/
Beep :coolcat: boop
' }
-
- it 'converts shortcode to image tag' do
- is_expected.to match(/Beep :coolcat::coolcat:' }
-
- it 'does not touch the shortcodes' do
- is_expected.to match(/
:coolcat::coolcat:<\/p>/)
- end
- end
-
- context 'given a post with an emoji shortcode at the end' do
- let(:text) { '
Beep boop :coolcat:
' }
-
- it 'converts shortcode to image tag' do
- is_expected.to match(/ alert("Hello")' }
-
- subject { Formatter.instance.sanitize(html, Sanitize::Config::MASTODON_STRICT) }
-
- it 'sanitizes' do
- is_expected.to eq ''
- end
- end
-end
diff --git a/spec/lib/html_aware_formatter_spec.rb b/spec/lib/html_aware_formatter_spec.rb
new file mode 100644
index 000000000..18d23abf5
--- /dev/null
+++ b/spec/lib/html_aware_formatter_spec.rb
@@ -0,0 +1,44 @@
+require 'rails_helper'
+
+RSpec.describe HtmlAwareFormatter do
+ describe '#to_s' do
+ subject { described_class.new(text, local).to_s }
+
+ context 'when local' do
+ let(:local) { true }
+ let(:text) { 'Foo bar' }
+
+ it 'returns formatted text' do
+ is_expected.to eq '
Foo bar
'
+ end
+ end
+
+ context 'when remote' do
+ let(:local) { false }
+
+ context 'given plain text' do
+ let(:text) { 'Beep boop' }
+
+ it 'keeps the plain text' do
+ is_expected.to include 'Beep boop'
+ end
+ end
+
+ context 'given text containing script tags' do
+ let(:text) { '' }
+
+ it 'strips the scripts' do
+ is_expected.to_not include ''
+ end
+ end
+
+ context 'given text containing malicious classes' do
+ let(:text) { 'Show more' }
+
+ it 'strips the malicious classes' do
+ is_expected.to_not include 'status__content__spoiler-link'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb
index 84bb4579c..7ea867c61 100644
--- a/spec/lib/link_details_extractor_spec.rb
+++ b/spec/lib/link_details_extractor_spec.rb
@@ -25,6 +25,14 @@ RSpec.describe LinkDetailsExtractor do
expect(subject.canonical_url).to eq 'https://foo.com/article'
end
end
+
+ context 'when canonical URL is set to "null"' do
+ let(:html) { '' }
+
+ it 'ignores the canonical URLs' do
+ expect(subject.canonical_url).to eq original_url
+ end
+ end
end
context 'when structured data is present' do
diff --git a/spec/lib/plain_text_formatter_spec.rb b/spec/lib/plain_text_formatter_spec.rb
new file mode 100644
index 000000000..c3d0ee630
--- /dev/null
+++ b/spec/lib/plain_text_formatter_spec.rb
@@ -0,0 +1,24 @@
+require 'rails_helper'
+
+RSpec.describe PlainTextFormatter do
+ describe '#to_s' do
+ subject { described_class.new(status.text, status.local?).to_s }
+
+ context 'given a post with local status' do
+ let(:status) { Fabricate(:status, text: '
a text by a nerd who uses an HTML tag in text
', uri: nil) }
+
+ it 'returns the raw text' do
+ is_expected.to eq '
a text by a nerd who uses an HTML tag in text
'
+ end
+ end
+
+ context 'given a post with remote status' do
+ let(:remote_account) { Fabricate(:account, domain: 'remote.test', username: 'bob', url: 'https://remote.test/') }
+ let(:status) { Fabricate(:status, account: remote_account, text: '
Hello
') }
+
+ it 'returns tag-stripped text' do
+ is_expected.to eq 'Hello'
+ end
+ end
+ end
+end
diff --git a/spec/lib/rss/serializer_spec.rb b/spec/lib/rss/serializer_spec.rb
deleted file mode 100644
index 0364d13de..000000000
--- a/spec/lib/rss/serializer_spec.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-describe RSS::Serializer do
- describe '#status_title' do
- let(:text) { 'This is a toot' }
- let(:spoiler) { '' }
- let(:sensitive) { false }
- let(:reblog) { nil }
- let(:account) { Fabricate(:account) }
- let(:status) { Fabricate(:status, account: account, text: text, spoiler_text: spoiler, sensitive: sensitive, reblog: reblog) }
-
- subject { RSS::Serializer.new.send(:status_title, status) }
-
- context 'if destroyed?' do
- it 'returns "#{account.acct} deleted status"' do
- status.destroy!
- expect(subject).to eq "#{account.acct} deleted status"
- end
- end
-
- context 'on a toot with long text' do
- let(:text) { "This toot's text is longer than the allowed number of characters" }
-
- it 'truncates toot text appropriately' do
- expect(subject).to eq "#{account.acct}: “This toot's text is longer tha…”"
- end
- end
-
- context 'on a toot with long text with a newline' do
- let(:text) { "This toot's text is longer\nthan the allowed number of characters" }
-
- it 'truncates toot text appropriately' do
- expect(subject).to eq "#{account.acct}: “This toot's text is longer…”"
- end
- end
-
- context 'on a toot with a content warning' do
- let(:spoiler) { 'long toot' }
-
- it 'displays spoiler text instead of toot content' do
- expect(subject).to eq "#{account.acct}: CW “long toot”"
- end
- end
-
- context 'on a toot with sensitive media' do
- let(:sensitive) { true }
-
- it 'displays that the media is sensitive' do
- expect(subject).to eq "#{account.acct}: “This is a toot” (sensitive)"
- end
- end
-
- context 'on a reblog' do
- let(:reblog) { Fabricate(:status, text: 'This is a toot') }
-
- it 'display that the toot is a reblog' do
- expect(subject).to eq "#{account.acct} boosted #{reblog.account.acct}: “This is a toot”"
- end
- end
- end
-end
diff --git a/spec/lib/sanitize_config_spec.rb b/spec/lib/sanitize_config_spec.rb
index 8bcffb2e5..dc6418e5b 100644
--- a/spec/lib/sanitize_config_spec.rb
+++ b/spec/lib/sanitize_config_spec.rb
@@ -41,18 +41,8 @@ describe Sanitize::Config do
end
end
- describe '::MASTODON_STRICT' do
- subject { Sanitize::Config::MASTODON_STRICT }
-
- it_behaves_like 'common HTML sanitization'
-
- it 'keeps a with href and rel tag' do
- expect(Sanitize.fragment('Test', subject)).to eq 'Test'
- end
- end
-
- describe '::MASTODON_STRICT with outgoing toots' do
- subject { Sanitize::Config::MASTODON_STRICT.merge(outgoing: true) }
+ describe '::MASTODON_OUTGOING' do
+ subject { Sanitize::Config::MASTODON_OUTGOING }
around do |example|
original_web_domain = Rails.configuration.x.web_domain
@@ -62,9 +52,9 @@ describe Sanitize::Config do
it_behaves_like 'common HTML sanitization'
- it 'keeps a with href and rel tag, not adding to rel if url is local' do
+ it 'keeps a with href and rel tag, not adding to rel or target if url is local' do
Rails.configuration.x.web_domain = 'domain.test'
- expect(Sanitize.fragment('Test', subject)).to eq 'Test'
+ expect(Sanitize.fragment('Test', subject)).to eq 'Test'
end
end
end
diff --git a/spec/lib/suspicious_sign_in_detector_spec.rb b/spec/lib/suspicious_sign_in_detector_spec.rb
new file mode 100644
index 000000000..101a18aa0
--- /dev/null
+++ b/spec/lib/suspicious_sign_in_detector_spec.rb
@@ -0,0 +1,57 @@
+require 'rails_helper'
+
+RSpec.describe SuspiciousSignInDetector do
+ describe '#suspicious?' do
+ let(:user) { Fabricate(:user, current_sign_in_at: 1.day.ago) }
+ let(:request) { double(remote_ip: remote_ip) }
+ let(:remote_ip) { nil }
+
+ subject { described_class.new(user).suspicious?(request) }
+
+ context 'when user has 2FA enabled' do
+ before do
+ user.update!(otp_required_for_login: true)
+ end
+
+ it 'returns false' do
+ expect(subject).to be false
+ end
+ end
+
+ context 'when exact IP has been used before' do
+ let(:remote_ip) { '1.1.1.1' }
+
+ before do
+ user.update!(sign_up_ip: remote_ip)
+ end
+
+ it 'returns false' do
+ expect(subject).to be false
+ end
+ end
+
+ context 'when similar IP has been used before' do
+ let(:remote_ip) { '1.1.2.2' }
+
+ before do
+ user.update!(sign_up_ip: '1.1.1.1')
+ end
+
+ it 'returns false' do
+ expect(subject).to be false
+ end
+ end
+
+ context 'when IP is completely unfamiliar' do
+ let(:remote_ip) { '2.2.2.2' }
+
+ before do
+ user.update!(sign_up_ip: '1.1.1.1')
+ end
+
+ it 'returns true' do
+ expect(subject).to be true
+ end
+ end
+ end
+end
diff --git a/spec/lib/text_formatter_spec.rb b/spec/lib/text_formatter_spec.rb
new file mode 100644
index 000000000..52a9d2498
--- /dev/null
+++ b/spec/lib/text_formatter_spec.rb
@@ -0,0 +1,313 @@
+require 'rails_helper'
+
+RSpec.describe TextFormatter do
+ describe '#to_s' do
+ let(:preloaded_accounts) { nil }
+
+ subject { described_class.new(text, preloaded_accounts: preloaded_accounts).to_s }
+
+ context 'given text containing plain text' do
+ let(:text) { 'text' }
+
+ it 'paragraphizes the text' do
+ is_expected.to eq '
text
'
+ end
+ end
+
+ context 'given text containing line feeds' do
+ let(:text) { "line\nfeed" }
+
+ it 'removes line feeds' do
+ is_expected.not_to include "\n"
+ end
+ end
+
+ context 'given text containing linkable mentions' do
+ let(:preloaded_accounts) { [Fabricate(:account, username: 'alice')] }
+ let(:text) { '@alice' }
+
+ it 'creates a mention link' do
+ is_expected.to include '@alice'
+ end
+ end
+
+ context 'given text containing unlinkable mentions' do
+ let(:preloaded_accounts) { [] }
+ let(:text) { '@alice' }
+
+ it 'does not create a mention link' do
+ is_expected.to include '@alice'
+ end
+ end
+
+ context 'given a stand-alone medium URL' do
+ let(:text) { 'https://hackernoon.com/the-power-to-build-communities-a-response-to-mark-zuckerberg-3f2cac9148a4' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://hackernoon.com/the-power-to-build-communities-a-response-to-mark-zuckerberg-3f2cac9148a4"'
+ end
+ end
+
+ context 'given a stand-alone google URL' do
+ let(:text) { 'http://google.com' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="http://google.com"'
+ end
+ end
+
+ context 'given a stand-alone URL with a newer TLD' do
+ let(:text) { 'http://example.gay' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="http://example.gay"'
+ end
+ end
+
+ context 'given a stand-alone IDN URL' do
+ let(:text) { 'https://nic.みんな/' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://nic.みんな/"'
+ end
+
+ it 'has display URL' do
+ is_expected.to include 'nic.みんな/'
+ end
+ end
+
+ context 'given a URL with a trailing period' do
+ let(:text) { 'http://www.mcmansionhell.com/post/156408871451/50-states-of-mcmansion-hell-scottsdale-arizona. ' }
+
+ it 'matches the full URL but not the period' do
+ is_expected.to include 'href="http://www.mcmansionhell.com/post/156408871451/50-states-of-mcmansion-hell-scottsdale-arizona"'
+ end
+ end
+
+ context 'given a URL enclosed with parentheses' do
+ let(:text) { '(http://google.com/)' }
+
+ it 'matches the full URL but not the parentheses' do
+ is_expected.to include 'href="http://google.com/"'
+ end
+ end
+
+ context 'given a URL with a trailing exclamation point' do
+ let(:text) { 'http://www.google.com!' }
+
+ it 'matches the full URL but not the exclamation point' do
+ is_expected.to include 'href="http://www.google.com"'
+ end
+ end
+
+ context 'given a URL with a trailing single quote' do
+ let(:text) { "http://www.google.com'" }
+
+ it 'matches the full URL but not the single quote' do
+ is_expected.to include 'href="http://www.google.com"'
+ end
+ end
+
+ context 'given a URL with a trailing angle bracket' do
+ let(:text) { 'http://www.google.com>' }
+
+ it 'matches the full URL but not the angle bracket' do
+ is_expected.to include 'href="http://www.google.com"'
+ end
+ end
+
+ context 'given a URL with a query string' do
+ context 'with escaped unicode character' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink"'
+ end
+ end
+
+ context 'with unicode character' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓&q=autolink' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓&q=autolink"'
+ end
+ end
+
+ context 'with unicode character at the end' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓"'
+ end
+ end
+
+ context 'with escaped and not escaped unicode characters' do
+ let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink' }
+
+ it 'preserves escaped unicode characters' do
+ is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink"'
+ end
+ end
+ end
+
+ context 'given a URL with parentheses in it' do
+ let(:text) { 'https://en.wikipedia.org/wiki/Diaspora_(software)' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://en.wikipedia.org/wiki/Diaspora_(software)"'
+ end
+ end
+
+ context 'given a URL in quotation marks' do
+ let(:text) { '"https://example.com/"' }
+
+ it 'does not match the quotation marks' do
+ is_expected.to include 'href="https://example.com/"'
+ end
+ end
+
+ context 'given a URL in angle brackets' do
+ let(:text) { '' }
+
+ it 'does not match the angle brackets' do
+ is_expected.to include 'href="https://example.com/"'
+ end
+ end
+
+ context 'given a URL with Japanese path string' do
+ let(:text) { 'https://ja.wikipedia.org/wiki/日本' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://ja.wikipedia.org/wiki/日本"'
+ end
+ end
+
+ context 'given a URL with Korean path string' do
+ let(:text) { 'https://ko.wikipedia.org/wiki/대한민국' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://ko.wikipedia.org/wiki/대한민국"'
+ end
+ end
+
+ context 'given a URL with a full-width space' do
+ let(:text) { 'https://example.com/ abc123' }
+
+ it 'does not match the full-width space' do
+ is_expected.to include 'href="https://example.com/"'
+ end
+ end
+
+ context 'given a URL in Japanese quotation marks' do
+ let(:text) { '「[https://example.org/」' }
+
+ it 'does not match the quotation marks' do
+ is_expected.to include 'href="https://example.org/"'
+ end
+ end
+
+ context 'given a URL with Simplified Chinese path string' do
+ let(:text) { 'https://baike.baidu.com/item/中华人民共和国' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://baike.baidu.com/item/中华人民共和国"'
+ end
+ end
+
+ context 'given a URL with Traditional Chinese path string' do
+ let(:text) { 'https://zh.wikipedia.org/wiki/臺灣' }
+
+ it 'matches the full URL' do
+ is_expected.to include 'href="https://zh.wikipedia.org/wiki/臺灣"'
+ end
+ end
+
+ context 'given a URL containing unsafe code (XSS attack, visible part)' do
+ let(:text) { %q{http://example.com/bb} }
+
+ it 'does not include the HTML in the URL' do
+ is_expected.to include '"http://example.com/b"'
+ end
+
+ it 'escapes the HTML' do
+ is_expected.to include '<del>b</del>'
+ end
+ end
+
+ context 'given a URL containing unsafe code (XSS attack, invisible part)' do
+ let(:text) { %q{http://example.com/blahblahblahblah/a} }
+
+ it 'does not include the HTML in the URL' do
+ is_expected.to include '"http://example.com/blahblahblahblah/a"'
+ end
+
+ it 'escapes the HTML' do
+ is_expected.to include '<script>alert("Hello")</script>'
+ end
+ end
+
+ context 'given text containing HTML code (script tag)' do
+ let(:text) { '' }
+
+ it 'escapes the HTML' do
+ is_expected.to include '
<script>alert("Hello")</script>
'
+ end
+ end
+
+ context 'given text containing HTML (XSS attack)' do
+ let(:text) { %q{} }
+
+ it 'escapes the HTML' do
+ is_expected.to include '
<img src="javascript:alert('XSS');">
'
+ end
+ end
+
+ context 'given an invalid URL' do
+ let(:text) { 'http://www\.google\.com' }
+
+ it 'outputs the raw URL' do
+ is_expected.to eq '
http://www\.google\.com
'
+ end
+ end
+
+ context 'given text containing a hashtag' do
+ let(:text) { '#hashtag' }
+
+ it 'creates a hashtag link' do
+ is_expected.to include '/tags/hashtag" class="mention hashtag" rel="tag">#hashtag'
+ end
+ end
+
+ context 'given text containing a hashtag with Unicode chars' do
+ let(:text) { '#hashtagタグ' }
+
+ it 'creates a hashtag link' do
+ is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#hashtagタグ'
+ end
+ end
+
+ context 'given text with a stand-alone xmpp: URI' do
+ let(:text) { 'xmpp:user@instance.com' }
+
+ it 'matches the full URI' do
+ is_expected.to include 'href="xmpp:user@instance.com"'
+ end
+ end
+
+ context 'given text with an xmpp: URI with a query-string' do
+ let(:text) { 'please join xmpp:muc@instance.com?join right now' }
+
+ it 'matches the full URI' do
+ is_expected.to include 'href="xmpp:muc@instance.com?join"'
+ end
+ end
+
+ context 'given text containing a magnet: URI' do
+ let(:text) { 'wikipedia gives this example of a magnet uri: magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a' }
+
+ it 'matches the full URI' do
+ is_expected.to include 'href="magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a"'
+ end
+ end
+ end
+end
diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb
index 8de7d8669..95712e6cf 100644
--- a/spec/mailers/previews/user_mailer_preview.rb
+++ b/spec/mailers/previews/user_mailer_preview.rb
@@ -87,8 +87,8 @@ class UserMailerPreview < ActionMailer::Preview
UserMailer.appeal_approved(User.first, Appeal.last)
end
- # Preview this email at http://localhost:3000/rails/mailers/user_mailer/sign_in_token
- def sign_in_token
- UserMailer.sign_in_token(User.first.tap { |user| user.generate_sign_in_token }, '127.0.0.1', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0', Time.now.utc)
+ # Preview this email at http://localhost:3000/rails/mailers/user_mailer/suspicious_sign_in
+ def suspicious_sign_in
+ UserMailer.suspicious_sign_in(User.first, '127.0.0.1', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0', Time.now.utc)
end
end
diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb
index 9c866788f..2ed33c1e4 100644
--- a/spec/mailers/user_mailer_spec.rb
+++ b/spec/mailers/user_mailer_spec.rb
@@ -83,4 +83,15 @@ describe UserMailer, type: :mailer do
include_examples 'localized subject',
'devise.mailer.email_changed.subject'
end
+
+ describe 'warning' do
+ let(:strike) { Fabricate(:account_warning, target_account: receiver.account, text: 'dont worry its just the testsuite', action: 'suspend') }
+ let(:mail) { UserMailer.warning(receiver, strike) }
+
+ it 'renders warning notification' do
+ receiver.update!(locale: nil)
+ expect(mail.body.encoded).to include I18n.t("user_mailer.warning.title.suspend", acct: receiver.account.acct)
+ expect(mail.body.encoded).to include strike.text
+ end
+ end
end
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 681134d49..dc0ca3da3 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -350,6 +350,45 @@ RSpec.describe Account, type: :model do
)
end
+ it 'does not return suspended users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username',
+ domain: 'example.com',
+ suspended: true
+ )
+
+ results = Account.search_for('username')
+ expect(results).to eq []
+ end
+
+ it 'does not return unapproved users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username'
+ )
+
+ match.user.update(approved: false)
+
+ results = Account.search_for('username')
+ expect(results).to eq []
+ end
+
+ it 'does not return unconfirmed users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username'
+ )
+
+ match.user.update(confirmed_at: nil)
+
+ results = Account.search_for('username')
+ expect(results).to eq []
+ end
+
it 'accepts ?, \, : and space as delimiter' do
match = Fabricate(
:account,
@@ -422,8 +461,114 @@ RSpec.describe Account, type: :model do
end
describe '.advanced_search_for' do
+ let(:account) { Fabricate(:account) }
+
+ context 'when limiting search to followed accounts' do
+ it 'accepts ?, \, : and space as delimiter' do
+ match = Fabricate(
+ :account,
+ display_name: 'A & l & i & c & e',
+ username: 'username',
+ domain: 'example.com'
+ )
+ account.follow!(match)
+
+ results = Account.advanced_search_for('A?l\i:c e', account, 10, true)
+ expect(results).to eq [match]
+ end
+
+ it 'does not return non-followed accounts' do
+ match = Fabricate(
+ :account,
+ display_name: 'A & l & i & c & e',
+ username: 'username',
+ domain: 'example.com'
+ )
+
+ results = Account.advanced_search_for('A?l\i:c e', account, 10, true)
+ expect(results).to eq []
+ end
+
+ it 'does not return suspended users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username',
+ domain: 'example.com',
+ suspended: true
+ )
+
+ results = Account.advanced_search_for('username', account, 10, true)
+ expect(results).to eq []
+ end
+
+ it 'does not return unapproved users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username'
+ )
+
+ match.user.update(approved: false)
+
+ results = Account.advanced_search_for('username', account, 10, true)
+ expect(results).to eq []
+ end
+
+ it 'does not return unconfirmed users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username'
+ )
+
+ match.user.update(confirmed_at: nil)
+
+ results = Account.advanced_search_for('username', account, 10, true)
+ expect(results).to eq []
+ end
+ end
+
+ it 'does not return suspended users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username',
+ domain: 'example.com',
+ suspended: true
+ )
+
+ results = Account.advanced_search_for('username', account)
+ expect(results).to eq []
+ end
+
+ it 'does not return unapproved users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username'
+ )
+
+ match.user.update(approved: false)
+
+ results = Account.advanced_search_for('username', account)
+ expect(results).to eq []
+ end
+
+ it 'does not return unconfirmed users' do
+ match = Fabricate(
+ :account,
+ display_name: 'Display Name',
+ username: 'username'
+ )
+
+ match.user.update(confirmed_at: nil)
+
+ results = Account.advanced_search_for('username', account)
+ expect(results).to eq []
+ end
+
it 'accepts ?, \, : and space as delimiter' do
- account = Fabricate(:account)
match = Fabricate(
:account,
display_name: 'A & l & i & c & e',
@@ -437,18 +582,17 @@ RSpec.describe Account, type: :model do
it 'limits by 10 by default' do
11.times { Fabricate(:account, display_name: "Display Name") }
- results = Account.search_for("display")
+ results = Account.advanced_search_for("display", account)
expect(results.size).to eq 10
end
it 'accepts arbitrary limits' do
2.times { Fabricate(:account, display_name: "Display Name") }
- results = Account.search_for("display", 1)
+ results = Account.advanced_search_for("display", account, 1)
expect(results.size).to eq 1
end
it 'ranks followed accounts higher' do
- account = Fabricate(:account)
match = Fabricate(:account, username: "Matching")
followed_match = Fabricate(:account, username: "Matcher")
Fabricate(:follow, account: account, target_account: followed_match)
@@ -775,6 +919,32 @@ RSpec.describe Account, type: :model do
expect(Account.suspended).to match_array([account_1])
end
end
+
+ describe 'searchable' do
+ let!(:suspended_local) { Fabricate(:account, suspended: true, username: 'suspended_local') }
+ let!(:suspended_remote) { Fabricate(:account, suspended: true, domain: 'example.org', username: 'suspended_remote') }
+ let!(:silenced_local) { Fabricate(:account, silenced: true, username: 'silenced_local') }
+ let!(:silenced_remote) { Fabricate(:account, silenced: true, domain: 'example.org', username: 'silenced_remote') }
+ let!(:unconfirmed) { Fabricate(:user, confirmed_at: nil).account }
+ let!(:unapproved) { Fabricate(:user, approved: false).account }
+ let!(:unconfirmed_unapproved) { Fabricate(:user, confirmed_at: nil, approved: false).account }
+ let!(:local_account) { Fabricate(:account, username: 'local_account') }
+ let!(:remote_account) { Fabricate(:account, domain: 'example.org', username: 'remote_account') }
+
+ before do
+ # Accounts get automatically-approved depending on settings, so ensure they aren't approved
+ unapproved.user.update(approved: false)
+ unconfirmed_unapproved.user.update(approved: false)
+ end
+
+ it 'returns every usable non-suspended account' do
+ expect(Account.searchable).to match_array([silenced_local, silenced_remote, local_account, remote_account])
+ end
+
+ it 'does not mess with previously-applied scopes' do
+ expect(Account.where.not(id: remote_account.id).searchable).to match_array([silenced_local, silenced_remote, local_account])
+ end
+ end
end
context 'when is local' do
diff --git a/spec/models/custom_filter_keyword_spec.rb b/spec/models/custom_filter_keyword_spec.rb
new file mode 100644
index 000000000..e15b9dad5
--- /dev/null
+++ b/spec/models/custom_filter_keyword_spec.rb
@@ -0,0 +1,4 @@
+require 'rails_helper'
+
+RSpec.describe CustomFilterKeyword, type: :model do
+end
diff --git a/spec/models/home_feed_spec.rb b/spec/models/home_feed_spec.rb
index ee7a83960..80f6edbff 100644
--- a/spec/models/home_feed_spec.rb
+++ b/spec/models/home_feed_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe HomeFeed, type: :model do
context 'when feed is generated' do
before do
- Redis.current.zadd(
+ redis.zadd(
FeedManager.instance.key(:home, account.id),
[[4, 4], [3, 3], [2, 2], [1, 1]]
)
@@ -31,7 +31,7 @@ RSpec.describe HomeFeed, type: :model do
context 'when feed is being generated' do
before do
- Redis.current.set("account:#{account.id}:regeneration", true)
+ redis.set("account:#{account.id}:regeneration", true)
end
it 'returns nothing' do
diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb
index 7360b23cf..cbd9a09c5 100644
--- a/spec/models/media_attachment_spec.rb
+++ b/spec/models/media_attachment_spec.rb
@@ -186,14 +186,6 @@ RSpec.describe MediaAttachment, type: :model do
expect(media.valid?).to be false
end
- describe 'descriptions for remote attachments' do
- it 'are cut off at 1500 characters' do
- media = Fabricate(:media_attachment, description: 'foo' * 1000, remote_url: 'http://example.com/blah.jpg')
-
- expect(media.description.size).to be <= 1_500
- end
- end
-
describe 'size limit validation' do
it 'rejects video files that are too large' do
stub_const 'MediaAttachment::IMAGE_LIMIT', 100.megabytes
diff --git a/spec/models/webhook_spec.rb b/spec/models/webhook_spec.rb
new file mode 100644
index 000000000..60c3d9524
--- /dev/null
+++ b/spec/models/webhook_spec.rb
@@ -0,0 +1,32 @@
+require 'rails_helper'
+
+RSpec.describe Webhook, type: :model do
+ let(:webhook) { Fabricate(:webhook) }
+
+ describe '#rotate_secret!' do
+ it 'changes the secret' do
+ previous_value = webhook.secret
+ webhook.rotate_secret!
+ expect(webhook.secret).to_not be_blank
+ expect(webhook.secret).to_not eq previous_value
+ end
+ end
+
+ describe '#enable!' do
+ before do
+ webhook.disable!
+ end
+
+ it 'enables the webhook' do
+ webhook.enable!
+ expect(webhook.enabled?).to be true
+ end
+ end
+
+ describe '#disable!' do
+ it 'disables the webhook' do
+ webhook.disable!
+ expect(webhook.enabled?).to be false
+ end
+ end
+end
diff --git a/spec/presenters/status_relationships_presenter_spec.rb b/spec/presenters/status_relationships_presenter_spec.rb
new file mode 100644
index 000000000..5cd4929a6
--- /dev/null
+++ b/spec/presenters/status_relationships_presenter_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe StatusRelationshipsPresenter do
+ describe '.initialize' do
+ before do
+ allow(Status).to receive(:reblogs_map).with(match_array(status_ids), current_account_id).and_return(default_map)
+ allow(Status).to receive(:favourites_map).with(status_ids, current_account_id).and_return(default_map)
+ allow(Status).to receive(:bookmarks_map).with(status_ids, current_account_id).and_return(default_map)
+ allow(Status).to receive(:mutes_map).with(anything, current_account_id).and_return(default_map)
+ allow(Status).to receive(:pins_map).with(anything, current_account_id).and_return(default_map)
+ end
+
+ let(:presenter) { StatusRelationshipsPresenter.new(statuses, current_account_id, **options) }
+ let(:current_account_id) { Fabricate(:account).id }
+ let(:statuses) { [Fabricate(:status)] }
+ let(:status_ids) { statuses.map(&:id) + statuses.map(&:reblog_of_id).compact }
+ let(:default_map) { { 1 => true } }
+
+ context 'options are not set' do
+ let(:options) { {} }
+
+ it 'sets default maps' do
+ expect(presenter.reblogs_map).to eq default_map
+ expect(presenter.favourites_map).to eq default_map
+ expect(presenter.bookmarks_map).to eq default_map
+ expect(presenter.mutes_map).to eq default_map
+ expect(presenter.pins_map).to eq default_map
+ end
+ end
+
+ context 'options[:reblogs_map] is set' do
+ let(:options) { { reblogs_map: { 2 => true } } }
+
+ it 'sets @reblogs_map merged with default_map and options[:reblogs_map]' do
+ expect(presenter.reblogs_map).to eq default_map.merge(options[:reblogs_map])
+ end
+ end
+
+ context 'options[:favourites_map] is set' do
+ let(:options) { { favourites_map: { 3 => true } } }
+
+ it 'sets @favourites_map merged with default_map and options[:favourites_map]' do
+ expect(presenter.favourites_map).to eq default_map.merge(options[:favourites_map])
+ end
+ end
+
+ context 'options[:bookmarks_map] is set' do
+ let(:options) { { bookmarks_map: { 4 => true } } }
+
+ it 'sets @bookmarks_map merged with default_map and options[:bookmarks_map]' do
+ expect(presenter.bookmarks_map).to eq default_map.merge(options[:bookmarks_map])
+ end
+ end
+
+ context 'options[:mutes_map] is set' do
+ let(:options) { { mutes_map: { 5 => true } } }
+
+ it 'sets @mutes_map merged with default_map and options[:mutes_map]' do
+ expect(presenter.mutes_map).to eq default_map.merge(options[:mutes_map])
+ end
+ end
+
+ context 'options[:pins_map] is set' do
+ let(:options) { { pins_map: { 6 => true } } }
+
+ it 'sets @pins_map merged with default_map and options[:pins_map]' do
+ expect(presenter.pins_map).to eq default_map.merge(options[:pins_map])
+ end
+ end
+
+ context 'when post includes filtered terms' do
+ let(:statuses) { [Fabricate(:status, text: 'this toot is about that banned word'), Fabricate(:status, reblog: Fabricate(:status, text: 'this toot is about an irrelevant word'))] }
+ let(:options) { {} }
+
+ before do
+ Account.find(current_account_id).custom_filters.create!(phrase: 'filter1', context: %w(home), action: :hide, keywords_attributes: [{ keyword: 'banned' }, { keyword: 'irrelevant' }])
+ end
+
+ it 'sets @filters_map to filter top-level status' do
+ matched_filters = presenter.filters_map[statuses[0].id]
+ expect(matched_filters.size).to eq 1
+
+ expect(matched_filters[0].filter.title).to eq 'filter1'
+ expect(matched_filters[0].keyword_matches).to eq ['banned']
+ end
+
+ it 'sets @filters_map to filter reblogged status' do
+ matched_filters = presenter.filters_map[statuses[1].reblog_of_id]
+ expect(matched_filters.size).to eq 1
+
+ expect(matched_filters[0].filter.title).to eq 'filter1'
+ expect(matched_filters[0].keyword_matches).to eq ['irrelevant']
+ end
+ end
+ end
+end
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index 217a8f2f8..02827a388 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -13,7 +13,6 @@ Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
WebMock.disable_net_connect!(allow: Chewy.settings[:host])
-Redis.current = Redis::Namespace.new("mastodon_test#{ENV['TEST_ENV_NUMBER']}", redis: Redis.current)
Sidekiq::Testing.inline!
Sidekiq.logger = nil
@@ -44,6 +43,7 @@ RSpec.configure do |config|
config.include Devise::Test::ControllerHelpers, type: :view
config.include Paperclip::Shoulda::Matchers
config.include ActiveSupport::Testing::TimeHelpers
+ config.include Redisable
config.before :each, type: :feature do
https = ENV['LOCAL_HTTPS'] == 'true'
@@ -60,7 +60,7 @@ RSpec.configure do |config|
config.after :each do
Rails.cache.clear
- Redis.current.del(Redis.current.keys)
+ redis.del(redis.keys)
end
end
diff --git a/spec/services/activitypub/fetch_featured_collection_service_spec.rb b/spec/services/activitypub/fetch_featured_collection_service_spec.rb
new file mode 100644
index 000000000..f552b9dc0
--- /dev/null
+++ b/spec/services/activitypub/fetch_featured_collection_service_spec.rb
@@ -0,0 +1,123 @@
+require 'rails_helper'
+
+RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do
+ let(:actor) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/account', featured_collection_url: 'https://example.com/account/pinned') }
+
+ let!(:known_status) { Fabricate(:status, account: actor, uri: 'https://example.com/account/pinned/1') }
+
+ let(:status_json_1) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ type: 'Note',
+ id: 'https://example.com/account/pinned/1',
+ content: 'foo',
+ attributedTo: actor.uri,
+ to: 'https://www.w3.org/ns/activitystreams#Public',
+ }
+ end
+
+ let(:status_json_2) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ type: 'Note',
+ id: 'https://example.com/account/pinned/2',
+ content: 'foo',
+ attributedTo: actor.uri,
+ to: 'https://www.w3.org/ns/activitystreams#Public',
+ }
+ end
+
+ let(:status_json_4) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ type: 'Note',
+ id: 'https://example.com/account/pinned/4',
+ content: 'foo',
+ attributedTo: actor.uri,
+ to: 'https://www.w3.org/ns/activitystreams#Public',
+ }
+ end
+
+ let(:items) do
+ [
+ 'https://example.com/account/pinned/1', # known
+ status_json_2, # unknown inlined
+ 'https://example.com/account/pinned/3', # unknown unreachable
+ 'https://example.com/account/pinned/4', # unknown reachable
+ ]
+ end
+
+ let(:payload) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ type: 'Collection',
+ id: actor.featured_collection_url,
+ items: items,
+ }.with_indifferent_access
+ end
+
+ subject { described_class.new }
+
+ shared_examples 'sets pinned posts' do
+ before do
+ stub_request(:get, 'https://example.com/account/pinned/1').to_return(status: 200, body: Oj.dump(status_json_1))
+ stub_request(:get, 'https://example.com/account/pinned/2').to_return(status: 200, body: Oj.dump(status_json_2))
+ stub_request(:get, 'https://example.com/account/pinned/3').to_return(status: 404)
+ stub_request(:get, 'https://example.com/account/pinned/4').to_return(status: 200, body: Oj.dump(status_json_4))
+
+ subject.call(actor)
+ end
+
+ it 'sets expected posts as pinned posts' do
+ expect(actor.pinned_statuses.pluck(:uri)).to match_array ['https://example.com/account/pinned/1', 'https://example.com/account/pinned/2', 'https://example.com/account/pinned/4']
+ end
+ end
+
+ describe '#call' do
+ context 'when the endpoint is a Collection' do
+ before do
+ stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload))
+ end
+
+ it_behaves_like 'sets pinned posts'
+ end
+
+ context 'when the endpoint is an OrderedCollection' do
+ let(:payload) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ type: 'OrderedCollection',
+ id: actor.featured_collection_url,
+ orderedItems: items,
+ }.with_indifferent_access
+ end
+
+ before do
+ stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload))
+ end
+
+ it_behaves_like 'sets pinned posts'
+ end
+
+ context 'when the endpoint is a paginated Collection' do
+ let(:payload) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ type: 'Collection',
+ id: actor.featured_collection_url,
+ first: {
+ type: 'CollectionPage',
+ partOf: actor.featured_collection_url,
+ items: items,
+ }
+ }.with_indifferent_access
+ end
+
+ before do
+ stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload))
+ end
+
+ it_behaves_like 'sets pinned posts'
+ end
+ end
+end
diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb
index 68816e554..7359ca0b4 100644
--- a/spec/services/activitypub/fetch_remote_status_service_spec.rb
+++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb
@@ -3,16 +3,15 @@ require 'rails_helper'
RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
include ActionView::Helpers::TextHelper
- let!(:sender) { Fabricate(:account).tap { |account| account.update(uri: ActivityPub::TagManager.instance.uri_for(account)) } }
+ let!(:sender) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar') }
let!(:recipient) { Fabricate(:account) }
- let!(:valid_domain) { Rails.configuration.x.local_domain }
let(:existing_status) { nil }
let(:note) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
- id: "https://#{valid_domain}/@foo/1234",
+ id: "https://foo.bar/@foo/1234",
type: 'Note',
content: 'Lorem ipsum',
attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
@@ -22,7 +21,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
subject { described_class.new }
before do
- stub_request(:head, 'https://example.com/watch?v=12345').to_return(status: 404, body: '')
+ stub_request(:get, 'https://foo.bar/watch?v=12345').to_return(status: 404, body: '')
+ stub_request(:get, object[:id]).to_return(body: Oj.dump(object))
end
describe '#call' do
@@ -46,7 +46,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
- id: "https://#{valid_domain}/@foo/1234",
+ id: "https://foo.bar/@foo/1234",
type: 'Video',
name: 'Nyan Cat 10 hours remix',
attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
@@ -54,13 +54,13 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
{
type: 'Link',
mimeType: 'application/x-bittorrent',
- href: "https://#{valid_domain}/12345.torrent",
+ href: "https://foo.bar/12345.torrent",
},
{
type: 'Link',
mimeType: 'text/html',
- href: "https://#{valid_domain}/watch?v=12345",
+ href: "https://foo.bar/watch?v=12345",
},
],
}
@@ -70,8 +70,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
status = sender.statuses.first
expect(status).to_not be_nil
- expect(status.url).to eq "https://#{valid_domain}/watch?v=12345"
- expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://#{valid_domain}/watch?v=12345"
+ expect(status.url).to eq "https://foo.bar/watch?v=12345"
+ expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://foo.bar/watch?v=12345"
end
end
@@ -79,7 +79,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
- id: "https://#{valid_domain}/@foo/1234",
+ id: "https://foo.bar/@foo/1234",
type: 'Audio',
name: 'Nyan Cat 10 hours remix',
attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
@@ -87,13 +87,13 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
{
type: 'Link',
mimeType: 'application/x-bittorrent',
- href: "https://#{valid_domain}/12345.torrent",
+ href: "https://foo.bar/12345.torrent",
},
{
type: 'Link',
mimeType: 'text/html',
- href: "https://#{valid_domain}/watch?v=12345",
+ href: "https://foo.bar/watch?v=12345",
},
],
}
@@ -103,8 +103,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
status = sender.statuses.first
expect(status).to_not be_nil
- expect(status.url).to eq "https://#{valid_domain}/watch?v=12345"
- expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://#{valid_domain}/watch?v=12345"
+ expect(status.url).to eq "https://foo.bar/watch?v=12345"
+ expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remixhttps://foo.bar/watch?v=12345"
end
end
@@ -112,7 +112,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
- id: "https://#{valid_domain}/@foo/1234",
+ id: "https://foo.bar/@foo/1234",
type: 'Event',
name: "Let's change the world",
attributedTo: ActivityPub::TagManager.instance.uri_for(sender)
@@ -123,8 +123,8 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
status = sender.statuses.first
expect(status).to_not be_nil
- expect(status.url).to eq "https://#{valid_domain}/@foo/1234"
- expect(strip_tags(status.text)).to eq "Let's change the worldhttps://#{valid_domain}/@foo/1234"
+ expect(status.url).to eq "https://foo.bar/@foo/1234"
+ expect(strip_tags(status.text)).to eq "Let's change the worldhttps://foo.bar/@foo/1234"
end
end
@@ -154,7 +154,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
- id: "https://#{valid_domain}/@foo/1234/create",
+ id: "https://foo.bar/@foo/1234/create",
type: 'Create',
actor: ActivityPub::TagManager.instance.uri_for(sender),
object: note,
@@ -174,7 +174,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
- id: "https://#{valid_domain}/@foo/1234/create",
+ id: "https://foo.bar/@foo/1234/create",
type: 'Create',
actor: ActivityPub::TagManager.instance.uri_for(sender),
object: {
@@ -195,7 +195,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
let(:existing_status) { Fabricate(:status, account: sender, text: 'Foo', uri: note[:id]) }
context 'with a Note object' do
- let(:object) { note }
+ let(:object) { note.merge(updated: '2021-09-08T22:39:25Z') }
it 'updates status' do
existing_status.reload
@@ -208,10 +208,10 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
let(:object) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
- id: "https://#{valid_domain}/@foo/1234/create",
+ id: "https://foo.bar/@foo/1234/create",
type: 'Create',
actor: ActivityPub::TagManager.instance.uri_for(sender),
- object: note,
+ object: note.merge(updated: '2021-09-08T22:39:25Z'),
}
end
diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb
index 788c7c9d9..481572742 100644
--- a/spec/services/activitypub/process_status_update_service_spec.rb
+++ b/spec/services/activitypub/process_status_update_service_spec.rb
@@ -1,5 +1,9 @@
require 'rails_helper'
+def poll_option_json(name, votes)
+ { type: 'Note', name: name, replies: { type: 'Collection', totalItems: votes } }
+end
+
RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
let!(:status) { Fabricate(:status, text: 'Hello world', account: Fabricate(:account, domain: 'example.com')) }
@@ -46,6 +50,203 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
expect(status.reload.spoiler_text).to eq 'Show more'
end
+ context 'when the changes are only in sanitized-out HTML' do
+ let!(:status) { Fabricate(:status, text: '