From 93b09d8206a2ea3ff4243a9a068249c0ed0505b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Thu, 19 Jan 2023 15:06:17 +0100 Subject: [PATCH 001/298] Add ability to follow hashtags in web UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/actions/tags.ts | 120 ++++++++++++++++++ app/soapbox/components/ui/card/card.tsx | 18 ++- app/soapbox/components/ui/column/column.tsx | 23 +++- .../features/hashtag-timeline/index.tsx | 28 +++- app/soapbox/normalizers/tag.ts | 1 + app/soapbox/reducers/index.ts | 2 + app/soapbox/reducers/tags.ts | 30 +++++ app/soapbox/utils/features.ts | 7 + 8 files changed, 218 insertions(+), 11 deletions(-) create mode 100644 app/soapbox/actions/tags.ts create mode 100644 app/soapbox/reducers/tags.ts diff --git a/app/soapbox/actions/tags.ts b/app/soapbox/actions/tags.ts new file mode 100644 index 000000000..2c394ba46 --- /dev/null +++ b/app/soapbox/actions/tags.ts @@ -0,0 +1,120 @@ +import api from '../api'; + +import type { AxiosError } from 'axios'; +import type { AppDispatch, RootState } from 'soapbox/store'; +import type { APIEntity } from 'soapbox/types/entities'; + +const HASHTAG_FETCH_REQUEST = 'HASHTAG_FETCH_REQUEST'; +const HASHTAG_FETCH_SUCCESS = 'HASHTAG_FETCH_SUCCESS'; +const HASHTAG_FETCH_FAIL = 'HASHTAG_FETCH_FAIL'; + +const HASHTAG_FOLLOW_REQUEST = 'HASHTAG_FOLLOW_REQUEST'; +const HASHTAG_FOLLOW_SUCCESS = 'HASHTAG_FOLLOW_SUCCESS'; +const HASHTAG_FOLLOW_FAIL = 'HASHTAG_FOLLOW_FAIL'; + +const HASHTAG_UNFOLLOW_REQUEST = 'HASHTAG_UNFOLLOW_REQUEST'; +const HASHTAG_UNFOLLOW_SUCCESS = 'HASHTAG_UNFOLLOW_SUCCESS'; +const HASHTAG_UNFOLLOW_FAIL = 'HASHTAG_UNFOLLOW_FAIL'; + +const fetchHashtag = (name: string) => (dispatch: AppDispatch, getState: () => RootState) => { + dispatch(fetchHashtagRequest()); + + api(getState).get(`/api/v1/tags/${name}`).then(({ data }) => { + dispatch(fetchHashtagSuccess(name, data)); + }).catch(err => { + dispatch(fetchHashtagFail(err)); + }); +}; + +const fetchHashtagRequest = () => ({ + type: HASHTAG_FETCH_REQUEST, +}); + +const fetchHashtagSuccess = (name: string, tag: APIEntity) => ({ + type: HASHTAG_FETCH_SUCCESS, + name, + tag, +}); + +const fetchHashtagFail = (error: AxiosError) => ({ + type: HASHTAG_FETCH_FAIL, + error, +}); + +const followHashtag = (name: string) => (dispatch: AppDispatch, getState: () => RootState) => { + dispatch(followHashtagRequest(name)); + + api(getState).post(`/api/v1/tags/${name}/follow`).then(({ data }) => { + dispatch(followHashtagSuccess(name, data)); + }).catch(err => { + dispatch(followHashtagFail(name, err)); + }); +}; + +const followHashtagRequest = (name: string) => ({ + type: HASHTAG_FOLLOW_REQUEST, + name, +}); + +const followHashtagSuccess = (name: string, tag: APIEntity) => ({ + type: HASHTAG_FOLLOW_SUCCESS, + name, + tag, +}); + +const followHashtagFail = (name: string, error: AxiosError) => ({ + type: HASHTAG_FOLLOW_FAIL, + name, + error, +}); + +const unfollowHashtag = (name: string) => (dispatch: AppDispatch, getState: () => RootState) => { + dispatch(unfollowHashtagRequest(name)); + + api(getState).post(`/api/v1/tags/${name}/unfollow`).then(({ data }) => { + dispatch(unfollowHashtagSuccess(name, data)); + }).catch(err => { + dispatch(unfollowHashtagFail(name, err)); + }); +}; + +const unfollowHashtagRequest = (name: string) => ({ + type: HASHTAG_UNFOLLOW_REQUEST, + name, +}); + +const unfollowHashtagSuccess = (name: string, tag: APIEntity) => ({ + type: HASHTAG_UNFOLLOW_SUCCESS, + name, + tag, +}); + +const unfollowHashtagFail = (name: string, error: AxiosError) => ({ + type: HASHTAG_UNFOLLOW_FAIL, + name, + error, +}); + +export { + HASHTAG_FETCH_REQUEST, + HASHTAG_FETCH_SUCCESS, + HASHTAG_FETCH_FAIL, + HASHTAG_FOLLOW_REQUEST, + HASHTAG_FOLLOW_SUCCESS, + HASHTAG_FOLLOW_FAIL, + HASHTAG_UNFOLLOW_REQUEST, + HASHTAG_UNFOLLOW_SUCCESS, + HASHTAG_UNFOLLOW_FAIL, + fetchHashtag, + fetchHashtagRequest, + fetchHashtagSuccess, + fetchHashtagFail, + followHashtag, + followHashtagRequest, + followHashtagSuccess, + followHashtagFail, + unfollowHashtag, + unfollowHashtagRequest, + unfollowHashtagSuccess, + unfollowHashtagFail, +}; diff --git a/app/soapbox/components/ui/card/card.tsx b/app/soapbox/components/ui/card/card.tsx index 6fc85a39a..2cc23b6b4 100644 --- a/app/soapbox/components/ui/card/card.tsx +++ b/app/soapbox/components/ui/card/card.tsx @@ -45,6 +45,12 @@ interface ICardHeader { backHref?: string, onBackClick?: (event: React.MouseEvent) => void className?: string + /** Callback when the card action is clicked. */ + onActionClick?: () => void, + /** URL to the svg icon for the card action. */ + actionIcon?: string, + /** Text for the action. */ + actionTitle?: string, children?: React.ReactNode } @@ -52,7 +58,7 @@ interface ICardHeader { * Card header container with back button. * Typically holds a CardTitle. */ -const CardHeader: React.FC = ({ className, children, backHref, onBackClick }): JSX.Element => { +const CardHeader: React.FC = ({ className, children, backHref, onBackClick, onActionClick, actionIcon, actionTitle }): JSX.Element => { const intl = useIntl(); const renderBackButton = () => { @@ -64,7 +70,7 @@ const CardHeader: React.FC = ({ className, children, backHref, onBa const backAttributes = backHref ? { to: backHref } : { onClick: onBackClick }; return ( - + {intl.formatMessage(messages.back)} @@ -76,6 +82,12 @@ const CardHeader: React.FC = ({ className, children, backHref, onBa {renderBackButton()} {children} + + {onActionClick && actionIcon && ( + + )} ); }; @@ -86,7 +98,7 @@ interface ICardTitle { /** A card's title. */ const CardTitle: React.FC = ({ title }): JSX.Element => ( - {title} + {title} ); interface ICardBody { diff --git a/app/soapbox/components/ui/column/column.tsx b/app/soapbox/components/ui/column/column.tsx index 5ccf3ac42..7099b792d 100644 --- a/app/soapbox/components/ui/column/column.tsx +++ b/app/soapbox/components/ui/column/column.tsx @@ -7,10 +7,10 @@ import { useSoapboxConfig } from 'soapbox/hooks'; import { Card, CardBody, CardHeader, CardTitle } from '../card/card'; -type IColumnHeader = Pick; +type IColumnHeader = Pick; /** Contains the column title with optional back button. */ -const ColumnHeader: React.FC = ({ label, backHref, className }) => { +const ColumnHeader: React.FC = ({ label, backHref, className, onActionClick, actionIcon, actionTitle }) => { const history = useHistory(); const handleBackClick = () => { @@ -27,7 +27,13 @@ const ColumnHeader: React.FC = ({ label, backHref, className }) = }; return ( - + ); @@ -46,13 +52,19 @@ export interface IColumn { className?: string, /** Ref forwarded to column. */ ref?: React.Ref + /** Callback when the column action is clicked. */ + onActionClick?: () => void, + /** URL to the svg icon for the column action. */ + actionIcon?: string, + /** Text for the action. */ + actionTitle?: string, /** Children to display in the column. */ children?: React.ReactNode } /** A backdrop for the main section of the UI. */ const Column: React.FC = React.forwardRef((props, ref: React.ForwardedRef): JSX.Element => { - const { backHref, children, label, transparent = false, withHeader = true, className } = props; + const { backHref, children, label, transparent = false, withHeader = true, onActionClick, actionIcon, actionTitle, className } = props; const soapboxConfig = useSoapboxConfig(); return ( @@ -75,6 +87,9 @@ const Column: React.FC = React.forwardRef((props, ref: React.ForwardedR label={label} backHref={backHref} className={classNames({ 'px-4 pt-4 sm:p-0': transparent })} + onActionClick={onActionClick} + actionIcon={actionIcon} + actionTitle={actionTitle} /> )} diff --git a/app/soapbox/features/hashtag-timeline/index.tsx b/app/soapbox/features/hashtag-timeline/index.tsx index 133a96a5f..2587ff374 100644 --- a/app/soapbox/features/hashtag-timeline/index.tsx +++ b/app/soapbox/features/hashtag-timeline/index.tsx @@ -2,10 +2,11 @@ import React, { useEffect, useRef } from 'react'; import { useIntl, defineMessages } from 'react-intl'; import { connectHashtagStream } from 'soapbox/actions/streaming'; +import { fetchHashtag, followHashtag, unfollowHashtag } from 'soapbox/actions/tags'; import { expandHashtagTimeline, clearTimeline } from 'soapbox/actions/timelines'; import { Column } from 'soapbox/components/ui'; import Timeline from 'soapbox/features/ui/components/timeline'; -import { useAppDispatch } from 'soapbox/hooks'; +import { useAppDispatch, useAppSelector, useFeatures } from 'soapbox/hooks'; import type { Tag as TagEntity } from 'soapbox/types/entities'; @@ -18,6 +19,8 @@ const messages = defineMessages({ any: { id: 'hashtag.column_header.tag_mode.any', defaultMessage: 'or {additional}' }, all: { id: 'hashtag.column_header.tag_mode.all', defaultMessage: 'and {additional}' }, none: { id: 'hashtag.column_header.tag_mode.none', defaultMessage: 'without {additional}' }, + followHashtag: { id: 'hashtag.follow', defaultMessage: 'Follow hashtag' }, + unfollowHashtag: { id: 'hashtag.unfollow', defaultMessage: 'Unfollow hashtag' }, empty: { id: 'empty_column.hashtag', defaultMessage: 'There is nothing in this hashtag yet.' }, }); @@ -32,9 +35,11 @@ export const HashtagTimeline: React.FC = ({ params }) => { const intl = useIntl(); const id = params?.id || ''; const tags = params?.tags || { any: [], all: [], none: [] }; - + + const features = useFeatures(); const dispatch = useAppDispatch(); const disconnects = useRef<(() => void)[]>([]); + const tag = useAppSelector((state) => state.tags.get(id)); // Mastodon supports displaying results from multiple hashtags. // https://github.com/mastodon/mastodon/issues/6359 @@ -88,9 +93,18 @@ export const HashtagTimeline: React.FC = ({ params }) => { dispatch(expandHashtagTimeline(id, { maxId, tags })); }; + const handleFollow = () => { + if (tag?.following) { + dispatch(unfollowHashtag(id)); + } else { + dispatch(followHashtag(id)); + } + }; + useEffect(() => { subscribe(); dispatch(expandHashtagTimeline(id, { tags })); + dispatch(fetchHashtag(id)); return () => { unsubscribe(); @@ -105,7 +119,13 @@ export const HashtagTimeline: React.FC = ({ params }) => { }, [id]); return ( - + = ({ params }) => { ); }; -export default HashtagTimeline; \ No newline at end of file +export default HashtagTimeline; diff --git a/app/soapbox/normalizers/tag.ts b/app/soapbox/normalizers/tag.ts index 6d0ebae14..fde58241f 100644 --- a/app/soapbox/normalizers/tag.ts +++ b/app/soapbox/normalizers/tag.ts @@ -19,6 +19,7 @@ export const TagRecord = ImmutableRecord({ name: '', url: '', history: null as ImmutableList | null, + following: false, }); const normalizeHistoryList = (tag: ImmutableMap) => { diff --git a/app/soapbox/reducers/index.ts b/app/soapbox/reducers/index.ts index 5b5cca999..1d1d71802 100644 --- a/app/soapbox/reducers/index.ts +++ b/app/soapbox/reducers/index.ts @@ -56,6 +56,7 @@ import status_hover_card from './status-hover-card'; import status_lists from './status-lists'; import statuses from './statuses'; import suggestions from './suggestions'; +import tags from './tags'; import timelines from './timelines'; import trending_statuses from './trending-statuses'; import trends from './trends'; @@ -120,6 +121,7 @@ const reducers = { announcements, compose_event, admin_user_index, + tags, }; // Build a default state from all reducers: it has the key and `undefined` diff --git a/app/soapbox/reducers/tags.ts b/app/soapbox/reducers/tags.ts new file mode 100644 index 000000000..81488bb1e --- /dev/null +++ b/app/soapbox/reducers/tags.ts @@ -0,0 +1,30 @@ +import { Map as ImmutableMap } from 'immutable'; + +import { + HASHTAG_FETCH_SUCCESS, + HASHTAG_FOLLOW_REQUEST, + HASHTAG_FOLLOW_FAIL, + HASHTAG_UNFOLLOW_REQUEST, + HASHTAG_UNFOLLOW_FAIL, +} from 'soapbox/actions/tags'; +import { normalizeTag } from 'soapbox/normalizers'; + +import type { AnyAction } from 'redux'; +import type { Tag } from 'soapbox/types/entities'; + +const initialState = ImmutableMap(); + +export default function tags(state = initialState, action: AnyAction) { + switch (action.type) { + case HASHTAG_FETCH_SUCCESS: + return state.set(action.name, normalizeTag(action.tag)); + case HASHTAG_FOLLOW_REQUEST: + case HASHTAG_UNFOLLOW_FAIL: + return state.setIn([action.name, 'following'], true); + case HASHTAG_FOLLOW_FAIL: + case HASHTAG_UNFOLLOW_REQUEST: + return state.setIn([action.name, 'following'], false); + default: + return state; + } +} diff --git a/app/soapbox/utils/features.ts b/app/soapbox/utils/features.ts index 39950a534..2f24c07f4 100644 --- a/app/soapbox/utils/features.ts +++ b/app/soapbox/utils/features.ts @@ -447,6 +447,13 @@ const getInstanceFeatures = (instance: Instance) => { */ focalPoint: v.software === MASTODON && gte(v.compatVersion, '2.3.0'), + /** + * Ability to follow hashtags. + * @see POST /api/v1/tags/:name/follow + * @see POST /api/v1/tags/:name/unfollow + */ + followHashtags: v.software === MASTODON && gte(v.compatVersion, '4.0.0'), + /** * Ability to lock accounts and manually approve followers. * @see PATCH /api/v1/accounts/update_credentials From d891024cb54ab02f6410e4f2766f2e36ca3f887c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Fri, 20 Jan 2023 14:20:50 +0100 Subject: [PATCH 002/298] Update en.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/locales/en.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/soapbox/locales/en.json b/app/soapbox/locales/en.json index 05613e17f..899020207 100644 --- a/app/soapbox/locales/en.json +++ b/app/soapbox/locales/en.json @@ -695,6 +695,8 @@ "hashtag.column_header.tag_mode.all": "and {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.follow": "Follow hashtag", + "hashtag.unfollow": "Unfollow hashtag", "header.home.label": "Home", "header.login.forgot_password": "Forgot password?", "header.login.label": "Log in", From 0ec5ec712977ef298e0169a4c82652f8a47be812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Fri, 20 Jan 2023 22:32:51 +0100 Subject: [PATCH 003/298] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cdc24413..8eac50477 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Admin: redirect the homepage to any URL. - Compatibility: added compatibility with Friendica. +- Hashtags: let users follow hashtags (Mastodon). ### Changed From d4bcdf428f65c5f4fcacc20c9d76e9ec6e1f174d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Sat, 4 Feb 2023 11:44:12 +0100 Subject: [PATCH 004/298] wip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/utils/features.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/soapbox/utils/features.ts b/app/soapbox/utils/features.ts index 2f24c07f4..0068f17dd 100644 --- a/app/soapbox/utils/features.ts +++ b/app/soapbox/utils/features.ts @@ -463,6 +463,12 @@ const getInstanceFeatures = (instance: Instance) => { v.software === PLEROMA, ]), + /** + * Ability to list followed hashtags. + * @see GET /api/v1/followed_tags + */ + followedHashtagsList: v.software === MASTODON && gte(v.compatVersion, '4.1.0'), + /** * Whether client settings can be retrieved from the API. * @see GET /api/pleroma/frontend_configurations From f67f23274c637d8e188902b55e37e2d0da59c41d Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 16 Mar 2023 11:30:46 +0000 Subject: [PATCH 005/298] Translated using Weblate (Spanish) Currently translated at 100.0% (1524 of 1524 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/es/ --- app/soapbox/locales/es.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index f8d341c64..521de0979 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -472,7 +472,7 @@ "confirmations.block.message": "¿Estás seguro de que quieres bloquear a {name}?", "confirmations.block_from_group.confirm": "Bloquear", "confirmations.block_from_group.heading": "Miembro de un grupo de bloqueo", - "confirmations.block_from_group.message": "¿Estás seguro de que quieres bloquear a @{name} para que no interactúe con este grupo?", + "confirmations.block_from_group.message": "¿Estás seguro de que quieres expulsar a @{name} del grupo?", "confirmations.cancel.confirm": "Descartar", "confirmations.cancel.heading": "Descartar la publicación", "confirmations.cancel.message": "¿Está seguro de que desea cancelar esta publicación?", @@ -770,8 +770,8 @@ "group.cancel_request": "Cancelar solicitud", "group.group_mod_authorize": "Aceptar", "group.group_mod_authorize.success": "Aceptado @{name} al grupo", - "group.group_mod_block": "Bloquear a @{name} del grupo", - "group.group_mod_block.success": "@{name} bloqueado del grupo", + "group.group_mod_block": "Expulsar del grupo", + "group.group_mod_block.success": "Has bloqueado correctamente a @{name} del grupo", "group.group_mod_demote": "Degradar a @{name}", "group.group_mod_demote.success": "Degradado a @{name} a usuario del grupo", "group.group_mod_kick": "Expulsar a @{name} del grupo", @@ -793,7 +793,11 @@ "group.leave.success": "Abandonó el grupo", "group.manage": "Gestionar el Grupo", "group.privacy.locked": "Privado", + "group.privacy.locked.full": "Grupo privado", + "group.privacy.locked.info": "Descubrible. Los usuarios pueden unirse después de que se apruebe su solicitud.", "group.privacy.public": "Público", + "group.privacy.public.full": "Grupo público", + "group.privacy.public.info": "Descubrible. Cualquiera puede participar.", "group.role.admin": "Administrador", "group.role.moderator": "Moderador", "group.tabs.all": "Todos", From 4c7d8029c09a556eb3e63a890cbce67261c11ba5 Mon Sep 17 00:00:00 2001 From: Isabell De Inschnitzel Date: Sat, 18 Mar 2023 12:58:55 +0000 Subject: [PATCH 006/298] Translated using Weblate (German) Currently translated at 93.1% (1419 of 1524 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/de/ --- app/soapbox/locales/de.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index b8d18b298..a38f31b42 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -7,7 +7,7 @@ "account.birthday": "Geburtsdatum {date}", "account.birthday_today": "Hat heute Geburtstag!", "account.block": "Blockieren", - "account.block_domain": "Domäne verstecken", + "account.block_domain": "Domain verbergen", "account.blocked": "Blockiert", "account.chat": "Mit @{name} chatten", "account.deactivated": "Deaktiviert", @@ -304,7 +304,7 @@ "column.filters.create_error": "Fehler beim Hinzufügen des Filters", "column.filters.delete": "Löschen", "column.filters.delete_error": "Fehler beim Löschen des Filters", - "column.filters.drop_header": "Entfernen statt verstecken", + "column.filters.drop_header": "Entfernen statt verbergen", "column.filters.drop_hint": "Gefilterte Beiträge bleiben dauerhaft unsichtbar, auch wenn der Filter später entfernt wird", "column.filters.expires": "Gültig bis", "column.filters.home_timeline": "Persönliche Timeline", @@ -335,9 +335,9 @@ "column.pins": "Angeheftete Beiträge", "column.preferences": "Einstellungen", "column.public": "Föderierte Zeitleiste", - "column.quotes": "Zitierte Beiträge", + "column.quotes": "Zitiert von", "column.reactions": "Reaktionen", - "column.reblogs": "Geteilte Beiträge", + "column.reblogs": "Geteilt von", "column.scheduled_statuses": "Vorbereitete Beiträge", "column.search": "Suche", "column.settings_store": "Einstellungsspeicher", @@ -702,7 +702,7 @@ "filters.context_hint": "Ein oder mehrere Kontexte, auf die der Filter angewendet werden soll", "filters.filters_list_context_label": "Kontexte filtern:", "filters.filters_list_drop": "Weg damit", - "filters.filters_list_hide": "Verstecken", + "filters.filters_list_hide": "Verbergen", "filters.removed": "Filter gelöscht.", "followRecommendations.heading": "Vorgeschlagene Profile", "follow_request.authorize": "Bestätigen", @@ -807,8 +807,8 @@ "keyboard_shortcuts.reply": "antworten", "keyboard_shortcuts.requests": "Liste der Folgeanfragen öffnen", "keyboard_shortcuts.search": "Suche fokussieren", - "keyboard_shortcuts.toggle_hidden": "Text hinter einer Inhaltswarnung verstecken/anzeigen", - "keyboard_shortcuts.toggle_sensitivity": "Medien hinter einer Inhaltswarnung verstecken/anzeigen", + "keyboard_shortcuts.toggle_hidden": "Text hinter einer Inhaltswarnung verbergen/anzeigen", + "keyboard_shortcuts.toggle_sensitivity": "Medien hinter einer Inhaltswarnung verbergen/anzeigen", "keyboard_shortcuts.toot": "einen neuen Beitrag erstellen", "keyboard_shortcuts.unfocus": "Textfeld/die Suche nicht mehr fokussieren", "keyboard_shortcuts.up": "sich in der Liste hinauf bewegen", @@ -905,7 +905,7 @@ "modals.policy.submit": "Akzeptieren & Weiter", "modals.policy.updateTitle": "Du hast die neueste Version von {siteTitle} erhalten! Nimm dir einen Moment Zeit, um die aufregenden neuen Dinge zu sehen, an denen wir gearbeitet haben.", "moderation_overlay.contact": "Kontakt", - "moderation_overlay.hide": "Inhalt verstecken", + "moderation_overlay.hide": "Inhalt verbergen", "moderation_overlay.show": "Anzeigen", "moderation_overlay.subtitle": "Dieser Beitrag wurde zur Überprüfung an die Moderation geschickt und ist nur für dich sichtbar. Wenn du glaubst, dass dies ein Fehler ist, kontaktiere bitte den Support.", "moderation_overlay.title": "Inhalt wird überprüft", From 21a7fbab9d6e6bf7f400275925f78cea0297bb09 Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Sun, 19 Mar 2023 09:13:21 +0000 Subject: [PATCH 007/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1524 of 1524 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index daa933280..99319ece7 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -472,7 +472,7 @@ "confirmations.block.message": "您确定要屏蔽 {name} 吗?", "confirmations.block_from_group.confirm": "屏蔽", "confirmations.block_from_group.heading": "屏蔽群组成员", - "confirmations.block_from_group.message": "您确定要屏蔽 @{name} 与此群组互动吗?", + "confirmations.block_from_group.message": "您确定要从群组中封禁 @{name} 吗?", "confirmations.cancel.confirm": "丢弃", "confirmations.cancel.heading": "丢弃帖文", "confirmations.cancel.message": "您确定要取消创建此帖文吗?", @@ -770,8 +770,8 @@ "group.cancel_request": "取消申请", "group.group_mod_authorize": "允许", "group.group_mod_authorize.success": "已允许 @{name} 加入群组", - "group.group_mod_block": "从群组中屏蔽 @{name}", - "group.group_mod_block.success": "已从群组中屏蔽 @{name}", + "group.group_mod_block": "从群组中封禁 @{name}", + "group.group_mod_block.success": "您已成功从群组中封禁 @{name}", "group.group_mod_demote": "降级 @{name}", "group.group_mod_demote.success": "@{name} 已被降级为群组用户", "group.group_mod_kick": "从群组中踢出 @{name}", @@ -793,7 +793,11 @@ "group.leave.success": "离开了群组", "group.manage": "管理群组", "group.privacy.locked": "私有", + "group.privacy.locked.full": "私有群组", + "group.privacy.locked.info": "可发现。用户可以在其申请被批准后加入。", "group.privacy.public": "公开", + "group.privacy.public.full": "公开群组", + "group.privacy.public.info": "可发现。任何人都可以加入。", "group.role.admin": "管理员", "group.role.moderator": "监察员", "group.tabs.all": "全部", From ffd11b0aa3e8497146b79089d27cdeecda521a9f Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 20 Mar 2023 21:09:08 +0100 Subject: [PATCH 008/298] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ --- app/soapbox/locales/ar.json | 4 ---- app/soapbox/locales/de.json | 4 ---- app/soapbox/locales/es.json | 4 ---- app/soapbox/locales/it.json | 4 ---- app/soapbox/locales/no.json | 4 ---- app/soapbox/locales/pl.json | 3 --- app/soapbox/locales/zh-CN.json | 4 ---- 7 files changed, 27 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index 7a72e4fa2..9866c01e1 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -495,7 +495,6 @@ "confirmations.mute.confirm": "كتم", "confirmations.mute.heading": "كتم @{name}", "confirmations.mute.message": "هل تود حقًا حجب {name}؟", - "confirmations.promote_in_group.confirm": "ترقية", "confirmations.promote_in_group.message": "هل أنت متأكد أنك تريد الترقية لـ @ {name}؟ لن تكون قادرًا على تخفيض رتبتهم.", "confirmations.redraft.confirm": "إزالة و إعادة الصياغة", "confirmations.redraft.heading": "إزالة وإعادة الصياغة", @@ -744,13 +743,10 @@ "group.group_mod_block": "حظر @{name} من المجموعة", "group.group_mod_block.success": "حُظِرَ @{name} من المجموعة", "group.group_mod_demote": "خفض الرتبة", - "group.group_mod_demote.success": "خفض رتبة @{name} إلى مستخدم المجموعة", "group.group_mod_kick": "طرد @{name} من المجموعة", "group.group_mod_kick.success": "طُرِدَ @{name} من المجموعة", - "group.group_mod_promote_admin": "ترقية @{name} إلى مسؤول المجموعة", "group.group_mod_promote_admin.success": "تمت ترقية @{name} إلى مسؤول المجموعة", "group.group_mod_promote_mod": "ترقية @{name} إلى مشرف المجموعة", - "group.group_mod_promote_mod.success": "تمت ترقية @{name} إلى مشرف المجموعة", "group.group_mod_reject": "رفض", "group.group_mod_reject.success": "مرفوض @{name} من المجموعة", "group.group_mod_unblock": "رفع الحظر", diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index a38f31b42..1ba5a5b7d 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -470,7 +470,6 @@ "confirmations.mute.confirm": "Stummschalten", "confirmations.mute.heading": "Stummschalten", "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", - "confirmations.promote_in_group.confirm": "Befördern", "confirmations.promote_in_group.message": "@{name} wirklich befördern? Die Beförderung kann nicht rückgängig gemacht werden.", "confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.heading": "Löschen und nue erstellen", @@ -718,13 +717,10 @@ "group.group_mod_block": "@{name} aus der Gruppe blockieren", "group.group_mod_block.success": "@{name} in der Gruppe blockiert", "group.group_mod_demote": "@{name} herunterstufen", - "group.group_mod_demote.success": "@{name} heruntergestuft", "group.group_mod_kick": "@{name} aus der Gruppe werfen", "group.group_mod_kick.success": "@{name} aus der Gruppe entfernt", - "group.group_mod_promote_admin": "@{name} zum Gruppenadmin ernennen", "group.group_mod_promote_admin.success": "@{name} als Gruppen-Admin ernannt", "group.group_mod_promote_mod": "@{name} zur Moderator:in der Gruppe ernennen", - "group.group_mod_promote_mod.success": "@{name} als Moderator:in ernannt", "group.group_mod_reject": "Ablehnen", "group.group_mod_reject.success": "@{name} in der Gruppe abgelehnt", "group.group_mod_unblock": "Entblocken", diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index 521de0979..9ed1358a8 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -509,7 +509,6 @@ "confirmations.mute.confirm": "Silenciar", "confirmations.mute.heading": "Mute @{name}", "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", - "confirmations.promote_in_group.confirm": "Promover", "confirmations.promote_in_group.message": "¿Estás seguro de que quieres ascender a @{name}? No podrás degradarlo.", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.heading": "Delete & redraft", @@ -773,13 +772,10 @@ "group.group_mod_block": "Expulsar del grupo", "group.group_mod_block.success": "Has bloqueado correctamente a @{name} del grupo", "group.group_mod_demote": "Degradar a @{name}", - "group.group_mod_demote.success": "Degradado a @{name} a usuario del grupo", "group.group_mod_kick": "Expulsar a @{name} del grupo", "group.group_mod_kick.success": "Expulsar a @{name} del grupo", - "group.group_mod_promote_admin": "Ascender a @{name} a administrador del grupo", "group.group_mod_promote_admin.success": "Ascendió a @{nombre} a administrador del grupo", "group.group_mod_promote_mod": "Ascender a @{name} a moderador del grupo", - "group.group_mod_promote_mod.success": "Ascendió a @{nombre} a moderador del grupo", "group.group_mod_reject": "Rechazar", "group.group_mod_reject.success": "Rechazado @{name} del grupo", "group.group_mod_unblock": "Desbloquear", diff --git a/app/soapbox/locales/it.json b/app/soapbox/locales/it.json index 3217f9243..7985496db 100644 --- a/app/soapbox/locales/it.json +++ b/app/soapbox/locales/it.json @@ -495,7 +495,6 @@ "confirmations.mute.confirm": "Silenzia", "confirmations.mute.heading": "Silenzia @{name}", "confirmations.mute.message": "Vuoi davvero silenziare {name}?", - "confirmations.promote_in_group.confirm": "Promuovi", "confirmations.promote_in_group.message": "Vuoi davvero promuovere @{nome}? Non sarai in grado di degradare questa persona.", "confirmations.redraft.confirm": "Cancella e riscrivi", "confirmations.redraft.heading": "Cancella e riscrivi", @@ -754,13 +753,10 @@ "group.group_mod_block": "Blocca @{name} dal gruppo", "group.group_mod_block.success": "Hai bloccato @{name} dal gruppo", "group.group_mod_demote": "Degrada @{name}", - "group.group_mod_demote.success": "Hai degradato @{name} a partecipante del gruppo", "group.group_mod_kick": "Espelli @{name} dal gruppo", "group.group_mod_kick.success": "Hai espulso @{name} dal gruppo", - "group.group_mod_promote_admin": "Promuovi @{name} all'amministrazione del gruppo", "group.group_mod_promote_admin.success": "Hai promosso @{name} all'amministrazione del gruppo", "group.group_mod_promote_mod": "Promuovi @{name} alla moderazione del gruppo", - "group.group_mod_promote_mod.success": "Hai promosso @{name} alla moderazione del gruppo", "group.group_mod_reject": "Rifiuta", "group.group_mod_reject.success": "Hai rifiutato la partecipazione di @{name} nel gruppo", "group.group_mod_unblock": "Sblocca", diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index 1e1a8bc1c..a5261e0af 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -495,7 +495,6 @@ "confirmations.mute.confirm": "Demp", "confirmations.mute.heading": "Demp @{name}", "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", - "confirmations.promote_in_group.confirm": "Fremhev", "confirmations.promote_in_group.message": "Er du sikker på at du vil forfremme @{name}? Du vil ikke kunne degradere dem.", "confirmations.redraft.confirm": "Slett & omformuler", "confirmations.redraft.heading": "Slett & omformuler", @@ -744,13 +743,10 @@ "group.group_mod_block": "Blokker @{name} fra gruppe", "group.group_mod_block.success": "Blokkert @{navn} fra gruppe", "group.group_mod_demote": "Degradere @{navn}", - "group.group_mod_demote.success": "Nedgradert @{name} til gruppebruker", "group.group_mod_kick": "Spark ut @{name} fra gruppa", "group.group_mod_kick.success": "Sparket ut @{name} fra gruppa", - "group.group_mod_promote_admin": "Forfremme @{name} til gruppeadministrator", "group.group_mod_promote_admin.success": "Forfremmet @{name} til gruppeadministrator", "group.group_mod_promote_mod": "Forfrem @{name} til gruppemoderator", - "group.group_mod_promote_mod.success": "Forfremmet @{name} til gruppemoderator", "group.group_mod_reject": "Avvis", "group.group_mod_reject.success": "Avvist @{navn} fra gruppen", "group.group_mod_unblock": "Opphev Blokkering", diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json index bbaac7998..ad0a162c8 100644 --- a/app/soapbox/locales/pl.json +++ b/app/soapbox/locales/pl.json @@ -473,7 +473,6 @@ "confirmations.mute.confirm": "Wycisz", "confirmations.mute.heading": "Wycisz @{name}", "confirmations.mute.message": "Czy na pewno chcesz wyciszyć {name}?", - "confirmations.promote_in_group.confirm": "Promuj", "confirmations.promote_in_group.message": "Czy na pewno chcesz promować @{name}? Nie będziesz mógł(-ła) obniżyć ich rangi.", "confirmations.redraft.confirm": "Usuń i przeredaguj", "confirmations.redraft.heading": "Usuń i przeredaguj", @@ -717,10 +716,8 @@ "group.group_mod_block.success": "Zablokowano @{name} z grupy", "group.group_mod_kick": "Wyrzuć @{name} z grupy", "group.group_mod_kick.success": "Wyrzucono @{name} z grupy", - "group.group_mod_promote_admin": "Promuj @{name} na administratora grupy", "group.group_mod_promote_admin.success": "Promowano @{name} na administratora grupy", "group.group_mod_promote_mod": "Promuj @{name} na moderatora grupy", - "group.group_mod_promote_mod.success": "Promowano @{name} na moderatora grupy", "group.group_mod_reject": "Odrzuć", "group.group_mod_unblock": "Odblokuj", "group.header.alt": "Nagłówek grupy", diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index 99319ece7..4a2b171fb 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -509,7 +509,6 @@ "confirmations.mute.confirm": "静音", "confirmations.mute.heading": "静音 @{name}", "confirmations.mute.message": "您确定要静音 {name} 吗?", - "confirmations.promote_in_group.confirm": "升级", "confirmations.promote_in_group.message": "您确定要升级 @{name} 吗?您将无法将其降级。", "confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.heading": "删除并重新编辑", @@ -773,13 +772,10 @@ "group.group_mod_block": "从群组中封禁 @{name}", "group.group_mod_block.success": "您已成功从群组中封禁 @{name}", "group.group_mod_demote": "降级 @{name}", - "group.group_mod_demote.success": "@{name} 已被降级为群组用户", "group.group_mod_kick": "从群组中踢出 @{name}", "group.group_mod_kick.success": "已从群组中踢出 @{name}", - "group.group_mod_promote_admin": "升级 @{name} 至群组管理员", "group.group_mod_promote_admin.success": "已升级 @{name} 至群组管理员", "group.group_mod_promote_mod": "升级 @{name} 至群组监察员", - "group.group_mod_promote_mod.success": "已升级 @{name} 至群组监察员", "group.group_mod_reject": "拒绝", "group.group_mod_reject.success": "已拒绝 @{name} 加入群组", "group.group_mod_unblock": "解除屏蔽", From 7b10065e735714662e7c4197670337396dd4eaab Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 20 Mar 2023 22:35:53 +0100 Subject: [PATCH 009/298] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ --- app/soapbox/locales/ar.json | 2 -- app/soapbox/locales/de.json | 2 -- app/soapbox/locales/es.json | 2 -- app/soapbox/locales/it.json | 2 -- app/soapbox/locales/no.json | 2 -- app/soapbox/locales/pl.json | 2 -- app/soapbox/locales/zh-CN.json | 2 -- 7 files changed, 14 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index 9866c01e1..020264634 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -495,7 +495,6 @@ "confirmations.mute.confirm": "كتم", "confirmations.mute.heading": "كتم @{name}", "confirmations.mute.message": "هل تود حقًا حجب {name}؟", - "confirmations.promote_in_group.message": "هل أنت متأكد أنك تريد الترقية لـ @ {name}؟ لن تكون قادرًا على تخفيض رتبتهم.", "confirmations.redraft.confirm": "إزالة و إعادة الصياغة", "confirmations.redraft.heading": "إزالة وإعادة الصياغة", "confirmations.redraft.message": "هل تود حقًّا حذف المنشور وإعادة صياغته؟ ستفقد التفاعلات والمشاركات المتعلّقة به وستظهر الردود كمنشورات منفصلة. ", @@ -745,7 +744,6 @@ "group.group_mod_demote": "خفض الرتبة", "group.group_mod_kick": "طرد @{name} من المجموعة", "group.group_mod_kick.success": "طُرِدَ @{name} من المجموعة", - "group.group_mod_promote_admin.success": "تمت ترقية @{name} إلى مسؤول المجموعة", "group.group_mod_promote_mod": "ترقية @{name} إلى مشرف المجموعة", "group.group_mod_reject": "رفض", "group.group_mod_reject.success": "مرفوض @{name} من المجموعة", diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index 1ba5a5b7d..345f3f6f2 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -470,7 +470,6 @@ "confirmations.mute.confirm": "Stummschalten", "confirmations.mute.heading": "Stummschalten", "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", - "confirmations.promote_in_group.message": "@{name} wirklich befördern? Die Beförderung kann nicht rückgängig gemacht werden.", "confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.heading": "Löschen und nue erstellen", "confirmations.redraft.message": "Bist du dir sicher, dass du diesen Beitrag löschen und neu erstellen möchtest? Favorisierungen, geteilte Beiträge und Antworten werden verloren gehen.", @@ -719,7 +718,6 @@ "group.group_mod_demote": "@{name} herunterstufen", "group.group_mod_kick": "@{name} aus der Gruppe werfen", "group.group_mod_kick.success": "@{name} aus der Gruppe entfernt", - "group.group_mod_promote_admin.success": "@{name} als Gruppen-Admin ernannt", "group.group_mod_promote_mod": "@{name} zur Moderator:in der Gruppe ernennen", "group.group_mod_reject": "Ablehnen", "group.group_mod_reject.success": "@{name} in der Gruppe abgelehnt", diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index 9ed1358a8..e35b389de 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -509,7 +509,6 @@ "confirmations.mute.confirm": "Silenciar", "confirmations.mute.heading": "Mute @{name}", "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", - "confirmations.promote_in_group.message": "¿Estás seguro de que quieres ascender a @{name}? No podrás degradarlo.", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.heading": "Delete & redraft", "confirmations.redraft.message": "Estás seguro de que quieres borrar este estado y volverlo a borrador? Perderás todas las respuestas, impulsos y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanos.", @@ -774,7 +773,6 @@ "group.group_mod_demote": "Degradar a @{name}", "group.group_mod_kick": "Expulsar a @{name} del grupo", "group.group_mod_kick.success": "Expulsar a @{name} del grupo", - "group.group_mod_promote_admin.success": "Ascendió a @{nombre} a administrador del grupo", "group.group_mod_promote_mod": "Ascender a @{name} a moderador del grupo", "group.group_mod_reject": "Rechazar", "group.group_mod_reject.success": "Rechazado @{name} del grupo", diff --git a/app/soapbox/locales/it.json b/app/soapbox/locales/it.json index 7985496db..430d85e1d 100644 --- a/app/soapbox/locales/it.json +++ b/app/soapbox/locales/it.json @@ -495,7 +495,6 @@ "confirmations.mute.confirm": "Silenzia", "confirmations.mute.heading": "Silenzia @{name}", "confirmations.mute.message": "Vuoi davvero silenziare {name}?", - "confirmations.promote_in_group.message": "Vuoi davvero promuovere @{nome}? Non sarai in grado di degradare questa persona.", "confirmations.redraft.confirm": "Cancella e riscrivi", "confirmations.redraft.heading": "Cancella e riscrivi", "confirmations.redraft.message": "Vuoi davvero cancellare questo stato e riscriverlo? Perderai tutte le risposte, condivisioni e segnalibri.", @@ -755,7 +754,6 @@ "group.group_mod_demote": "Degrada @{name}", "group.group_mod_kick": "Espelli @{name} dal gruppo", "group.group_mod_kick.success": "Hai espulso @{name} dal gruppo", - "group.group_mod_promote_admin.success": "Hai promosso @{name} all'amministrazione del gruppo", "group.group_mod_promote_mod": "Promuovi @{name} alla moderazione del gruppo", "group.group_mod_reject": "Rifiuta", "group.group_mod_reject.success": "Hai rifiutato la partecipazione di @{name} nel gruppo", diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index a5261e0af..80574797b 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -495,7 +495,6 @@ "confirmations.mute.confirm": "Demp", "confirmations.mute.heading": "Demp @{name}", "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", - "confirmations.promote_in_group.message": "Er du sikker på at du vil forfremme @{name}? Du vil ikke kunne degradere dem.", "confirmations.redraft.confirm": "Slett & omformuler", "confirmations.redraft.heading": "Slett & omformuler", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, reposts and favourites to it.", @@ -745,7 +744,6 @@ "group.group_mod_demote": "Degradere @{navn}", "group.group_mod_kick": "Spark ut @{name} fra gruppa", "group.group_mod_kick.success": "Sparket ut @{name} fra gruppa", - "group.group_mod_promote_admin.success": "Forfremmet @{name} til gruppeadministrator", "group.group_mod_promote_mod": "Forfrem @{name} til gruppemoderator", "group.group_mod_reject": "Avvis", "group.group_mod_reject.success": "Avvist @{navn} fra gruppen", diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json index ad0a162c8..672b9b323 100644 --- a/app/soapbox/locales/pl.json +++ b/app/soapbox/locales/pl.json @@ -473,7 +473,6 @@ "confirmations.mute.confirm": "Wycisz", "confirmations.mute.heading": "Wycisz @{name}", "confirmations.mute.message": "Czy na pewno chcesz wyciszyć {name}?", - "confirmations.promote_in_group.message": "Czy na pewno chcesz promować @{name}? Nie będziesz mógł(-ła) obniżyć ich rangi.", "confirmations.redraft.confirm": "Usuń i przeredaguj", "confirmations.redraft.heading": "Usuń i przeredaguj", "confirmations.redraft.message": "Czy na pewno chcesz usunąć i przeredagować ten wpis? Polubienia i podbicia zostaną utracone, a odpowiedzi do oryginalnego wpisu zostaną osierocone.", @@ -716,7 +715,6 @@ "group.group_mod_block.success": "Zablokowano @{name} z grupy", "group.group_mod_kick": "Wyrzuć @{name} z grupy", "group.group_mod_kick.success": "Wyrzucono @{name} z grupy", - "group.group_mod_promote_admin.success": "Promowano @{name} na administratora grupy", "group.group_mod_promote_mod": "Promuj @{name} na moderatora grupy", "group.group_mod_reject": "Odrzuć", "group.group_mod_unblock": "Odblokuj", diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index 4a2b171fb..d1caa0878 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -509,7 +509,6 @@ "confirmations.mute.confirm": "静音", "confirmations.mute.heading": "静音 @{name}", "confirmations.mute.message": "您确定要静音 {name} 吗?", - "confirmations.promote_in_group.message": "您确定要升级 @{name} 吗?您将无法将其降级。", "confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.heading": "删除并重新编辑", "confirmations.redraft.message": "您确定要删除此帖文并重新编辑它吗?所有相关的转发和点赞都会被清除,回复将会失去关联。", @@ -774,7 +773,6 @@ "group.group_mod_demote": "降级 @{name}", "group.group_mod_kick": "从群组中踢出 @{name}", "group.group_mod_kick.success": "已从群组中踢出 @{name}", - "group.group_mod_promote_admin.success": "已升级 @{name} 至群组管理员", "group.group_mod_promote_mod": "升级 @{name} 至群组监察员", "group.group_mod_reject": "拒绝", "group.group_mod_reject.success": "已拒绝 @{name} 加入群组", From a685065f1bfe656cf3672d9219d2725c6571fd15 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 21 Mar 2023 10:54:36 +0000 Subject: [PATCH 010/298] Translated using Weblate (Spanish) Currently translated at 100.0% (1522 of 1522 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/es/ --- app/soapbox/locales/es.json | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index e35b389de..cd3819566 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -470,8 +470,8 @@ "confirmations.block.confirm": "Bloquear", "confirmations.block.heading": "Block @{name}", "confirmations.block.message": "¿Estás seguro de que quieres bloquear a {name}?", - "confirmations.block_from_group.confirm": "Bloquear", - "confirmations.block_from_group.heading": "Miembro de un grupo de bloqueo", + "confirmations.block_from_group.confirm": "Prohibir al uso", + "confirmations.block_from_group.heading": "Expulsión del Grupo", "confirmations.block_from_group.message": "¿Estás seguro de que quieres expulsar a @{name} del grupo?", "confirmations.cancel.confirm": "Descartar", "confirmations.cancel.heading": "Descartar la publicación", @@ -766,14 +766,15 @@ "gdpr.title": "{siteTitle} uses cookies", "getting_started.open_source_notice": "{code_name} es software libre. Puedes contribuir o reportar errores en {code_link} (v{code_version}).", "group.cancel_request": "Cancelar solicitud", + "group.demote.user.success": "@{name} es ahora miembro", "group.group_mod_authorize": "Aceptar", "group.group_mod_authorize.success": "Aceptado @{name} al grupo", "group.group_mod_block": "Expulsar del grupo", - "group.group_mod_block.success": "Has bloqueado correctamente a @{name} del grupo", - "group.group_mod_demote": "Degradar a @{name}", + "group.group_mod_block.success": "@{name} ha sido expulsado", + "group.group_mod_demote": "Eliminar la función de {role}", "group.group_mod_kick": "Expulsar a @{name} del grupo", "group.group_mod_kick.success": "Expulsar a @{name} del grupo", - "group.group_mod_promote_mod": "Ascender a @{name} a moderador del grupo", + "group.group_mod_promote_mod": "Asignar la función de {role}", "group.group_mod_reject": "Rechazar", "group.group_mod_reject.success": "Rechazado @{name} del grupo", "group.group_mod_unblock": "Desbloquear", @@ -792,6 +793,9 @@ "group.privacy.public": "Público", "group.privacy.public.full": "Grupo público", "group.privacy.public.info": "Descubrible. Cualquiera puede participar.", + "group.promote.admin.confirmation.message": "¿Estás seguro de que quieres asignar el rol de administrador a @{name}?", + "group.promote.admin.confirmation.title": "Asignar la función de administrador", + "group.promote.admin.success": "@{name} es ahora un administrador", "group.role.admin": "Administrador", "group.role.moderator": "Moderador", "group.tabs.all": "Todos", @@ -923,7 +927,7 @@ "login_external.errors.instance_fail": "The instance returned an error.", "login_external.errors.network_fail": "Connection failed. Is a browser extension blocking it?", "login_form.header": "Sign In", - "manage_group.blocked_members": "Miembros bloqueados", + "manage_group.blocked_members": "Miembros expulsados", "manage_group.confirmation.copy": "Copiar el enlace", "manage_group.confirmation.info_1": "Como propietario de este grupo, puedes asignar personal, eliminar mensajes y mucho más.", "manage_group.confirmation.info_2": "Publica el primer mensaje del grupo y comienza la conversación.", From 1974655a520534634f4284d2b6c996ca64ff6f6c Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Tue, 21 Mar 2023 12:26:58 +0000 Subject: [PATCH 011/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1522 of 1522 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index d1caa0878..854b6b17b 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -470,8 +470,8 @@ "confirmations.block.confirm": "屏蔽", "confirmations.block.heading": "屏蔽 @{name}", "confirmations.block.message": "您确定要屏蔽 {name} 吗?", - "confirmations.block_from_group.confirm": "屏蔽", - "confirmations.block_from_group.heading": "屏蔽群组成员", + "confirmations.block_from_group.confirm": "封禁用户", + "confirmations.block_from_group.heading": "从群组中封禁", "confirmations.block_from_group.message": "您确定要从群组中封禁 @{name} 吗?", "confirmations.cancel.confirm": "丢弃", "confirmations.cancel.heading": "丢弃帖文", @@ -766,14 +766,15 @@ "gdpr.title": "{siteTitle} 使用cookies", "getting_started.open_source_notice": "{code_name} 是开源软件。欢迎前往 GitLab({code_link} (v{code_version}))贡献代码或反馈问题。", "group.cancel_request": "取消申请", + "group.demote.user.success": "@{name} 现在是群组成员", "group.group_mod_authorize": "允许", "group.group_mod_authorize.success": "已允许 @{name} 加入群组", "group.group_mod_block": "从群组中封禁 @{name}", - "group.group_mod_block.success": "您已成功从群组中封禁 @{name}", - "group.group_mod_demote": "降级 @{name}", + "group.group_mod_block.success": "@{name} 已封禁", + "group.group_mod_demote": "移除 {role} 职务", "group.group_mod_kick": "从群组中踢出 @{name}", "group.group_mod_kick.success": "已从群组中踢出 @{name}", - "group.group_mod_promote_mod": "升级 @{name} 至群组监察员", + "group.group_mod_promote_mod": "分配 {role} 职务", "group.group_mod_reject": "拒绝", "group.group_mod_reject.success": "已拒绝 @{name} 加入群组", "group.group_mod_unblock": "解除屏蔽", @@ -792,6 +793,9 @@ "group.privacy.public": "公开", "group.privacy.public.full": "公开群组", "group.privacy.public.info": "可发现。任何人都可以加入。", + "group.promote.admin.confirmation.message": "您确定要将管理员职务分配给 @{name} 吗?", + "group.promote.admin.confirmation.title": "分配管理员职务", + "group.promote.admin.success": "@{name} 现在是管理员", "group.role.admin": "管理员", "group.role.moderator": "监察员", "group.tabs.all": "全部", @@ -923,7 +927,7 @@ "login_external.errors.instance_fail": "实例返回了一个错误。", "login_external.errors.network_fail": "连接失败。是浏览器扩展程序阻止了连接吗?", "login_form.header": "登录", - "manage_group.blocked_members": "已屏蔽成员", + "manage_group.blocked_members": "已封禁成员", "manage_group.confirmation.copy": "复制链接", "manage_group.confirmation.info_1": "作为此群组的拥有者,你可以指派管理员,删除帖文等等。", "manage_group.confirmation.info_2": "发布群组的第一条帖文,开始对话。", From 7d3e960d8f824c7af0179545ec3e259e5fec65b5 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 23 Mar 2023 18:05:31 +0100 Subject: [PATCH 012/298] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ --- app/soapbox/locales/ar.json | 2 -- app/soapbox/locales/de.json | 2 -- app/soapbox/locales/es.json | 2 -- app/soapbox/locales/it.json | 2 -- app/soapbox/locales/no.json | 2 -- app/soapbox/locales/pl.json | 2 -- app/soapbox/locales/zh-CN.json | 2 -- 7 files changed, 14 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index 020264634..cc750e53a 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -737,7 +737,6 @@ "gdpr.title": "موقع {siteTitle} يستخدم الكوكيز", "getting_started.open_source_notice": "{code_name} هو برنامَج مفتوح المصدر. يمكنك المساهمة أو الإبلاغ عن الأخطاء على {code_link} (الإصدار {code_version}).", "group.cancel_request": "إلغاء الطلب", - "group.group_mod_authorize": "قبول", "group.group_mod_authorize.success": "قُبِلَ @ {name} في المجموعة", "group.group_mod_block": "حظر @{name} من المجموعة", "group.group_mod_block.success": "حُظِرَ @{name} من المجموعة", @@ -745,7 +744,6 @@ "group.group_mod_kick": "طرد @{name} من المجموعة", "group.group_mod_kick.success": "طُرِدَ @{name} من المجموعة", "group.group_mod_promote_mod": "ترقية @{name} إلى مشرف المجموعة", - "group.group_mod_reject": "رفض", "group.group_mod_reject.success": "مرفوض @{name} من المجموعة", "group.group_mod_unblock": "رفع الحظر", "group.group_mod_unblock.success": "أُلْغِيَّ الحظر على @ {name} من المجموعة", diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index 345f3f6f2..2db9b5b7e 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -711,7 +711,6 @@ "gdpr.title": "{siteTitle} verwendet Cookies", "getting_started.open_source_notice": "{code_name} ist quelloffene Software. Du kannst auf GitLab unter {code_link} (v{code_version}) mitarbeiten oder Probleme melden.", "group.cancel_request": "Anfrage zurückziehen", - "group.group_mod_authorize": "Annehmen", "group.group_mod_authorize.success": "Aufnahmeanfrage von @{name} annehmen", "group.group_mod_block": "@{name} aus der Gruppe blockieren", "group.group_mod_block.success": "@{name} in der Gruppe blockiert", @@ -719,7 +718,6 @@ "group.group_mod_kick": "@{name} aus der Gruppe werfen", "group.group_mod_kick.success": "@{name} aus der Gruppe entfernt", "group.group_mod_promote_mod": "@{name} zur Moderator:in der Gruppe ernennen", - "group.group_mod_reject": "Ablehnen", "group.group_mod_reject.success": "@{name} in der Gruppe abgelehnt", "group.group_mod_unblock": "Entblocken", "group.group_mod_unblock.success": "@{name} in der Gruppe entblockt", diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index cd3819566..5087fdc05 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -767,7 +767,6 @@ "getting_started.open_source_notice": "{code_name} es software libre. Puedes contribuir o reportar errores en {code_link} (v{code_version}).", "group.cancel_request": "Cancelar solicitud", "group.demote.user.success": "@{name} es ahora miembro", - "group.group_mod_authorize": "Aceptar", "group.group_mod_authorize.success": "Aceptado @{name} al grupo", "group.group_mod_block": "Expulsar del grupo", "group.group_mod_block.success": "@{name} ha sido expulsado", @@ -775,7 +774,6 @@ "group.group_mod_kick": "Expulsar a @{name} del grupo", "group.group_mod_kick.success": "Expulsar a @{name} del grupo", "group.group_mod_promote_mod": "Asignar la función de {role}", - "group.group_mod_reject": "Rechazar", "group.group_mod_reject.success": "Rechazado @{name} del grupo", "group.group_mod_unblock": "Desbloquear", "group.group_mod_unblock.success": "Desbloquear a @{name} del grupo", diff --git a/app/soapbox/locales/it.json b/app/soapbox/locales/it.json index 430d85e1d..69c767db4 100644 --- a/app/soapbox/locales/it.json +++ b/app/soapbox/locales/it.json @@ -747,7 +747,6 @@ "gdpr.title": "{siteTitle} usa i cookie", "getting_started.open_source_notice": "{code_name} è un software open source. Puoi contribuire o segnalare errori su GitLab all'indirizzo {code_link} (v{code_version}).", "group.cancel_request": "Cancella richiesta", - "group.group_mod_authorize": "Accetta", "group.group_mod_authorize.success": "Hai accettato @{name} nel gruppo", "group.group_mod_block": "Blocca @{name} dal gruppo", "group.group_mod_block.success": "Hai bloccato @{name} dal gruppo", @@ -755,7 +754,6 @@ "group.group_mod_kick": "Espelli @{name} dal gruppo", "group.group_mod_kick.success": "Hai espulso @{name} dal gruppo", "group.group_mod_promote_mod": "Promuovi @{name} alla moderazione del gruppo", - "group.group_mod_reject": "Rifiuta", "group.group_mod_reject.success": "Hai rifiutato la partecipazione di @{name} nel gruppo", "group.group_mod_unblock": "Sblocca", "group.group_mod_unblock.success": "Hai sbloccato @{name} dal gruppo", diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index 80574797b..309240ce6 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -737,7 +737,6 @@ "gdpr.title": "{siteTitle} bruker informasjonskapsler", "getting_started.open_source_notice": "{code_name} er fri programvare. Du kan bidra eller rapportere problemer på GitLab på {code_link} (v{code_version}).", "group.cancel_request": "Avbryt forespørsel", - "group.group_mod_authorize": "Aksepter", "group.group_mod_authorize.success": "Aksepter @{name} til gruppe", "group.group_mod_block": "Blokker @{name} fra gruppe", "group.group_mod_block.success": "Blokkert @{navn} fra gruppe", @@ -745,7 +744,6 @@ "group.group_mod_kick": "Spark ut @{name} fra gruppa", "group.group_mod_kick.success": "Sparket ut @{name} fra gruppa", "group.group_mod_promote_mod": "Forfrem @{name} til gruppemoderator", - "group.group_mod_reject": "Avvis", "group.group_mod_reject.success": "Avvist @{navn} fra gruppen", "group.group_mod_unblock": "Opphev Blokkering", "group.group_mod_unblock.success": "Opphevet blokkeringen av @{navn} fra gruppa", diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json index 672b9b323..98755eb9d 100644 --- a/app/soapbox/locales/pl.json +++ b/app/soapbox/locales/pl.json @@ -709,14 +709,12 @@ "gdpr.title": "{siteTitle} korzysta z ciasteczek", "getting_started.open_source_notice": "{code_name} jest oprogramowaniem o otwartym źródle. Możesz pomóc w rozwoju lub zgłaszać błędy na GitLabie tutaj: {code_link} (v{code_version}).", "group.cancel_request": "Anuluj zgłoszenie", - "group.group_mod_authorize": "Akceptuj", "group.group_mod_authorize.success": "Przyjmij @{name} do grupy", "group.group_mod_block": "Zablokuj @{name} z grupy", "group.group_mod_block.success": "Zablokowano @{name} z grupy", "group.group_mod_kick": "Wyrzuć @{name} z grupy", "group.group_mod_kick.success": "Wyrzucono @{name} z grupy", "group.group_mod_promote_mod": "Promuj @{name} na moderatora grupy", - "group.group_mod_reject": "Odrzuć", "group.group_mod_unblock": "Odblokuj", "group.header.alt": "Nagłówek grupy", "group.join.private": "Poproś o dołączenie do grupy", diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index 854b6b17b..a4f77c8db 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -767,7 +767,6 @@ "getting_started.open_source_notice": "{code_name} 是开源软件。欢迎前往 GitLab({code_link} (v{code_version}))贡献代码或反馈问题。", "group.cancel_request": "取消申请", "group.demote.user.success": "@{name} 现在是群组成员", - "group.group_mod_authorize": "允许", "group.group_mod_authorize.success": "已允许 @{name} 加入群组", "group.group_mod_block": "从群组中封禁 @{name}", "group.group_mod_block.success": "@{name} 已封禁", @@ -775,7 +774,6 @@ "group.group_mod_kick": "从群组中踢出 @{name}", "group.group_mod_kick.success": "已从群组中踢出 @{name}", "group.group_mod_promote_mod": "分配 {role} 职务", - "group.group_mod_reject": "拒绝", "group.group_mod_reject.success": "已拒绝 @{name} 加入群组", "group.group_mod_unblock": "解除屏蔽", "group.group_mod_unblock.success": "已从群组中解除屏蔽 @{name}", From 614b0494e7152b94be0a7f7208869d3886718b8e Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Thu, 23 Mar 2023 17:19:44 +0000 Subject: [PATCH 013/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1523 of 1523 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index a4f77c8db..ceae35dda 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -192,6 +192,7 @@ "auth.invalid_credentials": "用户名或密码错误", "auth.logged_out": "已登出。", "auth_layout.register": "创建帐号", + "authorize.success": "已批准", "backups.actions.create": "创建备份", "backups.empty_message": "没有找到备份。{action}", "backups.empty_message.action": "现在要备份吗?", @@ -766,15 +767,16 @@ "gdpr.title": "{siteTitle} 使用cookies", "getting_started.open_source_notice": "{code_name} 是开源软件。欢迎前往 GitLab({code_link} (v{code_version}))贡献代码或反馈问题。", "group.cancel_request": "取消申请", + "group.delete.success": "群组已成功删除", "group.demote.user.success": "@{name} 现在是群组成员", - "group.group_mod_authorize.success": "已允许 @{name} 加入群组", + "group.group_mod_authorize.fail": "批准 @{name} 失败", "group.group_mod_block": "从群组中封禁 @{name}", "group.group_mod_block.success": "@{name} 已封禁", "group.group_mod_demote": "移除 {role} 职务", "group.group_mod_kick": "从群组中踢出 @{name}", "group.group_mod_kick.success": "已从群组中踢出 @{name}", "group.group_mod_promote_mod": "分配 {role} 职务", - "group.group_mod_reject.success": "已拒绝 @{name} 加入群组", + "group.group_mod_reject.fail": "拒绝 @{name} 失败", "group.group_mod_unblock": "解除屏蔽", "group.group_mod_unblock.success": "已从群组中解除屏蔽 @{name}", "group.header.alt": "群组标题", @@ -1199,6 +1201,7 @@ "registrations.unprocessable_entity": "此用户名已被占用。", "registrations.username.hint": "只能包含字母、数字和下划线", "registrations.username.label": "您的用户名", + "reject.success": "已拒绝", "relative_time.days": "{number}天", "relative_time.hours": "{number}时", "relative_time.just_now": "刚刚", From 461a006d02d6fca7b7b4a85787904ab0fdb06d9b Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 24 Mar 2023 15:45:05 +0100 Subject: [PATCH 014/298] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ --- app/soapbox/locales/ar.json | 2 -- app/soapbox/locales/de.json | 2 -- app/soapbox/locales/es.json | 2 -- app/soapbox/locales/it.json | 2 -- app/soapbox/locales/no.json | 2 -- app/soapbox/locales/pl.json | 1 - 6 files changed, 11 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index cc750e53a..74d0ac4f1 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -737,14 +737,12 @@ "gdpr.title": "موقع {siteTitle} يستخدم الكوكيز", "getting_started.open_source_notice": "{code_name} هو برنامَج مفتوح المصدر. يمكنك المساهمة أو الإبلاغ عن الأخطاء على {code_link} (الإصدار {code_version}).", "group.cancel_request": "إلغاء الطلب", - "group.group_mod_authorize.success": "قُبِلَ @ {name} في المجموعة", "group.group_mod_block": "حظر @{name} من المجموعة", "group.group_mod_block.success": "حُظِرَ @{name} من المجموعة", "group.group_mod_demote": "خفض الرتبة", "group.group_mod_kick": "طرد @{name} من المجموعة", "group.group_mod_kick.success": "طُرِدَ @{name} من المجموعة", "group.group_mod_promote_mod": "ترقية @{name} إلى مشرف المجموعة", - "group.group_mod_reject.success": "مرفوض @{name} من المجموعة", "group.group_mod_unblock": "رفع الحظر", "group.group_mod_unblock.success": "أُلْغِيَّ الحظر على @ {name} من المجموعة", "group.header.alt": "غلاف المجموعة", diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index 2db9b5b7e..53c91bc07 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -711,14 +711,12 @@ "gdpr.title": "{siteTitle} verwendet Cookies", "getting_started.open_source_notice": "{code_name} ist quelloffene Software. Du kannst auf GitLab unter {code_link} (v{code_version}) mitarbeiten oder Probleme melden.", "group.cancel_request": "Anfrage zurückziehen", - "group.group_mod_authorize.success": "Aufnahmeanfrage von @{name} annehmen", "group.group_mod_block": "@{name} aus der Gruppe blockieren", "group.group_mod_block.success": "@{name} in der Gruppe blockiert", "group.group_mod_demote": "@{name} herunterstufen", "group.group_mod_kick": "@{name} aus der Gruppe werfen", "group.group_mod_kick.success": "@{name} aus der Gruppe entfernt", "group.group_mod_promote_mod": "@{name} zur Moderator:in der Gruppe ernennen", - "group.group_mod_reject.success": "@{name} in der Gruppe abgelehnt", "group.group_mod_unblock": "Entblocken", "group.group_mod_unblock.success": "@{name} in der Gruppe entblockt", "group.header.alt": "Gruppentitel", diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index 5087fdc05..a2fbc31d6 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -767,14 +767,12 @@ "getting_started.open_source_notice": "{code_name} es software libre. Puedes contribuir o reportar errores en {code_link} (v{code_version}).", "group.cancel_request": "Cancelar solicitud", "group.demote.user.success": "@{name} es ahora miembro", - "group.group_mod_authorize.success": "Aceptado @{name} al grupo", "group.group_mod_block": "Expulsar del grupo", "group.group_mod_block.success": "@{name} ha sido expulsado", "group.group_mod_demote": "Eliminar la función de {role}", "group.group_mod_kick": "Expulsar a @{name} del grupo", "group.group_mod_kick.success": "Expulsar a @{name} del grupo", "group.group_mod_promote_mod": "Asignar la función de {role}", - "group.group_mod_reject.success": "Rechazado @{name} del grupo", "group.group_mod_unblock": "Desbloquear", "group.group_mod_unblock.success": "Desbloquear a @{name} del grupo", "group.header.alt": "Encabezado del grupo", diff --git a/app/soapbox/locales/it.json b/app/soapbox/locales/it.json index 69c767db4..ce38f3719 100644 --- a/app/soapbox/locales/it.json +++ b/app/soapbox/locales/it.json @@ -747,14 +747,12 @@ "gdpr.title": "{siteTitle} usa i cookie", "getting_started.open_source_notice": "{code_name} è un software open source. Puoi contribuire o segnalare errori su GitLab all'indirizzo {code_link} (v{code_version}).", "group.cancel_request": "Cancella richiesta", - "group.group_mod_authorize.success": "Hai accettato @{name} nel gruppo", "group.group_mod_block": "Blocca @{name} dal gruppo", "group.group_mod_block.success": "Hai bloccato @{name} dal gruppo", "group.group_mod_demote": "Degrada @{name}", "group.group_mod_kick": "Espelli @{name} dal gruppo", "group.group_mod_kick.success": "Hai espulso @{name} dal gruppo", "group.group_mod_promote_mod": "Promuovi @{name} alla moderazione del gruppo", - "group.group_mod_reject.success": "Hai rifiutato la partecipazione di @{name} nel gruppo", "group.group_mod_unblock": "Sblocca", "group.group_mod_unblock.success": "Hai sbloccato @{name} dal gruppo", "group.header.alt": "Testata del gruppo", diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index 309240ce6..13362a7cd 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -737,14 +737,12 @@ "gdpr.title": "{siteTitle} bruker informasjonskapsler", "getting_started.open_source_notice": "{code_name} er fri programvare. Du kan bidra eller rapportere problemer på GitLab på {code_link} (v{code_version}).", "group.cancel_request": "Avbryt forespørsel", - "group.group_mod_authorize.success": "Aksepter @{name} til gruppe", "group.group_mod_block": "Blokker @{name} fra gruppe", "group.group_mod_block.success": "Blokkert @{navn} fra gruppe", "group.group_mod_demote": "Degradere @{navn}", "group.group_mod_kick": "Spark ut @{name} fra gruppa", "group.group_mod_kick.success": "Sparket ut @{name} fra gruppa", "group.group_mod_promote_mod": "Forfrem @{name} til gruppemoderator", - "group.group_mod_reject.success": "Avvist @{navn} fra gruppen", "group.group_mod_unblock": "Opphev Blokkering", "group.group_mod_unblock.success": "Opphevet blokkeringen av @{navn} fra gruppa", "group.header.alt": "Gruppeoverskrift", diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json index 98755eb9d..7e8c50767 100644 --- a/app/soapbox/locales/pl.json +++ b/app/soapbox/locales/pl.json @@ -709,7 +709,6 @@ "gdpr.title": "{siteTitle} korzysta z ciasteczek", "getting_started.open_source_notice": "{code_name} jest oprogramowaniem o otwartym źródle. Możesz pomóc w rozwoju lub zgłaszać błędy na GitLabie tutaj: {code_link} (v{code_version}).", "group.cancel_request": "Anuluj zgłoszenie", - "group.group_mod_authorize.success": "Przyjmij @{name} do grupy", "group.group_mod_block": "Zablokuj @{name} z grupy", "group.group_mod_block.success": "Zablokowano @{name} z grupy", "group.group_mod_kick": "Wyrzuć @{name} z grupy", From 1e76c42ad295481e0b94b9eb26a3f403eb308c1e Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Fri, 24 Mar 2023 15:41:08 +0000 Subject: [PATCH 015/298] Translated using Weblate (Spanish) Currently translated at 100.0% (1523 of 1523 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/es/ --- app/soapbox/locales/es.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index a2fbc31d6..594b5d58c 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -192,6 +192,7 @@ "auth.invalid_credentials": "Nombre de usuario o contraseña incorrectos", "auth.logged_out": "Desconectado.", "auth_layout.register": "Crear una cuenta", + "authorize.success": "Aprobado", "backups.actions.create": "Crear copia de seguridad", "backups.empty_message": "No se han encontrado copias de seguridad. {acción}", "backups.empty_message.action": "¿Crear una ahora?", @@ -766,13 +767,16 @@ "gdpr.title": "{siteTitle} uses cookies", "getting_started.open_source_notice": "{code_name} es software libre. Puedes contribuir o reportar errores en {code_link} (v{code_version}).", "group.cancel_request": "Cancelar solicitud", + "group.delete.success": "Grupo eliminado correctamente", "group.demote.user.success": "@{name} es ahora miembro", + "group.group_mod_authorize.fail": "Error al aprobar @{name}", "group.group_mod_block": "Expulsar del grupo", "group.group_mod_block.success": "@{name} ha sido expulsado", "group.group_mod_demote": "Eliminar la función de {role}", "group.group_mod_kick": "Expulsar a @{name} del grupo", "group.group_mod_kick.success": "Expulsar a @{name} del grupo", "group.group_mod_promote_mod": "Asignar la función de {role}", + "group.group_mod_reject.fail": "Error al rechazar @{name}", "group.group_mod_unblock": "Desbloquear", "group.group_mod_unblock.success": "Desbloquear a @{name} del grupo", "group.header.alt": "Encabezado del grupo", @@ -1197,6 +1201,7 @@ "registrations.unprocessable_entity": "This username has already been taken.", "registrations.username.hint": "May only contain A-Z, 0-9, and underscores", "registrations.username.label": "Your username", + "reject.success": "Rechazado", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "ahora", From 54035073aa0ea5876106f8e50a7ab563b0aea59f Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Tue, 28 Mar 2023 12:49:56 +0000 Subject: [PATCH 016/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1526 of 1526 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index ceae35dda..f123ba36b 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -1241,11 +1241,14 @@ "report.block_hint": "您是否也要屏蔽此帐号呢?", "report.chatMessage.context": "当举报一个用户的消息时,被选中的前五条信息和后五条信息将被传递给我们的审核团队以了解情况。", "report.chatMessage.title": "举报信息", - "report.confirmation.content": "如果我们发现此帐号确实违反了 {link} ,我们会采取进一步的惩罚措施。", + "report.confirmation.content": "如果我们发现此 {entity} 确实违反了 {link} ,我们会采取进一步的处罚措施。", + "report.confirmation.entity.account": "帐号", + "report.confirmation.entity.group": "群组", "report.confirmation.title": "感谢您提交的举报。", "report.done": "完成", "report.forward": "发送举报至 {target}", "report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?", + "report.group.title": "举报群组", "report.next": "下一步", "report.otherActions.addAdditional": "您想为此举报添加更多的状态吗?", "report.otherActions.addMore": "添加更多", From 88b0b617dbe73d978486a825dc63f5722d4c281c Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 28 Mar 2023 15:36:00 +0200 Subject: [PATCH 017/298] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ --- app/soapbox/locales/ar.json | 2 -- app/soapbox/locales/bs.json | 2 -- app/soapbox/locales/ca.json | 2 -- app/soapbox/locales/cs.json | 2 -- app/soapbox/locales/cy.json | 2 -- app/soapbox/locales/de.json | 2 -- app/soapbox/locales/el.json | 2 -- app/soapbox/locales/en-Shaw.json | 2 -- app/soapbox/locales/es-AR.json | 2 -- app/soapbox/locales/es.json | 2 -- app/soapbox/locales/fa.json | 2 -- app/soapbox/locales/fr.json | 2 -- app/soapbox/locales/ga.json | 2 -- app/soapbox/locales/he.json | 2 -- app/soapbox/locales/hi.json | 2 -- app/soapbox/locales/hr.json | 2 -- app/soapbox/locales/hu.json | 2 -- app/soapbox/locales/id.json | 2 -- app/soapbox/locales/io.json | 2 -- app/soapbox/locales/is.json | 2 -- app/soapbox/locales/it.json | 2 -- app/soapbox/locales/ja.json | 2 -- app/soapbox/locales/kk.json | 2 -- app/soapbox/locales/ko.json | 2 -- app/soapbox/locales/lt.json | 2 -- app/soapbox/locales/lv.json | 2 -- app/soapbox/locales/mk.json | 2 -- app/soapbox/locales/ms.json | 2 -- app/soapbox/locales/nn.json | 2 -- app/soapbox/locales/no.json | 2 -- app/soapbox/locales/oc.json | 2 -- app/soapbox/locales/pl.json | 2 -- app/soapbox/locales/pt-BR.json | 2 -- app/soapbox/locales/pt.json | 2 -- app/soapbox/locales/ro.json | 2 -- app/soapbox/locales/ru.json | 2 -- app/soapbox/locales/sk.json | 2 -- app/soapbox/locales/sl.json | 2 -- app/soapbox/locales/sr-Latn.json | 2 -- app/soapbox/locales/sr.json | 2 -- app/soapbox/locales/sv.json | 2 -- app/soapbox/locales/ta.json | 2 -- app/soapbox/locales/te.json | 2 -- app/soapbox/locales/th.json | 2 -- app/soapbox/locales/tr.json | 2 -- app/soapbox/locales/uk.json | 2 -- app/soapbox/locales/zh-CN.json | 2 -- app/soapbox/locales/zh-HK.json | 2 -- app/soapbox/locales/zh-TW.json | 2 -- 49 files changed, 98 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index 74d0ac4f1..fa6030b5f 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -91,9 +91,7 @@ "admin.announcements.edit": "تعديل", "admin.announcements.ends_at": "ينتهي عند:", "admin.announcements.starts_at": "يبدأ عند:", - "admin.awaiting_approval.approved_message": "تمت الموافقة على {acct}!", "admin.awaiting_approval.empty_message": "ليس هناك حسابات جديدة للموافقة عليها. عندما يقوم شخص ما بالتسجيل، ستتمكن من مراجعة الحساب هنا.", - "admin.awaiting_approval.rejected_message": "رُفِضَ {acct}!", "admin.dashboard.registration_mode.approval_hint": "يمكن للمستخدمين إنشاء الحسابات، لكن تُفعَّل حساباتهم عند قبولها من طرف المدير.", "admin.dashboard.registration_mode.approval_label": "يتطلب الموافقة", "admin.dashboard.registration_mode.closed_hint": "لا يمكن لأحد إنشاء حساب جديد، ولكن مازال بإمكانك دعوتهم.", diff --git a/app/soapbox/locales/bs.json b/app/soapbox/locales/bs.json index b12e24a8e..435b42b98 100644 --- a/app/soapbox/locales/bs.json +++ b/app/soapbox/locales/bs.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Potražite profil", "actualStatus.edited": "Uređeno {datum}", "actualStatuses.quote_tombstone": "Objava je nedostupna.", - "admin.awaiting_approval.approved_message": "{acct} je odobren!", "admin.awaiting_approval.empty_message": "Niko ne čeka na odobrenje. Kada se novi korisnik prijavi, možete ga pregledati ovdje.", - "admin.awaiting_approval.rejected_message": "{acct} je odbijen.", "admin.dashboard.registration_mode.approval_hint": "Korisnici se mogu registrovati, ali njihov račun se aktivira tek kada administrator to odobri.", "admin.dashboard.registration_mode.approval_label": "Čeka odobrenje", "admin.dashboard.registration_mode.closed_hint": "Registracija novih članova isključena. I dalje možete pozvati ljude.", diff --git a/app/soapbox/locales/ca.json b/app/soapbox/locales/ca.json index d04d62c64..62f495db5 100644 --- a/app/soapbox/locales/ca.json +++ b/app/soapbox/locales/ca.json @@ -45,9 +45,7 @@ "account_moderation_modal.roles.admin": "Admin", "account_moderation_modal.roles.user": "User", "account_note.target": "Note for @{target}", - "admin.awaiting_approval.approved_message": "{acct} ha estat aprovat!", "admin.awaiting_approval.empty_message": "Ningú espera l'aprovació. Quan un nou usuari s'inicia sessió, podeu revisar-los aquí.", - "admin.awaiting_approval.rejected_message": "{acct} ha estat rebutjat.", "admin.dashboard.registration_mode.approval_hint": "Els usuaris poden registrar-se, però el seu compte només s'activa quan un administrador l'aprova.", "admin.dashboard.registration_mode.approval_label": "Cal una aprovació", "admin.dashboard.registration_mode.closed_hint": "Ningú pot registrar-se. Segueixes podent invitar gent.", diff --git a/app/soapbox/locales/cs.json b/app/soapbox/locales/cs.json index a04e9f7ce..0811858bd 100644 --- a/app/soapbox/locales/cs.json +++ b/app/soapbox/locales/cs.json @@ -67,9 +67,7 @@ "account_note.save": "Uložit", "account_note.target": "Note for @{target}", "actualStatuses.quote_tombstone": "Příspěvek není dostupný.", - "admin.awaiting_approval.approved_message": "Účet {acct} byl schválen!", "admin.awaiting_approval.empty_message": "Na schválení nikdo nečeká. Až se nějaký nový uživatel zaregistruje, tady si můžete jeho žádost prohlédnout.", - "admin.awaiting_approval.rejected_message": "Účet {acct} byl odmítnut.", "admin.dashboard.registration_mode.approval_hint": "Uživatelé se mohou zaregistrovat, ale jejich účet se aktivuje až když ho schválí administrátor", "admin.dashboard.registration_mode.approval_label": "Pouze po schválení", "admin.dashboard.registration_mode.closed_hint": "Zaregistrovat se nemůže nikdo. Ale vy můžete lidi pozvat.", diff --git a/app/soapbox/locales/cy.json b/app/soapbox/locales/cy.json index 062786bb4..1b202dc0b 100644 --- a/app/soapbox/locales/cy.json +++ b/app/soapbox/locales/cy.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index 53c91bc07..386a30081 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Nach einem Account suchen", "actualStatus.edited": "Bearbeitet {date}", "actualStatuses.quote_tombstone": "Beitrag ist nicht verfügbar.", - "admin.awaiting_approval.approved_message": "{acct} bestätigt!", "admin.awaiting_approval.empty_message": "Keine neuen Nutzer zur Prüfung und Bestätigung vorhanden. Wenn sich ein neuer Nutzer anmeldet, kann er hier überprüft werden.", - "admin.awaiting_approval.rejected_message": "{acct} abgelehnt.", "admin.dashboard.registration_mode.approval_hint": "Neue Nutzer können sich anmelden, müssen aber erst vom Adminstrator geprüft und aktiviert werden.", "admin.dashboard.registration_mode.approval_label": "Bestätigung erforderlich", "admin.dashboard.registration_mode.closed_hint": "Neuanmeldungen sind zurzeit ausgesetzt. Einladungen sind weiterhin möglich.", diff --git a/app/soapbox/locales/el.json b/app/soapbox/locales/el.json index 5b6ec8d7b..359ce8ce0 100644 --- a/app/soapbox/locales/el.json +++ b/app/soapbox/locales/el.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/en-Shaw.json b/app/soapbox/locales/en-Shaw.json index 5cfbd5caa..b2e169b4c 100644 --- a/app/soapbox/locales/en-Shaw.json +++ b/app/soapbox/locales/en-Shaw.json @@ -84,9 +84,7 @@ "account_search.placeholder": "𐑕𐑻𐑗 𐑓 𐑩𐑯 𐑩𐑒𐑬𐑯𐑑", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} 𐑢𐑪𐑟 𐑩𐑐𐑮𐑵𐑝𐑛!", "admin.awaiting_approval.empty_message": "𐑞𐑺 𐑦𐑟 𐑯𐑴𐑚𐑪𐑛𐑦 𐑢𐑱𐑑𐑦𐑙 𐑓 𐑩𐑐𐑮𐑵𐑝𐑩𐑤. 𐑢𐑧𐑯 𐑩 𐑯𐑿 𐑿𐑟𐑼 𐑕𐑲𐑯𐑟 𐑳𐑐, 𐑿 𐑒𐑨𐑯 𐑮𐑦𐑝𐑿 𐑞𐑧𐑥 𐑣𐑽.", - "admin.awaiting_approval.rejected_message": "{acct} 𐑢𐑪𐑟 𐑮𐑦𐑡𐑧𐑒𐑑𐑩𐑛.", "admin.dashboard.registration_mode.approval_hint": "𐑿𐑟𐑼𐑟 𐑒𐑨𐑯 𐑕𐑲𐑯 𐑳𐑐, 𐑚𐑳𐑑 𐑞𐑺 𐑩𐑒𐑬𐑯𐑑 𐑴𐑯𐑤𐑦 𐑜𐑧𐑑𐑕 𐑨𐑒𐑑𐑦𐑝𐑱𐑑𐑩𐑛 𐑢𐑧𐑯 𐑩𐑯 𐑨𐑛𐑥𐑦𐑯 𐑩𐑐𐑮𐑵𐑝𐑟 𐑦𐑑.", "admin.dashboard.registration_mode.approval_label": "𐑩𐑐𐑮𐑵𐑝𐑩𐑤 𐑮𐑦𐑒𐑢𐑲𐑼𐑛", "admin.dashboard.registration_mode.closed_hint": "𐑯𐑴𐑚𐑪𐑛𐑦 𐑒𐑨𐑯 𐑕𐑲𐑯 𐑳𐑐. 𐑿 𐑒𐑨𐑯 𐑕𐑑𐑦𐑤 𐑦𐑯𐑝𐑲𐑑 𐑐𐑰𐑐𐑩𐑤.", diff --git a/app/soapbox/locales/es-AR.json b/app/soapbox/locales/es-AR.json index e0ee51f98..1af32095e 100644 --- a/app/soapbox/locales/es-AR.json +++ b/app/soapbox/locales/es-AR.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index 594b5d58c..5b3f58dda 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -91,9 +91,7 @@ "admin.announcements.edit": "Editar", "admin.announcements.ends_at": "Acaba en:", "admin.announcements.starts_at": "Empieza en:", - "admin.awaiting_approval.approved_message": "¡{acct} ha sido aprobado!", "admin.awaiting_approval.empty_message": "No hay nadie esperando aprobación. Cuando se registre un nuevo usuario, puedes revisarlo aquí.", - "admin.awaiting_approval.rejected_message": "{acct} fue rechazado.", "admin.dashboard.registration_mode.approval_hint": "Los usuarios pueden registrarse, pero su cuenta sólo se activa cuando un administrador la aprueba.", "admin.dashboard.registration_mode.approval_label": "Aprobación requerida", "admin.dashboard.registration_mode.closed_hint": "Nadie puede inscribirse. Aún puedes invitar a más gente.", diff --git a/app/soapbox/locales/fa.json b/app/soapbox/locales/fa.json index d748cf7a5..ca1f611ea 100644 --- a/app/soapbox/locales/fa.json +++ b/app/soapbox/locales/fa.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/fr.json b/app/soapbox/locales/fr.json index 9eb36afb0..7a4f9730c 100644 --- a/app/soapbox/locales/fr.json +++ b/app/soapbox/locales/fr.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Rechercher un compte", "actualStatus.edited": "Edité le {date}", "actualStatuses.quote_tombstone": "Publication indisponible.", - "admin.awaiting_approval.approved_message": "{acct} a été approuvé !", "admin.awaiting_approval.empty_message": "Personne n'attend d'approbation. Quand un nouveau compte s'affiche, vous pouvez l'examiner ici.", - "admin.awaiting_approval.rejected_message": "Le compte {acct} a été rejeté.", "admin.dashboard.registration_mode.approval_hint": "Tout le monde peut s'inscrire, mais leur compte ne s'active qu'après approbation.", "admin.dashboard.registration_mode.approval_label": "Approbation requise", "admin.dashboard.registration_mode.closed_hint": "Personne ne peut s'inscrire. Vous pouvez toujours inviter des gens.", diff --git a/app/soapbox/locales/ga.json b/app/soapbox/locales/ga.json index 69c576437..bfdeb9469 100644 --- a/app/soapbox/locales/ga.json +++ b/app/soapbox/locales/ga.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/he.json b/app/soapbox/locales/he.json index 67d668745..13b3636a3 100644 --- a/app/soapbox/locales/he.json +++ b/app/soapbox/locales/he.json @@ -84,9 +84,7 @@ "account_search.placeholder": "חפש משתמש", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} הואשר!", "admin.awaiting_approval.empty_message": "אף אחד לא מחכה לאישור. כאשר משתמש חדש יירשם, תוכל לבחון אותו פה.", - "admin.awaiting_approval.rejected_message": "{acct} נדחה", "admin.dashboard.registration_mode.approval_hint": "משתמשים יכולים להרשם, אבל החשבון שלהם מופעל רק כשמנהל יאשר אותו.", "admin.dashboard.registration_mode.approval_label": "נדרש אישור", "admin.dashboard.registration_mode.closed_hint": "אף אחד לא יכול להרשם. אתה עדיין יכול להזמין אנשים.", diff --git a/app/soapbox/locales/hi.json b/app/soapbox/locales/hi.json index 1abb37855..6607823e2 100644 --- a/app/soapbox/locales/hi.json +++ b/app/soapbox/locales/hi.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/hr.json b/app/soapbox/locales/hr.json index d44f3bb68..e1d08b7f0 100644 --- a/app/soapbox/locales/hr.json +++ b/app/soapbox/locales/hr.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Potražite račun", "actualStatus.edited": "Uređeno {datum}", "actualStatuses.quote_tombstone": "Objava je nedostupna.", - "admin.awaiting_approval.approved_message": "{acct} je odobren!", "admin.awaiting_approval.empty_message": "Nitko ne čeka odobrenje. Kada se novi korisnik prijavi, možete ga pregledati ovdje.", - "admin.awaiting_approval.rejected_message": "{acct} je odbijen.", "admin.dashboard.registration_mode.approval_hint": "Korisnici se mogu prijaviti, ali njihov račun se aktivira tek kada ga administrator odobri.", "admin.dashboard.registration_mode.approval_label": "Potrebno odobrenje", "admin.dashboard.registration_mode.closed_hint": "Nitko se ne može prijaviti. I dalje možete pozvati ljude.", diff --git a/app/soapbox/locales/hu.json b/app/soapbox/locales/hu.json index 8bc1105a8..3465572d8 100644 --- a/app/soapbox/locales/hu.json +++ b/app/soapbox/locales/hu.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/id.json b/app/soapbox/locales/id.json index 76d9bfeb3..04ce194e6 100644 --- a/app/soapbox/locales/id.json +++ b/app/soapbox/locales/id.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/io.json b/app/soapbox/locales/io.json index 76b9f135c..c272f8a1a 100644 --- a/app/soapbox/locales/io.json +++ b/app/soapbox/locales/io.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/is.json b/app/soapbox/locales/is.json index 7e7d1a49c..0f36a744b 100644 --- a/app/soapbox/locales/is.json +++ b/app/soapbox/locales/is.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Leita að notanda", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} var samþykktur!", "admin.awaiting_approval.empty_message": "Það er enginn að bíða eftir samþykki. Þegar nýr notandi skráir sig geturðu skoðað hann hér.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Notendur geta skráð sig, en reikningurinn þeirra verður aðeins virkur þegar stjórnandi samþykkir það.", "admin.dashboard.registration_mode.approval_label": "Samþykki Krefst", "admin.dashboard.registration_mode.closed_hint": "Enginn getur skráð sig. Þú getur samt boðið fólki inn.", diff --git a/app/soapbox/locales/it.json b/app/soapbox/locales/it.json index ce38f3719..eed0a69ab 100644 --- a/app/soapbox/locales/it.json +++ b/app/soapbox/locales/it.json @@ -91,9 +91,7 @@ "admin.announcements.edit": "Modifica", "admin.announcements.ends_at": "Termina alle:", "admin.announcements.starts_at": "Inizia alle:", - "admin.awaiting_approval.approved_message": "Approvazione per {acct}!", "admin.awaiting_approval.empty_message": "Nessuno aspetta l'approvazione. Quando nuove persone si iscrivono, puoi approvarle da qui.", - "admin.awaiting_approval.rejected_message": "Rifiuto per {acct}.", "admin.dashboard.registration_mode.approval_hint": "Iscrizioni aperte ma l'attivazione previa approvazione dagli amministratori.", "admin.dashboard.registration_mode.approval_label": "Richiesta di approvazione", "admin.dashboard.registration_mode.closed_hint": "Iscrizioni chiuse. Puoi comunque invitare persone.", diff --git a/app/soapbox/locales/ja.json b/app/soapbox/locales/ja.json index 71ca077ea..c012a65e4 100644 --- a/app/soapbox/locales/ja.json +++ b/app/soapbox/locales/ja.json @@ -85,9 +85,7 @@ "account_search.placeholder": "アカウントを検索", "actualStatus.edited": "{date}に編集済", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/kk.json b/app/soapbox/locales/kk.json index 310ef90c9..048c7d26a 100644 --- a/app/soapbox/locales/kk.json +++ b/app/soapbox/locales/kk.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/ko.json b/app/soapbox/locales/ko.json index 68c2830bd..dc71d944f 100644 --- a/app/soapbox/locales/ko.json +++ b/app/soapbox/locales/ko.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/lt.json b/app/soapbox/locales/lt.json index b22ebb49c..f7a6feb0a 100644 --- a/app/soapbox/locales/lt.json +++ b/app/soapbox/locales/lt.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/lv.json b/app/soapbox/locales/lv.json index 1c1bf54fc..1273f390d 100644 --- a/app/soapbox/locales/lv.json +++ b/app/soapbox/locales/lv.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/mk.json b/app/soapbox/locales/mk.json index 2f63b155b..4a8280b12 100644 --- a/app/soapbox/locales/mk.json +++ b/app/soapbox/locales/mk.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/ms.json b/app/soapbox/locales/ms.json index 7089527c3..ef8885c64 100644 --- a/app/soapbox/locales/ms.json +++ b/app/soapbox/locales/ms.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/nn.json b/app/soapbox/locales/nn.json index 49f2523ba..e3339e389 100644 --- a/app/soapbox/locales/nn.json +++ b/app/soapbox/locales/nn.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index 13362a7cd..72fc9bc4c 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -91,9 +91,7 @@ "admin.announcements.edit": "Rediger", "admin.announcements.ends_at": "Slutter på:", "admin.announcements.starts_at": "Starter på:", - "admin.awaiting_approval.approved_message": "{acct} ble godkjent!", "admin.awaiting_approval.empty_message": "Det er ingen som venter på godkjenning. Når en ny bruker registrerer seg, kan du se dem her.", - "admin.awaiting_approval.rejected_message": "{acct} ble avslått.", "admin.dashboard.registration_mode.approval_hint": "Brukere kan registrere seg, men kontoen deres blir bare aktivert når en administrator godkjenner den.", "admin.dashboard.registration_mode.approval_label": "Godkjenning kreves", "admin.dashboard.registration_mode.closed_hint": "Ingen kan registrere seg. Men du kan invitere personer.", diff --git a/app/soapbox/locales/oc.json b/app/soapbox/locales/oc.json index db7fde4a6..a4ce6b548 100644 --- a/app/soapbox/locales/oc.json +++ b/app/soapbox/locales/oc.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json index 7e8c50767..ff3d39cbd 100644 --- a/app/soapbox/locales/pl.json +++ b/app/soapbox/locales/pl.json @@ -91,9 +91,7 @@ "admin.announcements.edit": "Edytuj", "admin.announcements.ends_at": "Kończy się:", "admin.announcements.starts_at": "Rozpoczyna się:", - "admin.awaiting_approval.approved_message": "Przyjęto {acct}!", "admin.awaiting_approval.empty_message": "Nikt nie oczekuje przyjęcia. Gdy zarejestruje się nowy użytkownik, możesz zatwierdzić go tutaj.", - "admin.awaiting_approval.rejected_message": "Odrzucono {acct}!", "admin.dashboard.registration_mode.approval_hint": "Użytkownicy mogą zarejestrować się, ale ich konto aktywuje się dopiero gdy zostanie ono zatwierdzone przez administratora.", "admin.dashboard.registration_mode.approval_label": "Wymagane przyjęcie", "admin.dashboard.registration_mode.closed_hint": "Nikt nie może się zarejestrować. Wciąż możesz zapraszać ludzi.", diff --git a/app/soapbox/locales/pt-BR.json b/app/soapbox/locales/pt-BR.json index 5d7b0bbfd..79ebcaab9 100644 --- a/app/soapbox/locales/pt-BR.json +++ b/app/soapbox/locales/pt-BR.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/pt.json b/app/soapbox/locales/pt.json index 88a0764b0..e3fc41a9d 100644 --- a/app/soapbox/locales/pt.json +++ b/app/soapbox/locales/pt.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} foi aprovada!", "admin.awaiting_approval.empty_message": "Não há ninguém à espera de aprovação. Quando um utilizador novo se registar, podes analisá-lo aqui.", - "admin.awaiting_approval.rejected_message": "{acct} foi rejeitada.", "admin.dashboard.registration_mode.approval_hint": "Utilizadores podem se registar, mas a conta só é ativada quando um administrador a aprovar.", "admin.dashboard.registration_mode.approval_label": "Aprovação necessária", "admin.dashboard.registration_mode.closed_hint": "Ninguém pode se registar. Ainda podes convidar pessoas.", diff --git a/app/soapbox/locales/ro.json b/app/soapbox/locales/ro.json index 5bf350b2f..b089675ba 100644 --- a/app/soapbox/locales/ro.json +++ b/app/soapbox/locales/ro.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/ru.json b/app/soapbox/locales/ru.json index 323d514cd..818f1092d 100644 --- a/app/soapbox/locales/ru.json +++ b/app/soapbox/locales/ru.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} одобрен!", "admin.awaiting_approval.empty_message": "Сейчас здесь пусто. Записи на одобрение появятся, когда кто-нибудь зарегистрируется.", - "admin.awaiting_approval.rejected_message": "{acct} отклонён.", "admin.dashboard.registration_mode.approval_hint": "Пользователи могут зарегистрироваться, но одобрение проводится администратором.", "admin.dashboard.registration_mode.approval_label": "Требуется Одобрение", "admin.dashboard.registration_mode.closed_hint": "Регистрация закрыта. Вы можете высылать приглашения.", diff --git a/app/soapbox/locales/sk.json b/app/soapbox/locales/sk.json index ed613b438..6093583a3 100644 --- a/app/soapbox/locales/sk.json +++ b/app/soapbox/locales/sk.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/sl.json b/app/soapbox/locales/sl.json index 995a22835..2267c1b6b 100644 --- a/app/soapbox/locales/sl.json +++ b/app/soapbox/locales/sl.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/sr-Latn.json b/app/soapbox/locales/sr-Latn.json index eab81148b..51157cb08 100644 --- a/app/soapbox/locales/sr-Latn.json +++ b/app/soapbox/locales/sr-Latn.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/sr.json b/app/soapbox/locales/sr.json index 229f60a3c..a411c3451 100644 --- a/app/soapbox/locales/sr.json +++ b/app/soapbox/locales/sr.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/sv.json b/app/soapbox/locales/sv.json index d4f460dd8..208627c1d 100644 --- a/app/soapbox/locales/sv.json +++ b/app/soapbox/locales/sv.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/ta.json b/app/soapbox/locales/ta.json index a8c261c0c..c9584dfed 100644 --- a/app/soapbox/locales/ta.json +++ b/app/soapbox/locales/ta.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/te.json b/app/soapbox/locales/te.json index 702553df6..963317686 100644 --- a/app/soapbox/locales/te.json +++ b/app/soapbox/locales/te.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/th.json b/app/soapbox/locales/th.json index 4c27161b4..ce698efb5 100644 --- a/app/soapbox/locales/th.json +++ b/app/soapbox/locales/th.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/tr.json b/app/soapbox/locales/tr.json index 4f27ce2ec..5694eb65b 100644 --- a/app/soapbox/locales/tr.json +++ b/app/soapbox/locales/tr.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/uk.json b/app/soapbox/locales/uk.json index b4feaa481..915397a47 100644 --- a/app/soapbox/locales/uk.json +++ b/app/soapbox/locales/uk.json @@ -84,9 +84,7 @@ "account_search.placeholder": "Search for an account", "actualStatus.edited": "Edited {date}", "actualStatuses.quote_tombstone": "Post is unavailable.", - "admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", - "admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index f123ba36b..0de608147 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -91,9 +91,7 @@ "admin.announcements.edit": "编辑", "admin.announcements.ends_at": "结束于:", "admin.announcements.starts_at": "开始于:", - "admin.awaiting_approval.approved_message": "{acct} 的注册申请已通过!", "admin.awaiting_approval.empty_message": "没有未处理的注册申请,如果有新的申请,它就会显示在这里。", - "admin.awaiting_approval.rejected_message": "{acct} 的注册请求已拒绝。", "admin.dashboard.registration_mode.approval_hint": "用户可以注册,但帐户只有在管理员批准后才会被激活。", "admin.dashboard.registration_mode.approval_label": "需要批准", "admin.dashboard.registration_mode.closed_hint": "用户不可以注册。但您仍可以邀请别人。", diff --git a/app/soapbox/locales/zh-HK.json b/app/soapbox/locales/zh-HK.json index 64dcefcf1..a007447e8 100644 --- a/app/soapbox/locales/zh-HK.json +++ b/app/soapbox/locales/zh-HK.json @@ -73,9 +73,7 @@ "account_search.placeholder": "搜尋使用者", "actualStatus.edited": "在 {date} 時編輯", "actualStatuses.quote_tombstone": "帖文不可用", - "admin.awaiting_approval.approved_message": "{acct} 已經通過審核!", "admin.awaiting_approval.empty_message": "沒有新使用者等待審核,如果有新的申請,它就會顯示在這裏。", - "admin.awaiting_approval.rejected_message": "{acct} 的註冊請求被拒絕!", "admin.dashboard.registration_mode.approval_hint": "在管理員同意註冊申請後才可加入。", "admin.dashboard.registration_mode.approval_label": "需要審核", "admin.dashboard.registration_mode.closed_hint": "公開註冊已經關閉,但已註冊用户仍然可以邀請其他人加入。", diff --git a/app/soapbox/locales/zh-TW.json b/app/soapbox/locales/zh-TW.json index f8c3025e8..788c8cdab 100644 --- a/app/soapbox/locales/zh-TW.json +++ b/app/soapbox/locales/zh-TW.json @@ -73,9 +73,7 @@ "account_search.placeholder": "搜尋使用者", "actualStatus.edited": "在 {date} 時編輯", "actualStatuses.quote_tombstone": "帖文不可用", - "admin.awaiting_approval.approved_message": "{acct} 已經通過審核!", "admin.awaiting_approval.empty_message": "沒有新使用者等待審核,如果有新的申請,它就會顯示在這裏。", - "admin.awaiting_approval.rejected_message": "{acct} 的註冊請求被拒絕!", "admin.dashboard.registration_mode.approval_hint": "在管理員同意註冊申請後才可加入。", "admin.dashboard.registration_mode.approval_label": "需要審核", "admin.dashboard.registration_mode.closed_hint": "公開註冊已經關閉,但已註冊用戶仍然可以邀請其他人加入。", From 291d2e62c5a847ef01ce65977060fa693e0b36f9 Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Tue, 28 Mar 2023 16:14:00 +0000 Subject: [PATCH 018/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1525 of 1525 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index 0de608147..f15984173 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -823,6 +823,7 @@ "groups.pending.empty.title": "暂无待处理的申请", "groups.pending.label": "待处理的申请", "groups.popular.label": "推荐群组", + "groups.search.placeholder": "搜索我的群组", "hashtag.column_header.tag_mode.all": "以及{additional}", "hashtag.column_header.tag_mode.any": "或是{additional}", "hashtag.column_header.tag_mode.none": "而不用{additional}", From 8300559eba1f2efa1179635cb96d511e66085216 Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Wed, 29 Mar 2023 04:10:18 +0000 Subject: [PATCH 019/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1531 of 1531 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index f15984173..836656583 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -316,6 +316,7 @@ "column.developers.service_worker": "服务工作进程", "column.direct": "私信", "column.directory": "发现更多", + "column.dislikes": "踩", "column.domain_blocks": "已屏蔽的站点", "column.edit_profile": "编辑个人资料", "column.event_map": "活动地点", @@ -661,6 +662,7 @@ "empty_column.bookmarks": "您还没有任何书签,一旦您将帖文加入书签,它就会显示在这里。", "empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!", "empty_column.direct": "您还没有使用过私信。当您发出或者收到私信时,它会在这里显示。", + "empty_column.dislikes": "没有人踩过此帖文。若有,则会显示在这里。", "empty_column.domain_blocks": "目前没有被隐藏的站点。", "empty_column.event_participant_requests": "目前没有待处理的活动参与申请。", "empty_column.event_participants": "没有人加入过此活动。若有,则会显示在这里。", @@ -1214,6 +1216,8 @@ "remote_instance.pin_host": "置顶 {host}", "remote_instance.unpin_host": "取消置顶 {host}", "remote_interaction.account_placeholder": "输入您想采取行动的帐号(格式:用户名@域名)", + "remote_interaction.dislike": "前去点踩", + "remote_interaction.dislike_title": "远程点踩帖文", "remote_interaction.divider": "或", "remote_interaction.event_join": "前去参加", "remote_interaction.event_join_title": "远程参加事件", @@ -1397,6 +1401,7 @@ "status.detailed_status": "详细对话视图", "status.direct": "发送私信给 @{name}", "status.disabled_replies.group_membership": "仅群组成员可以回复", + "status.disfavourite": "踩", "status.edit": "编辑", "status.embed": "嵌入帖文", "status.external": "查看帖文于 {domain}", @@ -1406,6 +1411,7 @@ "status.group_mod_block": "从群组中屏蔽 @{name}", "status.group_mod_delete": "将帖文移出群组", "status.group_mod_kick": "从群组中踢出 @{name}", + "status.interactions.dislikes": "次点踩", "status.interactions.favourites": "次点赞", "status.interactions.quotes": "次引用", "status.interactions.reblogs": "次转发", From 5e6d054f65c55a55d5fad08ea9dcd1695a63cd11 Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Wed, 29 Mar 2023 16:37:20 +0000 Subject: [PATCH 020/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1531 of 1531 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index 836656583..a3425c945 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -316,7 +316,7 @@ "column.developers.service_worker": "服务工作进程", "column.direct": "私信", "column.directory": "发现更多", - "column.dislikes": "踩", + "column.dislikes": "点踩", "column.domain_blocks": "已屏蔽的站点", "column.edit_profile": "编辑个人资料", "column.event_map": "活动地点", @@ -662,7 +662,7 @@ "empty_column.bookmarks": "您还没有任何书签,一旦您将帖文加入书签,它就会显示在这里。", "empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!", "empty_column.direct": "您还没有使用过私信。当您发出或者收到私信时,它会在这里显示。", - "empty_column.dislikes": "没有人踩过此帖文。若有,则会显示在这里。", + "empty_column.dislikes": "没有人点踩过此帖文。若有,则会显示在这里。", "empty_column.domain_blocks": "目前没有被隐藏的站点。", "empty_column.event_participant_requests": "目前没有待处理的活动参与申请。", "empty_column.event_participants": "没有人加入过此活动。若有,则会显示在这里。", @@ -1042,7 +1042,7 @@ "new_group_panel.action": "创建群组", "new_group_panel.subtitle": "找不到您要找的东西?开始您自己的私有或公共群组。", "new_group_panel.title": "创建群组", - "notification.favourite": "{name} 赞了您的帖文", + "notification.favourite": "{name} 点赞了您的帖文", "notification.follow": "{name} 开始关注您", "notification.follow_request": "{name} 请求关注您", "notification.mention": "{name} 提及了您", @@ -1386,7 +1386,7 @@ "soapbox_config.verified_can_edit_name_label": "允许经过验证的用户编辑他们自己的昵称。", "sponsored.info.message": "{siteTitle} 展示广告以使服务可持续运行。", "sponsored.info.title": "为何我会看到此广告?", - "sponsored.subtitle": "赞助", + "sponsored.subtitle": "赞助帖文", "status.admin_account": "管理用户 @{name}", "status.admin_status": "在审核界面打开此帖", "status.approval.pending": "等待批准", @@ -1401,7 +1401,7 @@ "status.detailed_status": "详细对话视图", "status.direct": "发送私信给 @{name}", "status.disabled_replies.group_membership": "仅群组成员可以回复", - "status.disfavourite": "踩", + "status.disfavourite": "点踩", "status.edit": "编辑", "status.embed": "嵌入帖文", "status.external": "查看帖文于 {domain}", @@ -1433,7 +1433,7 @@ "status.read_more": "阅读全文", "status.reblog": "转发", "status.reblog_private": "转发(可见范围不变)", - "status.reblogged_by": "{name} 已转发", + "status.reblogged_by": "{name} 转发了", "status.reblogs.empty": "没有人转发过此条帖文。若有,则会显示在这里。", "status.redraft": "删除并重新编辑", "status.remove_account_from_group": "将帐号移出群组", From 721c85f10811114ec6ec7b1db217a0c51e04ac35 Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Thu, 30 Mar 2023 13:00:26 +0000 Subject: [PATCH 021/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1532 of 1532 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index a3425c945..f1c6e05ca 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -1481,6 +1481,7 @@ "tabs_bar.profile": "个人资料", "tabs_bar.search": "搜索", "tabs_bar.settings": "设置", + "textarea.counter.label": "剩余 {count} 个字符", "theme_editor.Reset": "重置", "theme_editor.export": "导出主题", "theme_editor.import": "导入主题", From 83b80dc48c9021753fa0dfe2e7f715811a187345 Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Thu, 30 Mar 2023 15:37:20 +0000 Subject: [PATCH 022/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1538 of 1538 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index f1c6e05ca..66829b3d1 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -378,7 +378,7 @@ "column.search": "搜索", "column.settings_store": "设置储存", "column.soapbox_config": "Soapbox 设置", - "column.test": "测试时间线", + "column.test": "测试时间轴", "column_forbidden.body": "您没有权限访问此页面。", "column_forbidden.title": "无权访问", "common.cancel": "取消", @@ -554,7 +554,7 @@ "developers.navigation.service_worker_label": "服务工作进程", "developers.navigation.settings_store_label": "设置储存", "developers.navigation.show_toast": "触发推送", - "developers.navigation.test_timeline_label": "测试时间线", + "developers.navigation.test_timeline_label": "测试时间轴", "developers.settings_store.advanced": "高级设置", "developers.settings_store.hint": "您可以在此处直接编辑您的用户设置。当心!编辑此部分可能会破坏您的帐号,您将只能通过 API 恢复。", "direct.search_placeholder": "发送私信给……", @@ -692,7 +692,7 @@ "empty_column.search.groups": "无群组匹配 \"{term}\"", "empty_column.search.hashtags": "无标签匹配 \"{term}\"", "empty_column.search.statuses": "无帖文匹配 \"{term}\"", - "empty_column.test": "测试时间线是空的。", + "empty_column.test": "测试时间轴是空的。", "event.banner": "活动横幅", "event.copy": "复制链接到活动", "event.date": "日期", @@ -732,7 +732,7 @@ "export_data.success.blocks": "屏蔽列表导出完毕", "export_data.success.followers": "关注列表导出完毕", "export_data.success.mutes": "静音列表导出完毕", - "federation_restriction.federated_timeline_removal": "从联邦宇宙时间线移除", + "federation_restriction.federated_timeline_removal": "从联邦宇宙时间轴移除", "federation_restriction.followers_only": "仅关注者可见", "federation_restriction.full_media_removal": "完全移除媒体", "federation_restriction.media_nsfw": "附件标注为 NSFW", @@ -787,6 +787,9 @@ "group.leave": "离开群组", "group.leave.success": "离开了群组", "group.manage": "管理群组", + "group.popover.action": "查看群组", + "group.popover.summary": "您必须是群组成员才能回复此状态。", + "group.popover.title": "需要成员身份", "group.privacy.locked": "私有", "group.privacy.locked.full": "私有群组", "group.privacy.locked.info": "可发现。用户可以在其申请被批准后加入。", @@ -940,9 +943,12 @@ "manage_group.done": "完成", "manage_group.edit_group": "编辑群组", "manage_group.edit_success": "群组已编辑", + "manage_group.fields.cannot_change_hint": "创建群组后此设置将无法更改。", "manage_group.fields.description_label": "描述", "manage_group.fields.description_placeholder": "描述", + "manage_group.fields.name_help": "创建群组后此设置将无法更改。", "manage_group.fields.name_label": "群组名称(必填)", + "manage_group.fields.name_label_optional": "群组名称", "manage_group.fields.name_placeholder": "群组名称", "manage_group.get_started": "让我们开始吧!", "manage_group.next": "下一步", @@ -1085,7 +1091,7 @@ "onboarding.fediverse.its_you": "这是您! 其他人可以通过使用您的全名 @-handle 从其他服务器关注您。", "onboarding.fediverse.message": "联邦宇宙是一个由成千上万个不同的、独立运行的社交媒体网站(又称 \"服务器\")组成的社交网络。您可以关注大多数其它联邦宇宙服务器的用户--以及点赞、转发和回复帖子,因为他们可以与 {siteTitle} 沟通。", "onboarding.fediverse.next": "下一步", - "onboarding.fediverse.other_instances": "当浏览您的时间线时,注意第二个 @ 符号后的完整用户名,以了解帖文来自哪个服务器。", + "onboarding.fediverse.other_instances": "当浏览您的时间轴时,注意第二个 @ 符号后的完整用户名,以了解帖文来自哪个服务器。", "onboarding.fediverse.title": "{siteTitle} 只是联邦宇宙的一部分", "onboarding.fediverse.trailer": "因为它是分布式的,任何人都可以运行自己的服务器,所以联邦宇宙是有弹性和开放的。如果您选择加入另一个服务器或建立自己的服务器,您可以与相同的人互动,并继续在同一个社会图谱上。", "onboarding.finished.message": "我们非常高兴地欢迎您加入我们的社区! 点击下面的按钮,让我们开始吧。", @@ -1099,7 +1105,7 @@ "onboarding.skip": "现在跳过", "onboarding.suggestions.subtitle": "以下是几个受欢迎的帐号,您可能会喜欢。", "onboarding.suggestions.title": "推荐帐号", - "onboarding.view_feed": "浏览列表", + "onboarding.view_feed": "查看时间轴", "password_reset.confirmation": "请查阅确认邮件。", "password_reset.fields.username_placeholder": "电子邮件或用户名", "password_reset.header": "重置密码", @@ -1122,8 +1128,8 @@ "poll_button.remove_poll": "移除投票", "preferences.fields.auto_play_gif_label": "自动播放GIF动图", "preferences.fields.auto_play_video_label": "自动播放视频", - "preferences.fields.autoload_more_label": "滚动到时间线底部时自动加载更多帖文", - "preferences.fields.autoload_timelines_label": "滚动到时间线顶部时自动加载新帖", + "preferences.fields.autoload_more_label": "滚动到时间轴底部时自动加载更多帖文", + "preferences.fields.autoload_timelines_label": "滚动到时间轴顶部时自动加载新帖", "preferences.fields.boost_modal_label": "转发前确认", "preferences.fields.content_type_label": "默认帖文格式", "preferences.fields.delete_modal_label": "删除帖文前确认", @@ -1186,7 +1192,7 @@ "registration.password_mismatch": "密码不匹配。", "registration.privacy": "隐私政策", "registration.reason": "您为什么想要注册本站?", - "registration.reason_hint": "认真填写将会加快您通过的速度", + "registration.reason_hint": "这将有助于我们审核您的申请", "registration.sign_up": "注册", "registration.tos": "用户条款", "registration.username_unavailable": "用户名已被占用。", @@ -1369,7 +1375,7 @@ "soapbox_config.hints.promo_panel_icons.link": "Soapbox 图标列表", "soapbox_config.home_footer.meta_fields.label_placeholder": "标签", "soapbox_config.home_footer.meta_fields.url_placeholder": "链接", - "soapbox_config.media_preview_hint": "一些后端提供了媒体的优化版本,以便在时间线上显示。然而,如果没有额外的配置,这些预览图像可能太小。", + "soapbox_config.media_preview_hint": "一些后端提供了媒体的优化版本,以便在时间轴上显示。然而,如果没有额外的配置,这些预览图像可能太小。", "soapbox_config.media_preview_label": "倾向于预览媒体的缩略图", "soapbox_config.promo_panel.meta_fields.icon_placeholder": "图标", "soapbox_config.promo_panel.meta_fields.label_placeholder": "标签", From 0cc1b8af0973f01e5b191595b290a48b48efe0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Fri, 31 Mar 2023 03:38:58 +0000 Subject: [PATCH 023/298] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 95.2% (1465 of 1538 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/nb_NO/ --- app/soapbox/locales/no.json | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index 72fc9bc4c..7cbc5810f 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -190,6 +190,7 @@ "auth.invalid_credentials": "Feil brukernavn eller passord", "auth.logged_out": "Logget ut.", "auth_layout.register": "Opprett en konto", + "authorize.success": "Godkjent", "backups.actions.create": "Opprett sikkerhetskopi", "backups.empty_message": "Ingen sikkerhetskopier funnet. {action}", "backups.empty_message.action": "Opprette en nå?", @@ -281,6 +282,13 @@ "chats.main.blankslate_with_chats.subtitle": "Velg fra en av de åpne samtalene dine, eller opprett en ny melding.", "chats.main.blankslate_with_chats.title": "Velg en samtale", "chats.search_placeholder": "Start a chat with…", + "colum.filters.expiration.1800": "30 minutter", + "colum.filters.expiration.21600": "6 timer", + "colum.filters.expiration.3600": "1 time", + "colum.filters.expiration.43200": "12 timer", + "colum.filters.expiration.604800": "1 uke", + "colum.filters.expiration.86400": "1 dag", + "colum.filters.expiration.never": "Aldri", "column.admin.announcements": "Kunngjøring", "column.admin.awaiting_approval": "Avventer godkjenning", "column.admin.create_announcement": "Opprett kunngjøring", @@ -319,6 +327,7 @@ "column.favourites": "Liker", "column.federation_restrictions": "Føderasjonsrestriksjoner", "column.filters": "Dempede ord", + "column.filters.accounts": "Kontoer", "column.filters.add_new": "Legg til nytt filter", "column.filters.conversations": "Samtaler", "column.filters.create_error": "Feil ved tilføying av filter", @@ -326,7 +335,9 @@ "column.filters.delete_error": "Feil ved sletting av filter", "column.filters.drop_header": "Slipp i stedet for å gjemme", "column.filters.drop_hint": "Filtrerte innlegg forsvinner irreversibelt, selv om filteret senere fjernes", + "column.filters.edit": "Rediger", "column.filters.expires": "Utløper etter", + "column.filters.hide_header": "Skjul fullstendig", "column.filters.home_timeline": "Hjemmetidslinje", "column.filters.keyword": "Nøkkelord eller frase", "column.filters.notifications": "Varslinger", @@ -623,6 +634,8 @@ "emoji_button.recent": "Hyppig brukt", "emoji_button.search": "Søk…", "emoji_button.search_results": "Søkeresultat", + "emoji_button.skins_1": "Forvalg", + "emoji_button.skins_2": "", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Reise & steder", "empty_column.account_blocked": "Du er blokkert av @{accountUsername}.", @@ -722,9 +735,13 @@ "filters.added": "Filter lagt til.", "filters.context_header": "Filtrer kontekster", "filters.context_hint": "En eller flere kontekster der filteret skal brukes", + "filters.create_filter": "Opprett filter", "filters.filters_list_context_label": "Filtrer kontekster:", "filters.filters_list_drop": "Fjern", + "filters.filters_list_expired": "Utløpt", "filters.filters_list_hide": "Skjul", + "filters.filters_list_hide_completely": "Skjul innhold", + "filters.filters_list_warn": "Vis advarsel", "filters.removed": "Filter slettet.", "followRecommendations.heading": "Foreslåtte Profiler", "follow_request.authorize": "Autorisér", @@ -744,19 +761,37 @@ "group.group_mod_unblock": "Opphev Blokkering", "group.group_mod_unblock.success": "Opphevet blokkeringen av @{navn} fra gruppa", "group.header.alt": "Gruppeoverskrift", + "group.join.private": "Forespør tilgang", + "group.join.public": "Ta del i gruppe", "group.join.request_success": "Har bedt om å bli med i gruppa", "group.join.success": "Ble med i gruppa", "group.leave": "Forlat gruppa", "group.leave.success": "Forlot gruppa", "group.manage": "Behandle gruppe", + "group.popover.action": "Vis gruppe", + "group.popover.title": "Medlemskap kreves", "group.privacy.locked": "Privat", + "group.privacy.locked.full": "Privat gruppe", "group.privacy.public": "Offentlig", + "group.privacy.public.full": "Offentlig gruppe", "group.role.admin": "Administrator", "group.role.moderator": "Moderator", "group.tabs.all": "Alle", "group.tabs.members": "Medlemmer", + "group.upload_banner": "Last opp bilde", + "groups.discover.popular.show_more": "Vis mer", + "groups.discover.popular.title": "Populære grupper", + "groups.discover.search.error.subtitle": "Prøv igjen senere.", + "groups.discover.search.placeholder": "Søk", + "groups.discover.search.recent_searches.blankslate.title": "Ingen nylige søk", + "groups.discover.search.recent_searches.clear_all": "Tøm alt", + "groups.discover.search.recent_searches.title": "Nylige søk", + "groups.discover.search.results.groups": "Grupper", + "groups.discover.suggested.show_more": "Vis mer", + "groups.discover.suggested.title": "Foreslått for deg", "groups.empty.subtitle": "Begynn å oppdage grupper du kan bli med i, eller opprett din egen.", "groups.empty.title": "Ingen grupper ennå", + "groups.popular.label": "Foreslåtte grupper", "hashtag.column_header.tag_mode.all": "og {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "uten {additional}", From 8eba32a20c4448fcddf8564b540f3ae18d9e0d1e Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 31 Mar 2023 05:41:00 +0200 Subject: [PATCH 024/298] Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ --- app/soapbox/locales/no.json | 1 - 1 file changed, 1 deletion(-) diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index 7cbc5810f..21bb11751 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -635,7 +635,6 @@ "emoji_button.search": "Søk…", "emoji_button.search_results": "Søkeresultat", "emoji_button.skins_1": "Forvalg", - "emoji_button.skins_2": "", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Reise & steder", "empty_column.account_blocked": "Du er blokkert av @{accountUsername}.", From 4134557e0dc05cacd035a9ea1ff9583e4e8341fd Mon Sep 17 00:00:00 2001 From: Ahmad Dakhlallah Date: Fri, 31 Mar 2023 07:45:07 +0000 Subject: [PATCH 025/298] Translated using Weblate (Arabic) Currently translated at 94.2% (1450 of 1538 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ar/ --- app/soapbox/locales/ar.json | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index fa6030b5f..11f93b9b1 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -119,7 +119,7 @@ "admin.edit_announcement.fields.start_time_placeholder": "الإعلان يبدأ في:", "admin.edit_announcement.save": "حفظ", "admin.edit_announcement.updated": "عُدِّلَ الإعلان", - "admin.latest_accounts_panel.more": "إضغط لعرض {count} {count, plural, one {حساب} other {حسابات}}", + "admin.latest_accounts_panel.more": "إضغط لعرض {count, plural, one {# حساب} other {# حسابات}}", "admin.latest_accounts_panel.title": "أحدث الحسابات", "admin.moderation_log.empty_message": "لم تنفِّذ أيّ عملية إشرافٍ بعد. عندما تفعل سيظهر سجلٌّ لها هنا.", "admin.reports.actions.close": "إغلاق", @@ -190,6 +190,7 @@ "auth.invalid_credentials": "اسم المستخدم أو كلمة المرور خاطئة", "auth.logged_out": "سُجِّل الخروج.", "auth_layout.register": "إنشاء حساب", + "authorize.success": "موافق عليه", "backups.actions.create": "إنشاء نسخة إحتياطية", "backups.empty_message": "لم يتم العثور على نسخ احتياطية. {action}", "backups.empty_message.action": "إنشاء نسخة احتياطية الآن؟", @@ -281,6 +282,13 @@ "chats.main.blankslate_with_chats.subtitle": "اختر من إحدى الدردشات المفتوحة أو أنشئ رسالة جديدة.", "chats.main.blankslate_with_chats.title": "اختيار دردشة", "chats.search_placeholder": "بَدْء دردشة مع…", + "colum.filters.expiration.1800": "30 دقيقة", + "colum.filters.expiration.21600": "6 ساعات", + "colum.filters.expiration.3600": "ساعة", + "colum.filters.expiration.43200": "12 ساعة", + "colum.filters.expiration.604800": "أسبوع", + "colum.filters.expiration.86400": "يوم", + "colum.filters.expiration.never": "أبداً", "column.admin.announcements": "الإعلانات", "column.admin.awaiting_approval": "في انتظار الموافقة", "column.admin.create_announcement": "إنشاء إعلان", @@ -319,6 +327,7 @@ "column.favourites": "الإعجابات", "column.federation_restrictions": "القيود على الفيدرالية", "column.filters": "الكلمات المُرشِّحة", + "column.filters.accounts": "الحسابات", "column.filters.add_new": "إضافة مُرشّح جديد", "column.filters.conversations": "المحادثات", "column.filters.create_error": "حدث خطأ في أثناء إضافة المُرشّح", @@ -326,12 +335,18 @@ "column.filters.delete_error": "حدث خطأ في أثناء حذف المُرشّح", "column.filters.drop_header": "الحظر بدلا من الإخفاء", "column.filters.drop_hint": "ستختفي المنشورات التي تم ترشيحُها بشكل نهائي، حتى لو أُزيل المُرشّح لاحقًا", + "column.filters.edit": "تحرير", "column.filters.expires": "ينتهي خلال", + "column.filters.hide_header": "إخفاء بالكامل", + "column.filters.hide_hint": "إخفاء المحتوى الذي تمت تصفيته تمامًا ، بدلاً من إظهار تحذير", "column.filters.home_timeline": "المنشورات الرئيسية", "column.filters.keyword": "كلمة دلالية أو جملة", + "column.filters.keywords": "كلمات أو عبارات", "column.filters.notifications": "الإشعارات", "column.filters.public_timeline": "المنشورات العامة", "column.filters.subheading_add_new": "إضافة مُرشّح جديد", + "column.filters.title": "عنوان", + "column.filters.whole_word": "الكلمة كلّها", "column.follow_requests": "طلبات المتابعة", "column.followers": "المتابعين", "column.following": "يتابع", @@ -368,7 +383,7 @@ "common.cancel": "إلغاء", "common.error": "هناك خطب ما. حاول إعادة تحميل الصفحة.", "compare_history_modal.header": "تعديل السِّجل", - "compose.character_counter.title": "تم استخدام {chars} حرف من {maxChars}", + "compose.character_counter.title": "أُستخدم {chars} حرف من أصل {maxChars} {maxChars, plural, one {حروف} other {حروف}}", "compose.edit_success": "تم تعديل المنشور", "compose.invalid_schedule": "يجب عليك جدولة منشور بمدة لا تقل عن 5 دقائق.", "compose.submit_success": "تم إرسال المنشور", @@ -454,9 +469,9 @@ "confirmations.block.confirm": "حجب", "confirmations.block.heading": "حجب @{name}", "confirmations.block.message": "هل تود حقًا حظر {name}؟", - "confirmations.block_from_group.confirm": "حظر", - "confirmations.block_from_group.heading": "حظر عضو المجموعة", - "confirmations.block_from_group.message": "هل أنت متأكد من أنك تريد منع @{name} من التفاعل مع هذه المجموعة؟", + "confirmations.block_from_group.confirm": "حجب المستخدم", + "confirmations.block_from_group.heading": "حظر من المجموعة", + "confirmations.block_from_group.message": "متأكد من حظر @{name} من التفاعل مع هذه المجموعة؟", "confirmations.cancel.confirm": "تجاهل", "confirmations.cancel.heading": "تجاهل المنشور", "confirmations.cancel.message": "هل أنت متأكد أنك تريد إلغاء إنشاء هذا المنشور؟", @@ -513,7 +528,7 @@ "confirmations.unfollow.confirm": "إلغاء المتابعة", "crypto_donate.explanation_box.message": "{siteTitle} يقبل العملات الرقمية . بإمكانك التبرع عبر أي من هذه العناوين في الأسفل . شكرا لدعمك!", "crypto_donate.explanation_box.title": "يتم إرسال العملات الرقمية", - "crypto_donate_panel.actions.view": "انقر لإظهار {count} {count, plural, one {wallet} other {wallets}}", + "crypto_donate_panel.actions.view": "اضغط لعرض {count, plural, one {# محفظة} other {# محفظة}}", "crypto_donate_panel.heading": "تبرّع بالعملات الرقمية", "crypto_donate_panel.intro.message": "يقبل {siteTitle} العملات الرقمية لدعم تواجه . شكراً لدعمك!", "datepicker.day": "يوم", @@ -612,6 +627,7 @@ "email_verifilcation.exists": "هذا البريد الإلكتروني مستخدم بالفعل.", "embed.instructions": "يمكنكم إدراج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", "emoji_button.activity": "الأنشطة", + "emoji_button.add_custom": "أضف إيموجي مخصص", "emoji_button.custom": "مخصص", "emoji_button.flags": "الأعلام", "emoji_button.food": "الطعام والشراب", @@ -619,10 +635,16 @@ "emoji_button.nature": "الطبيعة", "emoji_button.not_found": "ليس هناك رموز تعبيرية ┻━┻︵╯ (°□°╰)", "emoji_button.objects": "أشياء", + "emoji_button.oh_no": "أوه لا!", "emoji_button.people": "الناس", + "emoji_button.pick": "اختر رمزًا تعبيريًا …", "emoji_button.recent": "الشائعة الاستخدام", "emoji_button.search": "البحث...", "emoji_button.search_results": "نتائج البحث", + "emoji_button.skins_1": "الإفتراضي", + "emoji_button.skins_2": "فاتح", + "emoji_button.skins_3": "ضوء المتوسط", + "emoji_button.skins_4": "متوسط", "emoji_button.symbols": "رموز", "emoji_button.travel": "الأماكن والسفر", "empty_column.account_blocked": "تم حظرك بواسطة @{accountUsername}.", @@ -1370,7 +1392,7 @@ "status.unbookmark": "تمت الإزالة من المحفوظات", "status.unbookmarked": "أُزيلت بنجاح.", "status.unmute_conversation": "إلغاء كتم المحادثة", - "status.unpin": "إزالة التثبيت من الملف الشخصي", + "status.unpin": "إلغاء التثبيت", "status_list.queue_label": "إضغط لترى {count} {count, plural, one {post} other {posts}} جديدة", "statuses.quote_tombstone": "المنشور غير متوفر.", "statuses.tombstone": "هناك منشور أو أكثر غير متاحين.", From d7e76743d79991695073dcff184b66b4b7d3154e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Fri, 31 Mar 2023 03:41:14 +0000 Subject: [PATCH 026/298] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 95.8% (1474 of 1538 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/nb_NO/ --- app/soapbox/locales/no.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index 21bb11751..fc6f6a76d 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -791,6 +791,7 @@ "groups.empty.subtitle": "Begynn å oppdage grupper du kan bli med i, eller opprett din egen.", "groups.empty.title": "Ingen grupper ennå", "groups.popular.label": "Foreslåtte grupper", + "groups.search.placeholder": "Søk i mine grupper", "hashtag.column_header.tag_mode.all": "og {additional}", "hashtag.column_header.tag_mode.any": "or {additional}", "hashtag.column_header.tag_mode.none": "uten {additional}", @@ -894,8 +895,11 @@ "login_external.errors.network_fail": "Tilkoblingen mislyktes. Blokkerer en nettleserutvidelse den?", "login_form.header": "Sign In", "manage_group.blocked_members": "Blokkerte medlemmer", + "manage_group.confirmation.copy": "Kopier lenke", + "manage_group.confirmation.share": "Del denne gruppen", "manage_group.create": "Opprette", "manage_group.delete_group": "Slett gruppe", + "manage_group.done": "Ferdig", "manage_group.edit_group": "Rediger gruppe", "manage_group.edit_success": "Gruppen ble redigert", "manage_group.fields.description_label": "Beskrivelse", @@ -1160,6 +1164,7 @@ "registrations.unprocessable_entity": "Dette brukernavnet er allerede tatt.", "registrations.username.hint": "Kan bare inneholde A-Z, 0-9 og understreker", "registrations.username.label": "Brukernavnet ditt", + "reject.success": "Avslått", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "nå", @@ -1200,10 +1205,13 @@ "report.chatMessage.context": "Når du rapporterer en brukers melding, sendes de fem meldingene før og fem meldinger etter den valgte til modereringsteamet vårt for konteks.", "report.chatMessage.title": "Rapporter melding", "report.confirmation.content": "Hvis vi finner ut at denne kontoen bryter med {link}, vil vi iverksette ytterligere tiltak i saken.", + "report.confirmation.entity.account": "konto", + "report.confirmation.entity.group": "gruppe", "report.confirmation.title": "Takk for at du sendte inn rapporten.", "report.done": "Ferdig", "report.forward": "Videresend til {target}", "report.forward_hint": "Kontoen er fra en annen server. Sende en kopi av rapporten dit også?", + "report.group.title": "Rapporter gruppe", "report.next": "Next", "report.otherActions.addAdditional": "Ønsker du å legge til flere statuser i denne rapporten?", "report.otherActions.addMore": "Legg til mer", @@ -1394,6 +1402,7 @@ "status.sensitive_warning": "Følsomt innhold", "status.sensitive_warning.subtitle": "Dette innholdet er kanskje ikke egnet for alle målgrupper.", "status.share": "Del", + "status.show_filter_reason": "Vis uansett", "status.show_less_all": "Vis mindre for alle", "status.show_more_all": "Vis mer for alle", "status.show_original": "Vis originalen", @@ -1430,6 +1439,7 @@ "tabs_bar.profile": "Profil", "tabs_bar.search": "Søk", "tabs_bar.settings": "Innstillinger", + "textarea.counter.label": "{count} tegn gjenstår", "theme_editor.Reset": "Tilbakestill", "theme_editor.export": "Eksporter tema", "theme_editor.import": "Importer tema", From 828e9a881c8cbebe10e35dedfda5a73d33a93d7f Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 31 Mar 2023 13:44:51 +0200 Subject: [PATCH 027/298] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ --- app/soapbox/locales/ar.json | 1 - app/soapbox/locales/de.json | 1 - app/soapbox/locales/es.json | 1 - app/soapbox/locales/it.json | 1 - app/soapbox/locales/no.json | 1 - app/soapbox/locales/pl.json | 1 - app/soapbox/locales/zh-CN.json | 1 - 7 files changed, 7 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index 11f93b9b1..7fed9acf5 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -774,7 +774,6 @@ "group.privacy.locked": "خاص", "group.privacy.public": "عام", "group.role.admin": "مسؤول", - "group.role.moderator": "مشرف", "group.tabs.all": "الكل", "group.tabs.members": "الأعضاء", "groups.empty.subtitle": "ابدأ في اكتشاف مجموعات للانضمام إليها أو إنشاء مجموعاتك الخاصة.", diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index 386a30081..b56492a3f 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -728,7 +728,6 @@ "group.privacy.locked": "Privat", "group.privacy.public": "Öffentlich", "group.role.admin": "Administrator:in", - "group.role.moderator": "Moderator:in", "group.tabs.all": "Alle", "group.tabs.members": "Mitglieder", "groups.empty.subtitle": "Entdecke Gruppen zum teilnehmen oder erstelle deine eigene.", diff --git a/app/soapbox/locales/es.json b/app/soapbox/locales/es.json index 5b3f58dda..2a3734796 100644 --- a/app/soapbox/locales/es.json +++ b/app/soapbox/locales/es.json @@ -795,7 +795,6 @@ "group.promote.admin.confirmation.title": "Asignar la función de administrador", "group.promote.admin.success": "@{name} es ahora un administrador", "group.role.admin": "Administrador", - "group.role.moderator": "Moderador", "group.tabs.all": "Todos", "group.tabs.members": "Miembros", "group.upload_banner": "Subir una foto", diff --git a/app/soapbox/locales/it.json b/app/soapbox/locales/it.json index eed0a69ab..5b23d5e5c 100644 --- a/app/soapbox/locales/it.json +++ b/app/soapbox/locales/it.json @@ -764,7 +764,6 @@ "group.privacy.locked": "Privato", "group.privacy.public": "Pubblico", "group.role.admin": "Amministrazione", - "group.role.moderator": "Moderazione", "group.tabs.all": "Tutto", "group.tabs.members": "Partecipanti", "groups.discover.search.no_results.subtitle": "Prova a cercare un altro gruppo.", diff --git a/app/soapbox/locales/no.json b/app/soapbox/locales/no.json index fc6f6a76d..2c36a887b 100644 --- a/app/soapbox/locales/no.json +++ b/app/soapbox/locales/no.json @@ -774,7 +774,6 @@ "group.privacy.public": "Offentlig", "group.privacy.public.full": "Offentlig gruppe", "group.role.admin": "Administrator", - "group.role.moderator": "Moderator", "group.tabs.all": "Alle", "group.tabs.members": "Medlemmer", "group.upload_banner": "Last opp bilde", diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json index ff3d39cbd..9ed7732f4 100644 --- a/app/soapbox/locales/pl.json +++ b/app/soapbox/locales/pl.json @@ -722,7 +722,6 @@ "group.privacy.locked": "Prywatna", "group.privacy.public": "Publiczna", "group.role.admin": "Administrator", - "group.role.moderator": "Moderator", "group.tabs.all": "Wszystko", "group.tabs.members": "Członkowie", "groups.empty.subtitle": "Odkrywaj grupy do których możesz dołączyć lub utwórz własną.", diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index 66829b3d1..4a8535742 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -800,7 +800,6 @@ "group.promote.admin.confirmation.title": "分配管理员职务", "group.promote.admin.success": "@{name} 现在是管理员", "group.role.admin": "管理员", - "group.role.moderator": "监察员", "group.tabs.all": "全部", "group.tabs.members": "成员", "group.upload_banner": "已上传照片", From 2a3586ba24a5c01afe6fa3096e8a827d1a204a8a Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Fri, 31 Mar 2023 16:25:09 +0000 Subject: [PATCH 028/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1539 of 1539 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index 4a8535742..fa77dd456 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -799,7 +799,9 @@ "group.promote.admin.confirmation.message": "您确定要将管理员职务分配给 @{name} 吗?", "group.promote.admin.confirmation.title": "分配管理员职务", "group.promote.admin.success": "@{name} 现在是管理员", + "group.report.label": "举报", "group.role.admin": "管理员", + "group.role.owner": "拥有者", "group.tabs.all": "全部", "group.tabs.members": "成员", "group.upload_banner": "已上传照片", From 7dde47f5a1f9eaf4219ce9f7dbd99302122666f0 Mon Sep 17 00:00:00 2001 From: Isabell De Inschnitzel Date: Sat, 1 Apr 2023 09:32:40 +0000 Subject: [PATCH 029/298] Translated using Weblate (German) Currently translated at 90.9% (1400 of 1540 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/de/ --- app/soapbox/locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/soapbox/locales/de.json b/app/soapbox/locales/de.json index b56492a3f..e311c8b6a 100644 --- a/app/soapbox/locales/de.json +++ b/app/soapbox/locales/de.json @@ -1293,7 +1293,7 @@ "status.disabled_replies.group_membership": "Nur Gruppenmitglieder können antworten", "status.edit": "Bearbeiten", "status.embed": "Einbetten", - "status.external": "Öffne auf Heimatdomäne", + "status.external": "Auf Originalseite öffnen", "status.favourite": "Favorisieren", "status.filtered": "Gefiltert", "status.group": "Gepostet in {group}", From 6c2887e8b3be729b67b7b540dcb691271767bd8f Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Sat, 1 Apr 2023 04:55:59 +0000 Subject: [PATCH 030/298] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1540 of 1540 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/zh_Hans/ --- app/soapbox/locales/zh-CN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/soapbox/locales/zh-CN.json b/app/soapbox/locales/zh-CN.json index fa77dd456..7d1bd916d 100644 --- a/app/soapbox/locales/zh-CN.json +++ b/app/soapbox/locales/zh-CN.json @@ -443,6 +443,7 @@ "compose_form.spoiler_placeholder": "折叠部分的警告消息", "compose_form.spoiler_remove": "移除敏感标记", "compose_form.spoiler_title": "敏感内容", + "compose_group.share_to_followers": "与我的关注者分享", "confirmation_modal.cancel": "取消", "confirmations.admin.deactivate_user.confirm": "停用帐号 @{name}", "confirmations.admin.deactivate_user.heading": "停用帐号 @{acct}", From d558fb9f610c634b94a2c6edca394378f277183f Mon Sep 17 00:00:00 2001 From: jonnysemon Date: Sat, 1 Apr 2023 19:47:50 +0000 Subject: [PATCH 031/298] Translated using Weblate (Arabic) Currently translated at 99.1% (1527 of 1540 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/ar/ --- app/soapbox/locales/ar.json | 93 ++++++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 11 deletions(-) diff --git a/app/soapbox/locales/ar.json b/app/soapbox/locales/ar.json index 7fed9acf5..b82546511 100644 --- a/app/soapbox/locales/ar.json +++ b/app/soapbox/locales/ar.json @@ -316,6 +316,7 @@ "column.developers.service_worker": "Service Worker", "column.direct": "الرسائل الخاصة", "column.directory": "تصفح الحسابات", + "column.dislikes": "عدم الإعجاب", "column.domain_blocks": "النطاقات المخفية", "column.edit_profile": "تعديل المِلف الشخصي", "column.event_map": "موقع الحدث", @@ -442,6 +443,7 @@ "compose_form.spoiler_placeholder": "تنبيه عن المحتوى", "compose_form.spoiler_remove": "إزالة الحساسية", "compose_form.spoiler_title": "محتوى حسَّاس", + "compose_group.share_to_followers": "شارك مع متابعيني", "confirmation_modal.cancel": "إلغاء", "confirmations.admin.deactivate_user.confirm": "تعطيل @{name}", "confirmations.admin.deactivate_user.heading": "تعطيل @{acct}", @@ -633,7 +635,7 @@ "emoji_button.food": "الطعام والشراب", "emoji_button.label": "أدرج رمز تعبيري", "emoji_button.nature": "الطبيعة", - "emoji_button.not_found": "ليس هناك رموز تعبيرية ┻━┻︵╯ (°□°╰)", + "emoji_button.not_found": "لم يتم العثور على رموز تعبيرية.", "emoji_button.objects": "أشياء", "emoji_button.oh_no": "أوه لا!", "emoji_button.people": "الناس", @@ -645,6 +647,9 @@ "emoji_button.skins_2": "فاتح", "emoji_button.skins_3": "ضوء المتوسط", "emoji_button.skins_4": "متوسط", + "emoji_button.skins_5": "داكن-متوسط", + "emoji_button.skins_6": "داكن", + "emoji_button.skins_choose": "اختر لون البشرة الافتراضي", "emoji_button.symbols": "رموز", "emoji_button.travel": "الأماكن والسفر", "empty_column.account_blocked": "تم حظرك بواسطة @{accountUsername}.", @@ -658,6 +663,7 @@ "empty_column.bookmarks": "ليس لديك أي علامات ، ستظهر هنا عند اضافتها.", "empty_column.community": " لا توجد منشورات في بسّام بعد. أكتب شيئا ما للعامة كبداية!", "empty_column.direct": "لم تتلقَ أي رسالة خاصة مباشرة بعد. ستعرض الرسائل المباشرة هنا في حال أرسلت أو تلقيت بعضها.", + "empty_column.dislikes": "لا أحد قام بعدم إعجاب هذا المنشور حتى الآن. عندما يفعل شخص ما ، سيظهرون هنا.", "empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.", "empty_column.event_participant_requests": "لا توجد طلبات معلقة للمشاركة في الحدث.", "empty_column.event_participants": "لم ينضم أحد إلى هذا الحدث حتى الآن. عندما يفعل شخص ما ، سوف يظهر هنا.", @@ -744,9 +750,14 @@ "filters.added": "أُضيف المُرشّح.", "filters.context_header": "سياق المُرشِّح", "filters.context_hint": "سياق واحد أو أكثر حيث يجب تطبيق المُرشِّح", + "filters.create_filter": "إنشاء عامل تصفية", "filters.filters_list_context_label": "سياق المُرشِّح:", "filters.filters_list_drop": "إسقاط", + "filters.filters_list_expired": "انتهت الصلاحية", "filters.filters_list_hide": "إخفاء", + "filters.filters_list_hide_completely": "إخفاء المحتوى", + "filters.filters_list_phrases_label": "كلمة دلالية أو جملة:", + "filters.filters_list_warn": "عرض تحذير", "filters.removed": "حُذف المُرشِّح.", "followRecommendations.heading": "الحسابات المقترحة", "follow_request.authorize": "ترخيص بالوصول", @@ -757,27 +768,67 @@ "gdpr.title": "موقع {siteTitle} يستخدم الكوكيز", "getting_started.open_source_notice": "{code_name} هو برنامَج مفتوح المصدر. يمكنك المساهمة أو الإبلاغ عن الأخطاء على {code_link} (الإصدار {code_version}).", "group.cancel_request": "إلغاء الطلب", - "group.group_mod_block": "حظر @{name} من المجموعة", - "group.group_mod_block.success": "حُظِرَ @{name} من المجموعة", - "group.group_mod_demote": "خفض الرتبة", + "group.delete.success": "تم حذف المجموعة بنجاح", + "group.demote.user.success": "@{name} اصبح عضو الآن", + "group.group_mod_authorize.fail": "فشلت الموافقة على @{name}", + "group.group_mod_block": "حظر من المجموعة", + "group.group_mod_block.success": "تم حظر @{name}", + "group.group_mod_demote": "حذف {role} الرتبة", "group.group_mod_kick": "طرد @{name} من المجموعة", "group.group_mod_kick.success": "طُرِدَ @{name} من المجموعة", - "group.group_mod_promote_mod": "ترقية @{name} إلى مشرف المجموعة", + "group.group_mod_promote_mod": "ترقية {role} الرتبة", + "group.group_mod_reject.fail": "فشل الرفض @{name}", "group.group_mod_unblock": "رفع الحظر", "group.group_mod_unblock.success": "أُلْغِيَّ الحظر على @ {name} من المجموعة", "group.header.alt": "غلاف المجموعة", + "group.join.private": "طلب الدخول", + "group.join.public": "الإنضمام إلى المجموعة", "group.join.request_success": "طلب الانضمام للمجموعة", - "group.join.success": "الإنضمام إلى المجموعة", + "group.join.success": "تم الإنضمام إلى المجموعة بنجاح", "group.leave": "غادر المجموعة", "group.leave.success": "غادر المجموعة", "group.manage": "إدارة المجموعة", + "group.popover.action": "عرض المجموعة", + "group.popover.summary": "يجب أن تكون عضوًا في المجموعة للرد على هذه الحالة.", + "group.popover.title": "العضوية مطلوبة", "group.privacy.locked": "خاص", + "group.privacy.locked.full": "مجموعة خاصة", + "group.privacy.locked.info": "قابل للاكتشاف. يمكن للمستخدمين الانضمام بعد الموافقة على طلبهم.", "group.privacy.public": "عام", + "group.privacy.public.full": "مجموعة عامة", + "group.privacy.public.info": "قابل للاكتشاف. يمكن لأي شخص الانضمام.", + "group.promote.admin.confirmation.message": "هل تريد بالتأكيد تعيين دور المسؤول إلى @{name}؟", + "group.promote.admin.confirmation.title": "تعيين دور المسؤول", + "group.promote.admin.success": "@{name} هو الآن مسؤول", + "group.report.label": "تبليغ", "group.role.admin": "مسؤول", + "group.role.owner": "مالك", "group.tabs.all": "الكل", "group.tabs.members": "الأعضاء", + "group.upload_banner": "رفع الصورة", + "groups.discover.popular.show_more": "عرض المزيد", + "groups.discover.popular.title": "مجموعات شعبية", + "groups.discover.search.error.subtitle": "الرجاء إعادة المحاولة في وقت لاحق.", + "groups.discover.search.error.title": "حدث خطأ", + "groups.discover.search.no_results.subtitle": "حاول البحث عن مجموعة أخرى.", + "groups.discover.search.no_results.title": "لم يتم العثور على نتائج", + "groups.discover.search.placeholder": "بحث", + "groups.discover.search.recent_searches.blankslate.title": "لا توجد عمليات بحث حديثة", + "groups.discover.search.recent_searches.clear_all": "امسح الكل", + "groups.discover.search.recent_searches.title": "عمليات البحث الأخيرة", + "groups.discover.search.results.groups": "المجموعات", + "groups.discover.search.results.member_count": "{members, plural, one {member} other {members}}", + "groups.discover.suggested.empty": "تعذر جلب المجموعات المقترحة في الوقت الحالي. يرجى التحقق مرة أخرى في وقت لاحق.", + "groups.discover.suggested.show_more": "عرض المزيد", + "groups.discover.suggested.title": "مقترح لك", "groups.empty.subtitle": "ابدأ في اكتشاف مجموعات للانضمام إليها أو إنشاء مجموعاتك الخاصة.", "groups.empty.title": "لا توجد مجموعات حتى الآن", + "groups.pending.count": "{number, plural, one {# pending request} other {# pending requests}}", + "groups.pending.empty.subtitle": "ليس لديك طلبات قيده الانتظار في هذا الوقت.", + "groups.pending.empty.title": "لا توجد طلبات قيد الانتظار", + "groups.pending.label": "طلبات قيد الانتظار", + "groups.popular.label": "المجموعات المقترحة", + "groups.search.placeholder": "ابحث في مجموعاتي", "hashtag.column_header.tag_mode.all": "و {additional}", "hashtag.column_header.tag_mode.any": "أو {additional}", "hashtag.column_header.tag_mode.none": "بدون {additional}", @@ -881,13 +932,23 @@ "login_external.errors.network_fail": "فشل الاتصال، ربما هناك إضافة في متصفحك تقوم بحظر الاتصال؟", "login_form.header": "تسجيل الدخول", "manage_group.blocked_members": "الأعضاء المحظورين", + "manage_group.confirmation.copy": "نسخ الرابط", + "manage_group.confirmation.info_1": "بصفتك مالك هذه المجموعة ، يمكنك تعيين موظفين وحذف المنشورات وأكثر بكثير..", + "manage_group.confirmation.info_2": "انشر أول مشاركة للمجموعة وابدأ المحادثة.", + "manage_group.confirmation.info_3": "شارك مجموعتك الجديدة مع الأصدقاء والعائلة والمتابعين لتنمية عضويتها.", + "manage_group.confirmation.share": "شارك هذه المجموعة", + "manage_group.confirmation.title": "أنت الآن على أتم استعداد!", "manage_group.create": "إنشاء", "manage_group.delete_group": "حذف المجموعة", + "manage_group.done": "‏‎‏‪إنتهى", "manage_group.edit_group": "تحرير المجموعة", "manage_group.edit_success": "تم تحرير المجموعة", + "manage_group.fields.cannot_change_hint": "لا يمكن تغيير هذا بعد إنشاء المجموعة.", "manage_group.fields.description_label": "الوصف", "manage_group.fields.description_placeholder": "الوصف", + "manage_group.fields.name_help": "لا يمكن تغيير هذا بعد إنشاء المجموعة.", "manage_group.fields.name_label": "اسم المجموعة (مطلوبة)", + "manage_group.fields.name_label_optional": "اسم المجموعة", "manage_group.fields.name_placeholder": "اسم المجموعة", "manage_group.get_started": "لنبدأ!", "manage_group.next": "التالي", @@ -986,7 +1047,7 @@ "new_event_panel.title": "إنشاء حدث جديد", "new_group_panel.action": "إنشاء مجموعة", "new_group_panel.subtitle": "ألا تستطيع إيجاد ما تبحث عنه؟ ابدأ مجموعتك الخاصة أو العامة.", - "new_group_panel.title": "إنشاء مجموعة جديدة", + "new_group_panel.title": "إنشاء مجموعة", "notification.favourite": "أُعجِب {name} بمنشورك", "notification.follow": "قام {name} بمتابعتك", "notification.follow_request": "طلب {name} متابعتك", @@ -994,7 +1055,7 @@ "notification.mentioned": " {name} أشار إليك", "notification.move": "{name} تغير إلى {targetName}", "notification.name": "{link}{others}", - "notification.others": "+ {count} {count, plural, one {other} other {others}}", + "notification.others": " + {count, plural, one {# other} other {# others}}", "notification.pleroma:chat_mention": "{name} أرسل لك رسالة", "notification.pleroma:emoji_reaction": "تفاعل {name} مع منشورك", "notification.pleroma:event_reminder": "يبدأ الحدث الذي تشارك فيه قريبًا", @@ -1013,7 +1074,7 @@ "notifications.filter.mentions": "الإشارات", "notifications.filter.polls": "نتائج استطلاع الرأي", "notifications.filter.statuses": "تحديثات من أشخاص تتابعهم", - "notifications.group": "{count} إشعار", + "notifications.group": "{count, plural, one {# notification} other {# notifications}}", "notifications.queue_label": "إضفط لترى {count} {count, plural, one {notification} other {notifications}} جديدة", "oauth_consumer.tooltip": "تسجيل الدخول من خلال {provider}", "oauth_consumers.title": "طرق أخرى لتسجيل الدخول", @@ -1147,6 +1208,7 @@ "registrations.unprocessable_entity": "هذا الاسم محجوز.", "registrations.username.hint": "يجب أن تحتوى أحرف من بين A-Z، أرقام ما بين 0-9 و شرطة سفلية", "registrations.username.label": "اسم المستخدم", + "reject.success": "مرفوض", "relative_time.days": "{number} يوم", "relative_time.hours": "{number} ساعة", "relative_time.just_now": "الآن", @@ -1160,6 +1222,8 @@ "remote_instance.pin_host": "تثبيت {host}.", "remote_instance.unpin_host": "إزالة تثبيت {host}.", "remote_interaction.account_placeholder": "أدخل اسم المستخدم@عنوان الخادم الذي تريد التفاعل منه", + "remote_interaction.dislike": "إكمل عدم الاعجاب", + "remote_interaction.dislike_title": "عدم إعجاب المنشور عن بعد", "remote_interaction.divider": "أو", "remote_interaction.event_join": "المتابعة في الانضمام", "remote_interaction.event_join_title": "الانضمام إلى حدث عن بعد", @@ -1186,11 +1250,14 @@ "report.block_hint": "أتريد حظر هذا الحساب أيضًا؟", "report.chatMessage.context": "عند الإبلاغ عن رسالة مستخدم، سيتم تمرير الرسائل الخمس السابقة والخمس التي تليها إلى فريق الإشراف لدينا لمعرفة السياق.", "report.chatMessage.title": "التبليغ عن الرسالة", - "report.confirmation.content": "في حال وجدنا أن هذا الحساب ينتهك {link}، سوف نتخذ أجراءات أخرى. ", + "report.confirmation.content": "في حال وجدنا أن هذا {entity} ينتهك {link}، سوف نتخذ أجراءات أخرى.", + "report.confirmation.entity.account": "حساب", + "report.confirmation.entity.group": "مجموعة", "report.confirmation.title": "شكرًا لتقديمك للبلاغ.", "report.done": "إنتهى", "report.forward": "الإرسال أيضاً إلى {target}", "report.forward_hint": "هذا الحساب موجود في خادم آخر. هل ترغب في إرسال نسخة مجهولة من البلاغ إلى ذلك الخادم؟ ", + "report.group.title": "الابلاغ عن المجموعة", "report.next": "التالي", "report.otherActions.addAdditional": "هل ترغب في إضافة معلومات أخرى لهذا التقرير؟", "report.otherActions.addMore": "والمزيد", @@ -1340,6 +1407,7 @@ "status.detailed_status": "عرض مُفصّل للمحادثة", "status.direct": "رسالة خاصة إلى @{name}", "status.disabled_replies.group_membership": "يمكن لأعضاء المجموعة فقط الرد", + "status.disfavourite": "عدم الاعجاب", "status.edit": "تحرير", "status.embed": "تضمين", "status.external": "العرض على {domain}", @@ -1349,6 +1417,7 @@ "status.group_mod_block": "حظر @{name} من المجموعة", "status.group_mod_delete": "حذف المشاركة من المجموعة", "status.group_mod_kick": "طرد @{name} من المجموعة", + "status.interactions.dislikes": "{count, plural, one {Dislike} other {Dislikes}}", "status.interactions.favourites": "{count, plural, one {إعجاب واحد} other {إعجاب}}", "status.interactions.quotes": "{count, plural, one {# صوت} other {# أصوات}}", "status.interactions.reblogs": "{count, plural, one {مشاركة} other {مشاركات}}", @@ -1381,6 +1450,7 @@ "status.sensitive_warning": "محتوى حساس", "status.sensitive_warning.subtitle": "قد لا يكون هذا المنشور ملائم للجميع.", "status.share": "مشاركة", + "status.show_filter_reason": "عرض على أي حال", "status.show_less_all": "طي الكل", "status.show_more_all": "توسيع الكل", "status.show_original": "عرض الأصل", @@ -1417,6 +1487,7 @@ "tabs_bar.profile": "الملف الشخصي", "tabs_bar.search": "البحث", "tabs_bar.settings": "الإعدادات", + "textarea.counter.label": "{count} الأحرف المتبقية", "theme_editor.Reset": "إعادة تعيين", "theme_editor.export": "تصدير السمة", "theme_editor.import": "استيراد السمة", @@ -1447,7 +1518,7 @@ "upload_error.image_size_limit": "الصورة تجاوزت الحجم المسموح به: ({limt})", "upload_error.limit": "لقد تم بلوغ الحد الأقصى المسموح به لإرسال الملفات.", "upload_error.poll": "لا يمكن إرفاق ملفات في التصويت", - "upload_error.video_duration_limit": "المقطع تجاوز المدة المسموح بها: ({limt} ثانية)", + "upload_error.video_duration_limit": "يتجاوز الفيديو حد المدة الحالي ({limit, plural, one {# second} other {# seconds}})", "upload_error.video_size_limit": "المقطع تجاوز الحجم المسموح به: ({limt})", "upload_form.description": "وصف لمن لديهم إعاقة بصرية", "upload_form.preview": "مراجعة", From 43ffceabacb9ddf371ca87f00006ca851a5b7862 Mon Sep 17 00:00:00 2001 From: Tassoman Date: Sun, 2 Apr 2023 18:12:40 +0000 Subject: [PATCH 032/298] Translated using Weblate (Italian) Currently translated at 94.4% (1454 of 1540 strings) Translation: Soapbox/Soapbox Translate-URL: https://hosted.weblate.org/projects/soapbox-pub/soapbox/it/ --- app/soapbox/locales/it.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/soapbox/locales/it.json b/app/soapbox/locales/it.json index 5b23d5e5c..343257e05 100644 --- a/app/soapbox/locales/it.json +++ b/app/soapbox/locales/it.json @@ -1158,13 +1158,15 @@ "remote_instance.federation_panel.some_restrictions_message": "{siteTitle} ha impostato alcune restrizioni per {host}.", "remote_instance.pin_host": "Pin {host}", "remote_instance.unpin_host": "Unpin {host}", - "remote_interaction.account_placeholder": "Digita il nome utente con cui vuoi interagire, es: username@dominio", - "remote_interaction.divider": "or", + "remote_interaction.account_placeholder": "Indica il tuo nome utente (es: me@istanza) da cui vuoi interagire", + "remote_interaction.dislike": "Procedi togliendo il Like", + "remote_interaction.dislike_title": "Togli Like da remoto", + "remote_interaction.divider": "oppure", "remote_interaction.event_join": "Richiedi partecipazione", "remote_interaction.event_join_title": "Partecipa ad un evento da remoto", "remote_interaction.favourite": "Procedi con il Like", - "remote_interaction.favourite_title": "Metti Like a una pubblicazione da remoto", - "remote_interaction.follow": "Procedi con il Follow", + "remote_interaction.favourite_title": "Metti Like da remoto", + "remote_interaction.follow": "Segui da remoto", "remote_interaction.follow_title": "Segui {user} da remoto", "remote_interaction.poll_vote": "Procedi col voto", "remote_interaction.poll_vote_title": "Vota in un sondaggio da remoto", @@ -1172,7 +1174,7 @@ "remote_interaction.reblog_title": "Ripubblica da remoto", "remote_interaction.reply": "Procedi con la risposta", "remote_interaction.reply_title": "Rispondi da remoto ad una pubblicazione", - "remote_interaction.user_not_found_error": "Impossibile trovare l'utenza", + "remote_interaction.user_not_found_error": "Impossibile trovare il profilo", "remote_timeline.filter_message": "Stai leggendo la timeline di {instance}.", "reply_indicator.cancel": "Annulla", "reply_mentions.account.add": "Aggiungi alle menzioni", From 2bc6ff3fa3d70f3778970412513185fb6dfe3aab Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sun, 2 Apr 2023 18:32:50 -0500 Subject: [PATCH 033/298] Use Link header for home timeline pagination --- app/soapbox/actions/timelines.ts | 56 ++++++++++++++++--- .../features/feed-filtering/feed-carousel.tsx | 2 +- app/soapbox/features/home-timeline/index.tsx | 5 +- app/soapbox/features/test-timeline/index.tsx | 2 +- app/soapbox/reducers/timelines.ts | 24 +++++++- 5 files changed, 74 insertions(+), 15 deletions(-) diff --git a/app/soapbox/actions/timelines.ts b/app/soapbox/actions/timelines.ts index 7ae023338..cafaa6aa5 100644 --- a/app/soapbox/actions/timelines.ts +++ b/app/soapbox/actions/timelines.ts @@ -4,7 +4,7 @@ import { getSettings } from 'soapbox/actions/settings'; import { normalizeStatus } from 'soapbox/normalizers'; import { shouldFilter } from 'soapbox/utils/timelines'; -import api, { getLinks } from '../api'; +import api, { getNextLink, getPrevLink } from '../api'; import { importFetchedStatus, importFetchedStatuses } from './importer'; @@ -139,7 +139,7 @@ const parseTags = (tags: Record = {}, mode: 'any' | 'all' | 'none }; const replaceHomeTimeline = ( - accountId: string | null, + accountId: string | undefined, { maxId }: Record = {}, done?: () => void, ) => (dispatch: AppDispatch, _getState: () => RootState) => { @@ -162,7 +162,12 @@ const expandTimeline = (timelineId: string, path: string, params: Record 0) { + if ( + !params.max_id && + !params.pinned && + (timeline.items || ImmutableOrderedSet()).size > 0 && + !path.includes('max_id=') + ) { params.since_id = timeline.getIn(['items', 0]); } @@ -171,9 +176,16 @@ const expandTimeline = (timelineId: string, path: string, params: Record { - const next = getLinks(response).refs.find(link => link.rel === 'next'); dispatch(importFetchedStatuses(response.data)); - dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.status === 206, isLoadingRecent, isLoadingMore)); + dispatch(expandTimelineSuccess( + timelineId, + response.data, + getNextLink(response), + getPrevLink(response), + response.status === 206, + isLoadingRecent, + isLoadingMore, + )); done(); }).catch(error => { dispatch(expandTimelineFail(timelineId, error, isLoadingMore)); @@ -181,9 +193,26 @@ const expandTimeline = (timelineId: string, path: string, params: Record = {}, done = noOp) => { - const endpoint = accountId ? `/api/v1/accounts/${accountId}/statuses` : '/api/v1/timelines/home'; - const params: any = { max_id: maxId }; +interface ExpandHomeTimelineOpts { + accountId?: string + maxId?: string + url?: string +} + +interface HomeTimelineParams { + max_id?: string + exclude_replies?: boolean + with_muted?: boolean +} + +const expandHomeTimeline = ({ url, accountId, maxId }: ExpandHomeTimelineOpts = {}, done = noOp) => { + const endpoint = url || (accountId ? `/api/v1/accounts/${accountId}/statuses` : '/api/v1/timelines/home'); + const params: HomeTimelineParams = {}; + + if (!url && maxId) { + params.max_id = maxId; + } + if (accountId) { params.exclude_replies = true; params.with_muted = true; @@ -237,11 +266,20 @@ const expandTimelineRequest = (timeline: string, isLoadingMore: boolean) => ({ skipLoading: !isLoadingMore, }); -const expandTimelineSuccess = (timeline: string, statuses: APIEntity[], next: string | null, partial: boolean, isLoadingRecent: boolean, isLoadingMore: boolean) => ({ +const expandTimelineSuccess = ( + timeline: string, + statuses: APIEntity[], + next: string | undefined, + prev: string | undefined, + partial: boolean, + isLoadingRecent: boolean, + isLoadingMore: boolean, +) => ({ type: TIMELINE_EXPAND_SUCCESS, timeline, statuses, next, + prev, partial, isLoadingRecent, skipLoading: !isLoadingMore, diff --git a/app/soapbox/features/feed-filtering/feed-carousel.tsx b/app/soapbox/features/feed-filtering/feed-carousel.tsx index af6cb47bb..9d62538ce 100644 --- a/app/soapbox/features/feed-filtering/feed-carousel.tsx +++ b/app/soapbox/features/feed-filtering/feed-carousel.tsx @@ -30,7 +30,7 @@ const CarouselItem = React.forwardRef(( setLoading(true); if (isSelected) { - dispatch(replaceHomeTimeline(null, { maxId: null }, () => setLoading(false))); + dispatch(replaceHomeTimeline(undefined, { maxId: null }, () => setLoading(false))); if (onPinned) { onPinned(null); diff --git a/app/soapbox/features/home-timeline/index.tsx b/app/soapbox/features/home-timeline/index.tsx index aaaec2bb3..611fcf7ce 100644 --- a/app/soapbox/features/home-timeline/index.tsx +++ b/app/soapbox/features/home-timeline/index.tsx @@ -27,9 +27,10 @@ const HomeTimeline: React.FC = () => { const isPartial = useAppSelector(state => state.timelines.get('home')?.isPartial === true); const currentAccountId = useAppSelector(state => state.timelines.get('home')?.feedAccountId as string | undefined); const currentAccountRelationship = useAppSelector(state => currentAccountId ? state.relationships.get(currentAccountId) : null); + const next = useAppSelector(state => state.timelines.get('home')?.next); const handleLoadMore = (maxId: string) => { - dispatch(expandHomeTimeline({ maxId, accountId: currentAccountId })); + dispatch(expandHomeTimeline({ url: next, maxId, accountId: currentAccountId })); }; // Mastodon generates the feed in Redis, and can return a partial timeline @@ -52,7 +53,7 @@ const HomeTimeline: React.FC = () => { }; const handleRefresh = () => { - return dispatch(expandHomeTimeline({ maxId: null, accountId: currentAccountId })); + return dispatch(expandHomeTimeline({ accountId: currentAccountId })); }; useEffect(() => { diff --git a/app/soapbox/features/test-timeline/index.tsx b/app/soapbox/features/test-timeline/index.tsx index 51ab1491e..136d0d324 100644 --- a/app/soapbox/features/test-timeline/index.tsx +++ b/app/soapbox/features/test-timeline/index.tsx @@ -35,7 +35,7 @@ const TestTimeline: React.FC = () => { React.useEffect(() => { dispatch(importFetchedStatuses(MOCK_STATUSES)); - dispatch(expandTimelineSuccess(timelineId, MOCK_STATUSES, null, false, false, false)); + dispatch(expandTimelineSuccess(timelineId, MOCK_STATUSES, undefined, undefined, false, false, false)); }, []); return ( diff --git a/app/soapbox/reducers/timelines.ts b/app/soapbox/reducers/timelines.ts index 1713ee964..b5fe0e049 100644 --- a/app/soapbox/reducers/timelines.ts +++ b/app/soapbox/reducers/timelines.ts @@ -46,6 +46,8 @@ const TimelineRecord = ImmutableRecord({ top: true, isLoading: false, hasMore: true, + next: undefined as string | undefined, + prev: undefined as string | undefined, items: ImmutableOrderedSet(), queuedItems: ImmutableOrderedSet(), //max= MAX_QUEUED_ITEMS feedAccountId: null, @@ -87,13 +89,23 @@ const setFailed = (state: State, timelineId: string, failed: boolean) => { return state.update(timelineId, TimelineRecord(), timeline => timeline.set('loadingFailed', failed)); }; -const expandNormalizedTimeline = (state: State, timelineId: string, statuses: ImmutableList>, next: string | null, isPartial: boolean, isLoadingRecent: boolean) => { +const expandNormalizedTimeline = ( + state: State, + timelineId: string, + statuses: ImmutableList>, + next: string | undefined, + prev: string | undefined, + isPartial: boolean, + isLoadingRecent: boolean, +) => { const newIds = getStatusIds(statuses); return state.update(timelineId, TimelineRecord(), timeline => timeline.withMutations(timeline => { timeline.set('isLoading', false); timeline.set('loadingFailed', false); timeline.set('isPartial', isPartial); + timeline.set('next', next); + timeline.set('prev', prev); if (!next && !isLoadingRecent) timeline.set('hasMore', false); @@ -322,7 +334,15 @@ export default function timelines(state: State = initialState, action: AnyAction case TIMELINE_EXPAND_FAIL: return handleExpandFail(state, action.timeline); case TIMELINE_EXPAND_SUCCESS: - return expandNormalizedTimeline(state, action.timeline, fromJS(action.statuses) as ImmutableList>, action.next, action.partial, action.isLoadingRecent); + return expandNormalizedTimeline( + state, + action.timeline, + fromJS(action.statuses) as ImmutableList>, + action.next, + action.prev, + action.partial, + action.isLoadingRecent, + ); case TIMELINE_UPDATE: return updateTimeline(state, action.timeline, action.statusId); case TIMELINE_UPDATE_QUEUE: From 2240952b8f09eee26e708a8ea20ba3fd079c569f Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Mon, 3 Apr 2023 09:51:22 -0400 Subject: [PATCH 034/298] Add animation to AuthorizeRejectButton comp --- .../components/authorize-reject-buttons.tsx | 83 ++++++++++++++----- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/app/soapbox/components/authorize-reject-buttons.tsx b/app/soapbox/components/authorize-reject-buttons.tsx index 9edd44189..a785c31ea 100644 --- a/app/soapbox/components/authorize-reject-buttons.tsx +++ b/app/soapbox/components/authorize-reject-buttons.tsx @@ -14,6 +14,23 @@ interface IAuthorizeRejectButtons { const AuthorizeRejectButtons: React.FC = ({ onAuthorize, onReject, countdown }) => { const [state, setState] = useState<'authorizing' | 'rejecting' | 'authorized' | 'rejected' | 'pending'>('pending'); const timeout = useRef(); + const interval = useRef>(); + + const [progress, setProgress] = useState(0); + + const startProgressInterval = () => { + let startValue = 1; + interval.current = setInterval(() => { + startValue++; + const newValue = startValue * 3.6; // get to 360 (deg) + setProgress(newValue); + + if (newValue >= 360) { + clearInterval(interval.current as NodeJS.Timeout); + setProgress(0); + } + }, (countdown as number) / 100); + }; function handleAction( present: 'authorizing' | 'rejecting', @@ -21,6 +38,9 @@ const AuthorizeRejectButtons: React.FC = ({ onAuthorize action: () => Promise | unknown, ): void { if (state === present) { + if (interval.current) { + clearInterval(interval.current); + } if (timeout.current) { clearTimeout(timeout.current); } @@ -37,6 +57,7 @@ const AuthorizeRejectButtons: React.FC = ({ onAuthorize if (typeof countdown === 'number') { setState(present); timeout.current = setTimeout(doAction, countdown); + startProgressInterval(); } else { doAction(); } @@ -46,11 +67,28 @@ const AuthorizeRejectButtons: React.FC = ({ onAuthorize const handleAuthorize = async () => handleAction('authorizing', 'authorized', onAuthorize); const handleReject = async () => handleAction('rejecting', 'rejected', onReject); + const renderStyle = (selectedState: typeof state) => { + if (state === 'authorizing' && selectedState === 'authorizing') { + return { + background: `conic-gradient(rgb(var(--color-primary-500)) ${progress}deg, rgb(var(--color-primary-500) / 0.1) 0deg)`, + }; + } else if (state === 'rejecting' && selectedState === 'rejecting') { + return { + background: `conic-gradient(rgb(var(--color-danger-600)) ${progress}deg, rgb(var(--color-danger-600) / 0.1) 0deg)`, + }; + } + + return {}; + }; + useEffect(() => { return () => { if (timeout.current) { clearTimeout(timeout.current); } + if (interval.current) { + clearInterval(interval.current); + } }; }, []); @@ -72,6 +110,7 @@ const AuthorizeRejectButtons: React.FC = ({ onAuthorize action={handleReject} isLoading={state === 'rejecting'} disabled={state === 'authorizing'} + style={renderStyle('rejecting')} /> = ({ onAuthorize action={handleAuthorize} isLoading={state === 'authorizing'} disabled={state === 'rejecting'} + style={renderStyle('authorizing')} /> ); @@ -105,33 +145,34 @@ interface IAuthorizeRejectButton { action(): void isLoading?: boolean disabled?: boolean + style: React.CSSProperties } -const AuthorizeRejectButton: React.FC = ({ theme, icon, action, isLoading, disabled }) => { +const AuthorizeRejectButton: React.FC = ({ theme, icon, action, isLoading, style, disabled }) => { return (
- - {(isLoading) && ( -
+ - )} +
); }; From 485213972e95f8fe3a909f18928953a0cc67cbee Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Mon, 3 Apr 2023 12:13:41 -0400 Subject: [PATCH 035/298] Update banned members design --- .../features/group/group-blocked-members.tsx | 18 +++++++++--------- app/soapbox/locales/en.json | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/soapbox/features/group/group-blocked-members.tsx b/app/soapbox/features/group/group-blocked-members.tsx index 8931575ef..a82f889c1 100644 --- a/app/soapbox/features/group/group-blocked-members.tsx +++ b/app/soapbox/features/group/group-blocked-members.tsx @@ -15,9 +15,9 @@ import ColumnForbidden from '../ui/components/column-forbidden'; type RouteParams = { id: string }; const messages = defineMessages({ - heading: { id: 'column.group_blocked_members', defaultMessage: 'Blocked members' }, - unblock: { id: 'group.group_mod_unblock', defaultMessage: 'Unblock' }, - unblocked: { id: 'group.group_mod_unblock.success', defaultMessage: 'Unblocked @{name} from group' }, + heading: { id: 'column.group_blocked_members', defaultMessage: 'Banned Members' }, + unblock: { id: 'group.group_mod_unblock', defaultMessage: 'Unban' }, + unblocked: { id: 'group.group_mod_unblock.success', defaultMessage: 'Unbanned @{name} from group' }, }); interface IBlockedMember { @@ -36,18 +36,17 @@ const BlockedMember: React.FC = ({ accountId, groupId }) => { if (!account) return null; const handleUnblock = () => - dispatch(groupUnblock(groupId, accountId)).then(() => { - toast.success(intl.formatMessage(messages.unblocked, { name: account.acct })); - }); + dispatch(groupUnblock(groupId, accountId)) + .then(() => toast.success(intl.formatMessage(messages.unblocked, { name: account.acct }))); return (
+ + + +
+); + +export { LayoutButtons as default, GroupLayout }; \ No newline at end of file diff --git a/app/soapbox/features/groups/components/discover/search/results.tsx b/app/soapbox/features/groups/components/discover/search/results.tsx index 14e1e5a67..9df350375 100644 --- a/app/soapbox/features/groups/components/discover/search/results.tsx +++ b/app/soapbox/features/groups/components/discover/search/results.tsx @@ -3,22 +3,19 @@ import React, { useCallback, useState } from 'react'; import { FormattedMessage } from 'react-intl'; import { Components, Virtuoso, VirtuosoGrid } from 'react-virtuoso'; -import { HStack, Icon, Stack, Text } from 'soapbox/components/ui'; +import { HStack, Stack, Text } from 'soapbox/components/ui'; import { useGroupSearch } from 'soapbox/hooks/api'; -import { Group } from 'soapbox/types/entities'; import GroupGridItem from '../group-grid-item'; import GroupListItem from '../group-list-item'; +import LayoutButtons, { GroupLayout } from '../layout-buttons'; + +import type { Group } from 'soapbox/types/entities'; interface Props { groupSearchResult: ReturnType } -enum Layout { - LIST = 'LIST', - GRID = 'GRID' -} - const GridList: Components['List'] = React.forwardRef((props, ref) => { const { context, ...rest } = props; return
; @@ -27,7 +24,7 @@ const GridList: Components['List'] = React.forwardRef((props, ref) => { export default (props: Props) => { const { groupSearchResult } = props; - const [layout, setLayout] = useState(Layout.LIST); + const [layout, setLayout] = useState(GroupLayout.LIST); const { groups, hasNextPage, isFetching, fetchNextPage } = groupSearchResult; @@ -65,32 +62,13 @@ export default (props: Props) => { /> - - - - - + setLayout(selectedLayout)} + /> - {layout === Layout.LIST ? ( + {layout === GroupLayout.LIST ? ( { const { context, ...rest } = props; return
; }); - const Popular: React.FC = () => { const intl = useIntl(); - const [layout, setLayout] = useState(Layout.LIST); + const [layout, setLayout] = useState(GroupLayout.LIST); const { groups, hasNextPage, fetchNextPage } = usePopularGroups(); @@ -61,32 +56,13 @@ const Popular: React.FC = () => { - - - - + setLayout(selectedLayout)} + /> } > - {layout === Layout.LIST ? ( + {layout === GroupLayout.LIST ? ( { const { context, ...rest } = props; return
; }); - const Suggested: React.FC = () => { const intl = useIntl(); - const [layout, setLayout] = useState(Layout.LIST); + const [layout, setLayout] = useState(GroupLayout.LIST); const { groups, hasNextPage, fetchNextPage } = useSuggestedGroups(); @@ -61,32 +56,13 @@ const Suggested: React.FC = () => { - - - - + setLayout(selectedLayout)} + /> } > - {layout === Layout.LIST ? ( + {layout === GroupLayout.LIST ? ( Date: Mon, 3 Apr 2023 12:03:59 -0500 Subject: [PATCH 038/298] Remove deprecated Tailwind line-clamp plugin (now bundled with v3.3) --- package.json | 1 - tailwind.config.cjs | 1 - yarn.lock | 5 ----- 3 files changed, 7 deletions(-) diff --git a/package.json b/package.json index 50d1409c3..47af605e4 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,6 @@ "@sentry/tracing": "^7.37.2", "@tabler/icons": "^2.0.0", "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/line-clamp": "^0.4.4", "@tailwindcss/typography": "^0.5.9", "@tanstack/react-query": "^4.0.10", "@testing-library/react": "^14.0.0", diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 10270a77f..a59998396 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -98,7 +98,6 @@ module.exports = { }, plugins: [ require('@tailwindcss/forms'), - require('@tailwindcss/line-clamp'), require('@tailwindcss/typography'), require('@tailwindcss/aspect-ratio'), ], diff --git a/yarn.lock b/yarn.lock index 646742846..e2baefa40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3853,11 +3853,6 @@ dependencies: mini-svg-data-uri "^1.2.3" -"@tailwindcss/line-clamp@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz#767cf8e5d528a5d90c9740ca66eb079f5e87d423" - integrity sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g== - "@tailwindcss/typography@^0.5.9": version "0.5.9" resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.9.tgz#027e4b0674929daaf7c921c900beee80dbad93e8" From 1b9c070a201909532b36d5447d5cfe5b2c03dfdf Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 3 Apr 2023 14:26:31 -0500 Subject: [PATCH 039/298] EditGroup: move AvatarPicker and HeaderPicker into their own components --- .../group/components/group-avatar-picker.tsx | 45 +++++++++++ .../group/components/group-header-picker.tsx | 52 ++++++++++++ app/soapbox/features/group/edit-group.tsx | 81 +------------------ 3 files changed, 101 insertions(+), 77 deletions(-) create mode 100644 app/soapbox/features/group/components/group-avatar-picker.tsx create mode 100644 app/soapbox/features/group/components/group-header-picker.tsx diff --git a/app/soapbox/features/group/components/group-avatar-picker.tsx b/app/soapbox/features/group/components/group-avatar-picker.tsx new file mode 100644 index 000000000..4e2851e33 --- /dev/null +++ b/app/soapbox/features/group/components/group-avatar-picker.tsx @@ -0,0 +1,45 @@ +import clsx from 'clsx'; +import React from 'react'; + +import Icon from 'soapbox/components/icon'; +import { Avatar, HStack } from 'soapbox/components/ui'; + +interface IMediaInput { + src: string | undefined + accept: string + onChange: React.ChangeEventHandler + disabled: boolean +} + +const AvatarPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { + return ( + + ); +}); + +export default AvatarPicker; \ No newline at end of file diff --git a/app/soapbox/features/group/components/group-header-picker.tsx b/app/soapbox/features/group/components/group-header-picker.tsx new file mode 100644 index 000000000..7fcdae688 --- /dev/null +++ b/app/soapbox/features/group/components/group-header-picker.tsx @@ -0,0 +1,52 @@ +import clsx from 'clsx'; +import React from 'react'; +import { FormattedMessage } from 'react-intl'; + +import Icon from 'soapbox/components/icon'; +import { HStack, Text } from 'soapbox/components/ui'; + +interface IMediaInput { + src: string | undefined + accept: string + onChange: React.ChangeEventHandler + disabled: boolean +} + +const HeaderPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { + return ( + + ); +}); + +export default HeaderPicker; \ No newline at end of file diff --git a/app/soapbox/features/group/edit-group.tsx b/app/soapbox/features/group/edit-group.tsx index d385fb580..23ff9ed98 100644 --- a/app/soapbox/features/group/edit-group.tsx +++ b/app/soapbox/features/group/edit-group.tsx @@ -1,100 +1,27 @@ -import clsx from 'clsx'; import React, { useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import Icon from 'soapbox/components/icon'; -import { Avatar, Button, Column, Form, FormActions, FormGroup, HStack, Input, Spinner, Text, Textarea } from 'soapbox/components/ui'; +import { Button, Column, Form, FormActions, FormGroup, Input, Spinner, Textarea } from 'soapbox/components/ui'; import { useAppSelector, useInstance } from 'soapbox/hooks'; import { useGroup, useUpdateGroup } from 'soapbox/hooks/api'; import { useImageField, useTextField } from 'soapbox/hooks/forms'; import { isDefaultAvatar, isDefaultHeader } from 'soapbox/utils/accounts'; +import AvatarPicker from './components/group-avatar-picker'; +import HeaderPicker from './components/group-header-picker'; + import type { List as ImmutableList } from 'immutable'; const nonDefaultAvatar = (url: string | undefined) => url && isDefaultAvatar(url) ? undefined : url; const nonDefaultHeader = (url: string | undefined) => url && isDefaultHeader(url) ? undefined : url; -interface IMediaInput { - src: string | undefined - accept: string - onChange: React.ChangeEventHandler - disabled: boolean -} - const messages = defineMessages({ heading: { id: 'navigation_bar.edit_group', defaultMessage: 'Edit Group' }, groupNamePlaceholder: { id: 'manage_group.fields.name_placeholder', defaultMessage: 'Group Name' }, groupDescriptionPlaceholder: { id: 'manage_group.fields.description_placeholder', defaultMessage: 'Description' }, }); -const HeaderPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { - return ( - - ); -}); - -const AvatarPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { - return ( - - ); -}); - interface IEditGroup { params: { id: string From c2f5671de188dad46115c27913ac0e2044e79fd9 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Mon, 3 Apr 2023 15:38:41 -0400 Subject: [PATCH 040/298] Update copy after requesting to join group --- app/soapbox/actions/groups.ts | 2 +- app/soapbox/features/group/components/group-action-button.tsx | 2 +- app/soapbox/locales/en.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/soapbox/actions/groups.ts b/app/soapbox/actions/groups.ts index 8a6ad065e..2ae1792cb 100644 --- a/app/soapbox/actions/groups.ts +++ b/app/soapbox/actions/groups.ts @@ -108,7 +108,7 @@ const messages = defineMessages({ success: { id: 'manage_group.submit_success', defaultMessage: 'The group was created' }, editSuccess: { id: 'manage_group.edit_success', defaultMessage: 'The group was edited' }, joinSuccess: { id: 'group.join.success', defaultMessage: 'Joined the group' }, - joinRequestSuccess: { id: 'group.join.request_success', defaultMessage: 'Requested to join the group' }, + joinRequestSuccess: { id: 'group.join.request_success', defaultMessage: 'Request sent to group owner' }, leaveSuccess: { id: 'group.leave.success', defaultMessage: 'Left the group' }, view: { id: 'toast.view', defaultMessage: 'View' }, }); diff --git a/app/soapbox/features/group/components/group-action-button.tsx b/app/soapbox/features/group/components/group-action-button.tsx index c697bc4ee..3874d4ae9 100644 --- a/app/soapbox/features/group/components/group-action-button.tsx +++ b/app/soapbox/features/group/components/group-action-button.tsx @@ -20,7 +20,7 @@ const messages = defineMessages({ confirmationConfirm: { id: 'confirmations.leave_group.confirm', defaultMessage: 'Leave' }, confirmationHeading: { id: 'confirmations.leave_group.heading', defaultMessage: 'Leave group' }, confirmationMessage: { id: 'confirmations.leave_group.message', defaultMessage: 'You are about to leave the group. Do you want to continue?' }, - joinRequestSuccess: { id: 'group.join.request_success', defaultMessage: 'Requested to join the group' }, + joinRequestSuccess: { id: 'group.join.request_success', defaultMessage: 'Request sent to group owner' }, joinSuccess: { id: 'group.join.success', defaultMessage: 'Group joined successfully!' }, leaveSuccess: { id: 'group.leave.success', defaultMessage: 'Left the group' }, }); diff --git a/app/soapbox/locales/en.json b/app/soapbox/locales/en.json index c819a1f22..82a658dee 100644 --- a/app/soapbox/locales/en.json +++ b/app/soapbox/locales/en.json @@ -783,7 +783,7 @@ "group.header.alt": "Group header", "group.join.private": "Request Access", "group.join.public": "Join Group", - "group.join.request_success": "Requested to join the group", + "group.join.request_success": "Request sent to group owner", "group.join.success": "Group joined successfully!", "group.leave": "Leave Group", "group.leave.success": "Left the group", From aed41989f53543ce5079f02a1040f426045bd673 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Mon, 3 Apr 2023 15:57:12 -0400 Subject: [PATCH 041/298] Remove 'Pending requests' from Group Manage --- app/soapbox/features/group/manage-group.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/soapbox/features/group/manage-group.tsx b/app/soapbox/features/group/manage-group.tsx index 012f762f5..723bbb5ad 100644 --- a/app/soapbox/features/group/manage-group.tsx +++ b/app/soapbox/features/group/manage-group.tsx @@ -7,8 +7,10 @@ import List, { ListItem } from 'soapbox/components/list'; import { CardBody, CardHeader, CardTitle, Column, Spinner, Text } from 'soapbox/components/ui'; import { useAppDispatch, useGroupsPath } from 'soapbox/hooks'; import { useDeleteGroup, useGroup } from 'soapbox/hooks/api'; +import { useBackend } from 'soapbox/hooks/useBackend'; import { GroupRoles } from 'soapbox/schemas/group-member'; import toast from 'soapbox/toast'; +import { TRUTHSOCIAL } from 'soapbox/utils/features'; import ColumnForbidden from '../ui/components/column-forbidden'; @@ -34,10 +36,12 @@ interface IManageGroup { const ManageGroup: React.FC = ({ params }) => { const { id } = params; - const intl = useIntl(); - const history = useHistory(); + + const backend = useBackend(); const dispatch = useAppDispatch(); const groupsPath = useGroupsPath(); + const history = useHistory(); + const intl = useIntl(); const { group } = useGroup(id); @@ -99,7 +103,10 @@ const ManageGroup: React.FC = ({ params }) => { - + {backend.software !== TRUTHSOCIAL && ( + + )} + From 659c1863946a396d533d3e16d2aa931f93f17fe4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 3 Apr 2023 15:06:20 -0500 Subject: [PATCH 042/298] ManageGroupModal: use internal state instead of Redux --- app/soapbox/actions/groups.ts | 25 --- .../entity-store/hooks/useCreateEntity.ts | 4 +- .../entity-store/hooks/useEntityActions.ts | 2 +- .../group/components/group-avatar-picker.tsx | 2 +- .../group/components/group-header-picker.tsx | 2 +- .../manage-group-modal/manage-group-modal.tsx | 59 +++--- .../manage-group-modal/steps/details-step.tsx | 175 +++++------------- .../manage-group-modal/steps/privacy-step.tsx | 24 +-- .../hooks/api/groups/useCreateGroup.ts | 33 ++++ app/soapbox/hooks/api/index.ts | 1 + app/soapbox/reducers/index.ts | 2 - 11 files changed, 120 insertions(+), 209 deletions(-) create mode 100644 app/soapbox/hooks/api/groups/useCreateGroup.ts diff --git a/app/soapbox/actions/groups.ts b/app/soapbox/actions/groups.ts index 8a6ad065e..1808286e5 100644 --- a/app/soapbox/actions/groups.ts +++ b/app/soapbox/actions/groups.ts @@ -783,30 +783,6 @@ const resetGroupEditor = () => ({ type: GROUP_EDITOR_RESET, }); -const submitGroupEditor = (shouldReset?: boolean) => (dispatch: AppDispatch, getState: () => RootState) => { - const groupId = getState().group_editor.groupId; - const displayName = getState().group_editor.displayName; - const note = getState().group_editor.note; - const avatar = getState().group_editor.avatar; - const header = getState().group_editor.header; - const visibility = getState().group_editor.locked ? 'members_only' : 'everyone'; // Truth Social - - const params: Record = { - display_name: displayName, - group_visibility: visibility, - note, - }; - - if (avatar) params.avatar = avatar; - if (header) params.header = header; - - if (groupId === null) { - return dispatch(createGroup(params, shouldReset)); - } else { - return dispatch(updateGroup(groupId, params, shouldReset)); - } -}; - export { GROUP_EDITOR_SET, GROUP_CREATE_REQUEST, @@ -960,5 +936,4 @@ export { changeGroupEditorPrivacy, changeGroupEditorMedia, resetGroupEditor, - submitGroupEditor, }; diff --git a/app/soapbox/entity-store/hooks/useCreateEntity.ts b/app/soapbox/entity-store/hooks/useCreateEntity.ts index ba9dd802b..31299344e 100644 --- a/app/soapbox/entity-store/hooks/useCreateEntity.ts +++ b/app/soapbox/entity-store/hooks/useCreateEntity.ts @@ -20,7 +20,7 @@ function useCreateEntity( ) { const dispatch = useAppDispatch(); - const [isLoading, setPromise] = useLoading(); + const [isSubmitting, setPromise] = useLoading(); const { entityType, listKey } = parseEntitiesPath(expandedPath); async function createEntity(data: Data, callbacks: EntityCallbacks = {}): Promise { @@ -44,7 +44,7 @@ function useCreateEntity( return { createEntity, - isLoading, + isSubmitting, }; } diff --git a/app/soapbox/entity-store/hooks/useEntityActions.ts b/app/soapbox/entity-store/hooks/useEntityActions.ts index dab6f7f77..13fda06ac 100644 --- a/app/soapbox/entity-store/hooks/useEntityActions.ts +++ b/app/soapbox/entity-store/hooks/useEntityActions.ts @@ -27,7 +27,7 @@ function useEntityActions( const { deleteEntity, isLoading: deleteLoading } = useDeleteEntity(entityType, (entityId) => api.delete(endpoints.delete!.replaceAll(':id', entityId))); - const { createEntity, isLoading: createLoading } = + const { createEntity, isSubmitting: createLoading } = useCreateEntity(path, (data) => api.post(endpoints.post!, data), opts); return { diff --git a/app/soapbox/features/group/components/group-avatar-picker.tsx b/app/soapbox/features/group/components/group-avatar-picker.tsx index 4e2851e33..b13dfe80e 100644 --- a/app/soapbox/features/group/components/group-avatar-picker.tsx +++ b/app/soapbox/features/group/components/group-avatar-picker.tsx @@ -8,7 +8,7 @@ interface IMediaInput { src: string | undefined accept: string onChange: React.ChangeEventHandler - disabled: boolean + disabled?: boolean } const AvatarPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { diff --git a/app/soapbox/features/group/components/group-header-picker.tsx b/app/soapbox/features/group/components/group-header-picker.tsx index 7fcdae688..d2457ac1e 100644 --- a/app/soapbox/features/group/components/group-header-picker.tsx +++ b/app/soapbox/features/group/components/group-header-picker.tsx @@ -9,7 +9,7 @@ interface IMediaInput { src: string | undefined accept: string onChange: React.ChangeEventHandler - disabled: boolean + disabled?: boolean } const HeaderPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { diff --git a/app/soapbox/features/ui/components/modals/manage-group-modal/manage-group-modal.tsx b/app/soapbox/features/ui/components/modals/manage-group-modal/manage-group-modal.tsx index fcc7c14da..3486c8e6e 100644 --- a/app/soapbox/features/ui/components/modals/manage-group-modal/manage-group-modal.tsx +++ b/app/soapbox/features/ui/components/modals/manage-group-modal/manage-group-modal.tsx @@ -1,10 +1,10 @@ import React, { useMemo, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { submitGroupEditor } from 'soapbox/actions/groups'; import { Modal, Stack } from 'soapbox/components/ui'; -import { useAppDispatch, useAppSelector, useDebounce } from 'soapbox/hooks'; -import { useGroupValidation } from 'soapbox/hooks/api'; +import { useDebounce } from 'soapbox/hooks'; +import { useCreateGroup, useGroupValidation, type CreateGroupParams } from 'soapbox/hooks/api'; +import { type Group } from 'soapbox/schemas'; import ConfirmationStep from './steps/confirmation-step'; import DetailsStep from './steps/details-step'; @@ -13,7 +13,6 @@ import PrivacyStep from './steps/privacy-step'; const messages = defineMessages({ next: { id: 'manage_group.next', defaultMessage: 'Next' }, create: { id: 'manage_group.create', defaultMessage: 'Create' }, - update: { id: 'manage_group.update', defaultMessage: 'Update' }, done: { id: 'manage_group.done', defaultMessage: 'Done' }, }); @@ -23,12 +22,6 @@ enum Steps { THREE = 'THREE', } -const manageGroupSteps = { - ONE: PrivacyStep, - TWO: DetailsStep, - THREE: ConfirmationStep, -}; - interface IManageGroupModal { onClose: (type?: string) => void } @@ -36,34 +29,26 @@ interface IManageGroupModal { const ManageGroupModal: React.FC = ({ onClose }) => { const intl = useIntl(); const debounce = useDebounce; - const dispatch = useAppDispatch(); - const id = useAppSelector((state) => state.group_editor.groupId); - const [group, setGroup] = useState(null); + const [group, setGroup] = useState(null); + const [params, setParams] = useState({}); + const [currentStep, setCurrentStep] = useState(Steps.ONE); - const isSubmitting = useAppSelector((state) => state.group_editor.isSubmitting); - - const [currentStep, setCurrentStep] = useState(id ? Steps.TWO : Steps.ONE); - - const name = useAppSelector((state) => state.group_editor.displayName); - const debouncedName = debounce(name, 300); + const { createGroup, isSubmitting } = useCreateGroup(); + const debouncedName = debounce(params.display_name || '', 300); const { data: { isValid } } = useGroupValidation(debouncedName); const handleClose = () => { onClose('MANAGE_GROUP'); }; - const handleSubmit = () => { - return dispatch(submitGroupEditor(true)); - }; - const confirmationText = useMemo(() => { switch (currentStep) { case Steps.THREE: return intl.formatMessage(messages.done); case Steps.TWO: - return intl.formatMessage(id ? messages.update : messages.create); + return intl.formatMessage(messages.create); default: return intl.formatMessage(messages.next); } @@ -75,12 +60,12 @@ const ManageGroupModal: React.FC = ({ onClose }) => { setCurrentStep(Steps.TWO); break; case Steps.TWO: - handleSubmit() - .then((group) => { + createGroup(params, { + onSuccess(group) { setCurrentStep(Steps.THREE); setGroup(group); - }) - .catch(() => {}); + }, + }); break; case Steps.THREE: handleClose(); @@ -90,13 +75,20 @@ const ManageGroupModal: React.FC = ({ onClose }) => { } }; - const StepToRender = manageGroupSteps[currentStep]; + const renderStep = () => { + switch (currentStep) { + case Steps.ONE: + return ; + case Steps.TWO: + return ; + case Steps.THREE: + return ; + } + }; return ( - : } + title={} confirmationAction={handleNextStep} confirmationText={confirmationText} confirmationDisabled={isSubmitting || (currentStep === Steps.TWO && !isValid)} @@ -104,8 +96,7 @@ const ManageGroupModal: React.FC = ({ onClose }) => { onClose={handleClose} > - {/* @ts-ignore */} - + {renderStep()} ); diff --git a/app/soapbox/features/ui/components/modals/manage-group-modal/steps/details-step.tsx b/app/soapbox/features/ui/components/modals/manage-group-modal/steps/details-step.tsx index 59b59b2ec..66b7b4b1d 100644 --- a/app/soapbox/features/ui/components/modals/manage-group-modal/steps/details-step.tsx +++ b/app/soapbox/features/ui/components/modals/manage-group-modal/steps/details-step.tsx @@ -1,162 +1,73 @@ -import clsx from 'clsx'; -import React, { useEffect, useState } from 'react'; +import React from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { - changeGroupEditorTitle, - changeGroupEditorDescription, - changeGroupEditorMedia, -} from 'soapbox/actions/groups'; -import { Avatar, Form, FormGroup, HStack, Icon, Input, Text, Textarea } from 'soapbox/components/ui'; -import { useAppDispatch, useAppSelector, useDebounce, useInstance } from 'soapbox/hooks'; -import { useGroupValidation } from 'soapbox/hooks/api'; -import { isDefaultAvatar, isDefaultHeader } from 'soapbox/utils/accounts'; +import { Form, FormGroup, Input, Textarea } from 'soapbox/components/ui'; +import AvatarPicker from 'soapbox/features/group/components/group-avatar-picker'; +import HeaderPicker from 'soapbox/features/group/components/group-header-picker'; +import { useAppSelector, useDebounce, useInstance } from 'soapbox/hooks'; +import { CreateGroupParams, useGroupValidation } from 'soapbox/hooks/api'; +import { usePreview } from 'soapbox/hooks/forms'; import resizeImage from 'soapbox/utils/resize-image'; import type { List as ImmutableList } from 'immutable'; -interface IMediaInput { - src: string | null - accept: string - onChange: React.ChangeEventHandler - disabled: boolean -} - const messages = defineMessages({ groupNamePlaceholder: { id: 'manage_group.fields.name_placeholder', defaultMessage: 'Group Name' }, groupDescriptionPlaceholder: { id: 'manage_group.fields.description_placeholder', defaultMessage: 'Description' }, }); -const HeaderPicker: React.FC = ({ src, onChange, accept, disabled }) => { - return ( - - ); -}; - -const AvatarPicker: React.FC = ({ src, onChange, accept, disabled }) => { - return ( - - ); -}; - -const DetailsStep = () => { +const DetailsStep: React.FC = ({ params, onChange }) => { const intl = useIntl(); const debounce = useDebounce; - const dispatch = useAppDispatch(); const instance = useInstance(); - const groupId = useAppSelector((state) => state.group_editor.groupId); - const isUploading = useAppSelector((state) => state.group_editor.isUploading); - const name = useAppSelector((state) => state.group_editor.displayName); - const description = useAppSelector((state) => state.group_editor.note); - - const debouncedName = debounce(name, 300); + const { + display_name: displayName = '', + note = '', + } = params; + const debouncedName = debounce(displayName, 300); const { data: { isValid, message: errorMessage } } = useGroupValidation(debouncedName); - const [avatarSrc, setAvatarSrc] = useState(null); - const [headerSrc, setHeaderSrc] = useState(null); + const avatarSrc = usePreview(params.avatar); + const headerSrc = usePreview(params.header); const attachmentTypes = useAppSelector( state => state.instance.configuration.getIn(['media_attachments', 'supported_mime_types']) as ImmutableList, )?.filter(type => type.startsWith('image/')).toArray().join(','); - const onChangeName: React.ChangeEventHandler = ({ target }) => { - dispatch(changeGroupEditorTitle(target.value)); + const handleTextChange = (property: keyof CreateGroupParams): React.ChangeEventHandler => { + return (e) => { + onChange({ + ...params, + [property]: e.target.value, + }); + }; }; - const onChangeDescription: React.ChangeEventHandler = ({ target }) => { - dispatch(changeGroupEditorDescription(target.value)); + const handleImageChange = (property: keyof CreateGroupParams, maxPixels?: number): React.ChangeEventHandler => { + return async ({ target: { files } }) => { + const file = files ? files[0] : undefined; + if (file) { + const resized = await resizeImage(file, maxPixels); + onChange({ + ...params, + [property]: resized, + }); + } + }; }; - const handleFileChange: React.ChangeEventHandler = e => { - const rawFile = e.target.files?.item(0); - - if (!rawFile) return; - - if (e.target.name === 'avatar') { - resizeImage(rawFile, 400 * 400).then(file => { - dispatch(changeGroupEditorMedia('avatar', file)); - setAvatarSrc(URL.createObjectURL(file)); - }).catch(console.error); - } else { - resizeImage(rawFile, 1920 * 1080).then(file => { - dispatch(changeGroupEditorMedia('header', file)); - setHeaderSrc(URL.createObjectURL(file)); - }).catch(console.error); - } - }; - - useEffect(() => { - if (!groupId) return; - - dispatch((_, getState) => { - const group = getState().groups.items.get(groupId); - if (!group) return; - if (group.avatar && !isDefaultAvatar(group.avatar)) setAvatarSrc(group.avatar); - if (group.header && !isDefaultHeader(group.header)) setHeaderSrc(group.header); - }); - }, [groupId]); - return (
- - + +
{ @@ -179,8 +90,8 @@ const DetailsStep = () => {