diff --git a/app/javascript/mastodon/api.ts b/app/javascript/mastodon/api.ts index 2af29c783e..39617d82fe 100644 --- a/app/javascript/mastodon/api.ts +++ b/app/javascript/mastodon/api.ts @@ -179,3 +179,10 @@ export async function apiRequestDelete< >(url: ApiUrl, params?: RequestParamsOrData) { return apiRequest('DELETE', url, { params }); } + +export async function apiRequestPatch( + url: ApiUrl, + data?: RequestParamsOrData, +) { + return apiRequest('PATCH', url, { data }); +} diff --git a/app/javascript/mastodon/api/accounts.ts b/app/javascript/mastodon/api/accounts.ts index 9c35d619a4..da4b0e94f8 100644 --- a/app/javascript/mastodon/api/accounts.ts +++ b/app/javascript/mastodon/api/accounts.ts @@ -1,4 +1,9 @@ -import { apiRequestPost, apiRequestGet, apiRequestDelete } from 'mastodon/api'; +import { + apiRequestPost, + apiRequestGet, + apiRequestDelete, + apiRequestPatch, +} from 'mastodon/api'; import type { ApiAccountJSON, ApiFamiliarFollowersJSON, @@ -9,6 +14,11 @@ import type { ApiHashtagJSON, } from 'mastodon/api_types/tags'; +import type { + ApiProfileJSON, + ApiProfileUpdateParams, +} from '../api_types/profile'; + export const apiSubmitAccountNote = (id: string, value: string) => apiRequestPost(`v1/accounts/${id}/note`, { comment: value, @@ -54,3 +64,8 @@ export const apiGetFamiliarFollowers = (id: string) => apiRequestGet('v1/accounts/familiar_followers', { id, }); + +export const apiGetProfile = () => apiRequestGet('v1/profile'); + +export const apiPatchProfile = (params: ApiProfileUpdateParams) => + apiRequestPatch('v1/profile', params); diff --git a/app/javascript/mastodon/api_types/profile.ts b/app/javascript/mastodon/api_types/profile.ts new file mode 100644 index 0000000000..7968f008ed --- /dev/null +++ b/app/javascript/mastodon/api_types/profile.ts @@ -0,0 +1,42 @@ +import type { ApiAccountFieldJSON } from './accounts'; + +export interface ApiProfileJSON { + id: string; + display_name: string; + note: string; + fields: ApiAccountFieldJSON[]; + avatar: string; + avatar_static: string; + avatar_description: string; + header: string; + header_static: string; + header_description: string; + locked: boolean; + bot: boolean; + hide_collections: boolean; + discoverable: boolean; + indexable: boolean; + show_media: boolean; + show_media_replies: boolean; + show_featured: boolean; + attribution_domains: string[]; +} + +export type ApiProfileUpdateParams = Partial< + Pick< + ApiProfileJSON, + | 'display_name' + | 'note' + | 'locked' + | 'bot' + | 'hide_collections' + | 'discoverable' + | 'indexable' + | 'show_media' + | 'show_media_replies' + | 'show_featured' + > +> & { + attribution_domains?: string[]; + fields_attributes?: Pick[]; +}; diff --git a/app/javascript/mastodon/features/account_edit/components/bio_modal.tsx b/app/javascript/mastodon/features/account_edit/components/bio_modal.tsx index fbc74e769b..3391bd7290 100644 --- a/app/javascript/mastodon/features/account_edit/components/bio_modal.tsx +++ b/app/javascript/mastodon/features/account_edit/components/bio_modal.tsx @@ -4,12 +4,11 @@ import type { ChangeEventHandler, FC } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { TextArea } from '@/mastodon/components/form_fields'; -import { LoadingIndicator } from '@/mastodon/components/loading_indicator'; import { insertEmojiAtPosition } from '@/mastodon/features/emoji/utils'; import type { BaseConfirmationModalProps } from '@/mastodon/features/ui/components/confirmation_modals'; import { ConfirmationModal } from '@/mastodon/features/ui/components/confirmation_modals'; -import { useAccount } from '@/mastodon/hooks/useAccount'; -import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; +import { patchProfile } from '@/mastodon/reducers/slices/profile_edit'; +import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import classes from '../styles.module.scss'; @@ -38,10 +37,11 @@ export const BioModal: FC = ({ onClose }) => { const titleId = useId(); const counterId = useId(); const textAreaRef = useRef(null); - const accountId = useCurrentAccountId(); - const account = useAccount(accountId); - const [newBio, setNewBio] = useState(account?.note_plain ?? ''); + const { profile: { bio } = {}, isPending } = useAppSelector( + (state) => state.profileEdit, + ); + const [newBio, setNewBio] = useState(bio ?? ''); const handleChange: ChangeEventHandler = useCallback( (event) => { setNewBio(event.currentTarget.value); @@ -55,19 +55,22 @@ export const BioModal: FC = ({ onClose }) => { }); }, []); - if (!account) { - return ; - } + const dispatch = useAppDispatch(); + const handleSave = useCallback(() => { + if (!isPending) { + void dispatch(patchProfile({ note: newBio })).then(onClose); + } + }, [dispatch, isPending, newBio, onClose]); return ( MAX_BIO_LENGTH} noFocusButton >
diff --git a/app/javascript/mastodon/features/account_edit/components/name_modal.tsx b/app/javascript/mastodon/features/account_edit/components/name_modal.tsx index 0b38419b6f..c7f533bba2 100644 --- a/app/javascript/mastodon/features/account_edit/components/name_modal.tsx +++ b/app/javascript/mastodon/features/account_edit/components/name_modal.tsx @@ -7,8 +7,8 @@ import { TextInput } from '@/mastodon/components/form_fields'; import { insertEmojiAtPosition } from '@/mastodon/features/emoji/utils'; import type { BaseConfirmationModalProps } from '@/mastodon/features/ui/components/confirmation_modals'; import { ConfirmationModal } from '@/mastodon/features/ui/components/confirmation_modals'; -import { useAccount } from '@/mastodon/hooks/useAccount'; -import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; +import { patchProfile } from '@/mastodon/reducers/slices/profile_edit'; +import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import classes from '../styles.module.scss'; @@ -37,10 +37,11 @@ export const NameModal: FC = ({ onClose }) => { const titleId = useId(); const counterId = useId(); const inputRef = useRef(null); - const accountId = useCurrentAccountId(); - const account = useAccount(accountId); - const [newName, setNewName] = useState(account?.display_name ?? ''); + const { profile: { displayName } = {}, isPending } = useAppSelector( + (state) => state.profileEdit, + ); + const [newName, setNewName] = useState(displayName ?? ''); const handleChange: ChangeEventHandler = useCallback( (event) => { setNewName(event.currentTarget.value); @@ -54,13 +55,22 @@ export const NameModal: FC = ({ onClose }) => { }); }, []); + const dispatch = useAppDispatch(); + const handleSave = useCallback(() => { + if (!isPending) { + void dispatch(patchProfile({ display_name: newName })).then(onClose); + } + }, [dispatch, isPending, newName, onClose]); + return ( MAX_NAME_LENGTH} noCloseOnConfirm noFocusButton > diff --git a/app/javascript/mastodon/features/account_edit/featured_tags.tsx b/app/javascript/mastodon/features/account_edit/featured_tags.tsx index eaea7a2205..4095707a26 100644 --- a/app/javascript/mastodon/features/account_edit/featured_tags.tsx +++ b/app/javascript/mastodon/features/account_edit/featured_tags.tsx @@ -14,7 +14,11 @@ import { fetchFeaturedTags, fetchSuggestedTags, } from '@/mastodon/reducers/slices/profile_edit'; -import { useAppDispatch, useAppSelector } from '@/mastodon/store'; +import { + createAppSelector, + useAppDispatch, + useAppSelector, +} from '@/mastodon/store'; import { AccountEditColumn, AccountEditEmptyColumn } from './components/column'; import { AccountEditItemList } from './components/item_list'; @@ -28,14 +32,23 @@ const messages = defineMessages({ }, }); +const selectTags = createAppSelector( + [(state) => state.profileEdit], + (profileEdit) => ({ + tags: profileEdit.tags ?? [], + tagSuggestions: profileEdit.tagSuggestions ?? [], + isLoading: !profileEdit.tags || !profileEdit.tagSuggestions, + isPending: profileEdit.isPending, + }), +); + export const AccountEditFeaturedTags: FC = () => { const accountId = useCurrentAccountId(); const account = useAccount(accountId); const intl = useIntl(); - const { tags, tagSuggestions, isLoading, isPending } = useAppSelector( - (state) => state.profileEdit, - ); + const { tags, tagSuggestions, isLoading, isPending } = + useAppSelector(selectTags); const dispatch = useAppDispatch(); useEffect(() => { diff --git a/app/javascript/mastodon/features/account_edit/index.tsx b/app/javascript/mastodon/features/account_edit/index.tsx index 2673c5363f..c8bc93f15f 100644 --- a/app/javascript/mastodon/features/account_edit/index.tsx +++ b/app/javascript/mastodon/features/account_edit/index.tsx @@ -7,13 +7,17 @@ import { useHistory } from 'react-router-dom'; import type { ModalType } from '@/mastodon/actions/modal'; import { openModal } from '@/mastodon/actions/modal'; -import { AccountBio } from '@/mastodon/components/account_bio'; import { Avatar } from '@/mastodon/components/avatar'; -import { DisplayNameSimple } from '@/mastodon/components/display_name/simple'; +import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; +import { EmojiHTML } from '@/mastodon/components/emoji/html'; +import { useElementHandledLink } from '@/mastodon/components/status/handled_link'; import { useAccount } from '@/mastodon/hooks/useAccount'; import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; import { autoPlayGif } from '@/mastodon/initial_state'; -import { fetchFeaturedTags } from '@/mastodon/reducers/slices/profile_edit'; +import { + fetchFeaturedTags, + fetchProfile, +} from '@/mastodon/reducers/slices/profile_edit'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import { AccountEditColumn, AccountEditEmptyColumn } from './components/column'; @@ -82,11 +86,10 @@ export const AccountEdit: FC = () => { const dispatch = useAppDispatch(); - const { tags: featuredTags, isLoading: isTagsLoading } = useAppSelector( - (state) => state.profileEdit, - ); + const { profile, tags = [] } = useAppSelector((state) => state.profileEdit); useEffect(() => { void dispatch(fetchFeaturedTags()); + void dispatch(fetchProfile()); }, [dispatch]); const handleOpenModal = useCallback( @@ -107,14 +110,20 @@ export const AccountEdit: FC = () => { history.push('/profile/featured_tags'); }, [history]); - if (!accountId || !account) { + // Normally we would use the account emoji, but we want all custom emojis to be available to render after editing. + const emojis = useAppSelector((state) => state.custom_emojis); + const htmlHandlers = useElementHandledLink({ + hashtagAccountId: profile?.id, + }); + + if (!accountId || !account || !profile) { return ; } - const headerSrc = autoPlayGif ? account.header : account.header_static; - const hasName = !!account.display_name; - const hasBio = !!account.note_plain; - const hasTags = !isTagsLoading && featuredTags.length > 0; + const headerSrc = autoPlayGif ? profile.header : profile.headerStatic; + const hasName = !!profile.displayName; + const hasBio = !!profile.bio; + const hasTags = tags.length > 0; return ( { - - } - > - - + + + } + > + + - - } - > - - + + } + > + + - + - - } - > - {featuredTags.map((tag) => `#${tag.name}`).join(', ')} - + + } + > + {tags.map((tag) => `#${tag.name}`).join(', ')} + - + + ); }; diff --git a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss b/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss index aad78f1e08..d4ea2d7a7d 100644 --- a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss +++ b/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss @@ -262,6 +262,11 @@ svg.badgeIcon { } } } + + // See: https://stackoverflow.com/questions/13226296/is-scrollwidth-property-of-a-span-not-working-on-chrome + [data-contents] { + display: inline-block; + } } .fieldVerified { diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 45ac2b50fc..5e20ae1b08 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -13,7 +13,6 @@ "about.not_available": "Дадзеная інфармацыя не дасяжная на гэтым серверы.", "about.powered_by": "Дэцэнтралізаваная сацыяльная сетка, створаная {mastodon}", "about.rules": "Правілы сервера", - "account.about": "Пра сябе", "account.account_note_header": "Асабістая нататка", "account.activity": "Актыўнасць", "account.add_note": "Дадаць асабістую нататку", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Мае сярод падпісчыкаў {name1} і {name2}", "account.featured": "Рэкамендаванае", "account.featured.accounts": "Профілі", + "account.featured.collections": "Калекцыі", "account.featured.hashtags": "Хэштэгі", "account.featured_tags.last_status_at": "Апошні допіс ад {date}", "account.featured_tags.last_status_never": "Няма допісаў", + "account.field_overflow": "Паказаць усё змесціва", "account.filters.all": "Уся актыўнасць", "account.filters.boosts_toggle": "Паказваць пашырэнні", "account.filters.posts_boosts": "Допісы і пашырэнні", @@ -141,8 +142,33 @@ "account.unmute": "Не ігнараваць @{name}", "account.unmute_notifications_short": "Апавяшчаць", "account.unmute_short": "Не ігнараваць", + "account_edit.bio.placeholder": "Коратка апішыце сябе, каб дапамагчы іншым пазнаць Вас.", + "account_edit.bio.title": "Хто я", + "account_edit.bio_modal.add_title": "Апісаць сябе", + "account_edit.bio_modal.edit_title": "Змяніць апісанне", + "account_edit.button.add": "Дадаць {item}", + "account_edit.button.delete": "Выдаліць {item}", + "account_edit.button.edit": "Змяніць {item}", + "account_edit.char_counter": "{currentLength}/{maxLength} сімвалаў", "account_edit.column_button": "Гатова", "account_edit.column_title": "Рэдагаваць профіль", + "account_edit.custom_fields.placeholder": "Дадайце свае займеннікі, знешнія спасылкі ці нешта іншае, чым Вы хацелі б падзяліцца.", + "account_edit.custom_fields.title": "Карыстальніцкія палі", + "account_edit.display_name.placeholder": "Вашае бачнае імя — гэта імя, якое іншыя людзі бачаць у Вашым профілі і ў стужках.", + "account_edit.display_name.title": "Бачнае імя", + "account_edit.featured_hashtags.item": "хэштэгі", + "account_edit.featured_hashtags.placeholder": "Дапамажыце іншым зразумець, якія тэмы Вас цікавяць, і атрымаць доступ да іх.", + "account_edit.featured_hashtags.title": "Выбраныя хэштэгі", + "account_edit.name_modal.add_title": "Дадаць бачнае імя", + "account_edit.name_modal.edit_title": "Змяніць бачнае імя", + "account_edit.profile_tab.subtitle": "Змяняйце на свой густ укладкі свайго профілю і тое, што яны паказваюць.", + "account_edit.profile_tab.title": "Налады ўкладкі профілю", + "account_edit.save": "Захаваць", + "account_edit_tags.column_title": "Змяніць выбраныя хэштэгі", + "account_edit_tags.help_text": "Выбраныя хэштэгі дапамагаюць карыстальнікам знаходзіць Ваш профіль і ўзаемадзейнічаць з ім. Яны дзейнічаюць як фільтры пры праглядзе актыўнасці на Вашай старонцы.", + "account_edit_tags.search_placeholder": "Увядзіце хэштэг…", + "account_edit_tags.suggestions": "Прапановы:", + "account_edit_tags.tag_status_count": "{count, plural, one {допіс} few {допісы} many {допісаў} other {допісаў}}", "account_note.placeholder": "Націсніце, каб дадаць нататку", "admin.dashboard.daily_retention": "Штодзённы паказчык утрымання карыстальнікаў пасля рэгістрацыі", "admin.dashboard.monthly_retention": "Штомесячны паказчык утрымання карыстальнікаў пасля рэгістрацыі", @@ -267,21 +293,27 @@ "collections.detail.curated_by_you": "Курыруеце Вы", "collections.detail.loading": "Загружаецца калекцыя…", "collections.detail.share": "Падзяліцца гэтай калекцыяй", + "collections.edit_details": "Рэдагаваць падрабязнасці", "collections.error_loading_collections": "Адбылася памылка падчас загрузкі Вашых калекцый.", "collections.hints.accounts_counter": "{count} / {max} уліковых запісаў", "collections.hints.add_more_accounts": "Дадайце як мінімум {count, plural, one {# уліковы запіс} few{# ўліковыя запісы} other {# уліковых запісаў}}, каб працягнуць", "collections.hints.can_not_remove_more_accounts": "У калекцыі мусіць быць як мінімум {count, plural, one {# уліковы запіс} few{# ўліковыя запісы} other {# уліковых запісаў}}. Немагчыма прыбраць больш уліковых запісаў.", "collections.last_updated_at": "Апошняе абнаўленне: {date}", "collections.manage_accounts": "Кіраванне ўліковымі запісамі", - "collections.mark_as_sensitive": "Пазначыць як далікатную", + "collections.mark_as_sensitive": "Пазначыць як адчувальную", "collections.mark_as_sensitive_hint": "Схаваць апісанне калекцыі і ўліковыя запісы за банерам з папярэджаннем. Назва калекцыі застанецца бачнай.", + "collections.name_length_hint": "Максімум 40 сімвалаў", "collections.new_collection": "Новая калекцыя", "collections.no_collections_yet": "Пакуль няма калекцый.", + "collections.old_last_post_note": "Апошні допіс быў больш за тыдзень таму", "collections.remove_account": "Прыбраць гэты ўліковы запіс", + "collections.report_collection": "Паскардзіцца на гэту калекцыю", "collections.search_accounts_label": "Шукайце ўліковыя запісы, каб дадаць іх сюды…", "collections.search_accounts_max_reached": "Вы дадалі максімальную колькасць уліковых запісаў", + "collections.sensitive": "Адчувальная", "collections.topic_hint": "Дадайце хэштэг, які дапаможа іншым зразумець галоўную тэму гэтай калекцыі.", "collections.view_collection": "Глядзець калекцыю", + "collections.view_other_collections_by_user": "Паглядзець іншыя калекцыі гэтага карыстальніка", "collections.visibility_public": "Публічная", "collections.visibility_public_hint": "Можна знайсці ў пошуку і іншых месцах, дзе з'яўляюцца рэкамендацыі.", "collections.visibility_title": "Бачнасць", @@ -370,6 +402,9 @@ "confirmations.discard_draft.post.title": "Скасаваць чарнавік?", "confirmations.discard_edit_media.confirm": "Адмяніць", "confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", + "confirmations.follow_to_collection.confirm": "Падпісацца і дадаць у калекцыю", + "confirmations.follow_to_collection.message": "Вам трэба падпісацца на {name}, каб дадаць яго/яе ў калекцыю.", + "confirmations.follow_to_collection.title": "Падпісацца на ўліковы запіс?", "confirmations.follow_to_list.confirm": "Падпісацца і дадаць у спіс", "confirmations.follow_to_list.message": "Вам трэба падпісацца на {name}, каб дадаць яго/яе ў спіс.", "confirmations.follow_to_list.title": "Падпісацца на карыстальніка?", @@ -464,8 +499,6 @@ "emoji_button.search_results": "Вынікі пошуку", "emoji_button.symbols": "Сімвалы", "emoji_button.travel": "Падарожжы і месцы", - "empty_column.account_about.me": "Вы пакуль не дадалі аніякай інфармацыі пра сябе.", - "empty_column.account_about.other": "{acct} пакуль не дадаў(-ла) аніякай інфармацыі пра сябе.", "empty_column.account_featured.me": "Вы яшчэ нічога не паказалі. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якімі найбольш карыстаецеся, і нават профілі сваіх сяброў?", "empty_column.account_featured.other": "{acct} яшчэ нічога не паказаў. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якімі найбольш карыстаецеся, і нават профілі сваіх сяброў?", "empty_column.account_featured_other.unknown": "Гэты ўліковы запіс яшчэ нічога не паказаў.", @@ -771,9 +804,9 @@ "notification.moderation_warning": "Вы атрымалі папярэджанне ад мадэратараў", "notification.moderation_warning.action_delete_statuses": "Некаторыя Вашыя допісы былі выдаленыя.", "notification.moderation_warning.action_disable": "Ваш уліковы запіс быў адключаны.", - "notification.moderation_warning.action_mark_statuses_as_sensitive": "Некаторыя з вашых допісаў былі пазначаныя як далікатныя.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Некаторыя з вашых допісаў былі пазначаныя як адчувальныя.", "notification.moderation_warning.action_none": "Ваш уліковы запіс атрымаў папярэджанне ад мадэратараў.", - "notification.moderation_warning.action_sensitive": "З гэтага моманту вашыя допісы будуць пазначаныя як далікатныя.", + "notification.moderation_warning.action_sensitive": "З гэтага моманту вашыя допісы будуць пазначаныя як адчувальныя.", "notification.moderation_warning.action_silence": "Ваш уліковы запіс быў абмежаваны.", "notification.moderation_warning.action_suspend": "Ваш уліковы запіс быў заблакіраваны.", "notification.own_poll": "Ваша апытанне скончылася", @@ -944,6 +977,7 @@ "report.category.title_account": "профіль", "report.category.title_status": "допіс", "report.close": "Гатова", + "report.collection_comment": "Чаму Вы хочаце паскардзіцца на гэту калекцыю?", "report.comment.title": "Што-небудзь яшчэ, што нам неабходна ведаць?", "report.forward": "Пераслаць на {target}", "report.forward_hint": "Гэты ўліковы запіс з іншага сервера. Даслаць ананімную копію скаргі і туды?", @@ -965,6 +999,8 @@ "report.rules.title": "Якія правілы былі парушаны?", "report.statuses.subtitle": "Абярыце ўсе пункты, што падыходзяць", "report.statuses.title": "Ці ёсць допісы, каб падмацаваць гэтую скаргу?", + "report.submission_error": "Немагчыма адправіць скаргу", + "report.submission_error_details": "Калі ласка, праверце сваё сеткавае злучэнне і паспрабуйце зноў пазней.", "report.submit": "Адправіць", "report.target": "Скарга на {target}", "report.thanks.take_action": "Вось Вашыя варыянты кантролю над тым, што Вы бачыце в Mastodon:", @@ -1100,7 +1136,7 @@ "status.report": "Паскардзіцца на @{name}", "status.request_quote": "Даслаць запыт на цытаванне", "status.revoke_quote": "Выдаліць мой допіс з допісу @{name}", - "status.sensitive_warning": "Уражвальны змест", + "status.sensitive_warning": "Адчувальнае змесціва", "status.share": "Абагуліць", "status.show_less_all": "Згарнуць усё", "status.show_more_all": "Разгарнуць усё", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 88bbd4cab8..496cb0d0c9 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -13,7 +13,6 @@ "about.not_available": "Aquesta informació no és disponible en aquest servidor.", "about.powered_by": "Xarxa social descentralitzada impulsada per {mastodon}", "about.rules": "Normes del servidor", - "account.about": "Quant a", "account.account_note_header": "Nota personal", "account.activity": "Activitat", "account.add_note": "Afegeix una nota personal", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index cea7ae2b92..e79fafa076 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -13,7 +13,6 @@ "about.not_available": "Tato informace nebyla zpřístupněna na tomto serveru.", "about.powered_by": "Decentralizovaná sociální média poháněná {mastodon}", "about.rules": "Pravidla serveru", - "account.about": "O účtu", "account.account_note_header": "Osobní poznámka", "account.activity": "Aktivita", "account.add_note": "Přidat vlastní poznámku", @@ -446,8 +445,6 @@ "emoji_button.search_results": "Výsledky hledání", "emoji_button.symbols": "Symboly", "emoji_button.travel": "Cestování a místa", - "empty_column.account_about.me": "Zatím jste o sobě nepřidali žádné informace.", - "empty_column.account_about.other": "{acct} zatím o sobě nepřidali žádné informace.", "empty_column.account_featured.me": "Zatím jste nic nezvýraznili. Věděli jste, že na svém profilu můžete zvýraznit hashtagy, které používáte nejvíce, a dokonce účty vašich přátel?", "empty_column.account_featured.other": "{acct} zatím nic nezvýraznili. Věděli jste, že na svém profilu můžete zvýraznit hashtagy, které používáte nejvíce, a dokonce účty vašich přátel?", "empty_column.account_featured_other.unknown": "Tento účet zatím nemá nic zvýrazněného.", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index a54878a80e..de9b235878 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -13,7 +13,6 @@ "about.not_available": "Dyw'r wybodaeth yma heb ei wneud ar gael ar y gweinydd hwn.", "about.powered_by": "Cyfrwng cymdeithasol datganoledig wedi ei yrru gan {mastodon}", "about.rules": "Rheolau'r gweinydd", - "account.about": "Ynghylch", "account.account_note_header": "Nodyn personol", "account.activity": "Gweithgaredd", "account.add_note": "Ychwanegu nodyn personol", @@ -486,8 +485,6 @@ "emoji_button.search_results": "Canlyniadau chwilio", "emoji_button.symbols": "Symbolau", "emoji_button.travel": "Teithio a Llefydd", - "empty_column.account_about.me": "Dydych chi heb ychwanegu unrhyw wybodaeth amdanoch chi'ch hun eto.", - "empty_column.account_about.other": "Dyw {acct} ddim wedi ychwanegu unrhyw wybodaeth amdanyn nhw eu hunain eto.", "empty_column.account_featured.me": "Dydych chi ddim wedi cynnwys unrhyw beth eto. Oeddech chi'n gwybod y gallwch chi gynnwys yr hashnodau rydych chi'n eu defnyddio fwyaf, a hyd yn oed cyfrifon eich ffrindiau ar eich proffil?", "empty_column.account_featured.other": "Dyw {acct} heb gynnwys unrhyw beth eto. Oeddech chi'n gwybod y gallwch chi gynnwys yr hashnodau rydych chi'n eu defnyddio fwyaf, a hyd yn oed cyfrifon eich ffrindiau ar eich proffil?", "empty_column.account_featured_other.unknown": "Dyw'r cyfrif hwn heb gynnwys dim eto.", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 1ee5e74c39..401dfc2948 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -13,7 +13,6 @@ "about.not_available": "Denne information er ikke blevet gjort tilgængelig på denne server.", "about.powered_by": "Decentraliserede sociale medier drevet af {mastodon}", "about.rules": "Serverregler", - "account.about": "Om", "account.account_note_header": "Personligt notat", "account.activity": "Aktivitet", "account.add_note": "Tilføj en personlig note", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Følges af {name1} og {name2}", "account.featured": "Fremhævet", "account.featured.accounts": "Profiler", + "account.featured.collections": "Samlinger", "account.featured.hashtags": "Hashtags", "account.featured_tags.last_status_at": "Seneste indlæg {date}", "account.featured_tags.last_status_never": "Ingen indlæg", + "account.field_overflow": "Vis fuldt indhold", "account.filters.all": "Al aktivitet", "account.filters.boosts_toggle": "Vis fremhævelser", "account.filters.posts_boosts": "Indlæg og fremhævelser", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Søgeresultater", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Rejser og steder", - "empty_column.account_about.me": "Du har endnu ikke tilføjet nogen information om dig selv.", - "empty_column.account_about.other": "{acct} har endnu ikke tilføjet nogen oplysninger om sig selv.", "empty_column.account_featured.me": "Intet fremhævet endnu. Vidste du, at du kan fremhæve dine mest brugte hashtags og endda din vens konti på din profil?", "empty_column.account_featured.other": "{acct} har ikke fremhævet noget endnu. Vidste du, at du kan fremhæve dine mest brugte hashtags og endda din vens konti på din profil?", "empty_column.account_featured_other.unknown": "Denne konto har ikke fremhævet noget endnu.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 5bac1293cf..c4e62d65bc 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -13,7 +13,6 @@ "about.not_available": "Diese Informationen sind auf diesem Server nicht verfügbar.", "about.powered_by": "Ein dezentralisiertes soziales Netzwerk, ermöglicht durch {mastodon}", "about.rules": "Serverregeln", - "account.about": "Über", "account.account_note_header": "Persönliche Notiz", "account.activity": "Aktivitäten", "account.add_note": "Persönliche Notiz hinzufügen", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Gefolgt von {name1} und {name2}", "account.featured": "Vorgestellt", "account.featured.accounts": "Profile", + "account.featured.collections": "Sammlungen", "account.featured.hashtags": "Hashtags", "account.featured_tags.last_status_at": "Neuester Beitrag vom {date}", "account.featured_tags.last_status_never": "Keine Beiträge", + "account.field_overflow": "Vollständigen Inhalt anzeigen", "account.filters.all": "Alle Aktivitäten", "account.filters.boosts_toggle": "Geteilte Beiträge anzeigen", "account.filters.posts_boosts": "Beiträge & geteilte Beiträge", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Suchergebnisse", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Reisen & Orte", - "empty_column.account_about.me": "Du hast noch keine Informationen über dich hinzugefügt.", - "empty_column.account_about.other": "{acct} hat noch keine Informationen über sich hinzugefügt.", "empty_column.account_featured.me": "Du hast bisher noch nichts vorgestellt. Wusstest du, dass du deine häufig verwendeten Hashtags und sogar Profile von Freund*innen vorstellen kannst?", "empty_column.account_featured.other": "{acct} hat bisher noch nichts vorgestellt. Wusstest du, dass du deine häufig verwendeten Hashtags und sogar Profile von Freund*innen vorstellen kannst?", "empty_column.account_featured_other.unknown": "Dieses Profil hat bisher noch nichts vorgestellt.", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index af7b212795..8a38e7c0ce 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -13,7 +13,6 @@ "about.not_available": "Αυτές οι πληροφορίες δεν έχουν είναι διαθέσιμες σε αυτόν τον διακομιστή.", "about.powered_by": "Αποκεντρωμένο μέσο κοινωνικής δικτύωσης που βασίζεται στο {mastodon}", "about.rules": "Κανόνες διακομιστή", - "account.about": "Σχετικά", "account.account_note_header": "Προσωπική σημείωση", "account.activity": "Δραστηριότητα", "account.add_note": "Προσθέστε μια προσωπική σημείωση", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Ακολουθείται από {name1} και {name2}", "account.featured": "Αναδεδειγμένα", "account.featured.accounts": "Προφίλ", + "account.featured.collections": "Συλλογές", "account.featured.hashtags": "Ετικέτες", "account.featured_tags.last_status_at": "Τελευταία ανάρτηση στις {date}", "account.featured_tags.last_status_never": "Καμία ανάρτηση", + "account.field_overflow": "Εμφάνιση πλήρους περιεχομένου", "account.filters.all": "Όλη η δραστηριότητα", "account.filters.boosts_toggle": "Εμφάνιση ενισχύσεων", "account.filters.posts_boosts": "Αναρτήσεις και ενισχύσεις", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Αποτελέσματα αναζήτησης", "emoji_button.symbols": "Σύμβολα", "emoji_button.travel": "Ταξίδια & Τοποθεσίες", - "empty_column.account_about.me": "Δεν έχετε προσθέσει ακόμη καμία πληροφορία για τον εαυτό σας.", - "empty_column.account_about.other": "Ο/Η {acct} δεν έχει προσθέσει ακόμη καμία πληροφορία για τον εαυτό του/της.", "empty_column.account_featured.me": "Δεν έχεις αναδείξει τίποτα ακόμη. Γνώριζες ότι μπορείς να αναδείξεις τις ετικέτες που χρησιμοποιείς περισσότερο, ακόμη και τους λογαριασμούς των φίλων σου στο προφίλ σου;", "empty_column.account_featured.other": "Ο/Η {acct} δεν έχει αναδείξει τίποτα ακόμη. Γνώριζες ότι μπορείς να αναδείξεις τις ετικέτες που χρησιμοποιείς περισσότερο, ακόμη και τους λογαριασμούς των φίλων σου στο προφίλ σου;", "empty_column.account_featured_other.unknown": "Αυτός ο λογαριασμός δεν έχει αναδείξει τίποτα ακόμη.", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 828e62368c..d5b1e24ef4 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -13,7 +13,6 @@ "about.not_available": "This information has not been made available on this server.", "about.powered_by": "Decentralised social media powered by {mastodon}", "about.rules": "Server rules", - "account.about": "About", "account.account_note_header": "Personal note", "account.activity": "Activity", "account.add_note": "Add a personal note", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Followed by {name1} and {name2}", "account.featured": "Featured", "account.featured.accounts": "Profiles", + "account.featured.collections": "Collections", "account.featured.hashtags": "Hashtags", "account.featured_tags.last_status_at": "Last post on {date}", "account.featured_tags.last_status_never": "No posts", + "account.field_overflow": "Show full content", "account.filters.all": "All activity", "account.filters.boosts_toggle": "Show boosts", "account.filters.posts_boosts": "Posts and boosts", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Search results", "emoji_button.symbols": "Symbols", "emoji_button.travel": "Travel & Places", - "empty_column.account_about.me": "You have not added any information about yourself yet.", - "empty_column.account_about.other": "{acct} has not added any information about themselves yet.", "empty_column.account_featured.me": "You have not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?", "empty_column.account_featured.other": "{acct} has not featured anything yet. Did you know that you can feature your hashtags you use the most, and even your friend’s accounts on your profile?", "empty_column.account_featured_other.unknown": "This account has not featured anything yet.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index eb371f6013..53676366cc 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -13,7 +13,6 @@ "about.not_available": "Esta información no está disponible en este servidor.", "about.powered_by": "Redes sociales descentralizadas con tecnología de {mastodon}", "about.rules": "Reglas del servidor", - "account.about": "Información", "account.account_note_header": "Nota personal", "account.activity": "Actividad", "account.add_note": "Agregar una nota personal", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Seguido por {name1} y {name2}", "account.featured": "Destacados", "account.featured.accounts": "Perfiles", + "account.featured.collections": "Colecciones", "account.featured.hashtags": "Etiquetas", "account.featured_tags.last_status_at": "Último mensaje: {date}", "account.featured_tags.last_status_never": "Sin mensajes", + "account.field_overflow": "Mostrar contenido completo", "account.filters.all": "Toda la actividad", "account.filters.boosts_toggle": "Mostrar adhesiones", "account.filters.posts_boosts": "Mensajes y adhesiones", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_about.me": "Todavía no has agregaste ninguna información sobre vos.", - "empty_column.account_about.other": "{acct} todavía no agregó ninguna información sobre esta cuenta.", "empty_column.account_featured.me": "Todavía no destacaste nada. ¿Sabías que en tu perfil podés destacar tus etiquetas que más usás e incluso las cuentas de tus contactos?", "empty_column.account_featured.other": "{acct} todavía no destacó nada. ¿Sabías que en tu perfil podés destacar tus etiquetas que más usás e incluso las cuentas de tus contactos?", "empty_column.account_featured_other.unknown": "Esta cuenta todavía no destacó nada.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index fc01be8f8e..9983265adf 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -13,7 +13,6 @@ "about.not_available": "Esta información no está disponible en este servidor.", "about.powered_by": "Medio social descentralizado con tecnología de {mastodon}", "about.rules": "Reglas del servidor", - "account.about": "Acerca de", "account.account_note_header": "Nota personal", "account.activity": "Actividad", "account.add_note": "Añadir una nota personal", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Seguid por {name1} y {name2}", "account.featured": "Destacado", "account.featured.accounts": "Perfiles", + "account.featured.collections": "Colecciones", "account.featured.hashtags": "Etiquetas", "account.featured_tags.last_status_at": "Última publicación el {date}", "account.featured_tags.last_status_never": "Sin publicaciones", + "account.field_overflow": "Mostrar contenido completo", "account.filters.all": "Toda la actividad", "account.filters.boosts_toggle": "Mostrar impulsos", "account.filters.posts_boosts": "Publicaciones e impulsos", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_about.me": "Aún no has añadido ninguna información sobre ti.", - "empty_column.account_about.other": "{acct} aún no ha añadido ninguna información sobre sí mismo/a.", "empty_column.account_featured.me": "Aún no has destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", "empty_column.account_featured.other": "{acct} no ha destacado nada todavía. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", "empty_column.account_featured_other.unknown": "Esta cuenta no ha destacado nada todavía.", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 11b99095c0..22102bae45 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -13,7 +13,6 @@ "about.not_available": "Esta información no está disponible en este servidor.", "about.powered_by": "Redes sociales descentralizadas con tecnología de {mastodon}", "about.rules": "Reglas del servidor", - "account.about": "Acerca de", "account.account_note_header": "Nota personal", "account.activity": "Actividad", "account.add_note": "Añadir una nota personal", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Seguido por {name1} y {name2}", "account.featured": "Destacado", "account.featured.accounts": "Perfiles", + "account.featured.collections": "Colecciones", "account.featured.hashtags": "Etiquetas", "account.featured_tags.last_status_at": "Última publicación el {date}", "account.featured_tags.last_status_never": "Sin publicaciones", + "account.field_overflow": "Mostrar contenido completo", "account.filters.all": "Toda la actividad", "account.filters.boosts_toggle": "Mostrar impulsos", "account.filters.posts_boosts": "Publicaciones e impulsos", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Resultados de búsqueda", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viajes y lugares", - "empty_column.account_about.me": "Aún no has añadido ninguna información sobre ti.", - "empty_column.account_about.other": "{acct} aún no ha añadido ninguna información sobre sí mismo/a/e.", "empty_column.account_featured.me": "Aún no has destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", "empty_column.account_featured.other": "{acct} aún no ha destacado nada. ¿Sabías que puedes destacar las etiquetas que más usas e incluso las cuentas de tus amigos en tu perfil?", "empty_column.account_featured_other.unknown": "Esta cuenta aún no ha destacado nada.", @@ -1001,7 +1000,7 @@ "report.statuses.subtitle": "Selecciona todos los que correspondan", "report.statuses.title": "¿Hay alguna publicación que respalde este informe?", "report.submission_error": "No se pudo enviar el reporte", - "report.submission_error_details": "Comprueba tu conexión de red e intenta volver a intentarlo más tarde.", + "report.submission_error_details": "Comprueba tu conexión de red e inténtalo más tarde.", "report.submit": "Enviar", "report.target": "Reportando {target}", "report.thanks.take_action": "Aquí están tus opciones para controlar lo que ves en Mastodon:", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 8f3c820271..51a9abb35c 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -13,7 +13,6 @@ "about.not_available": "See info ei ole selles serveris saadavaks tehtud.", "about.powered_by": "Hajutatud sotsiaalmeedia, mille taga on {mastodon}", "about.rules": "Serveri reeglid", - "account.about": "Teave", "account.account_note_header": "Isiklik märge", "account.activity": "Tegevus", "account.add_note": "Lisa isiklik märge", @@ -448,8 +447,6 @@ "emoji_button.search_results": "Otsitulemused", "emoji_button.symbols": "Sümbolid", "emoji_button.travel": "Reisimine & kohad", - "empty_column.account_about.me": "Sa pole enda kohta veel mitte mingit teavet lisanud.", - "empty_column.account_about.other": "{acct} pole enda kohta veel mitte mingit teavet lisanud.", "empty_column.account_featured.me": "Sa pole veel midagi esile tõstnud. Kas sa teadsid, et oma profiilis saad esile tõsta enamkasutatavaid teemaviiteid või sõbra kasutajakontot?", "empty_column.account_featured.other": "{acct} pole veel midagi esile tõstnud. Kas sa teadsid, et oma profiilis saad esile tõsta enamkasutatavaid teemaviiteid või sõbra kasutajakontot?", "empty_column.account_featured_other.unknown": "See kasutajakonto pole veel midagi esile tõstnud.", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 6c99cae2f2..d9c7ee97a1 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -13,7 +13,6 @@ "about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.", "about.powered_by": "Hajautetun sosiaalisen median tarjoaa {mastodon}", "about.rules": "Palvelimen säännöt", - "account.about": "Tietoja", "account.account_note_header": "Henkilökohtainen muistiinpano", "account.activity": "Toiminta", "account.add_note": "Lisää henkilökohtainen muistiinpano", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Seuraajina {name1} ja {name2}", "account.featured": "Esittelyssä", "account.featured.accounts": "Profiilit", + "account.featured.collections": "Kokoelmat", "account.featured.hashtags": "Aihetunnisteet", "account.featured_tags.last_status_at": "Viimeisin julkaisu {date}", "account.featured_tags.last_status_never": "Ei julkaisuja", + "account.field_overflow": "Näytä koko sisältö", "account.filters.all": "Kaikki toiminta", "account.filters.boosts_toggle": "Näytä tehostukset", "account.filters.posts_boosts": "Julkaisut ja tehostukset", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Hakutulokset", "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu ja paikat", - "empty_column.account_about.me": "Et ole vielä lisännyt tietoja itsestäsi.", - "empty_column.account_about.other": "{acct} ei ole vielä lisännyt tietoja itsestään.", "empty_column.account_featured.me": "Et esittele vielä mitään. Tiesitkö, että voit esitellä profiilissasi eniten käyttämiäsi aihetunnisteita ja jopa ystäviesi tilejä?", "empty_column.account_featured.other": "{acct} ei esittele vielä mitään. Tiesitkö, että voit esitellä profiilissasi eniten käyttämiäsi aihetunnisteita ja jopa ystäviesi tilejä?", "empty_column.account_featured_other.unknown": "Tämä tili ei esittele vielä mitään.", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index b8ded5d296..9467d2802a 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -13,7 +13,6 @@ "about.not_available": "Hetta er ikki tøkt á føroyska servaranum enn.", "about.powered_by": "Miðfirra almennur miðil koyrandi á {mastodon}", "about.rules": "Ambætarareglur", - "account.about": "Um", "account.account_note_header": "Persónlig viðmerking", "account.activity": "Virksemi", "account.add_note": "Legg persónliga notu afturat", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "{name1} og {name2} fylgja", "account.featured": "Tikin fram", "account.featured.accounts": "Vangar", + "account.featured.collections": "Søvn", "account.featured.hashtags": "Frámerki", "account.featured_tags.last_status_at": "Seinasta strongur skrivaður {date}", "account.featured_tags.last_status_never": "Einki uppslag", + "account.field_overflow": "Vís alt innihaldið", "account.filters.all": "Alt virksemi", "account.filters.boosts_toggle": "Vís stimbranir", "account.filters.posts_boosts": "Postar og stimbranir", @@ -167,6 +168,7 @@ "account_edit_tags.help_text": "Sermerkt frámerki hjálpa brúkarum at varnast og virka saman við vanga tínum. Tey síggjast sum filtur á virksemisvísingini av vanga tínum.", "account_edit_tags.search_placeholder": "Áset eitt frámerki…", "account_edit_tags.suggestions": "Uppskot:", + "account_edit_tags.tag_status_count": "{count, plural, one {# postur} other {# postar}}", "account_note.placeholder": "Klikka fyri at leggja viðmerking afturat", "admin.dashboard.daily_retention": "Hvussu nógvir brúkarar eru eftir, síðani tey skrásettu seg, roknað í døgum", "admin.dashboard.monthly_retention": "Hvussu nógvir brúkarar eru eftir síðani tey skrásettu seg, roknað í mánaðum", @@ -305,11 +307,13 @@ "collections.no_collections_yet": "Eingi søvn enn.", "collections.old_last_post_note": "Postaði seinast fyri meira enn einari viku síðani", "collections.remove_account": "Strika hesa kontuna", + "collections.report_collection": "Melda hetta savnið", "collections.search_accounts_label": "Leita eftir kontum at leggja afturat…", "collections.search_accounts_max_reached": "Tú hevur lagt afturat mesta talið av kontum", "collections.sensitive": "Viðkvæmt", "collections.topic_hint": "Legg afturat eitt frámerki, sum hjálpir øðrum at skilja høvuðevnið í hesum savninum.", "collections.view_collection": "Vís savn", + "collections.view_other_collections_by_user": "Vís hini søvnini hjá hesum brúkaranum", "collections.visibility_public": "Alment", "collections.visibility_public_hint": "Kann uppdagast í leitiúrslitum og øðrum økjum, har viðmæli síggjast.", "collections.visibility_title": "Sýni", @@ -495,8 +499,6 @@ "emoji_button.search_results": "Leitiúrslit", "emoji_button.symbols": "Ímyndir", "emoji_button.travel": "Ferðing og støð", - "empty_column.account_about.me": "Tú hevur ikki lagt nakrar upplýsingar um teg sjálva/n inn enn.", - "empty_column.account_about.other": "{acct} hevur ikki lagt nakrar upplýsingar um seg sjálva/n inn enn.", "empty_column.account_featured.me": "Tú hevur ikki tikið nakað fram enn. Visti tú, at tú kanst taka fram tey frámerki, tú brúkar mest, og sjálvt kontur hjá vinum tínum á vangan hjá tær?", "empty_column.account_featured.other": "{acct} hevur ikki tikið nakað fram enn. Visti tú, at tú kanst taka fram tey frámerki, tú brúkar mest, og sjálvt kontur hjá vinum tínum á vangan hjá tær?", "empty_column.account_featured_other.unknown": "Hendan kontan hevur ikki tikið nakað fram enn.", @@ -975,6 +977,7 @@ "report.category.title_account": "vangi", "report.category.title_status": "postinum", "report.close": "Liðugt", + "report.collection_comment": "Hví vilt tú melda hetta savnið?", "report.comment.title": "Er nakað annað, sum tú heldur, at vit áttu at vitað?", "report.forward": "Víðarisend til {target}", "report.forward_hint": "Kontan er frá einum øðrum ambætara. Send eitt dulnevnt avrit av meldingini hagar eisini?", @@ -996,6 +999,8 @@ "report.rules.title": "Hvørjar reglur verða brotnar?", "report.statuses.subtitle": "Vel alt viðkomandi", "report.statuses.title": "Eru nakrir postar, sum stuðla uppundir hesa meldingina?", + "report.submission_error": "Meldingin kundi ikki fráboðast", + "report.submission_error_details": "Vinarliga eftirkanna netsambandið og royn aftur seinni.", "report.submit": "Send inn", "report.target": "Meldi {target}", "report.thanks.take_action": "Her eru tínir møguleikar fyri at stýra, hvat tú sær á Mastodon:", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 3bf2dceabd..4d3421be05 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -13,7 +13,6 @@ "about.not_available": "Cette information n'a pas été rendue disponible sur ce serveur.", "about.powered_by": "Réseau social décentralisé propulsé par {mastodon}", "about.rules": "Règles du serveur", - "account.about": "À propos", "account.account_note_header": "Note personnelle", "account.activity": "Activité", "account.add_note": "Ajouter une note personnelle", @@ -45,6 +44,7 @@ "account.familiar_followers_two": "Suivi·e par {name1} et {name2}", "account.featured": "En vedette", "account.featured.accounts": "Profils", + "account.featured.collections": "Collections", "account.featured.hashtags": "Hashtags", "account.featured_tags.last_status_at": "Dernière publication {date}", "account.featured_tags.last_status_never": "Aucune publication", @@ -312,6 +312,7 @@ "collections.sensitive": "Sensible", "collections.topic_hint": "Ajouter un hashtag pour aider les autres personnes à comprendre le sujet de la collection.", "collections.view_collection": "Voir la collection", + "collections.view_other_collections_by_user": "Voir les autres collections par ce compte", "collections.visibility_public": "Publique", "collections.visibility_public_hint": "Visible dans les résultats de recherche et les recommandations.", "collections.visibility_title": "Visibilité", @@ -497,8 +498,6 @@ "emoji_button.search_results": "Résultats", "emoji_button.symbols": "Symboles", "emoji_button.travel": "Voyage et lieux", - "empty_column.account_about.me": "Vous n'avez pas encore ajouté d'informations sur vous.", - "empty_column.account_about.other": "{acct} n'a pas encore ajouté d'informations sur lui-même.", "empty_column.account_featured.me": "Vous n'avez pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", "empty_column.account_featured_other.unknown": "Ce compte n'a mis aucun contenu en avant pour l'instant.", @@ -977,7 +976,7 @@ "report.category.title_account": "ce profil", "report.category.title_status": "ce message", "report.close": "Terminé", - "report.collection_comment": "Pourquoi souhaitez-vous signaler cette collection ?", + "report.collection_comment": "Pourquoi voulez-vous signaler cette collection ?", "report.comment.title": "Y a-t-il autre chose que nous devrions savoir?", "report.forward": "Transférer à {target}", "report.forward_hint": "Le compte provient d’un autre serveur. Envoyer une copie anonyme du rapport là-bas également?", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 0169a86547..dcbfb5af34 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -13,7 +13,6 @@ "about.not_available": "Cette information n'a pas été rendue disponible sur ce serveur.", "about.powered_by": "Réseau social décentralisé propulsé par {mastodon}", "about.rules": "Règles du serveur", - "account.about": "À propos", "account.account_note_header": "Note personnelle", "account.activity": "Activité", "account.add_note": "Ajouter une note personnelle", @@ -45,6 +44,7 @@ "account.familiar_followers_two": "Suivi·e par {name1} et {name2}", "account.featured": "En vedette", "account.featured.accounts": "Profils", + "account.featured.collections": "Collections", "account.featured.hashtags": "Hashtags", "account.featured_tags.last_status_at": "Dernier message le {date}", "account.featured_tags.last_status_never": "Aucun message", @@ -312,6 +312,7 @@ "collections.sensitive": "Sensible", "collections.topic_hint": "Ajouter un hashtag pour aider les autres personnes à comprendre le sujet de la collection.", "collections.view_collection": "Voir la collection", + "collections.view_other_collections_by_user": "Voir les autres collections par ce compte", "collections.visibility_public": "Publique", "collections.visibility_public_hint": "Visible dans les résultats de recherche et les recommandations.", "collections.visibility_title": "Visibilité", @@ -497,8 +498,6 @@ "emoji_button.search_results": "Résultats de la recherche", "emoji_button.symbols": "Symboles", "emoji_button.travel": "Voyage et lieux", - "empty_column.account_about.me": "Vous n'avez pas encore ajouté d'informations sur vous.", - "empty_column.account_about.other": "{acct} n'a pas encore ajouté d'informations sur lui-même.", "empty_column.account_featured.me": "Vous n'avez pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?", "empty_column.account_featured_other.unknown": "Ce compte n'a mis aucun contenu en avant pour l'instant.", @@ -977,7 +976,7 @@ "report.category.title_account": "ce profil", "report.category.title_status": "ce message", "report.close": "Terminé", - "report.collection_comment": "Pourquoi souhaitez-vous signaler cette collection ?", + "report.collection_comment": "Pourquoi voulez-vous signaler cette collection ?", "report.comment.title": "Y a-t-il autre chose que nous devrions savoir ?", "report.forward": "Transférer à {target}", "report.forward_hint": "Le compte provient d’un autre serveur. Envoyer également une copie anonyme du rapport ?", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index cd2ea68e36..5bc25e66cc 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -13,7 +13,6 @@ "about.not_available": "Níor cuireadh an t-eolas seo ar fáil ar an bhfreastalaí seo.", "about.powered_by": "Meáin shóisialta díláraithe faoi chumhacht {mastodon}", "about.rules": "Rialacha an fhreastalaí", - "account.about": "Maidir", "account.account_note_header": "Nóta pearsanta", "account.activity": "Gníomhaíocht", "account.add_note": "Cuir nóta pearsanta leis", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Ina dhiaidh sin tá {name1} agus {name2}", "account.featured": "Faoi thrácht", "account.featured.accounts": "Próifílí", + "account.featured.collections": "Bailiúcháin", "account.featured.hashtags": "Haischlibeanna", "account.featured_tags.last_status_at": "Postáil is déanaí ar {date}", "account.featured_tags.last_status_never": "Gan aon phoist", + "account.field_overflow": "Taispeáin an t-ábhar iomlán", "account.filters.all": "Gach gníomhaíocht", "account.filters.boosts_toggle": "Taispeáin borradh", "account.filters.posts_boosts": "Poist agus borradh", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Torthaí cuardaigh", "emoji_button.symbols": "Comharthaí", "emoji_button.travel": "Taisteal ⁊ Áiteanna", - "empty_column.account_about.me": "Níl aon fhaisnéis fút féin curtha leis agat go fóill.", - "empty_column.account_about.other": "Níl aon fhaisnéis fúthu féin curtha leis ag {acct} go fóill.", "empty_column.account_featured.me": "Níl aon rud curtha i láthair agat go fóill. An raibh a fhios agat gur féidir leat na haischlibeanna is mó a úsáideann tú, agus fiú cuntais do chairde, a chur i láthair ar do phróifíl?", "empty_column.account_featured.other": "Níl aon rud feicthe ag {acct} go fóill. An raibh a fhios agat gur féidir leat na hashtags is mó a úsáideann tú, agus fiú cuntais do chairde, a chur ar do phróifíl?", "empty_column.account_featured_other.unknown": "Níl aon rud le feiceáil sa chuntas seo go fóill.", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 4ab4a38e0b..1a49f6ba36 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -13,7 +13,6 @@ "about.not_available": "Esta información non está dispoñible neste servidor.", "about.powered_by": "Comunicación social descentralizada grazas a {mastodon}", "about.rules": "Regras do servidor", - "account.about": "Sobre", "account.account_note_header": "Nota persoal", "account.activity": "Actividade", "account.add_note": "Engadir nota persoal", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Seguida por {name1} e {name2}", "account.featured": "Destacado", "account.featured.accounts": "Perfís", + "account.featured.collections": "Coleccións", "account.featured.hashtags": "Cancelos", "account.featured_tags.last_status_at": "Última publicación o {date}", "account.featured_tags.last_status_never": "Sen publicacións", + "account.field_overflow": "Mostrar contido completo", "account.filters.all": "Toda actividade", "account.filters.boosts_toggle": "Mostrar promocións", "account.filters.posts_boosts": "Publicacións e promocións", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Resultados da procura", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viaxes e Lugares", - "empty_column.account_about.me": "Aínda non engadiches ningunha información sobre ti.", - "empty_column.account_about.other": "{acct} aínda non engadiu ningunha información sobre a súa conta.", "empty_column.account_featured.me": "Aínda non destacaches nada. Sabías que podes facer destacar no teu perfil os cancelos que máis usas, incluso as contas das túas amizades?", "empty_column.account_featured.other": "{acct} aínda non escolleu nada para destacar. Sabías que podes facer destacatar no teu perfil os cancelos que máis usas, incluso os perfís das túas amizades?", "empty_column.account_featured_other.unknown": "Esta conta aínda non destacou nada.", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 1efc3427de..abe3687f89 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -13,7 +13,6 @@ "about.not_available": "המידע אינו זמין על שרת זה.", "about.powered_by": "רשת חברתית מבוזרת המופעלת על ידי {mastodon}", "about.rules": "כללי השרת", - "account.about": "אודות", "account.account_note_header": "הערה אישית", "account.activity": "פעילות", "account.add_note": "הוספת הערה פרטית", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "החשבון נעקב על ידי {name1} ו־{name2}", "account.featured": "מומלץ", "account.featured.accounts": "פרופילים", + "account.featured.collections": "אוספים", "account.featured.hashtags": "תגיות", "account.featured_tags.last_status_at": "חצרוץ אחרון בתאריך {date}", "account.featured_tags.last_status_never": "אין חצרוצים", + "account.field_overflow": "הצג תוכן מלא", "account.filters.all": "כל הפעילות", "account.filters.boosts_toggle": "הצגת הדהודים", "account.filters.posts_boosts": "הודעות והדהודים", @@ -498,8 +499,6 @@ "emoji_button.search_results": "תוצאות חיפוש", "emoji_button.symbols": "סמלים", "emoji_button.travel": "טיולים ואתרים", - "empty_column.account_about.me": "עוד לא הוספת מידע על עצמך.", - "empty_column.account_about.other": "{acct} עוד לא הוסיפו מידע עצמי.", "empty_column.account_featured.me": "עוד לא קידמת תכנים. הידעת שניתן לקדם תגיות שבשימושך התדיר או אפילו את החשבונות של חבריםות בפרופיל שלך?", "empty_column.account_featured.other": "{acct} עוד לא קידם תכנים. הידעת שניתן לקדם תגיות שבשימושך התדיר או אפילו את החשבונות של חבריםות בפרופיל שלך?", "empty_column.account_featured_other.unknown": "חשבון זה עוד לא קידם תכנים.", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index ffb3bb05e1..6e2b30eb51 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -13,7 +13,6 @@ "about.not_available": "Ez az információ nem lett közzétéve ezen a kiszolgálón.", "about.powered_by": "Decentralizált közösségi média a {mastodon} segítségével", "about.rules": "Kiszolgáló szabályai", - "account.about": "Névjegy", "account.account_note_header": "Személyes megjegyzés", "account.activity": "Tevékenység", "account.add_note": "Személyes megjegyzés hozzáadása", @@ -477,8 +476,6 @@ "emoji_button.search_results": "Keresési találatok", "emoji_button.symbols": "Szimbólumok", "emoji_button.travel": "Utazás és helyek", - "empty_column.account_about.me": "Még nem adtál meg semmilyen információt magadról.", - "empty_column.account_about.other": "{acct} nem adott meg semmilyen információt magáról.", "empty_column.account_featured.me": "Még semmit sem emeltél ki. Tudtad, hogy kiemelheted a profilodon a legtöbbet használt hashtageidet, és még a barátaid fiókját is?", "empty_column.account_featured.other": "{acct} még semmit sem emelt ki. Tudtad, hogy kiemelheted a profilodon a legtöbbet használt hashtageidet, és még a barátaid fiókját is?", "empty_column.account_featured_other.unknown": "Ez a fiók még semmit sem emelt ki.", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index a0288b838a..3bbde7a51b 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -13,7 +13,6 @@ "about.not_available": "Þessar upplýsingar hafa ekki verið gerðar aðgengilegar á þessum netþjóni.", "about.powered_by": "Dreifhýstur samskiptamiðill keyrður með {mastodon}", "about.rules": "Reglur netþjónsins", - "account.about": "Um aðganginn", "account.account_note_header": "Einkaminnispunktur", "account.activity": "Virkni", "account.add_note": "Bæta við einkaminnispunkti", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Fylgt af {name1} og {name2}", "account.featured": "Með aukið vægi", "account.featured.accounts": "Notendasnið", + "account.featured.collections": "Söfn", "account.featured.hashtags": "Myllumerki", "account.featured_tags.last_status_at": "Síðasta færsla þann {date}", "account.featured_tags.last_status_never": "Engar færslur", + "account.field_overflow": "Birta allt efnið", "account.filters.all": "Öll virkni", "account.filters.boosts_toggle": "Sýna endurbirtingar", "account.filters.posts_boosts": "Færslur og endurbirtingar", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Leitarniðurstöður", "emoji_button.symbols": "Tákn", "emoji_button.travel": "Ferðalög og staðir", - "empty_column.account_about.me": "Þú hefur ekki enn bætt við neinum upplýsingum um þig.", - "empty_column.account_about.other": "{acct} hefur ekki enn bætt við neinum upplýsingum um sig.", "empty_column.account_featured.me": "Þú hefur enn ekki sett neitt sem áberandi. Vissirðu að þú getur gefið meira vægi á notandasniðinu þínu ýmsum myllumerkjum sem þú notar oft og jafnvel aðgöngum vina þinna?", "empty_column.account_featured.other": "{acct} hefur enn ekki sett neitt sem áberandi. Vissirðu að þú getur gefið meira vægi á notandasniðinu þínu ýmsum myllumerkjum sem þú notar oft og jafnvel aðgöngum vina þinna?", "empty_column.account_featured_other.unknown": "Þessi notandi hefur enn ekki sett neitt sem áberandi.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 132e063379..8802c730b8 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -13,7 +13,6 @@ "about.not_available": "Queste informazioni non sono state rese disponibili su questo server.", "about.powered_by": "Social media decentralizzato basato su {mastodon}", "about.rules": "Regole del server", - "account.about": "Info", "account.account_note_header": "Note personali", "account.activity": "Attività", "account.add_note": "Aggiungi una nota personale", @@ -498,8 +497,6 @@ "emoji_button.search_results": "Risultati della ricerca", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Viaggi & Luoghi", - "empty_column.account_about.me": "Non hai ancora aggiunto alcuna informazione su di te.", - "empty_column.account_about.other": "{acct} non ha ancora aggiunto alcuna informazione su sé stesso/a.", "empty_column.account_featured.me": "Non hai ancora messo in evidenza nulla. Sapevi che puoi mettere in evidenza gli hashtag che usi più spesso e persino gli account dei tuoi amici sul tuo profilo?", "empty_column.account_featured.other": "{acct} non ha ancora messo in evidenza nulla. Sapevi che puoi mettere in evidenza gli hashtag che usi più spesso e persino gli account dei tuoi amici sul tuo profilo?", "empty_column.account_featured_other.unknown": "Questo account non ha ancora pubblicato nulla.", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index b18c147e9e..b08775be97 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -13,7 +13,6 @@ "about.not_available": "이 정보는 이 서버에서 사용할 수 없습니다.", "about.powered_by": "{mastodon}으로 구동되는 분산 소셜 미디어", "about.rules": "서버 규칙", - "account.about": "정보", "account.account_note_header": "개인 메모", "account.activity": "활동", "account.add_note": "개인 메모 추가", diff --git a/app/javascript/mastodon/locales/nan-TW.json b/app/javascript/mastodon/locales/nan-TW.json index ab51b182a6..60639f9756 100644 --- a/app/javascript/mastodon/locales/nan-TW.json +++ b/app/javascript/mastodon/locales/nan-TW.json @@ -13,7 +13,6 @@ "about.not_available": "Tsit ê資訊bē-tàng tī tsit ê服侍器使用。", "about.powered_by": "由 {mastodon} 提供ê非中心化社群媒體", "about.rules": "服侍器ê規則", - "account.about": "概要", "account.account_note_header": "個人ê註解", "account.activity": "活動", "account.add_note": "加私人ê註解", @@ -487,8 +486,6 @@ "emoji_button.search_results": "Tshiau-tshuē ê結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅行kap地點", - "empty_column.account_about.me": "Lí iáu bē加任何關係lí ê資訊。", - "empty_column.account_about.other": "{acct} iáu bē加任何關係伊ê資訊。", "empty_column.account_featured.me": "Lí iáu無任何ê特色內容。Lí kám知影lí ē當kā lí tsia̍p-tsia̍p用ê hashtag,甚至是朋友ê口座揀做特色ê內容,khǹg佇lí ê個人資料內底?", "empty_column.account_featured.other": "{acct} iáu無任何ê特色內容。Lí kám知影lí ē當kā lí tsia̍p-tsia̍p用ê hashtag,甚至是朋友ê口座揀做特色ê內容,khǹg佇lí ê個人資料內底?", "empty_column.account_featured_other.unknown": "Tsit ê口座iáu無任何ê特色內容。", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 625effdde2..084cff2c85 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -13,7 +13,6 @@ "about.not_available": "Deze informatie is niet beschikbaar gemaakt op deze server.", "about.powered_by": "Gedecentraliseerde sociale media mogelijk gemaakt door {mastodon}", "about.rules": "Serverregels", - "account.about": "Over", "account.account_note_header": "Persoonlijke opmerking", "account.activity": "Activiteit", "account.add_note": "Een persoonlijke opmerking toevoegen", @@ -45,6 +44,7 @@ "account.familiar_followers_two": "Gevolgd door {name1} en {name2}", "account.featured": "Uitgelicht", "account.featured.accounts": "Profielen", + "account.featured.collections": "Verzamelingen", "account.featured.hashtags": "Hashtags", "account.featured_tags.last_status_at": "Laatste bericht op {date}", "account.featured_tags.last_status_never": "Geen berichten", @@ -167,6 +167,7 @@ "account_edit_tags.help_text": "Aanbevolen hashtags helpen gebruikers je profiel te ontdekken en te communiceren. Ze verschijnen als filters op de activiteitenweergave van je pagina.", "account_edit_tags.search_placeholder": "Voer een hashtag in…", "account_edit_tags.suggestions": "Suggesties:", + "account_edit_tags.tag_status_count": "{count, plural, one {# bericht} other {# berichten}}", "account_note.placeholder": "Klik om een opmerking toe te voegen", "admin.dashboard.daily_retention": "Retentiegraad van gebruikers per dag, vanaf registratie", "admin.dashboard.monthly_retention": "Retentiegraad van gebruikers per maand, vanaf registratie", @@ -305,11 +306,13 @@ "collections.no_collections_yet": "Nog geen verzamelingen.", "collections.old_last_post_note": "Laatst gepost over een week geleden", "collections.remove_account": "Deze account verwijderen", + "collections.report_collection": "Deze verzameling rapporteren", "collections.search_accounts_label": "Zoek naar accounts om toe te voegen…", "collections.search_accounts_max_reached": "Je hebt het maximum aantal accounts toegevoegd", "collections.sensitive": "Gevoelig", "collections.topic_hint": "Voeg een hashtag toe die anderen helpt het hoofdonderwerp van deze verzameling te begrijpen.", "collections.view_collection": "Verzameling bekijken", + "collections.view_other_collections_by_user": "Bekijk andere verzamelingen van deze gebruiker", "collections.visibility_public": "Openbaar", "collections.visibility_public_hint": "Te zien onder zoekresultaten en in andere gebieden waar aanbevelingen verschijnen.", "collections.visibility_title": "Zichtbaarheid", @@ -495,8 +498,6 @@ "emoji_button.search_results": "Zoekresultaten", "emoji_button.symbols": "Symbolen", "emoji_button.travel": "Reizen en locaties", - "empty_column.account_about.me": "Je hebt nog een enkele informatie over jezelf toegevoegd.", - "empty_column.account_about.other": "{acct} heeft nog geen enkele informatie over zichzelf toegevoegd.", "empty_column.account_featured.me": "Je hebt nog niets uitgelicht. Wist je dat je een aantal van jouw berichten, jouw meest gebruikte hashtags en zelfs accounts van je vrienden op je profiel kunt uitlichten?", "empty_column.account_featured.other": "{acct} heeft nog niets uitgelicht. Wist je dat je een aantal van jouw berichten, jouw meest gebruikte hashtags en zelfs accounts van je vrienden op je profiel kunt uitlichten?", "empty_column.account_featured_other.unknown": "Dit account heeft nog niets uitgelicht.", @@ -975,6 +976,7 @@ "report.category.title_account": "account", "report.category.title_status": "bericht", "report.close": "Klaar", + "report.collection_comment": "Waarom wil je deze verzameling rapporteren?", "report.comment.title": "Zijn er nog andere dingen waarvan je denkt dat wij dat moeten weten?", "report.forward": "Naar {target} doorsturen", "report.forward_hint": "Het account bevindt zich op een andere server. Wil je daar eveneens een geanonimiseerde kopie van deze rapportage naar toe sturen?", @@ -996,6 +998,8 @@ "report.rules.title": "Welke regels worden geschonden?", "report.statuses.subtitle": "Selecteer wat van toepassing is", "report.statuses.title": "Zijn er berichten die deze rapportage ondersteunen?", + "report.submission_error": "Rapportering kon niet worden ingediend", + "report.submission_error_details": "Controleer de netwerkverbinding en probeer het later opnieuw.", "report.submit": "Verzenden", "report.target": "{target} rapporteren", "report.thanks.take_action": "Hier zijn jouw opties waarmee je kunt bepalen wat je in Mastodon wilt zien:", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index de805231ed..3313efd115 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -13,7 +13,6 @@ "about.not_available": "Denne informasjonen er ikkje gjort tilgjengeleg på denne tenaren.", "about.powered_by": "Desentraliserte sosiale medium drive av {mastodon}", "about.rules": "Tenarreglar", - "account.about": "Om", "account.account_note_header": "Personleg notat", "account.activity": "Aktivitet", "account.add_note": "Legg til eit personleg notat", @@ -496,8 +495,6 @@ "emoji_button.search_results": "Søkeresultat", "emoji_button.symbols": "Symbol", "emoji_button.travel": "Reise & stader", - "empty_column.account_about.me": "Du har ikkje skrive noko om deg sjølv enno.", - "empty_column.account_about.other": "{acct} har ikkje skrive noko om seg sjølv enno.", "empty_column.account_featured.me": "Du har ikkje valt ut noko enno. Visste du at du kan velja ut emneknaggar du bruker mykje, og til og med venekontoar på profilen din?", "empty_column.account_featured.other": "{acct} har ikkje valt ut noko enno. Visste du at du kan velja ut emneknaggar du bruker mykje, og til og med venekontoar på profilen din?", "empty_column.account_featured_other.unknown": "Denne kontoen har ikkje valt ut noko enno.", @@ -1165,7 +1162,7 @@ "ui.beforeunload": "Kladden din forsvinn om du forlèt Mastodon no.", "units.short.billion": "{count}m.ard", "units.short.million": "{count}mill", - "units.short.thousand": "{count}T", + "units.short.thousand": "{count}k", "upload_area.title": "Dra & slepp for å lasta opp", "upload_button.label": "Legg til medium", "upload_error.limit": "Du har gått over opplastingsgrensa.", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 87d10df9bb..a6ab9f30e1 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -843,7 +843,7 @@ "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.", "units.short.billion": "{count}m.ard", "units.short.million": "{count}mill", - "units.short.thousand": "{count}T", + "units.short.thousand": "{count}k", "upload_area.title": "Dra og slipp for å laste opp", "upload_button.label": "Legg til media", "upload_error.limit": "Filopplastingsgrensen er oversteget.", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index e86f8c72f9..d6084366cd 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -13,7 +13,6 @@ "about.not_available": "Esta informação não foi disponibilizada neste servidor.", "about.powered_by": "Rede social descentralizada baseada no {mastodon}", "about.rules": "Regras do servidor", - "account.about": "Sobre", "account.account_note_header": "Nota pessoal", "account.activity": "Atividade", "account.add_note": "Adicionar nota pessoal", @@ -496,8 +495,6 @@ "emoji_button.search_results": "Resultado da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagem e Lugares", - "empty_column.account_about.me": "Você ainda não inseriu nenhuma informação sobre si.", - "empty_column.account_about.other": "{acct} ainda não adicionou nenhuma informação sobre si.", "empty_column.account_featured.me": "Você ainda não destacou nada. Você sabia que pode destacar seus posts, hashtags que você mais usa e até mesmo contas de seus amigos no seu perfil?", "empty_column.account_featured.other": "{acct} Ainda não destacou nada. Você sabia que pode destacar suas publicações, hashtags que você mais usa e até mesmo contas de seus amigos no seu perfil?", "empty_column.account_featured_other.unknown": "Esta conta ainda não destacou nada.", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 930e69f846..74147e6c59 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -13,7 +13,6 @@ "about.not_available": "Esta informação não foi disponibilizada neste servidor.", "about.powered_by": "Rede social descentralizada baseada no {mastodon}", "about.rules": "Regras do servidor", - "account.about": "Sobre", "account.account_note_header": "Nota pessoal", "account.activity": "Atividade", "account.add_note": "Adicionar uma nota pessoal", @@ -45,6 +44,7 @@ "account.familiar_followers_two": "Seguido por {name1} e {name2}", "account.featured": "Destaques", "account.featured.accounts": "Perfis", + "account.featured.collections": "Coleções", "account.featured.hashtags": "Etiquetas", "account.featured_tags.last_status_at": "Última publicação em {date}", "account.featured_tags.last_status_never": "Sem publicações", @@ -145,6 +145,9 @@ "account_edit.bio.title": "Bio", "account_edit.bio_modal.add_title": "Adicionar biografia", "account_edit.bio_modal.edit_title": "Editar biografia", + "account_edit.button.add": "Adicionar {item}", + "account_edit.button.delete": "Eliminar \"{item}", + "account_edit.button.edit": "Editar {item}", "account_edit.char_counter": "{currentLength}/{maxLength} caracteres", "account_edit.column_button": "Concluído", "account_edit.column_title": "Editar Perfil", @@ -152,10 +155,15 @@ "account_edit.custom_fields.title": "Campos personalizados", "account_edit.display_name.placeholder": "Como o seu nome vai aparecer no seu perfil e nas linhas do tempo.", "account_edit.display_name.title": "Nome a mostrar", + "account_edit.featured_hashtags.item": "etiquetas", "account_edit.featured_hashtags.placeholder": "Ajude à sua identificação por outros e tenha acesso rápido aos seus tópicos favoritos.", "account_edit.featured_hashtags.title": "Etiquetas em destaque", "account_edit.name_modal.add_title": "Adicionar nome a mostrar", "account_edit.name_modal.edit_title": "Editar o nome a mostrar", + "account_edit.save": "Guardar", + "account_edit_tags.column_title": "Editar etiquetas em destaque", + "account_edit_tags.search_placeholder": "Insira uma etiqueta…", + "account_edit_tags.suggestions": "Sugestões:", "account_note.placeholder": "Clicar para adicionar nota", "admin.dashboard.daily_retention": "Taxa de retenção de utilizadores por dia após a inscrição", "admin.dashboard.monthly_retention": "Taxa de retenção de utilizadores por mês após a inscrição", @@ -259,9 +267,11 @@ "closed_registrations_modal.preamble": "O Mastodon é descentralizado, por isso não importa onde a tua conta é criada, pois continuarás a poder acompanhar e interagir com qualquer um neste servidor. Podes até alojar o teu próprio servidor!", "closed_registrations_modal.title": "Criar uma conta no Mastodon", "collections.account_count": "{count, plural, one {# conta} other {# contas}}", + "collections.accounts.empty_title": "Esta coleção está vazia", "collections.collection_description": "Descrição", "collections.collection_name": "Nome", "collections.collection_topic": "Tópico", + "collections.confirm_account_removal": "Tem a certeza que quer remover esta conta desta coleção?", "collections.content_warning": "Aviso de conteúdo", "collections.continue": "Continuar", "collections.create.accounts_subtitle": "Apenas as contas que segue e que optaram por ser descobertas podem ser adicionadas.", @@ -272,7 +282,12 @@ "collections.create_collection": "Criar coleção", "collections.delete_collection": "Eliminar coleção", "collections.description_length_hint": "Limite de 100 caracteres", + "collections.detail.accounts_heading": "Contas", + "collections.detail.loading": "A carregar a coleção…", + "collections.detail.share": "Partilhar esta coleção", + "collections.edit_details": "Editar detalhes", "collections.error_loading_collections": "Ocorreu um erro ao tentar carregar as suas coleções.", + "collections.hints.add_more_accounts": "Adicione pelo menos {count, plural, one {# conta} other {# contas}} para continuar", "collections.last_updated_at": "Última atualização: {date}", "collections.manage_accounts": "Gerir contas", "collections.mark_as_sensitive": "Marcar como sensível", @@ -463,8 +478,6 @@ "emoji_button.search_results": "Resultados da pesquisa", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagens e lugares", - "empty_column.account_about.me": "Ainda não adicionou nenhuma informação sobre si.", - "empty_column.account_about.other": "{acct} ainda não adicionou nenhuma informação sobre si.", "empty_column.account_featured.me": "Ainda não colocou nada em destaque. Sabia que pode destacar as etiquetas que mais utiliza e até as contas dos seus amigos no seu perfil?", "empty_column.account_featured.other": "{acct} ainda não colocou nada em destaque. Sabia que pode destacar as etiquetas que mais utiliza e até as contas dos seus amigos no seu perfil?", "empty_column.account_featured_other.unknown": "Esta conta ainda não colocou nada em destaque.", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 5c84ee3f2d..7e3c421cce 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -13,7 +13,6 @@ "about.not_available": "Ky informacion, në këtë shërbyes, nuk jepet.", "about.powered_by": "Media shoqërore e decentralizuar, bazuar në {mastodon}", "about.rules": "Rregulla shërbyesi", - "account.about": "Mbi", "account.account_note_header": "Shënim personal", "account.activity": "Veprimtari", "account.add_note": "Shtoni një shënim personal", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Ndjekur nga {name1} dhe {name2}", "account.featured": "Të zgjedhur", "account.featured.accounts": "Profile", + "account.featured.collections": "Koleksione", "account.featured.hashtags": "Hashtag-ë", "account.featured_tags.last_status_at": "Postimi i fundit më {date}", "account.featured_tags.last_status_never": "Pa postime", + "account.field_overflow": "Shfaq lëndë të plotë", "account.filters.all": "Krejt veprimtarinë", "account.filters.boosts_toggle": "Shfaq përforcime", "account.filters.posts_boosts": "Postime dhe përforcime", @@ -495,8 +496,6 @@ "emoji_button.search_results": "Përfundime kërkimi", "emoji_button.symbols": "Simbole", "emoji_button.travel": "Udhëtime & Vende", - "empty_column.account_about.me": "S’keni shtuar ende ndonjë hollësi rreth vetes.", - "empty_column.account_about.other": "{acct} s’ka shtuar ende ndonjë hollësi rreth vetes.", "empty_column.account_featured.me": "S’keni ende të zgjedhur diçka. E dini se në profilin tuaj mund të shfaqni si të zgjedhura hashtag-ët që përdorni më tepër dhe madje edhe llogaritë e shokëve tuaj?", "empty_column.account_featured.other": "{acct} s’ka të zgjedhur ende ndonjë gjë. E dini se në profilin tuaj mund të shfaqni si të zgjedhura hashtag-ët që përdorni më tepër dhe madje edhe llogaritë e shokëve tuaj?", "empty_column.account_featured_other.unknown": "Kjo llogari s’ka ende gjë të zgjedhur.", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index f06613fc87..17f254a1e0 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -13,7 +13,6 @@ "about.not_available": "Denna information har inte gjorts tillgänglig på denna server.", "about.powered_by": "En decentraliserad plattform for sociala medier, drivet av {mastodon}", "about.rules": "Serverregler", - "account.about": "Om", "account.account_note_header": "Personlig anteckning", "account.add_or_remove_from_list": "Lägg till i eller ta bort från listor", "account.badges.bot": "Bot", @@ -377,8 +376,6 @@ "emoji_button.search_results": "Sökresultat", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Resor & platser", - "empty_column.account_about.me": "Du har inte lagt till någon information om dig själv än.", - "empty_column.account_about.other": "{acct} har inte lagt till någon information om sig själv än.", "empty_column.account_featured.me": "Du har inte presenterat något ännu. Visste du att du kan markera de fyrkantstaggar du använder mest och även din väns konton på din profil?", "empty_column.account_featured.other": "{acct} har inte presenterat något ännu. Visste du att du kan markera de fyrkantstaggar som du använder mest och även din väns konton på din profil?", "empty_column.account_featured_other.unknown": "Detta konto har inte presenterat något ännu.", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 640295ac6e..ec7906da57 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -13,7 +13,6 @@ "about.not_available": "Bu sunucuda bu bilgi kullanıma sunulmadı.", "about.powered_by": "{mastodon} destekli merkeziyetsiz sosyal ağ", "about.rules": "Sunucu kuralları", - "account.about": "Hakkında", "account.account_note_header": "Kişisel not", "account.activity": "Aktivite", "account.add_note": "Kişisel bir not ekle", @@ -306,11 +305,13 @@ "collections.no_collections_yet": "Henüz hiçbir koleksiyon yok.", "collections.old_last_post_note": "Son gönderi bir haftadan önce", "collections.remove_account": "Bu hesabı çıkar", + "collections.report_collection": "Bu koleksiyonu bildir", "collections.search_accounts_label": "Eklemek için hesap arayın…", "collections.search_accounts_max_reached": "Maksimum hesabı eklediniz", "collections.sensitive": "Hassas", "collections.topic_hint": "Bu koleksiyonun ana konusunu başkalarının anlamasına yardımcı olacak bir etiket ekleyin.", "collections.view_collection": "Koleksiyonu görüntüle", + "collections.view_other_collections_by_user": "Bu kullanıcının diğer koleksiyonlarını görüntüle", "collections.visibility_public": "Herkese açık", "collections.visibility_public_hint": "Arama sonuçlarında ve önerilerin görüntülendiği diğer alanlarda keşfedilebilir.", "collections.visibility_title": "Görünürlük", @@ -496,8 +497,6 @@ "emoji_button.search_results": "Arama sonuçları", "emoji_button.symbols": "Semboller", "emoji_button.travel": "Seyahat ve Yerler", - "empty_column.account_about.me": "Henüz kendinle ilgili herhangi bir bilgi eklemedin.", - "empty_column.account_about.other": "{acct} henüz kendisiyle ilgili herhangi bir bilgi eklemedi.", "empty_column.account_featured.me": "Henüz hiçbir şeyi öne çıkarmadınız. En çok kullandığınız etiketleri ve hatta arkadaşlarınızın hesaplarını profilinizde öne çıkarabileceğinizi biliyor muydunuz?", "empty_column.account_featured.other": "{acct} henüz hiçbir şeyi öne çıkarmadı. En çok kullandığınız etiketleri ve hatta arkadaşlarınızın hesaplarını profilinizde öne çıkarabileceğinizi biliyor muydunuz?", "empty_column.account_featured_other.unknown": "Bu hesap henüz hiçbir şeyi öne çıkarmadı.", @@ -976,6 +975,7 @@ "report.category.title_account": "profil", "report.category.title_status": "gönderi", "report.close": "Tamam", + "report.collection_comment": "Bu koleksiyonu neden bildirmek istiyorsunuz?", "report.comment.title": "Bilmemizi istediğiniz başka bir şey var mı?", "report.forward": "{target} ilet", "report.forward_hint": "Hesap başka bir sunucudan. Raporun anonim bir kopyası da oraya gönderilsin mi?", @@ -997,6 +997,8 @@ "report.rules.title": "Hangi kurallar ihlal ediliyor?", "report.statuses.subtitle": "Geçerli olanların hepsini seçin", "report.statuses.title": "Bu bildirimi destekleyecek herhangi bir gönderi var mı?", + "report.submission_error": "Bildirim gönderilemiyor", + "report.submission_error_details": "Lütfen ağ durumunu kontrol edin ve daha sonra tekrar deneyin.", "report.submit": "Gönder", "report.target": "{target} Bildiriliyor", "report.thanks.take_action": "Mastodon'da ne görebileceğinizi denetlemeye ilişkin seçenekler şunlardır:", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 0a0885f73d..ad14df1a1a 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -13,7 +13,6 @@ "about.not_available": "Máy chủ này chưa cung cấp thông tin.", "about.powered_by": "Mạng xã hội liên hợp {mastodon}", "about.rules": "Nội quy máy chủ", - "account.about": "Giới thiệu", "account.account_note_header": "Ghi chú", "account.activity": "Hoạt động", "account.add_note": "Thêm ghi chú", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "Theo dõi bởi {name1} và {name2}", "account.featured": "Nêu bật", "account.featured.accounts": "Tài khoản", + "account.featured.collections": "Collection", "account.featured.hashtags": "Hashtag thường dùng", "account.featured_tags.last_status_at": "Tút gần nhất {date}", "account.featured_tags.last_status_never": "Chưa có tút", + "account.field_overflow": "Hiện đầy đủ nội dung", "account.filters.all": "Tất cả hoạt động", "account.filters.boosts_toggle": "Hiện những lượt đăng lại", "account.filters.posts_boosts": "Tút và lượt đăng lại", @@ -498,8 +499,6 @@ "emoji_button.search_results": "Kết quả tìm kiếm", "emoji_button.symbols": "Biểu tượng", "emoji_button.travel": "Du lịch", - "empty_column.account_about.me": "Bạn chưa thêm thông tin gì về bản thân.", - "empty_column.account_about.other": "{acct} chưa thêm thông tin gì về họ.", "empty_column.account_featured.me": "Bạn chưa nêu bật gì. Bạn có biết rằng, bạn có thể giới thiệu hashtag thường dùng và hồ sơ của bạn bè trên trang cá nhân của mình không?", "empty_column.account_featured.other": "{acct} chưa nêu bật gì. Bạn có biết rằng, bạn có thể giới thiệu hashtag thường dùng và hồ sơ của bạn bè trên trang cá nhân của mình không?", "empty_column.account_featured_other.unknown": "Tài khoản này chưa nêu bật gì.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 60a89015dc..3d00966ea4 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -13,7 +13,6 @@ "about.not_available": "此信息在当前服务器尚不可用。", "about.powered_by": "由 {mastodon} 驱动的去中心化社交媒体", "about.rules": "站点规则", - "account.about": "关于", "account.account_note_header": "个人备注", "account.activity": "活动", "account.add_note": "添加个人备注", @@ -45,6 +44,7 @@ "account.familiar_followers_two": "{name1} 和 {name2} 关注了此账号", "account.featured": "精选", "account.featured.accounts": "个人资料", + "account.featured.collections": "收藏列表", "account.featured.hashtags": "话题", "account.featured_tags.last_status_at": "上次发言于 {date}", "account.featured_tags.last_status_never": "暂无嘟文", @@ -498,8 +498,6 @@ "emoji_button.search_results": "搜索结果", "emoji_button.symbols": "符号", "emoji_button.travel": "旅行与地点", - "empty_column.account_about.me": "你尚未添加有关你自己的任何信息。", - "empty_column.account_about.other": "{acct} 尚未添加有关自己的任何信息。", "empty_column.account_featured.me": "你尚未设置任何精选。你知道吗?你可以将自己最常使用的话题标签,甚至是好友的账号,在你的个人主页上设为精选。", "empty_column.account_featured.other": "{acct} 尚未设置任何精选。你知道吗?你可以将自己最常使用的话题标签,甚至是好友的账号,在你的个人主页上设为精选。", "empty_column.account_featured_other.unknown": "此账号尚未设置任何精选。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 9f3befc52a..186dbb0550 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -13,7 +13,6 @@ "about.not_available": "無法於本伺服器上使用此資訊。", "about.powered_by": "由 {mastodon} 提供之去中心化社群媒體", "about.rules": "伺服器規則", - "account.about": "關於", "account.account_note_header": "個人備註", "account.activity": "活動", "account.add_note": "新增個人備註", @@ -45,9 +44,11 @@ "account.familiar_followers_two": "被 {name1} 與 {name2} 跟隨", "account.featured": "精選內容", "account.featured.accounts": "個人檔案", + "account.featured.collections": "收藏名單", "account.featured.hashtags": "主題標籤", "account.featured_tags.last_status_at": "上次發嘟於 {date}", "account.featured_tags.last_status_never": "沒有嘟文", + "account.field_overflow": "顯示完整內容", "account.filters.all": "所有活動", "account.filters.boosts_toggle": "顯示轉嘟", "account.filters.posts_boosts": "嘟文與轉嘟", @@ -498,8 +499,6 @@ "emoji_button.search_results": "搜尋結果", "emoji_button.symbols": "符號", "emoji_button.travel": "旅遊與地點", - "empty_column.account_about.me": "您尚未新增任何關於您的資訊。", - "empty_column.account_about.other": "{acct} 尚未新增任何關於他們的資訊。", "empty_column.account_featured.me": "您尚未有任何精選內容。您知道您可以將您的常用主題標籤、甚至您朋友們的帳號作為您個人檔案上之精選內容嗎?", "empty_column.account_featured.other": "{acct} 尚未有任何精選內容。您知道您可以將您的常用主題標籤、甚至您朋友們的帳號作為您個人檔案上之精選內容嗎?", "empty_column.account_featured_other.unknown": "此帳號尚未有任何精選內容。", diff --git a/app/javascript/mastodon/reducers/custom_emojis.js b/app/javascript/mastodon/reducers/custom_emojis.js index 56ec80f2ff..47aa3edbbb 100644 --- a/app/javascript/mastodon/reducers/custom_emojis.js +++ b/app/javascript/mastodon/reducers/custom_emojis.js @@ -4,6 +4,7 @@ import { CUSTOM_EMOJIS_FETCH_SUCCESS } from '../actions/custom_emojis'; import { buildCustomEmojis } from '../features/emoji/emoji'; import { search as emojiSearch } from '../features/emoji/emoji_mart_search_light'; +/** @type {ImmutableList} */ const initialState = ImmutableList([]); export default function custom_emojis(state = initialState, action) { diff --git a/app/javascript/mastodon/reducers/slices/profile_edit.ts b/app/javascript/mastodon/reducers/slices/profile_edit.ts index c966325203..4f5bd6a4c8 100644 --- a/app/javascript/mastodon/reducers/slices/profile_edit.ts +++ b/app/javascript/mastodon/reducers/slices/profile_edit.ts @@ -6,10 +6,16 @@ import { debounce } from 'lodash'; import { apiDeleteFeaturedTag, apiGetCurrentFeaturedTags, + apiGetProfile, apiGetTagSuggestions, + apiPatchProfile, apiPostFeaturedTag, } from '@/mastodon/api/accounts'; import { apiGetSearch } from '@/mastodon/api/search'; +import type { + ApiProfileJSON, + ApiProfileUpdateParams, +} from '@/mastodon/api_types/profile'; import { hashtagToFeaturedTag } from '@/mastodon/api_types/tags'; import type { ApiFeaturedTagJSON } from '@/mastodon/api_types/tags'; import type { AppDispatch } from '@/mastodon/store'; @@ -17,11 +23,21 @@ import { createAppAsyncThunk, createDataLoadingThunk, } from '@/mastodon/store/typed_functions'; +import type { SnakeToCamelCase } from '@/mastodon/utils/types'; -interface ProfileEditState { - tags: ApiFeaturedTagJSON[]; - tagSuggestions: ApiFeaturedTagJSON[]; - isLoading: boolean; +type ProfileData = { + [Key in keyof Omit< + ApiProfileJSON, + 'note' + > as SnakeToCamelCase]: ApiProfileJSON[Key]; +} & { + bio: ApiProfileJSON['note']; +}; + +export interface ProfileEditState { + profile?: ProfileData; + tags?: ApiFeaturedTagJSON[]; + tagSuggestions?: ApiFeaturedTagJSON[]; isPending: boolean; search: { query: string; @@ -31,9 +47,6 @@ interface ProfileEditState { } const initialState: ProfileEditState = { - tags: [], - tagSuggestions: [], - isLoading: true, isPending: false, search: { query: '', @@ -49,6 +62,7 @@ const profileEditSlice = createSlice({ if (state.search.query === action.payload) { return; } + state.search.query = action.payload; state.search.isLoading = false; state.search.results = undefined; @@ -60,13 +74,25 @@ const profileEditSlice = createSlice({ }, }, extraReducers(builder) { + builder.addCase(fetchProfile.fulfilled, (state, action) => { + state.profile = action.payload; + }); builder.addCase(fetchSuggestedTags.fulfilled, (state, action) => { state.tagSuggestions = action.payload.map(hashtagToFeaturedTag); - state.isLoading = false; }); builder.addCase(fetchFeaturedTags.fulfilled, (state, action) => { state.tags = action.payload; - state.isLoading = false; + }); + + builder.addCase(patchProfile.pending, (state) => { + state.isPending = true; + }); + builder.addCase(patchProfile.rejected, (state) => { + state.isPending = false; + }); + builder.addCase(patchProfile.fulfilled, (state, action) => { + state.profile = action.payload; + state.isPending = false; }); builder.addCase(addFeaturedTag.pending, (state) => { @@ -76,12 +102,18 @@ const profileEditSlice = createSlice({ state.isPending = false; }); builder.addCase(addFeaturedTag.fulfilled, (state, action) => { + if (!state.tags) { + return; + } + state.tags = [...state.tags, action.payload].toSorted( (a, b) => b.statuses_count - a.statuses_count, ); - state.tagSuggestions = state.tagSuggestions.filter( - (tag) => tag.name !== action.meta.arg.name, - ); + if (state.tagSuggestions) { + state.tagSuggestions = state.tagSuggestions.filter( + (tag) => tag.name !== action.meta.arg.name, + ); + } state.isPending = false; }); @@ -92,6 +124,10 @@ const profileEditSlice = createSlice({ state.isPending = false; }); builder.addCase(deleteFeaturedTag.fulfilled, (state, action) => { + if (!state.tags) { + return; + } + state.tags = state.tags.filter((tag) => tag.id !== action.meta.arg.tagId); state.isPending = false; }); @@ -106,7 +142,7 @@ const profileEditSlice = createSlice({ builder.addCase(fetchSearchResults.fulfilled, (state, action) => { state.search.isLoading = false; const searchResults: ApiFeaturedTagJSON[] = []; - const currentTags = new Set(state.tags.map((tag) => tag.name)); + const currentTags = new Set((state.tags ?? []).map((tag) => tag.name)); for (const tag of action.payload) { if (currentTags.has(tag.name)) { @@ -125,6 +161,41 @@ const profileEditSlice = createSlice({ export const profileEdit = profileEditSlice.reducer; export const { clearSearch } = profileEditSlice.actions; +const transformProfile = (result: ApiProfileJSON): ProfileData => ({ + id: result.id, + displayName: result.display_name, + bio: result.note, + fields: result.fields, + avatar: result.avatar, + avatarStatic: result.avatar_static, + avatarDescription: result.avatar_description, + header: result.header, + headerStatic: result.header_static, + headerDescription: result.header_description, + locked: result.locked, + bot: result.bot, + hideCollections: result.hide_collections, + discoverable: result.discoverable, + indexable: result.indexable, + showMedia: result.show_media, + showMediaReplies: result.show_media_replies, + showFeatured: result.show_featured, + attributionDomains: result.attribution_domains, +}); + +export const fetchProfile = createDataLoadingThunk( + `${profileEditSlice.name}/fetchProfile`, + apiGetProfile, + transformProfile, +); + +export const patchProfile = createDataLoadingThunk( + `${profileEditSlice.name}/patchProfile`, + (params: Partial) => apiPatchProfile(params), + transformProfile, + { useLoadingBar: false }, +); + export const fetchFeaturedTags = createDataLoadingThunk( `${profileEditSlice.name}/fetchFeaturedTags`, apiGetCurrentFeaturedTags, @@ -143,7 +214,10 @@ export const addFeaturedTag = createDataLoadingThunk( { condition(arg, { getState }) { const state = getState(); - return !state.profileEdit.tags.some((tag) => tag.name === arg.name); + return ( + !!state.profileEdit.tags && + !state.profileEdit.tags.some((tag) => tag.name === arg.name) + ); }, }, ); diff --git a/app/javascript/mastodon/utils/types.ts b/app/javascript/mastodon/utils/types.ts index f51b3ad8b3..2383dbc50d 100644 --- a/app/javascript/mastodon/utils/types.ts +++ b/app/javascript/mastodon/utils/types.ts @@ -24,3 +24,8 @@ export type OmitValueType = { export type AnyFunction = (...args: never) => unknown; export type OmitUnion = TBase & Omit; + +export type SnakeToCamelCase = + S extends `${infer T}_${infer U}` + ? `${T}${Capitalize>}` + : S; diff --git a/app/models/account.rb b/app/models/account.rb index 1b2da6ce0e..209501de47 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -465,8 +465,11 @@ class Account < ApplicationRecord save! end - def featureable? - local? && discoverable? + def featureable_by?(other_account) + return discoverable? if local? + return false unless Mastodon::Feature.collections_federation_enabled? + + feature_policy_for_account(other_account).in?(%i(automatic manual)) end private diff --git a/app/models/collection_item.rb b/app/models/collection_item.rb index d05d12df60..78b5f6a6e2 100644 --- a/app/models/collection_item.rb +++ b/app/models/collection_item.rb @@ -35,6 +35,7 @@ class CollectionItem < ApplicationRecord validates :uri, presence: true, if: :remote? before_validation :set_position, on: :create + before_validation :set_activity_uri, only: :create, if: :local_item_with_remote_account? scope :ordered, -> { order(position: :asc) } scope :with_accounts, -> { includes(account: [:account_stat, :user]) } @@ -55,4 +56,8 @@ class CollectionItem < ApplicationRecord self.position = self.class.where(collection_id:).maximum(:position).to_i + 1 end + + def set_activity_uri + self.activity_uri = [ActivityPub::TagManager.instance.uri_for(collection.account), '/feature_requests/', SecureRandom.uuid].join + end end diff --git a/app/policies/account_policy.rb b/app/policies/account_policy.rb index 1fef35714c..c46eb08034 100644 --- a/app/policies/account_policy.rb +++ b/app/policies/account_policy.rb @@ -66,7 +66,7 @@ class AccountPolicy < ApplicationPolicy end def feature? - record.featureable? && !current_account.blocking?(record) && !current_account.blocked_by?(record) + record.featureable_by?(current_account) && !current_account.blocking?(record) && !current_account.blocked_by?(record) end def index_collections? diff --git a/app/serializers/activitypub/feature_request_serializer.rb b/app/serializers/activitypub/feature_request_serializer.rb new file mode 100644 index 0000000000..a7a22f4ea0 --- /dev/null +++ b/app/serializers/activitypub/feature_request_serializer.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class ActivityPub::FeatureRequestSerializer < ActivityPub::Serializer + attributes :id, :type, :instrument + attribute :virtual_object, key: :object + + def id + object.activity_uri + end + + def type + 'FeatureRequest' + end + + def virtual_object + ActivityPub::TagManager.instance.uri_for(object.account) + end + + def instrument + ActivityPub::TagManager.instance.uri_for(object.collection) + end +end diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index 343b8cbab8..0995f2d42c 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -69,6 +69,8 @@ class REST::InstanceSerializer < ActiveModel::Serializer }, accounts: { + max_display_name_length: Account::DISPLAY_NAME_LENGTH_LIMIT, + max_note_length: Account::NOTE_LENGTH_LIMIT, max_featured_tags: FeaturedTag::LIMIT, max_pinned_statuses: StatusPinValidator::PIN_LIMIT, max_profile_fields: Account::DEFAULT_FIELDS_SIZE, diff --git a/app/serializers/rest/profile_serializer.rb b/app/serializers/rest/profile_serializer.rb index d535e3776d..b96daf87d4 100644 --- a/app/serializers/rest/profile_serializer.rb +++ b/app/serializers/rest/profile_serializer.rb @@ -3,6 +3,7 @@ class REST::ProfileSerializer < ActiveModel::Serializer include RoutingHelper + # Please update app/javascript/api_types/profile.ts when making changes to the attributes attributes :id, :display_name, :note, :fields, :avatar, :avatar_static, :avatar_description, :header, :header_static, :header_description, :locked, :bot, @@ -10,6 +11,8 @@ class REST::ProfileSerializer < ActiveModel::Serializer :show_media, :show_media_replies, :show_featured, :attribution_domains + has_many :featured_tags, serializer: REST::FeaturedTagSerializer + def id object.id.to_s end diff --git a/app/services/add_account_to_collection_service.rb b/app/services/add_account_to_collection_service.rb index 2109baf67e..e53c67b57f 100644 --- a/app/services/add_account_to_collection_service.rb +++ b/app/services/add_account_to_collection_service.rb @@ -11,7 +11,10 @@ class AddAccountToCollectionService @collection_item = create_collection_item - distribute_add_activity if @account.local? && Mastodon::Feature.collections_federation_enabled? + if Mastodon::Feature.collections_federation_enabled? + distribute_add_activity if @account.local? + distribute_feature_request_activity if @account.remote? + end @collection_item end @@ -26,10 +29,14 @@ class AddAccountToCollectionService end def distribute_add_activity - ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account_id) + ActivityPub::AccountRawDistributionWorker.perform_async(add_activity_json, @collection.account_id) end - def activity_json + def distribute_feature_request_activity + ActivityPub::FeatureRequestWorker.perform_async(@collection_item.id) + end + + def add_activity_json ActiveModelSerializers::SerializableResource.new(@collection_item, serializer: ActivityPub::AddFeaturedItemSerializer, adapter: ActivityPub::Adapter).to_json end end diff --git a/app/services/create_collection_service.rb b/app/services/create_collection_service.rb index bcc68d01cd..b0d291d7c3 100644 --- a/app/services/create_collection_service.rb +++ b/app/services/create_collection_service.rb @@ -9,7 +9,10 @@ class CreateCollectionService @collection.save! - distribute_add_activity if Mastodon::Feature.collections_federation_enabled? + if Mastodon::Feature.collections_federation_enabled? + distribute_add_activity + distribute_feature_request_activities + end @collection end @@ -20,6 +23,12 @@ class CreateCollectionService ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @account.id) end + def distribute_feature_request_activities + @collection.collection_items.select(&:local_item_with_remote_account?).each do |collection_item| + ActivityPub::FeatureRequestWorker.perform_async(collection_item.id) + end + end + def build_items return if @accounts_to_add.empty? diff --git a/app/workers/activitypub/feature_request_worker.rb b/app/workers/activitypub/feature_request_worker.rb new file mode 100644 index 0000000000..fa895a546d --- /dev/null +++ b/app/workers/activitypub/feature_request_worker.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class ActivityPub::FeatureRequestWorker < ActivityPub::RawDistributionWorker + def perform(collection_item_id) + @collection_item = CollectionItem.find(collection_item_id) + @account = @collection_item.collection.account + + distribute! + rescue ActiveRecord::RecordNotFound + true + end + + protected + + def inboxes + @inboxes ||= [@collection_item.account.inbox_url] + end + + def payload + @payload ||= Oj.dump(serialize_payload(@collection_item, ActivityPub::FeatureRequestSerializer, signer: @account)) + end +end diff --git a/config/locales/be.yml b/config/locales/be.yml index 431219415f..bcd568fa54 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -62,6 +62,7 @@ be: label: Змяніць ролю no_role: Няма ролі title: Змяніць ролю для %{username} + collections: Калекцыі confirm: Пацвердзіць confirmed: Пацверджаны confirming: Ідзе пацвярджэнне @@ -274,6 +275,7 @@ be: demote_user_html: "%{name} прыбраў карыстальніка %{target}" destroy_announcement_html: "%{name} выдаліў аб'яву %{target}" destroy_canonical_email_block_html: "%{name} разблакіраваў эл. пошту з хэшам %{target}" + destroy_collection_html: "%{name} выдаліў(-ла) калекцыю %{target}" destroy_custom_emoji_html: "%{name} выдаліў(-ла) эмодзі %{target}" destroy_domain_allow_html: "%{name} зняў(-ла) дазвол на аб’яднанне з даменам %{target}" destroy_domain_block_html: "%{name} разблакаваў дамен %{target}" @@ -313,6 +315,7 @@ be: unsilence_account_html: "%{name} зняў ліміт з уліковага запісу %{target}" unsuspend_account_html: Уліковы запіс %{target} адноўлены %{name} update_announcement_html: "%{name} абнавіў(-ла) аб’яву %{target}" + update_collection_html: "%{name} абнавіў(-ла) калекцыю %{target}" update_custom_emoji_html: "%{name} абнавіў эмодзі %{target}" update_domain_block_html: "%{name} абнавіў блакіроўку дамена для %{target}" update_ip_block_html: "%{name} змяніў правіла для IP %{target}" @@ -348,6 +351,17 @@ be: unpublish: Зняць з публікацыі unpublished_msg: Аб’ява схавана! updated_msg: Аб’ява абноўлена! + collections: + accounts: Уліковыя запісы + collection_title: Калекцыя %{name} + contents: Змесціва + number_of_accounts: + few: "%{count} уліковыя запісы" + many: "%{count} уліковых запісаў" + one: 1 уліковы запіс + other: "%{count} уліковых запісаў" + open: Адкрыць + view_publicly: Глядзець публічна critical_update_pending: Чакаецца абнаўленне custom_emojis: assign_category: Прызначыць катэгорыю @@ -705,6 +719,7 @@ be: cancel: Скасаваць category: Катэгорыя category_description_html: Прычына паведамлення аб гэтым уліковым запісе і/або кантэнце будзе згадана ў сувязі з уліковым запісам, на які пададзена скарга + collections: Калекцыі (%{count}) comment: none: Пуста comment_description_html: 'Каб даць больш інфармацыі, %{name} напісаў:' @@ -734,11 +749,13 @@ be: report: 'Скарга #%{id}' reported_account: Уліковы запіс парушальніка reported_by: Адпраўнік скаргі + reported_content: Змесціва, на якое паскардзіліся reported_with_application: Паведамлена праз праграму resolved: Вырашана resolved_msg: Скарга была паспяхова вырашана! skip_to_actions: Прапусціць дзеянні status: Стан + statuses: Допісы (%{count}) statuses_description_html: Крыўднае змесціва будзе згадвацца ў зносінах з уліковым запісам, на які пададзена скарга summary: action_preambles: diff --git a/config/locales/da.yml b/config/locales/da.yml index 574aa708bb..2df10f12b1 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -267,6 +267,7 @@ da: demote_user_html: "%{name} degraderede brugeren %{target}" destroy_announcement_html: "%{name} slettede bekendtgørelsen %{target}" destroy_canonical_email_block_html: "%{name} afblokerede e-mailen med hash'et %{target}" + destroy_collection_html: "%{name} fjernede samling af %{target}" destroy_custom_emoji_html: "%{name} slettede emojien %{target}" destroy_domain_allow_html: "%{name} fjernede federeringstilladelsen med domænet %{target}" destroy_domain_block_html: "%{name} afblokerede domænet %{target}" @@ -306,6 +307,7 @@ da: unsilence_account_html: "%{name} fjernede begrænsningen af %{target}s konto" unsuspend_account_html: "%{name} fjernede suspenderingen af %{target}s konto" update_announcement_html: "%{name} opdaterede bekendtgørelsen %{target}" + update_collection_html: "%{name} opdaterede samling af %{target}" update_custom_emoji_html: "%{name} opdaterede emoji %{target}" update_domain_block_html: "%{name} opdaterede domæneblokeringen for %{target}" update_ip_block_html: "%{name} ændrede reglen for IP'en %{target}" diff --git a/config/locales/de.yml b/config/locales/de.yml index c94bef60e6..2315be3f8d 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -267,6 +267,7 @@ de: demote_user_html: "%{name} stufte %{target} herunter" destroy_announcement_html: "%{name} löschte die Ankündigung %{target}" destroy_canonical_email_block_html: "%{name} entsperrte die E-Mail mit dem Hash %{target}" + destroy_collection_html: "%{name} entfernte Sammlung von %{target}" destroy_custom_emoji_html: "%{name} löschte das Emoji %{target}" destroy_domain_allow_html: "%{name} verwehrte die Föderation mit der Domain %{target}" destroy_domain_block_html: "%{name} entsperrte die Domain %{target}" @@ -306,6 +307,7 @@ de: unsilence_account_html: "%{name} hob die Stummschaltung von %{target} auf" unsuspend_account_html: "%{name} entsperrte das Konto von %{target}" update_announcement_html: "%{name} überarbeitete die Ankündigung %{target}" + update_collection_html: "%{name} überarbeitete Sammlung von %{target}" update_custom_emoji_html: "%{name} bearbeitete das Emoji %{target}" update_domain_block_html: "%{name} aktualisierte die Domain-Sperre für %{target}" update_ip_block_html: "%{name} änderte eine IP-Regel für %{target}" diff --git a/config/locales/el.yml b/config/locales/el.yml index b606f67877..d806558a6d 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -267,6 +267,7 @@ el: demote_user_html: Ο/Η %{name} υποβίβασε τον χρήστη %{target} destroy_announcement_html: Ο/Η %{name} διέγραψε την ανακοίνωση %{target} destroy_canonical_email_block_html: Ο χρήστης %{name} έκανε άρση αποκλεισμού email με το hash %{target} + destroy_collection_html: Ο/Η %{name} αφαίρεσε τη συλλογή του/της %{target} destroy_custom_emoji_html: Ο/Η %{name} διέγραψε το emoji %{target} destroy_domain_allow_html: Ο/Η %{name} αφαίρεσε τον τομέα %{target} από τη λίστα εγκρίσεων destroy_domain_block_html: Ο/Η %{name} επέτρεψε τον τομέα %{target} @@ -306,6 +307,7 @@ el: unsilence_account_html: Ο/Η %{name} αφαίρεσε το περιορισμό του λογαριασμού του/της %{target} unsuspend_account_html: Ο/Η %{name} επανέφερε τον λογαριασμό του/της %{target} update_announcement_html: Ο/Η %{name} ενημέρωσε την ανακοίνωση %{target} + update_collection_html: Ο/Η %{name} ενημέρωσε τη συλλογή του/της %{target} update_custom_emoji_html: Ο/Η %{name} ενημέρωσε το emoji %{target} update_domain_block_html: Ο/Η %{name} ενημέρωσε τον αποκλεισμό τομέα για %{target} update_ip_block_html: Ο/Η %{name} άλλαξε τον κανόνα για την IP %{target} diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index abef3aa441..815378fbdd 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -267,6 +267,7 @@ en-GB: demote_user_html: "%{name} demoted user %{target}" destroy_announcement_html: "%{name} deleted announcement %{target}" destroy_canonical_email_block_html: "%{name} unblocked email with the hash %{target}" + destroy_collection_html: "%{name} removed collection by %{target}" destroy_custom_emoji_html: "%{name} deleted emoji %{target}" destroy_domain_allow_html: "%{name} disallowed federation with domain %{target}" destroy_domain_block_html: "%{name} unblocked domain %{target}" @@ -306,6 +307,7 @@ en-GB: unsilence_account_html: "%{name} undid limit of %{target}'s account" unsuspend_account_html: "%{name} unsuspended %{target}'s account" update_announcement_html: "%{name} updated announcement %{target}" + update_collection_html: "%{name} updated collection by %{target}" update_custom_emoji_html: "%{name} updated emoji %{target}" update_domain_block_html: "%{name} updated domain block for %{target}" update_ip_block_html: "%{name} changed rule for IP %{target}" diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index f19ba9971c..bbc1fd78e3 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -267,6 +267,7 @@ es-AR: demote_user_html: "%{name} bajó de nivel al usuario %{target}" destroy_announcement_html: "%{name} eliminó el anuncio %{target}" destroy_canonical_email_block_html: "%{name} desbloqueó el correo electrónico con el hash %{target}" + destroy_collection_html: "%{name} eliminó la colección de %{target}" destroy_custom_emoji_html: "%{name} eliminó el emoji %{target}" destroy_domain_allow_html: "%{name} no permitió la federación con el dominio %{target}" destroy_domain_block_html: "%{name} desbloqueó el dominio %{target}" @@ -306,6 +307,7 @@ es-AR: unsilence_account_html: "%{name} quitó el límite de la cuenta de %{target}" unsuspend_account_html: "%{name} quitó la suspensión de la cuenta de %{target}" update_announcement_html: "%{name} actualizó el anuncio %{target}" + update_collection_html: "%{name} actualizó la colección de %{target}" update_custom_emoji_html: "%{name} actualizó el emoji %{target}" update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}" update_ip_block_html: "%{name} cambió la regla para la dirección IP %{target}" diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 3a19094e38..bf05a6d405 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -267,6 +267,7 @@ es-MX: demote_user_html: "%{name} degradó al usuario %{target}" destroy_announcement_html: "%{name} eliminó el anuncio %{target}" destroy_canonical_email_block_html: "%{name} ha desbloqueado el correo electrónico con el hash %{target}" + destroy_collection_html: "%{name} eliminó la colección de %{target}" destroy_custom_emoji_html: "%{name} eliminó el emoji %{target}" destroy_domain_allow_html: "%{name} bloqueó la federación con el dominio %{target}" destroy_domain_block_html: "%{name} desbloqueó el dominio %{target}" @@ -306,6 +307,7 @@ es-MX: unsilence_account_html: "%{name} desilenció la cuenta de %{target}" unsuspend_account_html: "%{name} reactivó la cuenta de %{target}" update_announcement_html: "%{name} actualizó el anuncio %{target}" + update_collection_html: "%{name} actualizó la colección de %{target}" update_custom_emoji_html: "%{name} actualizó el emoji %{target}" update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}" update_ip_block_html: "%{name} cambió la regla para la IP %{target}" diff --git a/config/locales/es.yml b/config/locales/es.yml index d18d0e3cc4..b5014dba7e 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -12,6 +12,9 @@ es: followers: one: Seguidor other: Seguidores + following: + one: Siguiendo + other: Siguiendo instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al propio servidor y no a ningún usuario individual. Se utiliza con fines de federación y no debe suspenderse. last_active: última conexión link_verified_on: La propiedad de este vínculo fue verificada el %{date} @@ -264,6 +267,7 @@ es: demote_user_html: "%{name} degradó al usuario %{target}" destroy_announcement_html: "%{name} eliminó el anuncio %{target}" destroy_canonical_email_block_html: "%{name} desbloqueó el correo electrónico con el hash %{target}" + destroy_collection_html: "%{name} eliminó la colección de %{target}" destroy_custom_emoji_html: "%{name} eliminó el emoji %{target}" destroy_domain_allow_html: "%{name} bloqueó la federación con el dominio %{target}" destroy_domain_block_html: "%{name} desbloqueó el dominio %{target}" @@ -303,6 +307,7 @@ es: unsilence_account_html: "%{name} desilenció la cuenta de %{target}" unsuspend_account_html: "%{name} reactivó la cuenta de %{target}" update_announcement_html: "%{name} actualizó el anuncio %{target}" + update_collection_html: "%{name} actualizó la colección de %{target}" update_custom_emoji_html: "%{name} actualizó el emoji %{target}" update_domain_block_html: "%{name} actualizó el bloqueo de dominio para %{target}" update_ip_block_html: "%{name} cambió la regla para la IP %{target}" diff --git a/config/locales/fi.yml b/config/locales/fi.yml index d48ded9e22..94c4793bdc 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -267,6 +267,7 @@ fi: demote_user_html: "%{name} alensi käyttäjän %{target}" destroy_announcement_html: "%{name} poisti tiedotteen %{target}" destroy_canonical_email_block_html: "%{name} kumosi eston tiivistettä %{target} vastaavalta sähköpostiosoitteelta" + destroy_collection_html: "%{name} poisti käyttäjän %{target} kokoelman" destroy_custom_emoji_html: "%{name} poisti emojin %{target}" destroy_domain_allow_html: "%{name} kielsi federoinnin verkkotunnuksen %{target} kanssa" destroy_domain_block_html: "%{name} kumosi verkkotunnuksen %{target} eston" @@ -306,6 +307,7 @@ fi: unsilence_account_html: "%{name} kumosi käyttäjän %{target} tilin rajoituksen" unsuspend_account_html: "%{name} kumosi käyttäjän %{target} tilin jäädytyksen" update_announcement_html: "%{name} päivitti tiedotteen %{target}" + update_collection_html: "%{name} päivitti käyttäjän %{target} kokoelman" update_custom_emoji_html: "%{name} päivitti emojin %{target}" update_domain_block_html: "%{name} päivitti verkkotunnuksen %{target} eston" update_ip_block_html: "%{name} muutti IP-⁠osoitteen %{target} sääntöä" diff --git a/config/locales/fo.yml b/config/locales/fo.yml index de2fcf7ae8..36b2dc5c68 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -12,6 +12,9 @@ fo: followers: one: Fylgjari other: Fylgjarar + following: + one: Fylgi + other: Fylgi instance_actor_flash: Hendan kontan er ein tykisligur aktørur, sum verður brúktur til at umboða ambætaran sjálvan og ikki nakran ávísan brúkara. Hon verður brúkt til sameind endamál og eigur ikki at vera tikin úr gildi. last_active: virkin seinast link_verified_on: Eigaraskapur av hesum leinki var eftirkannaður tann %{date} @@ -264,6 +267,7 @@ fo: demote_user_html: "%{name} lækkaði tignina hjá brúkaranum %{target}" destroy_announcement_html: "%{name} strikaðar fráboðanir %{target}" destroy_canonical_email_block_html: "%{name} strikaði blokeringina av teldupostin við hashkodu %{target}" + destroy_collection_html: "%{name} slettaði savnið hjá %{target}" destroy_custom_emoji_html: "%{name} strikaði kensluteknið %{target}" destroy_domain_allow_html: "%{name} havnaði sameining við navnaøkið %{target}" destroy_domain_block_html: "%{name} strikaði blokering av navnaøkinum %{target}" @@ -303,6 +307,7 @@ fo: unsilence_account_html: "%{name} strikaði avmarkingina av kontuni hjá %{target}" unsuspend_account_html: "%{name} setti kontuna hjá %{target} í gildi aftur" update_announcement_html: "%{name} dagførdi kunngerðina %{target}" + update_collection_html: "%{name} dagførdi savnið hjá %{target}" update_custom_emoji_html: "%{name} dagførdi kensluteknið %{target}" update_domain_block_html: "%{name} dagførdi navnaøkisblokeringina hjá %{target}" update_ip_block_html: "%{name} broytti IP-reglurnar %{target}" @@ -342,6 +347,9 @@ fo: accounts: Kontur collection_title: Savn hjá %{name} contents: Innihald + number_of_accounts: + one: 1 konta + other: "%{count} kontur" open: Opin view_publicly: Vís fyri øllum critical_update_pending: Kritisk dagføring bíðar diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 751211e470..5ccda09b4b 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -267,6 +267,7 @@ fr-CA: demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" + destroy_collection_html: "%{name} a supprimé la collection de %{target}" destroy_custom_emoji_html: "%{name} a supprimé l'émoji %{target}" destroy_domain_allow_html: "%{name} a rejeté la fédération avec le domaine %{target}" destroy_domain_block_html: "%{name} a débloqué le domaine %{target}" @@ -306,6 +307,7 @@ fr-CA: unsilence_account_html: "%{name} a annulé la limitation du compte de %{target}" unsuspend_account_html: "%{name} a réactivé le compte de %{target}" update_announcement_html: "%{name} a mis à jour l'annonce %{target}" + update_collection_html: "%{name} a mis à jour la collections de %{target}" update_custom_emoji_html: "%{name} a mis à jour l'émoji %{target}" update_domain_block_html: "%{name} a mis à jour le blocage de domaine pour %{target}" update_ip_block_html: "%{name} a modifié la règle pour l'IP %{target}" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5e0d57f820..f330733b08 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -267,6 +267,7 @@ fr: demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" + destroy_collection_html: "%{name} a supprimé la collection de %{target}" destroy_custom_emoji_html: "%{name} a supprimé l'émoji %{target}" destroy_domain_allow_html: "%{name} a rejeté la fédération avec le domaine %{target}" destroy_domain_block_html: "%{name} a débloqué le domaine %{target}" @@ -306,6 +307,7 @@ fr: unsilence_account_html: "%{name} a annulé la limitation du compte de %{target}" unsuspend_account_html: "%{name} a réactivé le compte de %{target}" update_announcement_html: "%{name} a mis à jour l'annonce %{target}" + update_collection_html: "%{name} a mis à jour la collections de %{target}" update_custom_emoji_html: "%{name} a mis à jour l'émoji %{target}" update_domain_block_html: "%{name} a mis à jour le blocage de domaine pour %{target}" update_ip_block_html: "%{name} a modifié la règle pour l'IP %{target}" diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 6148e6950c..1d6f2c68e4 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -279,6 +279,7 @@ ga: demote_user_html: "%{name} úsáideoir scriosta %{target}" destroy_announcement_html: "%{name} fógra scriosta %{target}" destroy_canonical_email_block_html: "%{name} ríomhphost díchoiscthe leis an hash %{target}" + destroy_collection_html: Bhain %{name} bailiúchán le %{target} destroy_custom_emoji_html: Scriosadh %{name} emoji %{target} destroy_domain_allow_html: Dhiúltaigh %{name} cónaidhm le fearann ​​%{target} destroy_domain_block_html: "%{name} fearann ​​%{target} bainte de" @@ -318,6 +319,7 @@ ga: unsilence_account_html: Chealaigh %{name} teorainn chuntas %{target} unsuspend_account_html: Níor chuir %{name} cuntas %{target} ar fionraí update_announcement_html: "%{name} fógra nuashonraithe %{target}" + update_collection_html: Nuashonraigh %{name} bailiúchán le %{target} update_custom_emoji_html: "%{name} emoji nuashonraithe %{target}" update_domain_block_html: "%{name} nuashonraithe bloc fearainn le haghaidh %{target}" update_ip_block_html: D'athraigh %{name} riail an IP %{target} diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 0ac225d728..7c59072d8f 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -267,6 +267,7 @@ gl: demote_user_html: "%{name} degradou a usuaria %{target}" destroy_announcement_html: "%{name} eliminou o anuncio %{target}" destroy_canonical_email_block_html: "%{name} desbloqueou o correo con suma de comprobación %{target}" + destroy_collection_html: "%{name} eliminou a colección de %{target}" destroy_custom_emoji_html: "%{name} eliminou o emoji %{target}" destroy_domain_allow_html: "%{name} retirou a federación co dominio %{target}" destroy_domain_block_html: "%{name} desbloqueou o dominio %{target}" @@ -306,6 +307,7 @@ gl: unsilence_account_html: "%{name} reactivou a conta de %{target}" unsuspend_account_html: "%{name} retiroulle a suspensión á conta de %{target}" update_announcement_html: "%{name} actualizou o anuncio %{target}" + update_collection_html: "%{name} actualizou a colección de %{target}" update_custom_emoji_html: "%{name} actualizou o emoji %{target}" update_domain_block_html: "%{name} actualizou o bloqueo do dominio para %{target}" update_ip_block_html: "%{name} cambiou a regra para IP %{target}" diff --git a/config/locales/he.yml b/config/locales/he.yml index 6c3dda16bd..62bbecccd1 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -275,6 +275,7 @@ he: demote_user_html: "%{name} הוריד/ה בדרגה את המשתמש %{target}" destroy_announcement_html: "%{name} מחק/ה את ההכרזה %{target}" destroy_canonical_email_block_html: "%{name} הסירו חסימה מדואל %{target}" + destroy_collection_html: האוסף של %{target} הוסר ע"י %{name} destroy_custom_emoji_html: "%{name} מחק אמוג'י של %{target}" destroy_domain_allow_html: "%{name} לא התיר/ה פדרציה עם הדומיין %{target}" destroy_domain_block_html: החסימה על מתחם %{target} הוסרה ע"י %{name} @@ -314,6 +315,7 @@ he: unsilence_account_html: "%{name} ביטל/ה ההגבלה מהחשבון של %{target}" unsuspend_account_html: "%{name} ביטל/ה את ההשעיה של החשבון של %{target}" update_announcement_html: "%{name} עדכן/ה הכרזה %{target}" + update_collection_html: האוסף של %{target} עודכן ע"י %{name} update_custom_emoji_html: "%{name} עדכן/ה אמוג'י %{target}" update_domain_block_html: "%{name} עדכן/ה חסימת דומיין עבור %{target}" update_ip_block_html: "%{name} שינה כלל עבור IP %{target}" diff --git a/config/locales/is.yml b/config/locales/is.yml index 4bcda2ceee..d173cc31c7 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -267,6 +267,7 @@ is: demote_user_html: "%{name} lækkaði notandann %{target} í tign" destroy_announcement_html: "%{name} eyddi tilkynninguni %{target}" destroy_canonical_email_block_html: "%{name} tók af útilokun á tölvupósti með tætigildið %{target}" + destroy_collection_html: "%{name} fjarlægði safn frá %{target}" destroy_custom_emoji_html: "%{name} eyddi emoji-tákni %{target}" destroy_domain_allow_html: "%{name} bannaði skýjasamband með léninu %{target}" destroy_domain_block_html: "%{name} aflétti útilokun af léninu %{target}" @@ -306,6 +307,7 @@ is: unsilence_account_html: "%{name} hætti að hylja notandaaðganginn %{target}" unsuspend_account_html: "%{name} tók notandaaðganginn %{target} úr frysti" update_announcement_html: "%{name} uppfærði tilkynningu %{target}" + update_collection_html: "%{name} uppfærði safn frá %{target}" update_custom_emoji_html: "%{name} uppfærði lyndistáknið %{target}" update_domain_block_html: "%{name} uppfærði útilokun lénsins %{target}" update_ip_block_html: "%{name} breytti reglu fyrir IP-vistfangið %{target}" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 5eb860f7a6..6f52b8ec97 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -267,6 +267,7 @@ nl: demote_user_html: Gebruiker %{target} is door %{name} gedegradeerd destroy_announcement_html: "%{name} heeft de mededeling %{target} verwijderd" destroy_canonical_email_block_html: "%{name} deblokkeerde e-mail met de hash %{target}" + destroy_collection_html: "%{name} heeft de verzameling van %{target} verwijderd" destroy_custom_emoji_html: "%{name} verwijderde de emoji %{target}" destroy_domain_allow_html: "%{name} heeft de federatie met het domein %{target} afgekeurd" destroy_domain_block_html: Domein %{target} is door %{name} gedeblokkeerd @@ -306,6 +307,7 @@ nl: unsilence_account_html: Beperking van account %{target} is door %{name} opgeheven unsuspend_account_html: Opschorten van account %{target} is door %{name} opgeheven update_announcement_html: "%{name} heeft de mededeling %{target} bijgewerkt" + update_collection_html: "%{name} heeft de verzameling van %{target} bijgewerkt" update_custom_emoji_html: Emoji %{target} is door %{name} bijgewerkt update_domain_block_html: "%{name} heeft de domeinblokkade bijgewerkt voor %{target}" update_ip_block_html: "%{name} wijzigde de IP-regel voor %{target}" diff --git a/config/locales/no.yml b/config/locales/no.yml index a7abdf8ab1..a143940462 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1436,7 +1436,7 @@ billion: Mrd million: Mln quadrillion: Kvd - thousand: T + thousand: k trillion: Trl otp_authentication: code_hint: Skriv inn koden generert av autentiseringsappen din for å bekrefte diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 0673375638..9daddea9c4 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -267,6 +267,7 @@ sq: demote_user_html: "%{name} zhgradoi përdoruesin %{target}" destroy_announcement_html: "%{name} fshiu lajmërimin për %{target}" destroy_canonical_email_block_html: "%{name} zhbllokoi email me hashin %{target}" + destroy_collection_html: "%{name} hoqi koleksion nga %{target}" destroy_custom_emoji_html: "%{name} fshiu emoji-n %{target}" destroy_domain_allow_html: "%{name} hoqi lejimin për federim me %{target}" destroy_domain_block_html: "%{name} zhbllokoi përkatësinë %{target}" @@ -306,6 +307,7 @@ sq: unsilence_account_html: "%{name} hoqi heshtimin për llogarinë %{target}" unsuspend_account_html: "%{name} hoqi pezullimin për llogarinë e %{target}" update_announcement_html: "%{name} përditësoi lajmërimin %{target}" + update_collection_html: "%{name} përditësoi koleksion nga %{target}" update_custom_emoji_html: "%{name} përditësoi emoxhin %{target}" update_domain_block_html: "%{name} përditësoi bllokim përkatësish për %{target}" update_ip_block_html: "%{name} ndryshoi rregull për IP-në %{target}" diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 42af0b6603..c68c7f755e 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -263,6 +263,7 @@ vi: demote_user_html: "%{name} đã hạ vai trò của %{target}" destroy_announcement_html: "%{name} đã xóa thông báo %{target}" destroy_canonical_email_block_html: "%{name} đã bỏ chặn địa chỉ email biến thể %{target}" + destroy_collection_html: "%{name} đã gỡ collection của %{target}" destroy_custom_emoji_html: "%{name} đã xóa emoji %{target}" destroy_domain_allow_html: "%{name} đã ngừng liên hợp với %{target}" destroy_domain_block_html: "%{name} đã bỏ chặn máy chủ %{target}" @@ -302,6 +303,7 @@ vi: unsilence_account_html: "%{name} đã bỏ ẩn %{target}" unsuspend_account_html: "%{name} đã bỏ vô hiệu hóa %{target}" update_announcement_html: "%{name} đã cập nhật thông báo %{target}" + update_collection_html: "%{name} đã cập nhật collection của %{target}" update_custom_emoji_html: "%{name} đã cập nhật emoji %{target}" update_domain_block_html: "%{name} đã cập nhật chặn máy chủ %{target}" update_ip_block_html: "%{name} đã cập nhật chặn IP %{target}" diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 782b3bcea9..87ada1c7ad 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -263,6 +263,7 @@ zh-CN: demote_user_html: "%{name} 撤销了用户 %{target} 的管理权限" destroy_announcement_html: "%{name} 删除了公告 %{target}" destroy_canonical_email_block_html: "%{name} 解封了 hash 为 %{target} 的邮箱地址" + destroy_collection_html: "%{name} 移除了 %{target} 的收藏列表" destroy_custom_emoji_html: "%{name} 删除了自定义表情 %{target}" destroy_domain_allow_html: "%{name} 拒绝了与站点 %{target} 的联合" destroy_domain_block_html: "%{name} 解除了对站点 %{target} 的屏蔽" @@ -302,6 +303,7 @@ zh-CN: unsilence_account_html: "%{name} 解除了用户 %{target} 的隐藏状态" unsuspend_account_html: "%{name} 解封了用户 %{target}" update_announcement_html: "%{name} 更新了公告 %{target}" + update_collection_html: "%{name} 更新了 %{target} 的收藏列表" update_custom_emoji_html: "%{name} 更新了自定义表情 %{target}" update_domain_block_html: "%{name} 更新了对 %{target} 的域名屏蔽" update_ip_block_html: "%{name} 修改了对 IP %{target} 的规则" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index d1fe0c6c0e..d9582685f9 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -263,6 +263,7 @@ zh-TW: demote_user_html: "%{name} 將使用者 %{target} 降級" destroy_announcement_html: "%{name} 已刪除公告 %{target}" destroy_canonical_email_block_html: "%{name} 已解除封鎖 hash 為 %{target} 之電子郵件" + destroy_collection_html: "%{name} 已刪除 %{target} 的收藏名單" destroy_custom_emoji_html: "%{name} 已刪除 emoji 表情符號 %{target}" destroy_domain_allow_html: "%{name} 不允許與網域 %{target} 加入聯邦宇宙" destroy_domain_block_html: "%{name} 已解除封鎖網域 %{target}" @@ -302,6 +303,7 @@ zh-TW: unsilence_account_html: "%{name} 已取消使用者 %{target} 的靜音狀態" unsuspend_account_html: "%{name} 已取消停權 %{target} 的帳號" update_announcement_html: "%{name} 已更新公告 %{target}" + update_collection_html: "%{name} 已更新 %{target} 的收藏名單" update_custom_emoji_html: "%{name} 已更新自訂 emoji 表情符號 %{target}" update_domain_block_html: "%{name} 已更新 %{target} 之網域封鎖" update_ip_block_html: "%{name} 已變更 IP %{target} 之規則" diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index ca85b0fbfc..2fd32d1361 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -790,17 +790,20 @@ RSpec.describe Account do end end - describe '#featureable?' do - subject { Fabricate.build(:account, domain: (local ? nil : 'example.com'), discoverable:) } + describe '#featureable_by?' do + subject { Fabricate.build(:account, domain: (local ? nil : 'example.com'), discoverable:, feature_approval_policy:) } + + let(:local_account) { Fabricate(:account) } context 'when account is local' do let(:local) { true } + let(:feature_approval_policy) { nil } context 'when account is discoverable' do let(:discoverable) { true } it 'returns `true`' do - expect(subject.featureable?).to be true + expect(subject.featureable_by?(local_account)).to be true end end @@ -808,7 +811,7 @@ RSpec.describe Account do let(:discoverable) { false } it 'returns `false`' do - expect(subject.featureable?).to be false + expect(subject.featureable_by?(local_account)).to be false end end end @@ -816,9 +819,26 @@ RSpec.describe Account do context 'when account is remote' do let(:local) { false } let(:discoverable) { true } + let(:feature_approval_policy) { (0b10 << 16) | 0 } it 'returns `false`' do - expect(subject.featureable?).to be false + expect(subject.featureable_by?(local_account)).to be false + end + + context 'when collections federation is enabled', feature: :collections_federation do + context 'when the policy allows it' do + it 'returns `true`' do + expect(subject.featureable_by?(local_account)).to be true + end + end + + context 'when the policy forbids it' do + let(:feature_approval_policy) { 0 } + + it 'returns `false`' do + expect(subject.featureable_by?(local_account)).to be false + end + end end end end diff --git a/spec/models/collection_item_spec.rb b/spec/models/collection_item_spec.rb index f5497d9041..e4905535cf 100644 --- a/spec/models/collection_item_spec.rb +++ b/spec/models/collection_item_spec.rb @@ -16,14 +16,6 @@ RSpec.describe CollectionItem do it { is_expected.to validate_presence_of(:account) } end - context 'when item is local and account is remote' do - subject { Fabricate.build(:collection_item, account: remote_account) } - - let(:remote_account) { Fabricate.build(:remote_account) } - - it { is_expected.to validate_presence_of(:activity_uri) } - end - context 'when item is not local' do subject { Fabricate.build(:collection_item, collection: remote_collection) } @@ -58,5 +50,11 @@ RSpec.describe CollectionItem do expect(unrelated_item.position).to eq 1 expect(custom_item.position).to eq 7 end + + it 'automatically sets `activity_uri` when account is remote' do + item = collection.collection_items.create(account: Fabricate(:remote_account)) + + expect(item.activity_uri).to be_present + end end end diff --git a/spec/policies/account_policy_spec.rb b/spec/policies/account_policy_spec.rb index 96fcbdb4d8..2f350bc092 100644 --- a/spec/policies/account_policy_spec.rb +++ b/spec/policies/account_policy_spec.rb @@ -165,7 +165,7 @@ RSpec.describe AccountPolicy do end context 'when account is not featureable' do - before { allow(alice).to receive(:featureable?).and_return(false) } + before { allow(alice).to receive(:featureable_by?).and_return(false) } it 'denies' do expect(subject).to_not permit(john, alice) diff --git a/spec/requests/api/v1/profiles_spec.rb b/spec/requests/api/v1/profiles_spec.rb index fa4e8d9a57..faff16bcc1 100644 --- a/spec/requests/api/v1/profiles_spec.rb +++ b/spec/requests/api/v1/profiles_spec.rb @@ -48,7 +48,8 @@ RSpec.describe 'Profile API' do 'note' => account.note, 'show_featured' => account.show_featured, 'show_media' => account.show_media, - 'show_media_replies' => account.show_media_replies + 'show_media_replies' => account.show_media_replies, + 'featured_tags' => [] ) end end diff --git a/spec/serializers/activitypub/feature_request_serializer_spec.rb b/spec/serializers/activitypub/feature_request_serializer_spec.rb new file mode 100644 index 0000000000..45040698f8 --- /dev/null +++ b/spec/serializers/activitypub/feature_request_serializer_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::FeatureRequestSerializer do + subject { serialized_record_json(collection_item, described_class, adapter: ActivityPub::Adapter) } + + let(:tag_manager) { ActivityPub::TagManager.instance } + let(:target_account) { Fabricate(:remote_account) } + let(:collection) { Fabricate(:collection) } + let(:collection_item) { Fabricate(:collection_item, collection:, account: target_account) } + + it 'serializes to the expected json' do + expect(subject).to include({ + 'id' => collection_item.activity_uri, + 'type' => 'FeatureRequest', + 'instrument' => tag_manager.uri_for(collection_item.collection), + 'object' => tag_manager.uri_for(target_account), + }) + + expect(subject).to_not have_key('published') + expect(subject).to_not have_key('to') + expect(subject).to_not have_key('cc') + expect(subject).to_not have_key('target') + end +end diff --git a/spec/services/add_account_to_collection_service_spec.rb b/spec/services/add_account_to_collection_service_spec.rb index 3085c597a7..35c7432ebe 100644 --- a/spec/services/add_account_to_collection_service_spec.rb +++ b/spec/services/add_account_to_collection_service_spec.rb @@ -21,10 +21,22 @@ RSpec.describe AddAccountToCollectionService do expect(new_item.account).to eq account end - it 'federates an `Add` activity', feature: :collections_federation do - subject.call(collection, account) + context 'when the account is local' do + it 'federates an `Add` activity', feature: :collections_federation do + subject.call(collection, account) - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + end + end + + context 'when the account is remote', feature: :collections_federation do + let(:account) { Fabricate(:remote_account, feature_approval_policy: (0b10 << 16)) } + + it 'federates a `FeatureRequest` activity' do + subject.call(collection, account) + + expect(ActivityPub::FeatureRequestWorker).to have_enqueued_sidekiq_job + end end end diff --git a/spec/services/create_collection_service_spec.rb b/spec/services/create_collection_service_spec.rb index 8189b01fbe..0d71117e73 100644 --- a/spec/services/create_collection_service_spec.rb +++ b/spec/services/create_collection_service_spec.rb @@ -61,6 +61,16 @@ RSpec.describe CreateCollectionService do end.to raise_error(Mastodon::NotPermittedError) end end + + context 'when some accounts are remote' do + let(:accounts) { Fabricate.times(2, :remote_account, feature_approval_policy: (0b10 << 16)) } + + it 'federates `FeatureRequest` activities', feature: :collections_federation do + subject.call(params, author) + + expect(ActivityPub::FeatureRequestWorker).to have_enqueued_sidekiq_job.exactly(2).times + end + end end context 'when given a tag' do diff --git a/spec/validators/disallowed_hashtags_validator_spec.rb b/spec/validators/disallowed_hashtags_validator_spec.rb index 570ddb31c2..b725e26a81 100644 --- a/spec/validators/disallowed_hashtags_validator_spec.rb +++ b/spec/validators/disallowed_hashtags_validator_spec.rb @@ -3,46 +3,47 @@ require 'rails_helper' RSpec.describe DisallowedHashtagsValidator do - let(:disallowed_tags) { [] } + subject { Fabricate.build :status } - describe '#validate' do - before do - disallowed_tags.each { |name| Fabricate(:tag, name: name, usable: false) } - described_class.new.validate(status) + let(:tag_string) { 'ok #a #b #c then' } + + context 'when local' do + before { subject.local = true } + + context 'when reblog? is true' do + before { subject.reblog = Fabricate(:status) } + + it { is_expected.to allow_values(nil, tag_string).for(:text) } end - let(:status) { instance_double(Status, errors: errors, local?: local, reblog?: reblog, text: disallowed_tags.map { |x| "##{x}" }.join(' ')) } - let(:errors) { instance_double(ActiveModel::Errors, add: nil) } - - context 'with a remote reblog' do - let(:local) { false } - let(:reblog) { true } - - it 'does not add errors' do - expect(errors).to_not have_received(:add).with(:text, any_args) - end - end - - context 'with a local original status' do - let(:local) { true } - let(:reblog) { false } - - context 'when does not contain any disallowed hashtags' do - let(:disallowed_tags) { [] } - - it 'does not add errors' do - expect(errors).to_not have_received(:add).with(:text, any_args) - end + context 'when reblog? is false' do + context 'when text does not contain unusable tags' do + it { is_expected.to allow_values('text', tag_string).for(:text) } end - context 'when contains disallowed hashtags' do - let(:disallowed_tags) { %w(a b c) } + context 'when text contains unusable tags' do + before { Fabricate :tag, name: 'a', usable: false } - it 'adds an error' do - expect(errors).to have_received(:add) - .with(:text, I18n.t('statuses.disallowed_hashtags', tags: disallowed_tags.join(', '), count: disallowed_tags.size)) + it { is_expected.to_not allow_values(tag_string).for(:text).with_message(disallow_message) } + + def disallow_message + I18n.t('statuses.disallowed_hashtags', tags: 'a', count: 1) end end end end + + context 'when remote' do + before { subject.local = false } + + context 'when reblog? is true' do + before { subject.reblog = Fabricate(:status) } + + it { is_expected.to allow_values(nil, tag_string).for(:text) } + end + + context 'when reblog? is false' do + it { is_expected.to allow_values('text', tag_string).for(:text) } + end + end end diff --git a/spec/workers/activitypub/feature_request_worker_spec.rb b/spec/workers/activitypub/feature_request_worker_spec.rb new file mode 100644 index 0000000000..23e0524f41 --- /dev/null +++ b/spec/workers/activitypub/feature_request_worker_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::FeatureRequestWorker do + subject { described_class.new } + + let(:account) { Fabricate(:account, inbox_url: 'http://example.com', domain: 'example.com') } + let(:collection_owner) { Fabricate(:account) } + let(:collection) { Fabricate(:collection, account: collection_owner) } + let(:collection_item) { Fabricate(:collection_item, collection:, account:) } + + describe '#perform' do + it 'sends the expected `FeatureRequest` activity' do + subject.perform(collection_item.id) + + expect(ActivityPub::DeliveryWorker) + .to have_enqueued_sidekiq_job(expected_json, collection_owner.id, 'http://example.com', {}) + end + + def expected_json + match_json_values( + id: a_string_matching(/^http/), + type: 'FeatureRequest', + object: ActivityPub::TagManager.instance.uri_for(account), + instrument: ActivityPub::TagManager.instance.uri_for(collection_item.collection) + ) + end + end +end