From 683db3ab253e60d2a5ba14d0f348e5285704fea8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 20 Nov 2024 16:56:35 +0100 Subject: [PATCH 01/19] Add ability to middle-mouse click posts in web UI (#32988) --- app/javascript/mastodon/components/status.jsx | 57 ++++++++----------- .../mastodon/components/status_content.jsx | 4 +- .../components/embedded_status.tsx | 12 +++- 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 95ea53521f..669eb22cb6 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { injectIntl, defineMessages, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; +import { Link } from 'react-router-dom'; + import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; @@ -164,32 +166,18 @@ class Status extends ImmutablePureComponent { }; handleClick = e => { - if (e && (e.button !== 0 || e.ctrlKey || e.metaKey)) { + e.preventDefault(); + this.handleHotkeyOpen(e); + }; + + handleMouseUp = e => { + // Only handle clicks on the empty space above the content + + if (e.target !== e.currentTarget) { return; } - if (e) { - e.preventDefault(); - } - - this.handleHotkeyOpen(); - }; - - handlePrependAccountClick = e => { - this.handleAccountClick(e, false); - }; - - handleAccountClick = (e, proper = true) => { - if (e && (e.button !== 0 || e.ctrlKey || e.metaKey)) { - return; - } - - if (e) { - e.preventDefault(); - e.stopPropagation(); - } - - this._openProfile(proper); + this.handleClick(e); }; handleExpandedToggle = () => { @@ -287,7 +275,7 @@ class Status extends ImmutablePureComponent { this.props.onMention(this._properStatus().get('account')); }; - handleHotkeyOpen = () => { + handleHotkeyOpen = (e) => { if (this.props.onClick) { this.props.onClick(); return; @@ -300,7 +288,13 @@ class Status extends ImmutablePureComponent { return; } - history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`); + const path = `/@${status.getIn(['account', 'acct'])}/${status.get('id')}`; + + if (e?.button === 0 && !(e?.ctrlKey || e?.metaKey)) { + history.push(path); + } else if (e?.button === 1 || (e?.button === 0 && (e?.ctrlKey || e?.metaKey))) { + window.open(path, '_blank', 'noreferrer noopener'); + } }; handleHotkeyOpenProfile = () => { @@ -412,7 +406,7 @@ class Status extends ImmutablePureComponent { prepend = (
- }} /> + }} />
); @@ -550,20 +544,19 @@ class Status extends ImmutablePureComponent {
{(connectReply || connectUp || connectToRoot) &&
} - {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */} -
- + {matchedFilters && } diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 4950c896f9..fe485eb3ac 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -204,8 +204,8 @@ class StatusContent extends PureComponent { element = element.parentNode; } - if (deltaX + deltaY < 5 && e.button === 0 && this.props.onClick) { - this.props.onClick(); + if (deltaX + deltaY < 5 && (e.button === 0 || e.button === 1) && this.props.onClick) { + this.props.onClick(e); } this.startXY = null; diff --git a/app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx b/app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx index 65ea9b5d5e..ca0d1bc850 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/embedded_status.tsx @@ -43,7 +43,7 @@ export const EmbeddedStatus: React.FC<{ statusId: string }> = ({ ); const handleMouseUp = useCallback>( - ({ clientX, clientY, target, button }) => { + ({ clientX, clientY, target, button, ctrlKey, metaKey }) => { const [startX, startY] = clickCoordinatesRef.current ?? [0, 0]; const [deltaX, deltaY] = [ Math.abs(clientX - startX), @@ -64,8 +64,14 @@ export const EmbeddedStatus: React.FC<{ statusId: string }> = ({ element = element.parentNode as HTMLDivElement | null; } - if (deltaX + deltaY < 5 && button === 0 && account) { - history.push(`/@${account.acct}/${statusId}`); + if (deltaX + deltaY < 5 && account) { + const path = `/@${account.acct}/${statusId}`; + + if (button === 0 && !(ctrlKey || metaKey)) { + history.push(path); + } else if (button === 1 || (button === 0 && (ctrlKey || metaKey))) { + window.open(path, '_blank', 'noreferrer noopener'); + } } clickCoordinatesRef.current = null; From 2526b32ad3cb1142edc6e2cfb272a9e3cef19060 Mon Sep 17 00:00:00 2001 From: Paulo Vilarinho <33267902+PauloVilarinho@users.noreply.github.com> Date: Wed, 20 Nov 2024 16:06:41 -0300 Subject: [PATCH 02/19] block scheduled status from frozen users (#30729) --- .../publish_scheduled_status_worker.rb | 2 ++ .../publish_scheduled_status_worker_spec.rb | 22 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/workers/publish_scheduled_status_worker.rb b/app/workers/publish_scheduled_status_worker.rb index aa5c4a834a..0ec081de91 100644 --- a/app/workers/publish_scheduled_status_worker.rb +++ b/app/workers/publish_scheduled_status_worker.rb @@ -9,6 +9,8 @@ class PublishScheduledStatusWorker scheduled_status = ScheduledStatus.find(scheduled_status_id) scheduled_status.destroy! + return true if scheduled_status.account.user.disabled? + PostStatusService.new.call( scheduled_status.account, options_with_objects(scheduled_status.params.with_indifferent_access) diff --git a/spec/workers/publish_scheduled_status_worker_spec.rb b/spec/workers/publish_scheduled_status_worker_spec.rb index 35e510d253..9365e8a4bc 100644 --- a/spec/workers/publish_scheduled_status_worker_spec.rb +++ b/spec/workers/publish_scheduled_status_worker_spec.rb @@ -12,12 +12,26 @@ RSpec.describe PublishScheduledStatusWorker do subject.perform(scheduled_status.id) end - it 'creates a status' do - expect(scheduled_status.account.statuses.first.text).to eq 'Hello world, future!' + context 'when the account is not disabled' do + it 'creates a status' do + expect(scheduled_status.account.statuses.first.text).to eq 'Hello world, future!' + end + + it 'removes the scheduled status' do + expect(ScheduledStatus.find_by(id: scheduled_status.id)).to be_nil + end end - it 'removes the scheduled status' do - expect(ScheduledStatus.find_by(id: scheduled_status.id)).to be_nil + context 'when the account is disabled' do + let(:scheduled_status) { Fabricate(:scheduled_status, account: Fabricate(:account, user: Fabricate(:user, disabled: true))) } + + it 'does not create a status' do + expect(Status.count).to eq 0 + end + + it 'removes the scheduled status' do + expect(ScheduledStatus.find_by(id: scheduled_status.id)).to be_nil + end end end end From 420ed155babd2a5f40307ab40f1e7e815bb91f40 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 21 Nov 2024 11:58:04 +0100 Subject: [PATCH 03/19] Fix wrong video dimensions for some rotated videos (#33008) --- app/lib/video_metadata_extractor.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/lib/video_metadata_extractor.rb b/app/lib/video_metadata_extractor.rb index 2155766251..fda6405121 100644 --- a/app/lib/video_metadata_extractor.rb +++ b/app/lib/video_metadata_extractor.rb @@ -46,6 +46,9 @@ class VideoMetadataExtractor # For some video streams the frame_rate reported by `ffprobe` will be 0/0, but for these streams we # should use `r_frame_rate` instead. Video screencast generated by Gnome Screencast have this issue. @frame_rate ||= @r_frame_rate + # If the video has not been re-encoded by ffmpeg, it may contain rotation information, + # and we need to simulate applying it to the dimensions + @width, @height = @height, @width if video_stream[:side_data_list]&.any? { |x| x[:rotation].abs == 90 } end if (audio_stream = audio_streams.first) From e4d5cc0ca6a1b05b657da6862f49393a9c06b161 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 10:58:45 +0000 Subject: [PATCH 04/19] New Crowdin Translations (automated) (#33010) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/de.json | 6 +-- app/javascript/mastodon/locales/gd.json | 21 ++++++++ app/javascript/mastodon/locales/ig.json | 14 +++++- app/javascript/mastodon/locales/zh-CN.json | 58 +++++++++++----------- config/locales/doorkeeper.ig.yml | 10 ++++ config/locales/gd.yml | 15 ++++++ config/locales/ig.yml | 23 +++++++++ config/locales/simple_form.gd.yml | 1 + config/locales/simple_form.ig.yml | 7 +++ config/locales/simple_form.zh-CN.yml | 14 +++--- config/locales/zh-CN.yml | 24 ++++----- 11 files changed, 140 insertions(+), 53 deletions(-) diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 510cc821f3..e9bf6a4181 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -486,12 +486,12 @@ "mute_modal.hide_from_notifications": "Benachrichtigungen ausblenden", "mute_modal.hide_options": "Einstellungen ausblenden", "mute_modal.indefinite": "Bis ich die Stummschaltung aufhebe", - "mute_modal.show_options": "Einstellungen anzeigen", + "mute_modal.show_options": "Optionen anzeigen", "mute_modal.they_can_mention_and_follow": "Das Profil wird dich weiterhin erwähnen und dir folgen können, aber du wirst davon nichts sehen.", - "mute_modal.they_wont_know": "Es wird nicht erkennbar sein, dass dieses Profil stummgeschaltet wurde.", + "mute_modal.they_wont_know": "Das Profil wird nicht erkennen können, dass du es stummgeschaltet hast.", "mute_modal.title": "Profil stummschalten?", "mute_modal.you_wont_see_mentions": "Du wirst keine Beiträge sehen, die dieses Profil erwähnen.", - "mute_modal.you_wont_see_posts": "Deine Beiträge können weiterhin angesehen werden, aber du wirst deren Beiträge nicht mehr sehen.", + "mute_modal.you_wont_see_posts": "Deine Beiträge können von diesem stummgeschalteten Profil weiterhin gesehen werden, aber du wirst dessen Beiträge nicht mehr sehen.", "navigation_bar.about": "Über", "navigation_bar.administration": "Administration", "navigation_bar.advanced_interface": "Im erweiterten Webinterface öffnen", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 4f68737b14..f459f50a80 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -87,6 +87,25 @@ "alert.unexpected.title": "Oich!", "alt_text_badge.title": "Roghainn teacsa", "announcement.announcement": "Brath-fios", + "annual_report.summary.archetype.booster": "Brosnaiche", + "annual_report.summary.archetype.lurker": "Eala-bhalbh", + "annual_report.summary.archetype.oracle": "Coinneach Odhar", + "annual_report.summary.archetype.pollster": "Cunntair nam beachd", + "annual_report.summary.archetype.replier": "Ceatharnach nam freagairt", + "annual_report.summary.followers.followers": "luchd-leantainn", + "annual_report.summary.followers.total": "{count} gu h-iomlan", + "annual_report.summary.here_it_is": "Seo mar a chaidh {year} leat:", + "annual_report.summary.highlighted_post.by_favourites": "am post as annsa", + "annual_report.summary.highlighted_post.by_reblogs": "am post air a bhrosnachadh as trice", + "annual_report.summary.highlighted_post.by_replies": "am post dhan deach fhreagairt as trice", + "annual_report.summary.highlighted_post.possessive": "Aig {name},", + "annual_report.summary.most_used_app.most_used_app": "an aplacaid a chaidh a cleachdadh as trice", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "an taga hais a chaidh a cleachdadh as trice", + "annual_report.summary.most_used_hashtag.none": "Chan eil gin", + "annual_report.summary.new_posts.new_posts": "postaichean ùra", + "annual_report.summary.percentile.text": "Tha thu am measg brod nandhen luchd-cleachdaidh Mhastodon.", + "annual_report.summary.percentile.we_wont_tell_bernie": "Ainmeil ’nad latha ’s ’nad linn.", + "annual_report.summary.thanks": "Mòran taing airson conaltradh air Mastodon.", "attachments_list.unprocessed": "(gun phròiseasadh)", "audio.hide": "Falaich an fhuaim", "block_modal.remote_users_caveat": "Iarraidh sinn air an fhrithealaiche {domain} gun gèill iad ri do cho-dhùnadh. Gidheadh, chan eil barantas gun gèill iad on a làimhsicheas cuid a fhrithealaichean bacaidhean air dòigh eadar-dhealaichte. Dh’fhaoidte gum faic daoine gun chlàradh a-steach na postaichean poblach agad fhathast.", @@ -508,6 +527,8 @@ "notification.admin.report_statuses_other": "Rinn {name} gearan mu {target}", "notification.admin.sign_up": "Chlàraich {name}", "notification.admin.sign_up.name_and_others": "Chlàraich {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}}", + "notification.annual_report.message": "Tha #Wrapstodon {year} deiseil dhut! Thoir sùil air mar a chaidh leat air Mastodon am bliadhna!", + "notification.annual_report.view": "Seall #Wrapstodon", "notification.favourite": "Is annsa le {name} am post agad", "notification.favourite.name_and_others_with_link": "Is annsa le {name} ’s {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}} am post agad", "notification.follow": "Tha {name} ’gad leantainn a-nis", diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json index b8b0f1084d..bcd62187af 100644 --- a/app/javascript/mastodon/locales/ig.json +++ b/app/javascript/mastodon/locales/ig.json @@ -6,10 +6,14 @@ "account.follow": "Soro", "account.followers": "Ndị na-eso", "account.following": "Na-eso", + "account.go_to_profile": "Jee na profaịlụ", "account.mute": "Mee ogbi @{name}", + "account.posts": "Edemede", + "account.posts_with_replies": "Edemede na nzaghachị", "account.unfollow": "Kwụsị iso", "account_note.placeholder": "Click to add a note", "admin.dashboard.retention.cohort_size": "Ojiarụ ọhụrụ", + "annual_report.summary.new_posts.new_posts": "edemede ọhụrụ", "audio.hide": "Zoo ụda", "bundle_column_error.retry": "Nwaa ọzọ", "bundle_column_error.routing.title": "404", @@ -46,6 +50,7 @@ "confirmations.reply.confirm": "Zaa", "confirmations.unfollow.confirm": "Kwụsị iso", "conversation.delete": "Hichapụ nkata", + "conversation.open": "Lelee nkata", "disabled_account_banner.account_settings": "Mwube akaụntụ", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", @@ -62,8 +67,10 @@ "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", "errors.unexpected_crash.report_issue": "Kpesa nsogbu", "explore.trending_links": "Akụkọ", + "filter_modal.added.review_and_configure_title": "Mwube myọ", "firehose.all": "Ha niine", "follow_request.authorize": "Nye ikike", + "follow_suggestions.view_all": "Lelee ha ncha", "footer.privacy_policy": "Iwu nzuzu", "getting_started.heading": "Mbido", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", @@ -85,7 +92,7 @@ "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.my_profile": "Mepe profaịlụ gị", "keyboard_shortcuts.notifications": "to open notifications column", "keyboard_shortcuts.open_media": "to open media", "keyboard_shortcuts.pinned": "to open pinned posts list", @@ -112,6 +119,7 @@ "navigation_bar.lists": "Ndepụta", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "notification.reblog": "{name} boosted your status", + "notifications.column_settings.status": "Edemede ọhụrụ:", "onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_home": "Go to your home feed", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", @@ -124,7 +132,7 @@ "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", "onboarding.steps.setup_profile.title": "Customize your profile", "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", - "onboarding.steps.share_profile.title": "Share your profile", + "onboarding.steps.share_profile.title": "Kekọrịta profaịlụ Mastọdọnụ gị", "privacy.change": "Adjust status privacy", "relative_time.full.just_now": "kịta", "relative_time.just_now": "kịta", @@ -132,6 +140,7 @@ "reply_indicator.cancel": "Kagbuo", "report.categories.other": "Ọzọ", "report.categories.spam": "Nzipụ Ozièlètrọniìk Nkeāchọghị", + "report.category.title_account": "profaịlụ", "report.mute": "Mee ogbi", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", @@ -139,6 +148,7 @@ "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", "report_notification.categories.other": "Ọzọ", "search.placeholder": "Chọọ", + "search_results.accounts": "Profaịlụ", "server_banner.active_users": "ojiarụ dị ìrè", "sign_in_banner.sign_in": "Sign in", "status.admin_status": "Open this status in the moderation interface", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index cc0f0b9341..463167e8f8 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -11,7 +11,7 @@ "about.not_available": "此信息在当前服务器尚不可用。", "about.powered_by": "由 {mastodon} 驱动的去中心化社交媒体", "about.rules": "站点规则", - "account.account_note_header": "个人备注", + "account.account_note_header": "备注", "account.add_or_remove_from_list": "从列表中添加或移除", "account.badges.bot": "机器人", "account.badges.group": "群组", @@ -36,7 +36,7 @@ "account.followers.empty": "目前无人关注此用户。", "account.followers_counter": "{count, plural, other {{counter} 关注者}}", "account.following": "正在关注", - "account.following_counter": "正在关注 {count, plural, other {{counter} 人}}", + "account.following_counter": "{count, plural, other {{counter} 正在关注}}", "account.follows.empty": "此用户目前未关注任何人。", "account.go_to_profile": "前往个人资料页", "account.hide_reblogs": "隐藏来自 @{name} 的转嘟", @@ -139,7 +139,7 @@ "column.about": "关于", "column.blocks": "屏蔽的用户", "column.bookmarks": "书签", - "column.community": "本站时间轴", + "column.community": "本站时间线", "column.direct": "私下提及", "column.directory": "浏览用户资料", "column.domain_blocks": "已屏蔽的域名", @@ -151,7 +151,7 @@ "column.mutes": "已隐藏的用户", "column.notifications": "通知", "column.pins": "置顶嘟文", - "column.public": "跨站公共时间轴", + "column.public": "跨站公共时间线", "column_back_button.label": "返回", "column_header.hide_settings": "隐藏设置", "column_header.moveLeft_settings": "将此栏左移", @@ -192,15 +192,15 @@ "confirmations.block.confirm": "屏蔽", "confirmations.delete.confirm": "删除", "confirmations.delete.message": "你确定要删除这条嘟文吗?", - "confirmations.delete.title": "确认删除嘟文?", + "confirmations.delete.title": "是否删除嘟文?", "confirmations.delete_list.confirm": "删除", - "confirmations.delete_list.message": "确定永久删除这个列表吗?", - "confirmations.delete_list.title": "确认删除列表?", + "confirmations.delete_list.message": "你确定要永久删除此列表吗?", + "confirmations.delete_list.title": "是否删除列表?", "confirmations.discard_edit_media.confirm": "丢弃", "confirmations.discard_edit_media.message": "你还有未保存的媒体描述或预览修改,仍要丢弃吗?", "confirmations.edit.confirm": "编辑", "confirmations.edit.message": "编辑此消息将会覆盖当前正在撰写的信息。仍要继续吗?", - "confirmations.edit.title": "确认覆盖嘟文?", + "confirmations.edit.title": "是否重写嘟文?", "confirmations.logout.confirm": "退出登录", "confirmations.logout.message": "确定要退出登录吗?", "confirmations.logout.title": "是否退出登录?", @@ -210,13 +210,13 @@ "confirmations.redraft.title": "是否删除并重新编辑嘟文?", "confirmations.reply.confirm": "回复", "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?", - "confirmations.reply.title": "确认覆盖嘟文?", + "confirmations.reply.title": "是否重写嘟文?", "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", "confirmations.unfollow.title": "是否取消关注用户?", - "content_warning.hide": "隐藏嘟文", - "content_warning.show": "仍然显示", - "content_warning.show_more": "显示更多", + "content_warning.hide": "隐藏", + "content_warning.show": "展开", + "content_warning.show_more": "展开", "conversation.delete": "删除对话", "conversation.mark_as_read": "标记为已读", "conversation.open": "查看对话", @@ -235,13 +235,13 @@ "dismissable_banner.explore_links": "这些新闻故事正被本站和分布式网络上其他站点的用户谈论。", "dismissable_banner.explore_statuses": "这些是目前在社交网络上引起关注的嘟文。嘟文的喜欢和转嘟次数越多,排名越高。", "dismissable_banner.explore_tags": "这些标签正在本站和分布式网络上其他站点的用户中引起关注。", - "dismissable_banner.public_timeline": "这些是在 {domain} 上关注的人们最新发布的公开嘟文。", + "dismissable_banner.public_timeline": "这些是 {domain} 上的用户关注的人的最新公开嘟文。", "domain_block_modal.block": "屏蔽服务器", "domain_block_modal.block_account_instead": "改为屏蔽 @{name}", "domain_block_modal.they_can_interact_with_old_posts": "来自该服务器的人可以与你之前的嘟文交互。", "domain_block_modal.they_cant_follow": "此服务器上没有人可以关注你。", "domain_block_modal.they_wont_know": "对方不会知道自己被屏蔽。", - "domain_block_modal.title": "屏蔽该域名?", + "domain_block_modal.title": "是否屏蔽该域名?", "domain_block_modal.you_will_lose_num_followers": "你将失去 {followersCount, plural, other {{followersCountDisplay} 名关注者}}和 {followingCount, plural, other {{followingCountDisplay} 名关注}}。", "domain_block_modal.you_will_lose_relationships": "你将失去在此实例上的所有关注和关注者。", "domain_block_modal.you_wont_see_posts": "你将不会看到此服务器上用户的嘟文或通知。", @@ -259,7 +259,7 @@ "domain_pill.your_server": "你的数字家园,你的所有嘟文都存放在这里。不喜欢这个服务器吗?随时带上你的关注者一起迁移到其它服务器。", "domain_pill.your_username": "你在这个服务器上的唯一标识符。不同服务器上可能会存在相同用户名的用户。", "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。", - "embed.preview": "它会像这样显示出来:", + "embed.preview": "这是它的预览效果:", "emoji_button.activity": "活动", "emoji_button.clear": "清除", "emoji_button.custom": "自定义", @@ -274,14 +274,14 @@ "emoji_button.search": "搜索…", "emoji_button.search_results": "搜索结果", "emoji_button.symbols": "符号", - "emoji_button.travel": "旅行和地点", - "empty_column.account_hides_collections": "该用户选择不提供此信息", + "emoji_button.travel": "旅行与地点", + "empty_column.account_hides_collections": "该用户选择不公开此信息", "empty_column.account_suspended": "账户已被停用", "empty_column.account_timeline": "这里没有嘟文!", "empty_column.account_unavailable": "个人资料不可用", "empty_column.blocks": "你还未屏蔽任何用户。", - "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加过书签。在你添加书签后,嘟文就会显示在这里。", - "empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!", + "empty_column.bookmarked_statuses": "你还没有收藏任何嘟文。收藏后嘟文就会显示在这里。", + "empty_column.community": "本站时间线还没有内容,写点什么并公开发布,让它活跃起来吧!", "empty_column.direct": "你还未使用过私下提及。当你发出或者收到私下提及时,它将显示在此。", "empty_column.domain_blocks": "暂且没有被屏蔽的站点。", "empty_column.explore_statuses": "目前没有热门内容,稍后再来看看吧!", @@ -290,7 +290,7 @@ "empty_column.follow_requests": "你还没有收到任何关注请求。当你收到一个关注请求时,它会出现在这里。", "empty_column.followed_tags": "你还没有关注任何话题标签。 当你关注后,它们会出现在这里。", "empty_column.hashtag": "这个话题标签下暂时没有内容。", - "empty_column.home": "你的主页时间线是空的!快去关注更多人吧。 {suggestions}", + "empty_column.home": "你的主页时间线还没有内容!快去关注更多人吧。", "empty_column.list": "列表中还没有任何内容。当列表成员发布新嘟文时,它们将出现在这里。", "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。", "empty_column.mutes": "你没有隐藏任何用户。", @@ -349,7 +349,7 @@ "follow_suggestions.similar_to_recently_followed_longer": "与你近期关注的用户相似", "follow_suggestions.view_all": "查看全部", "follow_suggestions.who_to_follow": "推荐关注", - "followed_tags": "关注的话题标签", + "followed_tags": "已关注话题标签", "footer.about": "关于", "footer.directory": "用户目录", "footer.get_app": "获取应用", @@ -432,12 +432,12 @@ "keyboard_shortcuts.enter": "展开嘟文", "keyboard_shortcuts.favourite": "喜欢嘟文", "keyboard_shortcuts.favourites": "打开喜欢列表", - "keyboard_shortcuts.federated": "打开跨站时间轴", + "keyboard_shortcuts.federated": "打开跨站时间线", "keyboard_shortcuts.heading": "快捷键列表", - "keyboard_shortcuts.home": "打开主页时间轴", + "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": "打开你的个人资料", @@ -497,7 +497,7 @@ "navigation_bar.advanced_interface": "在高级网页界面中打开", "navigation_bar.blocks": "已屏蔽的用户", "navigation_bar.bookmarks": "书签", - "navigation_bar.community_timeline": "本站时间轴", + "navigation_bar.community_timeline": "本站时间线", "navigation_bar.compose": "撰写新嘟文", "navigation_bar.direct": "私下提及", "navigation_bar.discover": "发现", @@ -516,7 +516,7 @@ "navigation_bar.personal": "个人", "navigation_bar.pins": "置顶嘟文", "navigation_bar.preferences": "偏好设置", - "navigation_bar.public_timeline": "跨站公共时间轴", + "navigation_bar.public_timeline": "跨站公共时间线", "navigation_bar.search": "搜索", "navigation_bar.security": "安全", "not_signed_in_indicator.not_signed_in": "你需要登录才能访问此资源。", @@ -693,7 +693,7 @@ "privacy.private.short": "关注者", "privacy.public.long": "所有 Mastodon 内外的人", "privacy.public.short": "公开", - "privacy.unlisted.additional": "该模式的行为与“公开”完全相同,只是帖子不会出现在实时动态、话题标签、探索或 Mastodon 搜索中,即使你已在账户级设置中选择加入。", + "privacy.unlisted.additional": "该模式的行为与“公开”完全相同,只是嘟文不会出现在实时动态、话题标签、探索或 Mastodon 搜索中,即使你已在账户级设置中选择加入。", "privacy.unlisted.long": "减少算法影响", "privacy.unlisted.short": "悄悄公开", "privacy_policy.last_updated": "最近更新于 {date}", @@ -747,7 +747,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 上能看到哪些内容的选项:", @@ -856,7 +856,7 @@ "status.uncached_media_warning": "预览不可用", "status.unmute_conversation": "恢复此对话的通知提醒", "status.unpin": "在个人资料页面取消置顶", - "subscribed_languages.lead": "更改此选择后,仅选定语言的嘟文会出现在你的主页和列表时间轴上。选择「无」将接收所有语言的嘟文。", + "subscribed_languages.lead": "更改此选择后,只有选定语言的嘟文才会出现在你的主页和列表时间线上。选择「无」将显示所有语言的嘟文。", "subscribed_languages.save": "保存更改", "subscribed_languages.target": "更改 {target} 的订阅语言", "tabs_bar.home": "主页", diff --git a/config/locales/doorkeeper.ig.yml b/config/locales/doorkeeper.ig.yml index 7c264f0d73..ef11972aed 100644 --- a/config/locales/doorkeeper.ig.yml +++ b/config/locales/doorkeeper.ig.yml @@ -1 +1,11 @@ +--- ig: + doorkeeper: + grouped_scopes: + title: + filters: Myọ + profile: Profaịlụ Mastọdọnụ gị + scopes: + read:filters: lelee myọ gị + write:accounts: dezie profaịlụ gị + write:filters: mepụta myọ diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 78f4516cfc..7581f6c856 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -193,6 +193,7 @@ gd: create_domain_block: Cruthaich bacadh àrainne create_email_domain_block: Cruthaich bacadh àrainne puist-d create_ip_block: Cruthaich riaghailt IP + create_relay: Cruthaich ath-sheachadan create_unavailable_domain: Cruthaich àrainn nach eil ri fhaighinn create_user_role: Cruthaich dreuchd demote_user: Ìslich an cleachdaiche @@ -204,14 +205,17 @@ gd: destroy_email_domain_block: Sguab às bacadh na h-àrainne puist-d destroy_instance: Purgaidich an àrainn destroy_ip_block: Sguab às an riaghailt IP + destroy_relay: Sguab às an t-ath-sheachadan destroy_status: Sguab às am post destroy_unavailable_domain: Sguab às àrainn nach eil ri fhaighinn destroy_user_role: Mill an dreuchd disable_2fa_user: Cuir an dearbhadh dà-cheumnach à comas disable_custom_emoji: Cuir an t-Emoji gnàthaichte à comas + disable_relay: Cuir an t-ath-sheachadan à comas disable_sign_in_token_auth_user: Cuir à comas dearbhadh le tòcan puist-d dhan chleachdaiche disable_user: Cuir an cleachdaiche à comas enable_custom_emoji: Cuir an t-Emoji gnàthaichte an comas + enable_relay: Cuir an ath-sheachadan an comas enable_sign_in_token_auth_user: Cuir an comas dearbhadh le tòcan puist-d dhan chleachdaiche enable_user: Cuir an cleachdaiche an comas memorialize_account: Dèan cuimhneachan dhen chunntas @@ -253,6 +257,7 @@ gd: create_domain_block_html: Bhac %{name} an àrainn %{target} create_email_domain_block_html: Bhac %{name} an àrainn puist-d %{target} create_ip_block_html: Chruthaich %{name} riaghailt dhan IP %{target} + create_relay_html: Chruthaich %{name} an t-ath-sheachadan %{target} create_unavailable_domain_html: Sguir %{name} ris an lìbhrigeadh dhan àrainn %{target} create_user_role_html: Chruthaich %{name} an dreuchd %{target} demote_user_html: Dh’ìslich %{name} an cleachdaiche %{target} @@ -264,14 +269,17 @@ gd: destroy_email_domain_block_html: Dì-bhac %{name} an àrainn puist-d %{target} destroy_instance_html: Phurgaidich %{name} an àrainn %{target} destroy_ip_block_html: Sguab %{name} às riaghailt dhan IP %{target} + destroy_relay_html: Sguab %{name} às an t-ath-sheachadan %{target} destroy_status_html: Thug %{name} post aig %{target} air falbh destroy_unavailable_domain_html: Lean %{name} air adhart leis an lìbhrigeadh dhan àrainn %{target} destroy_user_role_html: Sguab %{name} às an dreuchd %{target} disable_2fa_user_html: Chuir %{name} riatanas an dearbhaidh dà-cheumnaich à comas dhan chleachdaiche %{target} disable_custom_emoji_html: Chuir %{name} an Emoji %{target} à comas + disable_relay_html: Chuir %{name} an t-ath-sheachadan %{target} à comas disable_sign_in_token_auth_user_html: Chuir %{name} à comas dearbhadh le tòcan puist-d dha %{target} disable_user_html: Chuir %{name} an clàradh a-steach à comas dhan chleachdaiche %{target} enable_custom_emoji_html: Chuir %{name} an Emoji %{target} an comas + enable_relay_html: Chuir %{name} an t-ath-sheachadan %{target} an comas enable_sign_in_token_auth_user_html: Chuir %{name} an comas dearbhadh le tòcan puist-d dha %{target} enable_user_html: Chuir %{name} an clàradh a-steach an comas dhan chleachdaiche %{target} memorialize_account_html: Rinn %{name} duilleag cuimhneachain dhen chunntas aig %{target} @@ -846,8 +854,10 @@ gd: back_to_account: Till gu duilleag a’ chunntais back_to_report: Till gu duilleag a’ ghearain batch: + add_to_report: 'Cuir ris a’ ghearan #%{id}' remove_from_report: Thoir air falbh on ghearan report: Gearan + contents: Susbaint deleted: Chaidh a sguabadh às favourites: Annsachdan history: Eachdraidh nan tionndadh @@ -856,12 +866,17 @@ gd: media: title: Meadhanan metadata: Meata-dàta + no_history: Cha deach am post seo a dheasachadh no_status_selected: Cha deach post sam bith atharrachadh o nach deach gin dhiubh a thaghadh open: Fosgail am post original_status: Am post tùsail reblogs: Brosnachaidhean + replied_to_html: Freagairt do %{acct_link} status_changed: Post air atharrachadh + status_title: Post le @%{name} + title: Postaichean a’ chunntais – @%{name} trending: A’ treandadh + view_publicly: Seall gu poblach visibility: Faicsinneachd with_media: Le meadhanan riutha strikes: diff --git a/config/locales/ig.yml b/config/locales/ig.yml index 9db771fdcf..81d425916c 100644 --- a/config/locales/ig.yml +++ b/config/locales/ig.yml @@ -1,5 +1,28 @@ --- ig: + admin: + settings: + discovery: + profile_directory: Ndekọ profaịlụ + admin_mailer: + new_trends: + new_trending_statuses: + title: Edemede na-ewu ewu + application_mailer: + view_profile: Lelee profaịlụ filters: contexts: + account: Profaịlụ home: Ụlọ na ndepụta + edit: + title: Dezie myọ + index: + delete: Hichapụ + empty: Ị nweghi myọ ọbụla. + title: Myọ + settings: + edit_profile: Dezie profaịlụ gị + profile: Profaịlụ ọha + user_mailer: + welcome: + share_title: Kekọrịta profaịlụ Mastọdọnụ gị diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 4083469b63..4c3a297738 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -10,6 +10,7 @@ gd: indexable: Faodaidh na postaichean poblach agad a nochdadh am measg toraidhean luirg air Mastodon. ’S urrainn dhan fheadhainn a rinn eadar-ghabhail leis na postaichean agad lorg annta air a h-uile dòigh. note: "’S urrainn dhut @iomradh a thoirt air càch no air #tagaicheanHais." show_collections: "’S urrainn do chàch na dàimhean leantainn agad a rùrachadh. Chì daoine a leanas tu gu bheil thu ’gan leantainn air a h-uile dòigh." + unlocked: "’S urrainnear do leantainn gun aonta iarraidh. Thoir a’ chromag air falbh ma tha thu airson lèirmheas a dhèanamh air iarrtasan leantainn agus cur romhad an gabh thu ri luchd-leantainn ùr no an diùilt thu iad." account_alias: acct: Sònraich ainm-cleachdaiche@àrainn dhen chunntas a tha thu airson imrich uaithe account_migration: diff --git a/config/locales/simple_form.ig.yml b/config/locales/simple_form.ig.yml index 7c264f0d73..e88d195b8a 100644 --- a/config/locales/simple_form.ig.yml +++ b/config/locales/simple_form.ig.yml @@ -1 +1,8 @@ +--- ig: + simple_form: + labels: + defaults: + avatar: Foto profaịlụ + chosen_languages: Myọcha asụsụ + context: Myọcha ọnọdụ diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 0b7edae913..61de577709 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -61,7 +61,7 @@ zh-CN: setting_display_media_hide_all: 始终隐藏媒体 setting_display_media_show_all: 始终显示媒体 setting_use_blurhash: 渐变是基于模糊后的隐藏内容生成的 - setting_use_pending_items: 关闭自动滚动更新,时间轴会在点击后更新 + setting_use_pending_items: 点击查看时间线更新,而非自动滚动更新动态。 username: 你只能使用字母、数字和下划线 whole_word: 如果关键词只包含字母和数字,将只在词语完全匹配时才会应用 domain_allow: @@ -80,7 +80,7 @@ zh-CN: activity_api_enabled: 本站每周的嘟文数、活跃用户数和新注册用户数 app_icon: WEBP、PNG、GIF 或 JPG。使用自定义图标覆盖移动设备上的默认应用图标。 backups_retention_period: 用户可以生成其嘟文存档以供之后下载。当该值被设为正值时,这些存档将在指定的天数后自动从你的存储中删除。 - bootstrap_timeline_accounts: 这些账号将在新用户关注推荐中置顶。 + bootstrap_timeline_accounts: 这些账号将在新用户关注推荐中置顶显示。 closed_registrations_message: 在关闭注册时显示 content_cache_retention_period: 来自其它实例的所有嘟文(包括转嘟与回复)都将在指定天数后被删除,不论本实例用户是否与这些嘟文产生过交互。这包括被本实例用户喜欢和收藏的嘟文。实例间用户的私下提及也将丢失并无法恢复。此设置针对的是特殊用途的实例,用于一般用途时会打破许多用户的期望。 custom_css: 你可以为网页版 Mastodon 应用自定义样式。 @@ -99,7 +99,7 @@ zh-CN: status_page_url: 配置一个网址,当服务中断时,人们可以通过该网址查看服务器的状态。 theme: 给未登录访客和新用户使用的主题。 thumbnail: 与服务器信息一并展示的约 2:1 比例的图像。 - timeline_preview: 未登录访客将能够浏览服务器上最新的公共嘟文。 + timeline_preview: 未登录访客将能够浏览服务器上的最新公开嘟文。 trendable_by_default: 跳过对热门内容的手工审核。个别项目仍可在之后从趋势中删除。 trends: 热门页中会显示正在你服务器上受到关注的嘟文、标签和新闻故事。 trends_as_landing_page: 向注销的用户和访问者显示热门内容,而不是对该服务器的描述,需要启用热门。 @@ -130,7 +130,7 @@ zh-CN: tag: name: 你只能改变字母的大小写,让它更易读 user: - chosen_languages: 仅选中语言的嘟文会出现在公共时间轴上(全不选则显示所有语言的嘟文) + chosen_languages: 仅选中语言的嘟文会出现在公共时间线上(全不选则显示所有语言的嘟文) role: 角色用于控制用户拥有的权限。 user_role: color: 在界面各处用于标记该角色的颜色,以十六进制 RGB 格式表示 @@ -205,7 +205,7 @@ zh-CN: password: 密码 phrase: 关键词 setting_advanced_layout: 启用高级 Web 界面 - setting_aggregate_reblogs: 在时间轴中合并转嘟 + setting_aggregate_reblogs: 在时间线中合并转嘟 setting_always_send_emails: 总是发送电子邮件通知 setting_auto_play_gif: 自动播放 GIF 动画 setting_boost_modal: 在转嘟前询问我 @@ -247,7 +247,7 @@ zh-CN: activity_api_enabled: 在 API 中发布有关用户活动的汇总统计数据 app_icon: 应用图标 backups_retention_period: 用户存档保留期 - bootstrap_timeline_accounts: 推荐新用户关注以下账号 + bootstrap_timeline_accounts: 向新用户推荐以下账号 closed_registrations_message: 在关闭注册时显示的自定义消息 content_cache_retention_period: 外站内容保留期 custom_css: 自定义 CSS @@ -269,7 +269,7 @@ zh-CN: status_page_url: 状态页网址 theme: 默认主题 thumbnail: 本站缩略图 - timeline_preview: 时间轴预览 + timeline_preview: 允许未登录用户访问公共时间线 trendable_by_default: 允许在未审核的情况下将话题置为热门 trends: 启用热门 trends_as_landing_page: 使用热门页作为登陆页面 diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 7dc0f3d949..1623f39ad6 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -602,7 +602,7 @@ zh-CN: actions_description_html: 决定采取何种措施处理此举报。如果对被举报账号采取惩罚性措施,将向其发送一封电子邮件通知。但若选中垃圾信息类别则不会发送通知。 actions_description_remote_html: 决定采取何种行动来解决此举报。 这只会影响你的服务器如何与该远程账户的通信并处理其内容。 actions_no_posts: 该举报没有相关嘟文可供删除 - add_to_report: 增加更多举报内容 + add_to_report: 添加更多内容到举报 already_suspended_badges: local: 已在此服务器上被封禁 remote: 已在其所属服务器被封禁 @@ -660,8 +660,8 @@ zh-CN: mark_as_sensitive_html: 将违规嘟文的媒体标记为敏感 silence_html: 严格限制 @%{acct} 的影响力,方法是让他们的个人资料和内容仅对已经关注他们的人可见,或手动查找其个人资料时 suspend_html: 暂停 @%{acct},使他们的个人资料和内容无法访问,也无法与之互动 - close_report: '将报告 #%{id} 标记为已解决' - close_reports_html: 将针对 @%{acct}所有 报告标记为已解决 + close_report: '将举报 #%{id} 标记为已解决' + close_reports_html: 将针对 @%{acct}所有举报标记为已解决 delete_data_html: 从现在起 30 天后删除 @%{acct} 的个人资料和内容,除非他们同时解除暂停。 preview_preamble_html: "@%{acct} 将收到包含以下内容的警告:" record_strike_html: 记录一次针对 @%{acct} 的警示,以帮助你在这个账户上的未来违规事件中得到重视。 @@ -766,7 +766,7 @@ zh-CN: follow_recommendations: 关注推荐 preamble: 露出有趣的内容有助于新加入 Mastodon 的用户融入。可在这里控制多种发现功能如何在你的服务器上工作。 profile_directory: 个人资料目录 - public_timelines: 公共时间轴 + public_timelines: 公共时间线 publish_discovered_servers: 已公开实例的服务器 publish_statistics: 发布统计数据 title: 发现 @@ -813,7 +813,7 @@ zh-CN: back_to_report: 返回举报页 batch: add_to_report: '添加到举报 #%{id}' - remove_from_report: 从报告中移除 + remove_from_report: 从举报中移除 report: 举报 contents: 内容 deleted: 已删除 @@ -1055,7 +1055,7 @@ zh-CN: remove: 取消关联别名 appearance: advanced_web_interface: 高级 Web 界面 - advanced_web_interface_hint: 如果你想使用整个屏幕宽度,高级 web 界面允许你配置多个不同的栏目,可以同时看到更多的信息:主页、通知、跨站时间轴、任意数量的列表和话题标签。 + advanced_web_interface_hint: 如果你想使用整个屏幕宽度,高级 web 界面允许你配置多个不同的栏目,可以同时看到更多的信息:主页、通知、跨站时间线、任意数量的列表和话题标签。 animations_and_accessibility: 动画与可访问性 confirmation_dialogs: 确认对话框 discovery: 发现 @@ -1286,9 +1286,9 @@ zh-CN: filters: contexts: account: 个人资料 - home: 主页时间轴 + home: 主页时间线 notifications: 通知 - public: 公共时间轴 + public: 公共时间线 thread: 对话 edit: add_keyword: 添加关键词 @@ -1585,7 +1585,7 @@ zh-CN: preferences: other: 其他 posting_defaults: 发布默认值 - public_timelines: 公共时间轴 + public_timelines: 公共时间线 privacy: hint_html: "自定义你希望如何找到你的个人资料和嘟文。启用Mastodon中的各种功能可以帮助你扩大受众范围。请花点时间查看这些设置,确保它们适合你的使用情况。" privacy: 隐私 @@ -1699,7 +1699,7 @@ zh-CN: development: 开发 edit_profile: 更改个人资料 export: 导出 - featured_tags: 精选的话题标签 + featured_tags: 精选话题标签 import: 导入 import_and_export: 导入与导出 migrate: 账户迁移 @@ -1752,9 +1752,9 @@ zh-CN: private: 仅关注者 private_long: 只有关注你的用户能看到 public: 公开 - public_long: 所有人可见,并会出现在公共时间轴上 + public_long: 所有人可见,并会出现在公共时间线上 unlisted: 悄悄公开 - unlisted_long: 所有人可见,但不会出现在公共时间轴上 + unlisted_long: 对所有人可见,但不出现在公共时间线上 statuses_cleanup: enabled: 自动删除旧嘟文 enabled_hint: 达到指定过期时间后自动删除你的嘟文,除非满足下列条件之一 From 4517e18b79d3e7579015264d031040e712e15e08 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Thu, 21 Nov 2024 14:48:30 +0100 Subject: [PATCH 05/19] Update dependency doorkeeper to v5.8.0 (#33000) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- app/lib/oauth_pre_authorization_extension.rb | 13 ------------- app/presenters/oauth_metadata_presenter.rb | 2 +- config/application.rb | 1 - config/initializers/doorkeeper.rb | 3 +++ spec/requests/well_known/oauth_metadata_spec.rb | 2 +- spec/system/oauth_spec.rb | 2 ++ 7 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 app/lib/oauth_pre_authorization_extension.rb diff --git a/Gemfile.lock b/Gemfile.lock index bb503e157e..d005c744cc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -200,7 +200,7 @@ GEM activerecord (>= 4.2, < 9.0) docile (1.4.1) domain_name (0.6.20240107) - doorkeeper (5.7.1) + doorkeeper (5.8.0) railties (>= 5) dotenv (3.1.4) drb (2.2.1) diff --git a/app/lib/oauth_pre_authorization_extension.rb b/app/lib/oauth_pre_authorization_extension.rb deleted file mode 100644 index 1885e0823d..0000000000 --- a/app/lib/oauth_pre_authorization_extension.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module OauthPreAuthorizationExtension - extend ActiveSupport::Concern - - included do - validate :code_challenge_method_s256, error: Doorkeeper::Errors::InvalidCodeChallengeMethod - end - - def validate_code_challenge_method_s256 - code_challenge.blank? || code_challenge_method == 'S256' - end -end diff --git a/app/presenters/oauth_metadata_presenter.rb b/app/presenters/oauth_metadata_presenter.rb index 7d75e8498a..f488a62925 100644 --- a/app/presenters/oauth_metadata_presenter.rb +++ b/app/presenters/oauth_metadata_presenter.rb @@ -65,7 +65,7 @@ class OauthMetadataPresenter < ActiveModelSerializers::Model end def code_challenge_methods_supported - %w(S256) + doorkeeper.pkce_code_challenge_methods_supported end private diff --git a/config/application.rb b/config/application.rb index cfeed02e98..e4e9680e66 100644 --- a/config/application.rb +++ b/config/application.rb @@ -114,7 +114,6 @@ module Mastodon Doorkeeper::Application.include ApplicationExtension Doorkeeper::AccessGrant.include AccessGrantExtension Doorkeeper::AccessToken.include AccessTokenExtension - Doorkeeper::OAuth::PreAuthorization.include OauthPreAuthorizationExtension Devise::FailureApp.include AbstractController::Callbacks Devise::FailureApp.include Localized end diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index de1c75f576..516db258df 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -52,6 +52,9 @@ Doorkeeper.configure do # Issue access tokens with refresh token (disabled by default) # use_refresh_token + # Proof of Key Code Exchange + pkce_code_challenge_methods ['S256'] + # Forbids creating/updating applications with arbitrary scopes that are # not in configuration, i.e. `default_scopes` or `optional_scopes`. # (Disabled by default) diff --git a/spec/requests/well_known/oauth_metadata_spec.rb b/spec/requests/well_known/oauth_metadata_spec.rb index 01e9146fde..42a6c1b328 100644 --- a/spec/requests/well_known/oauth_metadata_spec.rb +++ b/spec/requests/well_known/oauth_metadata_spec.rb @@ -27,7 +27,7 @@ RSpec.describe 'The /.well-known/oauth-authorization-server request' do response_modes_supported: Doorkeeper.configuration.authorization_response_flows.flat_map(&:response_mode_matches).uniq, token_endpoint_auth_methods_supported: %w(client_secret_basic client_secret_post), grant_types_supported: grant_types_supported, - code_challenge_methods_supported: ['S256'], + code_challenge_methods_supported: Doorkeeper.configuration.pkce_code_challenge_methods_supported, # non-standard extension: app_registration_endpoint: api_v1_apps_url ) diff --git a/spec/system/oauth_spec.rb b/spec/system/oauth_spec.rb index 14ffc163f0..caed5ea9af 100644 --- a/spec/system/oauth_spec.rb +++ b/spec/system/oauth_spec.rb @@ -115,6 +115,8 @@ RSpec.describe 'Using OAuth from an external app' do subject within '.form-container .flash-message' do + # FIXME: Replace with doorkeeper.errors.messages.invalid_code_challenge_method.one for Doorkeeper > 5.8.0 + # see: https://github.com/doorkeeper-gem/doorkeeper/pull/1747 expect(page).to have_content(I18n.t('doorkeeper.errors.messages.invalid_code_challenge_method')) end end From dbddd40c1c69e66c6b11cd7b42de2a69456581d6 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Nov 2024 15:06:57 +0100 Subject: [PATCH 06/19] Add stop-gap antispam code (#32981) --- app/lib/antispam.rb | 45 +++++++++++++++++++++++++++++ app/services/post_status_service.rb | 8 +++++ 2 files changed, 53 insertions(+) create mode 100644 app/lib/antispam.rb diff --git a/app/lib/antispam.rb b/app/lib/antispam.rb new file mode 100644 index 0000000000..bc4841280f --- /dev/null +++ b/app/lib/antispam.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +class Antispam + include Redisable + + ACCOUNT_AGE_EXEMPTION = 1.week.freeze + + class SilentlyDrop < StandardError + attr_reader :status + + def initialize(status) + super() + + @status = status + + status.created_at = Time.now.utc + status.id = Mastodon::Snowflake.id_at(status.created_at) + status.in_reply_to_account_id = status.thread&.account_id + + status.delete # Make sure this is not persisted + end + end + + def local_preflight_check!(status) + return unless spammy_texts.any? { |spammy_text| status.text.include?(spammy_text) } + return unless status.thread.present? && !status.thread.account.following?(status.account) + return unless status.account.created_at >= ACCOUNT_AGE_EXEMPTION.ago + + report_if_needed!(status.account) + + raise SilentlyDrop, status + end + + private + + def spammy_texts + redis.smembers('antispam:spammy_texts') + end + + def report_if_needed!(account) + return if Report.unresolved.exists?(account: Account.representative, target_account: account) + + Report.create!(account: Account.representative, target_account: account, category: :spam, comment: 'Account automatically reported for posting a banned URL') + end +end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index ee6b18c74c..765c80723e 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -36,6 +36,8 @@ class PostStatusService < BaseService @text = @options[:text] || '' @in_reply_to = @options[:thread] + @antispam = Antispam.new + return idempotency_duplicate if idempotency_given? && idempotency_duplicate? validate_media! @@ -55,6 +57,8 @@ class PostStatusService < BaseService end @status + rescue Antispam::SilentlyDrop => e + e.status end private @@ -74,6 +78,7 @@ class PostStatusService < BaseService @status = @account.statuses.new(status_attributes) process_mentions_service.call(@status, save_records: false) safeguard_mentions!(@status) + @antispam.local_preflight_check!(@status) # The following transaction block is needed to wrap the UPDATEs to # the media attachments when the status is created @@ -95,6 +100,7 @@ class PostStatusService < BaseService def schedule_status! status_for_validation = @account.statuses.build(status_attributes) + @antispam.local_preflight_check!(status_for_validation) if status_for_validation.valid? # Marking the status as destroyed is necessary to prevent the status from being @@ -111,6 +117,8 @@ class PostStatusService < BaseService else raise ActiveRecord::RecordInvalid end + rescue Antispam::SilentlyDrop + @status = @account.scheduled_status.new(scheduled_status_attributes).tap(&:delete) end def postprocess_status! From 73850168373366376f3907299b2c32469d287180 Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Thu, 21 Nov 2024 15:37:25 +0100 Subject: [PATCH 07/19] `rel="me"` check should be case-insenstive (#32238) --- app/lib/link_details_extractor.rb | 2 +- app/lib/nokogiri_handler.rb | 12 ++++++++++++ app/services/fetch_resource_service.rb | 2 +- app/services/verify_link_service.rb | 2 +- spec/services/verify_link_service_spec.rb | 15 +++++++++++++++ 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 app/lib/nokogiri_handler.rb diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb index e4e815c38d..56533f6553 100644 --- a/app/lib/link_details_extractor.rb +++ b/app/lib/link_details_extractor.rb @@ -237,7 +237,7 @@ class LinkDetailsExtractor end def link_tag(name) - document.xpath("//link[@rel=\"#{name}\"]").pick('href') + document.xpath("//link[nokogiri:link_rel_include(@rel, '#{name}')]", NokogiriHandler).pick('href') end def opengraph_tag(name) diff --git a/app/lib/nokogiri_handler.rb b/app/lib/nokogiri_handler.rb new file mode 100644 index 0000000000..804bcb9c04 --- /dev/null +++ b/app/lib/nokogiri_handler.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class NokogiriHandler + class << self + # See "set of space-separated tokens" in the HTML5 spec. + WHITE_SPACE = /[ \x09\x0A\x0C\x0D]+/ + + def link_rel_include(token_list, token) + token_list.to_s.downcase.split(WHITE_SPACE).include?(token.downcase) + end + end +end diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb index 911950ccca..3fde78455c 100644 --- a/app/services/fetch_resource_service.rb +++ b/app/services/fetch_resource_service.rb @@ -74,7 +74,7 @@ class FetchResourceService < BaseService def process_html(response) page = Nokogiri::HTML5(response.body_with_limit) - json_link = page.xpath('//link[@rel="alternate"]').find { |link| ACTIVITY_STREAM_LINK_TYPES.include?(link['type']) } + json_link = page.xpath('//link[nokogiri:link_rel_include(@rel, "alternate")]', NokogiriHandler).find { |link| ACTIVITY_STREAM_LINK_TYPES.include?(link['type']) } process(json_link['href'], terminal: true) unless json_link.nil? end diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb index 17c86426be..fc3c4cbc28 100644 --- a/app/services/verify_link_service.rb +++ b/app/services/verify_link_service.rb @@ -26,7 +26,7 @@ class VerifyLinkService < BaseService def link_back_present? return false if @body.blank? - links = Nokogiri::HTML5(@body).css("a[rel~='me'],link[rel~='me']") + links = Nokogiri::HTML5(@body).xpath('(//a|//link)[@rel][nokogiri:link_rel_include(@rel, "me")]', NokogiriHandler) if links.any? { |link| link['href']&.downcase == @link_back.downcase } true diff --git a/spec/services/verify_link_service_spec.rb b/spec/services/verify_link_service_spec.rb index a4fd19751b..7e2f9607cf 100644 --- a/spec/services/verify_link_service_spec.rb +++ b/spec/services/verify_link_service_spec.rb @@ -46,6 +46,21 @@ RSpec.describe VerifyLinkService do end end + context 'when a link contains an back' do + let(:html) do + <<~HTML + + + Follow me on Mastodon + + HTML + end + + it 'marks the field as verified' do + expect(field.verified?).to be true + end + end + context 'when a link contains a back' do let(:html) do <<~HTML From 62603508c7343f0b9ef880bcbed67c70a9e8375d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 21 Nov 2024 17:10:04 +0100 Subject: [PATCH 08/19] Change design of lists in web UI (#32881) --- app/javascript/mastodon/actions/lists.js | 285 ------------- .../mastodon/actions/lists_typed.ts | 13 + app/javascript/mastodon/api.ts | 1 + app/javascript/mastodon/api/lists.ts | 32 ++ app/javascript/mastodon/api_types/lists.ts | 10 + .../mastodon/components/check_box.tsx | 13 +- .../mastodon/components/scrollable_list.jsx | 11 +- .../containers/dropdown_menu_container.js | 7 + .../list_adder/components/account.jsx | 43 -- .../features/list_adder/components/list.jsx | 75 ---- .../mastodon/features/list_adder/index.jsx | 76 ---- .../mastodon/features/list_adder/index.tsx | 213 ++++++++++ .../list_editor/components/account.jsx | 82 ---- .../list_editor/components/edit_list_form.jsx | 76 ---- .../list_editor/components/search.jsx | 83 ---- .../mastodon/features/list_editor/index.jsx | 83 ---- .../mastodon/features/list_timeline/index.jsx | 65 +-- .../lists/components/new_list_form.jsx | 80 ---- .../mastodon/features/lists/index.jsx | 94 ----- .../mastodon/features/lists/index.tsx | 145 +++++++ .../mastodon/features/lists/members.tsx | 373 ++++++++++++++++++ .../mastodon/features/lists/new.tsx | 296 ++++++++++++++ .../features/ui/components/modal_root.jsx | 2 - app/javascript/mastodon/features/ui/index.jsx | 7 +- .../features/ui/util/async-components.js | 12 +- app/javascript/mastodon/locales/en.json | 34 +- app/javascript/mastodon/models/list.ts | 18 + app/javascript/mastodon/reducers/index.ts | 8 +- .../mastodon/reducers/list_adder.js | 48 --- .../mastodon/reducers/list_editor.js | 99 ----- app/javascript/mastodon/reducers/lists.js | 38 -- app/javascript/mastodon/reducers/lists.ts | 49 +++ app/javascript/mastodon/selectors/lists.ts | 15 + .../styles/mastodon-light/variables.scss | 1 + app/javascript/styles/mastodon/admin.scss | 10 - .../styles/mastodon/components.scss | 191 ++++----- app/javascript/styles/mastodon/forms.scss | 53 +++ app/javascript/styles/mastodon/variables.scss | 1 + app/javascript/svg-icons/squiggly_arrow.svg | 3 + 39 files changed, 1395 insertions(+), 1350 deletions(-) create mode 100644 app/javascript/mastodon/actions/lists_typed.ts create mode 100644 app/javascript/mastodon/api/lists.ts create mode 100644 app/javascript/mastodon/api_types/lists.ts delete mode 100644 app/javascript/mastodon/features/list_adder/components/account.jsx delete mode 100644 app/javascript/mastodon/features/list_adder/components/list.jsx delete mode 100644 app/javascript/mastodon/features/list_adder/index.jsx create mode 100644 app/javascript/mastodon/features/list_adder/index.tsx delete mode 100644 app/javascript/mastodon/features/list_editor/components/account.jsx delete mode 100644 app/javascript/mastodon/features/list_editor/components/edit_list_form.jsx delete mode 100644 app/javascript/mastodon/features/list_editor/components/search.jsx delete mode 100644 app/javascript/mastodon/features/list_editor/index.jsx delete mode 100644 app/javascript/mastodon/features/lists/components/new_list_form.jsx delete mode 100644 app/javascript/mastodon/features/lists/index.jsx create mode 100644 app/javascript/mastodon/features/lists/index.tsx create mode 100644 app/javascript/mastodon/features/lists/members.tsx create mode 100644 app/javascript/mastodon/features/lists/new.tsx create mode 100644 app/javascript/mastodon/models/list.ts delete mode 100644 app/javascript/mastodon/reducers/list_adder.js delete mode 100644 app/javascript/mastodon/reducers/list_editor.js delete mode 100644 app/javascript/mastodon/reducers/lists.js create mode 100644 app/javascript/mastodon/reducers/lists.ts create mode 100644 app/javascript/mastodon/selectors/lists.ts create mode 100644 app/javascript/svg-icons/squiggly_arrow.svg diff --git a/app/javascript/mastodon/actions/lists.js b/app/javascript/mastodon/actions/lists.js index 9956059387..f9abc2e769 100644 --- a/app/javascript/mastodon/actions/lists.js +++ b/app/javascript/mastodon/actions/lists.js @@ -1,8 +1,5 @@ import api from '../api'; -import { showAlertForError } from './alerts'; -import { importFetchedAccounts } from './importer'; - export const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST'; export const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS'; export const LIST_FETCH_FAIL = 'LIST_FETCH_FAIL'; @@ -11,45 +8,10 @@ export const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST'; export const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS'; export const LISTS_FETCH_FAIL = 'LISTS_FETCH_FAIL'; -export const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE'; -export const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET'; -export const LIST_EDITOR_SETUP = 'LIST_EDITOR_SETUP'; - -export const LIST_CREATE_REQUEST = 'LIST_CREATE_REQUEST'; -export const LIST_CREATE_SUCCESS = 'LIST_CREATE_SUCCESS'; -export const LIST_CREATE_FAIL = 'LIST_CREATE_FAIL'; - -export const LIST_UPDATE_REQUEST = 'LIST_UPDATE_REQUEST'; -export const LIST_UPDATE_SUCCESS = 'LIST_UPDATE_SUCCESS'; -export const LIST_UPDATE_FAIL = 'LIST_UPDATE_FAIL'; - export const LIST_DELETE_REQUEST = 'LIST_DELETE_REQUEST'; export const LIST_DELETE_SUCCESS = 'LIST_DELETE_SUCCESS'; export const LIST_DELETE_FAIL = 'LIST_DELETE_FAIL'; -export const LIST_ACCOUNTS_FETCH_REQUEST = 'LIST_ACCOUNTS_FETCH_REQUEST'; -export const LIST_ACCOUNTS_FETCH_SUCCESS = 'LIST_ACCOUNTS_FETCH_SUCCESS'; -export const LIST_ACCOUNTS_FETCH_FAIL = 'LIST_ACCOUNTS_FETCH_FAIL'; - -export const LIST_EDITOR_SUGGESTIONS_CHANGE = 'LIST_EDITOR_SUGGESTIONS_CHANGE'; -export const LIST_EDITOR_SUGGESTIONS_READY = 'LIST_EDITOR_SUGGESTIONS_READY'; -export const LIST_EDITOR_SUGGESTIONS_CLEAR = 'LIST_EDITOR_SUGGESTIONS_CLEAR'; - -export const LIST_EDITOR_ADD_REQUEST = 'LIST_EDITOR_ADD_REQUEST'; -export const LIST_EDITOR_ADD_SUCCESS = 'LIST_EDITOR_ADD_SUCCESS'; -export const LIST_EDITOR_ADD_FAIL = 'LIST_EDITOR_ADD_FAIL'; - -export const LIST_EDITOR_REMOVE_REQUEST = 'LIST_EDITOR_REMOVE_REQUEST'; -export const LIST_EDITOR_REMOVE_SUCCESS = 'LIST_EDITOR_REMOVE_SUCCESS'; -export const LIST_EDITOR_REMOVE_FAIL = 'LIST_EDITOR_REMOVE_FAIL'; - -export const LIST_ADDER_RESET = 'LIST_ADDER_RESET'; -export const LIST_ADDER_SETUP = 'LIST_ADDER_SETUP'; - -export const LIST_ADDER_LISTS_FETCH_REQUEST = 'LIST_ADDER_LISTS_FETCH_REQUEST'; -export const LIST_ADDER_LISTS_FETCH_SUCCESS = 'LIST_ADDER_LISTS_FETCH_SUCCESS'; -export const LIST_ADDER_LISTS_FETCH_FAIL = 'LIST_ADDER_LISTS_FETCH_FAIL'; - export const fetchList = id => (dispatch, getState) => { if (getState().getIn(['lists', id])) { return; @@ -100,89 +62,6 @@ export const fetchListsFail = error => ({ error, }); -export const submitListEditor = shouldReset => (dispatch, getState) => { - const listId = getState().getIn(['listEditor', 'listId']); - const title = getState().getIn(['listEditor', 'title']); - - if (listId === null) { - dispatch(createList(title, shouldReset)); - } else { - dispatch(updateList(listId, title, shouldReset)); - } -}; - -export const setupListEditor = listId => (dispatch, getState) => { - dispatch({ - type: LIST_EDITOR_SETUP, - list: getState().getIn(['lists', listId]), - }); - - dispatch(fetchListAccounts(listId)); -}; - -export const changeListEditorTitle = value => ({ - type: LIST_EDITOR_TITLE_CHANGE, - value, -}); - -export const createList = (title, shouldReset) => (dispatch) => { - dispatch(createListRequest()); - - api().post('/api/v1/lists', { title }).then(({ data }) => { - dispatch(createListSuccess(data)); - - if (shouldReset) { - dispatch(resetListEditor()); - } - }).catch(err => dispatch(createListFail(err))); -}; - -export const createListRequest = () => ({ - type: LIST_CREATE_REQUEST, -}); - -export const createListSuccess = list => ({ - type: LIST_CREATE_SUCCESS, - list, -}); - -export const createListFail = error => ({ - type: LIST_CREATE_FAIL, - error, -}); - -export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch) => { - dispatch(updateListRequest(id)); - - api().put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => { - dispatch(updateListSuccess(data)); - - if (shouldReset) { - dispatch(resetListEditor()); - } - }).catch(err => dispatch(updateListFail(id, err))); -}; - -export const updateListRequest = id => ({ - type: LIST_UPDATE_REQUEST, - id, -}); - -export const updateListSuccess = list => ({ - type: LIST_UPDATE_SUCCESS, - list, -}); - -export const updateListFail = (id, error) => ({ - type: LIST_UPDATE_FAIL, - id, - error, -}); - -export const resetListEditor = () => ({ - type: LIST_EDITOR_RESET, -}); - export const deleteList = id => (dispatch) => { dispatch(deleteListRequest(id)); @@ -206,167 +85,3 @@ export const deleteListFail = (id, error) => ({ id, error, }); - -export const fetchListAccounts = listId => (dispatch) => { - dispatch(fetchListAccountsRequest(listId)); - - api().get(`/api/v1/lists/${listId}/accounts`, { params: { limit: 0 } }).then(({ data }) => { - dispatch(importFetchedAccounts(data)); - dispatch(fetchListAccountsSuccess(listId, data)); - }).catch(err => dispatch(fetchListAccountsFail(listId, err))); -}; - -export const fetchListAccountsRequest = id => ({ - type: LIST_ACCOUNTS_FETCH_REQUEST, - id, -}); - -export const fetchListAccountsSuccess = (id, accounts, next) => ({ - type: LIST_ACCOUNTS_FETCH_SUCCESS, - id, - accounts, - next, -}); - -export const fetchListAccountsFail = (id, error) => ({ - type: LIST_ACCOUNTS_FETCH_FAIL, - id, - error, -}); - -export const fetchListSuggestions = q => (dispatch) => { - const params = { - q, - resolve: false, - limit: 4, - following: true, - }; - - api().get('/api/v1/accounts/search', { params }).then(({ data }) => { - dispatch(importFetchedAccounts(data)); - dispatch(fetchListSuggestionsReady(q, data)); - }).catch(error => dispatch(showAlertForError(error))); -}; - -export const fetchListSuggestionsReady = (query, accounts) => ({ - type: LIST_EDITOR_SUGGESTIONS_READY, - query, - accounts, -}); - -export const clearListSuggestions = () => ({ - type: LIST_EDITOR_SUGGESTIONS_CLEAR, -}); - -export const changeListSuggestions = value => ({ - type: LIST_EDITOR_SUGGESTIONS_CHANGE, - value, -}); - -export const addToListEditor = accountId => (dispatch, getState) => { - dispatch(addToList(getState().getIn(['listEditor', 'listId']), accountId)); -}; - -export const addToList = (listId, accountId) => (dispatch) => { - dispatch(addToListRequest(listId, accountId)); - - api().post(`/api/v1/lists/${listId}/accounts`, { account_ids: [accountId] }) - .then(() => dispatch(addToListSuccess(listId, accountId))) - .catch(err => dispatch(addToListFail(listId, accountId, err))); -}; - -export const addToListRequest = (listId, accountId) => ({ - type: LIST_EDITOR_ADD_REQUEST, - listId, - accountId, -}); - -export const addToListSuccess = (listId, accountId) => ({ - type: LIST_EDITOR_ADD_SUCCESS, - listId, - accountId, -}); - -export const addToListFail = (listId, accountId, error) => ({ - type: LIST_EDITOR_ADD_FAIL, - listId, - accountId, - error, -}); - -export const removeFromListEditor = accountId => (dispatch, getState) => { - dispatch(removeFromList(getState().getIn(['listEditor', 'listId']), accountId)); -}; - -export const removeFromList = (listId, accountId) => (dispatch) => { - dispatch(removeFromListRequest(listId, accountId)); - - api().delete(`/api/v1/lists/${listId}/accounts`, { params: { account_ids: [accountId] } }) - .then(() => dispatch(removeFromListSuccess(listId, accountId))) - .catch(err => dispatch(removeFromListFail(listId, accountId, err))); -}; - -export const removeFromListRequest = (listId, accountId) => ({ - type: LIST_EDITOR_REMOVE_REQUEST, - listId, - accountId, -}); - -export const removeFromListSuccess = (listId, accountId) => ({ - type: LIST_EDITOR_REMOVE_SUCCESS, - listId, - accountId, -}); - -export const removeFromListFail = (listId, accountId, error) => ({ - type: LIST_EDITOR_REMOVE_FAIL, - listId, - accountId, - error, -}); - -export const resetListAdder = () => ({ - type: LIST_ADDER_RESET, -}); - -export const setupListAdder = accountId => (dispatch, getState) => { - dispatch({ - type: LIST_ADDER_SETUP, - account: getState().getIn(['accounts', accountId]), - }); - dispatch(fetchLists()); - dispatch(fetchAccountLists(accountId)); -}; - -export const fetchAccountLists = accountId => (dispatch) => { - dispatch(fetchAccountListsRequest(accountId)); - - api().get(`/api/v1/accounts/${accountId}/lists`) - .then(({ data }) => dispatch(fetchAccountListsSuccess(accountId, data))) - .catch(err => dispatch(fetchAccountListsFail(accountId, err))); -}; - -export const fetchAccountListsRequest = id => ({ - type:LIST_ADDER_LISTS_FETCH_REQUEST, - id, -}); - -export const fetchAccountListsSuccess = (id, lists) => ({ - type: LIST_ADDER_LISTS_FETCH_SUCCESS, - id, - lists, -}); - -export const fetchAccountListsFail = (id, err) => ({ - type: LIST_ADDER_LISTS_FETCH_FAIL, - id, - err, -}); - -export const addToListAdder = listId => (dispatch, getState) => { - dispatch(addToList(listId, getState().getIn(['listAdder', 'accountId']))); -}; - -export const removeFromListAdder = listId => (dispatch, getState) => { - dispatch(removeFromList(listId, getState().getIn(['listAdder', 'accountId']))); -}; diff --git a/app/javascript/mastodon/actions/lists_typed.ts b/app/javascript/mastodon/actions/lists_typed.ts new file mode 100644 index 0000000000..ccc5c11c89 --- /dev/null +++ b/app/javascript/mastodon/actions/lists_typed.ts @@ -0,0 +1,13 @@ +import { apiCreate, apiUpdate } from 'mastodon/api/lists'; +import type { List } from 'mastodon/models/list'; +import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; + +export const createList = createDataLoadingThunk( + 'list/create', + (list: Partial) => apiCreate(list), +); + +export const updateList = createDataLoadingThunk( + 'list/update', + (list: Partial) => apiUpdate(list), +); diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts index 51cbe0b695..f0663ded40 100644 --- a/app/javascript/mastodon/api.ts +++ b/app/javascript/mastodon/api.ts @@ -68,6 +68,7 @@ export async function apiRequest( method: Method, url: string, args: { + signal?: AbortSignal; params?: RequestParamsOrData; data?: RequestParamsOrData; timeout?: number; diff --git a/app/javascript/mastodon/api/lists.ts b/app/javascript/mastodon/api/lists.ts new file mode 100644 index 0000000000..a5586eb6d4 --- /dev/null +++ b/app/javascript/mastodon/api/lists.ts @@ -0,0 +1,32 @@ +import { + apiRequestPost, + apiRequestPut, + apiRequestGet, + apiRequestDelete, +} from 'mastodon/api'; +import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; +import type { ApiListJSON } from 'mastodon/api_types/lists'; + +export const apiCreate = (list: Partial) => + apiRequestPost('v1/lists', list); + +export const apiUpdate = (list: Partial) => + apiRequestPut(`v1/lists/${list.id}`, list); + +export const apiGetAccounts = (listId: string) => + apiRequestGet(`v1/lists/${listId}/accounts`, { + limit: 0, + }); + +export const apiGetAccountLists = (accountId: string) => + apiRequestGet(`v1/accounts/${accountId}/lists`); + +export const apiAddAccountToList = (listId: string, accountId: string) => + apiRequestPost(`v1/lists/${listId}/accounts`, { + account_ids: [accountId], + }); + +export const apiRemoveAccountFromList = (listId: string, accountId: string) => + apiRequestDelete(`v1/lists/${listId}/accounts`, { + account_ids: [accountId], + }); diff --git a/app/javascript/mastodon/api_types/lists.ts b/app/javascript/mastodon/api_types/lists.ts new file mode 100644 index 0000000000..6984cf9b19 --- /dev/null +++ b/app/javascript/mastodon/api_types/lists.ts @@ -0,0 +1,10 @@ +// See app/serializers/rest/list_serializer.rb + +export type RepliesPolicyType = 'list' | 'followed' | 'none'; + +export interface ApiListJSON { + id: string; + title: string; + exclusive: boolean; + replies_policy: RepliesPolicyType; +} diff --git a/app/javascript/mastodon/components/check_box.tsx b/app/javascript/mastodon/components/check_box.tsx index 9bd137abf5..73fdb2f97b 100644 --- a/app/javascript/mastodon/components/check_box.tsx +++ b/app/javascript/mastodon/components/check_box.tsx @@ -7,11 +7,11 @@ import { Icon } from './icon'; interface Props { value: string; - checked: boolean; - indeterminate: boolean; - name: string; - onChange: (event: React.ChangeEvent) => void; - label: React.ReactNode; + checked?: boolean; + indeterminate?: boolean; + name?: string; + onChange?: (event: React.ChangeEvent) => void; + label?: React.ReactNode; } export const CheckBox: React.FC = ({ @@ -30,6 +30,7 @@ export const CheckBox: React.FC = ({ value={value} checked={checked} onChange={onChange} + readOnly={!onChange} /> = ({ )} - {label} + {label && {label}} ); }; diff --git a/app/javascript/mastodon/components/scrollable_list.jsx b/app/javascript/mastodon/components/scrollable_list.jsx index 29439fdf55..35cd86ea1a 100644 --- a/app/javascript/mastodon/components/scrollable_list.jsx +++ b/app/javascript/mastodon/components/scrollable_list.jsx @@ -80,6 +80,7 @@ class ScrollableList extends PureComponent { children: PropTypes.node, bindToDocument: PropTypes.bool, preventScroll: PropTypes.bool, + footer: PropTypes.node, }; static defaultProps = { @@ -324,7 +325,7 @@ class ScrollableList extends PureComponent { }; render () { - const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props; + const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, footer, emptyMessage, onLoadMore } = this.props; const { fullscreen } = this.state; const childrenCount = Children.count(children); @@ -342,11 +343,13 @@ class ScrollableList extends PureComponent {
+ + {footer}
); } else if (isLoading || childrenCount > 0 || numPending > 0 || hasMore || !emptyMessage) { scrollableArea = ( -
+
{prepend} @@ -375,6 +378,8 @@ class ScrollableList extends PureComponent { {!hasMore && append}
+ + {footer}
); } else { @@ -385,6 +390,8 @@ class ScrollableList extends PureComponent {
{emptyMessage}
+ + {footer}
); } diff --git a/app/javascript/mastodon/containers/dropdown_menu_container.js b/app/javascript/mastodon/containers/dropdown_menu_container.js index bc9124c041..dc2a9648ff 100644 --- a/app/javascript/mastodon/containers/dropdown_menu_container.js +++ b/app/javascript/mastodon/containers/dropdown_menu_container.js @@ -15,6 +15,13 @@ const mapStateToProps = state => ({ openedViaKeyboard: state.dropdownMenu.keyboard, }); +/** + * @param {any} dispatch + * @param {Object} root0 + * @param {any} [root0.status] + * @param {any} root0.items + * @param {any} [root0.scrollKey] + */ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({ onOpen(id, onItemClick, keyboard) { if (status) { diff --git a/app/javascript/mastodon/features/list_adder/components/account.jsx b/app/javascript/mastodon/features/list_adder/components/account.jsx deleted file mode 100644 index 94a90726e3..0000000000 --- a/app/javascript/mastodon/features/list_adder/components/account.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import { injectIntl } from 'react-intl'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import { Avatar } from '../../../components/avatar'; -import { DisplayName } from '../../../components/display_name'; -import { makeGetAccount } from '../../../selectors'; - -const makeMapStateToProps = () => { - const getAccount = makeGetAccount(); - - const mapStateToProps = (state, { accountId }) => ({ - account: getAccount(state, accountId), - }); - - return mapStateToProps; -}; - -class Account extends ImmutablePureComponent { - - static propTypes = { - account: ImmutablePropTypes.record.isRequired, - }; - - render () { - const { account } = this.props; - return ( -
-
-
-
- -
-
-
- ); - } - -} - -export default connect(makeMapStateToProps)(injectIntl(Account)); diff --git a/app/javascript/mastodon/features/list_adder/components/list.jsx b/app/javascript/mastodon/features/list_adder/components/list.jsx deleted file mode 100644 index a7cfd60bf3..0000000000 --- a/app/javascript/mastodon/features/list_adder/components/list.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import PropTypes from 'prop-types'; - -import { defineMessages, injectIntl } from 'react-intl'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import AddIcon from '@/material-icons/400-24px/add.svg?react'; -import CloseIcon from '@/material-icons/400-24px/close.svg?react'; -import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; -import { Icon } from 'mastodon/components/icon'; - -import { removeFromListAdder, addToListAdder } from '../../../actions/lists'; -import { IconButton } from '../../../components/icon_button'; - -const messages = defineMessages({ - remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' }, - add: { id: 'lists.account.add', defaultMessage: 'Add to list' }, -}); - -const MapStateToProps = (state, { listId, added }) => ({ - list: state.get('lists').get(listId), - added: typeof added === 'undefined' ? state.getIn(['listAdder', 'lists', 'items']).includes(listId) : added, -}); - -const mapDispatchToProps = (dispatch, { listId }) => ({ - onRemove: () => dispatch(removeFromListAdder(listId)), - onAdd: () => dispatch(addToListAdder(listId)), -}); - -class List extends ImmutablePureComponent { - - static propTypes = { - list: ImmutablePropTypes.map.isRequired, - intl: PropTypes.object.isRequired, - onRemove: PropTypes.func.isRequired, - onAdd: PropTypes.func.isRequired, - added: PropTypes.bool, - }; - - static defaultProps = { - added: false, - }; - - render () { - const { list, intl, onRemove, onAdd, added } = this.props; - - let button; - - if (added) { - button = ; - } else { - button = ; - } - - return ( -
-
-
- - {list.get('title')} -
- -
- {button} -
-
-
- ); - } - -} - -export default connect(MapStateToProps, mapDispatchToProps)(injectIntl(List)); diff --git a/app/javascript/mastodon/features/list_adder/index.jsx b/app/javascript/mastodon/features/list_adder/index.jsx deleted file mode 100644 index 4e7bd46bdf..0000000000 --- a/app/javascript/mastodon/features/list_adder/index.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import PropTypes from 'prop-types'; - -import { injectIntl } from 'react-intl'; - -import { createSelector } from '@reduxjs/toolkit'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import { setupListAdder, resetListAdder } from '../../actions/lists'; -import NewListForm from '../lists/components/new_list_form'; - -import Account from './components/account'; -import List from './components/list'; -// hack - -const getOrderedLists = createSelector([state => state.get('lists')], lists => { - if (!lists) { - return lists; - } - - return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title'))); -}); - -const mapStateToProps = state => ({ - listIds: getOrderedLists(state).map(list=>list.get('id')), -}); - -const mapDispatchToProps = dispatch => ({ - onInitialize: accountId => dispatch(setupListAdder(accountId)), - onReset: () => dispatch(resetListAdder()), -}); - -class ListAdder extends ImmutablePureComponent { - - static propTypes = { - accountId: PropTypes.string.isRequired, - onClose: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - onInitialize: PropTypes.func.isRequired, - onReset: PropTypes.func.isRequired, - listIds: ImmutablePropTypes.list.isRequired, - }; - - componentDidMount () { - const { onInitialize, accountId } = this.props; - onInitialize(accountId); - } - - componentWillUnmount () { - const { onReset } = this.props; - onReset(); - } - - render () { - const { accountId, listIds } = this.props; - - return ( -
-
- -
- - - - -
- {listIds.map(ListId => )} -
-
- ); - } - -} - -export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(ListAdder)); diff --git a/app/javascript/mastodon/features/list_adder/index.tsx b/app/javascript/mastodon/features/list_adder/index.tsx new file mode 100644 index 0000000000..5429c24aed --- /dev/null +++ b/app/javascript/mastodon/features/list_adder/index.tsx @@ -0,0 +1,213 @@ +import { useEffect, useState, useCallback } from 'react'; + +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; + +import { isFulfilled } from '@reduxjs/toolkit'; + +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import { fetchLists } from 'mastodon/actions/lists'; +import { createList } from 'mastodon/actions/lists_typed'; +import { + apiGetAccountLists, + apiAddAccountToList, + apiRemoveAccountFromList, +} from 'mastodon/api/lists'; +import type { ApiListJSON } from 'mastodon/api_types/lists'; +import { Button } from 'mastodon/components/button'; +import { CheckBox } from 'mastodon/components/check_box'; +import { Icon } from 'mastodon/components/icon'; +import { IconButton } from 'mastodon/components/icon_button'; +import { getOrderedLists } from 'mastodon/selectors/lists'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; + +const messages = defineMessages({ + newList: { + id: 'lists.new_list_name', + defaultMessage: 'New list name', + }, + createList: { + id: 'lists.create', + defaultMessage: 'Create', + }, + close: { + id: 'lightbox.close', + defaultMessage: 'Close', + }, +}); + +const ListItem: React.FC<{ + id: string; + title: string; + checked: boolean; + onChange: (id: string, checked: boolean) => void; +}> = ({ id, title, checked, onChange }) => { + const handleChange = useCallback( + (e: React.ChangeEvent) => { + onChange(id, e.target.checked); + }, + [id, onChange], + ); + + return ( + // eslint-disable-next-line jsx-a11y/label-has-associated-control + + ); +}; + +const NewListItem: React.FC<{ + onCreate: (list: ApiListJSON) => void; +}> = ({ onCreate }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const [title, setTitle] = useState(''); + + const handleChange = useCallback( + ({ target: { value } }: React.ChangeEvent) => { + setTitle(value); + }, + [setTitle], + ); + + const handleSubmit = useCallback(() => { + if (title.trim().length === 0) { + return; + } + + void dispatch(createList({ title })).then((result) => { + if (isFulfilled(result)) { + onCreate(result.payload); + setTitle(''); + } + + return ''; + }); + }, [setTitle, dispatch, onCreate, title]); + + return ( +
+ + +
+ - -
-
- - -
-
- - {replies_policy !== undefined && ( -
-

- -
- { ['none', 'list', 'followed'].map(policy => ( - - ))} -
-
- )}
@@ -229,4 +178,4 @@ class ListTimeline extends PureComponent { } -export default withRouter(connect(mapStateToProps)(injectIntl(ListTimeline))); +export default withRouter(connect(mapStateToProps)(ListTimeline)); diff --git a/app/javascript/mastodon/features/lists/components/new_list_form.jsx b/app/javascript/mastodon/features/lists/components/new_list_form.jsx deleted file mode 100644 index 0fed9d70a2..0000000000 --- a/app/javascript/mastodon/features/lists/components/new_list_form.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { defineMessages, injectIntl } from 'react-intl'; - -import { connect } from 'react-redux'; - -import { changeListEditorTitle, submitListEditor } from 'mastodon/actions/lists'; -import { Button } from 'mastodon/components/button'; - -const messages = defineMessages({ - label: { id: 'lists.new.title_placeholder', defaultMessage: 'New list title' }, - title: { id: 'lists.new.create', defaultMessage: 'Add list' }, -}); - -const mapStateToProps = state => ({ - value: state.getIn(['listEditor', 'title']), - disabled: state.getIn(['listEditor', 'isSubmitting']), -}); - -const mapDispatchToProps = dispatch => ({ - onChange: value => dispatch(changeListEditorTitle(value)), - onSubmit: () => dispatch(submitListEditor(true)), -}); - -class NewListForm extends PureComponent { - - static propTypes = { - value: PropTypes.string.isRequired, - disabled: PropTypes.bool, - intl: PropTypes.object.isRequired, - onChange: PropTypes.func.isRequired, - onSubmit: PropTypes.func.isRequired, - }; - - handleChange = e => { - this.props.onChange(e.target.value); - }; - - handleSubmit = e => { - e.preventDefault(); - this.props.onSubmit(); - }; - - handleClick = () => { - this.props.onSubmit(); - }; - - render () { - const { value, disabled, intl } = this.props; - - const label = intl.formatMessage(messages.label); - const title = intl.formatMessage(messages.title); - - return ( -
- - -
+ + + + + ); +}; + +const AccountItem: React.FC<{ + accountId: string; + listId: string; + partOfList: boolean; + onToggle: (accountId: string) => void; +}> = ({ accountId, listId, partOfList, onToggle }) => { + const intl = useIntl(); + const account = useAppSelector((state) => state.accounts.get(accountId)); + + const handleClick = useCallback(() => { + if (partOfList) { + void apiRemoveAccountFromList(listId, accountId); + } else { + void apiAddAccountToList(listId, accountId); + } + + onToggle(accountId); + }, [accountId, listId, partOfList, onToggle]); + + if (!account) { + return null; + } + + const firstVerifiedField = account.fields.find((item) => !!item.verified_at); + + return ( +
+
+ +
+ +
+ +
+ + +
+ {' '} + {firstVerifiedField && ( + + )} +
+
+ + +
+
+
+
+ ); +}; + +const ListMembers: React.FC<{ + multiColumn?: boolean; +}> = ({ multiColumn }) => { + const dispatch = useAppDispatch(); + const { id } = useParams<{ id: string }>(); + const intl = useIntl(); + + const followingAccountIds = useAppSelector( + (state) => state.user_lists.getIn(['following', me, 'items']) as string[], + ); + const [searching, setSearching] = useState(false); + const [accountIds, setAccountIds] = useState([]); + const [searchAccountIds, setSearchAccountIds] = useState([]); + const [loading, setLoading] = useState(true); + const [mode, setMode] = useState('remove'); + + useEffect(() => { + if (id) { + setLoading(true); + dispatch(fetchList(id)); + + void apiGetAccounts(id) + .then((data) => { + dispatch(importFetchedAccounts(data)); + setAccountIds(data.map((a) => a.id)); + setLoading(false); + return ''; + }) + .catch(() => { + setLoading(false); + }); + + dispatch(fetchFollowing(me)); + } + }, [dispatch, id]); + + const handleSearchClick = useCallback(() => { + setMode('add'); + }, [setMode]); + + const handleDismissSearchClick = useCallback(() => { + setMode('remove'); + setSearching(false); + }, [setMode]); + + const handleAccountToggle = useCallback( + (accountId: string) => { + const partOfList = accountIds.includes(accountId); + + if (partOfList) { + setAccountIds(accountIds.filter((id) => id !== accountId)); + } else { + setAccountIds([accountId, ...accountIds]); + } + }, + [accountIds, setAccountIds], + ); + + const searchRequestRef = useRef(null); + + const handleSearch = useDebouncedCallback( + (value: string) => { + if (searchRequestRef.current) { + searchRequestRef.current.abort(); + } + + if (value.trim().length === 0) { + setSearching(false); + return; + } + + setLoading(true); + + searchRequestRef.current = new AbortController(); + + void apiRequest('GET', 'v1/accounts/search', { + signal: searchRequestRef.current.signal, + params: { + q: value, + resolve: false, + following: true, + }, + }) + .then((data) => { + dispatch(importFetchedAccounts(data)); + setSearchAccountIds(data.map((a) => a.id)); + setLoading(false); + setSearching(true); + return ''; + }) + .catch(() => { + setSearching(true); + setLoading(false); + }); + }, + 500, + { leading: true, trailing: true }, + ); + + let displayedAccountIds: string[]; + + if (mode === 'add') { + displayedAccountIds = searching ? searchAccountIds : followingAccountIds; + } else { + displayedAccountIds = accountIds; + } + + return ( + + {mode === 'remove' ? ( + + + + } + /> + ) : ( + + )} + + +
+ +
+ + + +
+ + ) + } + emptyMessage={ + mode === 'remove' ? ( + <> + + +
+ +
+ + + + ) : ( + + ) + } + > + {displayedAccountIds.map((accountId) => ( + + ))} + + + + {intl.formatMessage(messages.heading)} + + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export default ListMembers; diff --git a/app/javascript/mastodon/features/lists/new.tsx b/app/javascript/mastodon/features/lists/new.tsx new file mode 100644 index 0000000000..cf39331d7c --- /dev/null +++ b/app/javascript/mastodon/features/lists/new.tsx @@ -0,0 +1,296 @@ +import { useCallback, useState, useEffect } from 'react'; + +import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; + +import { Helmet } from 'react-helmet'; +import { useParams, useHistory, Link } from 'react-router-dom'; + +import { isFulfilled } from '@reduxjs/toolkit'; + +import Toggle from 'react-toggle'; + +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import { fetchList } from 'mastodon/actions/lists'; +import { createList, updateList } from 'mastodon/actions/lists_typed'; +import { apiGetAccounts } from 'mastodon/api/lists'; +import type { RepliesPolicyType } from 'mastodon/api_types/lists'; +import Column from 'mastodon/components/column'; +import { ColumnHeader } from 'mastodon/components/column_header'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; + +const messages = defineMessages({ + edit: { id: 'column.edit_list', defaultMessage: 'Edit list' }, + create: { id: 'column.create_list', defaultMessage: 'Create list' }, +}); + +const MembersLink: React.FC<{ + id: string; +}> = ({ id }) => { + const [count, setCount] = useState(0); + const [avatars, setAvatars] = useState([]); + + useEffect(() => { + void apiGetAccounts(id) + .then((data) => { + setCount(data.length); + setAvatars(data.slice(0, 3).map((a) => a.avatar)); + return ''; + }) + .catch(() => { + // Nothing + }); + }, [id, setCount, setAvatars]); + + return ( + +
+ + + + +
+ +
+ {avatars.map((url) => ( + + ))} +
+ + ); +}; + +const NewList: React.FC<{ + multiColumn?: boolean; +}> = ({ multiColumn }) => { + const dispatch = useAppDispatch(); + const { id } = useParams<{ id?: string }>(); + const intl = useIntl(); + const history = useHistory(); + + const list = useAppSelector((state) => + id ? state.lists.get(id) : undefined, + ); + const [title, setTitle] = useState(''); + const [exclusive, setExclusive] = useState(false); + const [repliesPolicy, setRepliesPolicy] = useState('list'); + const [submitting, setSubmitting] = useState(false); + + useEffect(() => { + if (id) { + dispatch(fetchList(id)); + } + }, [dispatch, id]); + + useEffect(() => { + if (id && list) { + setTitle(list.title); + setExclusive(list.exclusive); + setRepliesPolicy(list.replies_policy); + } + }, [setTitle, setExclusive, setRepliesPolicy, id, list]); + + const handleTitleChange = useCallback( + ({ target: { value } }: React.ChangeEvent) => { + setTitle(value); + }, + [setTitle], + ); + + const handleExclusiveChange = useCallback( + ({ target: { checked } }: React.ChangeEvent) => { + setExclusive(checked); + }, + [setExclusive], + ); + + const handleRepliesPolicyChange = useCallback( + ({ target: { value } }: React.ChangeEvent) => { + setRepliesPolicy(value as RepliesPolicyType); + }, + [setRepliesPolicy], + ); + + const handleSubmit = useCallback(() => { + setSubmitting(true); + + if (id) { + void dispatch( + updateList({ + id, + title, + exclusive, + replies_policy: repliesPolicy, + }), + ).then(() => { + setSubmitting(false); + return ''; + }); + } else { + void dispatch( + createList({ + title, + exclusive, + replies_policy: repliesPolicy, + }), + ).then((result) => { + setSubmitting(false); + + if (isFulfilled(result)) { + history.replace(`/lists/${result.payload.id}/edit`); + history.push(`/lists/${result.payload.id}/members`); + } + + return ''; + }); + } + }, [history, dispatch, setSubmitting, id, title, exclusive, repliesPolicy]); + + return ( + + + +
+
+
+
+
+ + +
+ +
+
+
+
+ +
+
+
+ + +
+ +
+
+
+
+ + {id && ( +
+ +
+ )} + +
+ {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} + +
+ +
+ +
+
+
+ + + + {intl.formatMessage(id ? messages.edit : messages.create)} + + + +
+ ); +}; + +// eslint-disable-next-line import/no-default-export +export default NewList; diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx index 42a00acf81..8a97ec4565 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx @@ -10,7 +10,6 @@ import { DomainBlockModal, ReportModal, EmbedModal, - ListEditor, ListAdder, CompareHistoryModal, FilterModal, @@ -64,7 +63,6 @@ export const MODAL_COMPONENTS = { 'REPORT': ReportModal, 'ACTIONS': () => Promise.resolve({ default: ActionsModal }), 'EMBED': EmbedModal, - 'LIST_EDITOR': ListEditor, 'FOCAL_POINT': () => Promise.resolve({ default: FocalPointModal }), 'LIST_ADDER': ListAdder, 'COMPARE_HISTORY': CompareHistoryModal, diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index b90ea5585a..daa4585ead 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -58,11 +58,13 @@ import { FollowedTags, LinkTimeline, ListTimeline, + Lists, + ListEdit, + ListMembers, Blocks, DomainBlocks, Mutes, PinnedStatuses, - Lists, Directory, Explore, Onboarding, @@ -205,6 +207,9 @@ class SwitchingColumnsArea extends PureComponent { + + + diff --git a/app/javascript/mastodon/features/ui/util/async-components.js b/app/javascript/mastodon/features/ui/util/async-components.js index ff5db65347..5a85c856d2 100644 --- a/app/javascript/mastodon/features/ui/util/async-components.js +++ b/app/javascript/mastodon/features/ui/util/async-components.js @@ -150,10 +150,6 @@ export function EmbedModal () { return import(/* webpackChunkName: "modals/embed_modal" */'../components/embed_modal'); } -export function ListEditor () { - return import(/* webpackChunkName: "features/list_editor" */'../../list_editor'); -} - export function ListAdder () { return import(/*webpackChunkName: "features/list_adder" */'../../list_adder'); } @@ -221,3 +217,11 @@ export function LinkTimeline () { export function AnnualReportModal () { return import(/*webpackChunkName: "modals/annual_report_modal" */'../components/annual_report_modal'); } + +export function ListEdit () { + return import(/*webpackChunkName: "features/lists" */'../../lists/new'); +} + +export function ListMembers () { + return import(/* webpackChunkName: "features/lists" */'../../lists/members'); +} diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 9728528f8e..142b7f1770 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -140,13 +140,16 @@ "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.community": "Local timeline", + "column.create_list": "Create list", "column.direct": "Private mentions", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", + "column.edit_list": "Edit list", "column.favourites": "Favorites", "column.firehose": "Live feeds", "column.follow_requests": "Follow requests", "column.home": "Home", + "column.list_members": "Manage list members", "column.lists": "Lists", "column.mutes": "Muted users", "column.notifications": "Notifications", @@ -292,7 +295,6 @@ "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.", "empty_column.list": "There is nothing in this list yet. When members of this list publish new posts, 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.notification_requests": "All clear! There is nothing here. When you receive new notifications, they will appear here according to your settings.", "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.", @@ -465,20 +467,32 @@ "link_preview.author": "By {name}", "link_preview.more_from_author": "More from {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} posts}}", - "lists.account.add": "Add to list", - "lists.account.remove": "Remove from list", + "lists.add_member": "Add", + "lists.add_to_list": "Add to list", + "lists.add_to_lists": "Add {name} to lists", + "lists.create": "Create", + "lists.create_a_list_to_organize": "Create a new list to organize your Home feed", + "lists.create_list": "Create list", "lists.delete": "Delete list", + "lists.done": "Done", "lists.edit": "Edit list", - "lists.edit.submit": "Change title", - "lists.exclusive": "Hide these posts from home", - "lists.new.create": "Add list", - "lists.new.title_placeholder": "New list title", + "lists.exclusive": "Hide members in Home", + "lists.exclusive_hint": "If someone is on this list, hide them in your Home feed to avoid seeing their posts twice.", + "lists.find_users_to_add": "Find users to add", + "lists.list_members": "List members", + "lists.list_members_count": "{count, plural, one {# member} other {# members}}", + "lists.list_name": "List name", + "lists.new_list_name": "New list name", + "lists.no_lists_yet": "No lists yet.", + "lists.no_members_yet": "No members yet.", + "lists.no_results_found": "No results found.", + "lists.remove_member": "Remove", "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", + "lists.save": "Save", + "lists.search_placeholder": "Search people you follow", + "lists.show_replies_to": "Include replies from list members to", "load_pending": "{count, plural, one {# new item} other {# new items}}", "loading_indicator.label": "Loading…", "media_gallery.hide": "Hide", diff --git a/app/javascript/mastodon/models/list.ts b/app/javascript/mastodon/models/list.ts new file mode 100644 index 0000000000..50b9896775 --- /dev/null +++ b/app/javascript/mastodon/models/list.ts @@ -0,0 +1,18 @@ +import type { RecordOf } from 'immutable'; +import { Record } from 'immutable'; + +import type { ApiListJSON } from 'mastodon/api_types/lists'; + +type ListShape = Required; // no changes from server shape +export type List = RecordOf; + +const ListFactory = Record({ + id: '', + title: '', + exclusive: false, + replies_policy: 'list', +}); + +export function createList(attributes: Partial) { + return ListFactory(attributes); +} diff --git a/app/javascript/mastodon/reducers/index.ts b/app/javascript/mastodon/reducers/index.ts index b92de0dbcd..aafee19c09 100644 --- a/app/javascript/mastodon/reducers/index.ts +++ b/app/javascript/mastodon/reducers/index.ts @@ -17,9 +17,7 @@ import filters from './filters'; import followed_tags from './followed_tags'; import height_cache from './height_cache'; import history from './history'; -import listAdder from './list_adder'; -import listEditor from './list_editor'; -import lists from './lists'; +import { listsReducer } from './lists'; import { markersReducer } from './markers'; import media_attachments from './media_attachments'; import meta from './meta'; @@ -69,9 +67,7 @@ const reducers = { notificationGroups: notificationGroupsReducer, height_cache, custom_emojis, - lists, - listEditor, - listAdder, + lists: listsReducer, filters, conversations, suggestions, diff --git a/app/javascript/mastodon/reducers/list_adder.js b/app/javascript/mastodon/reducers/list_adder.js deleted file mode 100644 index 0f61273aa6..0000000000 --- a/app/javascript/mastodon/reducers/list_adder.js +++ /dev/null @@ -1,48 +0,0 @@ -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; - -import { - LIST_ADDER_RESET, - LIST_ADDER_SETUP, - LIST_ADDER_LISTS_FETCH_REQUEST, - LIST_ADDER_LISTS_FETCH_SUCCESS, - LIST_ADDER_LISTS_FETCH_FAIL, - LIST_EDITOR_ADD_SUCCESS, - LIST_EDITOR_REMOVE_SUCCESS, -} from '../actions/lists'; - -const initialState = ImmutableMap({ - accountId: null, - - lists: ImmutableMap({ - items: ImmutableList(), - loaded: false, - isLoading: false, - }), -}); - -export default function listAdderReducer(state = initialState, action) { - switch(action.type) { - case LIST_ADDER_RESET: - return initialState; - case LIST_ADDER_SETUP: - return state.withMutations(map => { - map.set('accountId', action.account.get('id')); - }); - case LIST_ADDER_LISTS_FETCH_REQUEST: - return state.setIn(['lists', 'isLoading'], true); - case LIST_ADDER_LISTS_FETCH_FAIL: - return state.setIn(['lists', 'isLoading'], false); - case LIST_ADDER_LISTS_FETCH_SUCCESS: - return state.update('lists', lists => lists.withMutations(map => { - map.set('isLoading', false); - map.set('loaded', true); - map.set('items', ImmutableList(action.lists.map(item => item.id))); - })); - case LIST_EDITOR_ADD_SUCCESS: - return state.updateIn(['lists', 'items'], list => list.unshift(action.listId)); - case LIST_EDITOR_REMOVE_SUCCESS: - return state.updateIn(['lists', 'items'], list => list.filterNot(item => item === action.listId)); - default: - return state; - } -} diff --git a/app/javascript/mastodon/reducers/list_editor.js b/app/javascript/mastodon/reducers/list_editor.js deleted file mode 100644 index d3fd62adec..0000000000 --- a/app/javascript/mastodon/reducers/list_editor.js +++ /dev/null @@ -1,99 +0,0 @@ -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; - -import { - LIST_CREATE_REQUEST, - LIST_CREATE_FAIL, - LIST_CREATE_SUCCESS, - LIST_UPDATE_REQUEST, - LIST_UPDATE_FAIL, - LIST_UPDATE_SUCCESS, - LIST_EDITOR_RESET, - LIST_EDITOR_SETUP, - LIST_EDITOR_TITLE_CHANGE, - LIST_ACCOUNTS_FETCH_REQUEST, - LIST_ACCOUNTS_FETCH_SUCCESS, - LIST_ACCOUNTS_FETCH_FAIL, - LIST_EDITOR_SUGGESTIONS_READY, - LIST_EDITOR_SUGGESTIONS_CLEAR, - LIST_EDITOR_SUGGESTIONS_CHANGE, - LIST_EDITOR_ADD_SUCCESS, - LIST_EDITOR_REMOVE_SUCCESS, -} from '../actions/lists'; - -const initialState = ImmutableMap({ - listId: null, - isSubmitting: false, - isChanged: false, - title: '', - isExclusive: false, - - accounts: ImmutableMap({ - items: ImmutableList(), - loaded: false, - isLoading: false, - }), - - suggestions: ImmutableMap({ - value: '', - items: ImmutableList(), - }), -}); - -export default function listEditorReducer(state = initialState, action) { - switch(action.type) { - case LIST_EDITOR_RESET: - return initialState; - case LIST_EDITOR_SETUP: - return state.withMutations(map => { - map.set('listId', action.list.get('id')); - map.set('title', action.list.get('title')); - map.set('isExclusive', action.list.get('is_exclusive')); - map.set('isSubmitting', false); - }); - case LIST_EDITOR_TITLE_CHANGE: - return state.withMutations(map => { - map.set('title', action.value); - map.set('isChanged', true); - }); - case LIST_CREATE_REQUEST: - case LIST_UPDATE_REQUEST: - return state.withMutations(map => { - map.set('isSubmitting', true); - map.set('isChanged', false); - }); - case LIST_CREATE_FAIL: - case LIST_UPDATE_FAIL: - return state.set('isSubmitting', false); - case LIST_CREATE_SUCCESS: - case LIST_UPDATE_SUCCESS: - return state.withMutations(map => { - map.set('isSubmitting', false); - map.set('listId', action.list.id); - }); - case LIST_ACCOUNTS_FETCH_REQUEST: - return state.setIn(['accounts', 'isLoading'], true); - case LIST_ACCOUNTS_FETCH_FAIL: - return state.setIn(['accounts', 'isLoading'], false); - case LIST_ACCOUNTS_FETCH_SUCCESS: - return state.update('accounts', accounts => accounts.withMutations(map => { - map.set('isLoading', false); - map.set('loaded', true); - map.set('items', ImmutableList(action.accounts.map(item => item.id))); - })); - case LIST_EDITOR_SUGGESTIONS_CHANGE: - return state.setIn(['suggestions', 'value'], action.value); - case LIST_EDITOR_SUGGESTIONS_READY: - return state.setIn(['suggestions', 'items'], ImmutableList(action.accounts.map(item => item.id))); - case LIST_EDITOR_SUGGESTIONS_CLEAR: - return state.update('suggestions', suggestions => suggestions.withMutations(map => { - map.set('items', ImmutableList()); - map.set('value', ''); - })); - case LIST_EDITOR_ADD_SUCCESS: - return state.updateIn(['accounts', 'items'], list => list.unshift(action.accountId)); - case LIST_EDITOR_REMOVE_SUCCESS: - return state.updateIn(['accounts', 'items'], list => list.filterNot(item => item === action.accountId)); - default: - return state; - } -} diff --git a/app/javascript/mastodon/reducers/lists.js b/app/javascript/mastodon/reducers/lists.js deleted file mode 100644 index 2a797772b3..0000000000 --- a/app/javascript/mastodon/reducers/lists.js +++ /dev/null @@ -1,38 +0,0 @@ -import { Map as ImmutableMap, fromJS } from 'immutable'; - -import { - LIST_FETCH_SUCCESS, - LIST_FETCH_FAIL, - LISTS_FETCH_SUCCESS, - LIST_CREATE_SUCCESS, - LIST_UPDATE_SUCCESS, - LIST_DELETE_SUCCESS, -} from '../actions/lists'; - -const initialState = ImmutableMap(); - -const normalizeList = (state, list) => state.set(list.id, fromJS(list)); - -const normalizeLists = (state, lists) => { - lists.forEach(list => { - state = normalizeList(state, list); - }); - - return state; -}; - -export default function lists(state = initialState, action) { - switch(action.type) { - case LIST_FETCH_SUCCESS: - case LIST_CREATE_SUCCESS: - case LIST_UPDATE_SUCCESS: - return normalizeList(state, action.list); - case LISTS_FETCH_SUCCESS: - return normalizeLists(state, action.lists); - case LIST_DELETE_SUCCESS: - case LIST_FETCH_FAIL: - return state.set(action.id, false); - default: - return state; - } -} diff --git a/app/javascript/mastodon/reducers/lists.ts b/app/javascript/mastodon/reducers/lists.ts new file mode 100644 index 0000000000..593e717949 --- /dev/null +++ b/app/javascript/mastodon/reducers/lists.ts @@ -0,0 +1,49 @@ +import type { Reducer } from '@reduxjs/toolkit'; +import { Map as ImmutableMap } from 'immutable'; + +import { createList, updateList } from 'mastodon/actions/lists_typed'; +import type { ApiListJSON } from 'mastodon/api_types/lists'; +import { createList as createListFromJSON } from 'mastodon/models/list'; +import type { List } from 'mastodon/models/list'; + +import { + LIST_FETCH_SUCCESS, + LIST_FETCH_FAIL, + LISTS_FETCH_SUCCESS, + LIST_DELETE_SUCCESS, +} from '../actions/lists'; + +const initialState = ImmutableMap(); +type State = typeof initialState; + +const normalizeList = (state: State, list: ApiListJSON) => + state.set(list.id, createListFromJSON(list)); + +const normalizeLists = (state: State, lists: ApiListJSON[]) => { + lists.forEach((list) => { + state = normalizeList(state, list); + }); + + return state; +}; + +export const listsReducer: Reducer = (state = initialState, action) => { + if ( + createList.fulfilled.match(action) || + updateList.fulfilled.match(action) + ) { + return normalizeList(state, action.payload); + } else { + switch (action.type) { + case LIST_FETCH_SUCCESS: + return normalizeList(state, action.list as ApiListJSON); + case LISTS_FETCH_SUCCESS: + return normalizeLists(state, action.lists as ApiListJSON[]); + case LIST_DELETE_SUCCESS: + case LIST_FETCH_FAIL: + return state.set(action.id as string, null); + default: + return state; + } + } +}; diff --git a/app/javascript/mastodon/selectors/lists.ts b/app/javascript/mastodon/selectors/lists.ts new file mode 100644 index 0000000000..f93e90ce68 --- /dev/null +++ b/app/javascript/mastodon/selectors/lists.ts @@ -0,0 +1,15 @@ +import { createSelector } from '@reduxjs/toolkit'; +import type { Map as ImmutableMap } from 'immutable'; + +import type { List } from 'mastodon/models/list'; +import type { RootState } from 'mastodon/store'; + +export const getOrderedLists = createSelector( + [(state: RootState) => state.lists], + (lists: ImmutableMap) => + lists + .toList() + .filter((item: List | null) => !!item) + .sort((a: List, b: List) => a.title.localeCompare(b.title)) + .toArray(), +); diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss index 777c622ace..2d5e1b1094 100644 --- a/app/javascript/styles/mastodon-light/variables.scss +++ b/app/javascript/styles/mastodon-light/variables.scss @@ -79,4 +79,5 @@ body { --rich-text-container-color: rgba(255, 216, 231, 100%); --rich-text-text-color: rgba(114, 47, 83, 100%); --rich-text-decorations-color: rgba(255, 175, 212, 100%); + --input-placeholder-color: #{transparentize($dark-text-color, 0.5)}; } diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 579b2a4f69..b5f8570ae2 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -611,16 +611,6 @@ body, max-width: 100%; } -.simple_form { - .actions { - margin-top: 15px; - } - - .button { - font-size: 15px; - } -} - .batch-form-box { display: flex; flex-wrap: wrap; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 1bfe37cee6..8b95c3776e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4650,6 +4650,7 @@ a.status-card { border: 0; background: transparent; cursor: pointer; + text-decoration: none; .icon { width: 13px; @@ -5063,7 +5064,8 @@ a.status-card { color: $dark-text-color; text-align: center; padding: 20px; - font-size: 15px; + font-size: 14px; + line-height: 20px; font-weight: 400; cursor: default; display: flex; @@ -5085,6 +5087,17 @@ a.status-card { } } +.empty-column-indicator { + &__arrow { + position: absolute; + top: 50%; + inset-inline-start: 50%; + pointer-events: none; + transform: translate(100%, -100%) rotate(12deg); + transform-origin: center; + } +} + .follow_requests-unlocked_explanation { background: var(--surface-background-color); border-bottom: 1px solid var(--background-border-color); @@ -5776,7 +5789,7 @@ a.status-card { .modal-root { position: relative; - z-index: 9999; + z-index: 9998; } .modal-root__overlay { @@ -6381,12 +6394,14 @@ a.status-card { border-radius: 16px; &__header { + box-sizing: border-box; border-bottom: 1px solid var(--modal-border-color); display: flex; align-items: center; justify-content: space-between; flex-direction: row-reverse; padding: 12px 24px; + min-height: 61px; &__title { font-size: 16px; @@ -7993,92 +8008,6 @@ noscript { background: rgba($base-overlay-background, 0.5); } -.list-adder, -.list-editor { - backdrop-filter: var(--background-filter); - background: var(--modal-background-color); - border: 1px solid var(--modal-border-color); - flex-direction: column; - border-radius: 8px; - width: 380px; - overflow: hidden; - - @media screen and (width <= 420px) { - width: 90%; - } -} - -.list-adder { - &__lists { - height: 50vh; - border-radius: 0 0 8px 8px; - overflow-y: auto; - } - - .list { - padding: 10px; - border-bottom: 1px solid var(--background-border-color); - } - - .list__wrapper { - display: flex; - } - - .list__display-name { - flex: 1 1 auto; - overflow: hidden; - text-decoration: none; - font-size: 16px; - padding: 10px; - display: flex; - align-items: center; - gap: 4px; - } -} - -.list-editor { - h4 { - padding: 15px 0; - background: lighten($ui-base-color, 13%); - font-weight: 500; - font-size: 16px; - text-align: center; - border-radius: 8px 8px 0 0; - } - - .drawer__pager { - height: 50vh; - border: 0; - } - - .drawer__inner { - &.backdrop { - width: calc(100% - 60px); - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); - border-radius: 0 0 0 8px; - } - } - - &__accounts { - background: unset; - overflow-y: auto; - } - - .account__display-name { - &:hover strong { - text-decoration: none; - } - } - - .account__avatar { - cursor: default; - } - - .search { - margin-bottom: 0; - } -} - .focal-point { position: relative; cursor: move; @@ -10142,7 +10071,7 @@ noscript { position: fixed; bottom: 2rem; inset-inline-start: 0; - z-index: 999; + z-index: 9999; display: flex; flex-direction: column; gap: 4px; @@ -11150,3 +11079,87 @@ noscript { } } } + +.lists__item { + display: flex; + align-items: center; + gap: 16px; + padding-inline-end: 13px; + border-bottom: 1px solid var(--background-border-color); + + &__title { + display: flex; + align-items: center; + gap: 5px; + padding: 16px 13px; + flex: 1 1 auto; + font-size: 16px; + line-height: 24px; + color: $secondary-text-color; + text-decoration: none; + + &:is(a):hover, + &:is(a):focus, + &:is(a):active { + color: $primary-text-color; + } + + input { + display: block; + width: 100%; + background: transparent; + border: 0; + padding: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; + + &::placeholder { + color: var(--input-placeholder-color); + opacity: 1; + } + + &:focus { + outline: 0; + } + } + } +} + +.column-search-header { + display: flex; + border-radius: 4px 4px 0 0; + border: 1px solid var(--background-border-color); + + .column-header__back-button.compact { + flex: 0 0 auto; + color: $primary-text-color; + } + + input { + background: transparent; + border: 0; + color: $primary-text-color; + font-size: 16px; + display: block; + flex: 1 1 auto; + + &::placeholder { + color: var(--input-placeholder-color); + opacity: 1; + } + + &:focus { + outline: 0; + } + } +} + +.column-footer { + padding: 16px; +} + +.lists-scrollable { + min-height: 50vh; +} diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 641fb19a57..69bd1ca9dd 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -1255,6 +1255,8 @@ code { } .app-form { + padding: 20px; + &__avatar-input, &__header-input { display: block; @@ -1370,4 +1372,55 @@ code { padding-inline-start: 16px; } } + + &__link { + display: flex; + gap: 16px; + padding: 8px 0; + align-items: center; + text-decoration: none; + color: $primary-text-color; + margin-bottom: 16px; + + &__text { + flex: 1 1 auto; + font-size: 14px; + line-height: 20px; + color: $darker-text-color; + + strong { + font-weight: 600; + display: block; + color: $primary-text-color; + } + } + } +} + +.avatar-pile { + display: flex; + align-items: center; + + img { + display: block; + border-radius: 8px; + width: 32px; + height: 32px; + border: 2px solid var(--background-color); + background: var(--surface-background-color); + margin-inline-end: -16px; + transform: rotate(0); + + &:first-child { + transform: rotate(-4deg); + } + + &:nth-child(2) { + transform: rotate(-2deg); + } + + &:last-child { + margin-inline-end: 0; + } + } } diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss index fe36e16631..2036f01aff 100644 --- a/app/javascript/styles/mastodon/variables.scss +++ b/app/javascript/styles/mastodon/variables.scss @@ -119,4 +119,5 @@ $font-monospace: 'mastodon-font-monospace' !default; --rich-text-container-color: rgba(87, 24, 60, 100%); --rich-text-text-color: rgba(255, 175, 212, 100%); --rich-text-decorations-color: rgba(128, 58, 95, 100%); + --input-placeholder-color: #{$dark-text-color}; } diff --git a/app/javascript/svg-icons/squiggly_arrow.svg b/app/javascript/svg-icons/squiggly_arrow.svg new file mode 100644 index 0000000000..ae636d7dfd --- /dev/null +++ b/app/javascript/svg-icons/squiggly_arrow.svg @@ -0,0 +1,3 @@ + + + From 4bfb8887bfac0839fd94f57ec76d082d20f4c805 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Nov 2024 17:10:07 +0100 Subject: [PATCH 09/19] Fix duplicate notifications in notification groups when using slow mode (#33014) --- .../mastodon/models/notification_group.ts | 32 +++++++++++++++---- .../mastodon/reducers/notification_groups.ts | 11 ++++--- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/javascript/mastodon/models/notification_group.ts b/app/javascript/mastodon/models/notification_group.ts index 01a341e8dd..d98e755aa2 100644 --- a/app/javascript/mastodon/models/notification_group.ts +++ b/app/javascript/mastodon/models/notification_group.ts @@ -17,6 +17,7 @@ export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8; interface BaseNotificationGroup extends Omit { sampleAccountIds: string[]; + partial: boolean; } interface BaseNotificationWithStatus @@ -142,6 +143,7 @@ export function createNotificationGroupFromJSON( return { statusId: statusId ?? undefined, sampleAccountIds, + partial: false, ...groupWithoutStatus, }; } @@ -150,12 +152,14 @@ export function createNotificationGroupFromJSON( return { report: createReportFromJSON(report), sampleAccountIds, + partial: false, ...groupWithoutTargetAccount, }; } case 'severed_relationships': return { ...group, + partial: false, event: createAccountRelationshipSeveranceEventFromJSON(group.event), sampleAccountIds, }; @@ -163,6 +167,7 @@ export function createNotificationGroupFromJSON( const { moderation_warning, ...groupWithoutModerationWarning } = group; return { ...groupWithoutModerationWarning, + partial: false, moderationWarning: createAccountWarningFromJSON(moderation_warning), sampleAccountIds, }; @@ -171,6 +176,7 @@ export function createNotificationGroupFromJSON( const { annual_report, ...groupWithoutAnnualReport } = group; return { ...groupWithoutAnnualReport, + partial: false, annualReport: createAnnualReportEventFromJSON(annual_report), sampleAccountIds, }; @@ -178,6 +184,7 @@ export function createNotificationGroupFromJSON( default: return { sampleAccountIds, + partial: false, ...group, }; } @@ -185,17 +192,17 @@ export function createNotificationGroupFromJSON( export function createNotificationGroupFromNotificationJSON( notification: ApiNotificationJSON, -) { +): NotificationGroup { const group = { sampleAccountIds: [notification.account.id], group_key: notification.group_key, notifications_count: 1, - type: notification.type, most_recent_notification_id: notification.id, page_min_id: notification.id, page_max_id: notification.id, latest_page_notification_at: notification.created_at, - } as NotificationGroup; + partial: true, + }; switch (notification.type) { case 'favourite': @@ -204,12 +211,21 @@ export function createNotificationGroupFromNotificationJSON( case 'mention': case 'poll': case 'update': - return { ...group, statusId: notification.status?.id }; + return { + ...group, + type: notification.type, + statusId: notification.status?.id, + }; case 'admin.report': - return { ...group, report: createReportFromJSON(notification.report) }; + return { + ...group, + type: notification.type, + report: createReportFromJSON(notification.report), + }; case 'severed_relationships': return { ...group, + type: notification.type, event: createAccountRelationshipSeveranceEventFromJSON( notification.event, ), @@ -217,11 +233,15 @@ export function createNotificationGroupFromNotificationJSON( case 'moderation_warning': return { ...group, + type: notification.type, moderationWarning: createAccountWarningFromJSON( notification.moderation_warning, ), }; default: - return group; + return { + ...group, + type: notification.type, + }; } } diff --git a/app/javascript/mastodon/reducers/notification_groups.ts b/app/javascript/mastodon/reducers/notification_groups.ts index 7a165f5fec..d43714beb7 100644 --- a/app/javascript/mastodon/reducers/notification_groups.ts +++ b/app/javascript/mastodon/reducers/notification_groups.ts @@ -534,10 +534,13 @@ export const notificationGroupsReducer = createReducer( if (existingGroupIndex > -1) { const existingGroup = state.groups[existingGroupIndex]; if (existingGroup && existingGroup.type !== 'gap') { - group.notifications_count += existingGroup.notifications_count; - group.sampleAccountIds = group.sampleAccountIds - .concat(existingGroup.sampleAccountIds) - .slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS); + if (group.partial) { + group.notifications_count += + existingGroup.notifications_count; + group.sampleAccountIds = group.sampleAccountIds + .concat(existingGroup.sampleAccountIds) + .slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS); + } state.groups.splice(existingGroupIndex, 1); } } From 68c778294036d9cb6234277c513a13f34f085561 Mon Sep 17 00:00:00 2001 From: Joshix-1 <57299889+Joshix-1@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:39:56 +0100 Subject: [PATCH 10/19] improve nginx.conf by setting gzip_static to on (#30698) --- dist/nginx.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/nginx.conf b/dist/nginx.conf index 5bb9903864..3ab9bb66a2 100644 --- a/dist/nginx.conf +++ b/dist/nginx.conf @@ -63,6 +63,7 @@ server { gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/x-icon; + gzip_static on; location / { try_files $uri @proxy; From 0518613dd7f821e2106f563128817c5e285008c5 Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Fri, 22 Nov 2024 09:00:14 +0100 Subject: [PATCH 11/19] LinkDetailsExtractor adjustments (#31357) --- app/lib/link_details_extractor.rb | 18 ++++++++++++------ app/lib/nokogiri_handler.rb | 4 ++++ spec/lib/link_details_extractor_spec.rb | 8 +++++--- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/lib/link_details_extractor.rb b/app/lib/link_details_extractor.rb index 56533f6553..fe7f23f481 100644 --- a/app/lib/link_details_extractor.rb +++ b/app/lib/link_details_extractor.rb @@ -157,7 +157,7 @@ class LinkDetailsExtractor end def title - html_entities.decode(structured_data&.headline || opengraph_tag('og:title') || document.xpath('//title').map(&:content).first)&.strip + html_entities.decode(structured_data&.headline || opengraph_tag('og:title') || head.at_xpath('title')&.content)&.strip end def description @@ -205,11 +205,11 @@ class LinkDetailsExtractor end def language - valid_locale_or_nil(structured_data&.language || opengraph_tag('og:locale') || document.xpath('//html').pick('lang')) + valid_locale_or_nil(structured_data&.language || opengraph_tag('og:locale') || document.root.attr('lang')) end def icon - valid_url_or_nil(structured_data&.publisher_icon || link_tag('apple-touch-icon') || link_tag('shortcut icon')) + valid_url_or_nil(structured_data&.publisher_icon || link_tag('apple-touch-icon') || link_tag('icon')) end private @@ -237,18 +237,20 @@ class LinkDetailsExtractor end def link_tag(name) - document.xpath("//link[nokogiri:link_rel_include(@rel, '#{name}')]", NokogiriHandler).pick('href') + head.at_xpath("//link[nokogiri:link_rel_include(@rel, '#{name}')]", NokogiriHandler)&.attr('href') end def opengraph_tag(name) - document.xpath("//meta[@property=\"#{name}\" or @name=\"#{name}\"]").pick('content') + head.at_xpath("//meta[nokogiri:casecmp(@property, '#{name}') or nokogiri:casecmp(@name, '#{name}')]", NokogiriHandler)&.attr('content') end def meta_tag(name) - document.xpath("//meta[@name=\"#{name}\"]").pick('content') + head.at_xpath("//meta[nokogiri:casecmp(@name, '#{name}')]", NokogiriHandler)&.attr('content') end def structured_data + return @structured_data if defined?(@structured_data) + # Some publications have more than one JSON-LD definition on the page, # and some of those definitions aren't valid JSON either, so we have # to loop through here until we find something that is the right type @@ -273,6 +275,10 @@ class LinkDetailsExtractor @document ||= detect_encoding_and_parse_document end + def head + @head ||= document.at_xpath('/html/head') + end + def detect_encoding_and_parse_document html = nil encoding = nil diff --git a/app/lib/nokogiri_handler.rb b/app/lib/nokogiri_handler.rb index 804bcb9c04..26cf457955 100644 --- a/app/lib/nokogiri_handler.rb +++ b/app/lib/nokogiri_handler.rb @@ -8,5 +8,9 @@ class NokogiriHandler def link_rel_include(token_list, token) token_list.to_s.downcase.split(WHITE_SPACE).include?(token.downcase) end + + def casecmp(str1, str2) + str1.to_s.casecmp?(str2.to_s) + end end end diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb index d8d9db0ad1..36d6f22b00 100644 --- a/spec/lib/link_details_extractor_spec.rb +++ b/spec/lib/link_details_extractor_spec.rb @@ -49,7 +49,8 @@ RSpec.describe LinkDetailsExtractor do Man bites dog - + + HTML @@ -59,7 +60,8 @@ RSpec.describe LinkDetailsExtractor do .to have_attributes( title: eq('Man bites dog'), description: eq("A dog's tale"), - language: eq('en') + language: eq('en'), + icon: eq('https://example.com/favicon.ico') ) end end @@ -256,7 +258,7 @@ RSpec.describe LinkDetailsExtractor do - + From d75088d69967090bd9c16b6d1f1c06799a70c4f8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 22 Nov 2024 09:30:57 +0100 Subject: [PATCH 12/19] Fix pushing hashtag-followed posts to feeds of inactive users (#33018) --- app/models/tag_follow.rb | 2 ++ app/services/fan_out_on_write_service.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/models/tag_follow.rb b/app/models/tag_follow.rb index abe36cd171..528616c450 100644 --- a/app/models/tag_follow.rb +++ b/app/models/tag_follow.rb @@ -21,4 +21,6 @@ class TagFollow < ApplicationRecord accepts_nested_attributes_for :tag rate_limit by: :account, family: :follows + + scope :for_local_distribution, -> { joins(account: :user).merge(User.signed_in_recently) } end diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 50b414bc52..3c084bc857 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -103,7 +103,7 @@ class FanOutOnWriteService < BaseService end def deliver_to_hashtag_followers! - TagFollow.where(tag_id: @status.tags.map(&:id)).select(:id, :account_id).reorder(nil).find_in_batches do |follows| + TagFollow.for_local_distribution.where(tag_id: @status.tags.map(&:id)).select(:id, :account_id).reorder(nil).find_in_batches do |follows| FeedInsertWorker.push_bulk(follows) do |follow| [@status.id, follow.account_id, 'tags', { 'update' => update? }] end From be2d4615ab1095f975306fe50f1d1e94601d9dbb Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 22 Nov 2024 03:31:23 -0500 Subject: [PATCH 13/19] Rely on Rails to enable YJIT when available (#33017) --- config/initializers/enable_yjit.rb | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 config/initializers/enable_yjit.rb diff --git a/config/initializers/enable_yjit.rb b/config/initializers/enable_yjit.rb deleted file mode 100644 index 7b1053ec11..0000000000 --- a/config/initializers/enable_yjit.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -# Automatically enable YJIT as of Ruby 3.3, as it brings very -# sizeable performance improvements. - -# If you are deploying to a memory constrained environment -# you may want to delete this file, but otherwise it's free -# performance. -if defined?(RubyVM::YJIT.enable) - Rails.application.config.after_initialize do - RubyVM::YJIT.enable - end -end From 2e5abe4720a972789e2a83b5e44b7ea24cfcd4c3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 08:33:43 +0000 Subject: [PATCH 14/19] Update Yarn to v4.5.2 (#33021) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- streaming/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f907dc4f6c..4eb95d4389 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.5.1", + "packageManager": "yarn@4.5.2", "engines": { "node": ">=18" }, diff --git a/streaming/package.json b/streaming/package.json index 380f1c429d..521544f42b 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/streaming", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.5.1", + "packageManager": "yarn@4.5.2", "engines": { "node": ">=18" }, From 47190087f804b503a558cccd5e2135ff0eaf9e5a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:44:09 +0100 Subject: [PATCH 15/19] New Crowdin Translations (automated) (#33020) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/af.json | 8 ---- app/javascript/mastodon/locales/an.json | 9 ----- app/javascript/mastodon/locales/ar.json | 10 ----- app/javascript/mastodon/locales/ast.json | 7 ---- app/javascript/mastodon/locales/be.json | 10 ----- app/javascript/mastodon/locales/bg.json | 35 +++++++++++----- app/javascript/mastodon/locales/bn.json | 8 ---- app/javascript/mastodon/locales/br.json | 9 ----- app/javascript/mastodon/locales/ca.json | 10 ----- app/javascript/mastodon/locales/ckb.json | 9 ----- app/javascript/mastodon/locales/co.json | 9 ----- app/javascript/mastodon/locales/cs.json | 10 ----- app/javascript/mastodon/locales/cy.json | 10 ----- app/javascript/mastodon/locales/da.json | 33 ++++++++++----- app/javascript/mastodon/locales/de.json | 34 +++++++++++----- app/javascript/mastodon/locales/el.json | 10 ----- app/javascript/mastodon/locales/en-GB.json | 38 +++++++++++++----- app/javascript/mastodon/locales/eo.json | 10 ----- app/javascript/mastodon/locales/es-AR.json | 10 ----- app/javascript/mastodon/locales/es-MX.json | 10 ----- app/javascript/mastodon/locales/es.json | 10 ----- app/javascript/mastodon/locales/et.json | 10 ----- app/javascript/mastodon/locales/eu.json | 10 ----- app/javascript/mastodon/locales/fa.json | 10 ----- app/javascript/mastodon/locales/fi.json | 34 +++++++++++----- app/javascript/mastodon/locales/fil.json | 8 ---- app/javascript/mastodon/locales/fo.json | 10 ----- app/javascript/mastodon/locales/fr-CA.json | 10 ----- app/javascript/mastodon/locales/fr.json | 10 ----- app/javascript/mastodon/locales/fy.json | 10 ----- app/javascript/mastodon/locales/ga.json | 10 ----- app/javascript/mastodon/locales/gd.json | 10 ----- app/javascript/mastodon/locales/gl.json | 10 ----- app/javascript/mastodon/locales/he.json | 34 +++++++++++----- app/javascript/mastodon/locales/hi.json | 8 ---- app/javascript/mastodon/locales/hr.json | 8 ---- app/javascript/mastodon/locales/hu.json | 10 ----- app/javascript/mastodon/locales/hy.json | 9 ----- app/javascript/mastodon/locales/ia.json | 10 ----- app/javascript/mastodon/locales/id.json | 9 ----- app/javascript/mastodon/locales/ie.json | 10 ----- app/javascript/mastodon/locales/ig.json | 1 - app/javascript/mastodon/locales/io.json | 10 ----- app/javascript/mastodon/locales/is.json | 34 +++++++++++----- app/javascript/mastodon/locales/it.json | 10 ----- app/javascript/mastodon/locales/ja.json | 10 ----- app/javascript/mastodon/locales/ka.json | 6 --- app/javascript/mastodon/locales/kab.json | 10 ----- app/javascript/mastodon/locales/kk.json | 8 ---- app/javascript/mastodon/locales/ko.json | 10 ----- app/javascript/mastodon/locales/ku.json | 9 ----- app/javascript/mastodon/locales/kw.json | 9 ----- app/javascript/mastodon/locales/la.json | 4 -- app/javascript/mastodon/locales/lad.json | 10 ----- app/javascript/mastodon/locales/lt.json | 34 +++++++++++----- app/javascript/mastodon/locales/lv.json | 10 ----- app/javascript/mastodon/locales/ml.json | 8 ---- app/javascript/mastodon/locales/mr.json | 8 ---- app/javascript/mastodon/locales/ms.json | 10 ----- app/javascript/mastodon/locales/my.json | 10 ----- app/javascript/mastodon/locales/nl.json | 34 +++++++++++----- app/javascript/mastodon/locales/nn.json | 10 ----- app/javascript/mastodon/locales/no.json | 10 ----- app/javascript/mastodon/locales/oc.json | 9 ----- app/javascript/mastodon/locales/pa.json | 2 - app/javascript/mastodon/locales/pl.json | 10 ----- app/javascript/mastodon/locales/pt-BR.json | 34 +++++++++++----- app/javascript/mastodon/locales/pt-PT.json | 10 ----- app/javascript/mastodon/locales/ro.json | 9 ----- app/javascript/mastodon/locales/ru.json | 10 ----- app/javascript/mastodon/locales/sa.json | 9 ----- app/javascript/mastodon/locales/sc.json | 10 ----- app/javascript/mastodon/locales/sco.json | 9 ----- app/javascript/mastodon/locales/si.json | 8 ---- app/javascript/mastodon/locales/sk.json | 10 ----- app/javascript/mastodon/locales/sl.json | 42 +++++++++++++++----- app/javascript/mastodon/locales/sq.json | 34 +++++++++++----- app/javascript/mastodon/locales/sr-Latn.json | 10 ----- app/javascript/mastodon/locales/sr.json | 10 ----- app/javascript/mastodon/locales/sv.json | 10 ----- app/javascript/mastodon/locales/ta.json | 8 ---- app/javascript/mastodon/locales/te.json | 8 ---- app/javascript/mastodon/locales/th.json | 10 ----- app/javascript/mastodon/locales/tok.json | 7 ---- app/javascript/mastodon/locales/tr.json | 33 ++++++++++----- app/javascript/mastodon/locales/tt.json | 6 --- app/javascript/mastodon/locales/uk.json | 12 +----- app/javascript/mastodon/locales/ur.json | 1 - app/javascript/mastodon/locales/uz.json | 7 ---- app/javascript/mastodon/locales/vi.json | 34 +++++++++++----- app/javascript/mastodon/locales/zgh.json | 7 ---- app/javascript/mastodon/locales/zh-CN.json | 36 ++++++++++++----- app/javascript/mastodon/locales/zh-HK.json | 10 ----- app/javascript/mastodon/locales/zh-TW.json | 34 +++++++++++----- config/locales/simple_form.zh-CN.yml | 2 +- 95 files changed, 399 insertions(+), 856 deletions(-) diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index a506b99654..bf84cff111 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -154,7 +154,6 @@ "empty_column.hashtag": "Daar is nog niks vir hierdie hutsetiket nie.", "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", "empty_column.list": "Hierdie lys is nog leeg. Nuwe plasings deur lyslede sal voortaan hier verskyn.", - "empty_column.lists": "Jy het nog geen lyste nie. Wanneer jy een skep, sal dit hier vertoon.", "empty_column.notifications": "Jy het nog geen kennisgewings nie. Interaksie van ander mense met jou, sal hier vertoon.", "explore.search_results": "Soekresultate", "explore.suggested_follows": "Mense", @@ -222,15 +221,8 @@ "limited_account_hint.action": "Vertoon profiel in elk geval", "limited_account_hint.title": "Hierdie profiel is deur moderators van {domain} versteek.", "link_preview.author": "Deur {name}", - "lists.account.add": "Voeg by lys", - "lists.account.remove": "Verwyder vanaf lys", "lists.delete": "Verwyder lys", "lists.edit": "Redigeer lys", - "lists.edit.submit": "Verander titel", - "lists.new.create": "Voeg lys by", - "lists.new.title_placeholder": "Nuwe lys titel", - "lists.search": "Soek tussen mense wat jy volg", - "lists.subheading": "Jou lyste", "moved_to_account_banner.text": "Jou rekening {disabledAccount} is tans gedeaktiveer omdat jy na {movedToAccount} verhuis het.", "navigation_bar.about": "Oor", "navigation_bar.bookmarks": "Boekmerke", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index be303985ee..11be07e990 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -186,7 +186,6 @@ "empty_column.hashtag": "No i hai cosa en este hashtag encara.", "empty_column.home": "La tuya linia temporal ye vueda! Sigue a mas personas pa replenar-la. {suggestions}", "empty_column.list": "No i hai cosa en esta lista encara. Quan miembros d'esta lista publiquen nuevos estatus, estes amaneixerán qui.", - "empty_column.lists": "No tiens garra lista. Quan en crees una, s'amostrará aquí.", "empty_column.mutes": "Encara no has silenciau a garra usuario.", "empty_column.notifications": "No tiens garra notificación encara. Interactúa con atros pa empecipiar una conversación.", "empty_column.public": "No i hai cosa aquí! Escribe bella cosa publicament, u sigue usuarios d'atras instancias manualment pa emplir-lo", @@ -292,19 +291,11 @@ "lightbox.previous": "Anterior", "limited_account_hint.action": "Amostrar perfil de totz modos", "limited_account_hint.title": "Este perfil ha estau amagau per los moderadors de {domain}.", - "lists.account.add": "Anyadir a lista", - "lists.account.remove": "Sacar de lista", "lists.delete": "Borrar lista", "lists.edit": "Editar lista", - "lists.edit.submit": "Cambiar titol", - "lists.new.create": "Anyadir lista", - "lists.new.title_placeholder": "Titol d'a nueva lista", "lists.replies_policy.followed": "Qualsequier usuario seguiu", "lists.replies_policy.list": "Miembros d'a lista", "lists.replies_policy.none": "Dengún", - "lists.replies_policy.title": "Amostrar respuestas a:", - "lists.search": "Buscar entre la chent a la quala sigues", - "lists.subheading": "Las tuyas listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "moved_to_account_banner.text": "La tuya cuenta {disabledAccount} ye actualment deshabilitada perque t'has mudau a {movedToAccount}.", "navigation_bar.about": "Sobre", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 7892766d87..f17d3dae22 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -269,7 +269,6 @@ "empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.", "empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسة فارغ. قم بمتابعة المزيد من الناس كي يمتلأ.", "empty_column.list": "هذه القائمة فارغة مؤقتا و لكن سوف تمتلئ تدريجيا عندما يبدأ الأعضاء المُنتَمين إليها بنشر منشورات.", - "empty_column.lists": "ليس عندك أية قائمة بعد. سوف تظهر قوائمك هنا إن قمت بإنشاء واحدة.", "empty_column.mutes": "لم تقم بكتم أي مستخدم بعد.", "empty_column.notification_requests": "لا يوجد شيء هنا. عندما تتلقى إشعارات جديدة، سوف تظهر هنا وفقًا لإعداداتك.", "empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.", @@ -425,20 +424,11 @@ "limited_account_hint.title": "تم إخفاء هذا الملف الشخصي من قبل مشرفي {domain}.", "link_preview.author": "مِن {name}", "link_preview.more_from_author": "المزيد من {name}", - "lists.account.add": "أضف إلى القائمة", - "lists.account.remove": "احذف من القائمة", "lists.delete": "احذف القائمة", "lists.edit": "عدّل القائمة", - "lists.edit.submit": "تعديل العنوان", - "lists.exclusive": "إخفاء هذه المنشورات من الخيط الرئيسي", - "lists.new.create": "إضافة قائمة", - "lists.new.title_placeholder": "عنوان القائمة الجديدة", "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 {# عنصر جديد} other {# عناصر جديدة}}", "loading_indicator.label": "جاري التحميل…", "media_gallery.hide": "إخفاء", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index e5b1168bea..e6659510d2 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -155,7 +155,6 @@ "empty_column.hashtag": "Entá nun hai nada con esta etiqueta.", "empty_column.home": "¡La to llinia de tiempu ta balera! Sigui a cuentes pa enllenala.", "empty_column.list": "Nun hai nada nesta llista. Cuando los perfiles d'esta llista espublicen artículos nuevos, apaecen equí.", - "empty_column.lists": "Nun tienes nenguna llista. Cuando crees dalguna, apaez equí.", "empty_column.mutes": "Nun tienes nengún perfil colos avisos desactivaos.", "empty_column.notifications": "Nun tienes nengún avisu. Cuando otros perfiles interactúen contigo, apaez equí.", "empty_column.public": "¡Equí nun hai nada! Escribi daqué públicamente o sigui a perfiles d'otros sirvidores pa enllenar esta seición", @@ -260,15 +259,9 @@ "limited_account_hint.action": "Amosar el perfil de toes toes", "lists.delete": "Desaniciar la llista", "lists.edit": "Editar la llista", - "lists.edit.submit": "Camudar el títulu", - "lists.new.create": "Amestar la llista", - "lists.new.title_placeholder": "Títulu", "lists.replies_policy.followed": "Cualesquier perfil siguíu", "lists.replies_policy.list": "Perfiles de la llista", "lists.replies_policy.none": "Naide", - "lists.replies_policy.title": "Amosar les rempuestes a:", - "lists.search": "Buscar ente los perfiles que sigues", - "lists.subheading": "Les tos llistes", "load_pending": "{count, plural, one {# elementu nuevu} other {# elementos nuevos}}", "navigation_bar.about": "Tocante a", "navigation_bar.blocks": "Perfiles bloquiaos", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 06d86a0e85..26a42ebc69 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -273,7 +273,6 @@ "empty_column.hashtag": "Па гэтаму хэштэгу пакуль што нічога няма.", "empty_column.home": "Галоўная стужка пустая! Падпішыцеся на іншых людзей, каб запоўніць яе. {suggestions}", "empty_column.list": "У гэтым спісе пакуль што нічога няма. Калі члены лісту апублікуюць новыя запісы, яны з'явяцца тут.", - "empty_column.lists": "Як толькі вы створыце новы спіс ён будзе захоўвацца тут, але пакуль што тут пуста.", "empty_column.mutes": "Вы яшчэ нікога не ігнаруеце.", "empty_column.notification_requests": "Чысціня! Тут нічога няма. Калі вы будзеце атрымліваць новыя апавяшчэння, яны будуць з'яўляцца тут у адпаведнасці з вашымі наладамі.", "empty_column.notifications": "У вас няма ніякіх апавяшчэнняў. Калі іншыя людзі ўзаемадзейнічаюць з вамі, вы ўбачыце гэта тут.", @@ -427,20 +426,11 @@ "link_preview.author": "Ад {name}", "link_preview.more_from_author": "Больш ад {name}", "link_preview.shares": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}", - "lists.account.add": "Дадаць да спісу", - "lists.account.remove": "Выдаліць са спісу", "lists.delete": "Выдаліць спіс", "lists.edit": "Рэдагаваць спіс", - "lists.edit.submit": "Змяніць назву", - "lists.exclusive": "Схаваць гэтыя допісы з галоўнай старонкі", - "lists.new.create": "Дадаць спіс", - "lists.new.title_placeholder": "Назва новага спіса", "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 {# новы элемент} few {# новыя элементы} many {# новых элементаў} other {# новых элементаў}}", "loading_indicator.label": "Загрузка…", "media_gallery.hide": "Схаваць", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 456247cedf..32d61423d6 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -139,13 +139,16 @@ "column.blocks": "Блокирани потребители", "column.bookmarks": "Отметки", "column.community": "Локален инфопоток", + "column.create_list": "Създаване на списък", "column.direct": "Частни споменавания", "column.directory": "Разглеждане на профили", "column.domain_blocks": "Блокирани домейни", + "column.edit_list": "Промяна на списъка", "column.favourites": "Любими", "column.firehose": "Инфоканали на живо", "column.follow_requests": "Заявки за последване", "column.home": "Начало", + "column.list_members": "Управление на списъка с участници", "column.lists": "Списъци", "column.mutes": "Заглушени потребители", "column.notifications": "Известия", @@ -289,7 +292,6 @@ "empty_column.hashtag": "Още няма нищо в този хаштаг.", "empty_column.home": "Вашата начална часова ос е празна! Последвайте повече хора, за да я запълните. {suggestions}", "empty_column.list": "Все още списъкът е празен. Членуващите на списъка, публикуващи нови публикации, ще се появят тук.", - "empty_column.lists": "Все още нямате списъци. Когато създадете такъв, той ще се покаже тук.", "empty_column.mutes": "Още не сте заглушавали потребители.", "empty_column.notification_requests": "Всичко е чисто! Тук няма нищо. Получавайки нови известия, те ще се появят тук според настройките ви.", "empty_column.notifications": "Все още нямате известия. Взаимодействайте с другите, за да започнете разговора.", @@ -389,10 +391,16 @@ "ignore_notifications_modal.disclaimer": "Mastodon не може да осведоми потребители, че сте пренебрегнали известията им. Пренебрегването на известията няма да спре самите съобщения да не бъдат изпращани.", "ignore_notifications_modal.filter_to_act_users": "Вие все още ще може да приемате, отхвърляте или докладвате потребители", "ignore_notifications_modal.filter_to_avoid_confusion": "Прецеждането помага за избягване на възможно объркване", + "ignore_notifications_modal.ignore": "Пренебрегване на известията", + "ignore_notifications_modal.limited_accounts_title": "Пренебрегвате ли известията от модерирани акаунти?", + "ignore_notifications_modal.new_accounts_title": "Пренебрегвате ли известията от нови акаунти?", + "ignore_notifications_modal.not_followers_title": "Пренебрегвате ли известията от хора, които не са ви последвали?", + "ignore_notifications_modal.not_following_title": "Пренебрегвате ли известията от хора, които не сте последвали?", "interaction_modal.description.favourite": "Имайки акаунт в Mastodon, може да сложите тази публикации в любими, за да позволите на автора да узнае, че я цените и да я запазите за по-късно.", "interaction_modal.description.follow": "С акаунт в Mastodon може да последвате {name}, за да получавате публикациите от този акаунт в началния си инфоканал.", "interaction_modal.description.reblog": "С акаунт в Mastodon може да подсилите тази публикация, за да я споделите с последователите си.", "interaction_modal.description.reply": "С акаунт в Mastodon може да добавите отговор към тази публикация.", + "interaction_modal.description.vote": "Имайки акаунт в Mastodon, можете да гласувате в тази анкета.", "interaction_modal.login.action": "Към началото", "interaction_modal.login.prompt": "Домейнът на сървъра ви, примерно, mastodon.social", "interaction_modal.no_account_yet": "Още не е в Мастодон?", @@ -452,20 +460,22 @@ "link_preview.author": "От {name}", "link_preview.more_from_author": "Още от {name}", "link_preview.shares": "{count, plural, one {{counter} публикация} other {{counter} публикации}}", - "lists.account.add": "Добавяне към списък", - "lists.account.remove": "Премахване от списъка", + "lists.create_list": "Създаване на списък", "lists.delete": "Изтриване на списъка", + "lists.done": "Готово", "lists.edit": "Промяна на списъка", - "lists.edit.submit": "Промяна на заглавие", - "lists.exclusive": "Скриване на тези публикации от началото", - "lists.new.create": "Добавяне на списък", - "lists.new.title_placeholder": "Ново заглавие на списъка", + "lists.find_users_to_add": "Намерете потребители за добавяне", + "lists.list_members": "Списък членуващи", + "lists.list_name": "Име на списък", + "lists.no_lists_yet": "Още няма списъци.", + "lists.no_members_yet": "Още няма членуващи.", + "lists.no_results_found": "Няма намерени резултати.", + "lists.remove_member": "Премахване", "lists.replies_policy.followed": "Някой последван потребител", "lists.replies_policy.list": "Членуващите в списъка", "lists.replies_policy.none": "Никого", - "lists.replies_policy.title": "Показване на отговори на:", - "lists.search": "Търсене измежду последваните", - "lists.subheading": "Вашите списъци", + "lists.save": "Запазване", + "lists.search_placeholder": "Търсене сред, които сте последвали", "load_pending": "{count, plural, one {# нов елемент} other {# нови елемента}}", "loading_indicator.label": "Зареждане…", "media_gallery.hide": "Скриване", @@ -596,6 +606,7 @@ "notifications.permission_required": "Известията на работния плот ги няма, щото няма дадено нужното позволение.", "notifications.policy.accept": "Приемам", "notifications.policy.accept_hint": "Показване в известия", + "notifications.policy.drop_hint": "Изпращане в празнотата, за да не се видим никога пак", "notifications.policy.filter": "Филтър", "notifications.policy.filter_limited_accounts_hint": "Ограничено от модераторите на сървъра", "notifications.policy.filter_limited_accounts_title": "Модерирани акаунти", @@ -855,6 +866,10 @@ "upload_form.audio_description": "Опишете за хора, които са глухи или трудно чуват", "upload_form.description": "Опишете за хора, които са слепи или имат слабо зрение", "upload_form.drag_and_drop.instructions": "Натиснете интервал или enter, за да подберете мултимедийно прикачване. Провлачвайки, ползвайте клавишите със стрелки, за да премествате мултимедията във всяка дадена посока. Натиснете пак интервал или enter, за да се стовари мултимедийното прикачване в новото си положение или натиснете Esc за отмяна.", + "upload_form.drag_and_drop.on_drag_cancel": "Провлачването е отменено. Мултимедийното прикачване {item} е спуснато.", + "upload_form.drag_and_drop.on_drag_end": "Мултимедийното прикачване {item} е спуснато.", + "upload_form.drag_and_drop.on_drag_over": "Мултимедийното прикачване {item} е преместено.", + "upload_form.drag_and_drop.on_drag_start": "Избрано мултимедийно прикачване {item}.", "upload_form.edit": "Редактиране", "upload_form.thumbnail": "Промяна на миниобраза", "upload_form.video_description": "Опишете за хора, които са глухи или трудно чуват, слепи или имат слабо зрение", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 9512f6a92b..03f59e1db4 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -202,7 +202,6 @@ "empty_column.hashtag": "এই হেসটাগে এখনো কিছু নেই।", "empty_column.home": "আপনার বাড়ির সময়রেখা এখনো খালি! {public} এ ঘুরে আসুন অথবা অনুসন্ধান বেবহার করে শুরু করতে পারেন এবং অন্য ব্যবহারকারীদের সাথে সাক্ষাৎ করতে পারেন।", "empty_column.list": "এই তালিকাতে এখনো কিছু নেই. যখন এই তালিকায় থাকা ব্যবহারকারী নতুন কিছু লিখবে, সেগুলো এখানে পাওয়া যাবে।", - "empty_column.lists": "আপনার এখনো কোনো তালিকা তৈরী নেই। যদি বা যখন তৈরী করেন, সেগুলো এখানে পাওয়া যাবে।", "empty_column.mutes": "আপনি এখনো কোনো ব্যবহারকারীকে নিঃশব্দ করেননি।", "empty_column.notifications": "আপনার এখনো কোনো প্রজ্ঞাপন নেই। কথোপকথন শুরু করতে, অন্যদের সাথে মেলামেশা করতে পারেন।", "empty_column.public": "এখানে এখনো কিছু নেই! প্রকাশ্য ভাবে কিছু লিখুন বা অন্য সার্ভার থেকে কাওকে অনুসরণ করে এই জায়গা ভরে ফেলুন", @@ -277,16 +276,9 @@ "lightbox.next": "পরবর্তী", "lightbox.previous": "পূর্ববর্তী", "link_preview.author": "{name} এর লিখা", - "lists.account.add": "তালিকাতে যুক্ত করতে", - "lists.account.remove": "তালিকা থেকে বাদ দিতে", "lists.delete": "তালিকা মুছে ফেলতে", "lists.edit": "তালিকা সম্পাদনা করতে", - "lists.edit.submit": "শিরোনাম সম্পাদনা করতে", - "lists.new.create": "তালিকাতে যুক্ত করতে", - "lists.new.title_placeholder": "তালিকার নতুন শিরোনাম দিতে", "lists.replies_policy.none": "কেউ না", - "lists.search": "যাদের অনুসরণ করেন তাদের ভেতরে খুঁজুন", - "lists.subheading": "আপনার তালিকা", "load_pending": "{count, plural, one {# নতুন জিনিস} other {# নতুন জিনিস}}", "navigation_bar.about": "পরিচিতি", "navigation_bar.blocks": "বন্ধ করা ব্যবহারকারী", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 13ca521ab0..da99874f0b 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -223,7 +223,6 @@ "empty_column.hashtag": "N'eus netra en hashtag-mañ c'hoazh.", "empty_column.home": "Goullo eo ho red-amzer degemer! Kit da weladenniñ {public} pe implijit ar c'hlask evit kregiñ ganti ha kejañ gant implijer·ien·ezed all.", "empty_column.list": "Goullo eo al listenn-mañ evit c'hoazh. Pa vo embannet toudoù nevez gant e izili e teuint war wel amañ.", - "empty_column.lists": "N'ho peus roll ebet c'hoazh. Pa vo krouet unan ganeoc'h e vo diskouezet amañ.", "empty_column.mutes": "N'ho peus kuzhet implijer ebet c'hoazh.", "empty_column.notifications": "N'ho peus kemenn ebet c'hoazh. Grit gant implijer·ezed·ien all evit loc'hañ ar gomz.", "empty_column.public": "N'eus netra amañ! Skrivit un dra bennak foran pe heuilhit implijer·ien·ezed eus dafariadoù all evit leuniañ", @@ -346,19 +345,11 @@ "limited_account_hint.action": "Diskouez an aelad memes tra", "limited_account_hint.title": "Kuzhet eo bet ar profil-mañ gant an evezhierien eus {domain}.", "link_preview.author": "Gant {name}", - "lists.account.add": "Ouzhpennañ d'al listenn", - "lists.account.remove": "Lemel kuit eus al listenn", "lists.delete": "Dilemel al listenn", "lists.edit": "Kemmañ al listenn", - "lists.edit.submit": "Cheñch an titl", - "lists.new.create": "Ouzhpennañ ul listenn", - "lists.new.title_placeholder": "Titl nevez al listenn", "lists.replies_policy.followed": "Pep implijer.ez heuliet", "lists.replies_policy.list": "Izili ar roll", "lists.replies_policy.none": "Den ebet", - "lists.replies_policy.title": "Diskouez ar respontoù:", - "lists.search": "Klask e-touez tud heuliet ganeoc'h", - "lists.subheading": "Ho listennoù", "load_pending": "{count, plural, one {# dra nevez} other {# dra nevez}}", "loading_indicator.label": "O kargañ…", "navigation_bar.about": "Diwar-benn", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 53bfc4474c..fc100d7c01 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -286,7 +286,6 @@ "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.list": "Encara no hi ha res en aquesta llista. Quan els membres facin nous tuts, apareixeran aquí.", - "empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.", "empty_column.mutes": "Encara no has silenciat cap usuari.", "empty_column.notification_requests": "Tot net, ja no hi ha res aquí! Quan rebeu notificacions noves, segons la vostra configuració, apareixeran aquí.", "empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.", @@ -459,20 +458,11 @@ "link_preview.author": "Per {name}", "link_preview.more_from_author": "Més de {name}", "link_preview.shares": "{count, plural, one {{counter} publicació} other {{counter} publicacions}}", - "lists.account.add": "Afegeix a la llista", - "lists.account.remove": "Elimina de la llista", "lists.delete": "Elimina la llista", "lists.edit": "Edita la llista", - "lists.edit.submit": "Canvia el títol", - "lists.exclusive": "Amaga aquests tuts a Inici", - "lists.new.create": "Afegeix una 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": "Cerca entre les persones que segueixes", - "lists.subheading": "Les teves llistes", "load_pending": "{count, plural, one {# element nou} other {# elements nous}}", "loading_indicator.label": "Es carrega…", "media_gallery.hide": "Amaga", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 469cf4410d..292aefb4cf 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -221,7 +221,6 @@ "empty_column.hashtag": "هێشتا هیچ شتێک لەم هاشتاگەدا نییە.", "empty_column.home": "تایم لاینی ماڵەوەت بەتاڵە! سەردانی {public} بکە یان گەڕان بەکاربێنە بۆ دەستپێکردن و بینینی بەکارهێنەرانی تر.", "empty_column.list": "هێشتا هیچ شتێک لەم لیستەدا نییە. کاتێک ئەندامانی ئەم لیستە دەنگی نوێ بڵاودەکەن، لێرە دەردەکەون.", - "empty_column.lists": "تۆ هێشتا هیچ لیستت دروست نەکردووە، کاتێک دانەیەک دروست دەکەیت، لێرە پیشان دەدرێت.", "empty_column.mutes": "تۆ هێشتا هیچ بەکارهێنەرێکت بێدەنگ نەکردووە.", "empty_column.notifications": "تۆ هێشتا هیچ ئاگانامێکت نیە. چالاکی لەگەڵ کەسانی دیکە بکە بۆ دەستپێکردنی گفتوگۆکە.", "empty_column.public": "لێرە هیچ نییە! شتێک بە ئاشکرا بنووسە(بەگشتی)، یان بە دەستی شوێن بەکارهێنەران بکەوە لە ڕاژەکانی ترەوە بۆ پڕکردنەوەی", @@ -338,19 +337,11 @@ "lightbox.previous": "پێشوو", "limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە", "limited_account_hint.title": "ئەم پرۆفایلە لەلایەن بەڕێوەبەرانی {domain} شاراوەتەوە.", - "lists.account.add": "زیادکردن بۆ لیست", - "lists.account.remove": "لابردن لە لیست", "lists.delete": "سڕینەوەی لیست", "lists.edit": "دەستکاری لیست", - "lists.edit.submit": "گۆڕینی ناونیشان", - "lists.new.create": "زیادکردنی لیست", - "lists.new.title_placeholder": "ناونیشانی لیستی نوێ", "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 {# بەڕگەی نوێ} other {# بەڕگەی نوێ}}", "moved_to_account_banner.text": "ئەکاونتەکەت {disabledAccount} لە ئێستادا لەکارخراوە چونکە تۆ چوویتە {movedToAccount}.", "navigation_bar.about": "دەربارە", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 043061769b..033f3fc80b 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -132,7 +132,6 @@ "empty_column.hashtag": "Ùn c'hè ancu nunda quì.", "empty_column.home": "A vostr'accolta hè viota! Pudete andà nant'à {public} o pruvà a ricerca per truvà parsone da siguità.", "empty_column.list": "Ùn c'hè ancu nunda quì. Quandu membri di sta lista manderanu novi statuti, i vidarete quì.", - "empty_column.lists": "Ùn avete manc'una lista. Quandu farete una, sarà mustrata quì.", "empty_column.mutes": "Per avà ùn avete manc'un utilizatore piattatu.", "empty_column.notifications": "Ùn avete ancu nisuna nutificazione. Interact with others to start the conversation.", "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altri servori per empie a linea pubblica", @@ -198,19 +197,11 @@ "lightbox.close": "Chjudà", "lightbox.next": "Siguente", "lightbox.previous": "Pricidente", - "lists.account.add": "Aghjunghje à a lista", - "lists.account.remove": "Toglie di a lista", "lists.delete": "Toglie a lista", "lists.edit": "Mudificà a lista", - "lists.edit.submit": "Cambià u titulu", - "lists.new.create": "Aghjunghje", - "lists.new.title_placeholder": "Titulu di a lista", "lists.replies_policy.followed": "Tutti i vostri abbunamenti", "lists.replies_policy.list": "Membri di a lista", "lists.replies_policy.none": "Nimu", - "lists.replies_policy.title": "Vede e risposte à:", - "lists.search": "Circà indè i vostr'abbunamenti", - "lists.subheading": "E vo liste", "load_pending": "{count, plural, one {# entrata nova} other {# entrate nove}}", "navigation_bar.blocks": "Utilizatori bluccati", "navigation_bar.bookmarks": "Segnalibri", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 7198bcab58..89db6c5cb3 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -267,7 +267,6 @@ "empty_column.hashtag": "Pod tímto hashtagem zde zatím nic není.", "empty_column.home": "Vaše domovská časová osa je prázdná! Naplňte ji sledováním dalších lidí.", "empty_column.list": "V tomto seznamu zatím nic není. Až nějaký člen z tohoto seznamu zveřejní nový příspěvek, objeví se zde.", - "empty_column.lists": "Zatím nemáte žádné seznamy. Až nějaký vytvoříte, zobrazí se zde.", "empty_column.mutes": "Zatím jste neskryli žádného uživatele.", "empty_column.notification_requests": "Vyčištěno! Nic tu není. Jakmile obdržíš nové notifikace, objeví se zde podle tvého nastavení.", "empty_column.notifications": "Zatím nemáte žádná oznámení. Až s vámi někdo bude interagovat, uvidíte to zde.", @@ -415,20 +414,11 @@ "link_preview.author": "Podle {name}", "link_preview.more_from_author": "Více od {name}", "link_preview.shares": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}", - "lists.account.add": "Přidat do seznamu", - "lists.account.remove": "Odebrat ze seznamu", "lists.delete": "Smazat seznam", "lists.edit": "Upravit seznam", - "lists.edit.submit": "Změnit název", - "lists.exclusive": "Skrýt tyto příspěvky z domovské stránky", - "lists.new.create": "Přidat seznam", - "lists.new.title_placeholder": "Název nového seznamu", "lists.replies_policy.followed": "Sledovaným uživatelům", "lists.replies_policy.list": "Členům seznamu", "lists.replies_policy.none": "Nikomu", - "lists.replies_policy.title": "Odpovědi zobrazovat:", - "lists.search": "Hledejte mezi lidmi, které sledujete", - "lists.subheading": "Vaše seznamy", "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položek} other {# nových položek}}", "loading_indicator.label": "Načítání…", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 1fa17e56ea..c4f79da43a 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.", "empty_column.home": "Mae eich ffrwd gartref yn wag! Dilynwch fwy o bobl i'w llenwi.", "empty_column.list": "Does dim yn y rhestr yma eto. Pan fydd aelodau'r rhestr yn cyhoeddi postiad newydd, mi fydd yn ymddangos yma.", - "empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan fyddwch yn creu un, mi fydd yn ymddangos yma.", "empty_column.mutes": "Nid ydych wedi tewi unrhyw ddefnyddwyr eto.", "empty_column.notification_requests": "Dim i boeni amdano! Does dim byd yma. Pan fyddwch yn derbyn hysbysiadau newydd, byddan nhw'n ymddangos yma yn ôl eich gosodiadau.", "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ag eraill i ddechrau'r sgwrs.", @@ -465,20 +464,11 @@ "link_preview.author": "Gan {name}", "link_preview.more_from_author": "Mwy gan {name}", "link_preview.shares": "{count, plural, one {{counter} postiad } two {{counter} bostiad } few {{counter} postiad} many {{counter} postiad} other {{counter} postiad}}", - "lists.account.add": "Ychwanegu at restr", - "lists.account.remove": "Tynnu o'r rhestr", "lists.delete": "Dileu rhestr", "lists.edit": "Golygu rhestr", - "lists.edit.submit": "Newid teitl", - "lists.exclusive": "Cuddio'r postiadau hyn o'r ffrwd gartref", - "lists.new.create": "Ychwanegu rhestr", - "lists.new.title_placeholder": "Teitl rhestr newydd", "lists.replies_policy.followed": "Unrhyw ddefnyddiwr sy'n cael ei ddilyn", "lists.replies_policy.list": "Aelodau'r rhestr", "lists.replies_policy.none": "Neb", - "lists.replies_policy.title": "Dangos atebion i:", - "lists.search": "Chwilio ymysg pobl rydych yn eu dilyn", - "lists.subheading": "Eich rhestrau", "load_pending": "{count, plural, one {# eitem newydd} other {# eitem newydd}}", "loading_indicator.label": "Yn llwytho…", "media_gallery.hide": "Cuddio", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 4ba1f4d9e1..9f0f27b804 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -140,13 +140,16 @@ "column.blocks": "Blokerede brugere", "column.bookmarks": "Bogmærker", "column.community": "Lokal tidslinje", + "column.create_list": "Opret liste", "column.direct": "Private omtaler", "column.directory": "Tjek profiler", "column.domain_blocks": "Blokerede domæner", + "column.edit_list": "Redigér liste", "column.favourites": "Favoritter", "column.firehose": "Live feeds", "column.follow_requests": "Følgeanmodninger", "column.home": "Hjem", + "column.list_members": "Håndtér listemedlemmer", "column.lists": "Lister", "column.mutes": "Skjulte brugere (mutede)", "column.notifications": "Notifikationer", @@ -292,7 +295,6 @@ "empty_column.hashtag": "Der er intet med dette hashtag endnu.", "empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at udfylde den. {suggestions}", "empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå hér.", - "empty_column.lists": "Du har endnu ingen lister. Når du opretter én, vil den fremgå hér.", "empty_column.mutes": "Du har endnu ikke skjult (muted) nogle brugere.", "empty_column.notification_requests": "Alt er klar! Der er intet her. Når der modtages nye notifikationer, fremgår de her jf. dine indstillinger.", "empty_column.notifications": "Du har endnu ingen notifikationer. Når andre interagerer med dig, vil det fremgå hér.", @@ -465,20 +467,31 @@ "link_preview.author": "Af {name}", "link_preview.more_from_author": "Mere fra {name}", "link_preview.shares": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}", - "lists.account.add": "Føj til liste", - "lists.account.remove": "Fjern fra liste", + "lists.add_member": "Tilføj", + "lists.add_to_list": "Føj til liste", + "lists.add_to_lists": "Føj {name} til lister", + "lists.create": "Opret", + "lists.create_a_list_to_organize": "Opret en ny liste til organisering af hjemmefeed", + "lists.create_list": "Opret liste", "lists.delete": "Slet liste", + "lists.done": "Færdig", "lists.edit": "Redigér liste", - "lists.edit.submit": "Skift titel", - "lists.exclusive": "Skjul disse indlæg hjemmefra", - "lists.new.create": "Tilføj liste", - "lists.new.title_placeholder": "Ny listetitel", + "lists.exclusive": "Skjul medlemmer i Hjem", + "lists.exclusive_hint": "Er nogen er på denne liste, skjul personen i hjemme-feeds for at undgå at se vedkommendes indlæg to gange.", + "lists.find_users_to_add": "Find brugere at tilføje", + "lists.list_members_count": "{count, plural, one {# medlem} other {# medlemmer}}", + "lists.list_name": "Listetitel", + "lists.new_list_name": "Ny listetitel", + "lists.no_lists_yet": "Ingen lister endnu.", + "lists.no_members_yet": "Ingen medlemmer endnu.", + "lists.no_results_found": "Ingen resultater fundet.", + "lists.remove_member": "Fjern", "lists.replies_policy.followed": "Enhver bruger, der følges", "lists.replies_policy.list": "Listemedlemmer", "lists.replies_policy.none": "Ingen", - "lists.replies_policy.title": "Vis svar til:", - "lists.search": "Søg blandt personer, som følges", - "lists.subheading": "Dine lister", + "lists.save": "Gem", + "lists.search_placeholder": "Søg efter folk, man følger", + "lists.show_replies_to": "Medtag svar fra listemedlemmer til", "load_pending": "{count, plural, one {# nyt emne} other {# nye emner}}", "loading_indicator.label": "Indlæser…", "media_gallery.hide": "Skjul", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index e9bf6a4181..b47007522b 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -140,13 +140,16 @@ "column.blocks": "Blockierte Profile", "column.bookmarks": "Lesezeichen", "column.community": "Lokale Timeline", + "column.create_list": "Liste erstellen", "column.direct": "Private Erwähnungen", "column.directory": "Profile durchsuchen", "column.domain_blocks": "Blockierte Domains", + "column.edit_list": "Liste bearbeiten", "column.favourites": "Favoriten", "column.firehose": "Live-Feeds", "column.follow_requests": "Follower-Anfragen", "column.home": "Startseite", + "column.list_members": "Listenmitglieder verwalten", "column.lists": "Listen", "column.mutes": "Stummgeschaltete Profile", "column.notifications": "Benachrichtigungen", @@ -292,7 +295,6 @@ "empty_column.hashtag": "Unter diesem Hashtag gibt es noch nichts.", "empty_column.home": "Die Timeline deiner Startseite ist leer! Folge mehr Leuten, um sie zu füllen.", "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. Sobald du eine anlegst, wird sie hier erscheinen.", "empty_column.mutes": "Du hast keine Profile stummgeschaltet.", "empty_column.notification_requests": "Alles klar! Hier gibt es nichts. Wenn Sie neue Mitteilungen erhalten, werden diese entsprechend Ihren Einstellungen hier angezeigt.", "empty_column.notifications": "Du hast noch keine Benachrichtigungen. Sobald andere Personen mit dir interagieren, wirst du hier darüber informiert.", @@ -465,20 +467,32 @@ "link_preview.author": "Von {name}", "link_preview.more_from_author": "Mehr von {name}", "link_preview.shares": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}", - "lists.account.add": "Zur Liste hinzufügen", - "lists.account.remove": "Von der Liste entfernen", + "lists.add_member": "Hinzufügen", + "lists.add_to_list": "Zur Liste hinzufügen", + "lists.add_to_lists": "{name} zu Listen hinzufügen", + "lists.create": "Erstellen", + "lists.create_a_list_to_organize": "Erstelle eine neue Liste, um deine Startseite zu organisieren", + "lists.create_list": "Liste erstellen", "lists.delete": "Liste löschen", + "lists.done": "Fertig", "lists.edit": "Liste bearbeiten", - "lists.edit.submit": "Titel ändern", - "lists.exclusive": "Diese Beiträge in der Startseite ausblenden", - "lists.new.create": "Neue Liste erstellen", - "lists.new.title_placeholder": "Titel der neuen Liste", + "lists.exclusive": "Mitglieder auf der Startseite ausblenden", + "lists.exclusive_hint": "Profile, die sich auf dieser Liste befinden, werden nicht auf deiner Startseite angezeigt, damit deren Beiträge nicht doppelt erscheinen.", + "lists.find_users_to_add": "Suche nach Profilen, um sie hinzuzufügen", + "lists.list_members": "Listenmitglieder", + "lists.list_members_count": "{count, plural, one {# Mitglied} other {# Mitglieder}}", + "lists.list_name": "Titel der Liste", + "lists.new_list_name": "Neuer Listentitel", + "lists.no_lists_yet": "Noch keine Listen vorhanden.", + "lists.no_members_yet": "Keine Mitglieder vorhanden.", + "lists.no_results_found": "Keine Suchergebnisse.", + "lists.remove_member": "Entfernen", "lists.replies_policy.followed": "Alle folgenden Profile", "lists.replies_policy.list": "Mitglieder der Liste", "lists.replies_policy.none": "Niemanden", - "lists.replies_policy.title": "Antworten anzeigen für:", - "lists.search": "Suche nach Leuten, denen du folgst", - "lists.subheading": "Deine Listen", + "lists.save": "Speichern", + "lists.search_placeholder": "Nach Profilen suchen, denen du folgst", + "lists.show_replies_to": "Antworten von Listenmitgliedern anzeigen für …", "load_pending": "{count, plural, one {# neuer Beitrag} other {# neue Beiträge}}", "loading_indicator.label": "Wird geladen …", "media_gallery.hide": "Ausblenden", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 2920968e6a..57f47dda7b 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -291,7 +291,6 @@ "empty_column.hashtag": "Δεν υπάρχει ακόμα κάτι για αυτή την ετικέτα.", "empty_column.home": "Η τοπική σου ροή είναι κενή! Πήγαινε στο {public} ή κάνε αναζήτηση για να ξεκινήσεις και να γνωρίσεις άλλους χρήστες.", "empty_column.list": "Δεν υπάρχει τίποτα σε αυτή τη λίστα ακόμα. Όταν τα μέλη της δημοσιεύσουν νέες καταστάσεις, θα εμφανιστούν εδώ.", - "empty_column.lists": "Δεν έχεις καμία λίστα ακόμα. Μόλις φτιάξεις μια, θα εμφανιστεί εδώ.", "empty_column.mutes": "Δεν έχεις κανένα χρήστη σε σίγαση ακόμα.", "empty_column.notification_requests": "Όλα καθαρά! Δεν υπάρχει τίποτα εδώ. Όταν λαμβάνεις νέες ειδοποιήσεις, αυτές θα εμφανίζονται εδώ σύμφωνα με τις ρυθμίσεις σου.", "empty_column.notifications": "Δεν έχεις ειδοποιήσεις ακόμα. Όταν άλλα άτομα αλληλεπιδράσουν μαζί σου, θα το δεις εδώ.", @@ -464,20 +463,11 @@ "link_preview.author": "Από {name}", "link_preview.more_from_author": "Περισσότερα από {name}", "link_preview.shares": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}", - "lists.account.add": "Πρόσθεσε στη λίστα", - "lists.account.remove": "Βγάλε από τη λίστα", "lists.delete": "Διαγραφή λίστας", "lists.edit": "Επεξεργασία λίστας", - "lists.edit.submit": "Αλλαγή τίτλου", - "lists.exclusive": "Απόκρυψη αυτών των αναρτήσεων από την αρχική", - "lists.new.create": "Προσθήκη λίστας", - "lists.new.title_placeholder": "Τίτλος νέας λίστα", "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 {# νέο στοιχείο} other {# νέα στοιχεία}}", "loading_indicator.label": "Φόρτωση…", "media_gallery.hide": "Απόκρυψη", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index d482ec21dd..8d4201484d 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -87,6 +87,25 @@ "alert.unexpected.title": "Oops!", "alt_text_badge.title": "Alt text", "announcement.announcement": "Announcement", + "annual_report.summary.archetype.booster": "The cool-hunter", + "annual_report.summary.archetype.lurker": "The lurker", + "annual_report.summary.archetype.oracle": "The oracle", + "annual_report.summary.archetype.pollster": "The pollster", + "annual_report.summary.archetype.replier": "The social butterfly", + "annual_report.summary.followers.followers": "followers", + "annual_report.summary.followers.total": "{count} total", + "annual_report.summary.here_it_is": "Here is your {year} in review:", + "annual_report.summary.highlighted_post.by_favourites": "most favourited post", + "annual_report.summary.highlighted_post.by_reblogs": "most boosted post", + "annual_report.summary.highlighted_post.by_replies": "post with the most replies", + "annual_report.summary.highlighted_post.possessive": "{name}'s", + "annual_report.summary.most_used_app.most_used_app": "most used app", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "most used hashtag", + "annual_report.summary.most_used_hashtag.none": "None", + "annual_report.summary.new_posts.new_posts": "new posts", + "annual_report.summary.percentile.text": "That puts you in the topof Mastodon users.", + "annual_report.summary.percentile.we_wont_tell_bernie": "We won't tell Bernie.", + "annual_report.summary.thanks": "Thanks for being part of Mastodon!", "attachments_list.unprocessed": "(unprocessed)", "audio.hide": "Hide audio", "block_modal.remote_users_caveat": "We will ask the server {domain} to respect your decision. However, compliance is not guaranteed since some servers may handle blocks differently. Public posts may still be visible to non-logged-in users.", @@ -158,6 +177,7 @@ "compose_form.poll.duration": "Poll duration", "compose_form.poll.multiple": "Multiple choice", "compose_form.poll.option_placeholder": "Option {number}", + "compose_form.poll.single": "Single 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.poll.type": "Style", @@ -196,6 +216,7 @@ "confirmations.unfollow.title": "Unfollow user?", "content_warning.hide": "Hide post", "content_warning.show": "Show anyway", + "content_warning.show_more": "Show more", "conversation.delete": "Delete conversation", "conversation.mark_as_read": "Mark as read", "conversation.open": "View conversation", @@ -271,7 +292,6 @@ "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.", "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.notification_requests": "All clear! There is nothing here. When you receive new notifications, they will appear here according to your settings.", "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.", @@ -304,6 +324,7 @@ "filter_modal.select_filter.subtitle": "Use an existing category or create a new one", "filter_modal.select_filter.title": "Filter this post", "filter_modal.title.status": "Filter a post", + "filter_warning.matches_filter": "Matches filter \"{title}\"", "filtered_notifications_banner.pending_requests": "From {count, plural, =0 {no one} one {one person} other {# people}} you may know", "filtered_notifications_banner.title": "Filtered notifications", "firehose.all": "All", @@ -383,6 +404,7 @@ "interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.", "interaction_modal.description.reblog": "With an account on Mastodon, you can boost this post to share it with your own followers.", "interaction_modal.description.reply": "With an account on Mastodon, you can respond to this post.", + "interaction_modal.description.vote": "With an account on Mastodon, you can vote in this poll.", "interaction_modal.login.action": "Take me home", "interaction_modal.login.prompt": "Domain of your home server, e.g. mastodon.social", "interaction_modal.no_account_yet": "Not on Mastodon?", @@ -394,6 +416,7 @@ "interaction_modal.title.follow": "Follow {name}", "interaction_modal.title.reblog": "Boost {name}'s post", "interaction_modal.title.reply": "Reply to {name}'s post", + "interaction_modal.title.vote": "Vote in {name}'s poll", "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}}", @@ -441,20 +464,11 @@ "link_preview.author": "By {name}", "link_preview.more_from_author": "More from {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} posts}}", - "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.exclusive": "Hide these posts from home", - "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.hide": "Hide", @@ -503,9 +517,11 @@ "notification.admin.report_statuses_other": "{name} reported {target}", "notification.admin.sign_up": "{name} signed up", "notification.admin.sign_up.name_and_others": "{name} and {count, plural, one {# other} other {# others}} signed up", + "notification.annual_report.message": "Your {year} #Wrapstodon awaits! Unveil your year's highlights and memorable moments on Mastodon!", "notification.favourite": "{name} favourited your post", "notification.favourite.name_and_others_with_link": "{name} and {count, plural, one {# other} other {# others}} favourited your post", "notification.follow": "{name} followed you", + "notification.follow.name_and_others": "{name} and {count, plural, one {# other} other {# others}} followed you", "notification.follow_request": "{name} has requested to follow you", "notification.follow_request.name_and_others": "{name} and {count, plural, one {# other} other {# others}} has requested to follow you", "notification.label.mention": "Mention", @@ -513,6 +529,7 @@ "notification.label.private_reply": "Private reply", "notification.label.reply": "Reply", "notification.mention": "Mention", + "notification.mentioned_you": "{name} mentioned you", "notification.moderation-warning.learn_more": "Learn more", "notification.moderation_warning": "You have received a moderation warning", "notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.", @@ -563,6 +580,7 @@ "notifications.column_settings.filter_bar.category": "Quick filter bar", "notifications.column_settings.follow": "New followers:", "notifications.column_settings.follow_request": "New follow requests:", + "notifications.column_settings.group": "Group", "notifications.column_settings.mention": "Mentions:", "notifications.column_settings.poll": "Poll results:", "notifications.column_settings.push": "Push notifications", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 6d8c82385b..730c301769 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -280,7 +280,6 @@ "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.", "empty_column.list": "Ankoraŭ estas nenio en ĉi tiu listo. Kiam membroj de ĉi tiu listo afiŝos novajn afiŝojn, ili aperos ĉi tie.", - "empty_column.lists": "Vi ankoraŭ ne havas liston. Kiam vi kreos iun, ĝi aperos ĉi tie.", "empty_column.mutes": "Vi ne ankoraŭ silentigis iun uzanton.", "empty_column.notification_requests": "Ĉio klara! Estas nenio tie ĉi. Kiam vi ricevas novajn sciigojn, ili aperos ĉi tie laŭ viaj agordoj.", "empty_column.notifications": "Vi ankoraŭ ne havas sciigojn. Interagu kun aliaj por komenci konversacion.", @@ -453,20 +452,11 @@ "link_preview.author": "De {name}", "link_preview.more_from_author": "Pli de {name}", "link_preview.shares": "{count, plural, one {{counter} afiŝo} other {{counter} afiŝoj}}", - "lists.account.add": "Aldoni al la listo", - "lists.account.remove": "Forigi de la listo", "lists.delete": "Forigi la liston", "lists.edit": "Redakti la liston", - "lists.edit.submit": "Ŝanĝi titolon", - "lists.exclusive": "Kaŝi ĉi tiujn afiŝojn de hejmo", - "lists.new.create": "Aldoni liston", - "lists.new.title_placeholder": "Titolo de la nova listo", "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 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}}", "loading_indicator.label": "Ŝargado…", "media_gallery.hide": "Kaŝi", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 406c526983..2dea704a72 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Todavía no hay nada con esta etiqueta.", "empty_column.home": "¡Tu línea temporal principal está vacía! Seguí a más cuentas para llenarla.", "empty_column.list": "Todavía no hay nada en esta lista. Cuando miembros de esta lista envíen nuevos mensaje, se mostrarán acá.", - "empty_column.lists": "Todavía no tenés ninguna lista. Cuando creés una, se mostrará acá.", "empty_column.mutes": "Todavía no silenciaste a ningún usuario.", "empty_column.notification_requests": "¡Todo limpio! No hay nada acá. Cuando recibás nuevas notificaciones, aparecerán acá, acorde a tu configuración.", "empty_column.notifications": "Todavía no tenés ninguna notificación. Cuando otras cuentas interactúen con vos, vas a ver la notificación acá.", @@ -465,20 +464,11 @@ "link_preview.author": "Por {name}", "link_preview.more_from_author": "Más de {name}", "link_preview.shares": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}", - "lists.account.add": "Agregar a lista", - "lists.account.remove": "Quitar de lista", "lists.delete": "Eliminar lista", "lists.edit": "Editar lista", - "lists.edit.submit": "Cambiar título", - "lists.exclusive": "Ocultar estos mensajes del inicio", - "lists.new.create": "Agregar lista", - "lists.new.title_placeholder": "Título de nueva lista", "lists.replies_policy.followed": "Cualquier cuenta seguida", "lists.replies_policy.list": "Miembros de la lista", "lists.replies_policy.none": "Nadie", - "lists.replies_policy.title": "Mostrar respuestas a:", - "lists.search": "Buscar entre la gente que seguís", - "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# elemento nuevo} other {# elementos nuevos}}", "loading_indicator.label": "Cargando…", "media_gallery.hide": "Ocultar", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 63dc31c6df..d863873418 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "No hay nada en esta etiqueta aún.", "empty_column.home": "No estás siguiendo a nadie aún. Visita {public} o haz búsquedas para empezar y conocer gente nueva.", "empty_column.list": "No hay nada en esta lista aún. Cuando miembros de esta lista publiquen nuevos estatus, estos aparecerán qui.", - "empty_column.lists": "No tienes ninguna lista. cuando crees una, se mostrará aquí.", "empty_column.mutes": "Aún no has silenciado a ningún usuario.", "empty_column.notification_requests": "¡Todo limpio! No hay nada aquí. Cuando recibas nuevas notificaciones, aparecerán aquí conforme a tu configuración.", "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.", @@ -465,20 +464,11 @@ "link_preview.author": "Por {name}", "link_preview.more_from_author": "Más de {name}", "link_preview.shares": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}", - "lists.account.add": "Añadir a lista", - "lists.account.remove": "Quitar de lista", "lists.delete": "Borrar lista", "lists.edit": "Editar lista", - "lists.edit.submit": "Cambiar título", - "lists.exclusive": "Ocultar estas publicaciones en inicio", - "lists.new.create": "Añadir lista", - "lists.new.title_placeholder": "Título de la nueva lista", "lists.replies_policy.followed": "Cualquier usuario seguido", "lists.replies_policy.list": "Miembros de la lista", "lists.replies_policy.none": "Nadie", - "lists.replies_policy.title": "Mostrar respuestas a:", - "lists.search": "Buscar entre la gente a la que sigues", - "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "loading_indicator.label": "Cargando…", "media_gallery.hide": "Ocultar", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 258b19f411..bfb16e9fd8 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "No hay nada en esta etiqueta todavía.", "empty_column.home": "¡Tu línea temporal está vacía! Sigue a más personas para rellenarla.", "empty_column.list": "Aún no hay nada en esta lista. Cuando los miembros de esta lista publiquen nuevos estados, estos aparecerán aquí.", - "empty_column.lists": "No tienes ninguna lista. Cuando crees una, se mostrará aquí.", "empty_column.mutes": "Aún no has silenciado a ningún usuario.", "empty_column.notification_requests": "¡Todo limpio! No hay nada aquí. Cuando recibas nuevas notificaciones, aparecerán aquí conforme a tu configuración.", "empty_column.notifications": "Aún no tienes ninguna notificación. Cuando otras personas interactúen contigo, aparecerán aquí.", @@ -465,20 +464,11 @@ "link_preview.author": "Por {name}", "link_preview.more_from_author": "Más de {name}", "link_preview.shares": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}", - "lists.account.add": "Añadir a lista", - "lists.account.remove": "Quitar de lista", "lists.delete": "Borrar lista", "lists.edit": "Editar lista", - "lists.edit.submit": "Cambiar título", - "lists.exclusive": "Ocultar estas publicaciones de inicio", - "lists.new.create": "Añadir lista", - "lists.new.title_placeholder": "Título de la nueva lista", "lists.replies_policy.followed": "Cualquier usuario seguido", "lists.replies_policy.list": "Miembros de la lista", "lists.replies_policy.none": "Nadie", - "lists.replies_policy.title": "Mostrar respuestas a:", - "lists.search": "Buscar entre las personas a las que sigues", - "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}", "loading_indicator.label": "Cargando…", "media_gallery.hide": "Ocultar", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 8376641179..1db32efe09 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -273,7 +273,6 @@ "empty_column.hashtag": "Selle sildi all ei ole ühtegi postitust.", "empty_column.home": "Su koduajajoon on tühi. Jälgi rohkemaid inimesi, et seda täita {suggestions}", "empty_column.list": "Siin loetelus pole veel midagi. Kui loetelu liikmed teevad uusi postitusi, näed neid siin.", - "empty_column.lists": "Pole veel ühtegi nimekirja. Kui lood mõne, näed neid siin.", "empty_column.mutes": "Sa pole veel ühtegi kasutajat vaigistanud.", "empty_column.notification_requests": "Kõik tühi! Siin pole mitte midagi. Kui saad uusi teavitusi, ilmuvad need siin vastavalt sinu seadistustele.", "empty_column.notifications": "Ei ole veel teateid. Kui keegi suhtleb sinuga, näed seda siin.", @@ -446,20 +445,11 @@ "link_preview.author": "{name} poolt", "link_preview.more_from_author": "Veel kasutajalt {name}", "link_preview.shares": "{count, plural, one {{counter} postitus} other {{counter} postitust}}", - "lists.account.add": "Lisa nimekirja", - "lists.account.remove": "Eemalda nimekirjast", "lists.delete": "Kustuta nimekiri", "lists.edit": "Muuda nimekirja", - "lists.edit.submit": "Pealkirja muutmine", - "lists.exclusive": "Peida koduvaatest need postitused", - "lists.new.create": "Lisa nimekiri", - "lists.new.title_placeholder": "Uue nimekirja pealkiri", "lists.replies_policy.followed": "Igalt jälgitud kasutajalt", "lists.replies_policy.list": "Listi liikmetelt", "lists.replies_policy.none": "Mitte kelleltki", - "lists.replies_policy.title": "Näita vastuseid nendele:", - "lists.search": "Otsi enda jälgitavate inimeste hulgast", - "lists.subheading": "Sinu nimekirjad", "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}", "loading_indicator.label": "Laadimine…", "media_gallery.hide": "Peida", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index c8349dc6a1..c77ca93f9e 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -269,7 +269,6 @@ "empty_column.hashtag": "Ez dago ezer traola honetan oraindik.", "empty_column.home": "Zure hasierako denbora-lerroa hutsik dago! Jarraitu jende gehiago betetzeko.", "empty_column.list": "Ez dago ezer zerrenda honetan. Zerrenda honetako kideek bidalketa berriak argitaratzean, hemen agertuko dira.", - "empty_column.lists": "Ez duzu zerrendarik oraindik. Baten bat sortzen duzunean hemen agertuko da.", "empty_column.mutes": "Ez duzu erabiltzailerik mututu oraindik.", "empty_column.notification_requests": "Garbi-garbi! Ezertxo ere ez hemen. Jakinarazpenak jasotzen dituzunean, hemen agertuko dira zure ezarpenen arabera.", "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.", @@ -437,20 +436,11 @@ "link_preview.author": "Egilea: {name}", "link_preview.more_from_author": "{name} erabiltzaileaz gehiago jakin", "link_preview.shares": "{count, plural, one {{counter} bidalketa} other {{counter} bidalketa}}", - "lists.account.add": "Gehitu zerrendara", - "lists.account.remove": "Kendu zerrendatik", "lists.delete": "Ezabatu zerrenda", "lists.edit": "Editatu zerrenda", - "lists.edit.submit": "Aldatu izenburua", - "lists.exclusive": "Ezkutatu argitalpen hauek hasieratik", - "lists.new.create": "Gehitu zerrenda", - "lists.new.title_placeholder": "Zerrenda berriaren izena", "lists.replies_policy.followed": "Jarraitutako edozein erabiltzaile", "lists.replies_policy.list": "Zerrendako kideak", "lists.replies_policy.none": "Bat ere ez", - "lists.replies_policy.title": "Erakutsi erantzunak:", - "lists.search": "Bilatu jarraitzen dituzun pertsonen artean", - "lists.subheading": "Zure zerrendak", "load_pending": "{count, plural, one {elementu berri #} other {# elementu berri}}", "loading_indicator.label": "Kargatzen…", "media_gallery.hide": "Ezkutatu", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 3bc96cf9f2..608c1321b7 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -272,7 +272,6 @@ "empty_column.hashtag": "هنوز هیچ چیزی در این برچسب نیست.", "empty_column.home": "خط زمانی خانگیتان خالی است! برای پر کردنش، افراد بیشتری را پی بگیرید. {suggestions}", "empty_column.list": "هنوز چیزی در این سیاهه نیست. هنگامی که اعضایش فرسته‌های جدیدی بفرستند، این‌جا ظاهر خواهند شد.", - "empty_column.lists": "هنوز هیچ سیاهه‌ای ندارید. هنگامی که یکی بسازید، این‌جا نشان داده خواهد شد.", "empty_column.mutes": "هنوز هیچ کاربری را خموش نکرده‌اید.", "empty_column.notifications": "هنوز هیچ آگاهی‌آی ندارید. هنگامی که دیگران با شما برهم‌کنش داشته باشند،‌این‌حا خواهید دیدش.", "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران کارسازهای دیگر را پی‌گیری کنید تا این‌جا پُر شود", @@ -437,20 +436,11 @@ "link_preview.author": "از {name}", "link_preview.more_from_author": "بیش‌تر از {name}", "link_preview.shares": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}", - "lists.account.add": "افزودن به سیاهه", - "lists.account.remove": "برداشتن از سیاهه", "lists.delete": "حذف سیاهه", "lists.edit": "ویرایش سیاهه", - "lists.edit.submit": "تغییر عنوان", - "lists.exclusive": "نهفتن این فرسته‌ها از خانه", - "lists.new.create": "افزودن سیاهه", - "lists.new.title_placeholder": "عنوان سیاههٔ جدید", "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 {# مورد جدید} other {# مورد جدید}}", "loading_indicator.label": "در حال بارگذاری…", "media_gallery.hide": "نهفتن", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 2c0aacc535..a987c4bad2 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -139,13 +139,16 @@ "column.blocks": "Estetyt käyttäjät", "column.bookmarks": "Kirjanmerkit", "column.community": "Paikallinen aikajana", + "column.create_list": "Luo lista", "column.direct": "Yksityismaininnat", "column.directory": "Selaa profiileja", "column.domain_blocks": "Estetyt verkkotunnukset", + "column.edit_list": "Muokkaa listaa", "column.favourites": "Suosikit", "column.firehose": "Livesyötteet", "column.follow_requests": "Seurantapyynnöt", "column.home": "Koti", + "column.list_members": "Hallitse listan jäseniä", "column.lists": "Listat", "column.mutes": "Mykistetyt käyttäjät", "column.notifications": "Ilmoitukset", @@ -291,7 +294,6 @@ "empty_column.hashtag": "Tällä aihetunnisteella ei löydy vielä sisältöä.", "empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia käyttäjiä, niin näet enemmän sisältöä.", "empty_column.list": "Tällä listalla ei ole vielä mitään. Kun tämän listan jäsenet lähettävät uusia julkaisuja, ne näkyvät tässä.", - "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.", "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.", "empty_column.notification_requests": "Olet ajan tasalla! Täällä ei ole mitään uutta kerrottavaa. Kun saat uusia ilmoituksia, ne näkyvät täällä asetustesi mukaisesti.", "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun muut ovat vuorovaikutuksessa kanssasi, näet sen täällä.", @@ -464,20 +466,32 @@ "link_preview.author": "Tehnyt {name}", "link_preview.more_from_author": "Lisää tekijältä {name}", "link_preview.shares": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", - "lists.account.add": "Lisää listalle", - "lists.account.remove": "Poista listalta", + "lists.add_member": "Lisää", + "lists.add_to_list": "Lisää listalle", + "lists.add_to_lists": "Lisää {name} listalle", + "lists.create": "Luo", + "lists.create_a_list_to_organize": "Luo uusi lista kotisyötteesi järjestämiseksi", + "lists.create_list": "Luo lista", "lists.delete": "Poista lista", + "lists.done": "Valmis", "lists.edit": "Muokkaa listaa", - "lists.edit.submit": "Vaihda nimi", - "lists.exclusive": "Piilota nämä julkaisut kotisyötteestä", - "lists.new.create": "Lisää lista", - "lists.new.title_placeholder": "Uuden listan nimi", + "lists.exclusive": "Piilota jäsenet kotisyötteestä", + "lists.exclusive_hint": "Jos joku on tällä listalla, piilota hänet kotisyötteestäsi, jotta et näe hänen julkaisujaan kahteen kertaan.", + "lists.find_users_to_add": "Etsi lisättäviä käyttäjiä", + "lists.list_members": "Listan jäsenet", + "lists.list_members_count": "{count, plural, one {# jäsen} other {# jäsentä}}", + "lists.list_name": "Listan nimi", + "lists.new_list_name": "Uuden listan nimi", + "lists.no_lists_yet": "Ei vielä listoja.", + "lists.no_members_yet": "Ei vielä jäseniä.", + "lists.no_results_found": "Tuloksia ei löytynyt.", + "lists.remove_member": "Poista", "lists.replies_policy.followed": "Jokaiselle seuratulle käyttäjälle", "lists.replies_policy.list": "Listan jäsenille", "lists.replies_policy.none": "Ei kellekään", - "lists.replies_policy.title": "Näytä vastaukset:", - "lists.search": "Hae seuraamistasi käyttäjistä", - "lists.subheading": "Omat listasi", + "lists.save": "Tallenna", + "lists.search_placeholder": "Hae käyttäjiä seurattavaksi", + "lists.show_replies_to": "Sisällytä listan jäsenten vastaukset kohteeseen", "load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}", "loading_indicator.label": "Ladataan…", "media_gallery.hide": "Piilota", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index 14c7b70bd2..1ccc6f036d 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -184,7 +184,6 @@ "empty_column.hashtag": "Wala pang laman ang hashtag na ito.", "empty_column.home": "Walang laman ang timeline ng tahanan mo! Sumunod sa marami pang tao para mapunan ito.", "empty_column.list": "Wala pang laman ang listahang ito. Kapag naglathala ng mga bagong post ang mga miyembro ng listahang ito, makikita iyon dito.", - "empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito.", "errors.unexpected_crash.report_issue": "Iulat ang isyu", "explore.search_results": "Mga resulta ng paghahanap", "explore.suggested_follows": "Mga tao", @@ -234,15 +233,8 @@ "lightbox.next": "Susunod", "lightbox.previous": "Nakaraan", "link_preview.author": "Ni/ng {name}", - "lists.account.add": "Idagdag sa talaan", - "lists.account.remove": "Tanggalin mula sa talaan", "lists.delete": "Burahin ang listahan", - "lists.edit.submit": "Baguhin ang pamagat", - "lists.new.create": "Idagdag sa talaan", - "lists.new.title_placeholder": "Bagong pangalan ng talaan", "lists.replies_policy.none": "Walang simuman", - "lists.replies_policy.title": "Ipakita ang mga tugon sa:", - "lists.subheading": "Iyong mga talaan", "loading_indicator.label": "Kumakarga…", "media_gallery.hide": "Itago", "mute_modal.hide_from_notifications": "Itago mula sa mga abiso", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 789efaa40e..bc56152f37 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Einki er í hesum frámerkinum enn.", "empty_column.home": "Heima-tíðarlinjan hjá tær er tóm! Fylg fleiri fyri at fylla hana. {suggestions}", "empty_column.list": "Einki er í hesum listanum enn. Tá limir í hesum listanum posta nýggjar postar, so síggjast teir her.", - "empty_column.lists": "Tú hevur ongar goymdar listar enn. Tá tú gert ein lista, so sært tú hann her.", "empty_column.mutes": "Tú hevur enn ikki doyvt nakran brúkara.", "empty_column.notification_requests": "Alt er klárt! Her er einki. Tá tú fært nýggjar fráboðanir, síggjast tær her sambært tínum stillingum.", "empty_column.notifications": "Tú hevur ongar fráboðanir enn. Tá onnur samskifta við teg, so sær tú fráboðaninar her.", @@ -465,20 +464,11 @@ "link_preview.author": "Av {name}", "link_preview.more_from_author": "Meira frá {name}", "link_preview.shares": "{count, plural, one {{counter} postur} other {{counter} postar}}", - "lists.account.add": "Legg afturat lista", - "lists.account.remove": "Tak av lista", "lists.delete": "Strika lista", "lists.edit": "Broyt lista", - "lists.edit.submit": "Broyt heiti", - "lists.exclusive": "Fjal hesar postarnar frá heima", - "lists.new.create": "Ger nýggjan lista", - "lists.new.title_placeholder": "Nýtt navn á lista", "lists.replies_policy.followed": "Øllum fylgdum brúkarum", "lists.replies_policy.list": "Listalimunum", "lists.replies_policy.none": "Eingin", - "lists.replies_policy.title": "Vís svarini fyri:", - "lists.search": "Leita millum fólk, sum tú fylgir", - "lists.subheading": "Tínir listar", "load_pending": "{count, plural, one {# nýtt evni} other {# nýggj evni}}", "loading_indicator.label": "Innlesur…", "media_gallery.hide": "Fjal", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index fed111e7e8..a1134e0de3 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -275,7 +275,6 @@ "empty_column.hashtag": "Il n’y a pas encore de contenu associé à ce hashtag.", "empty_column.home": "Votre fil d'accueil est vide! Suivez plus de personnes pour la remplir. {suggestions}", "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Quand des membres de cette liste publieront de nouvelles publications, elles apparaîtront ici.", - "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.", "empty_column.mutes": "Vous n’avez masqué aucun compte pour le moment.", "empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.", "empty_column.notifications": "Vous n'avez pas encore de notifications. Quand d'autres personnes interagissent avec vous, vous en verrez ici.", @@ -445,20 +444,11 @@ "link_preview.author": "Par {name}", "link_preview.more_from_author": "Plus via {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", - "lists.account.add": "Ajouter à une liste", - "lists.account.remove": "Retirer d'une liste", "lists.delete": "Supprimer la liste", "lists.edit": "Modifier la liste", - "lists.edit.submit": "Modifier le titre", - "lists.exclusive": "Cacher ces publications depuis la page d'accueil", - "lists.new.create": "Ajouter une liste", - "lists.new.title_placeholder": "Titre de la nouvelle liste", "lists.replies_policy.followed": "N'importe quel compte suivi", "lists.replies_policy.list": "Membres de la liste", "lists.replies_policy.none": "Personne", - "lists.replies_policy.title": "Afficher les réponses à:", - "lists.search": "Rechercher parmi les gens que vous suivez", - "lists.subheading": "Vos listes", "load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}", "loading_indicator.label": "Chargement…", "media_gallery.hide": "Masquer", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 10bfc22bd8..8597152f00 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -275,7 +275,6 @@ "empty_column.hashtag": "Il n’y a encore aucun contenu associé à ce hashtag.", "empty_column.home": "Votre fil principal est vide ! Suivez plus de personnes pour le remplir.", "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Quand des membres de cette liste publieront de nouveaux messages, ils apparaîtront ici.", - "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.", "empty_column.mutes": "Vous n’avez masqué aucun compte pour le moment.", "empty_column.notification_requests": "C'est fini ! Il n'y a plus rien ici. Lorsque vous recevez de nouvelles notifications, elles apparaitront ici conformément à vos préférences.", "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.", @@ -445,20 +444,11 @@ "link_preview.author": "Par {name}", "link_preview.more_from_author": "Plus via {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", - "lists.account.add": "Ajouter à la liste", - "lists.account.remove": "Supprimer de la liste", "lists.delete": "Supprimer la liste", "lists.edit": "Modifier la liste", - "lists.edit.submit": "Modifier le titre", - "lists.exclusive": "Cacher ces publications sur le fil principal", - "lists.new.create": "Ajouter une liste", - "lists.new.title_placeholder": "Titre de la nouvelle liste", "lists.replies_policy.followed": "N'importe quel compte suivi", "lists.replies_policy.list": "Membres de la liste", "lists.replies_policy.none": "Personne", - "lists.replies_policy.title": "Afficher les réponses à :", - "lists.search": "Rechercher parmi les gens que vous suivez", - "lists.subheading": "Vos listes", "load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}", "loading_indicator.label": "Chargement…", "media_gallery.hide": "Masquer", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 3f4d942b61..a5e8f924dd 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -273,7 +273,6 @@ "empty_column.hashtag": "Der is noch neat te finen ûnder dizze hashtag.", "empty_column.home": "Dizze tiidline is leech! Folgje mear minsken om it te foljen. {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": "Jo hawwe noch gjin inkelde list. Wannear’t jo der ien oanmakke hawwe, falt dat hjir te sjen.", "empty_column.mutes": "Jo hawwe noch gjin brûkers negearre.", "empty_column.notification_requests": "Hielendal leech! Der is hjir neat. Wannear’t jo nije meldingen ûntfange, ferskine dizze hjir neffens jo ynstellingen.", "empty_column.notifications": "Jo hawwe noch gjin meldingen. Ynteraksjes mei oare minsken sjogge jo hjir.", @@ -446,20 +445,11 @@ "link_preview.author": "Troch {name}", "link_preview.more_from_author": "Mear fan {name}", "link_preview.shares": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}", - "lists.account.add": "Oan list tafoegje", - "lists.account.remove": "Ut list fuortsmite", "lists.delete": "List fuortsmite", "lists.edit": "List bewurkje", - "lists.edit.submit": "Titel wizigje", - "lists.exclusive": "Ferstopje dizze berjochten op jo startside", - "lists.new.create": "List tafoegje", - "lists.new.title_placeholder": "Nije listtitel", "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 toane oan:", - "lists.search": "Sykje nei minsken dy’t jo folgje", - "lists.subheading": "Jo listen", "load_pending": "{count, plural, one {# nij item} other {# nije items}}", "loading_indicator.label": "Lade…", "media_gallery.hide": "Ferstopje", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 137a7c591f..31418c8e72 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Níl rud ar bith faoin haischlib seo go fóill.", "empty_column.home": "Tá d'amlíne baile folamh! B'fhiú duit cúpla duine eile a leanúint lena líonadh! {suggestions}", "empty_column.list": "Níl aon rud ar an liosta seo fós. Nuair a fhoilseoidh baill an liosta seo postálacha nua, beidh siad le feiceáil anseo.", - "empty_column.lists": "Níl aon liostaí fós agat. Nuair a chruthaíonn tú ceann, feicfear anseo é.", "empty_column.mutes": "Níl aon úsáideoir balbhaithe agat fós.", "empty_column.notification_requests": "Gach soiléir! Níl aon rud anseo. Nuair a gheobhaidh tú fógraí nua, beidh siad le feiceáil anseo de réir do shocruithe.", "empty_column.notifications": "Níl aon fógraí agat fós. Nuair a dhéanann daoine eile idirghníomhú leat, feicfear anseo é.", @@ -465,20 +464,11 @@ "link_preview.author": "Le {name}", "link_preview.more_from_author": "Tuilleadh ó {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} poist}}", - "lists.account.add": "Cuir leis an liosta", - "lists.account.remove": "Scrios as an liosta", "lists.delete": "Scrios liosta", "lists.edit": "Cuir an liosta in eagar", - "lists.edit.submit": "Athraigh teideal", - "lists.exclusive": "Folaigh na poist seo ón mbaile", - "lists.new.create": "Cruthaigh liosta", - "lists.new.title_placeholder": "Teideal liosta nua", "lists.replies_policy.followed": "Úsáideoir ar bith atá á leanúint", "lists.replies_policy.list": "Baill an liosta", "lists.replies_policy.none": "Duine ar bith", - "lists.replies_policy.title": "Taispeáin freagraí:", - "lists.search": "Cuardaigh i measc daoine atá á leanúint agat", - "lists.subheading": "Do liostaí", "load_pending": "{count, plural, one {# mír nua} two {# mír nua} few {# mír nua} many {# mír nua} other {# mír nua}}", "loading_indicator.label": "Á lódáil…", "media_gallery.hide": "Folaigh", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index f459f50a80..17dbfc30e4 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Chan eil dad san taga hais seo fhathast.", "empty_column.home": "Tha loidhne-ama na dachaigh agad falamh! Lean barrachd dhaoine gus a lìonadh.", "empty_column.list": "Chan eil dad air an liosta seo fhathast. Nuair a phostaicheas buill a tha air an liosta seo postaichean ùra, nochdaidh iad an-seo.", - "empty_column.lists": "Chan eil liosta agad fhathast. Nuair chruthaicheas tu tè, nochdaidh i an-seo.", "empty_column.mutes": "Cha do mhùch thu cleachdaiche sam bith fhathast.", "empty_column.notification_requests": "Glan! Chan eil dad an-seo. Nuair a gheibh thu brathan ùra, nochdaidh iad an-seo a-rèir nan roghainnean agad.", "empty_column.notifications": "Cha d’ fhuair thu brath sam bith fhathast. Nuair a nì càch conaltradh leat, chì thu an-seo e.", @@ -465,20 +464,11 @@ "link_preview.author": "Le {name}", "link_preview.more_from_author": "Barrachd le {name}", "link_preview.shares": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}", - "lists.account.add": "Cuir ris an liosta", - "lists.account.remove": "Thoir air falbh on liosta", "lists.delete": "Sguab às an liosta", "lists.edit": "Deasaich an liosta", - "lists.edit.submit": "Atharraich an tiotal", - "lists.exclusive": "Falaich na postaichean seo air an dachaigh", - "lists.new.create": "Cuir liosta ris", - "lists.new.title_placeholder": "Tiotal na liosta ùir", "lists.replies_policy.followed": "Cleachdaiche sam bith a leanas mi", "lists.replies_policy.list": "Buill na liosta", "lists.replies_policy.none": "Na seall idir", - "lists.replies_policy.title": "Seall freagairtean do:", - "lists.search": "Lorg am measg nan daoine a leanas tu", - "lists.subheading": "Na liostaichean agad", "load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}", "loading_indicator.label": "’Ga luchdadh…", "media_gallery.hide": "Falaich", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index c69a431f4b..e77aaade6b 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -291,7 +291,6 @@ "empty_column.hashtag": "Aínda non hai nada con este cancelo.", "empty_column.home": "A túa cronoloxía inicial está baleira! Sigue a outras usuarias para enchela.", "empty_column.list": "Aínda non hai nada nesta listaxe. Cando as usuarias incluídas na listaxe publiquen mensaxes, amosaranse aquí.", - "empty_column.lists": "Aínda non tes listaxes. Cando crees unha, amosarase aquí.", "empty_column.mutes": "Aínda non silenciaches a ningúnha usuaria.", "empty_column.notification_requests": "Todo ben! Nada por aquí. Cando recibas novas notificacións aparecerán aquí seguindo o criterio dos teus axustes.", "empty_column.notifications": "Aínda non tes notificacións. Aparecerán cando outras persoas interactúen contigo.", @@ -464,20 +463,11 @@ "link_preview.author": "Por {name}", "link_preview.more_from_author": "Máis de {name}", "link_preview.shares": "{count, plural, one {{counter} publicación} other {{counter} publicacións}}", - "lists.account.add": "Engadir á listaxe", - "lists.account.remove": "Eliminar da listaxe", "lists.delete": "Eliminar listaxe", "lists.edit": "Editar listaxe", - "lists.edit.submit": "Mudar o título", - "lists.exclusive": "Agocha estas publicacións no Inicio", - "lists.new.create": "Engadir listaxe", - "lists.new.title_placeholder": "Título da nova listaxe", "lists.replies_policy.followed": "Calquera usuaria que siga", "lists.replies_policy.list": "Membros da lista", "lists.replies_policy.none": "Ninguén", - "lists.replies_policy.title": "Mostrar respostas a:", - "lists.search": "Procurar entre as persoas que segues", - "lists.subheading": "As túas listaxes", "load_pending": "{count, plural, one {# novo elemento} other {# novos elementos}}", "loading_indicator.label": "Estase a cargar…", "media_gallery.hide": "Agochar", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 52d61b737b..57f0ee9e5e 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -140,13 +140,16 @@ "column.blocks": "משתמשים חסומים", "column.bookmarks": "סימניות", "column.community": "פיד שרת מקומי", + "column.create_list": "יצירת רשימה", "column.direct": "הודעות פרטיות", "column.directory": "עיין בפרופילים", "column.domain_blocks": "קהילות (שמות מתחם) מוסתרות", + "column.edit_list": "עריכת רשימה", "column.favourites": "חיבובים", "column.firehose": "פידים עדכניים", "column.follow_requests": "בקשות מעקב", "column.home": "פיד הבית", + "column.list_members": "ניהול חברי הרשימה", "column.lists": "רשימות", "column.mutes": "משתמשים בהשתקה", "column.notifications": "התראות", @@ -292,7 +295,6 @@ "empty_column.hashtag": "אין כלום בתגית הזאת עדיין.", "empty_column.home": "פיד הבית ריק ! אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר משתמשים/ות אחרים/ות. {suggestions}", "empty_column.list": "אין עדיין פריטים ברשימה. כאשר חברים ברשימה הזאת יפרסמו הודעות חדשות, הן יופיעו פה.", - "empty_column.lists": "אין לך שום רשימות עדיין. לכשיהיו, הן תופענה כאן.", "empty_column.mutes": "עוד לא השתקת שום משתמש.", "empty_column.notification_requests": "בום! אין פה כלום. כשיווצרו עוד התראות, הן יופיעו כאן על בסיס ההעדפות שלך.", "empty_column.notifications": "אין התראות עדיין. יאללה, הגיע הזמן להתחיל להתערבב.", @@ -465,20 +467,32 @@ "link_preview.author": "מאת {name}", "link_preview.more_from_author": "עוד מאת {name}", "link_preview.shares": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}", - "lists.account.add": "הוסף לרשימה", - "lists.account.remove": "הסר מרשימה", + "lists.add_member": "הוספה", + "lists.add_to_list": "הוספה לרשימה", + "lists.add_to_lists": "הוספת {name} לרשימות", + "lists.create": "יצירה", + "lists.create_a_list_to_organize": "יצירת רשימה חדשה לארגון פיד הבית שלך", + "lists.create_list": "יצירת רשימה", "lists.delete": "מחיקת רשימה", + "lists.done": "בוצע", "lists.edit": "עריכת רשימה", - "lists.edit.submit": "שנה/י כותרת", - "lists.exclusive": "להסתיר את ההודעות האלו מפיד הבית", - "lists.new.create": "הוספת רשימה", - "lists.new.title_placeholder": "כותרת הרשימה החדשה", + "lists.exclusive": "הסתרת החברים בפיד הבית", + "lists.exclusive_hint": "אם שם כלשהו ברשימה זו, נסתיר אותי בפיד הבית כדי למנוע כפילות.", + "lists.find_users_to_add": "חיפוש משתמשים להוספה", + "lists.list_members": "פירוט חברי הרשימה", + "lists.list_members_count": "{count, plural, one {חבר רשימה אחד} other {# חברי רשימה}}", + "lists.list_name": "שם הרשימה", + "lists.new_list_name": "שם רשימה חדשה", + "lists.no_lists_yet": "אין רשימות עדיין.", + "lists.no_members_yet": "עוד אין חברים ברשימה.", + "lists.no_results_found": "לא נמצאו תוצאות.", + "lists.remove_member": "הסרה", "lists.replies_policy.followed": "משתמשים שאני עוקב אחריהם", "lists.replies_policy.list": "משתמשים שברשימה", "lists.replies_policy.none": "אף אחד", - "lists.replies_policy.title": "הצג תגובות ל:", - "lists.search": "חיפוש בין אנשים שאני עוקב\\ת אחריהם", - "lists.subheading": "הרשימות שלך", + "lists.save": "שמירה", + "lists.search_placeholder": "חיפוש אנשים שאני עוקב\\ת אחריהם", + "lists.show_replies_to": "לכלול תשובות מחברי הרשימה אל", "load_pending": "{count, plural, one {# פריט חדש} other {# פריטים חדשים}}", "loading_indicator.label": "בטעינה…", "media_gallery.hide": "להסתיר", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index e0de4c8452..eebf0dd9da 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -237,7 +237,6 @@ "empty_column.hashtag": "यह हैशटैग अभी तक खाली है।", "empty_column.home": "आपकी मुख्य कालक्रम अभी खली है. अन्य उपयोगकर्ताओं से मिलने के लिए और अपनी गतिविधियां शुरू करने के लिए या तो {public} पर जाएं या खोज का उपयोग करें।", "empty_column.list": "यह सूची अभी खाली है. जब इसके सदस्य कोई अभिव्यक्ति देंगे, तो वो यहां दिखाई देंगी.", - "empty_column.lists": "आपके पास अभी तक कोई सूची नहीं है। जब आप एक बनाते हैं, तो यह यहां दिखाई देगा।", "empty_column.mutes": "आपने अभी तक किसी भी उपयोगकर्ता को म्यूट नहीं किया है।", "empty_column.notifications": "आपके पास अभी तक कोई सूचना नहीं है। बातचीत शुरू करने के लिए दूसरों के साथ बातचीत करें।", "empty_column.public": "यहां कुछ नहीं है! सार्वजनिक रूप से कुछ लिखें, या इसे भरने के लिए अन्य सर्वर से उपयोगकर्ताओं का मैन्युअल रूप से अनुसरण करें", @@ -352,18 +351,11 @@ "lightbox.previous": "पिछला", "limited_account_hint.action": "फिर भी प्रोफाइल दिखाओ", "limited_account_hint.title": "यह प्रोफ़ाइल {domain} के मॉडरेटर द्वारा छिपाई गई है.", - "lists.account.add": "ऐड तो लिस्ट", - "lists.account.remove": "सूची से निकालें", "lists.delete": "सूची हटाएँ", "lists.edit": "सूची संपादित करें", - "lists.edit.submit": "शीर्षक बदलें", - "lists.new.create": "सूची जोड़ें", - "lists.new.title_placeholder": "नये सूची का शीर्षक", "lists.replies_policy.followed": "अन्य फोल्लोवेद यूजर", "lists.replies_policy.list": "सूची के सदस्य", "lists.replies_policy.none": "कोई नहीं", - "lists.replies_policy.title": "इसके जवाब दिखाएं:", - "lists.subheading": "आपकी सूचियाँ", "media_gallery.hide": "छिपाएं", "navigation_bar.about": "विवरण", "navigation_bar.blocks": "ब्लॉक्ड यूज़र्स", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 26c527f2fe..f09cd71c7c 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -199,7 +199,6 @@ "empty_column.hashtag": "Još ne postoji ništa s ovim hashtagom.", "empty_column.home": "Vaša početna vremenska crta je prazna! Posjetite {public} ili koristite tražilicu kako biste započeli i upoznali druge korisnike.", "empty_column.list": "Na ovoj listi još nema ničega. Kada članovi ove liste objave nove tootove, oni će se pojaviti ovdje.", - "empty_column.lists": "Nemaš niti jednu listu. Kada je kreiraš, prikazat će se ovdje.", "empty_column.mutes": "Niste utišali nijednog korisnika.", "empty_column.notifications": "Još nemate obavijesti. Komunicirajte s drugima kako biste započeli razgovor.", "empty_column.public": "Ovdje nema ništa! Napišite nešto javno ili ručno pratite korisnike s drugi poslužitelja da biste ovo popunili", @@ -298,18 +297,11 @@ "lightbox.next": "Sljedeće", "lightbox.previous": "Prethodno", "limited_account_hint.action": "Svejedno prikaži profil", - "lists.account.add": "Dodaj na listu", - "lists.account.remove": "Ukloni s liste", "lists.delete": "Izbriši listu", "lists.edit": "Uredi listu", - "lists.edit.submit": "Promijeni naslov", - "lists.new.create": "Dodaj listu", - "lists.new.title_placeholder": "Naziv nove liste", "lists.replies_policy.followed": "Bilo koji praćeni korisnik", "lists.replies_policy.list": "Članovi liste", "lists.replies_policy.none": "Nitko", - "lists.search": "Traži među praćenim ljudima", - "lists.subheading": "Vaše liste", "navigation_bar.about": "O aplikaciji", "navigation_bar.advanced_interface": "Otvori u naprednom web sučelju", "navigation_bar.blocks": "Blokirani korisnici", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 2ba7aef34b..9a76a21e93 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Jelenleg nem található semmi ezzel a hashtaggel.", "empty_column.home": "A saját idővonalad üres! Kövess további embereket ennek megtöltéséhez.", "empty_column.list": "A lista jelenleg üres. Ha a listatagok bejegyzést tesznek közzé, itt fog megjelenni.", - "empty_column.lists": "Még nincs egyetlen listád sem. Ha létrehozol egyet, itt fog megjelenni.", "empty_column.mutes": "Még egy felhasználót sem némítottál le.", "empty_column.notification_requests": "Minden tiszta! Itt nincs semmi. Ha új értesítéseket kapsz, azok itt jelennek meg a beállításoknak megfelelően.", "empty_column.notifications": "Jelenleg még nincsenek értesítéseid. Ha mások kapcsolatba lépnek veled, ezek itt lesznek láthatóak.", @@ -465,20 +464,11 @@ "link_preview.author": "{name} szerint", "link_preview.more_from_author": "Több tőle: {name}", "link_preview.shares": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}", - "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", "lists.edit": "Lista szerkesztése", - "lists.edit.submit": "Cím megváltoztatása", - "lists.exclusive": "Ezen bejegyzések elrejtése a kezdőoldalról", - "lists.new.create": "Lista hozzáadása", - "lists.new.title_placeholder": "Új lista címe", "lists.replies_policy.followed": "Bármely követett felhasználó", "lists.replies_policy.list": "A lista tagjai", "lists.replies_policy.none": "Senki", - "lists.replies_policy.title": "Nekik mutassuk a válaszokat:", - "lists.search": "Keresés a követett emberek között", - "lists.subheading": "Saját listák", "load_pending": "{count, plural, one {# új elem} other {# új elem}}", "loading_indicator.label": "Betöltés…", "media_gallery.hide": "Elrejtés", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 9e5ae79045..b5faf7e720 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -174,7 +174,6 @@ "empty_column.hashtag": "Այս պիտակով դեռ ոչինչ չկայ։", "empty_column.home": "Քո հիմնական հոսքը դատարկ է։ Այցելի՛ր {public}ը կամ օգտուիր որոնումից՝ այլ մարդկանց հանդիպելու համար։", "empty_column.list": "Այս ցանկում դեռ ոչինչ չկայ։ Երբ ցանկի անդամներից որեւէ մէկը նոր գրառում անի, այն կը յայտնուի այստեղ։", - "empty_column.lists": "Դուք դեռ չունէք ստեղծած ցանկ։ Ցանկ ստեղծելուն պէս այն կը յայտնուի այստեղ։", "empty_column.mutes": "Առայժմ ոչ ոքի չէք լռեցրել։", "empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր միւսներին՝ խօսակցութիւնը սկսելու համար։", "empty_column.public": "Այստեղ բան չկա՛յ։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգոյցներից էակների՝ այն լցնելու համար։", @@ -273,19 +272,11 @@ "lightbox.close": "Փակել", "lightbox.next": "Յաջորդ", "lightbox.previous": "Նախորդ", - "lists.account.add": "Աւելացնել ցանկին", - "lists.account.remove": "Հանել ցանկից", "lists.delete": "Ջնջել ցանկը", "lists.edit": "Փոփոխել ցանկը", - "lists.edit.submit": "Փոխել վերնագիրը", - "lists.new.create": "Աւելացնել ցանկ", - "lists.new.title_placeholder": "Նոր ցանկի վերնագիր", "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 {# նոր նիւթ} other {# նոր նիւթ}}", "navigation_bar.about": "Մասին", "navigation_bar.blocks": "Արգելափակուած օգտատէրեր", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 402829817f..891c293d50 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Il non ha ancora alcun cosa in iste hashtag.", "empty_column.home": "Tu chronologia de initio es vacue! Seque plus personas pro plenar lo.", "empty_column.list": "Iste lista es ancora vacue. Quando le membros de iste lista publica nove messages, illos apparera hic.", - "empty_column.lists": "Tu non ha ancora listas. Quando tu crea un, illo apparera hic.", "empty_column.mutes": "Tu non ha ancora silentiate alcun usator.", "empty_column.notification_requests": "Iste lista es toto vacue! Quando tu recipe notificationes, illos apparera hic como configurate in tu parametros.", "empty_column.notifications": "Tu non ha ancora notificationes. Quando altere personas interage con te, tu lo videra hic.", @@ -465,20 +464,11 @@ "link_preview.author": "Per {name}", "link_preview.more_from_author": "Plus de {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", - "lists.account.add": "Adder al lista", - "lists.account.remove": "Remover del lista", "lists.delete": "Deler lista", "lists.edit": "Modificar lista", - "lists.edit.submit": "Cambiar titulo", - "lists.exclusive": "Celar iste messages sur le pagina de initio", - "lists.new.create": "Adder lista", - "lists.new.title_placeholder": "Nove titulo del lista", "lists.replies_policy.followed": "Qualcunque usator sequite", "lists.replies_policy.list": "Membros del lista", "lists.replies_policy.none": "Nemo", - "lists.replies_policy.title": "Monstrar responsas a:", - "lists.search": "Cercar inter le gente que tu seque", - "lists.subheading": "Tu listas", "load_pending": "{count, plural, one {# nove entrata} other {# nove entratas}}", "loading_indicator.label": "Cargante…", "media_gallery.hide": "Celar", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 4b43363960..c966ea0ab0 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -267,7 +267,6 @@ "empty_column.hashtag": "Tidak ada apa pun dalam hashtag ini.", "empty_column.home": "Linimasa anda kosong! Kunjungi {public} atau gunakan pencarian untuk memulai dan bertemu pengguna lain.", "empty_column.list": "Belum ada apa pun di daftar ini. Ketika anggota dari daftar ini mengirim kiriman baru, mereka akan tampil di sini.", - "empty_column.lists": "Anda belum memiliki daftar. Ketika Anda membuatnya, maka akan muncul di sini.", "empty_column.mutes": "Anda belum membisukan siapa pun.", "empty_column.notifications": "Anda belum memiliki notifikasi. Ketika orang lain berinteraksi dengan Anda, Anda akan melihatnya di sini.", "empty_column.public": "Tidak ada apa pun di sini! Tulis sesuatu, atau ikuti pengguna lain dari server lain untuk mengisi ini", @@ -393,19 +392,11 @@ "limited_account_hint.action": "Tetap tampilkan profil", "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator {domain}.", "link_preview.author": "Oleh {name}", - "lists.account.add": "Tambah ke daftar", - "lists.account.remove": "Hapus dari daftar", "lists.delete": "Hapus daftar", "lists.edit": "Sunting daftar", - "lists.edit.submit": "Ubah judul", - "lists.new.create": "Tambah daftar", - "lists.new.title_placeholder": "Judul daftar baru", "lists.replies_policy.followed": "Siapa pun pengguna yang diikuti", "lists.replies_policy.list": "Anggota di daftar tersebut", "lists.replies_policy.none": "Tidak ada satu pun", - "lists.replies_policy.title": "Tampilkan balasan ke:", - "lists.search": "Cari di antara orang yang Anda ikuti", - "lists.subheading": "Daftar Anda", "load_pending": "{count, plural, other {# item baru}}", "loading_indicator.label": "Memuat…", "moved_to_account_banner.text": "Akun {disabledAccount} Anda kini dinonaktifkan karena Anda pindah ke {movedToAccount}.", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index f58cf1c71c..2be72b0488 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -253,7 +253,6 @@ "empty_column.hashtag": "Hay nullcos en ti-ci hashtag ancor.", "empty_column.home": "Tui hemal témpor-linea es vacui! Sequer plu gente por plenar it.", "empty_column.list": "Ancor ne hay quocunc in ti-ci liste. Quande membres de ti-ci liste publica nov postas, ili va aparir ci.", - "empty_column.lists": "Tu ancor have null listes. Quande tu crea un, it va aparir ci.", "empty_column.mutes": "Tu ancor ha silentiat null usatores.", "empty_column.notification_requests": "Omnicos clar! Hay necos ci. Nov notificationes va venir ci quande tu recive les secun tui parametres.", "empty_column.notifications": "Tu have null notificationes. Quande altri persones interacte con te, tu va vider it ci.", @@ -399,20 +398,11 @@ "limited_account_hint.action": "Monstrar profil totvez", "limited_account_hint.title": "Ti-ci profil ha esset celat del moderatores de {domain}.", "link_preview.author": "De {name}", - "lists.account.add": "Adjunter a liste", - "lists.account.remove": "Remover de liste", "lists.delete": "Deleter liste", "lists.edit": "Redacter liste", - "lists.edit.submit": "Changear titul", - "lists.exclusive": "Celar ti-ci postas del hemal témpor-linea", - "lists.new.create": "Adjunter liste", - "lists.new.title_placeholder": "Titul del nov liste", "lists.replies_policy.followed": "Quelcunc sequet usator", "lists.replies_policy.list": "Membres del liste", "lists.replies_policy.none": "Nequi", - "lists.replies_policy.title": "Monstrar responses a:", - "lists.search": "Serchar inter li persones quem tu seque", - "lists.subheading": "Tui listes", "load_pending": "{count, plural, one {# nov element} other {# nov elementes}}", "loading_indicator.label": "Cargant…", "moved_to_account_banner.text": "Tui conto {disabledAccount} es actualmen desactivisat pro que tu movet te a {movedToAccount}.", diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json index bcd62187af..60cb9b7c36 100644 --- a/app/javascript/mastodon/locales/ig.json +++ b/app/javascript/mastodon/locales/ig.json @@ -110,7 +110,6 @@ "lightbox.close": "Mechie", "lists.delete": "Hichapụ ndepụta", "lists.edit": "Dezie ndepụta", - "lists.subheading": "Ndepụta gị", "navigation_bar.about": "Maka", "navigation_bar.bookmarks": "Ebenrụtụakā", "navigation_bar.discover": "Chọpụta", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index f9173b65f9..8e2ea3dea4 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -271,7 +271,6 @@ "empty_column.hashtag": "Esas ankore nulo en ta gretovorto.", "empty_column.home": "Vua hemtempolineo esas vakua! Sequez plu multa personi por plenigar lu. {suggestions}", "empty_column.list": "There is nothing in this list 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.notification_requests": "Finis. Kande vu recevas nova savigi, oli aparos hike segun vua preferaji.", "empty_column.notifications": "Tu havas ankore nula savigo. Komunikez kun altri por debutar la konverso.", @@ -441,20 +440,11 @@ "link_preview.author": "Da {name}", "link_preview.more_from_author": "Plua de {name}", "link_preview.shares": "{count, plural,one {{counter} posto} other {{counter} posti}}", - "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.exclusive": "Celar ca posti del hemo", - "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.hide": "Celez", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index ecfc642969..ce4c21e18b 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -140,13 +140,16 @@ "column.blocks": "Útilokaðir notendur", "column.bookmarks": "Bókamerki", "column.community": "Staðvær tímalína", + "column.create_list": "Búa til lista", "column.direct": "Einkaspjall", "column.directory": "Skoða notendasnið", "column.domain_blocks": "Útilokuð lén", + "column.edit_list": "Breyta lista", "column.favourites": "Eftirlæti", "column.firehose": "Bein streymi", "column.follow_requests": "Beiðnir um að fylgjast með", "column.home": "Heim", + "column.list_members": "Sýsla með meðlimi listans", "column.lists": "Listar", "column.mutes": "Þaggaðir notendur", "column.notifications": "Tilkynningar", @@ -292,7 +295,6 @@ "empty_column.hashtag": "Það er ekkert ennþá undir þessu myllumerki.", "empty_column.home": "Heimatímalínan þín er tóm! Fylgstu með fleira fólki til að fylla hana. {suggestions}", "empty_column.list": "Það er ennþá ekki neitt á þessum lista. Þegar meðlimir á listanum senda inn nýjar færslur, munu þær birtast hér.", - "empty_column.lists": "Þú ert ennþá ekki með neina lista. Þegar þú býrð til einhvern lista, munu hann birtast hér.", "empty_column.mutes": "Þú hefur ekki þaggað niður í neinum notendum ennþá.", "empty_column.notification_requests": "Allt hreint! Það er ekkert hér. Þegar þú færð nýjar tilkynningar, munu þær birtast hér í samræmi við stillingarnar þínar.", "empty_column.notifications": "Þú ert ekki ennþá með neinar tilkynningar. Vertu í samskiptum við aðra til að umræður fari af stað.", @@ -465,20 +467,32 @@ "link_preview.author": "Frá {name}", "link_preview.more_from_author": "Meira frá {name}", "link_preview.shares": "{count, plural, one {{counter} færsla} other {{counter} færslur}}", - "lists.account.add": "Bæta á lista", - "lists.account.remove": "Fjarlægja af lista", + "lists.add_member": "Bæta við", + "lists.add_to_list": "Bæta á lista", + "lists.add_to_lists": "Bæta {name} á lista", + "lists.create": "Búa til", + "lists.create_a_list_to_organize": "Búðu til nýjan lista til að skipuleggja heimastreymið þitt", + "lists.create_list": "Búa til lista", "lists.delete": "Eyða lista", + "lists.done": "Lokið", "lists.edit": "Breyta lista", - "lists.edit.submit": "Breyta titli", - "lists.exclusive": "Hylja þessar færslur í heimastreymi", - "lists.new.create": "Bæta við lista", - "lists.new.title_placeholder": "Titill á nýjum lista", + "lists.exclusive": "Fela meðlimi í heimastreyminu", + "lists.exclusive_hint": "Ef einhver er á þessum lista, geturðu falið viðkomandi í heimastreyminu þínu til að komast hjá því að sjá færslurnar þeirra í tvígang.", + "lists.find_users_to_add": "Finndu notendur til að bæta við", + "lists.list_members": "Meðlimir lista", + "lists.list_members_count": "{count, plural, one {# meðlimur} other {# meðlimir}}", + "lists.list_name": "Heiti lista", + "lists.new_list_name": "Heiti á nýjum lista", + "lists.no_lists_yet": "Ennþá engir listar.", + "lists.no_members_yet": "Ennþá engir meðlimir.", + "lists.no_results_found": "Engar niðurstöður fundust.", + "lists.remove_member": "Fjarlægja", "lists.replies_policy.followed": "Allra notenda sem fylgst er með", "lists.replies_policy.list": "Meðlima listans", "lists.replies_policy.none": "Engra", - "lists.replies_policy.title": "Sýna svör til:", - "lists.search": "Leita meðal þeirra sem þú fylgist með", - "lists.subheading": "Listarnir þínir", + "lists.save": "Vista", + "lists.search_placeholder": "Leitaðu að fólki sem þú fylgist með", + "lists.show_replies_to": "Hafa með svör frá meðlimum lista til", "load_pending": "{count, plural, one {# nýtt atriði} other {# ný atriði}}", "loading_indicator.label": "Hleð inn…", "media_gallery.hide": "Fela", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index c4fcbdc3a4..d947b59eae 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -289,7 +289,6 @@ "empty_column.hashtag": "Non c'è ancora nulla in questo hashtag.", "empty_column.home": "La cronologia della tua home è vuota! Segui altre persone per riempirla. {suggestions}", "empty_column.list": "Non c'è ancora nulla in questo elenco. Quando i membri di questo elenco pubblicheranno nuovi post, appariranno qui.", - "empty_column.lists": "Non hai ancora nessun elenco. Quando ne creerai uno, apparirà qui.", "empty_column.mutes": "Non hai ancora silenziato alcun utente.", "empty_column.notification_requests": "Tutto chiaro! Non c'è niente qui. Quando ricevi nuove notifiche, verranno visualizzate qui in base alle tue impostazioni.", "empty_column.notifications": "Non hai ancora nessuna notifica. Quando altre persone interagiranno con te, le vedrai qui.", @@ -462,20 +461,11 @@ "link_preview.author": "Di {name}", "link_preview.more_from_author": "Altro da {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} post}}", - "lists.account.add": "Aggiungi all'elenco", - "lists.account.remove": "Rimuovi dall'elenco", "lists.delete": "Elimina elenco", "lists.edit": "Modifica elenco", - "lists.edit.submit": "Cambia il titolo", - "lists.exclusive": "Nascondi questi post dalla home", - "lists.new.create": "Aggiungi lista", - "lists.new.title_placeholder": "Titolo del nuovo elenco", "lists.replies_policy.followed": "Qualsiasi utente seguito", "lists.replies_policy.list": "Membri dell'elenco", "lists.replies_policy.none": "Nessuno", - "lists.replies_policy.title": "Mostra risposte a:", - "lists.search": "Cerca tra le persone che segui", - "lists.subheading": "Le tue liste", "load_pending": "{count, plural, one {# nuovo oggetto} other {# nuovi oggetti}}", "loading_indicator.label": "Caricamento…", "media_gallery.hide": "Nascondi", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index b839764242..1f891b9f90 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -291,7 +291,6 @@ "empty_column.hashtag": "このハッシュタグはまだ使われていません。", "empty_column.home": "ホームタイムラインはまだ空っぽです。だれかをフォローして埋めてみましょう。", "empty_column.list": "このリストにはまだなにもありません。このリストのメンバーが新しい投稿をするとここに表示されます。", - "empty_column.lists": "まだリストがありません。リストを作るとここに表示されます。", "empty_column.mutes": "まだ誰もミュートしていません。", "empty_column.notification_requests": "ここに表示するものはありません。新しい通知を受け取ったとき、フィルタリング設定で通知がブロックされたアカウントがある場合はここに表示されます。", "empty_column.notifications": "まだ通知がありません。他の人とふれ合って会話を始めましょう。", @@ -464,20 +463,11 @@ "link_preview.author": "{name}", "link_preview.more_from_author": "{name}さんの投稿をもっと読む", "link_preview.shares": "{count, plural, other {{counter}件の投稿}}", - "lists.account.add": "リストに追加", - "lists.account.remove": "リストから外す", "lists.delete": "リストを削除", "lists.edit": "リストを編集", - "lists.edit.submit": "タイトルを変更", - "lists.exclusive": "ホームタイムラインからこれらの投稿を非表示にする", - "lists.new.create": "リストを作成", - "lists.new.title_placeholder": "新規リスト名", "lists.replies_policy.followed": "フォロー中のユーザー全員", "lists.replies_policy.list": "リストのメンバー", "lists.replies_policy.none": "表示しない", - "lists.replies_policy.title": "リプライを表示:", - "lists.search": "フォローしている人の中から検索", - "lists.subheading": "あなたのリスト", "load_pending": "{count}件の新着", "loading_indicator.label": "読み込み中…", "media_gallery.hide": "隠す", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index fc0ed0730d..b38cc0e44a 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -145,14 +145,8 @@ "lightbox.close": "დახურვა", "lightbox.next": "შემდეგი", "lightbox.previous": "წინა", - "lists.account.add": "სიაში დამატება", - "lists.account.remove": "სიიდან ამოშლა", "lists.delete": "სიის წაშლა", "lists.edit": "სიის შეცვლა", - "lists.new.create": "სიის დამატება", - "lists.new.title_placeholder": "ახალი სიის სათაური", - "lists.search": "ძებნა ადამიანებს შორის რომელთაც მიჰყვებით", - "lists.subheading": "თქვენი სიები", "navigation_bar.blocks": "დაბლოკილი მომხმარებლები", "navigation_bar.community_timeline": "ლოკალური თაიმლაინი", "navigation_bar.compose": "Compose new toot", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 9cf94f2606..74d8e5a194 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -219,7 +219,6 @@ "empty_column.hashtag": "Ar tura ulac kra n ugbur yesɛan assaɣ ɣer uhacṭag-agi.", "empty_column.home": "Tasuddemt tagejdant n yisallen d tilemt! Ẓer {public} neɣ nadi ad tafeḍ imseqdacen-nniḍen ad ten-ḍefṛeḍ.", "empty_column.list": "Ar tura ur yelli kra deg umuɣ-a. Ad d-yettwasken da ticki iɛeggalen n wumuɣ-a suffɣen-d kra.", - "empty_column.lists": "Ulac ɣur-k·m kra n wumuɣ yakan. Ad d-tettwasken da ticki tesluleḍ-d yiwet.", "empty_column.mutes": "Ulac ɣur-k·m imseqdacen i yettwasgugmen.", "empty_column.notifications": "Ulac ɣur-k·m alɣuten. Sedmer akked yemdanen-nniḍen akken ad tebduḍ adiwenni.", "empty_column.public": "Ulac kra da! Aru kra, neɣ ḍfeṛ imdanen i yellan deg yiqeddacen-nniḍen akken ad d-teččar tsuddemt tazayezt", @@ -341,20 +340,11 @@ "link_preview.author": "S-ɣur {name}", "link_preview.more_from_author": "Ugar sɣur {name}", "link_preview.shares": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}", - "lists.account.add": "Rnu ɣer tebdart", - "lists.account.remove": "Kkes seg tebdart", "lists.delete": "Kkes tabdart", "lists.edit": "Ẓreg tabdart", - "lists.edit.submit": "Beddel azwel", - "lists.exclusive": "Ffer tisuffaɣ-a seg ugejdan", - "lists.new.create": "Rnu tabdart", - "lists.new.title_placeholder": "Azwel amaynut n tebdart", "lists.replies_policy.followed": "Kra n useqdac i yettwaḍefren", "lists.replies_policy.list": "Iɛeggalen n tebdart", "lists.replies_policy.none": "Ula yiwen·t", - "lists.replies_policy.title": "Ssken-d tiririyin i:", - "lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ", - "lists.subheading": "Tibdarin-ik·im", "load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}", "loading_indicator.label": "Yessalay-d …", "media_gallery.hide": "Seggelmes", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index f146fc652d..fad2807ffa 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -149,7 +149,6 @@ "empty_column.hashtag": "Бұндай хэштегпен әлі ешкім жазбапты.", "empty_column.home": "Әлі ешкімге жазылмапсыз. Бәлкім {public} жазбаларын қарап немесе іздеуді қолданып көрерсіз.", "empty_column.list": "Бұл тізімде ештеңе жоқ.", - "empty_column.lists": "Әзірше ешқандай тізіміңіз жоқ. Біреуін құрғаннан кейін осы жерде көрінетін болады.", "empty_column.mutes": "Әзірше ешқандай үнсізге қойылған қолданушы жоқ.", "empty_column.notifications": "Әзірше ешқандай ескертпе жоқ. Басқалармен араласуды бастаңыз және пікірталастарға қатысыңыз.", "empty_column.public": "Ештеңе жоқ бұл жерде! Өзіңіз бастап жазып көріңіз немесе басқаларға жазылыңыз", @@ -212,15 +211,8 @@ "lightbox.close": "Жабу", "lightbox.next": "Келесі", "lightbox.previous": "Алдыңғы", - "lists.account.add": "Тізімге қосу", - "lists.account.remove": "Тізімнен шығару", "lists.delete": "Тізімді өшіру", "lists.edit": "Тізімді өңдеу", - "lists.edit.submit": "Тақырыбын өзгерту", - "lists.new.create": "Тізім құру", - "lists.new.title_placeholder": "Жаңа тізім аты", - "lists.search": "Сіз іздеген адамдар арасында іздеу", - "lists.subheading": "Тізімдеріңіз", "load_pending": "{count, plural, one {# жаңа нәрсе} other {# жаңа нәрсе}}", "navigation_bar.blocks": "Бұғатталғандар", "navigation_bar.bookmarks": "Бетбелгілер", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 43f1e59e5e..ac19040d3a 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "이 해시태그는 아직 사용되지 않았습니다.", "empty_column.home": "당신의 홈 타임라인은 비어있습니다! 더 많은 사람을 팔로우하여 채워보세요.", "empty_column.list": "리스트에 아직 아무것도 없습니다. 리스트의 누군가가 게시물을 올리면 여기에 나타납니다.", - "empty_column.lists": "아직 리스트가 없습니다. 리스트를 만들면 여기에 나타납니다.", "empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.", "empty_column.notification_requests": "깔끔합니다! 여기엔 아무 것도 없습니다. 알림을 받게 되면 설정에 따라 여기에 나타나게 됩니다.", "empty_column.notifications": "아직 알림이 없습니다. 다른 사람들이 당신에게 반응했을 때, 여기에서 볼 수 있습니다.", @@ -465,20 +464,11 @@ "link_preview.author": "{name}", "link_preview.more_from_author": "{name} 프로필 보기", "link_preview.shares": "{count, plural, other {{counter} 개의 게시물}}", - "lists.account.add": "리스트에 추가", - "lists.account.remove": "리스트에서 제거", "lists.delete": "리스트 삭제", "lists.edit": "리스트 편집", - "lists.edit.submit": "제목 수정", - "lists.exclusive": "홈에서 이 게시물들 숨기기", - "lists.new.create": "리스트 추가", - "lists.new.title_placeholder": "새 리스트의 이름", "lists.replies_policy.followed": "팔로우 한 사용자 누구나", "lists.replies_policy.list": "리스트의 구성원", "lists.replies_policy.none": "모두 제외", - "lists.replies_policy.title": "답글 표시:", - "lists.search": "팔로우 중인 사람들 중에서 찾기", - "lists.subheading": "리스트", "load_pending": "{count, plural, other {#}} 개의 새 항목", "loading_indicator.label": "불러오는 중...", "media_gallery.hide": "숨기기", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 86ecf98446..d15fbb6762 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -190,7 +190,6 @@ "empty_column.hashtag": "Di vê hashtagê de hêj tiştekî tune.", "empty_column.home": "Rojeva demnameya te vala ye! Ji bona tijîkirinê bêtir mirovan bişopîne. {suggestions}", "empty_column.list": "Di vê rêzokê de hîn tiştek tune ye. Gava ku endamên vê rêzokê peyamên nû biweşînin, ew ê li vir xuya bibin.", - "empty_column.lists": "Hîn tu rêzokên te tune ne. Dema yekî çê bikî, ew ê li vir xuya bibe.", "empty_column.mutes": "Te tu bikarhêner bêdeng nekiriye.", "empty_column.notifications": "Hêj hişyariyên te tunene. Dema ku mirovên din bi we re têkilî danîn, hûn ê wê li vir bibînin.", "empty_column.public": "Li vir tiştekî tuneye! Ji raya giştî re tiştekî binivîsîne, an ji bo tijîkirinê ji rajekerên din bikarhêneran bi destan bişopînin", @@ -297,19 +296,11 @@ "lightbox.previous": "Paş", "limited_account_hint.action": "Bi heman awayî profîlê nîşan bide", "limited_account_hint.title": "Profîl ji aliyê rêveberên {domain}ê ve hatiye veşartin.", - "lists.account.add": "Li lîsteyê zêde bike", - "lists.account.remove": "Ji lîsteyê rake", "lists.delete": "Lîsteyê jê bibe", "lists.edit": "Lîsteyê serrast bike", - "lists.edit.submit": "Sernavê biguherîne", - "lists.new.create": "Li lîsteyê zêde bike", - "lists.new.title_placeholder": "Sernavê lîsteya nû", "lists.replies_policy.followed": "Bikarhênereke şopandî", "lists.replies_policy.list": "Endamên lîsteyê", "lists.replies_policy.none": "Ne yek", - "lists.replies_policy.title": "Bersivan nîşan bide:", - "lists.search": "Di navbera kesên ku te dişopînin bigere", - "lists.subheading": "Lîsteyên te", "load_pending": "{count, plural, one {# hêmaneke nû} other {#hêmaneke nû}}", "moved_to_account_banner.text": "Ajimêrê te {disabledAccount} niha neçalak e ji ber ku te bar kir bo {movedToAccount}.", "navigation_bar.about": "Derbar", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index cef24aa3b7..49f8149f65 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -131,7 +131,6 @@ "empty_column.hashtag": "Nyns eus travyth y'n bòlnos ma hwath.", "empty_column.home": "Agas amserlin dre yw gwag! Holyewgh moy a dus dh'y lenwel. {suggestions}", "empty_column.list": "Nyns eus travyth y'n rol ma hwath. Pan wra eseli an rol ma dyllo postow nowydh, i a wra omdhiskwedhes omma.", - "empty_column.lists": "Nyns eus dhywgh rolyow hwath. Pan wrewgh onan, hi a wra omdhiskwedhes omma.", "empty_column.mutes": "Ny wrussowgh tawhe devnydhyoryon vyth hwath.", "empty_column.notifications": "Nyns eus dhywgh gwarnyansow hwath. Pan wra tus erel ynterweythresa genowgh, hwi a'n gwel omma.", "empty_column.public": "Nyns eus travyth omma! Skrifewgh neppyth yn poblek, po holyewgh tus a leurennow erel dre leuv dh'y lenwel", @@ -197,19 +196,11 @@ "lightbox.close": "Degea", "lightbox.next": "Nessa", "lightbox.previous": "Kynsa", - "lists.account.add": "Keworra dhe rol", - "lists.account.remove": "Removya a rol", "lists.delete": "Dilea rol", "lists.edit": "Golegi rol", - "lists.edit.submit": "Chanjya titel", - "lists.new.create": "Keworra rol", - "lists.new.title_placeholder": "Titel rol nowydh", "lists.replies_policy.followed": "Py devnydhyer holys pynag", "lists.replies_policy.list": "Eseli an rol", "lists.replies_policy.none": "Nagonan", - "lists.replies_policy.title": "Diskwedhes gorthebow orth:", - "lists.search": "Hwilas yn-mysk tus a holyewgh", - "lists.subheading": "Agas rolyow", "load_pending": "{count, plural, one {# daklennowydh} other {# a daklennow nowydh}}", "navigation_bar.blocks": "Devnydhyoryon lettys", "navigation_bar.bookmarks": "Folennosow", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index 55678dbdf8..fc36d89272 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -81,7 +81,6 @@ "empty_column.followed_tags": "Nōn adhūc aliquem hastāginem secūtus es. Cum id fēceris, hic ostendētur.", "empty_column.home": "Tua linea temporum domesticus vacua est! Sequere plures personas ut eam compleas.", "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": "Nōn adhūc habēs ullo tabellās. Cum creās, hīc apparēbunt.", "empty_column.mutes": "Nondum quemquam usorem tacuisti.", "empty_column.notification_requests": "Omnia clara sunt! Nihil hic est. Cum novās notificātiōnēs accipīs, hic secundum tua praecepta apparebunt.", "empty_column.notifications": "Nōn adhūc habēs ullo notificātiōnēs. Cum aliī tē interagunt, hīc videbis.", @@ -138,9 +137,6 @@ "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Claudere", "lightbox.next": "Secundum", - "lists.account.add": "Adde ad tabellās", - "lists.new.create": "Addere tabella", - "lists.subheading": "Tuae tabulae", "load_pending": "{count, plural, one {# novum item} other {# nova itema}}", "moved_to_account_banner.text": "Tua ratione {disabledAccount} interdum reposita est, quod ad {movedToAccount} migrāvisti.", "mute_modal.you_wont_see_mentions": "Non videbis nuntios quī eōs commemorant.", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 0a5f82aee3..9f4f6e6cb9 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -270,7 +270,6 @@ "empty_column.hashtag": "Ainda no ay niente en esta etiketa.", "empty_column.home": "Tu linya de tiempo esta vaziya! Sige a mas personas para inchirla.", "empty_column.list": "Ainda no ay niente en esta lista. Kuando miembros de esta lista publiken muevas publikasyones, se amostraran aki.", - "empty_column.lists": "Ainda no tienes dinguna lista. Kuando kriyes una, aperesera aki.", "empty_column.mutes": "Ainda no tienes silensiado a dingun utilizador.", "empty_column.notifications": "Ainda no tienes dingun avizo. Kuando otras personas enteraktuen kontigo, se amostraran aki.", "empty_column.public": "No ay niente aki! Eskrive algo publikamente o manualmente sige utilizadores de otros sirvidores para inchirlo", @@ -433,20 +432,11 @@ "link_preview.author": "Publikasyon de {name}", "link_preview.more_from_author": "Mas de {name}", "link_preview.shares": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", - "lists.account.add": "Adjusta a lista", - "lists.account.remove": "Kita de lista", "lists.delete": "Efasa lista", "lists.edit": "Edita lista", - "lists.edit.submit": "Troka titolo", - "lists.exclusive": "Eskonder estas publikasyones de linya prinsipala", - "lists.new.create": "Adjusta lista", - "lists.new.title_placeholder": "Titolo de mueva lista", "lists.replies_policy.followed": "Kualseker utilizador segido", "lists.replies_policy.list": "Miembros de la lista", "lists.replies_policy.none": "Dinguno", - "lists.replies_policy.title": "Amostra repuestas a:", - "lists.search": "Bushka entre personas a las kualas siges", - "lists.subheading": "Tus listas", "load_pending": "{count, plural, one {# muevo elemento} other {# muevos elementos}}", "loading_indicator.label": "Eskargando…", "media_gallery.hide": "Eskonde", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 6d4f46f1d4..f9080f96e5 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -140,13 +140,16 @@ "column.blocks": "Užblokuoti naudotojai", "column.bookmarks": "Žymės", "column.community": "Vietinė laiko skalė", + "column.create_list": "Kurti sąrašą", "column.direct": "Privatūs paminėjimai", "column.directory": "Naršyti profilius", "column.domain_blocks": "Užblokuoti serveriai", + "column.edit_list": "Redaguoti sąrašą", "column.favourites": "Mėgstami", "column.firehose": "Tiesioginiai srautai", "column.follow_requests": "Sekimo prašymai", "column.home": "Pagrindinis", + "column.list_members": "Tvarkyti sąrašo narius", "column.lists": "Sąrašai", "column.mutes": "Nutildyti naudotojai", "column.notifications": "Pranešimai", @@ -292,7 +295,6 @@ "empty_column.hashtag": "Nėra nieko šiame saitažodyje kol kas.", "empty_column.home": "Tavo pagrindinio laiko skalė tuščia. Sek daugiau žmonių, kad ją užpildytum.", "empty_column.list": "Nėra nieko šiame sąraše kol kas. Kai šio sąrašo nariai paskelbs naujų įrašų, jie bus rodomi čia.", - "empty_column.lists": "Dar neturi jokių sąrašų. Kai jį sukursi, jis bus rodomas čia.", "empty_column.mutes": "Dar nesi nutildęs (-usi) nė vieno naudotojo.", "empty_column.notification_requests": "Viskas švaru! Čia nieko nėra. Kai gausi naujų pranešimų, jie bus rodomi čia pagal tavo nustatymus.", "empty_column.notifications": "Dar neturi jokių pranešimų. Kai kiti žmonės su tavimi sąveikaus, matysi tai čia.", @@ -465,20 +467,32 @@ "link_preview.author": "Sukūrė {name}", "link_preview.more_from_author": "Daugiau iš {name}", "link_preview.shares": "{count, plural, one {{counter} įrašas} few {{counter} įrašai} many {{counter} įrašo} other {{counter} įrašų}}", - "lists.account.add": "Pridėti į sąrašą", - "lists.account.remove": "Pašalinti iš sąrašo", + "lists.add_member": "Pridėti", + "lists.add_to_list": "Pridėti į sąrašą", + "lists.add_to_lists": "Pridėti {name} į sąrašą", + "lists.create": "Kurti", + "lists.create_a_list_to_organize": "Sukurkite naują sąrašą, kad sutvarkytumėte pagrindinį srautą", + "lists.create_list": "Kurti sąrašą", "lists.delete": "Ištrinti sąrašą", + "lists.done": "Atlikta", "lists.edit": "Redaguoti sąrašą", - "lists.edit.submit": "Keisti pavadinimą", - "lists.exclusive": "Slėpti šiuos įrašus iš pagrindinio", - "lists.new.create": "Pridėti sąrašą", - "lists.new.title_placeholder": "Naujas sąrašo pavadinimas", + "lists.exclusive": "Slėpti narius pagrindiniame", + "lists.exclusive_hint": "Jei kas nors yra šiame sąraše, paslėpkite juos pagrindinio srauto laiko skalėje, kad nematytumėte jų įrašus dukart.", + "lists.find_users_to_add": "Raskite naudotojų, kurių pridėti", + "lists.list_members": "Sąrašo nariai", + "lists.list_members_count": "{count, plural, one {# narys} few {# nariai} many {# nario} other {# narių}}", + "lists.list_name": "Sąrašo pavadinimas", + "lists.new_list_name": "Naujas sąrašo pavadinimas", + "lists.no_lists_yet": "Kol kas nėra sąrašų.", + "lists.no_members_yet": "Kol kas nėra narių.", + "lists.no_results_found": "Rezultatų nerasta.", + "lists.remove_member": "Šalinti", "lists.replies_policy.followed": "Bet kuriam sekamam naudotojui", "lists.replies_policy.list": "Sąrašo nariams", "lists.replies_policy.none": "Nei vienam", - "lists.replies_policy.title": "Rodyti atsakymus:", - "lists.search": "Ieškoti tarp sekamų žmonių", - "lists.subheading": "Tavo sąrašai", + "lists.save": "Išsaugoti", + "lists.search_placeholder": "Ieškokite asmenų, kuriuos sekate", + "lists.show_replies_to": "Įtraukti atsakymus iš sąrašo narių į", "load_pending": "{count, plural, one {# naujas elementas} few {# nauji elementai} many {# naujo elemento} other {# naujų elementų}}", "loading_indicator.label": "Kraunama…", "media_gallery.hide": "Slėpti", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index d6fcb34828..542231f05f 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -262,7 +262,6 @@ "empty_column.hashtag": "Ar šo tēmturi nekas nav atrodams.", "empty_column.home": "Tava mājas laikjosla ir tukša. Seko vairāk cilvēkiem, lai to piepildītu!", "empty_column.list": "Pagaidām šajā sarakstā nekā nav. Kad šī saraksta dalībnieki ievietos jaunus ierakstus, tie parādīsies šeit.", - "empty_column.lists": "Pašlaik Tev nav neviena saraksta. Kad tādu izveidosi, tas parādīsies šeit.", "empty_column.mutes": "Neviens lietotājs vēl nav apklusināts.", "empty_column.notifications": "Tev vēl nav paziņojumu. Kad citi cilvēki ar Tevi mijiedarbosies, Tu to redzēsi šeit.", "empty_column.public": "Šeit nekā nav. Ieraksti kaut ko publiski vai seko lietotājiem no citiem serveriem, lai iegūtu saturu", @@ -405,20 +404,11 @@ "limited_account_hint.title": "{domain} moderatori ir paslēpuši šo profilu.", "link_preview.author": "Pēc {name}", "link_preview.more_from_author": "Vairāk no {name}", - "lists.account.add": "Pievienot sarakstam", - "lists.account.remove": "Noņemt no saraksta", "lists.delete": "Izdzēst sarakstu", "lists.edit": "Labot sarakstu", - "lists.edit.submit": "Mainīt virsrakstu", - "lists.exclusive": "Nerādīt šos ierakstus sākumā", - "lists.new.create": "Pievienot sarakstu", - "lists.new.title_placeholder": "Jaunā saraksta nosaukums", "lists.replies_policy.followed": "Jebkuram sekotajam lietotājam", "lists.replies_policy.list": "Saraksta dalībniekiem", "lists.replies_policy.none": "Nevienam", - "lists.replies_policy.title": "Rādīt atbildes:", - "lists.search": "Meklēt starp cilvēkiem, kuriem tu seko", - "lists.subheading": "Tavi saraksti", "load_pending": "{count, plural, one {# jauna lieta} other {# jaunas lietas}}", "loading_indicator.label": "Ielādē…", "media_gallery.hide": "Paslēpt", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index b7a2ad2a3f..de4f565a5f 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -275,17 +275,9 @@ "lightbox.previous": "പുറകോട്ട്", "limited_account_hint.action": "എന്നാലും രൂപരേഖ കാണിക്കുക", "link_preview.author": "{name}-നിന്നു്", - "lists.account.add": "പട്ടികയിലേക്ക് ചേർക്കുക", - "lists.account.remove": "പട്ടികയിൽ നിന്ന് ഒഴിവാക്കുക", "lists.delete": "പട്ടിക ഒഴിവാക്കുക", "lists.edit": "പട്ടിക തിരുത്തുക", - "lists.edit.submit": "തലക്കെട്ട് മാറ്റുക", - "lists.exclusive": "ഈ എഴുത്തുകൾ ആമുഖം നിന്നു് മറയ്ക്കുക", - "lists.new.create": "പുതിയ പട്ടിക ചേർക്കുക", - "lists.new.title_placeholder": "പുതിയ പട്ടിക തലക്കെട്ടു്", "lists.replies_policy.none": "ആരുമില്ല", - "lists.replies_policy.title": "ഇതിനുള്ള മറുപടികൾ കാണിക്കുക:", - "lists.subheading": "എന്റെ പട്ടികകൾ", "media_gallery.hide": "മറയ്ക്കുക", "navigation_bar.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ", "navigation_bar.bookmarks": "ബുക്ക്മാർക്കുകൾ", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index aa8169616e..363269541b 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -173,19 +173,11 @@ "lightbox.previous": "मागील", "limited_account_hint.action": "तरीही प्रोफाइल दाखवा", "limited_account_hint.title": "हे प्रोफाइल {domain} च्या नियंत्रकांनी लपवले आहे.", - "lists.account.add": "यादीमध्ये जोडा", - "lists.account.remove": "यादीमधून काढा", "lists.delete": "सूची हटवा", "lists.edit": "सूची संपादित करा", - "lists.edit.submit": "शीर्षक बदला", - "lists.new.create": "यादी जोडा", - "lists.new.title_placeholder": "नवीन सूची शीर्षक", "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}}", "navigation_bar.compose": "Compose new toot", "navigation_bar.domain_blocks": "Hidden domains", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 9dea731397..f2af798d4e 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -229,7 +229,6 @@ "empty_column.hashtag": "Belum ada apa-apa dengan tanda pagar ini.", "empty_column.home": "Garis masa laman utama anda kosong! Ikuti lebih ramai orang untuk mengisinya. {suggestions}", "empty_column.list": "Tiada apa-apa di senarai ini lagi. Apabila ahli senarai ini menerbitkan hantaran baharu, ia akan dipaparkan di sini.", - "empty_column.lists": "Anda belum ada sebarang senarai. Apabila anda menciptanya, ia akan muncul di sini.", "empty_column.mutes": "Anda belum membisukan sesiapa.", "empty_column.notifications": "Anda belum ada sebarang pemberitahuan. Apabila orang lain berinteraksi dengan anda, ia akan muncul di sini.", "empty_column.public": "Tiada apa-apa di sini! Tulis sesuatu secara awam, atau ikuti pengguna daripada pelayan lain secara manual untuk mengisinya", @@ -366,20 +365,11 @@ "limited_account_hint.action": "Paparkan profil", "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator {domain}.", "link_preview.author": "Dengan {name}", - "lists.account.add": "Tambah ke senarai", - "lists.account.remove": "Buang daripada senarai", "lists.delete": "Padam senarai", "lists.edit": "Sunting senarai", - "lists.edit.submit": "Ubah tajuk", - "lists.exclusive": "Sembunyikan pos ini dari rumah", - "lists.new.create": "Tambah senarai", - "lists.new.title_placeholder": "Tajuk senarai baharu", "lists.replies_policy.followed": "Sesiapa yang diikuti", "lists.replies_policy.list": "Ahli-ahli dalam senarai", "lists.replies_policy.none": "Tiada sesiapa", - "lists.replies_policy.title": "Tunjukkan balasan kepada:", - "lists.search": "Cari dalam kalangan orang yang anda ikuti", - "lists.subheading": "Senarai anda", "load_pending": "{count, plural, one {# item baharu} other {# item baharu}}", "loading_indicator.label": "Memuatkan…", "moved_to_account_banner.text": "Akaun anda {disabledAccount} kini dinyahdayakan kerana anda berpindah ke {movedToAccount}.", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index c97de73335..a82e56e6f2 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -215,7 +215,6 @@ "empty_column.hashtag": "ဤ hashtag တွင် မည်သည့်အရာမျှ မရှိသေးပါ။", "empty_column.home": "သင့်ပင်မစာမျက်နှာမှာ အလွတ်ဖြစ်နေပါသည်။ ဖြည့်ရန်အတွက် လူများကို စောင့်ကြည့်ပါ {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": "သင့်တွင် List မရှိသေးပါ။ List အသစ်ဖွင့်လျှင် ဤနေရာတွင်ကြည့်ရှုနိုင်မည်", "empty_column.mutes": "ပိတ်ထားသောအကောင့်များမရှိသေးပါ", "empty_column.notifications": "သတိပေးချက်မရှိသေးပါ။ သတိပေးချက်အသစ်ရှိလျှင် ဤနေရာတွင်ကြည့်ရှုနိုင်သည်", "empty_column.public": "ဤနေရာတွင် မည်သည့်အရာမျှမရှိပါ။ တစ်ခုခုရေးပါ သို့မဟုတ် ဖြည့်စွက်ရန်အတွက် အခြားဆာဗာ အသုံးပြုသူများကို စောင့်ကြည့်ပါ။", @@ -344,20 +343,11 @@ "limited_account_hint.action": "ဘာပဲဖြစ်ဖြစ် ပရိုဖိုင်ကို ပြပါ", "limited_account_hint.title": "ဤပရိုဖိုင်ကို {domain} ၏ စိစစ်သူများမှ ဖျောက်ထားသည်။", "link_preview.author": "{name} ဖြင့်", - "lists.account.add": "စာရင်းထဲသို့ထည့်ပါ", - "lists.account.remove": "စာရင်းမှ ဖယ်ရှားလိုက်ပါ။", "lists.delete": "စာရင်းကိုဖျက်ပါ", "lists.edit": "စာရင်းကိုပြင်ဆင်ပါ", - "lists.edit.submit": "ခေါင်းစဥ် ပြောင်းလဲရန်", - "lists.exclusive": "ဤပို့စ်များကို ပင်မစာမျက်နှာတွင် မပြပါနှင့်", - "lists.new.create": "စာရင်းသွင်းပါ", - "lists.new.title_placeholder": "စာရင်းသစ်ခေါင်းစဥ်", "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}}", "loading_indicator.label": "လုပ်ဆောင်နေသည်…", "moved_to_account_banner.text": "{movedToAccount} အကောင့်သို့ပြောင်းလဲထားသဖြင့် {disabledAccount} အကောင့်မှာပိတ်ထားသည်", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index eb21d2ad1d..1828fc8f02 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -140,13 +140,16 @@ "column.blocks": "Geblokkeerde gebruikers", "column.bookmarks": "Bladwijzers", "column.community": "Lokale tijdlijn", + "column.create_list": "Lijst aanmaken", "column.direct": "Privéberichten", "column.directory": "Gebruikersgids", "column.domain_blocks": "Geblokkeerde servers", + "column.edit_list": "Lijst bewerken", "column.favourites": "Favorieten", "column.firehose": "Openbare tijdlijnen", "column.follow_requests": "Volgverzoeken", "column.home": "Start", + "column.list_members": "Lijstleden beheren", "column.lists": "Lijsten", "column.mutes": "Genegeerde gebruikers", "column.notifications": "Meldingen", @@ -292,7 +295,6 @@ "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.", "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": "Je hebt nog geen lijsten. Wanneer je er een aanmaakt, valt dat hier te zien.", "empty_column.mutes": "Jij hebt nog geen gebruikers genegeerd.", "empty_column.notification_requests": "Helemaal leeg! Er is hier niets. Wanneer je nieuwe meldingen ontvangt, verschijnen deze hier volgens jouw instellingen.", "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.", @@ -465,20 +467,32 @@ "link_preview.author": "Door {name}", "link_preview.more_from_author": "Meer van {name}", "link_preview.shares": "{count, plural, one {{counter} bericht} other {{counter} berichten}}", - "lists.account.add": "Aan lijst toevoegen", - "lists.account.remove": "Uit lijst verwijderen", + "lists.add_member": "Toevoegen", + "lists.add_to_list": "Aan lijst toevoegen", + "lists.add_to_lists": "{name} aan lijsten toevoegen", + "lists.create": "Aanmaken", + "lists.create_a_list_to_organize": "Maak een nieuwe lijst aan om je Startpagina te organiseren", + "lists.create_list": "Lijst aanmaken", "lists.delete": "Lijst verwijderen", + "lists.done": "Klaar", "lists.edit": "Lijst bewerken", - "lists.edit.submit": "Titel veranderen", - "lists.exclusive": "Verberg lijstleden op je starttijdlijn", - "lists.new.create": "Lijst toevoegen", - "lists.new.title_placeholder": "Naam nieuwe lijst", + "lists.exclusive": "Leden op je Startpagina verbergen", + "lists.exclusive_hint": "Als iemand op deze lijst staat, verberg hem dan op je Startpagina om te voorkomen dat zijn berichten twee keer worden getoond.", + "lists.find_users_to_add": "Vind gebruikers om toe te voegen", + "lists.list_members": "Lijstleden", + "lists.list_members_count": "{count, plural, one{# lid} other{# leden}}", + "lists.list_name": "Lijstnaam", + "lists.new_list_name": "Nieuwe lijstnaam", + "lists.no_lists_yet": "Nog geen lijsten.", + "lists.no_members_yet": "Nog geen leden.", + "lists.no_results_found": "Geen resultaten gevonden.", + "lists.remove_member": "Verwijderen", "lists.replies_policy.followed": "Elke gevolgde gebruiker", "lists.replies_policy.list": "Leden van de lijst", "lists.replies_policy.none": "Niemand", - "lists.replies_policy.title": "Toon reacties aan:", - "lists.search": "Zoek naar mensen die je volgt", - "lists.subheading": "Jouw lijsten", + "lists.save": "Opslaan", + "lists.search_placeholder": "Zoek mensen die je volgt", + "lists.show_replies_to": "Voeg antwoorden van lijstleden toe aan", "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}", "loading_indicator.label": "Laden…", "media_gallery.hide": "Verberg", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 85d19c4f93..440387e1a9 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Det er ingenting i denne emneknaggen enno.", "empty_column.home": "Heime-tidslina di er tom! Fylg fleire folk for å fylla ho med innhald. {suggestions}.", "empty_column.list": "Det er ingenting i denne lista enno. Når medlemer av denne lista legg ut nye statusar, så dukkar dei opp her.", - "empty_column.lists": "Du har ingen lister enno. Når du lagar ei, så dukkar ho opp her.", "empty_column.mutes": "Du har ikkje målbunde nokon enno.", "empty_column.notification_requests": "Ferdig! Her er det ingenting. Når du får nye varsel, kjem dei opp her slik du har valt.", "empty_column.notifications": "Du har ingen varsel enno. Kommuniser med andre for å starte samtalen.", @@ -465,20 +464,11 @@ "link_preview.author": "Av {name}", "link_preview.more_from_author": "Meir frå {name}", "link_preview.shares": "{count, plural,one {{counter} innlegg} other {{counter} innlegg}}", - "lists.account.add": "Legg til i liste", - "lists.account.remove": "Fjern frå liste", "lists.delete": "Slett liste", "lists.edit": "Rediger liste", - "lists.edit.submit": "Endre tittel", - "lists.exclusive": "Skjul desse innlegga frå heimestraumen din", - "lists.new.create": "Legg til liste", - "lists.new.title_placeholder": "Ny listetittel", "lists.replies_policy.followed": "Alle fylgde brukarar", "lists.replies_policy.list": "Medlemar i lista", "lists.replies_policy.none": "Ingen", - "lists.replies_policy.title": "Vis svar på:", - "lists.search": "Søk blant folk du fylgjer", - "lists.subheading": "Listene dine", "load_pending": "{count, plural, one {# nytt element} other {# nye element}}", "loading_indicator.label": "Lastar…", "media_gallery.hide": "Gøym", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 9a5f379797..b461d3049f 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -268,7 +268,6 @@ "empty_column.hashtag": "Det er ingenting i denne emneknaggen ennå.", "empty_column.home": "Hjem-tidslinjen din er tom! Følg flere folk for å fylle den. {suggestions}", "empty_column.list": "Det er ingenting i denne listen ennå. Når medlemmene av denne listen legger ut nye statuser vil de dukke opp her.", - "empty_column.lists": "Du har ingen lister enda. Når du lager en, vil den dukke opp her.", "empty_column.mutes": "Du har ikke dempet noen brukere enda.", "empty_column.notification_requests": "Alt klart! Det er ingenting her. Når du mottar nye varsler, vises de her i henhold til dine innstillinger.", "empty_column.notifications": "Du har ingen varsler ennå. Kommuniser med andre for å begynne samtalen.", @@ -436,20 +435,11 @@ "link_preview.author": "Av {name}", "link_preview.more_from_author": "Mer fra {name}", "link_preview.shares": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}", - "lists.account.add": "Legg til i listen", - "lists.account.remove": "Fjern fra listen", "lists.delete": "Slett listen", "lists.edit": "Rediger listen", - "lists.edit.submit": "Endre tittel", - "lists.exclusive": "Skjul disse innleggene i tidslinjen", - "lists.new.create": "Legg til liste", - "lists.new.title_placeholder": "Ny listetittel", "lists.replies_policy.followed": "Enhver fulgt bruker", "lists.replies_policy.list": "Medlemmer i listen", "lists.replies_policy.none": "Ingen", - "lists.replies_policy.title": "Vis svar på:", - "lists.search": "Søk blant personer du følger", - "lists.subheading": "Dine lister", "load_pending": "{count, plural,one {# ny gjenstand} other {# nye gjenstander}}", "loading_indicator.label": "Laster…", "moved_to_account_banner.text": "Din konto {disabledAccount} er for øyeblikket deaktivert fordi du flyttet til {movedToAccount}.", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 37687bc844..ddaf949873 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -202,7 +202,6 @@ "empty_column.hashtag": "I a pas encara de contengut ligat a aquesta etiqueta.", "empty_column.home": "Vòstre flux d’acuèlh es void. Visitatz {public} o utilizatz la recèrca per vos connectar a d’autras personas.", "empty_column.list": "I a pas res dins la lista pel moment. Quand de membres d’aquesta lista publiquen de novèls estatuts los veiretz aquí.", - "empty_column.lists": "Encara avètz pas cap de lista. Quand ne creetz una, apareisserà aquí.", "empty_column.mutes": "Encara avètz pas mes en silenci degun.", "empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualqu’un per començar una conversacion.", "empty_column.public": "I a pas res aquí ! Escrivètz quicòm de public, o seguètz de personas d’autres servidors per garnir lo flux public", @@ -311,19 +310,11 @@ "limited_account_hint.action": "Afichar lo perfil de tota manièra", "limited_account_hint.title": "Aqueste perfil foguèt rescondut per la moderacion de {domain}.", "link_preview.author": "Per {name}", - "lists.account.add": "Ajustar a la lista", - "lists.account.remove": "Levar de la lista", "lists.delete": "Suprimir la lista", "lists.edit": "Modificar la lista", - "lists.edit.submit": "Cambiar lo títol", - "lists.new.create": "Ajustar una lista", - "lists.new.title_placeholder": "Títol de la nòva lista", "lists.replies_policy.followed": "Quin seguidor que siá", "lists.replies_policy.list": "Membres de la lista", "lists.replies_policy.none": "Degun", - "lists.replies_policy.title": "Mostrar las responsas a :", - "lists.search": "Cercar demest lo mond que seguètz", - "lists.subheading": "Vòstras listas", "load_pending": "{count, plural, one {# nòu element} other {# nòu elements}}", "loading_indicator.label": "Cargament…", "navigation_bar.about": "A prepaus", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 5da88ff08f..86226f4cde 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -201,8 +201,6 @@ "lightbox.next": "ਅਗਲੀ", "lightbox.previous": "ਪਿਛਲੀ", "link_preview.author": "{name} ਵਲੋਂ", - "lists.account.add": "ਸੂਚੀ ਵਿੱਚ ਜੋੜੋ", - "lists.account.remove": "ਸੂਚੀ ਵਿਚੋਂ ਹਟਾਓ", "lists.delete": "ਸੂਚੀ ਹਟਾਓ", "lists.replies_policy.followed": "ਕੋਈ ਵੀ ਫ਼ਾਲੋ ਕੀਤਾ ਵਰਤੋਂਕਾਰ", "lists.replies_policy.none": "ਕੋਈ ਨਹੀਂ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 4558e29cb8..86c02a6a87 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -291,7 +291,6 @@ "empty_column.hashtag": "Nie ma wpisów oznaczonych tym hasztagiem. Możesz napisać pierwszy(-a).", "empty_column.home": "Nie obserwujesz nikogo. Odwiedź globalną oś czasu lub użyj wyszukiwarki, aby znaleźć interesujące Cię profile.", "empty_column.list": "Nie ma nic na tej liście. Kiedy członkowie listy dodadzą nowe wpisy, pojawia się one tutaj.", - "empty_column.lists": "Nie masz żadnych list. Kiedy utworzysz jedną, pojawi się tutaj.", "empty_column.mutes": "Nie wyciszyłeś(-aś) jeszcze żadnego użytkownika.", "empty_column.notification_requests": "To wszystko – kiedy otrzymasz nowe powiadomienia, pokażą się tutaj zgodnie z twoimi ustawieniami.", "empty_column.notifications": "Nie masz żadnych powiadomień. Rozpocznij interakcje z innymi użytkownikami.", @@ -464,20 +463,11 @@ "link_preview.author": "{name}", "link_preview.more_from_author": "Więcej od {name}", "link_preview.shares": "{count, plural, one {{counter} wpis} few {{counter} wpisy} many {{counter} wpisów} other {{counter} wpisów}}", - "lists.account.add": "Dodaj do listy", - "lists.account.remove": "Usunąć z listy", "lists.delete": "Usuń listę", "lists.edit": "Edytuj listę", - "lists.edit.submit": "Zmień tytuł", - "lists.exclusive": "Ukryj te posty w lokalnej osi czasu", - "lists.new.create": "Utwórz listę", - "lists.new.title_placeholder": "Wprowadź tytuł listy", "lists.replies_policy.followed": "Dowolny obserwowany użytkownik", "lists.replies_policy.list": "Członkowie listy", "lists.replies_policy.none": "Nikt", - "lists.replies_policy.title": "Pokazuj odpowiedzi dla:", - "lists.search": "Szukaj wśród osób które obserwujesz", - "lists.subheading": "Twoje listy", "load_pending": "{count, plural, one {# nowa pozycja} other {nowe pozycje}}", "loading_indicator.label": "Ładowanie…", "media_gallery.hide": "Ukryj", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index e2fbaff02b..8740cd13de 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -140,13 +140,16 @@ "column.blocks": "Usuários bloqueados", "column.bookmarks": "Salvos", "column.community": "Linha local", + "column.create_list": "Criar lista", "column.direct": "Menções privadas", "column.directory": "Explorar perfis", "column.domain_blocks": "Domínios bloqueados", + "column.edit_list": "Editar lista", "column.favourites": "Favoritos", "column.firehose": "Feeds ao vivo", "column.follow_requests": "Seguidores pendentes", "column.home": "Página inicial", + "column.list_members": "Gerenciar membros da lista", "column.lists": "Listas", "column.mutes": "Usuários silenciados", "column.notifications": "Notificações", @@ -292,7 +295,6 @@ "empty_column.hashtag": "Nada aqui.", "empty_column.home": "Sua página inicial está vazia! Siga mais pessoas para começar: {suggestions}", "empty_column.list": "Nada aqui. Quando membros da lista tootarem, eles aparecerão aqui.", - "empty_column.lists": "Nada aqui. Quando você criar listas, elas aparecerão aqui.", "empty_column.mutes": "Nada aqui.", "empty_column.notification_requests": "Tudo limpo! Não há nada aqui. Quando você receber novas notificações, elas aparecerão aqui de acordo com suas configurações.", "empty_column.notifications": "Interaja com outros usuários para começar a conversar.", @@ -465,20 +467,32 @@ "link_preview.author": "Por {name}", "link_preview.more_from_author": "Mais de {name}", "link_preview.shares": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", - "lists.account.add": "Adicionar à lista", - "lists.account.remove": "Remover da lista", + "lists.add_member": "Adicionar", + "lists.add_to_list": "Adicionar à lista", + "lists.add_to_lists": "Adicionar {name} à lista", + "lists.create": "Criar", + "lists.create_a_list_to_organize": "Crie uma lista para organizar seu feed inicial", + "lists.create_list": "Criar lista", "lists.delete": "Excluir lista", + "lists.done": "Concluído", "lists.edit": "Editar lista", - "lists.edit.submit": "Renomear lista", - "lists.exclusive": "Ocultar estes posts da página inicial", - "lists.new.create": "Criar lista", - "lists.new.title_placeholder": "Nome da lista", + "lists.exclusive": "Ocultar membros no início", + "lists.exclusive_hint": "Se existe alguém nesta lista, oculte-os no seu feed inicial para evitar ver suas publicações duas vezes.", + "lists.find_users_to_add": "Encontrar usuários para adicionar", + "lists.list_members": "Membros da lista", + "lists.list_members_count": "{count, plural, one {# membro} other {# membros}}", + "lists.list_name": "Nome da lista", + "lists.new_list_name": "Nome novo da lista", + "lists.no_lists_yet": "Sem listas ainda.", + "lists.no_members_yet": "Nenhum membro ainda.", + "lists.no_results_found": "Nenhum resultado encontrado.", + "lists.remove_member": "Remover", "lists.replies_policy.followed": "Qualquer usuário seguido", "lists.replies_policy.list": "Membros da lista", "lists.replies_policy.none": "Ninguém", - "lists.replies_policy.title": "Mostrar respostas para:", - "lists.search": "Procurar entre as pessoas que segue", - "lists.subheading": "Suas listas", + "lists.save": "Salvar", + "lists.search_placeholder": "Buscar pessoas que você segue", + "lists.show_replies_to": "Incluir respostas de membros da lista para", "load_pending": "{count, plural, one {# novo item} other {# novos items}}", "loading_indicator.label": "Carregando…", "media_gallery.hide": "Ocultar", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index a06d259be2..6a6b5549ed 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -272,7 +272,6 @@ "empty_column.hashtag": "Não foram encontradas publicações com essa #etiqueta.", "empty_column.home": "A sua linha cronológica inicial está vazia! Siga mais pessoas para a preencher.", "empty_column.list": "Ainda não existem publicações nesta lista. Quando membros desta lista fizerem novas publicações, elas aparecerão aqui.", - "empty_column.lists": "Ainda não tem qualquer lista. Quando criar uma, ela irá aparecer aqui.", "empty_column.mutes": "Ainda não silenciaste qualquer utilizador.", "empty_column.notification_requests": "Tudo limpo! Não há nada aqui. Quando você receber novas notificações, elas aparecerão aqui conforme as suas configurações.", "empty_column.notifications": "Não tens notificações. Interage com outros utilizadores para iniciar uma conversa.", @@ -440,20 +439,11 @@ "link_preview.author": "Por {name}", "link_preview.more_from_author": "Mais de {name}", "link_preview.shares": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", - "lists.account.add": "Adicionar à lista", - "lists.account.remove": "Remover da lista", "lists.delete": "Eliminar lista", "lists.edit": "Editar lista", - "lists.edit.submit": "Mudar o título", - "lists.exclusive": "Ocultar essas publicações da página inicial", - "lists.new.create": "Adicionar lista", - "lists.new.title_placeholder": "Título da nova lista", "lists.replies_policy.followed": "Qualquer utilizador seguido", "lists.replies_policy.list": "Membros da lista", "lists.replies_policy.none": "Ninguém", - "lists.replies_policy.title": "Mostrar respostas para:", - "lists.search": "Pesquisa entre as pessoas que segues", - "lists.subheading": "As tuas listas", "load_pending": "{count, plural, one {# novo item} other {# novos itens}}", "loading_indicator.label": "A carregar…", "media_gallery.hide": "Esconder", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 96f9eac2b3..f21ce027f4 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -213,7 +213,6 @@ "empty_column.hashtag": "Acest hashtag încă nu a fost folosit.", "empty_column.home": "Nu există nimic în cronologia ta! Abonează-te la mai multe persoane pentru a o umple. {suggestions}", "empty_column.list": "Momentan nu există nimic în această listă. Când membrii ei vor posta ceva nou, vor apărea aici.", - "empty_column.lists": "Momentan nu ai nicio listă. Când vei crea una, va apărea aici.", "empty_column.mutes": "Momentan nu ai ignorat niciun utilizator.", "empty_column.notifications": "Momentan nu ai nicio notificare. Când alte persoane vor interacționa cu tine, îl vei vedea aici.", "empty_column.public": "Nu există nimic aici! Postează ceva public, sau abonează-te manual la utilizatori din alte servere pentru a umple cronologia", @@ -338,19 +337,11 @@ "limited_account_hint.action": "Afișează profilul oricum", "limited_account_hint.title": "Acest profil a fost ascuns de moderatorii domeniului {domain}.", "link_preview.author": "De {name}", - "lists.account.add": "Adaugă în listă", - "lists.account.remove": "Elimină din listă", "lists.delete": "Șterge lista", "lists.edit": "Modifică lista", - "lists.edit.submit": "Schimbă titlul", - "lists.new.create": "Adaugă o listă", - "lists.new.title_placeholder": "Titlu pentru noua listă", "lists.replies_policy.followed": "Tuturor persoanelor la care te-ai abonat", "lists.replies_policy.list": "Membrilor din listă", "lists.replies_policy.none": "Nu afișa nimănui", - "lists.replies_policy.title": "Afișează răspunsurile:", - "lists.search": "Caută printre persoanele la care ești abonat", - "lists.subheading": "Listele tale", "load_pending": "{count, plural, one {# element nou} other {# elemente noi}}", "moved_to_account_banner.text": "Contul tău {disabledAccount} este în acest moment dezactivat deoarece te-ai mutat la {movedToAccount}.", "navigation_bar.about": "Despre", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index e336e39e01..90af458cdc 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -291,7 +291,6 @@ "empty_column.hashtag": "С этим хэштегом пока ещё ничего не постили.", "empty_column.home": "Ваша лента совсем пуста! Подписывайтесь на других, чтобы заполнить её.", "empty_column.list": "В этом списке пока ничего нет.", - "empty_column.lists": "У вас ещё нет списков. Созданные вами списки будут показаны здесь.", "empty_column.mutes": "Вы ещё никого не добавляли в список игнорируемых.", "empty_column.notification_requests": "Здесь ничего нет! Когда вы получите новые уведомления, они здесь появятся согласно вашим настройкам.", "empty_column.notifications": "У вас пока нет уведомлений. Взаимодействуйте с другими, чтобы завести разговор.", @@ -464,20 +463,11 @@ "link_preview.author": "Автор: {name}", "link_preview.more_from_author": "Больше от {name}", "link_preview.shares": "{count, plural, one {{counter} пост} other {{counter} посты}}", - "lists.account.add": "Добавить в список", - "lists.account.remove": "Убрать из списка", "lists.delete": "Удалить список", "lists.edit": "Изменить список", - "lists.edit.submit": "Изменить название", - "lists.exclusive": "Скрыть эти сообщения из дома", - "lists.new.create": "Создать список", - "lists.new.title_placeholder": "Название для нового списка", "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 {# новый элемент} few {# новых элемента} other {# новых элементов}}", "loading_indicator.label": "Загрузка…", "media_gallery.hide": "Скрыть", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 2d48f688d5..a12bb6bde7 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -194,7 +194,6 @@ "empty_column.hashtag": "नाऽस्मिन् प्रचलितवस्तुचिह्ने किमपि ।", "empty_column.home": "गृहसमयतालिका रिक्ताऽस्ति । गम्यतां {public} वाऽन्वेषणैः प्रारभ्यतां मेलनं क्रियताञ्च ।", "empty_column.list": "न किमपि वर्तते सूच्यामस्याम् । यदा सूच्याः सदस्या नवपत्राणि प्रकटीकुर्वन्ति तदाऽत्राऽऽयान्ति ।", - "empty_column.lists": "तव पार्श्वे न कापि सूचिर्वर्तते। यदैकां सृजसि तदा अत्र दृश्यते।", "empty_column.mutes": "त्वया अद्यापि नैकोऽप्युपभोक्ता मूकीकृतो वर्तते।", "empty_column.notifications": "तव पार्श्वे न अधुना पर्यन्तं किमपि विज्ञापनं वर्तते। यदा अन्या जना त्वया संयोजयन्ति तदा इह पश्यसि।", "empty_column.public": "न इह किमपि वर्तते! किञ्चिल्लिख सार्वजनिकरूपेण, उत स्वयमन्यसर्वर्तः उपभोक्तॄननुसर एतत्पूरयितुम्", @@ -303,19 +302,11 @@ "lightbox.previous": "पूर्वः", "limited_account_hint.action": "प्रोफैलं दर्शय कथञ्चित्", "limited_account_hint.title": "{domain} इत्यस्य प्रशासकैरयं प्रोफैल्प्रच्छन्नः।", - "lists.account.add": "सूचेर्मध्ये योजय", - "lists.account.remove": "सूचेर्मार्जय", "lists.delete": "सूचिं मार्जय", "lists.edit": "सूचिं सम्पादय", - "lists.edit.submit": "उपाधिं परिवर्तय", - "lists.new.create": "सूचिं योजय", - "lists.new.title_placeholder": "नूतनसूच्युपाधिः", "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 {# नूतनवस्तु} other {# नूतनवस्तूनि}}", "moved_to_account_banner.text": "तव एकौण्ट् {disabledAccount} अधुना निष्कृतो यतोहि {movedToAccount} अस्मिन्त्वमसार्षीः।", "navigation_bar.about": "विषये", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 71bcaef7ab..19bdba818c 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -257,7 +257,6 @@ "empty_column.hashtag": "Ancora nudda in custa eticheta.", "empty_column.home": "Sa lìnia de tempus printzipale tua est bòida. Visita {public} o imprea sa chirca pro cumintzare e agatare àteras persones.", "empty_column.list": "Nudda ancora in custa lista. Cando is persones de custa lista ant a publicare, is publicatziones ant a aparèssere inoghe.", - "empty_column.lists": "Non tenes ancora peruna lista. Cando nd'as a creare una, at a èssere ammustrada inoghe.", "empty_column.mutes": "No as postu ancora nemos a sa muda.", "empty_column.notifications": "Non tenes ancora peruna notìfica. Chistiona cun una persone pro cumintzare un'arresonada.", "empty_column.public": "Nudda inoghe. Iscrie calicuna cosa pùblica, o sighi àteras persones de àteros serbidores pro prenare custu ispàtziu", @@ -392,20 +391,11 @@ "lightbox.previous": "Pretzedente", "limited_account_hint.title": "Custu profilu est istadu cuadu dae sa moderatzione de {domain}.", "link_preview.shares": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}", - "lists.account.add": "Agiunghe a sa lista", - "lists.account.remove": "Boga dae sa lista", "lists.delete": "Cantzella sa lista", "lists.edit": "Modìfica sa lista", - "lists.edit.submit": "Muda su tìtulu", - "lists.exclusive": "Cua custas publicatziones dae sa pàgina printzipale", - "lists.new.create": "Agiunghe lista", - "lists.new.title_placeholder": "Tìtulu de sa lista noa", "lists.replies_policy.followed": "Cale si siat persone chi sighis", "lists.replies_policy.list": "Persones de sa lista", "lists.replies_policy.none": "Nemos", - "lists.replies_policy.title": "Ammustra is rispostas a:", - "lists.search": "Chirca intre sa gente chi ses sighende", - "lists.subheading": "Is listas tuas", "load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}", "loading_indicator.label": "Carrighende…", "media_gallery.hide": "Cua", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index c14f1cc51a..196b4cdb08 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -185,7 +185,6 @@ "empty_column.hashtag": "There naethin in this hashtag yit.", "empty_column.home": "Yer hame timeline is toum! Follae mair fowk fir tae full it up. {suggestions}", "empty_column.list": "There naethin in this list yit. Whan memmers o this list publish new posts, ye'll see them here.", - "empty_column.lists": "Ye dinnae hae onie lists yit. Ance ye mak ane, it'll shaw up here.", "empty_column.mutes": "Ye'v no wheesht onie uisers yit.", "empty_column.notifications": "Ye dinnae hae onie notes yit. Whan ither fowk interacks wi ye, ye'll see it here.", "empty_column.public": "There naethin here! Scrieve socht public, or follae uisers fae ither servers fir tae full it up", @@ -288,19 +287,11 @@ "lightbox.previous": "Last ane", "limited_account_hint.action": "Shaw profile onieweys", "limited_account_hint.title": "This profile haes been planked bi the moderators o {domain}.", - "lists.account.add": "Add tae list", - "lists.account.remove": "Tak aff o the list", "lists.delete": "Delete list", "lists.edit": "Edit list", - "lists.edit.submit": "Chynge title", - "lists.new.create": "Add list", - "lists.new.title_placeholder": "New list title", "lists.replies_policy.followed": "Onie follaed uiser", "lists.replies_policy.list": "Memmers o the list", "lists.replies_policy.none": "Naebody", - "lists.replies_policy.title": "Shaw replies tae:", - "lists.search": "Seirch amang the fowk ye ken", - "lists.subheading": "Yer lists", "load_pending": "{count, plural, one {# new item} other {# new items}}", "moved_to_account_banner.text": "Yer accoont {disabledAccount} is disabilt the noo acause ye flittit tae {movedToAccount}.", "navigation_bar.about": "Aboot", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 93ce9dd7e2..dbf6a41f6f 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -166,7 +166,6 @@ "empty_column.favourited_statuses": "ඔබ සතුව ප්‍රියතම ලිපි කිසිවක් නැත. ඔබ යමකට ප්‍රිය කළ විට එය මෙහි පෙන්වනු ඇත.", "empty_column.follow_requests": "ඔබට තවමත් අනුගමන ඉල්ලීම් ලැබී නැත. ඉල්ලීමක් ලැබුණු විට, එය මෙහි පෙන්වනු ඇත.", "empty_column.home": "මුල් පිටුව හිස් ය! මෙය පිරවීමට බොහෝ පුද්ගලයින් අනුගමනය කරන්න.", - "empty_column.lists": "ඔබට තවමත් ලැයිස්තු කිසිවක් නැත. ඔබ එකක් සාදන විට, එය මෙහි පෙන්වනු ඇත.", "empty_column.mutes": "ඔබ තවමත් කිසිදු පරිශීලකයෙකු නිහඬ කර නැත.", "empty_column.notifications": "ඔබට දැනුම්දීම් ලැබී නැත. අන් අය සහ ඔබ අතර අන්‍යෝන්‍ය බලපවත්වන දෑ මෙහි දිස්වනු ඇත.", "error.unexpected_crash.explanation": "අපගේ කේතයේ දෝෂයක් හෝ බ්‍රවුසර ගැළපුම් ගැටලුවක් හේතුවෙන්, මෙම පිටුව නිවැරදිව ප්‍රදර්ශනය කළ නොහැක.", @@ -250,17 +249,10 @@ "lightbox.next": "ඊළඟ", "lightbox.previous": "පෙර", "limited_account_hint.action": "කෙසේ හෝ පැතිකඩ පෙන්වන්න", - "lists.account.add": "ලැයිස්තුවට දමන්න", - "lists.account.remove": "ලැයිස්තුවෙන් ඉවතලන්න", "lists.delete": "ලැයිස්තුව මකන්න", "lists.edit": "ලැයිස්තුව සංස්කරණය", - "lists.edit.submit": "සිරැසිය සංශෝධනය", - "lists.new.create": "එකතු", - "lists.new.title_placeholder": "නව ලැයිස්තුවේ සිරැසිය", "lists.replies_policy.list": "ලැයිස්තුවේ සාමාජිකයින්", "lists.replies_policy.none": "කිසිවෙක් නැත", - "lists.replies_policy.title": "පිළිතුරු පෙන්වන්න:", - "lists.subheading": "ඔබගේ ලැයිස්තු", "navigation_bar.about": "පිළිබඳව", "navigation_bar.blocks": "අවහිර කළ අය", "navigation_bar.bookmarks": "පොත්යොමු", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 1ecbaaffdd..d7e396c69b 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -269,7 +269,6 @@ "empty_column.hashtag": "Pod týmto hashtagom sa ešte nič nenachádza.", "empty_column.home": "Vaša domáca časová os je zatiaľ prázdna. Začnite sledovať ostatných a naplňte si ju.", "empty_column.list": "Tento zoznam je zatiaľ prázdny. Keď ale členovia tohoto zoznamu uverejnia nové príspevky, objavia sa tu.", - "empty_column.lists": "Zatiaľ nemáte žiadne zoznamy. Keď nejaký vytvoríte, zobrazí sa tu.", "empty_column.mutes": "Zatiaľ ste si nikoho nestíšili.", "empty_column.notification_requests": "Všetko čisté! Nič tu nieje. Keď dostaneš nové oboznámenia, zobrazia sa tu podľa tvojich nastavení.", "empty_column.notifications": "Zatiaľ nemáte žiadne upozornenia. Začnú vám pribúdať, keď s vami začnú interagovať ostatní.", @@ -428,20 +427,11 @@ "link_preview.author": "Autor: {name}", "link_preview.more_from_author": "Viac od {name}", "link_preview.shares": "{count, plural, one {{counter} príspevok} other {{counter} príspevkov}}", - "lists.account.add": "Pridať do zoznamu", - "lists.account.remove": "Odstrániť zo zoznamu", "lists.delete": "Vymazať zoznam", "lists.edit": "Upraviť zoznam", - "lists.edit.submit": "Zmeniť názov", - "lists.exclusive": "Skryť tieto príspevky z domovskej stránky", - "lists.new.create": "Pridať zoznam", - "lists.new.title_placeholder": "Názov nového zoznamu", "lists.replies_policy.followed": "Akémukoľvek sledovanému účtu", "lists.replies_policy.list": "Členom zoznamu", "lists.replies_policy.none": "Nikomu", - "lists.replies_policy.title": "Zobraziť odpovede:", - "lists.search": "Vyhľadávať medzi účtami, ktoré sledujete", - "lists.subheading": "Vaše zoznamy", "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položiek} other {# nových položiek}}", "loading_indicator.label": "Načítavanie…", "media_gallery.hide": "Skryť", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 3690c612b7..84141a779d 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -85,9 +85,14 @@ "alert.rate_limited.title": "Hitrost omejena", "alert.unexpected.message": "Zgodila se je nepričakovana napaka.", "alert.unexpected.title": "Ojoj!", + "alt_text_badge.title": "Nadomestno besedilo", "announcement.announcement": "Obvestilo", + "annual_report.summary.followers.followers": "sledilcev", + "annual_report.summary.followers.total": "", + "annual_report.summary.highlighted_post.by_favourites": "- najpriljubljenejša objava", "annual_report.summary.most_used_hashtag.none": "Brez", "annual_report.summary.new_posts.new_posts": "nove objave", + "annual_report.summary.thanks": "Hvala, ker ste del Mastodona!", "attachments_list.unprocessed": "(neobdelano)", "audio.hide": "Skrij zvok", "block_modal.remote_users_caveat": "Od strežnika {domain} bomo zahtevali, da spoštuje vašo odločitev. Izpolnjevanje zahteve ni zagotovljeno, ker nekateri strežniki blokiranja obravnavajo drugače. Javne objave bodo morda še vedno vidne neprijavljenim uporabnikom.", @@ -99,6 +104,8 @@ "block_modal.title": "Blokiraj uporabnika?", "block_modal.you_wont_see_mentions": "Objav, ki jih omenjajo, ne boste videli.", "boost_modal.combo": "Če želite preskočiti to, lahko pritisnete {combo}", + "boost_modal.reblog": "Izpostavi objavo?", + "boost_modal.undo_reblog": "Ali želite preklicati izpostavitev objave?", "bundle_column_error.copy_stacktrace": "Kopiraj poročilo o napaki", "bundle_column_error.error.body": "Zahtevane strani ni mogoče upodobiti. Vzrok težave je morda hrošč v naši kodi ali pa nezdružljivost z brskalnikom.", "bundle_column_error.error.title": "Oh, ne!", @@ -120,13 +127,16 @@ "column.blocks": "Blokirani uporabniki", "column.bookmarks": "Zaznamki", "column.community": "Krajevna časovnica", + "column.create_list": "Ustvari seznam", "column.direct": "Zasebne omembe", "column.directory": "Prebrskaj profile", "column.domain_blocks": "Blokirane domene", + "column.edit_list": "Uredi seznam", "column.favourites": "Priljubljeni", "column.firehose": "Viri v živo", "column.follow_requests": "Sledi prošnjam", "column.home": "Domov", + "column.list_members": "Upravljaj člane seznama", "column.lists": "Seznami", "column.mutes": "Utišani uporabniki", "column.notifications": "Obvestila", @@ -157,6 +167,7 @@ "compose_form.poll.duration": "Trajanje ankete", "compose_form.poll.multiple": "Več možnosti", "compose_form.poll.option_placeholder": "Možnost {number}", + "compose_form.poll.single": "Ena izbira", "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.poll.type": "Slog", @@ -193,6 +204,9 @@ "confirmations.unfollow.confirm": "Ne sledi več", "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?", "confirmations.unfollow.title": "Želite nehati spremljati uporabnika?", + "content_warning.hide": "Skrij objavo", + "content_warning.show": "Vseeno pokaži", + "content_warning.show_more": "Pokaži več", "conversation.delete": "Izbriši pogovor", "conversation.mark_as_read": "Označi kot prebrano", "conversation.open": "Pokaži pogovor", @@ -266,7 +280,6 @@ "empty_column.hashtag": "V tem ključniku še ni nič.", "empty_column.home": "Vaša domača časovnica je prazna! Sledite več osebam, da jo zapolnite. {suggestions}", "empty_column.list": "Na tem seznamu ni ničesar. Ko bodo člani tega seznama objavili nove statuse, se bodo pojavili tukaj.", - "empty_column.lists": "Nimate seznamov. Ko ga boste ustvarili, se bo prikazal tukaj.", "empty_column.mutes": "Niste utišali še nobenega uporabnika.", "empty_column.notification_requests": "Vse prebrano! Tu ni ničesar več. Ko prejmete nova obvestila, se bodo pojavila tu glede na vaše nastavitve.", "empty_column.notifications": "Nimate še nobenih obvestil. Povežite se z drugimi, da začnete pogovor.", @@ -348,7 +361,10 @@ "hashtag.unfollow": "Nehaj slediti ključniku", "hashtags.and_other": "…in še {count, plural, other {#}}", "hints.profiles.posts_may_be_missing": "Nekatere objave s tega profila morda manjkajo.", + "hints.profiles.see_more_followers": "Pokaži več sledilcev na {domain}", + "hints.profiles.see_more_posts": "Pokaži več objav na {domain}", "hints.threads.replies_may_be_missing": "Odgovori z drugih strežnikov morda manjkajo.", + "hints.threads.see_more": "Pokaži več odgovorov na {domain}", "home.column_settings.show_reblogs": "Pokaži izpostavitve", "home.column_settings.show_replies": "Pokaži odgovore", "home.hide_announcements": "Skrij obvestila", @@ -419,20 +435,25 @@ "link_preview.author": "Avtor_ica {name}", "link_preview.more_from_author": "Več od {name}", "link_preview.shares": "{count, plural, one {{counter} objava} two {{counter} objavi} few {{counter} objave} other {{counter} objav}}", - "lists.account.add": "Dodaj na seznam", - "lists.account.remove": "Odstrani s seznama", + "lists.add_member": "Dodaj", + "lists.add_to_list": "Dodaj na seznam", + "lists.create": "Ustvari", + "lists.create_list": "Ustvari seznam", "lists.delete": "Izbriši seznam", + "lists.done": "Opravljeno", "lists.edit": "Uredi seznam", - "lists.edit.submit": "Spremeni naslov", - "lists.exclusive": "Skrij te objave od doma", - "lists.new.create": "Dodaj seznam", - "lists.new.title_placeholder": "Nov naslov seznama", + "lists.find_users_to_add": "Poišči člane za dodajanje", + "lists.list_name": "Ime seznama", + "lists.new_list_name": "Novo ime seznama", + "lists.no_lists_yet": "Ni seznamov.", + "lists.no_members_yet": "Ni še nobenega člana.", + "lists.no_results_found": "Ni rezultatov.", + "lists.remove_member": "Odstrani", "lists.replies_policy.followed": "Vsem sledenim uporabnikom", "lists.replies_policy.list": "Članom seznama", "lists.replies_policy.none": "Nikomur", - "lists.replies_policy.title": "Pokaži odgovore:", - "lists.search": "Iščite med ljudmi, katerim sledite", - "lists.subheading": "Vaši seznami", + "lists.save": "Shrani", + "lists.search_placeholder": "Iščite ljudi, katerim sledite", "load_pending": "{count, plural, one {# nov element} two {# nova elementa} few {# novi elementi} other {# novih elementov}}", "loading_indicator.label": "Nalaganje …", "media_gallery.hide": "Skrij", @@ -464,6 +485,7 @@ "navigation_bar.follows_and_followers": "Sledenja in sledilci", "navigation_bar.lists": "Seznami", "navigation_bar.logout": "Odjava", + "navigation_bar.moderation": "Moderiranje", "navigation_bar.mutes": "Utišani uporabniki", "navigation_bar.opened_in_classic_interface": "Objave, računi in druge specifične strani se privzeto odprejo v klasičnem spletnem vmesniku.", "navigation_bar.personal": "Osebno", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index d1d92c69f6..c2781a2b6a 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -135,13 +135,16 @@ "column.blocks": "Përdorues të bllokuar", "column.bookmarks": "Faqerojtës", "column.community": "Rrjedhë kohore vendore", + "column.create_list": "Krijo listë", "column.direct": "Përmendje private", "column.directory": "Shfletoni profile", "column.domain_blocks": "Përkatësi të bllokuara", + "column.edit_list": "Përpunoni listën", "column.favourites": "Të parapëlqyer", "column.firehose": "Prurje “live”", "column.follow_requests": "Kërkesa për ndjekje", "column.home": "Kreu", + "column.list_members": "Administroni anëtarë liste", "column.lists": "Lista", "column.mutes": "Përdorues të heshtuar", "column.notifications": "Njoftime", @@ -287,7 +290,6 @@ "empty_column.hashtag": "Ende s’ka gjë nën këtë hashtag.", "empty_column.home": "Rrjedha juaj kohore është e zbrazët! Vizitoni {public} ose përdorni kërkimin që t’ia filloni dhe të takoni përdorues të tjerë.", "empty_column.list": "Në këtë listë ende s’ka gjë. Kur anëtarë të kësaj liste postojnë gjendje të reja, ato do të shfaqen këtu.", - "empty_column.lists": "Ende s’keni ndonjë listë. Kur të krijoni një të tillë, do të duket këtu.", "empty_column.mutes": "S’keni heshtuar ende ndonjë përdorues.", "empty_column.notification_requests": "Gjithçka si duhet! S’ka ç’bëhet këtu. Kur merrni njoftime të reja, do të shfaqen këtu, në përputhje me rregullimet tuaja.", "empty_column.notifications": "Ende s’keni ndonjë njoftim. Ndërveproni me të tjerët që të nisë biseda.", @@ -460,20 +462,32 @@ "link_preview.author": "Nga {name}", "link_preview.more_from_author": "Më tepër nga {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} postime}}", - "lists.account.add": "Shto në listë", - "lists.account.remove": "Hiqe nga lista", + "lists.add_member": "Shtoje", + "lists.add_to_list": "Shto në listë", + "lists.add_to_lists": "Shtoje {name} në lista", + "lists.create": "Krijoje", + "lists.create_a_list_to_organize": "Krijoni një listë të re të sistemoni prurjen tuaj Kreu", + "lists.create_list": "Krijo listë", "lists.delete": "Fshije listën", + "lists.done": "U bë", "lists.edit": "Përpunoni listën", - "lists.edit.submit": "Ndryshoni titullin", - "lists.exclusive": "Fshihi këto postime prej kreut", - "lists.new.create": "Shtoni listë", - "lists.new.title_placeholder": "Titull liste të re", + "lists.exclusive": "Fshihni anëtarët në Krye", + "lists.exclusive_hint": "Nëse dikush gjendje në këtë listë, fshihini ata te prurja juaj e Kreut, që të shmangni parjen dy herë të postimeve të tyre.", + "lists.find_users_to_add": "Gjeni përdorues për t’i shtuar", + "lists.list_members": "Shfaq anëtarë", + "lists.list_members_count": "{count, plural, one {# anëtar} other {# anëtarë}}", + "lists.list_name": "Emër liste", + "lists.new_list_name": "Emër liste të re", + "lists.no_lists_yet": "Ende pa lista.", + "lists.no_members_yet": "Ende pa anëtarë.", + "lists.no_results_found": "S’u gjetën përfundime.", + "lists.remove_member": "Hiqe", "lists.replies_policy.followed": "Cilido përdorues i ndjekur", "lists.replies_policy.list": "Anëtarë të listës", "lists.replies_policy.none": "Askush", - "lists.replies_policy.title": "Shfaq përgjigje për:", - "lists.search": "Kërkoni mes personash që ndiqni", - "lists.subheading": "Listat tuaja", + "lists.save": "Ruaje", + "lists.search_placeholder": "Kërkoni persona që ndiqni", + "lists.show_replies_to": "Përfshi përgjigje nga anëtarë liste te", "load_pending": "{count, plural,one {# objekt i ri }other {# objekte të rinj }}", "loading_indicator.label": "Po ngarkohet…", "media_gallery.hide": "Fshihe", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 4a33c2f5ca..5a587f2666 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -256,7 +256,6 @@ "empty_column.hashtag": "Još uvek nema ničega u ovoj heš oznaci.", "empty_column.home": "Vaša početna vremenska linija je prazna! Pratite više ljudi da biste je popunili.", "empty_column.list": "U ovoj listi još nema ničega. Kada članovi ove liste objave nešto novo, pojaviće se ovde.", - "empty_column.lists": "Još uvek nemate nijednu listu. Kada napravite jednu, ona će se pojaviti ovde.", "empty_column.mutes": "Još uvek ne ignorišete nijednog korisnika.", "empty_column.notification_requests": "Sve je čisto! Ovde nema ničega. Kada dobijete nova obaveštenja, ona će se pojaviti ovde u skladu sa vašim podešavanjima.", "empty_column.notifications": "Još uvek nemate nikakva obaveštenja. Kada drugi ljudi budu u interakciji sa vama, videćete to ovde.", @@ -404,20 +403,11 @@ "link_preview.author": "Po {name}", "link_preview.more_from_author": "Više od {name}", "link_preview.shares": "{count, plural, one {{counter} objava} few {{counter} objave} other {{counter} objava}}", - "lists.account.add": "Dodaj na listu", - "lists.account.remove": "Ukloni sa liste", "lists.delete": "Izbriši listu", "lists.edit": "Uredi listu", - "lists.edit.submit": "Promeni naslov", - "lists.exclusive": "Sakrijte ove objave sa početne stranice", - "lists.new.create": "Dodaj listu", - "lists.new.title_placeholder": "Naslov nove liste", "lists.replies_policy.followed": "Svakom praćenom korisniku", "lists.replies_policy.list": "Članovima liste", "lists.replies_policy.none": "Nikome", - "lists.replies_policy.title": "Prikaži odgovore:", - "lists.search": "Pretraži među ljudima koje pratite", - "lists.subheading": "Vaše liste", "load_pending": "{count, plural, one {# nova stavka} few {# nove stavke} other {# novih stavki}}", "loading_indicator.label": "Učitavanje…", "moved_to_account_banner.text": "Vaš nalog {disabledAccount} je trenutno onemogućen jer ste prešli na {movedToAccount}.", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index d80411859e..ea92a3bf10 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -256,7 +256,6 @@ "empty_column.hashtag": "Још увек нема ничега у овој хеш ознаци.", "empty_column.home": "Ваша почетна временска линија је празна! Пратите више људи да бисте је попунили.", "empty_column.list": "У овој листи још нема ничега. Када чланови ове листе објаве нешто ново, појавиће се овде.", - "empty_column.lists": "Још увек немате ниједну листу. Када направите једну, она ће се појавити овде.", "empty_column.mutes": "Још увек не игноришете ниједног корисника.", "empty_column.notification_requests": "Све је чисто! Овде нема ничега. Када добијете нова обавештења, она ће се појавити овде у складу са вашим подешавањима.", "empty_column.notifications": "Још увек немате никаква обавештења. Када други људи буду у интеракцији са вама, видећете то овде.", @@ -404,20 +403,11 @@ "link_preview.author": "По {name}", "link_preview.more_from_author": "Више од {name}", "link_preview.shares": "{count, plural, one {{counter} објава} few {{counter} објаве} other {{counter} објава}}", - "lists.account.add": "Додај на листу", - "lists.account.remove": "Уклони са листе", "lists.delete": "Избриши листу", "lists.edit": "Уреди листу", - "lists.edit.submit": "Промени наслов", - "lists.exclusive": "Сакријте ове објаве са почетне странице", - "lists.new.create": "Додај листу", - "lists.new.title_placeholder": "Наслов нове листе", "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 {# нова ставка} few {# нове ставке} other {# нових ставки}}", "loading_indicator.label": "Учитавање…", "moved_to_account_banner.text": "Ваш налог {disabledAccount} је тренутно онемогућен јер сте прешли на {movedToAccount}.", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index df24db9634..0fb714d9a7 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -292,7 +292,6 @@ "empty_column.hashtag": "Det finns inget i denna hashtag ännu.", "empty_column.home": "Din hemma-tidslinje är tom! Följ fler användare för att fylla den.", "empty_column.list": "Det finns inget i denna lista än. När listmedlemmar publicerar nya inlägg kommer de synas här.", - "empty_column.lists": "Du har inga listor än. När skapar en kommer den dyka upp här.", "empty_column.mutes": "Du har ännu inte tystat några användare.", "empty_column.notification_requests": "Allt klart! Det finns inget mer här. När du får nya meddelanden visas de här enligt dina inställningar.", "empty_column.notifications": "Du har inga meddelanden än. Interagera med andra för att starta konversationen.", @@ -465,20 +464,11 @@ "link_preview.author": "Av {name}", "link_preview.more_from_author": "Mer från {name}", "link_preview.shares": "{count, plural, one {{counter} inlägg} other {{counter} inlägg}}", - "lists.account.add": "Lägg till i lista", - "lists.account.remove": "Ta bort från lista", "lists.delete": "Radera lista", "lists.edit": "Redigera lista", - "lists.edit.submit": "Ändra titel", - "lists.exclusive": "Dölj dessa inlägg från hemflödet", - "lists.new.create": "Lägg till lista", - "lists.new.title_placeholder": "Ny listrubrik", "lists.replies_policy.followed": "Alla användare som följs", "lists.replies_policy.list": "Medlemmar i listan", "lists.replies_policy.none": "Ingen", - "lists.replies_policy.title": "Visa svar till:", - "lists.search": "Sök bland personer du följer", - "lists.subheading": "Dina listor", "load_pending": "{count, plural, one {# nytt objekt} other {# nya objekt}}", "loading_indicator.label": "Laddar…", "media_gallery.hide": "Dölj", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 87d6660f05..1465fcb51f 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -174,7 +174,6 @@ "empty_column.hashtag": "இந்த சிட்டையில் இதுவரை ஏதும் இல்லை.", "empty_column.home": "உங்கள் மாஸ்டடான் வீட்டில் யாரும் இல்லை. {public} -இல் சென்று பார்க்கவும், அல்லது தேடல் கருவியைப் பயன்படுத்திப் பிற பயனர்களைக் கண்டடையவும்.", "empty_column.list": "இந்தப் பட்டியலில் இதுவரை ஏதும் இல்லை. இப்பட்டியலின் உறுப்பினர்கள் புதிய டூட்டுகளை இட்டால். அவை இங்கே காண்பிக்கப்படும்.", - "empty_column.lists": "இதுவரை நீங்கள் எந்தப் பட்டியலையும் உருவாக்கவில்லை. உருவாக்கினால், அது இங்கே காண்பிக்கப்படும்.", "empty_column.mutes": "நீங்கள் இதுவரை எந்தப் பயனர்களையும் முடக்கியிருக்கவில்லை.", "empty_column.notifications": "உங்களுக்காக எந்த அறிவிப்புகளும் இல்லை. உரையாடலைத் துவங்க பிறரைத் தொடர்புகொள்ளவும்.", "empty_column.public": "இங்கு எதுவும் இல்லை! இவ்விடத்தை நிரப்ப எதையேனும் எழுதவும், அல்லது வேறு சர்வர்களில் உள்ள பயனர்களைப் பின்தொடரவும்", @@ -242,15 +241,8 @@ "lightbox.close": "நெருக்கமாக", "lightbox.next": "அடுத்த", "lightbox.previous": "சென்ற", - "lists.account.add": "பட்டியலில் சேர்", - "lists.account.remove": "பட்டியலில் இருந்து அகற்று", "lists.delete": "பட்டியலை நீக்கு", "lists.edit": "பட்டியலை திருத்து", - "lists.edit.submit": "தலைப்பு மாற்றவும்", - "lists.new.create": "பட்டியலில் சேர்", - "lists.new.title_placeholder": "புதிய பட்டியல் தலைப்பு", - "lists.search": "நீங்கள் பின்தொடரும் நபர்கள் மத்தியில் தேடுதல்", - "lists.subheading": "உங்கள் பட்டியல்கள்", "load_pending": "{count, plural,one {# புதியது}other {# புதியவை}}", "navigation_bar.blocks": "தடுக்கப்பட்ட பயனர்கள்", "navigation_bar.bookmarks": "அடையாளக்குறிகள்", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 40fbd7f7bd..d58a691635 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -106,7 +106,6 @@ "empty_column.hashtag": "ఇంకా హాష్ ట్యాగ్లో ఏమీ లేదు.", "empty_column.home": "మీ హోమ్ కాలక్రమం ఖాళీగా ఉంది! {Public} ను సందర్శించండి లేదా ఇతర వినియోగదారులను కలుసుకోవడానికి మరియు అన్వేషణ కోసం శోధనను ఉపయోగించండి.", "empty_column.list": "ఇంకా ఈ జాబితాలో ఏదీ లేదు. ఈ జాబితాలోని సభ్యులు కొత్త స్టేటస్ లను పోస్ట్ చేసినప్పుడు, అవి ఇక్కడ కనిపిస్తాయి.", - "empty_column.lists": "మీకు ఇంకా జాబితాలు ఏమీ లేవు. మీరు ఒకటి సృష్టించగానే, అది ఇక్కడ కనబడుతుంది.", "empty_column.mutes": "మీరు ఇంకా ఏ వినియోగదారులనూ మ్యూట్ చేయలేదు.", "empty_column.notifications": "మీకు ఇంకా ఏ నోటిఫికేషన్లు లేవు. సంభాషణను ప్రారంభించడానికి ఇతరులతో ప్రతిస్పందించండి.", "empty_column.public": "ఇక్కడ ఏమీ లేదు! దీన్ని నింపడానికి బహిరంగంగా ఏదైనా వ్రాయండి, లేదా ఇతర సేవికల నుండి వినియోగదారులను అనుసరించండి", @@ -158,15 +157,8 @@ "lightbox.close": "మూసివేయు", "lightbox.next": "తరువాత", "lightbox.previous": "మునుపటి", - "lists.account.add": "జాబితాకు జోడించు", - "lists.account.remove": "జాబితా నుండి తొలగించు", "lists.delete": "జాబితాను తొలగించు", "lists.edit": "జాబితాను సవరించు", - "lists.edit.submit": "శీర్షిక మార్చు", - "lists.new.create": "జాబితాను జోడించు", - "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక", - "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి", - "lists.subheading": "మీ జాబితాలు", "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", "navigation_bar.community_timeline": "స్థానిక కాలక్రమం", "navigation_bar.compose": "కొత్త టూట్ను రాయండి", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 95e3e1e52b..b9fe9cf33b 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -280,7 +280,6 @@ "empty_column.hashtag": "ยังไม่มีสิ่งใดในแฮชแท็กนี้", "empty_column.home": "เส้นเวลาหน้าแรกของคุณว่างเปล่า! ติดตามผู้คนเพิ่มเติมเพื่อเติมเส้นเวลาให้เต็ม", "empty_column.list": "ยังไม่มีสิ่งใดในรายการนี้ เมื่อสมาชิกของรายการนี้โพสต์โพสต์ใหม่ โพสต์จะปรากฏที่นี่", - "empty_column.lists": "คุณยังไม่มีรายการใด ๆ เมื่อคุณสร้างรายการ รายการจะปรากฏที่นี่", "empty_column.mutes": "คุณยังไม่ได้ซ่อนผู้ใช้ใด ๆ", "empty_column.notification_requests": "โล่งทั้งหมด! ไม่มีสิ่งใดที่นี่ เมื่อคุณได้รับการแจ้งเตือนใหม่ การแจ้งเตือนจะปรากฏที่นี่ตามการตั้งค่าของคุณ", "empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ เมื่อผู้คนอื่น ๆ โต้ตอบกับคุณ คุณจะเห็นการแจ้งเตือนที่นี่", @@ -453,20 +452,11 @@ "link_preview.author": "โดย {name}", "link_preview.more_from_author": "เพิ่มเติมจาก {name}", "link_preview.shares": "{count, plural, other {{counter} โพสต์}}", - "lists.account.add": "เพิ่มไปยังรายการ", - "lists.account.remove": "เอาออกจากรายการ", "lists.delete": "ลบรายการ", "lists.edit": "แก้ไขรายการ", - "lists.edit.submit": "เปลี่ยนชื่อเรื่อง", - "lists.exclusive": "ซ่อนโพสต์เหล่านี้จากหน้าแรก", - "lists.new.create": "เพิ่มรายการ", - "lists.new.title_placeholder": "ชื่อเรื่องรายการใหม่", "lists.replies_policy.followed": "ผู้ใช้ใด ๆ ที่ติดตาม", "lists.replies_policy.list": "สมาชิกของรายการ", "lists.replies_policy.none": "ไม่มีใคร", - "lists.replies_policy.title": "แสดงการตอบกลับแก่:", - "lists.search": "ค้นหาในหมู่ผู้คนที่คุณติดตาม", - "lists.subheading": "รายการของคุณ", "load_pending": "{count, plural, other {# รายการใหม่}}", "loading_indicator.label": "กำลังโหลด…", "media_gallery.hide": "ซ่อน", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 2cf7f1929a..d526c271c6 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -191,7 +191,6 @@ "empty_column.hashtag": "ala li lon toki ni", "empty_column.home": "ala a li lon lipu open sina! sina wile lon e ijo lon ni la o kute e jan pi toki suli.", "empty_column.list": "ala li lon kulupu lipu ni. jan pi kulupu lipu ni li toki sin la toki ni li lon ni.", - "empty_column.lists": "sina jo ala e kulupu lipu. sina pali sin e kulupu lipu la ona li lon ni.", "empty_column.mutes": "jan ala li len tawa sina.", "error.unexpected_crash.explanation": "ilo li ken ala pana e lipu ni. ni li ken tan pakala mi tan pakala pi ilo sina.", "errors.unexpected_crash.report_issue": "o toki e pakala tawa lawa", @@ -253,17 +252,11 @@ "lightbox.next": "sinpin", "lightbox.previous": "monsi", "link_preview.author": "tan {name}", - "lists.account.add": "o pana tawa kulupu lipu", - "lists.account.remove": "o weka tan kulupu lipu", "lists.delete": "o weka e kulupu lipu", "lists.edit": "o ante e kulupu lipu", - "lists.edit.submit": "o ante e nimi", - "lists.exclusive": "o len e toki lon lipu open", - "lists.new.create": "o sin e kulupu lipu", "lists.replies_policy.followed": "jan kute ale", "lists.replies_policy.list": "jan pi kulupu ni taso", "lists.replies_policy.none": "jan ala", - "lists.subheading": "kulupu lipu sina", "load_pending": "{count, plural, other {ijo sin #}}", "loading_indicator.label": "ni li kama…", "mute_modal.title": "sina wile ala wile kute e jan ni?", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 061f9c6c28..7851da5ecb 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -140,13 +140,16 @@ "column.blocks": "Engellenen kullanıcılar", "column.bookmarks": "Yer İşaretleri", "column.community": "Yerel ağ akışı", + "column.create_list": "Liste oluştur", "column.direct": "Özel değinmeler", "column.directory": "Profillere göz at", "column.domain_blocks": "Engellenen alan adları", + "column.edit_list": "Listeyi düzenle", "column.favourites": "Gözdelerin", "column.firehose": "Anlık Akışlar", "column.follow_requests": "Takip istekleri", "column.home": "Anasayfa", + "column.list_members": "Liste üyelerini yönet", "column.lists": "Listeler", "column.mutes": "Sessize alınmış kullanıcılar", "column.notifications": "Bildirimler", @@ -292,7 +295,6 @@ "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 ediniz.", "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.notification_requests": "Hepsi tamam! Burada yeni bir şey yok. Yeni bildirim aldığınızda, ayarlarınıza göre burada görüntülenecekler.", "empty_column.notifications": "Henüz bildiriminiz yok. Sohbete başlamak için başkalarıyla etkileşim kurun.", @@ -465,20 +467,31 @@ "link_preview.author": "Yazar: {name}", "link_preview.more_from_author": "{name} kişisinden daha fazlası", "link_preview.shares": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}", - "lists.account.add": "Listeye ekle", - "lists.account.remove": "Listeden kaldır", + "lists.add_member": "Ekle", + "lists.add_to_list": "Listeye ekle", + "lists.add_to_lists": "{name} kişisini listelere ekle", + "lists.create": "Oluştur", + "lists.create_a_list_to_organize": "Anasayfa akışınızı düzenlemek için yeni bir liste oluşturun", + "lists.create_list": "Liste oluştur", "lists.delete": "Listeyi sil", + "lists.done": "Tamamlandı", "lists.edit": "Listeleri düzenle", - "lists.edit.submit": "Başlığı değiştir", - "lists.exclusive": "Bu gönderileri Anasayfadan gizle", - "lists.new.create": "Liste ekle", - "lists.new.title_placeholder": "Yeni liste başlığı", + "lists.exclusive": "Anasayfada üyeleri gizle", + "lists.exclusive_hint": "Birisi bu listede yer alıyorsa, gönderilerini iki kez görmekten kaçınmak için onu anasayfa akışınızda gizleyin.", + "lists.find_users_to_add": "Eklenecek kullanıcıları bul", + "lists.list_members": "Liste üyeleri", + "lists.list_members_count": "{count, plural, one {# üye} other {# üye}}", + "lists.list_name": "Liste adı", + "lists.new_list_name": "Yeni liste adı", + "lists.no_lists_yet": "Henüz liste yok.", + "lists.no_members_yet": "Henüz üye yok.", + "lists.no_results_found": "Sonuç bulunamadı.", + "lists.remove_member": "Kaldır", "lists.replies_policy.followed": "Takip edilen herhangi bir kullanıcı", "lists.replies_policy.list": "Listenin üyeleri", "lists.replies_policy.none": "Hiç kimse", - "lists.replies_policy.title": "Yanıtları göster:", - "lists.search": "Takip ettiğiniz kişiler arasından arayın", - "lists.subheading": "Listeleriniz", + "lists.save": "Kaydet", + "lists.search_placeholder": "Takip ettiğiniz kişilerde arama yapın", "load_pending": "{count, plural, one {# yeni öğe} other {# yeni öğe}}", "loading_indicator.label": "Yükleniyor…", "media_gallery.hide": "Gizle", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 08bb7979a1..07b9decc10 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -275,16 +275,10 @@ "lightbox.previous": "Алдагы", "limited_account_hint.action": "Барыбер профильне күрсәтергә", "limited_account_hint.title": "Бу профильне модераторлар яшергән {domain}.", - "lists.account.add": "Исемлеккә өстәргә", - "lists.account.remove": "Исемлектән бетерергә", "lists.delete": "Исемлекне бетерегез", "lists.edit": "Исемлекне үзгәртү", - "lists.edit.submit": "Исемен үзгәртү", - "lists.new.create": "Исемлек өстәгез", - "lists.new.title_placeholder": "Яңа исемлек башламы", "lists.replies_policy.list": "Исемлек әгъзалары", "lists.replies_policy.none": "Һичкем", - "lists.subheading": "Исемлегегегезләр", "load_pending": "{count, plural, one {# яңа элемент} other {# яңа элемент}}", "navigation_bar.about": "Проект турында", "navigation_bar.blocks": "Блокланган кулланучылар", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 0e0906eb37..a88c588350 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -140,9 +140,11 @@ "column.blocks": "Заблоковані користувачі", "column.bookmarks": "Закладки", "column.community": "Локальна стрічка", + "column.create_list": "Створити список", "column.direct": "Особисті згадки", "column.directory": "Переглянути профілі", "column.domain_blocks": "Заблоковані домени", + "column.edit_list": "Редагувати список", "column.favourites": "Уподобане", "column.firehose": "Стрічка новин", "column.follow_requests": "Запити на підписку", @@ -292,7 +294,6 @@ "empty_column.hashtag": "Дописів з цим гештеґом поки не існує.", "empty_column.home": "Ваша стрічка порожня! Підпишіться на інших, щоб її заповнити.", "empty_column.list": "Цей список порожній. Коли його учасники додадуть нові дописи, вони з'являться тут.", - "empty_column.lists": "У вас ще немає списків. Коли ви їх створите, вони з'являться тут.", "empty_column.mutes": "Ви ще не приховали жодного користувача.", "empty_column.notification_requests": "Усе чисто! Тут нічого немає. Коли ви отримаєте нові сповіщення, вони з'являться тут відповідно до ваших налаштувань.", "empty_column.notifications": "У вас ще немає сповіщень. Коли інші люди почнуть взаємодіяти з вами, ви побачите їх тут.", @@ -465,20 +466,11 @@ "link_preview.author": "Від {name}", "link_preview.more_from_author": "Більше від {name}", "link_preview.shares": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}}", - "lists.account.add": "Додати до списку", - "lists.account.remove": "Вилучити зі списку", "lists.delete": "Видалити список", "lists.edit": "Редагувати список", - "lists.edit.submit": "Змінити назву", - "lists.exclusive": "Сховати ці дописи з домашньої сторінки", - "lists.new.create": "Додати список", - "lists.new.title_placeholder": "Нова назва списку", "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 {# новий елемент} other {# нових елементів}}", "loading_indicator.label": "Завантаження…", "media_gallery.hide": "Сховати", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index cb5dfa63cd..476b8c2afb 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -162,7 +162,6 @@ "empty_column.hashtag": "ابھی یہ ہیش ٹیگ خالی ہے.", "empty_column.home": "آپ کا خانگی جدول خالی ہے! {public} دیکھیں یا شروعات کیلئے تلاش کریں اور دیگر صارفین سے ملیں.", "empty_column.list": "یہ فہرست ابھی خالی ہے. جب اس فہرست کے ارکان کچھ تحریر کریں گے، یہاں نظر آئے گا.", - "empty_column.lists": "ابھی آپ کی کوئی فہرست نہیں ہے. جب آپ بنائیں گے، وہ یہاں نظر آئے گی.", "empty_column.mutes": "آپ نے ابھی کسی صارف کو خاموش نہیں کیا ہے.", "empty_column.notifications": "ابھی آپ کیلئے کوئی اطلاعات نہیں ہیں. گفتگو شروع کرنے کے لئے دیگر صارفین سے متعامل ہوں.", "empty_column.public": "یہاں کچھ بھی نہیں ہے! کچھ عمومی تحریر کریں یا اس جگہ کو پُر کرنے کے لئے از خود دیگر سرورس کے صارفین کی پیروی کریں", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index 6dae368ffc..dd67fc6c81 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -187,7 +187,6 @@ "empty_column.hashtag": "Ushbu hashtagda hali hech narsa yo'q.", "empty_column.home": "Bosh sahifa yilnomangiz boʻsh! Uni to'ldirish uchun ko'proq odamlarni kuzatib boring. {suggestions}", "empty_column.list": "Bu ro'yxatda hali hech narsa yo'q. Ushbu roʻyxat aʼzolari yangi xabarlarni nashr qilganda, ular shu yerda paydo boʻladi.", - "empty_column.lists": "Sizda hali hech qanday roʻyxat yoʻq. Uni yaratganingizda, u shu yerda paydo bo'ladi.", "empty_column.mutes": "Siz hali hech bir foydalanuvchining ovozini o‘chirmagansiz.", "empty_column.notifications": "Sizda hali hech qanday bildirishnoma yo‘q. Boshqa odamlar siz bilan muloqot qilganda, buni shu yerda ko'rasiz.", "empty_column.public": "Bu erda hech narsa yo'q! Biror narsani ochiq yozing yoki uni toʻldirish uchun boshqa serverlardagi foydalanuvchilarni qoʻlda kuzatib boring", @@ -288,16 +287,10 @@ "keyboard_shortcuts.up": "Roʻyxatda yuqoriga koʻtarish", "lightbox.close": "Yopish", "limited_account_hint.action": "Baribir profilni ko'rsatish", - "lists.account.add": "Ro‘yxatga qo‘shish", - "lists.account.remove": "Roʻyxatdan o'chirish", "lists.delete": "Roʻyxatni o'chirish", "lists.edit": "Roʻyxatni tahrirlash", - "lists.new.create": "Ro‘yxatga qo‘shish", "lists.replies_policy.list": "Ro'yxat a'zolari", "lists.replies_policy.none": "Hech kim", - "lists.replies_policy.title": "Javoblarni ko'rsatish:", - "lists.search": "Siz kuzatadigan odamlar orasidan qidiring", - "lists.subheading": "Sizning ro'yxatlaringiz", "load_pending": "{count, plural, one {# yangi element} other {# yangi elementlar}}", "moved_to_account_banner.text": "{movedToAccount} hisobiga koʻchganingiz uchun {disabledAccount} hisobingiz hozirda oʻchirib qoʻyilgan.", "navigation_bar.about": "Haqida", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 73016ed8c9..4ba36e0545 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -140,13 +140,16 @@ "column.blocks": "Người đã chặn", "column.bookmarks": "Những tút đã lưu", "column.community": "Máy chủ này", + "column.create_list": "Tạo danh sách", "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.edit_list": "Sửa danh sách", "column.favourites": "Những tút đã thích", "column.firehose": "Bảng tin", "column.follow_requests": "Yêu cầu theo dõi", "column.home": "Trang chủ", + "column.list_members": "Quản lý danh sách", "column.lists": "Danh sách", "column.mutes": "Người đã ẩn", "column.notifications": "Thông báo", @@ -292,7 +295,6 @@ "empty_column.hashtag": "Chưa có tút nào dùng hashtag này.", "empty_column.home": "Trang chủ của bạn đang trống! Hãy theo dõi nhiều người hơn để lấp đầy.", "empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.", - "empty_column.lists": "Bạn chưa tạo danh sách nào.", "empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.", "empty_column.notification_requests": "Sạch sẽ! Không còn gì ở đây. Khi bạn nhận được thông báo mới, chúng sẽ xuất hiện ở đây theo cài đặt của bạn.", "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho ai đó.", @@ -465,20 +467,32 @@ "link_preview.author": "Bởi {name}", "link_preview.more_from_author": "Viết bởi {name}", "link_preview.shares": "{count, plural, other {{counter} lượt chia sẻ}}", - "lists.account.add": "Thêm vào danh sách", - "lists.account.remove": "Xóa khỏi danh sách", + "lists.add_member": "Thêm", + "lists.add_to_list": "Thêm vào danh sách", + "lists.add_to_lists": "Thêm {name} vào danh sách", + "lists.create": "Tạo", + "lists.create_a_list_to_organize": "Tạo một danh sách để sắp xếp Bảng tin", + "lists.create_list": "Tạo danh sách", "lists.delete": "Xóa danh sách", + "lists.done": "Xong", "lists.edit": "Sửa danh sách", - "lists.edit.submit": "Thay đổi tiêu đề", - "lists.exclusive": "Ẩn những tút này khỏi bảng tin", - "lists.new.create": "Tạo mới", - "lists.new.title_placeholder": "Tên danh sách", + "lists.exclusive": "Ẩn thành viên trong Trang chủ", + "lists.exclusive_hint": "Nếu ai đó có trong danh sách này, ẩn họ trong Trang chủ để tránh thấy tút của họ hiện trùng lặp.", + "lists.find_users_to_add": "Tìm người để thêm vào", + "lists.list_members": "Liệt kê các thành viên", + "lists.list_members_count": "{count, plural, other {# thành viên}}", + "lists.list_name": "Tên danh sách", + "lists.new_list_name": "Tên danh sách mới", + "lists.no_lists_yet": "Chưa có danh sách nào.", + "lists.no_members_yet": "Chưa có thành viên nào.", + "lists.no_results_found": "Không tìm thấy kết quả nào.", + "lists.remove_member": "Xóa", "lists.replies_policy.followed": "Người theo dõi", "lists.replies_policy.list": "Người trong danh sách", "lists.replies_policy.none": "Không ai", - "lists.replies_policy.title": "Cho phép trả lời với:", - "lists.search": "Tìm kiếm những người mà bạn quan tâm", - "lists.subheading": "Danh sách của bạn", + "lists.save": "Lưu", + "lists.search_placeholder": "Tìm những người mà bạn quan tâm", + "lists.show_replies_to": "Bao gồm lượt trả lời từ thành viên danh sách", "load_pending": "{count, plural, one {# tút mới} other {# tút mới}}", "loading_indicator.label": "Đang tải…", "media_gallery.hide": "Ẩn", diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index 2fe63fe83c..73a626d59f 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -107,16 +107,9 @@ "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "ⵔⴳⵍ", - "lists.account.add": "ⵔⵏⵓ ⵖⵔ ⵜⵍⴳⴰⵎⵜ", - "lists.account.remove": "ⴽⴽⵙ ⵙⴳ ⵜⵍⴳⴰⵎⵜ", "lists.delete": "ⴽⴽⵙ ⵜⴰⵍⴳⴰⵎⵜ", "lists.edit": "ⵙⵏⴼⵍ ⵜⴰⵍⴳⴰⵎⵜ", - "lists.edit.submit": "ⵙⵏⴼⵍ ⴰⵣⵡⵍ", - "lists.new.create": "ⵙⴽⵔ ⵜⴰⵍⴳⴰⵎⵜ", - "lists.new.title_placeholder": "ⴰⵣⵡⵍ ⵏ ⵜⵍⴳⴰⵎⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ", "lists.replies_policy.none": "ⴰⵡⴷ ⵢⴰⵏ", - "lists.replies_policy.title": "ⵙⴽⵏ ⵜⵉⵔⴰⵔⵉⵏ ⵉ:", - "lists.subheading": "ⵜⵉⵍⴳⴰⵎⵉⵏ ⵏⵏⴽ", "load_pending": "{count, plural, one {# ⵓⴼⵔⴷⵉⵙ ⴰⵎⴰⵢⵏⵓ} other {# ⵉⴼⵔⴷⴰⵙ ⵉⵎⴰⵢⵏⵓⵜⵏ}}", "navigation_bar.compose": "Compose new toot", "navigation_bar.domain_blocks": "Hidden domains", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 463167e8f8..16d32417c6 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -140,13 +140,16 @@ "column.blocks": "屏蔽的用户", "column.bookmarks": "书签", "column.community": "本站时间线", + "column.create_list": "创建列表", "column.direct": "私下提及", "column.directory": "浏览用户资料", "column.domain_blocks": "已屏蔽的域名", + "column.edit_list": "编辑列表", "column.favourites": "喜欢", "column.firehose": "实时动态", "column.follow_requests": "关注请求", "column.home": "主页", + "column.list_members": "管理列表成员", "column.lists": "列表", "column.mutes": "已隐藏的用户", "column.notifications": "通知", @@ -292,7 +295,6 @@ "empty_column.hashtag": "这个话题标签下暂时没有内容。", "empty_column.home": "你的主页时间线还没有内容!快去关注更多人吧。", "empty_column.list": "列表中还没有任何内容。当列表成员发布新嘟文时,它们将出现在这里。", - "empty_column.lists": "你还没有创建过列表。你创建的列表会在这里显示。", "empty_column.mutes": "你没有隐藏任何用户。", "empty_column.notification_requests": "都看完了!这里没有任何未读通知。当收到新的通知时,它们将根据你的设置显示在这里。", "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。", @@ -465,20 +467,32 @@ "link_preview.author": "由 {name}", "link_preview.more_from_author": "查看 {name} 的更多内容", "link_preview.shares": "{count, plural, other {{counter} 条嘟文}}", - "lists.account.add": "添加到列表", - "lists.account.remove": "从列表中移除", + "lists.add_member": "添加", + "lists.add_to_list": "添加到列表", + "lists.add_to_lists": "把 {name} 添加到列表", + "lists.create": "创建", + "lists.create_a_list_to_organize": "新建一个列表,整理你的主页动态", + "lists.create_list": "创建列表", "lists.delete": "删除列表", + "lists.done": "完成", "lists.edit": "编辑列表", - "lists.edit.submit": "更改标题", - "lists.exclusive": "在主页中隐藏这些嘟文", - "lists.new.create": "新建列表", - "lists.new.title_placeholder": "新列表的标题", + "lists.exclusive": "在主页动态中隐藏列表成员", + "lists.exclusive_hint": "列表成员的嘟文将不会在你的主页动态中显示,以免重复阅读。", + "lists.find_users_to_add": "查找要添加的用户", + "lists.list_members": "列表成员", + "lists.list_members_count": "{count, plural, other {# 人}}", + "lists.list_name": "列表名称", + "lists.new_list_name": "新列表名称", + "lists.no_lists_yet": "尚无列表。", + "lists.no_members_yet": "尚无成员。", + "lists.no_results_found": "未找到结果。", + "lists.remove_member": "移除", "lists.replies_policy.followed": "所有我关注的用户", "lists.replies_policy.list": "列表成员", "lists.replies_policy.none": "不显示", - "lists.replies_policy.title": "显示回复:", - "lists.search": "搜索你关注的人", - "lists.subheading": "你的列表", + "lists.save": "保存", + "lists.search_placeholder": "搜索你关注的人", + "lists.show_replies_to": "列表成员回复的显示范围", "load_pending": "{count} 项", "loading_indicator.label": "加载中…", "media_gallery.hide": "隐藏", @@ -691,7 +705,7 @@ "privacy.direct.short": "特定的人", "privacy.private.long": "仅限你的关注者", "privacy.private.short": "关注者", - "privacy.public.long": "所有 Mastodon 内外的人", + "privacy.public.long": "", "privacy.public.short": "公开", "privacy.unlisted.additional": "该模式的行为与“公开”完全相同,只是嘟文不会出现在实时动态、话题标签、探索或 Mastodon 搜索中,即使你已在账户级设置中选择加入。", "privacy.unlisted.long": "减少算法影响", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 8acd6df078..ff0a124fcf 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -263,7 +263,6 @@ "empty_column.hashtag": "這個標籤暫時未有內容。", "empty_column.home": "你還沒有關注任何使用者。快看看{public},向其他使用者搭訕吧。", "empty_column.list": "這個列表暫時未有內容。", - "empty_column.lists": "你還沒有建立任何名單。這裡將會顯示你所建立的名單。", "empty_column.mutes": "你尚未靜音任何使用者。", "empty_column.notification_requests": "沒有新通知了!當有新通知時,會根據設定顯示在這裏。", "empty_column.notifications": "你沒有任何通知紀錄,快向其他用戶搭訕吧。", @@ -410,20 +409,11 @@ "limited_account_hint.action": "一律顯示個人檔案", "limited_account_hint.title": "此個人檔案已被 {domain} 的管理員隱藏。", "link_preview.author": "由 {name} 提供", - "lists.account.add": "新增到列表", - "lists.account.remove": "從列表刪除", "lists.delete": "刪除列表", "lists.edit": "編輯列表", - "lists.edit.submit": "變更標題", - "lists.exclusive": "從主頁隱藏這些帖文", - "lists.new.create": "新增列表", - "lists.new.title_placeholder": "新列表標題", "lists.replies_policy.followed": "任何已關注的用戶", "lists.replies_policy.list": "列表中的用戶", "lists.replies_policy.none": "無人", - "lists.replies_policy.title": "顯示回應文章︰", - "lists.search": "從你關注的人搜索", - "lists.subheading": "列表", "load_pending": "{count, plural, other {# 個新項目}}", "loading_indicator.label": "載入中…", "media_gallery.hide": "隱藏", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 56ddd9745e..355fecac4c 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -140,13 +140,16 @@ "column.blocks": "已封鎖的使用者", "column.bookmarks": "書籤", "column.community": "本站時間軸", + "column.create_list": "建立列表", "column.direct": "私訊", "column.directory": "瀏覽個人檔案", "column.domain_blocks": "已封鎖網域", + "column.edit_list": "編輯列表", "column.favourites": "最愛", "column.firehose": "即時內容", "column.follow_requests": "跟隨請求", "column.home": "首頁", + "column.list_members": "管理列表成員", "column.lists": "列表", "column.mutes": "已靜音的使用者", "column.notifications": "推播通知", @@ -292,7 +295,6 @@ "empty_column.hashtag": "這個主題標籤下什麼也沒有。", "empty_column.home": "您的首頁時間軸是空的!跟隨更多人來將它填滿吧!", "empty_column.list": "這份列表下什麼也沒有。當此列表的成員嘟出新的嘟文時,它們將顯示於此。", - "empty_column.lists": "您還沒有新增任何列表。當您新增列表時,它將於此顯示。", "empty_column.mutes": "您尚未靜音任何使用者。", "empty_column.notification_requests": "清空啦!已經沒有任何推播通知。當您收到新推播通知時,它們將依照您的設定於此顯示。", "empty_column.notifications": "您還沒有收到任何推播通知,當您與別人開始互動時,它將於此顯示。", @@ -465,20 +467,32 @@ "link_preview.author": "來自 {name}", "link_preview.more_from_author": "來自 {name} 之更多內容", "link_preview.shares": "{count, plural, other {{count} 則嘟文}}", - "lists.account.add": "新增至列表", - "lists.account.remove": "自列表中移除", + "lists.add_member": "新增", + "lists.add_to_list": "新增至列表", + "lists.add_to_lists": "新增 {name} 至列表", + "lists.create": "建立", + "lists.create_a_list_to_organize": "建立新列表以整理您的首頁動態", + "lists.create_list": "建立列表", "lists.delete": "刪除列表", + "lists.done": "完成", "lists.edit": "編輯列表", - "lists.edit.submit": "變更標題", - "lists.exclusive": "於首頁時間軸隱藏這些嘟文", - "lists.new.create": "新增列表", - "lists.new.title_placeholder": "新列表標題", + "lists.exclusive": "在首頁隱藏成員", + "lists.exclusive_hint": "如果某個帳號於此列表中,將自您的首頁動態中隱藏此帳號,以防重複見到他們的嘟文。", + "lists.find_users_to_add": "尋找欲新增之使用者", + "lists.list_members": "列表成員", + "lists.list_members_count": "{count, plural, other {# 個成員}}", + "lists.list_name": "列表名稱", + "lists.new_list_name": "新列表名稱", + "lists.no_lists_yet": "尚無列表。", + "lists.no_members_yet": "尚無成員。", + "lists.no_results_found": "找不到結果。", + "lists.remove_member": "移除", "lists.replies_policy.followed": "任何跟隨的使用者", "lists.replies_policy.list": "列表成員", "lists.replies_policy.none": "沒有人", - "lists.replies_policy.title": "顯示回覆:", - "lists.search": "搜尋您跟隨之使用者", - "lists.subheading": "您的列表", + "lists.save": "儲存", + "lists.search_placeholder": "搜尋您跟隨的人", + "lists.show_replies_to": "包含來自列表成員的回覆到", "load_pending": "{count, plural, other {# 個新項目}}", "loading_indicator.label": "正在載入...", "media_gallery.hide": "隱藏", diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 61de577709..04c23f1706 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -311,7 +311,7 @@ zh-CN: text: 规则 settings: indexable: 允许搜索引擎索引个人资料页面 - show_application: 显示你发嘟所用的应用 + show_application: 显示 tag: listable: 允许这个话题标签在用户目录中显示 name: 话题标签 From d0753ec276502ea28a1e853cbc6487020a0602e3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:54:58 +0100 Subject: [PATCH 16/19] Update dependency aws-sdk-s3 to v1.173.0 (#33019) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d005c744cc..471795a7e7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -95,7 +95,7 @@ GEM attr_required (1.0.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.1009.0) + aws-partitions (1.1012.0) aws-sdk-core (3.213.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -104,7 +104,7 @@ GEM aws-sdk-kms (1.96.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.172.0) + aws-sdk-s3 (1.173.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) From ba151ef5e5310b8bb3e68ad4337f0fac20d83be0 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 21 Nov 2024 17:10:07 +0100 Subject: [PATCH 17/19] [Glitch] Fix duplicate notifications in notification groups when using slow mode Port 4bfb8887bfac0839fd94f57ec76d082d20f4c805 to glitch-soc Signed-off-by: Claire --- .../glitch/models/notification_group.ts | 32 +++++++++++++++---- .../glitch/reducers/notification_groups.ts | 11 ++++--- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/javascript/flavours/glitch/models/notification_group.ts b/app/javascript/flavours/glitch/models/notification_group.ts index ff963307c6..a639578fe3 100644 --- a/app/javascript/flavours/glitch/models/notification_group.ts +++ b/app/javascript/flavours/glitch/models/notification_group.ts @@ -17,6 +17,7 @@ export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8; interface BaseNotificationGroup extends Omit { sampleAccountIds: string[]; + partial: boolean; } interface BaseNotificationWithStatus @@ -142,6 +143,7 @@ export function createNotificationGroupFromJSON( return { statusId: statusId ?? undefined, sampleAccountIds, + partial: false, ...groupWithoutStatus, }; } @@ -150,12 +152,14 @@ export function createNotificationGroupFromJSON( return { report: createReportFromJSON(report), sampleAccountIds, + partial: false, ...groupWithoutTargetAccount, }; } case 'severed_relationships': return { ...group, + partial: false, event: createAccountRelationshipSeveranceEventFromJSON(group.event), sampleAccountIds, }; @@ -163,6 +167,7 @@ export function createNotificationGroupFromJSON( const { moderation_warning, ...groupWithoutModerationWarning } = group; return { ...groupWithoutModerationWarning, + partial: false, moderationWarning: createAccountWarningFromJSON(moderation_warning), sampleAccountIds, }; @@ -171,6 +176,7 @@ export function createNotificationGroupFromJSON( const { annual_report, ...groupWithoutAnnualReport } = group; return { ...groupWithoutAnnualReport, + partial: false, annualReport: createAnnualReportEventFromJSON(annual_report), sampleAccountIds, }; @@ -178,6 +184,7 @@ export function createNotificationGroupFromJSON( default: return { sampleAccountIds, + partial: false, ...group, }; } @@ -185,17 +192,17 @@ export function createNotificationGroupFromJSON( export function createNotificationGroupFromNotificationJSON( notification: ApiNotificationJSON, -) { +): NotificationGroup { const group = { sampleAccountIds: [notification.account.id], group_key: notification.group_key, notifications_count: 1, - type: notification.type, most_recent_notification_id: notification.id, page_min_id: notification.id, page_max_id: notification.id, latest_page_notification_at: notification.created_at, - } as NotificationGroup; + partial: true, + }; switch (notification.type) { case 'favourite': @@ -204,12 +211,21 @@ export function createNotificationGroupFromNotificationJSON( case 'mention': case 'poll': case 'update': - return { ...group, statusId: notification.status?.id }; + return { + ...group, + type: notification.type, + statusId: notification.status?.id, + }; case 'admin.report': - return { ...group, report: createReportFromJSON(notification.report) }; + return { + ...group, + type: notification.type, + report: createReportFromJSON(notification.report), + }; case 'severed_relationships': return { ...group, + type: notification.type, event: createAccountRelationshipSeveranceEventFromJSON( notification.event, ), @@ -217,11 +233,15 @@ export function createNotificationGroupFromNotificationJSON( case 'moderation_warning': return { ...group, + type: notification.type, moderationWarning: createAccountWarningFromJSON( notification.moderation_warning, ), }; default: - return group; + return { + ...group, + type: notification.type, + }; } } diff --git a/app/javascript/flavours/glitch/reducers/notification_groups.ts b/app/javascript/flavours/glitch/reducers/notification_groups.ts index 09c0c5c3ee..d890c32f37 100644 --- a/app/javascript/flavours/glitch/reducers/notification_groups.ts +++ b/app/javascript/flavours/glitch/reducers/notification_groups.ts @@ -534,10 +534,13 @@ export const notificationGroupsReducer = createReducer( if (existingGroupIndex > -1) { const existingGroup = state.groups[existingGroupIndex]; if (existingGroup && existingGroup.type !== 'gap') { - group.notifications_count += existingGroup.notifications_count; - group.sampleAccountIds = group.sampleAccountIds - .concat(existingGroup.sampleAccountIds) - .slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS); + if (group.partial) { + group.notifications_count += + existingGroup.notifications_count; + group.sampleAccountIds = group.sampleAccountIds + .concat(existingGroup.sampleAccountIds) + .slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS); + } state.groups.splice(existingGroupIndex, 1); } } From 2259949e9bfba621a9ac50c9405b3f8b17688c54 Mon Sep 17 00:00:00 2001 From: Claire Date: Sun, 24 Nov 2024 19:48:17 +0100 Subject: [PATCH 18/19] Remove pinned accounts editor It was utterly broken and the underlying modals are getting redesigned --- .../flavours/glitch/actions/accounts.js | 106 +----------------- .../features/getting_started_misc/index.jsx | 10 -- .../containers/account_container.js | 25 ----- .../containers/search_container.js | 24 ---- .../features/pinned_accounts_editor/index.jsx | 82 -------------- .../features/ui/components/modal_root.jsx | 2 - .../features/ui/util/async-components.js | 4 - .../flavours/glitch/locales/en.json | 2 - .../flavours/glitch/reducers/index.ts | 2 - .../glitch/reducers/pinned_accounts_editor.js | 58 ---------- 10 files changed, 1 insertion(+), 314 deletions(-) delete mode 100644 app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/account_container.js delete mode 100644 app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/search_container.js delete mode 100644 app/javascript/flavours/glitch/features/pinned_accounts_editor/index.jsx delete mode 100644 app/javascript/flavours/glitch/reducers/pinned_accounts_editor.js diff --git a/app/javascript/flavours/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js index e8f81048a6..513b9e24a9 100644 --- a/app/javascript/flavours/glitch/actions/accounts.js +++ b/app/javascript/flavours/glitch/actions/accounts.js @@ -74,19 +74,6 @@ export const FOLLOW_REQUEST_AUTHORIZE_FAIL = 'FOLLOW_REQUEST_AUTHORIZE_FAIL'; export const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST'; export const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL'; -export const PINNED_ACCOUNTS_FETCH_REQUEST = 'PINNED_ACCOUNTS_FETCH_REQUEST'; -export const PINNED_ACCOUNTS_FETCH_SUCCESS = 'PINNED_ACCOUNTS_FETCH_SUCCESS'; -export const PINNED_ACCOUNTS_FETCH_FAIL = 'PINNED_ACCOUNTS_FETCH_FAIL'; - -export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_REQUEST = 'PINNED_ACCOUNTS_SUGGESTIONS_FETCH_REQUEST'; -export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS = 'PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS'; -export const PINNED_ACCOUNTS_SUGGESTIONS_FETCH_FAIL = 'PINNED_ACCOUNTS_SUGGESTIONS_FETCH_FAIL'; - -export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR = 'PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR'; -export const PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE = 'PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE'; - -export const PINNED_ACCOUNTS_EDITOR_RESET = 'PINNED_ACCOUNTS_EDITOR_RESET'; - export const ACCOUNT_REVEAL = 'ACCOUNT_REVEAL'; export * from './accounts_typed'; @@ -686,38 +673,6 @@ export function unpinAccountFail(error) { }; } -export function fetchPinnedAccounts() { - return (dispatch) => { - dispatch(fetchPinnedAccountsRequest()); - - api().get('/api/v1/endorsements', { params: { limit: 0 } }).then(response => { - dispatch(importFetchedAccounts(response.data)); - dispatch(fetchPinnedAccountsSuccess(response.data)); - }).catch(err => dispatch(fetchPinnedAccountsFail(err))); - }; -} - -export function fetchPinnedAccountsRequest() { - return { - type: PINNED_ACCOUNTS_FETCH_REQUEST, - }; -} - -export function fetchPinnedAccountsSuccess(accounts, next) { - return { - type: PINNED_ACCOUNTS_FETCH_SUCCESS, - accounts, - next, - }; -} - -export function fetchPinnedAccountsFail(error) { - return { - type: PINNED_ACCOUNTS_FETCH_FAIL, - error, - }; -} - export const updateAccount = ({ displayName, note, avatar, header, discoverable, indexable }) => (dispatch) => { const data = new FormData(); @@ -736,68 +691,9 @@ export const updateAccount = ({ displayName, note, avatar, header, discoverable, export const navigateToProfile = (accountId) => { return (_dispatch, getState) => { const acct = getState().accounts.getIn([accountId, 'acct']); - + if (acct) { browserHistory.push(`/@${acct}`); } }; }; - -export function fetchPinnedAccountsSuggestions(q) { - return (dispatch) => { - dispatch(fetchPinnedAccountsSuggestionsRequest()); - - const params = { - q, - resolve: false, - limit: 4, - following: true, - }; - - api().get('/api/v1/accounts/search', { params }).then(response => { - dispatch(importFetchedAccounts(response.data)); - dispatch(fetchPinnedAccountsSuggestionsSuccess(q, response.data)); - }).catch(err => dispatch(fetchPinnedAccountsSuggestionsFail(err))); - }; -} - -export function fetchPinnedAccountsSuggestionsRequest() { - return { - type: PINNED_ACCOUNTS_SUGGESTIONS_FETCH_REQUEST, - }; -} - -export function fetchPinnedAccountsSuggestionsSuccess(query, accounts) { - return { - type: PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS, - query, - accounts, - }; -} - -export function fetchPinnedAccountsSuggestionsFail(error) { - return { - type: PINNED_ACCOUNTS_SUGGESTIONS_FETCH_FAIL, - error, - }; -} - -export function clearPinnedAccountsSuggestions() { - return { - type: PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR, - }; -} - -export function changePinnedAccountsSuggestions(value) { - return { - type: PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE, - value, - }; -} - -export function resetPinnedAccountsEditor() { - return { - type: PINNED_ACCOUNTS_EDITOR_RESET, - }; -} - diff --git a/app/javascript/flavours/glitch/features/getting_started_misc/index.jsx b/app/javascript/flavours/glitch/features/getting_started_misc/index.jsx index 4a0dbb4a1c..137459ad4f 100644 --- a/app/javascript/flavours/glitch/features/getting_started_misc/index.jsx +++ b/app/javascript/flavours/glitch/features/getting_started_misc/index.jsx @@ -8,11 +8,9 @@ import { connect } from 'react-redux'; import BlockIcon from '@/material-icons/400-24px/block.svg?react'; import InfoIcon from '@/material-icons/400-24px/info.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; -import PersonCheckIcon from '@/material-icons/400-24px/person_check.svg?react'; import PushPinIcon from '@/material-icons/400-24px/push_pin.svg?react'; import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; -import { openModal } from 'flavours/glitch/actions/modal'; import Column from 'flavours/glitch/features/ui/components/column'; import ColumnLink from 'flavours/glitch/features/ui/components/column_link'; import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading'; @@ -27,7 +25,6 @@ const messages = defineMessages({ mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' }, keyboard_shortcuts: { id: 'navigation_bar.keyboard_shortcuts', defaultMessage: 'Keyboard shortcuts' }, - featured_users: { id: 'navigation_bar.featured_users', defaultMessage: 'Featured users' }, }); class GettingStartedMisc extends ImmutablePureComponent { @@ -38,12 +35,6 @@ class GettingStartedMisc extends ImmutablePureComponent { dispatch: PropTypes.func.isRequired, }; - openFeaturedAccountsModal = () => { - this.props.dispatch(openModal({ - modalType: 'PINNED_ACCOUNTS_EDITOR', - })); - }; - render () { const { intl } = this.props; const { signedIn } = this.props.identity; @@ -54,7 +45,6 @@ class GettingStartedMisc extends ImmutablePureComponent { {signedIn && ()} {signedIn && ()} - {signedIn && ()} {signedIn && ()} {signedIn && ()} {signedIn && ()} diff --git a/app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/account_container.js b/app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/account_container.js deleted file mode 100644 index 29f89b95a2..0000000000 --- a/app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/account_container.js +++ /dev/null @@ -1,25 +0,0 @@ -import { injectIntl } from 'react-intl'; - -import { connect } from 'react-redux'; - -import { pinAccount, unpinAccount } from 'flavours/glitch/actions/accounts'; -import Account from 'flavours/glitch/features/list_editor/components/account'; -import { makeGetAccount } from 'flavours/glitch/selectors'; - -const makeMapStateToProps = () => { - const getAccount = makeGetAccount(); - - const mapStateToProps = (state, { accountId, added }) => ({ - account: getAccount(state, accountId), - added: typeof added === 'undefined' ? state.getIn(['pinnedAccountsEditor', 'accounts', 'items']).includes(accountId) : added, - }); - - return mapStateToProps; -}; - -const mapDispatchToProps = (dispatch, { accountId }) => ({ - onRemove: () => dispatch(unpinAccount(accountId)), - onAdd: () => dispatch(pinAccount(accountId)), -}); - -export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Account)); diff --git a/app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/search_container.js b/app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/search_container.js deleted file mode 100644 index 010a7527de..0000000000 --- a/app/javascript/flavours/glitch/features/pinned_accounts_editor/containers/search_container.js +++ /dev/null @@ -1,24 +0,0 @@ -import { injectIntl } from 'react-intl'; - -import { connect } from 'react-redux'; - -import Search from 'flavours/glitch/features/list_editor/components/search'; - -import { - fetchPinnedAccountsSuggestions, - clearPinnedAccountsSuggestions, - changePinnedAccountsSuggestions, -} from '../../../actions/accounts'; - - -const mapStateToProps = state => ({ - value: state.getIn(['pinnedAccountsEditor', 'suggestions', 'value']), -}); - -const mapDispatchToProps = dispatch => ({ - onSubmit: value => dispatch(fetchPinnedAccountsSuggestions(value)), - onClear: () => dispatch(clearPinnedAccountsSuggestions()), - onChange: value => dispatch(changePinnedAccountsSuggestions(value)), -}); - -export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Search)); diff --git a/app/javascript/flavours/glitch/features/pinned_accounts_editor/index.jsx b/app/javascript/flavours/glitch/features/pinned_accounts_editor/index.jsx deleted file mode 100644 index 603d7209a7..0000000000 --- a/app/javascript/flavours/glitch/features/pinned_accounts_editor/index.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import PropTypes from 'prop-types'; - -import { injectIntl, FormattedMessage } from 'react-intl'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import spring from 'react-motion/lib/spring'; - -import { fetchPinnedAccounts, clearPinnedAccountsSuggestions, resetPinnedAccountsEditor } from 'flavours/glitch/actions/accounts'; -import Motion from 'flavours/glitch/features/ui/util/optional_motion'; - -import AccountContainer from './containers/account_container'; -import SearchContainer from './containers/search_container'; - -const mapStateToProps = state => ({ - accountIds: state.getIn(['pinnedAccountsEditor', 'accounts', 'items']), - searchAccountIds: state.getIn(['pinnedAccountsEditor', 'suggestions', 'items']), -}); - -const mapDispatchToProps = dispatch => ({ - onInitialize: () => dispatch(fetchPinnedAccounts()), - onClear: () => dispatch(clearPinnedAccountsSuggestions()), - onReset: () => dispatch(resetPinnedAccountsEditor()), -}); - -class PinnedAccountsEditor extends ImmutablePureComponent { - - static propTypes = { - onClose: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - onInitialize: PropTypes.func.isRequired, - onClear: PropTypes.func.isRequired, - onReset: PropTypes.func.isRequired, - title: PropTypes.string.isRequired, - accountIds: ImmutablePropTypes.list.isRequired, - searchAccountIds: ImmutablePropTypes.list.isRequired, - }; - - componentDidMount () { - const { onInitialize } = this.props; - onInitialize(); - } - - componentWillUnmount () { - const { onReset } = this.props; - onReset(); - } - - render () { - const { accountIds, searchAccountIds, onClear } = this.props; - const showSearch = searchAccountIds.size > 0; - - return ( -
-

- - - -
-
- {accountIds.map(accountId => )} -
- - {showSearch &&
} - - - {({ x }) => - (
- {searchAccountIds.map(accountId => )} -
) - } -
-
-
- ); - } - -} - -export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(PinnedAccountsEditor)); diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx index 506cccfbb2..adac4c5a5e 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx @@ -13,7 +13,6 @@ import { EmbedModal, ListEditor, ListAdder, - PinnedAccountsEditor, CompareHistoryModal, FilterModal, InteractionModal, @@ -76,7 +75,6 @@ export const MODAL_COMPONENTS = { 'LIST_EDITOR': ListEditor, 'FOCAL_POINT': () => Promise.resolve({ default: FocalPointModal }), 'LIST_ADDER': ListAdder, - 'PINNED_ACCOUNTS_EDITOR': PinnedAccountsEditor, 'COMPARE_HISTORY': CompareHistoryModal, 'FILTER': FilterModal, 'SUBSCRIBED_LANGUAGES': SubscribedLanguagesModal, diff --git a/app/javascript/flavours/glitch/features/ui/util/async-components.js b/app/javascript/flavours/glitch/features/ui/util/async-components.js index 1354c21f09..3102877d94 100644 --- a/app/javascript/flavours/glitch/features/ui/util/async-components.js +++ b/app/javascript/flavours/glitch/features/ui/util/async-components.js @@ -46,10 +46,6 @@ export function Lists () { return import(/* webpackChunkName: "flavours/glitch/async/lists" */'../../lists'); } -export function PinnedAccountsEditor () { - return import(/* webpackChunkName: "flavours/glitch/async/pinned_accounts_editor" */'../../pinned_accounts_editor'); -} - export function DirectTimeline() { return import(/* webpackChunkName: "flavours/glitch/async/direct_timeline" */'../../direct_timeline'); } diff --git a/app/javascript/flavours/glitch/locales/en.json b/app/javascript/flavours/glitch/locales/en.json index e60a2d8720..2fe5b715fa 100644 --- a/app/javascript/flavours/glitch/locales/en.json +++ b/app/javascript/flavours/glitch/locales/en.json @@ -35,7 +35,6 @@ "confirmations.missing_media_description.edit": "Edit media", "confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.", "direct.group_by_conversations": "Group by conversation", - "endorsed_accounts_editor.endorsed_accounts": "Featured accounts", "favourite_modal.favourite": "Favourite post?", "federation.federated.long": "Allow this post to reach other servers", "federation.federated.short": "Federated", @@ -51,7 +50,6 @@ "keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots", "moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.", "navigation_bar.app_settings": "App settings", - "navigation_bar.featured_users": "Featured users", "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts", "navigation_bar.misc": "Misc", "notification.markForDeletion": "Mark for deletion", diff --git a/app/javascript/flavours/glitch/reducers/index.ts b/app/javascript/flavours/glitch/reducers/index.ts index d8d50be7d2..99e8b2efd0 100644 --- a/app/javascript/flavours/glitch/reducers/index.ts +++ b/app/javascript/flavours/glitch/reducers/index.ts @@ -30,7 +30,6 @@ import { notificationPolicyReducer } from './notification_policy'; import { notificationRequestsReducer } from './notification_requests'; import notifications from './notifications'; import { pictureInPictureReducer } from './picture_in_picture'; -import pinnedAccountsEditor from './pinned_accounts_editor'; import polls from './polls'; import push_notifications from './push_notifications'; import { relationshipsReducer } from './relationships'; @@ -78,7 +77,6 @@ const reducers = { filters, conversations, suggestions, - pinnedAccountsEditor, polls, trends, markers: markersReducer, diff --git a/app/javascript/flavours/glitch/reducers/pinned_accounts_editor.js b/app/javascript/flavours/glitch/reducers/pinned_accounts_editor.js deleted file mode 100644 index 352db5733b..0000000000 --- a/app/javascript/flavours/glitch/reducers/pinned_accounts_editor.js +++ /dev/null @@ -1,58 +0,0 @@ -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; - -import { - PINNED_ACCOUNTS_EDITOR_RESET, - PINNED_ACCOUNTS_FETCH_REQUEST, - PINNED_ACCOUNTS_FETCH_SUCCESS, - PINNED_ACCOUNTS_FETCH_FAIL, - PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS, - PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR, - PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE, - pinAccountSuccess, - unpinAccountSuccess, -} from '../actions/accounts'; - -const initialState = ImmutableMap({ - accounts: ImmutableMap({ - items: ImmutableList(), - loaded: false, - isLoading: false, - }), - - suggestions: ImmutableMap({ - value: '', - items: ImmutableList(), - }), -}); - -export default function listEditorReducer(state = initialState, action) { - switch(action.type) { - case PINNED_ACCOUNTS_EDITOR_RESET: - return initialState; - case PINNED_ACCOUNTS_FETCH_REQUEST: - return state.setIn(['accounts', 'isLoading'], true); - case PINNED_ACCOUNTS_FETCH_FAIL: - return state.setIn(['accounts', 'isLoading'], false); - case PINNED_ACCOUNTS_FETCH_SUCCESS: - return state.update('accounts', accounts => accounts.withMutations(map => { - map.set('isLoading', false); - map.set('loaded', true); - map.set('items', ImmutableList(action.accounts.map(item => item.id))); - })); - case PINNED_ACCOUNTS_SUGGESTIONS_FETCH_SUCCESS: - return state.setIn(['suggestions', 'items'], ImmutableList(action.accounts.map(item => item.id))); - case PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE: - return state.setIn(['suggestions', 'value'], action.value); - case PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR: - return state.update('suggestions', suggestions => suggestions.withMutations(map => { - map.set('items', ImmutableList()); - map.set('value', ''); - })); - case pinAccountSuccess.type: - return state.updateIn(['accounts', 'items'], list => list.unshift(action.payload.relationship.id)); - case unpinAccountSuccess.type: - return state.updateIn(['accounts', 'items'], list => list.filterNot(item => item === action.payload.relationship.id)); - default: - return state; - } -} From 217e0f87fd69b75a9045af1a4f0f7a9ac9e83d64 Mon Sep 17 00:00:00 2001 From: Claire Date: Sun, 24 Nov 2024 19:04:05 +0100 Subject: [PATCH 19/19] [Glitch] Change design of lists in web UI Port 62603508c7343f0b9ef880bcbed67c70a9e8375d to glitch-soc Signed-off-by: Claire --- .../flavours/glitch/actions/lists.js | 285 ------------- .../flavours/glitch/actions/lists_typed.ts | 13 + app/javascript/flavours/glitch/api.ts | 1 + app/javascript/flavours/glitch/api/lists.ts | 32 ++ .../flavours/glitch/api_types/lists.ts | 10 + .../flavours/glitch/components/check_box.tsx | 13 +- .../glitch/components/scrollable_list.jsx | 11 +- .../containers/dropdown_menu_container.js | 7 + .../list_adder/components/account.jsx | 43 -- .../features/list_adder/components/list.jsx | 75 ---- .../glitch/features/list_adder/index.jsx | 76 ---- .../glitch/features/list_adder/index.tsx | 213 ++++++++++ .../list_editor/components/account.jsx | 82 ---- .../list_editor/components/edit_list_form.jsx | 76 ---- .../list_editor/components/search.jsx | 83 ---- .../glitch/features/list_editor/index.jsx | 83 ---- .../glitch/features/list_timeline/index.jsx | 65 +-- .../lists/components/new_list_form.jsx | 80 ---- .../flavours/glitch/features/lists/index.jsx | 91 ----- .../flavours/glitch/features/lists/index.tsx | 145 +++++++ .../glitch/features/lists/members.tsx | 373 ++++++++++++++++++ .../flavours/glitch/features/lists/new.tsx | 296 ++++++++++++++ .../features/ui/components/modal_root.jsx | 2 - .../flavours/glitch/features/ui/index.jsx | 7 +- .../features/ui/util/async-components.js | 12 +- app/javascript/flavours/glitch/models/list.ts | 18 + .../flavours/glitch/reducers/index.ts | 8 +- .../flavours/glitch/reducers/list_adder.js | 48 --- .../flavours/glitch/reducers/list_editor.js | 99 ----- .../flavours/glitch/reducers/lists.js | 38 -- .../flavours/glitch/reducers/lists.ts | 49 +++ .../flavours/glitch/selectors/lists.ts | 15 + .../flavours/glitch/styles/admin.scss | 10 - .../flavours/glitch/styles/components.scss | 191 ++++----- .../flavours/glitch/styles/forms.scss | 53 +++ .../styles/mastodon-light/variables.scss | 1 + .../flavours/glitch/styles/variables.scss | 1 + 37 files changed, 1368 insertions(+), 1337 deletions(-) create mode 100644 app/javascript/flavours/glitch/actions/lists_typed.ts create mode 100644 app/javascript/flavours/glitch/api/lists.ts create mode 100644 app/javascript/flavours/glitch/api_types/lists.ts delete mode 100644 app/javascript/flavours/glitch/features/list_adder/components/account.jsx delete mode 100644 app/javascript/flavours/glitch/features/list_adder/components/list.jsx delete mode 100644 app/javascript/flavours/glitch/features/list_adder/index.jsx create mode 100644 app/javascript/flavours/glitch/features/list_adder/index.tsx delete mode 100644 app/javascript/flavours/glitch/features/list_editor/components/account.jsx delete mode 100644 app/javascript/flavours/glitch/features/list_editor/components/edit_list_form.jsx delete mode 100644 app/javascript/flavours/glitch/features/list_editor/components/search.jsx delete mode 100644 app/javascript/flavours/glitch/features/list_editor/index.jsx delete mode 100644 app/javascript/flavours/glitch/features/lists/components/new_list_form.jsx delete mode 100644 app/javascript/flavours/glitch/features/lists/index.jsx create mode 100644 app/javascript/flavours/glitch/features/lists/index.tsx create mode 100644 app/javascript/flavours/glitch/features/lists/members.tsx create mode 100644 app/javascript/flavours/glitch/features/lists/new.tsx create mode 100644 app/javascript/flavours/glitch/models/list.ts delete mode 100644 app/javascript/flavours/glitch/reducers/list_adder.js delete mode 100644 app/javascript/flavours/glitch/reducers/list_editor.js delete mode 100644 app/javascript/flavours/glitch/reducers/lists.js create mode 100644 app/javascript/flavours/glitch/reducers/lists.ts create mode 100644 app/javascript/flavours/glitch/selectors/lists.ts diff --git a/app/javascript/flavours/glitch/actions/lists.js b/app/javascript/flavours/glitch/actions/lists.js index 9956059387..f9abc2e769 100644 --- a/app/javascript/flavours/glitch/actions/lists.js +++ b/app/javascript/flavours/glitch/actions/lists.js @@ -1,8 +1,5 @@ import api from '../api'; -import { showAlertForError } from './alerts'; -import { importFetchedAccounts } from './importer'; - export const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST'; export const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS'; export const LIST_FETCH_FAIL = 'LIST_FETCH_FAIL'; @@ -11,45 +8,10 @@ export const LISTS_FETCH_REQUEST = 'LISTS_FETCH_REQUEST'; export const LISTS_FETCH_SUCCESS = 'LISTS_FETCH_SUCCESS'; export const LISTS_FETCH_FAIL = 'LISTS_FETCH_FAIL'; -export const LIST_EDITOR_TITLE_CHANGE = 'LIST_EDITOR_TITLE_CHANGE'; -export const LIST_EDITOR_RESET = 'LIST_EDITOR_RESET'; -export const LIST_EDITOR_SETUP = 'LIST_EDITOR_SETUP'; - -export const LIST_CREATE_REQUEST = 'LIST_CREATE_REQUEST'; -export const LIST_CREATE_SUCCESS = 'LIST_CREATE_SUCCESS'; -export const LIST_CREATE_FAIL = 'LIST_CREATE_FAIL'; - -export const LIST_UPDATE_REQUEST = 'LIST_UPDATE_REQUEST'; -export const LIST_UPDATE_SUCCESS = 'LIST_UPDATE_SUCCESS'; -export const LIST_UPDATE_FAIL = 'LIST_UPDATE_FAIL'; - export const LIST_DELETE_REQUEST = 'LIST_DELETE_REQUEST'; export const LIST_DELETE_SUCCESS = 'LIST_DELETE_SUCCESS'; export const LIST_DELETE_FAIL = 'LIST_DELETE_FAIL'; -export const LIST_ACCOUNTS_FETCH_REQUEST = 'LIST_ACCOUNTS_FETCH_REQUEST'; -export const LIST_ACCOUNTS_FETCH_SUCCESS = 'LIST_ACCOUNTS_FETCH_SUCCESS'; -export const LIST_ACCOUNTS_FETCH_FAIL = 'LIST_ACCOUNTS_FETCH_FAIL'; - -export const LIST_EDITOR_SUGGESTIONS_CHANGE = 'LIST_EDITOR_SUGGESTIONS_CHANGE'; -export const LIST_EDITOR_SUGGESTIONS_READY = 'LIST_EDITOR_SUGGESTIONS_READY'; -export const LIST_EDITOR_SUGGESTIONS_CLEAR = 'LIST_EDITOR_SUGGESTIONS_CLEAR'; - -export const LIST_EDITOR_ADD_REQUEST = 'LIST_EDITOR_ADD_REQUEST'; -export const LIST_EDITOR_ADD_SUCCESS = 'LIST_EDITOR_ADD_SUCCESS'; -export const LIST_EDITOR_ADD_FAIL = 'LIST_EDITOR_ADD_FAIL'; - -export const LIST_EDITOR_REMOVE_REQUEST = 'LIST_EDITOR_REMOVE_REQUEST'; -export const LIST_EDITOR_REMOVE_SUCCESS = 'LIST_EDITOR_REMOVE_SUCCESS'; -export const LIST_EDITOR_REMOVE_FAIL = 'LIST_EDITOR_REMOVE_FAIL'; - -export const LIST_ADDER_RESET = 'LIST_ADDER_RESET'; -export const LIST_ADDER_SETUP = 'LIST_ADDER_SETUP'; - -export const LIST_ADDER_LISTS_FETCH_REQUEST = 'LIST_ADDER_LISTS_FETCH_REQUEST'; -export const LIST_ADDER_LISTS_FETCH_SUCCESS = 'LIST_ADDER_LISTS_FETCH_SUCCESS'; -export const LIST_ADDER_LISTS_FETCH_FAIL = 'LIST_ADDER_LISTS_FETCH_FAIL'; - export const fetchList = id => (dispatch, getState) => { if (getState().getIn(['lists', id])) { return; @@ -100,89 +62,6 @@ export const fetchListsFail = error => ({ error, }); -export const submitListEditor = shouldReset => (dispatch, getState) => { - const listId = getState().getIn(['listEditor', 'listId']); - const title = getState().getIn(['listEditor', 'title']); - - if (listId === null) { - dispatch(createList(title, shouldReset)); - } else { - dispatch(updateList(listId, title, shouldReset)); - } -}; - -export const setupListEditor = listId => (dispatch, getState) => { - dispatch({ - type: LIST_EDITOR_SETUP, - list: getState().getIn(['lists', listId]), - }); - - dispatch(fetchListAccounts(listId)); -}; - -export const changeListEditorTitle = value => ({ - type: LIST_EDITOR_TITLE_CHANGE, - value, -}); - -export const createList = (title, shouldReset) => (dispatch) => { - dispatch(createListRequest()); - - api().post('/api/v1/lists', { title }).then(({ data }) => { - dispatch(createListSuccess(data)); - - if (shouldReset) { - dispatch(resetListEditor()); - } - }).catch(err => dispatch(createListFail(err))); -}; - -export const createListRequest = () => ({ - type: LIST_CREATE_REQUEST, -}); - -export const createListSuccess = list => ({ - type: LIST_CREATE_SUCCESS, - list, -}); - -export const createListFail = error => ({ - type: LIST_CREATE_FAIL, - error, -}); - -export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch) => { - dispatch(updateListRequest(id)); - - api().put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => { - dispatch(updateListSuccess(data)); - - if (shouldReset) { - dispatch(resetListEditor()); - } - }).catch(err => dispatch(updateListFail(id, err))); -}; - -export const updateListRequest = id => ({ - type: LIST_UPDATE_REQUEST, - id, -}); - -export const updateListSuccess = list => ({ - type: LIST_UPDATE_SUCCESS, - list, -}); - -export const updateListFail = (id, error) => ({ - type: LIST_UPDATE_FAIL, - id, - error, -}); - -export const resetListEditor = () => ({ - type: LIST_EDITOR_RESET, -}); - export const deleteList = id => (dispatch) => { dispatch(deleteListRequest(id)); @@ -206,167 +85,3 @@ export const deleteListFail = (id, error) => ({ id, error, }); - -export const fetchListAccounts = listId => (dispatch) => { - dispatch(fetchListAccountsRequest(listId)); - - api().get(`/api/v1/lists/${listId}/accounts`, { params: { limit: 0 } }).then(({ data }) => { - dispatch(importFetchedAccounts(data)); - dispatch(fetchListAccountsSuccess(listId, data)); - }).catch(err => dispatch(fetchListAccountsFail(listId, err))); -}; - -export const fetchListAccountsRequest = id => ({ - type: LIST_ACCOUNTS_FETCH_REQUEST, - id, -}); - -export const fetchListAccountsSuccess = (id, accounts, next) => ({ - type: LIST_ACCOUNTS_FETCH_SUCCESS, - id, - accounts, - next, -}); - -export const fetchListAccountsFail = (id, error) => ({ - type: LIST_ACCOUNTS_FETCH_FAIL, - id, - error, -}); - -export const fetchListSuggestions = q => (dispatch) => { - const params = { - q, - resolve: false, - limit: 4, - following: true, - }; - - api().get('/api/v1/accounts/search', { params }).then(({ data }) => { - dispatch(importFetchedAccounts(data)); - dispatch(fetchListSuggestionsReady(q, data)); - }).catch(error => dispatch(showAlertForError(error))); -}; - -export const fetchListSuggestionsReady = (query, accounts) => ({ - type: LIST_EDITOR_SUGGESTIONS_READY, - query, - accounts, -}); - -export const clearListSuggestions = () => ({ - type: LIST_EDITOR_SUGGESTIONS_CLEAR, -}); - -export const changeListSuggestions = value => ({ - type: LIST_EDITOR_SUGGESTIONS_CHANGE, - value, -}); - -export const addToListEditor = accountId => (dispatch, getState) => { - dispatch(addToList(getState().getIn(['listEditor', 'listId']), accountId)); -}; - -export const addToList = (listId, accountId) => (dispatch) => { - dispatch(addToListRequest(listId, accountId)); - - api().post(`/api/v1/lists/${listId}/accounts`, { account_ids: [accountId] }) - .then(() => dispatch(addToListSuccess(listId, accountId))) - .catch(err => dispatch(addToListFail(listId, accountId, err))); -}; - -export const addToListRequest = (listId, accountId) => ({ - type: LIST_EDITOR_ADD_REQUEST, - listId, - accountId, -}); - -export const addToListSuccess = (listId, accountId) => ({ - type: LIST_EDITOR_ADD_SUCCESS, - listId, - accountId, -}); - -export const addToListFail = (listId, accountId, error) => ({ - type: LIST_EDITOR_ADD_FAIL, - listId, - accountId, - error, -}); - -export const removeFromListEditor = accountId => (dispatch, getState) => { - dispatch(removeFromList(getState().getIn(['listEditor', 'listId']), accountId)); -}; - -export const removeFromList = (listId, accountId) => (dispatch) => { - dispatch(removeFromListRequest(listId, accountId)); - - api().delete(`/api/v1/lists/${listId}/accounts`, { params: { account_ids: [accountId] } }) - .then(() => dispatch(removeFromListSuccess(listId, accountId))) - .catch(err => dispatch(removeFromListFail(listId, accountId, err))); -}; - -export const removeFromListRequest = (listId, accountId) => ({ - type: LIST_EDITOR_REMOVE_REQUEST, - listId, - accountId, -}); - -export const removeFromListSuccess = (listId, accountId) => ({ - type: LIST_EDITOR_REMOVE_SUCCESS, - listId, - accountId, -}); - -export const removeFromListFail = (listId, accountId, error) => ({ - type: LIST_EDITOR_REMOVE_FAIL, - listId, - accountId, - error, -}); - -export const resetListAdder = () => ({ - type: LIST_ADDER_RESET, -}); - -export const setupListAdder = accountId => (dispatch, getState) => { - dispatch({ - type: LIST_ADDER_SETUP, - account: getState().getIn(['accounts', accountId]), - }); - dispatch(fetchLists()); - dispatch(fetchAccountLists(accountId)); -}; - -export const fetchAccountLists = accountId => (dispatch) => { - dispatch(fetchAccountListsRequest(accountId)); - - api().get(`/api/v1/accounts/${accountId}/lists`) - .then(({ data }) => dispatch(fetchAccountListsSuccess(accountId, data))) - .catch(err => dispatch(fetchAccountListsFail(accountId, err))); -}; - -export const fetchAccountListsRequest = id => ({ - type:LIST_ADDER_LISTS_FETCH_REQUEST, - id, -}); - -export const fetchAccountListsSuccess = (id, lists) => ({ - type: LIST_ADDER_LISTS_FETCH_SUCCESS, - id, - lists, -}); - -export const fetchAccountListsFail = (id, err) => ({ - type: LIST_ADDER_LISTS_FETCH_FAIL, - id, - err, -}); - -export const addToListAdder = listId => (dispatch, getState) => { - dispatch(addToList(listId, getState().getIn(['listAdder', 'accountId']))); -}; - -export const removeFromListAdder = listId => (dispatch, getState) => { - dispatch(removeFromList(listId, getState().getIn(['listAdder', 'accountId']))); -}; diff --git a/app/javascript/flavours/glitch/actions/lists_typed.ts b/app/javascript/flavours/glitch/actions/lists_typed.ts new file mode 100644 index 0000000000..8f5dc0ffa3 --- /dev/null +++ b/app/javascript/flavours/glitch/actions/lists_typed.ts @@ -0,0 +1,13 @@ +import { apiCreate, apiUpdate } from 'flavours/glitch/api/lists'; +import type { List } from 'flavours/glitch/models/list'; +import { createDataLoadingThunk } from 'flavours/glitch/store/typed_functions'; + +export const createList = createDataLoadingThunk( + 'list/create', + (list: Partial) => apiCreate(list), +); + +export const updateList = createDataLoadingThunk( + 'list/update', + (list: Partial) => apiUpdate(list), +); diff --git a/app/javascript/flavours/glitch/api.ts b/app/javascript/flavours/glitch/api.ts index 51cbe0b695..f0663ded40 100644 --- a/app/javascript/flavours/glitch/api.ts +++ b/app/javascript/flavours/glitch/api.ts @@ -68,6 +68,7 @@ export async function apiRequest( method: Method, url: string, args: { + signal?: AbortSignal; params?: RequestParamsOrData; data?: RequestParamsOrData; timeout?: number; diff --git a/app/javascript/flavours/glitch/api/lists.ts b/app/javascript/flavours/glitch/api/lists.ts new file mode 100644 index 0000000000..64a0af01f5 --- /dev/null +++ b/app/javascript/flavours/glitch/api/lists.ts @@ -0,0 +1,32 @@ +import { + apiRequestPost, + apiRequestPut, + apiRequestGet, + apiRequestDelete, +} from 'flavours/glitch/api'; +import type { ApiAccountJSON } from 'flavours/glitch/api_types/accounts'; +import type { ApiListJSON } from 'flavours/glitch/api_types/lists'; + +export const apiCreate = (list: Partial) => + apiRequestPost('v1/lists', list); + +export const apiUpdate = (list: Partial) => + apiRequestPut(`v1/lists/${list.id}`, list); + +export const apiGetAccounts = (listId: string) => + apiRequestGet(`v1/lists/${listId}/accounts`, { + limit: 0, + }); + +export const apiGetAccountLists = (accountId: string) => + apiRequestGet(`v1/accounts/${accountId}/lists`); + +export const apiAddAccountToList = (listId: string, accountId: string) => + apiRequestPost(`v1/lists/${listId}/accounts`, { + account_ids: [accountId], + }); + +export const apiRemoveAccountFromList = (listId: string, accountId: string) => + apiRequestDelete(`v1/lists/${listId}/accounts`, { + account_ids: [accountId], + }); diff --git a/app/javascript/flavours/glitch/api_types/lists.ts b/app/javascript/flavours/glitch/api_types/lists.ts new file mode 100644 index 0000000000..6984cf9b19 --- /dev/null +++ b/app/javascript/flavours/glitch/api_types/lists.ts @@ -0,0 +1,10 @@ +// See app/serializers/rest/list_serializer.rb + +export type RepliesPolicyType = 'list' | 'followed' | 'none'; + +export interface ApiListJSON { + id: string; + title: string; + exclusive: boolean; + replies_policy: RepliesPolicyType; +} diff --git a/app/javascript/flavours/glitch/components/check_box.tsx b/app/javascript/flavours/glitch/components/check_box.tsx index 9bd137abf5..73fdb2f97b 100644 --- a/app/javascript/flavours/glitch/components/check_box.tsx +++ b/app/javascript/flavours/glitch/components/check_box.tsx @@ -7,11 +7,11 @@ import { Icon } from './icon'; interface Props { value: string; - checked: boolean; - indeterminate: boolean; - name: string; - onChange: (event: React.ChangeEvent) => void; - label: React.ReactNode; + checked?: boolean; + indeterminate?: boolean; + name?: string; + onChange?: (event: React.ChangeEvent) => void; + label?: React.ReactNode; } export const CheckBox: React.FC = ({ @@ -30,6 +30,7 @@ export const CheckBox: React.FC = ({ value={value} checked={checked} onChange={onChange} + readOnly={!onChange} /> = ({ )} - {label} + {label && {label}} ); }; diff --git a/app/javascript/flavours/glitch/components/scrollable_list.jsx b/app/javascript/flavours/glitch/components/scrollable_list.jsx index 82d32185e1..c7108c28e1 100644 --- a/app/javascript/flavours/glitch/components/scrollable_list.jsx +++ b/app/javascript/flavours/glitch/components/scrollable_list.jsx @@ -80,6 +80,7 @@ class ScrollableList extends PureComponent { children: PropTypes.node, bindToDocument: PropTypes.bool, preventScroll: PropTypes.bool, + footer: PropTypes.node, }; static defaultProps = { @@ -324,7 +325,7 @@ class ScrollableList extends PureComponent { }; render () { - const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props; + const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, footer, emptyMessage, onLoadMore } = this.props; const { fullscreen } = this.state; const childrenCount = Children.count(children); @@ -342,11 +343,13 @@ class ScrollableList extends PureComponent {
+ + {footer}
); } else if (isLoading || childrenCount > 0 || hasMore || !emptyMessage) { scrollableArea = ( -
+
{prepend} @@ -375,6 +378,8 @@ class ScrollableList extends PureComponent { {!hasMore && append}
+ + {footer}
); } else { @@ -385,6 +390,8 @@ class ScrollableList extends PureComponent {
{emptyMessage}
+ + {footer}
); } diff --git a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js index 7550196742..93f5a574b2 100644 --- a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js +++ b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js @@ -13,6 +13,13 @@ const mapStateToProps = state => ({ openedViaKeyboard: state.dropdownMenu.keyboard, }); +/** + * @param {any} dispatch + * @param {Object} root0 + * @param {any} [root0.status] + * @param {any} root0.items + * @param {any} [root0.scrollKey] + */ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({ onOpen(id, onItemClick, keyboard) { dispatch(isUserTouching() ? openModal({ diff --git a/app/javascript/flavours/glitch/features/list_adder/components/account.jsx b/app/javascript/flavours/glitch/features/list_adder/components/account.jsx deleted file mode 100644 index 94a90726e3..0000000000 --- a/app/javascript/flavours/glitch/features/list_adder/components/account.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import { injectIntl } from 'react-intl'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import { Avatar } from '../../../components/avatar'; -import { DisplayName } from '../../../components/display_name'; -import { makeGetAccount } from '../../../selectors'; - -const makeMapStateToProps = () => { - const getAccount = makeGetAccount(); - - const mapStateToProps = (state, { accountId }) => ({ - account: getAccount(state, accountId), - }); - - return mapStateToProps; -}; - -class Account extends ImmutablePureComponent { - - static propTypes = { - account: ImmutablePropTypes.record.isRequired, - }; - - render () { - const { account } = this.props; - return ( -
-
-
-
- -
-
-
- ); - } - -} - -export default connect(makeMapStateToProps)(injectIntl(Account)); diff --git a/app/javascript/flavours/glitch/features/list_adder/components/list.jsx b/app/javascript/flavours/glitch/features/list_adder/components/list.jsx deleted file mode 100644 index e91c8e35bd..0000000000 --- a/app/javascript/flavours/glitch/features/list_adder/components/list.jsx +++ /dev/null @@ -1,75 +0,0 @@ -import PropTypes from 'prop-types'; - -import { defineMessages, injectIntl } from 'react-intl'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import AddIcon from '@/material-icons/400-24px/add.svg?react'; -import CloseIcon from '@/material-icons/400-24px/close.svg?react'; -import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; -import { Icon } from 'flavours/glitch/components/icon'; - -import { removeFromListAdder, addToListAdder } from '../../../actions/lists'; -import { IconButton } from '../../../components/icon_button'; - -const messages = defineMessages({ - remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' }, - add: { id: 'lists.account.add', defaultMessage: 'Add to list' }, -}); - -const MapStateToProps = (state, { listId, added }) => ({ - list: state.get('lists').get(listId), - added: typeof added === 'undefined' ? state.getIn(['listAdder', 'lists', 'items']).includes(listId) : added, -}); - -const mapDispatchToProps = (dispatch, { listId }) => ({ - onRemove: () => dispatch(removeFromListAdder(listId)), - onAdd: () => dispatch(addToListAdder(listId)), -}); - -class List extends ImmutablePureComponent { - - static propTypes = { - list: ImmutablePropTypes.map.isRequired, - intl: PropTypes.object.isRequired, - onRemove: PropTypes.func.isRequired, - onAdd: PropTypes.func.isRequired, - added: PropTypes.bool, - }; - - static defaultProps = { - added: false, - }; - - render () { - const { list, intl, onRemove, onAdd, added } = this.props; - - let button; - - if (added) { - button = ; - } else { - button = ; - } - - return ( -
-
-
- - {list.get('title')} -
- -
- {button} -
-
-
- ); - } - -} - -export default connect(MapStateToProps, mapDispatchToProps)(injectIntl(List)); diff --git a/app/javascript/flavours/glitch/features/list_adder/index.jsx b/app/javascript/flavours/glitch/features/list_adder/index.jsx deleted file mode 100644 index 4e7bd46bdf..0000000000 --- a/app/javascript/flavours/glitch/features/list_adder/index.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import PropTypes from 'prop-types'; - -import { injectIntl } from 'react-intl'; - -import { createSelector } from '@reduxjs/toolkit'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { connect } from 'react-redux'; - -import { setupListAdder, resetListAdder } from '../../actions/lists'; -import NewListForm from '../lists/components/new_list_form'; - -import Account from './components/account'; -import List from './components/list'; -// hack - -const getOrderedLists = createSelector([state => state.get('lists')], lists => { - if (!lists) { - return lists; - } - - return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title'))); -}); - -const mapStateToProps = state => ({ - listIds: getOrderedLists(state).map(list=>list.get('id')), -}); - -const mapDispatchToProps = dispatch => ({ - onInitialize: accountId => dispatch(setupListAdder(accountId)), - onReset: () => dispatch(resetListAdder()), -}); - -class ListAdder extends ImmutablePureComponent { - - static propTypes = { - accountId: PropTypes.string.isRequired, - onClose: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - onInitialize: PropTypes.func.isRequired, - onReset: PropTypes.func.isRequired, - listIds: ImmutablePropTypes.list.isRequired, - }; - - componentDidMount () { - const { onInitialize, accountId } = this.props; - onInitialize(accountId); - } - - componentWillUnmount () { - const { onReset } = this.props; - onReset(); - } - - render () { - const { accountId, listIds } = this.props; - - return ( -
-
- -
- - - - -
- {listIds.map(ListId => )} -
-
- ); - } - -} - -export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(ListAdder)); diff --git a/app/javascript/flavours/glitch/features/list_adder/index.tsx b/app/javascript/flavours/glitch/features/list_adder/index.tsx new file mode 100644 index 0000000000..af52349672 --- /dev/null +++ b/app/javascript/flavours/glitch/features/list_adder/index.tsx @@ -0,0 +1,213 @@ +import { useEffect, useState, useCallback } from 'react'; + +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; + +import { isFulfilled } from '@reduxjs/toolkit'; + +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import { fetchLists } from 'flavours/glitch/actions/lists'; +import { createList } from 'flavours/glitch/actions/lists_typed'; +import { + apiGetAccountLists, + apiAddAccountToList, + apiRemoveAccountFromList, +} from 'flavours/glitch/api/lists'; +import type { ApiListJSON } from 'flavours/glitch/api_types/lists'; +import { Button } from 'flavours/glitch/components/button'; +import { CheckBox } from 'flavours/glitch/components/check_box'; +import { Icon } from 'flavours/glitch/components/icon'; +import { IconButton } from 'flavours/glitch/components/icon_button'; +import { getOrderedLists } from 'flavours/glitch/selectors/lists'; +import { useAppDispatch, useAppSelector } from 'flavours/glitch/store'; + +const messages = defineMessages({ + newList: { + id: 'lists.new_list_name', + defaultMessage: 'New list name', + }, + createList: { + id: 'lists.create', + defaultMessage: 'Create', + }, + close: { + id: 'lightbox.close', + defaultMessage: 'Close', + }, +}); + +const ListItem: React.FC<{ + id: string; + title: string; + checked: boolean; + onChange: (id: string, checked: boolean) => void; +}> = ({ id, title, checked, onChange }) => { + const handleChange = useCallback( + (e: React.ChangeEvent) => { + onChange(id, e.target.checked); + }, + [id, onChange], + ); + + return ( + // eslint-disable-next-line jsx-a11y/label-has-associated-control + + ); +}; + +const NewListItem: React.FC<{ + onCreate: (list: ApiListJSON) => void; +}> = ({ onCreate }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const [title, setTitle] = useState(''); + + const handleChange = useCallback( + ({ target: { value } }: React.ChangeEvent) => { + setTitle(value); + }, + [setTitle], + ); + + const handleSubmit = useCallback(() => { + if (title.trim().length === 0) { + return; + } + + void dispatch(createList({ title })).then((result) => { + if (isFulfilled(result)) { + onCreate(result.payload); + setTitle(''); + } + + return ''; + }); + }, [setTitle, dispatch, onCreate, title]); + + return ( +
+ + +
+ - -
-
- - -
-
- - {replies_policy !== undefined && ( -
-

- -
- { ['none', 'list', 'followed'].map(policy => ( - - ))} -
-
- )}
@@ -229,4 +178,4 @@ class ListTimeline extends PureComponent { } -export default withRouter(connect(mapStateToProps)(injectIntl(ListTimeline))); +export default withRouter(connect(mapStateToProps)(ListTimeline)); diff --git a/app/javascript/flavours/glitch/features/lists/components/new_list_form.jsx b/app/javascript/flavours/glitch/features/lists/components/new_list_form.jsx deleted file mode 100644 index 04ff85c659..0000000000 --- a/app/javascript/flavours/glitch/features/lists/components/new_list_form.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import PropTypes from 'prop-types'; -import { PureComponent } from 'react'; - -import { defineMessages, injectIntl } from 'react-intl'; - -import { connect } from 'react-redux'; - -import { changeListEditorTitle, submitListEditor } from 'flavours/glitch/actions/lists'; -import { Button } from 'flavours/glitch/components/button'; - -const messages = defineMessages({ - label: { id: 'lists.new.title_placeholder', defaultMessage: 'New list title' }, - title: { id: 'lists.new.create', defaultMessage: 'Add list' }, -}); - -const mapStateToProps = state => ({ - value: state.getIn(['listEditor', 'title']), - disabled: state.getIn(['listEditor', 'isSubmitting']), -}); - -const mapDispatchToProps = dispatch => ({ - onChange: value => dispatch(changeListEditorTitle(value)), - onSubmit: () => dispatch(submitListEditor(true)), -}); - -class NewListForm extends PureComponent { - - static propTypes = { - value: PropTypes.string.isRequired, - disabled: PropTypes.bool, - intl: PropTypes.object.isRequired, - onChange: PropTypes.func.isRequired, - onSubmit: PropTypes.func.isRequired, - }; - - handleChange = e => { - this.props.onChange(e.target.value); - }; - - handleSubmit = e => { - e.preventDefault(); - this.props.onSubmit(); - }; - - handleClick = () => { - this.props.onSubmit(); - }; - - render () { - const { value, disabled, intl } = this.props; - - const label = intl.formatMessage(messages.label); - const title = intl.formatMessage(messages.title); - - return ( -
- - -
+ + + + + ); +}; + +const AccountItem: React.FC<{ + accountId: string; + listId: string; + partOfList: boolean; + onToggle: (accountId: string) => void; +}> = ({ accountId, listId, partOfList, onToggle }) => { + const intl = useIntl(); + const account = useAppSelector((state) => state.accounts.get(accountId)); + + const handleClick = useCallback(() => { + if (partOfList) { + void apiRemoveAccountFromList(listId, accountId); + } else { + void apiAddAccountToList(listId, accountId); + } + + onToggle(accountId); + }, [accountId, listId, partOfList, onToggle]); + + if (!account) { + return null; + } + + const firstVerifiedField = account.fields.find((item) => !!item.verified_at); + + return ( +
+
+ +
+ +
+ +
+ + +
+ {' '} + {firstVerifiedField && ( + + )} +
+
+ + +
+
+
+
+ ); +}; + +const ListMembers: React.FC<{ + multiColumn?: boolean; +}> = ({ multiColumn }) => { + const dispatch = useAppDispatch(); + const { id } = useParams<{ id: string }>(); + const intl = useIntl(); + + const followingAccountIds = useAppSelector( + (state) => state.user_lists.getIn(['following', me, 'items']) as string[], + ); + const [searching, setSearching] = useState(false); + const [accountIds, setAccountIds] = useState([]); + const [searchAccountIds, setSearchAccountIds] = useState([]); + const [loading, setLoading] = useState(true); + const [mode, setMode] = useState('remove'); + + useEffect(() => { + if (id) { + setLoading(true); + dispatch(fetchList(id)); + + void apiGetAccounts(id) + .then((data) => { + dispatch(importFetchedAccounts(data)); + setAccountIds(data.map((a) => a.id)); + setLoading(false); + return ''; + }) + .catch(() => { + setLoading(false); + }); + + dispatch(fetchFollowing(me)); + } + }, [dispatch, id]); + + const handleSearchClick = useCallback(() => { + setMode('add'); + }, [setMode]); + + const handleDismissSearchClick = useCallback(() => { + setMode('remove'); + setSearching(false); + }, [setMode]); + + const handleAccountToggle = useCallback( + (accountId: string) => { + const partOfList = accountIds.includes(accountId); + + if (partOfList) { + setAccountIds(accountIds.filter((id) => id !== accountId)); + } else { + setAccountIds([accountId, ...accountIds]); + } + }, + [accountIds, setAccountIds], + ); + + const searchRequestRef = useRef(null); + + const handleSearch = useDebouncedCallback( + (value: string) => { + if (searchRequestRef.current) { + searchRequestRef.current.abort(); + } + + if (value.trim().length === 0) { + setSearching(false); + return; + } + + setLoading(true); + + searchRequestRef.current = new AbortController(); + + void apiRequest('GET', 'v1/accounts/search', { + signal: searchRequestRef.current.signal, + params: { + q: value, + resolve: false, + following: true, + }, + }) + .then((data) => { + dispatch(importFetchedAccounts(data)); + setSearchAccountIds(data.map((a) => a.id)); + setLoading(false); + setSearching(true); + return ''; + }) + .catch(() => { + setSearching(true); + setLoading(false); + }); + }, + 500, + { leading: true, trailing: true }, + ); + + let displayedAccountIds: string[]; + + if (mode === 'add') { + displayedAccountIds = searching ? searchAccountIds : followingAccountIds; + } else { + displayedAccountIds = accountIds; + } + + return ( + + {mode === 'remove' ? ( + + + + } + /> + ) : ( + + )} + + +
+ +
+ + + +
+ + ) + } + emptyMessage={ + mode === 'remove' ? ( + <> + + +
+ +
+ + + + ) : ( + + ) + } + > + {displayedAccountIds.map((accountId) => ( + + ))} + + + + {intl.formatMessage(messages.heading)} + + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export default ListMembers; diff --git a/app/javascript/flavours/glitch/features/lists/new.tsx b/app/javascript/flavours/glitch/features/lists/new.tsx new file mode 100644 index 0000000000..6832b72628 --- /dev/null +++ b/app/javascript/flavours/glitch/features/lists/new.tsx @@ -0,0 +1,296 @@ +import { useCallback, useState, useEffect } from 'react'; + +import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; + +import { Helmet } from 'react-helmet'; +import { useParams, useHistory, Link } from 'react-router-dom'; + +import { isFulfilled } from '@reduxjs/toolkit'; + +import Toggle from 'react-toggle'; + +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import { fetchList } from 'flavours/glitch/actions/lists'; +import { createList, updateList } from 'flavours/glitch/actions/lists_typed'; +import { apiGetAccounts } from 'flavours/glitch/api/lists'; +import type { RepliesPolicyType } from 'flavours/glitch/api_types/lists'; +import Column from 'flavours/glitch/components/column'; +import { ColumnHeader } from 'flavours/glitch/components/column_header'; +import { LoadingIndicator } from 'flavours/glitch/components/loading_indicator'; +import { useAppDispatch, useAppSelector } from 'flavours/glitch/store'; + +const messages = defineMessages({ + edit: { id: 'column.edit_list', defaultMessage: 'Edit list' }, + create: { id: 'column.create_list', defaultMessage: 'Create list' }, +}); + +const MembersLink: React.FC<{ + id: string; +}> = ({ id }) => { + const [count, setCount] = useState(0); + const [avatars, setAvatars] = useState([]); + + useEffect(() => { + void apiGetAccounts(id) + .then((data) => { + setCount(data.length); + setAvatars(data.slice(0, 3).map((a) => a.avatar)); + return ''; + }) + .catch(() => { + // Nothing + }); + }, [id, setCount, setAvatars]); + + return ( + +
+ + + + +
+ +
+ {avatars.map((url) => ( + + ))} +
+ + ); +}; + +const NewList: React.FC<{ + multiColumn?: boolean; +}> = ({ multiColumn }) => { + const dispatch = useAppDispatch(); + const { id } = useParams<{ id?: string }>(); + const intl = useIntl(); + const history = useHistory(); + + const list = useAppSelector((state) => + id ? state.lists.get(id) : undefined, + ); + const [title, setTitle] = useState(''); + const [exclusive, setExclusive] = useState(false); + const [repliesPolicy, setRepliesPolicy] = useState('list'); + const [submitting, setSubmitting] = useState(false); + + useEffect(() => { + if (id) { + dispatch(fetchList(id)); + } + }, [dispatch, id]); + + useEffect(() => { + if (id && list) { + setTitle(list.title); + setExclusive(list.exclusive); + setRepliesPolicy(list.replies_policy); + } + }, [setTitle, setExclusive, setRepliesPolicy, id, list]); + + const handleTitleChange = useCallback( + ({ target: { value } }: React.ChangeEvent) => { + setTitle(value); + }, + [setTitle], + ); + + const handleExclusiveChange = useCallback( + ({ target: { checked } }: React.ChangeEvent) => { + setExclusive(checked); + }, + [setExclusive], + ); + + const handleRepliesPolicyChange = useCallback( + ({ target: { value } }: React.ChangeEvent) => { + setRepliesPolicy(value as RepliesPolicyType); + }, + [setRepliesPolicy], + ); + + const handleSubmit = useCallback(() => { + setSubmitting(true); + + if (id) { + void dispatch( + updateList({ + id, + title, + exclusive, + replies_policy: repliesPolicy, + }), + ).then(() => { + setSubmitting(false); + return ''; + }); + } else { + void dispatch( + createList({ + title, + exclusive, + replies_policy: repliesPolicy, + }), + ).then((result) => { + setSubmitting(false); + + if (isFulfilled(result)) { + history.replace(`/lists/${result.payload.id}/edit`); + history.push(`/lists/${result.payload.id}/members`); + } + + return ''; + }); + } + }, [history, dispatch, setSubmitting, id, title, exclusive, repliesPolicy]); + + return ( + + + +
+
+
+
+
+ + +
+ +
+
+
+
+ +
+
+
+ + +
+ +
+
+
+
+ + {id && ( +
+ +
+ )} + +
+ {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} + +
+ +
+ +
+
+
+ + + + {intl.formatMessage(id ? messages.edit : messages.create)} + + + +
+ ); +}; + +// eslint-disable-next-line import/no-default-export +export default NewList; diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx index adac4c5a5e..b437ef10eb 100644 --- a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx @@ -11,7 +11,6 @@ import { ReportModal, SettingsModal, EmbedModal, - ListEditor, ListAdder, CompareHistoryModal, FilterModal, @@ -72,7 +71,6 @@ export const MODAL_COMPONENTS = { 'DEPRECATED_SETTINGS': () => Promise.resolve({ default: DeprecatedSettingsModal }), 'ACTIONS': () => Promise.resolve({ default: ActionsModal }), 'EMBED': EmbedModal, - 'LIST_EDITOR': ListEditor, 'FOCAL_POINT': () => Promise.resolve({ default: FocalPointModal }), 'LIST_ADDER': ListAdder, 'COMPARE_HISTORY': CompareHistoryModal, diff --git a/app/javascript/flavours/glitch/features/ui/index.jsx b/app/javascript/flavours/glitch/features/ui/index.jsx index 8bf4484427..bbfc186104 100644 --- a/app/javascript/flavours/glitch/features/ui/index.jsx +++ b/app/javascript/flavours/glitch/features/ui/index.jsx @@ -62,11 +62,13 @@ import { FollowedTags, LinkTimeline, ListTimeline, + Lists, + ListEdit, + ListMembers, Blocks, DomainBlocks, Mutes, PinnedStatuses, - Lists, GettingStartedMisc, Directory, Explore, @@ -216,6 +218,9 @@ class SwitchingColumnsArea extends PureComponent { + + + diff --git a/app/javascript/flavours/glitch/features/ui/util/async-components.js b/app/javascript/flavours/glitch/features/ui/util/async-components.js index 3102877d94..b92fa2a7b4 100644 --- a/app/javascript/flavours/glitch/features/ui/util/async-components.js +++ b/app/javascript/flavours/glitch/features/ui/util/async-components.js @@ -158,10 +158,6 @@ export function EmbedModal () { return import(/* webpackChunkName: "flavours/glitch/async/embed_modal" */'../components/embed_modal'); } -export function ListEditor () { - return import(/* webpackChunkName: "flavours/glitch/async/list_editor" */'../../list_editor'); -} - export function ListAdder () { return import(/* webpackChunkName: "features/glitch/async/list_adder" */'../../list_adder'); } @@ -229,3 +225,11 @@ export function LinkTimeline () { export function AnnualReportModal () { return import(/*webpackChunkName: "flavours/glitch/async/modals/annual_report_modal" */'../components/annual_report_modal'); } + +export function ListEdit () { + return import(/*webpackChunkName: "flavours/glitch/async/lists" */'../../lists/new'); +} + +export function ListMembers () { + return import(/* webpackChunkName: "flavours/glitch/async/lists" */'../../lists/members'); +} diff --git a/app/javascript/flavours/glitch/models/list.ts b/app/javascript/flavours/glitch/models/list.ts new file mode 100644 index 0000000000..4564550903 --- /dev/null +++ b/app/javascript/flavours/glitch/models/list.ts @@ -0,0 +1,18 @@ +import type { RecordOf } from 'immutable'; +import { Record } from 'immutable'; + +import type { ApiListJSON } from 'flavours/glitch/api_types/lists'; + +type ListShape = Required; // no changes from server shape +export type List = RecordOf; + +const ListFactory = Record({ + id: '', + title: '', + exclusive: false, + replies_policy: 'list', +}); + +export function createList(attributes: Partial) { + return ListFactory(attributes); +} diff --git a/app/javascript/flavours/glitch/reducers/index.ts b/app/javascript/flavours/glitch/reducers/index.ts index 99e8b2efd0..00a61d54e2 100644 --- a/app/javascript/flavours/glitch/reducers/index.ts +++ b/app/javascript/flavours/glitch/reducers/index.ts @@ -17,9 +17,7 @@ import filters from './filters'; import followed_tags from './followed_tags'; import height_cache from './height_cache'; import history from './history'; -import listAdder from './list_adder'; -import listEditor from './list_editor'; -import lists from './lists'; +import { listsReducer } from './lists'; import local_settings from './local_settings'; import { markersReducer } from './markers'; import media_attachments from './media_attachments'; @@ -71,9 +69,7 @@ const reducers = { notificationGroups: notificationGroupsReducer, height_cache, custom_emojis, - lists, - listEditor, - listAdder, + lists: listsReducer, filters, conversations, suggestions, diff --git a/app/javascript/flavours/glitch/reducers/list_adder.js b/app/javascript/flavours/glitch/reducers/list_adder.js deleted file mode 100644 index 0f61273aa6..0000000000 --- a/app/javascript/flavours/glitch/reducers/list_adder.js +++ /dev/null @@ -1,48 +0,0 @@ -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; - -import { - LIST_ADDER_RESET, - LIST_ADDER_SETUP, - LIST_ADDER_LISTS_FETCH_REQUEST, - LIST_ADDER_LISTS_FETCH_SUCCESS, - LIST_ADDER_LISTS_FETCH_FAIL, - LIST_EDITOR_ADD_SUCCESS, - LIST_EDITOR_REMOVE_SUCCESS, -} from '../actions/lists'; - -const initialState = ImmutableMap({ - accountId: null, - - lists: ImmutableMap({ - items: ImmutableList(), - loaded: false, - isLoading: false, - }), -}); - -export default function listAdderReducer(state = initialState, action) { - switch(action.type) { - case LIST_ADDER_RESET: - return initialState; - case LIST_ADDER_SETUP: - return state.withMutations(map => { - map.set('accountId', action.account.get('id')); - }); - case LIST_ADDER_LISTS_FETCH_REQUEST: - return state.setIn(['lists', 'isLoading'], true); - case LIST_ADDER_LISTS_FETCH_FAIL: - return state.setIn(['lists', 'isLoading'], false); - case LIST_ADDER_LISTS_FETCH_SUCCESS: - return state.update('lists', lists => lists.withMutations(map => { - map.set('isLoading', false); - map.set('loaded', true); - map.set('items', ImmutableList(action.lists.map(item => item.id))); - })); - case LIST_EDITOR_ADD_SUCCESS: - return state.updateIn(['lists', 'items'], list => list.unshift(action.listId)); - case LIST_EDITOR_REMOVE_SUCCESS: - return state.updateIn(['lists', 'items'], list => list.filterNot(item => item === action.listId)); - default: - return state; - } -} diff --git a/app/javascript/flavours/glitch/reducers/list_editor.js b/app/javascript/flavours/glitch/reducers/list_editor.js deleted file mode 100644 index d3fd62adec..0000000000 --- a/app/javascript/flavours/glitch/reducers/list_editor.js +++ /dev/null @@ -1,99 +0,0 @@ -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; - -import { - LIST_CREATE_REQUEST, - LIST_CREATE_FAIL, - LIST_CREATE_SUCCESS, - LIST_UPDATE_REQUEST, - LIST_UPDATE_FAIL, - LIST_UPDATE_SUCCESS, - LIST_EDITOR_RESET, - LIST_EDITOR_SETUP, - LIST_EDITOR_TITLE_CHANGE, - LIST_ACCOUNTS_FETCH_REQUEST, - LIST_ACCOUNTS_FETCH_SUCCESS, - LIST_ACCOUNTS_FETCH_FAIL, - LIST_EDITOR_SUGGESTIONS_READY, - LIST_EDITOR_SUGGESTIONS_CLEAR, - LIST_EDITOR_SUGGESTIONS_CHANGE, - LIST_EDITOR_ADD_SUCCESS, - LIST_EDITOR_REMOVE_SUCCESS, -} from '../actions/lists'; - -const initialState = ImmutableMap({ - listId: null, - isSubmitting: false, - isChanged: false, - title: '', - isExclusive: false, - - accounts: ImmutableMap({ - items: ImmutableList(), - loaded: false, - isLoading: false, - }), - - suggestions: ImmutableMap({ - value: '', - items: ImmutableList(), - }), -}); - -export default function listEditorReducer(state = initialState, action) { - switch(action.type) { - case LIST_EDITOR_RESET: - return initialState; - case LIST_EDITOR_SETUP: - return state.withMutations(map => { - map.set('listId', action.list.get('id')); - map.set('title', action.list.get('title')); - map.set('isExclusive', action.list.get('is_exclusive')); - map.set('isSubmitting', false); - }); - case LIST_EDITOR_TITLE_CHANGE: - return state.withMutations(map => { - map.set('title', action.value); - map.set('isChanged', true); - }); - case LIST_CREATE_REQUEST: - case LIST_UPDATE_REQUEST: - return state.withMutations(map => { - map.set('isSubmitting', true); - map.set('isChanged', false); - }); - case LIST_CREATE_FAIL: - case LIST_UPDATE_FAIL: - return state.set('isSubmitting', false); - case LIST_CREATE_SUCCESS: - case LIST_UPDATE_SUCCESS: - return state.withMutations(map => { - map.set('isSubmitting', false); - map.set('listId', action.list.id); - }); - case LIST_ACCOUNTS_FETCH_REQUEST: - return state.setIn(['accounts', 'isLoading'], true); - case LIST_ACCOUNTS_FETCH_FAIL: - return state.setIn(['accounts', 'isLoading'], false); - case LIST_ACCOUNTS_FETCH_SUCCESS: - return state.update('accounts', accounts => accounts.withMutations(map => { - map.set('isLoading', false); - map.set('loaded', true); - map.set('items', ImmutableList(action.accounts.map(item => item.id))); - })); - case LIST_EDITOR_SUGGESTIONS_CHANGE: - return state.setIn(['suggestions', 'value'], action.value); - case LIST_EDITOR_SUGGESTIONS_READY: - return state.setIn(['suggestions', 'items'], ImmutableList(action.accounts.map(item => item.id))); - case LIST_EDITOR_SUGGESTIONS_CLEAR: - return state.update('suggestions', suggestions => suggestions.withMutations(map => { - map.set('items', ImmutableList()); - map.set('value', ''); - })); - case LIST_EDITOR_ADD_SUCCESS: - return state.updateIn(['accounts', 'items'], list => list.unshift(action.accountId)); - case LIST_EDITOR_REMOVE_SUCCESS: - return state.updateIn(['accounts', 'items'], list => list.filterNot(item => item === action.accountId)); - default: - return state; - } -} diff --git a/app/javascript/flavours/glitch/reducers/lists.js b/app/javascript/flavours/glitch/reducers/lists.js deleted file mode 100644 index 2a797772b3..0000000000 --- a/app/javascript/flavours/glitch/reducers/lists.js +++ /dev/null @@ -1,38 +0,0 @@ -import { Map as ImmutableMap, fromJS } from 'immutable'; - -import { - LIST_FETCH_SUCCESS, - LIST_FETCH_FAIL, - LISTS_FETCH_SUCCESS, - LIST_CREATE_SUCCESS, - LIST_UPDATE_SUCCESS, - LIST_DELETE_SUCCESS, -} from '../actions/lists'; - -const initialState = ImmutableMap(); - -const normalizeList = (state, list) => state.set(list.id, fromJS(list)); - -const normalizeLists = (state, lists) => { - lists.forEach(list => { - state = normalizeList(state, list); - }); - - return state; -}; - -export default function lists(state = initialState, action) { - switch(action.type) { - case LIST_FETCH_SUCCESS: - case LIST_CREATE_SUCCESS: - case LIST_UPDATE_SUCCESS: - return normalizeList(state, action.list); - case LISTS_FETCH_SUCCESS: - return normalizeLists(state, action.lists); - case LIST_DELETE_SUCCESS: - case LIST_FETCH_FAIL: - return state.set(action.id, false); - default: - return state; - } -} diff --git a/app/javascript/flavours/glitch/reducers/lists.ts b/app/javascript/flavours/glitch/reducers/lists.ts new file mode 100644 index 0000000000..a3e2ea7196 --- /dev/null +++ b/app/javascript/flavours/glitch/reducers/lists.ts @@ -0,0 +1,49 @@ +import type { Reducer } from '@reduxjs/toolkit'; +import { Map as ImmutableMap } from 'immutable'; + +import { createList, updateList } from 'flavours/glitch/actions/lists_typed'; +import type { ApiListJSON } from 'flavours/glitch/api_types/lists'; +import { createList as createListFromJSON } from 'flavours/glitch/models/list'; +import type { List } from 'flavours/glitch/models/list'; + +import { + LIST_FETCH_SUCCESS, + LIST_FETCH_FAIL, + LISTS_FETCH_SUCCESS, + LIST_DELETE_SUCCESS, +} from '../actions/lists'; + +const initialState = ImmutableMap(); +type State = typeof initialState; + +const normalizeList = (state: State, list: ApiListJSON) => + state.set(list.id, createListFromJSON(list)); + +const normalizeLists = (state: State, lists: ApiListJSON[]) => { + lists.forEach((list) => { + state = normalizeList(state, list); + }); + + return state; +}; + +export const listsReducer: Reducer = (state = initialState, action) => { + if ( + createList.fulfilled.match(action) || + updateList.fulfilled.match(action) + ) { + return normalizeList(state, action.payload); + } else { + switch (action.type) { + case LIST_FETCH_SUCCESS: + return normalizeList(state, action.list as ApiListJSON); + case LISTS_FETCH_SUCCESS: + return normalizeLists(state, action.lists as ApiListJSON[]); + case LIST_DELETE_SUCCESS: + case LIST_FETCH_FAIL: + return state.set(action.id as string, null); + default: + return state; + } + } +}; diff --git a/app/javascript/flavours/glitch/selectors/lists.ts b/app/javascript/flavours/glitch/selectors/lists.ts new file mode 100644 index 0000000000..68755a45d1 --- /dev/null +++ b/app/javascript/flavours/glitch/selectors/lists.ts @@ -0,0 +1,15 @@ +import { createSelector } from '@reduxjs/toolkit'; +import type { Map as ImmutableMap } from 'immutable'; + +import type { List } from 'flavours/glitch/models/list'; +import type { RootState } from 'flavours/glitch/store'; + +export const getOrderedLists = createSelector( + [(state: RootState) => state.lists], + (lists: ImmutableMap) => + lists + .toList() + .filter((item: List | null) => !!item) + .sort((a: List, b: List) => a.title.localeCompare(b.title)) + .toArray(), +); diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss index b07c65c16b..c7134d318b 100644 --- a/app/javascript/flavours/glitch/styles/admin.scss +++ b/app/javascript/flavours/glitch/styles/admin.scss @@ -630,16 +630,6 @@ body, max-width: 100%; } -.simple_form { - .actions { - margin-top: 15px; - } - - .button { - font-size: 15px; - } -} - .batch-form-box { display: flex; flex-wrap: wrap; diff --git a/app/javascript/flavours/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss index f35f5702b4..8e26bb9fed 100644 --- a/app/javascript/flavours/glitch/styles/components.scss +++ b/app/javascript/flavours/glitch/styles/components.scss @@ -4991,6 +4991,7 @@ a.status-card { border: 0; background: transparent; cursor: pointer; + text-decoration: none; .icon { width: 13px; @@ -5408,7 +5409,8 @@ a.status-card { color: $dark-text-color; text-align: center; padding: 20px; - font-size: 15px; + font-size: 14px; + line-height: 20px; font-weight: 400; cursor: default; display: flex; @@ -5430,6 +5432,17 @@ a.status-card { } } +.empty-column-indicator { + &__arrow { + position: absolute; + top: 50%; + inset-inline-start: 50%; + pointer-events: none; + transform: translate(100%, -100%) rotate(12deg); + transform-origin: center; + } +} + .follow_requests-unlocked_explanation { background: var(--surface-background-color); border-bottom: 1px solid var(--background-border-color); @@ -6233,7 +6246,7 @@ a.status-card { .modal-root { position: relative; - z-index: 9999; + z-index: 9998; } .modal-root__overlay { @@ -6838,12 +6851,14 @@ a.status-card { border-radius: 16px; &__header { + box-sizing: border-box; border-bottom: 1px solid var(--modal-border-color); display: flex; align-items: center; justify-content: space-between; flex-direction: row-reverse; padding: 12px 24px; + min-height: 61px; &__title { font-size: 16px; @@ -8521,92 +8536,6 @@ noscript { background: rgba($base-overlay-background, 0.5); } -.list-adder, -.list-editor { - backdrop-filter: var(--background-filter); - background: var(--modal-background-color); - border: 1px solid var(--modal-border-color); - flex-direction: column; - border-radius: 8px; - width: 380px; - overflow: hidden; - - @media screen and (width <= 420px) { - width: 90%; - } -} - -.list-adder { - &__lists { - height: 50vh; - border-radius: 0 0 8px 8px; - overflow-y: auto; - } - - .list { - padding: 10px; - border-bottom: 1px solid var(--background-border-color); - } - - .list__wrapper { - display: flex; - } - - .list__display-name { - flex: 1 1 auto; - overflow: hidden; - text-decoration: none; - font-size: 16px; - padding: 10px; - display: flex; - align-items: center; - gap: 4px; - } -} - -.list-editor { - h4 { - padding: 15px 0; - background: lighten($ui-base-color, 13%); - font-weight: 500; - font-size: 16px; - text-align: center; - border-radius: 8px 8px 0 0; - } - - .drawer__pager { - height: 50vh; - border: 0; - } - - .drawer__inner { - &.backdrop { - width: calc(100% - 60px); - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); - border-radius: 0 0 0 8px; - } - } - - &__accounts { - background: unset; - overflow-y: auto; - } - - .account__display-name { - &:hover strong { - text-decoration: none; - } - } - - .account__avatar { - cursor: default; - } - - .search { - margin-bottom: 0; - } -} - .focal-point { position: relative; cursor: move; @@ -10677,7 +10606,7 @@ noscript { position: fixed; bottom: 2rem; inset-inline-start: 0; - z-index: 999; + z-index: 9999; display: flex; flex-direction: column; gap: 4px; @@ -11686,3 +11615,87 @@ noscript { height: 20px; } } + +.lists__item { + display: flex; + align-items: center; + gap: 16px; + padding-inline-end: 13px; + border-bottom: 1px solid var(--background-border-color); + + &__title { + display: flex; + align-items: center; + gap: 5px; + padding: 16px 13px; + flex: 1 1 auto; + font-size: 16px; + line-height: 24px; + color: $secondary-text-color; + text-decoration: none; + + &:is(a):hover, + &:is(a):focus, + &:is(a):active { + color: $primary-text-color; + } + + input { + display: block; + width: 100%; + background: transparent; + border: 0; + padding: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; + + &::placeholder { + color: var(--input-placeholder-color); + opacity: 1; + } + + &:focus { + outline: 0; + } + } + } +} + +.column-search-header { + display: flex; + border-radius: 4px 4px 0 0; + border: 1px solid var(--background-border-color); + + .column-header__back-button.compact { + flex: 0 0 auto; + color: $primary-text-color; + } + + input { + background: transparent; + border: 0; + color: $primary-text-color; + font-size: 16px; + display: block; + flex: 1 1 auto; + + &::placeholder { + color: var(--input-placeholder-color); + opacity: 1; + } + + &:focus { + outline: 0; + } + } +} + +.column-footer { + padding: 16px; +} + +.lists-scrollable { + min-height: 50vh; +} diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index 352567d093..be66c24976 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -1256,6 +1256,8 @@ code { } .app-form { + padding: 20px; + &__avatar-input, &__header-input { display: block; @@ -1371,4 +1373,55 @@ code { padding-inline-start: 16px; } } + + &__link { + display: flex; + gap: 16px; + padding: 8px 0; + align-items: center; + text-decoration: none; + color: $primary-text-color; + margin-bottom: 16px; + + &__text { + flex: 1 1 auto; + font-size: 14px; + line-height: 20px; + color: $darker-text-color; + + strong { + font-weight: 600; + display: block; + color: $primary-text-color; + } + } + } +} + +.avatar-pile { + display: flex; + align-items: center; + + img { + display: block; + border-radius: 8px; + width: 32px; + height: 32px; + border: 2px solid var(--background-color); + background: var(--surface-background-color); + margin-inline-end: -16px; + transform: rotate(0); + + &:first-child { + transform: rotate(-4deg); + } + + &:nth-child(2) { + transform: rotate(-2deg); + } + + &:last-child { + margin-inline-end: 0; + } + } } diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss b/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss index 777c622ace..2d5e1b1094 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss @@ -79,4 +79,5 @@ body { --rich-text-container-color: rgba(255, 216, 231, 100%); --rich-text-text-color: rgba(114, 47, 83, 100%); --rich-text-decorations-color: rgba(255, 175, 212, 100%); + --input-placeholder-color: #{transparentize($dark-text-color, 0.5)}; } diff --git a/app/javascript/flavours/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss index 0b3bb73fe1..2114543f9f 100644 --- a/app/javascript/flavours/glitch/styles/variables.scss +++ b/app/javascript/flavours/glitch/styles/variables.scss @@ -125,4 +125,5 @@ $dismiss-overlay-width: 4rem; --rich-text-container-color: rgba(87, 24, 60, 100%); --rich-text-text-color: rgba(255, 175, 212, 100%); --rich-text-decorations-color: rgba(128, 58, 95, 100%); + --input-placeholder-color: #{$dark-text-color}; }