From 738194d1082c17d41270413e5663f205a779e0f2 Mon Sep 17 00:00:00 2001 From: xmflsct Date: Fri, 27 Jan 2023 18:44:48 +0100 Subject: [PATCH 1/3] Consolidate swipe to delete views --- src/components/Filter.tsx | 15 +- src/components/Hr.tsx | 2 +- src/components/SwipeToActions.tsx | 57 +++++ src/screens/Compose/DraftsList.tsx | 232 +++++++++----------- src/screens/Compose/index.tsx | 4 +- src/screens/Tabs/Me/Preferences/Filters.tsx | 42 ++-- src/screens/Tabs/Me/Preferences/index.tsx | 12 +- 7 files changed, 189 insertions(+), 175 deletions(-) create mode 100644 src/components/SwipeToActions.tsx diff --git a/src/components/Filter.tsx b/src/components/Filter.tsx index 6ed73a2f..f9c57fef 100644 --- a/src/components/Filter.tsx +++ b/src/components/Filter.tsx @@ -2,7 +2,7 @@ import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { Fragment } from 'react' import { Trans, useTranslation } from 'react-i18next' -import { View } from 'react-native' +import { View, ViewStyle } from 'react-native' import { TouchableNativeFeedback } from 'react-native-gesture-handler' import Icon from './Icon' import CustomText from './Text' @@ -11,9 +11,10 @@ export type Props = { onPress: () => void filter: Mastodon.Filter<'v2'> button?: React.ReactNode + style?: ViewStyle } -export const Filter: React.FC = ({ onPress, filter, button }) => { +export const Filter: React.FC = ({ onPress, filter, button, style }) => { const { t } = useTranslation(['common', 'screenTabs']) const { colors } = useTheme() @@ -24,7 +25,8 @@ export const Filter: React.FC = ({ onPress, filter, button }) => { paddingVertical: StyleConstants.Spacing.S, flexDirection: 'row', alignItems: 'center', - backgroundColor: colors.backgroundDefault + backgroundColor: colors.backgroundDefault, + ...style }} > @@ -83,12 +85,7 @@ export const Filter: React.FC = ({ onPress, filter, button }) => { {filter.context.map((c, index) => ( diff --git a/src/components/Hr.tsx b/src/components/Hr.tsx index 1af52002..d7c87938 100644 --- a/src/components/Hr.tsx +++ b/src/components/Hr.tsx @@ -12,7 +12,7 @@ const Hr: React.FC<{ style?: ViewStyle }> = ({ style }) => { borderTopColor: colors.border, borderTopWidth: 1, height: 1, - marginVertical: StyleConstants.Spacing.S + paddingVertical: StyleConstants.Spacing.S }, style ]} diff --git a/src/components/SwipeToActions.tsx b/src/components/SwipeToActions.tsx new file mode 100644 index 00000000..1b391de3 --- /dev/null +++ b/src/components/SwipeToActions.tsx @@ -0,0 +1,57 @@ +import { StyleConstants } from '@utils/styles/constants' +import { ColorValue, TouchableNativeFeedback, View } from 'react-native' +import { SwipeListView } from 'react-native-swipe-list-view' +import haptics from './haptics' +import Icon, { IconName } from './Icon' +import ComponentSeparator from './Separator' + +export type Props = { + actions: { + onPress: (item: any) => void + color: ColorValue + icon: IconName + haptic?: Parameters['0'] + }[] +} + +export const SwipeToActions = ({ + actions, + ...rest +}: Props & SwipeListView['props']) => { + const perActionWidth = StyleConstants.Spacing.L * 2 + StyleConstants.Font.Size.L + + return ( + ( + + {actions.map((action, index) => ( + { + haptics(action.haptic || 'Light') + action.onPress({ item }) + }} + > + + + + + ))} + + )} + rightOpenValue={-perActionWidth * actions.length} + disableRightSwipe + closeOnRowPress + ItemSeparatorComponent={ComponentSeparator} + {...rest} + /> + ) +} diff --git a/src/screens/Compose/DraftsList.tsx b/src/screens/Compose/DraftsList.tsx index 0687d8d6..f00144e1 100644 --- a/src/screens/Compose/DraftsList.tsx +++ b/src/screens/Compose/DraftsList.tsx @@ -1,6 +1,6 @@ import { HeaderLeft } from '@components/Header' import Icon from '@components/Icon' -import ComponentSeparator from '@components/Separator' +import { SwipeToActions } from '@components/SwipeToActions' import CustomText from '@components/Text' import HeaderSharedCreated from '@components/Timeline/Shared/HeaderShared/Created' import apiInstance from '@utils/api/instance' @@ -10,10 +10,8 @@ import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useContext, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Dimensions, Modal, Platform, Pressable, View } from 'react-native' +import { Dimensions, Modal, Pressable, View } from 'react-native' import FastImage from 'react-native-fast-image' -import { PanGestureHandler } from 'react-native-gesture-handler' -import { SwipeListView } from 'react-native-swipe-list-view' import ComposeContext from './utils/createContext' import { formatText } from './utils/processText' import { ComposeStateDraft, ExtendedAttachment } from './utils/types' @@ -39,9 +37,7 @@ const ComposeDraftsList: React.FC { navigation.setOptions({ title: t('content.draftsList.header.title'), - headerLeft: () => ( - navigation.goBack()} /> - ) + headerLeft: () => navigation.goBack()} /> }) }, []) @@ -49,8 +45,6 @@ const ComposeDraftsList: React.FC - - draft.timestamp !== timestamp)} - renderItem={({ item }: { item: ComposeStateDraft }) => { - return ( - { - setCheckingAttachments(true) - let tempDraft = item - let tempUploads: ExtendedAttachment[] = [] - if (item.attachments && item.attachments.uploads.length) { - for (const attachment of item.attachments.uploads) { - await apiInstance({ - method: 'get', - url: `media/${attachment.remote?.id}` - }) - .then(res => { - if (res.body.id === attachment.remote?.id) { - tempUploads.push(attachment) - } - }) - .catch(() => {}) - } - tempDraft = { - ...tempDraft, - attachments: { ...item.attachments, uploads: tempUploads } - } - } - - tempDraft.spoiler?.length && - formatText({ textInput: 'text', composeDispatch, content: tempDraft.spoiler }) - tempDraft.text?.length && - formatText({ textInput: 'text', composeDispatch, content: tempDraft.text }) - composeDispatch({ - type: 'loadDraft', - payload: tempDraft - }) - removeDraft(item.timestamp) - navigation.goBack() - }} - > - - - - {item.text || item.spoiler || t('content.draftsList.content.textEmpty')} - - {item.attachments?.uploads.length ? ( - - {item.attachments.uploads.map((attachment, index) => ( - - ))} - - ) : null} - - - ) - }} - renderHiddenItem={({ item }) => ( + removeDraft(item.timestamp), color: colors.red, icon: 'trash' } + ]} + data={drafts.filter(draft => draft.timestamp !== timestamp)} + renderItem={({ item }: { item: ComposeStateDraft }) => { + return ( removeDraft(item.timestamp)} - children={ - + onPress={async () => { + setCheckingAttachments(true) + let tempDraft = item + let tempUploads: ExtendedAttachment[] = [] + if (item.attachments && item.attachments.uploads.length) { + for (const attachment of item.attachments.uploads) { + await apiInstance({ + method: 'get', + url: `media/${attachment.remote?.id}` + }) + .then(res => { + if (res.body.id === attachment.remote?.id) { + tempUploads.push(attachment) + } + }) + .catch(() => {}) } - /> - } - /> - )} - disableRightSwipe={true} - rightOpenValue={-actionWidth} - previewOpenValue={-actionWidth / 2} - ItemSeparatorComponent={ComponentSeparator} - keyExtractor={item => item.timestamp?.toString()} - /> - + tempDraft = { + ...tempDraft, + attachments: { ...item.attachments, uploads: tempUploads } + } + } + + tempDraft.spoiler?.length && + formatText({ textInput: 'text', composeDispatch, content: tempDraft.spoiler }) + tempDraft.text?.length && + formatText({ textInput: 'text', composeDispatch, content: tempDraft.text }) + composeDispatch({ + type: 'loadDraft', + payload: tempDraft + }) + removeDraft(item.timestamp) + navigation.goBack() + }} + > + + + + {item.text || item.spoiler || t('content.draftsList.content.textEmpty')} + + {item.attachments?.uploads.length ? ( + + {item.attachments.uploads.map((attachment, index) => ( + + ))} + + ) : null} + + + ) + }} + keyExtractor={item => item.timestamp?.toString()} + /> > = ({ diff --git a/src/screens/Tabs/Me/Preferences/Filters.tsx b/src/screens/Tabs/Me/Preferences/Filters.tsx index 8eff2ab0..4af1099e 100644 --- a/src/screens/Tabs/Me/Preferences/Filters.tsx +++ b/src/screens/Tabs/Me/Preferences/Filters.tsx @@ -1,22 +1,17 @@ import { Filter } from '@components/Filter' import { HeaderLeft, HeaderRight } from '@components/Header' -import Icon from '@components/Icon' -import ComponentSeparator from '@components/Separator' +import { SwipeToActions } from '@components/SwipeToActions' import apiInstance from '@utils/api/instance' import { TabMePreferencesStackScreenProps } from '@utils/navigation/navigators' import { useFiltersQuery } from '@utils/queryHooks/filters' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useEffect } from 'react' -import { useTranslation } from 'react-i18next' -import { Pressable, View } from 'react-native' -import { SwipeListView } from 'react-native-swipe-list-view' const TabMePreferencesFilters: React.FC< TabMePreferencesStackScreenProps<'Tab-Me-Preferences-Filters'> > = ({ navigation }) => { const { colors } = useTheme() - const { t } = useTranslation(['common', 'screenTabs']) useEffect(() => { navigation.setOptions({ @@ -38,40 +33,31 @@ const TabMePreferencesFilters: React.FC< const { data, refetch } = useFiltersQuery<'v2'>({ version: 'v2' }) return ( - ( - { + { apiInstance({ method: 'delete', version: 'v2', url: `filters/${item.id}` }).then(() => refetch() ) - }} - > - - - - - )} - rightOpenValue={-(StyleConstants.Spacing.L * 2 + StyleConstants.Font.Size.L)} - disableRightSwipe - closeOnRowPress + }, + color: colors.red, + icon: 'trash' + } + ]} data={data?.sort(filter => filter.expires_at ? new Date().getTime() - new Date(filter.expires_at).getTime() : 1 )} renderItem={({ item: filter }) => ( navigation.navigate('Tab-Me-Preferences-Filter', { type: 'edit', filter })} /> )} - ItemSeparatorComponent={ComponentSeparator} /> ) } diff --git a/src/screens/Tabs/Me/Preferences/index.tsx b/src/screens/Tabs/Me/Preferences/index.tsx index 411a39d4..1022be31 100644 --- a/src/screens/Tabs/Me/Preferences/index.tsx +++ b/src/screens/Tabs/Me/Preferences/index.tsx @@ -1,8 +1,9 @@ import { HeaderLeft } from '@components/Header' import { Message } from '@components/Message' +import { useNavigationState } from '@react-navigation/native' import { createNativeStackNavigator } from '@react-navigation/native-stack' import { TabMePreferencesStackParamList, TabMeStackScreenProps } from '@utils/navigation/navigators' -import React, { useRef } from 'react' +import React, { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import FlashMessage from 'react-native-flash-message' import TabMePreferencesFilter from './Filter' @@ -17,6 +18,15 @@ const TabMePreferences: React.FC> = const { t } = useTranslation('screenTabs') const messageRef = useRef(null) + const isNested = + (useNavigationState( + state => state.routes.find(route => route.name === 'Tab-Me-Preferences')?.state?.routes.length + ) || 0) > 1 + + useEffect(() => { + navigation.setOptions({ gestureEnabled: !isNested }) + }, [isNested]) + return ( <> From 023f66895df6dfaf5f041991b88107f50592e871 Mon Sep 17 00:00:00 2001 From: xmflsct Date: Fri, 27 Jan 2023 21:54:48 +0100 Subject: [PATCH 2/3] Fix #666 --- src/screens/Tabs/Shared/Toot.tsx | 140 ++++++++++++------------------- 1 file changed, 54 insertions(+), 86 deletions(-) diff --git a/src/screens/Tabs/Shared/Toot.tsx b/src/screens/Tabs/Shared/Toot.tsx index f9a4f102..99af54bf 100644 --- a/src/screens/Tabs/Shared/Toot.tsx +++ b/src/screens/Tabs/Shared/Toot.tsx @@ -314,6 +314,55 @@ const TabSharedToot: React.FC> = ({ const curr = item._level || 0 const next = query.data?.pages[0].body[index + 1]?._level || 0 + const height = heights[index] || 300 + let path = '' + + if (curr > 1 || next > 1) { + Array.from({ length: curr }).forEach((_, i) => { + if (i > MAX_LEVEL) return null + + const lastLine = curr === i + 1 + if (lastLine) { + if (curr === prev + 1 || curr === next - 1) { + if (curr > next) return + + path = + path + + ` M ${curr * StyleConstants.Spacing.S + ARC} ${ + StyleConstants.Spacing.M + StyleConstants.Avatar.XS / 2 + } ` + + `a ${ARC} ${ARC} 0 0 0 -${ARC} ${ARC} ` + + `v ${height}` + } else { + if (i >= curr - 2) return + + path = + path + + ` M ${(i + 1) * StyleConstants.Spacing.S} 0 ` + + `v ${ + height - + (StyleConstants.Spacing.S * 1.5 + StyleConstants.Font.Size.L) / 2 - + StyleConstants.Avatar.XS / 2 + } ` + + `a ${ARC} ${ARC} 0 0 0 ${ARC} ${ARC}` + } + } else { + if (i >= next - 1) { + path = + path + + ` M ${(i + 1) * StyleConstants.Spacing.S} 0 ` + + `v ${ + height - + (StyleConstants.Spacing.S * 1.5 + StyleConstants.Font.Size.L * 1.35) / 2 + } ` + + `h ${ARC}` + } else { + path = path + ` M ${(i + 1) * StyleConstants.Spacing.S} 0 ` + `v ${height}` + } + } + }) + } + return ( > = ({ } }) => setHeights({ ...heights, [index]: height })} > - {curr > 1 || next > 1 - ? [...new Array(curr)].map((_, i) => { - if (i > MAX_LEVEL) return null - - const lastLine = curr === i + 1 - if (lastLine) { - if (curr === prev + 1 || curr === next - 1) { - if (curr > next) { - return null - } - return ( - - - - ) - } else { - if (i >= curr - 2) return null - return ( - - - - ) - } - } else { - if (i >= next - 1) { - return ( - - - - ) - } else { - return ( - - - - ) - } - } - }) - : null} + {path.length ? ( + + + + ) : null} Date: Fri, 27 Jan 2023 22:42:26 +0100 Subject: [PATCH 3/3] New Crowdin updates (#677) * New translations tabs.json (Chinese Traditional) * New translations tabs.json (Chinese Traditional) * New translations tabs.json (Polish) * New translations tabs.json (Catalan) * New translations tabs.json (Ukrainian) * New translations tabs.json (German) * New translations parse.json (Portuguese, Brazilian) * New translations timeline.json (Portuguese, Brazilian) * New translations mediaSelector.json (Portuguese, Brazilian) * New translations contextMenu.json (Portuguese, Brazilian) * New translations tabs.json (German) * New translations tabs.json (Portuguese, Brazilian) * New translations common.json (Portuguese, Brazilian) * New translations common.json (Basque) * New translations common.json (Basque) * New translations instance.json (Basque) * New translations parse.json (Basque) * New translations relationship.json (Basque) * New translations relationship.json (Basque) * New translations timeline.json (Basque) * New translations timeline.json (Catalan) * New translations tabs.json (Catalan) * New translations tabs.json (German) * New translations tabs.json (Italian) * New translations tabs.json (Japanese) * New translations tabs.json (Korean) * New translations tabs.json (Chinese Simplified) * New translations tabs.json (Chinese Traditional) * New translations tabs.json (Vietnamese) * New translations tabs.json (Portuguese, Brazilian) * New translations tabs.json (French) * New translations tabs.json (Polish) * New translations tabs.json (Spanish) * New translations tabs.json (Swedish) * New translations tabs.json (Czech) * New translations tabs.json (Dutch) * New translations tabs.json (Catalan) * New translations tabs.json (Ukrainian) * New translations tabs.json (Russian) * New translations tabs.json (Greek) * New translations tabs.json (Basque) * New translations contextMenu.json (French) * New translations contextMenu.json (Spanish) * New translations contextMenu.json (Catalan) * New translations contextMenu.json (Czech) * New translations contextMenu.json (German) * New translations contextMenu.json (Greek) * New translations contextMenu.json (Basque) * New translations contextMenu.json (Italian) * New translations contextMenu.json (Japanese) * New translations contextMenu.json (Korean) * New translations contextMenu.json (Dutch) * New translations contextMenu.json (Polish) * New translations contextMenu.json (Russian) * New translations contextMenu.json (Swedish) * New translations contextMenu.json (Ukrainian) * New translations contextMenu.json (Chinese Simplified) * New translations contextMenu.json (Chinese Traditional) * New translations contextMenu.json (Vietnamese) * New translations contextMenu.json (Portuguese, Brazilian) * New translations tabs.json (Chinese Simplified) * New translations contextMenu.json (Chinese Simplified) * New translations tabs.json (Ukrainian) * New translations contextMenu.json (Ukrainian) * New translations tabs.json (Chinese Traditional) * New translations contextMenu.json (Chinese Traditional) * New translations tabs.json (Spanish) * New translations tabs.json (Catalan) * New translations tabs.json (Dutch) * New translations contextMenu.json (Spanish) * New translations contextMenu.json (Catalan) * New translations contextMenu.json (Dutch) * New translations tabs.json (Dutch) * New translations contextMenu.json (Basque) * New translations contextMenu.json (Catalan) --- src/i18n/ca/components/contextMenu.json | 14 +-- src/i18n/ca/screens/tabs.json | 8 +- src/i18n/es/components/contextMenu.json | 14 +-- src/i18n/es/screens/tabs.json | 104 +++++++++--------- src/i18n/eu/components/contextMenu.json | 16 +-- src/i18n/nl/components/contextMenu.json | 16 +-- src/i18n/nl/screens/tabs.json | 106 +++++++++---------- src/i18n/uk/components/contextMenu.json | 16 +-- src/i18n/uk/screens/tabs.json | 6 +- src/i18n/zh-Hant/components/contextMenu.json | 16 +-- src/i18n/zh-Hant/screens/tabs.json | 6 +- 11 files changed, 161 insertions(+), 161 deletions(-) diff --git a/src/i18n/ca/components/contextMenu.json b/src/i18n/ca/components/contextMenu.json index 9966b870..12777ca9 100644 --- a/src/i18n/ca/components/contextMenu.json +++ b/src/i18n/ca/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "Segueix l'usuari", "action_true": "Deixa de seguir l'usuari" }, - "inLists": "", + "inLists": "Llistes que hi sigui l'usuari...", "showBoosts": { "action_false": "Mostra els impulsos de l'usuari", "action_true": "Oculta els impulsos de l'usuari" @@ -21,7 +21,7 @@ "succeed_locked": "Enviada la sol·licitud de seguiment a @{{target}} com {{source}}, pendent d'aprovar-la", "failed": "Segueix com" }, - "blockReport": "", + "blockReport": "Bloqueja i denuncia", "block": { "action_false": "Bloqueja l'usuari", "action_true": "Deixa de bloquejar l'usuari", @@ -56,11 +56,11 @@ }, "hashtag": { "follow": { - "action_false": "", - "action_true": "" + "action_false": "Segueix", + "action_true": "Deixa de seguir" }, "filter": { - "action": "" + "action": "Filtra l'etiqueta..." } }, "share": { @@ -99,8 +99,8 @@ "action_true": "Deixa de fixar la publicació" }, "filter": { - "action_false": "", - "action_true": "" + "action_false": "Filtra la publicació...", + "action_true": "Gestiona els filtres..." } } } \ No newline at end of file diff --git a/src/i18n/ca/screens/tabs.json b/src/i18n/ca/screens/tabs.json index 2d5103ab..c9e35252 100644 --- a/src/i18n/ca/screens/tabs.json +++ b/src/i18n/ca/screens/tabs.json @@ -211,7 +211,7 @@ }, "keywords": "Coincidències per aquestes paraules claus", "keyword": "Paraula clau", - "statuses": "" + "statuses": "Coincideixen aquestes publicacions" }, "profile": { "feedback": { @@ -400,14 +400,14 @@ "name": "Multimèdia de <0 /><1>" }, "filter": { - "name": "", - "existed": "" + "name": "Afegeix al filtre", + "existed": "Existia sota aquests filtres" }, "history": { "name": "Edita l'historial" }, "report": { - "name": "Denuncia {{acct}}", + "name": "Denúncia a {{acct}}", "report": "Denúncia", "forward": { "heading": "Envia anònimament al servidor remot {{instance}}" diff --git a/src/i18n/es/components/contextMenu.json b/src/i18n/es/components/contextMenu.json index 41e0b107..5c225435 100644 --- a/src/i18n/es/components/contextMenu.json +++ b/src/i18n/es/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "Seguir usuario", "action_true": "Dejar de seguir usuario" }, - "inLists": "", + "inLists": "Listas que contienen el usuario...", "showBoosts": { "action_false": "Mostrar los impulsos del usuario", "action_true": "Ocultar los impulsos del usuario" @@ -21,7 +21,7 @@ "succeed_locked": "Enviado la solicitud de seguimiento a @{{target}} como {{source}}, pendiente de aprobación", "failed": "Seguir como" }, - "blockReport": "", + "blockReport": "Bloquear y denunciar", "block": { "action_false": "Bloquear usuario", "action_true": "Desbloquear usuario", @@ -56,11 +56,11 @@ }, "hashtag": { "follow": { - "action_false": "", - "action_true": "" + "action_false": "Seguir", + "action_true": "Dejar de seguir" }, "filter": { - "action": "" + "action": "Filtrar la etiqueta..." } }, "share": { @@ -99,8 +99,8 @@ "action_true": "Desfijar toot" }, "filter": { - "action_false": "", - "action_true": "" + "action_false": "Filtrar la publicación...", + "action_true": "Gestiona los filtros..." } } } \ No newline at end of file diff --git a/src/i18n/es/screens/tabs.json b/src/i18n/es/screens/tabs.json index 5aea3a59..074703bc 100644 --- a/src/i18n/es/screens/tabs.json +++ b/src/i18n/es/screens/tabs.json @@ -70,16 +70,16 @@ "name": "Notificaciones push" }, "preferences": { - "name": "" + "name": "Preferencias" }, "preferencesFilters": { - "name": "" + "name": "Todos los filtros de contenido" }, "preferencesFilterAdd": { - "name": "" + "name": "Crear filtro" }, "preferencesFilterEdit": { - "name": "" + "name": "Editar filtro" }, "profile": { "name": "Editar perfil" @@ -136,82 +136,82 @@ }, "preferences": { "visibility": { - "title": "", + "title": "Visibilidad de publicación predeterminada", "options": { - "public": "", - "unlisted": "", - "private": "" + "public": "Público", + "unlisted": "No listado", + "private": "Solo seguidores" } }, "sensitive": { - "title": "" + "title": "Marcar el contenido multimedia como sensibles por defecto" }, "media": { - "title": "", + "title": "Mostrar el contenido multimedia", "options": { - "default": "", - "show_all": "", - "hide_all": "" + "default": "Ocultar los contenidos multimedia marcados como sensibles", + "show_all": "Mostrar siempre el contenido multimedia", + "hide_all": "Siempre ocultar el contenido multimedia" } }, "spoilers": { - "title": "" + "title": "Siempre expandir las publicaciones marcadas con advertencias de contenido" }, "autoplay_gifs": { - "title": "" + "title": "Reproduce automáticamente los GIF" }, "filters": { - "title": "", - "content": "" + "title": "Filtros de contenido", + "content": "{{count}} activo" }, "web_only": { - "title": "", - "description": "" + "title": "Actualizar ajustes", + "description": "Los ajustes a continuación solo se pueden actualizar mediante la interfaz web" } }, "preferencesFilters": { - "expired": "", - "keywords_one": "", - "keywords_other": "", - "statuses_one": "", - "statuses_other": "", - "context": "", + "expired": "Expirado", + "keywords_one": "{{count}} palabra clave", + "keywords_other": "{{count}} palabras clave", + "statuses_one": "{{count}} publicación", + "statuses_other": "{{count}} publicaciones", + "context": "Se aplica en <0 />", "contexts": { - "home": "", - "notifications": "", - "public": "", - "thread": "", - "account": "" + "home": "Seguidos y listas", + "notifications": "Notificación", + "public": "Federado", + "thread": "Conversación", + "account": "Perfil" } }, "preferencesFilter": { - "name": "", - "expiration": "", + "name": "Nombre", + "expiration": "Vencimiento", "expirationOptions": { - "0": "", - "1800": "", - "3600": "", - "43200": "", - "86400": "", - "604800": "", - "18144000": "" + "0": "Nunca", + "1800": "Después de 30 minutos", + "3600": "Después de 1 hora", + "43200": "Después de 12 horas", + "86400": "Después de 1 día", + "604800": "Después de 1 semana", + "18144000": "Después de 1 mes" }, - "context": "", + "context": "Se aplica en", "contexts": { - "home": "", - "notifications": "", - "public": "", - "thread": "", - "account": "" + "home": "Seguidos y listas", + "notifications": "Notificación", + "public": "Cronología federada", + "thread": "Vista de conversación", + "account": "Vista de perfil" }, - "action": "", + "action": "Al coincidir", "actions": { "warn": "", - "hide": "" + "hide": "Oculto completamente" }, - "keywords": "", - "keyword": "", - "statuses": "" + "keywords": "Coincide con estas palabras clave", + "keyword": "Palabra clave", + "statuses": "Coincide con estas publicaciones" }, "profile": { "feedback": { @@ -400,8 +400,8 @@ "name": "Multimedia de <0 /><1>" }, "filter": { - "name": "", - "existed": "" + "name": "Añadir al filtro", + "existed": "Existe en estos filtros" }, "history": { "name": "Historial de ediciones" diff --git a/src/i18n/eu/components/contextMenu.json b/src/i18n/eu/components/contextMenu.json index 6306d3a7..afe429bc 100644 --- a/src/i18n/eu/components/contextMenu.json +++ b/src/i18n/eu/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "", "action_true": "" }, - "inLists": "", + "inLists": "Erabiltzaile hau zerrenda hauetan dago...", "showBoosts": { "action_false": "", "action_true": "" @@ -16,12 +16,12 @@ "action_true": "" }, "followAs": { - "trigger": "", + "trigger": "Honela jarraitu...", "succeed_default": "", "succeed_locked": "", "failed": "" }, - "blockReport": "", + "blockReport": "Blokeatu eta salatu", "block": { "action_false": "", "action_true": "", @@ -56,11 +56,11 @@ }, "hashtag": { "follow": { - "action_false": "", - "action_true": "" + "action_false": "Jarraitu", + "action_true": "Jarraitzeari utzi" }, "filter": { - "action": "" + "action": "Traola iragazi..." } }, "share": { @@ -99,8 +99,8 @@ "action_true": "" }, "filter": { - "action_false": "", - "action_true": "" + "action_false": "Tuta iragazi...", + "action_true": "Iragazkiak kudeatu..." } } } \ No newline at end of file diff --git a/src/i18n/nl/components/contextMenu.json b/src/i18n/nl/components/contextMenu.json index da7abb26..f7dc0202 100644 --- a/src/i18n/nl/components/contextMenu.json +++ b/src/i18n/nl/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "Volg gebruiker", "action_true": "Ontvolg" }, - "inLists": "", + "inLists": "Lijsten met gebruiker...", "showBoosts": { "action_false": "Boosts van gebruiker weergeven", "action_true": "Boosts van gebruiker verbergen" @@ -16,12 +16,12 @@ "action_true": "Dempen opheffen voor gebruiker" }, "followAs": { - "trigger": "", + "trigger": "Volg als ...", "succeed_default": "Je volgt nu @{{target}} met @{{source}}", "succeed_locked": "Verstuurde het volgverzoek naar @{{target}} met {{source}}, in afwachting van goedkeuring", "failed": "Volg als" }, - "blockReport": "", + "blockReport": "Blokkeren en rapporten", "block": { "action_false": "Gebruiker blokkeren", "action_true": "Gebruiker deblokkeren", @@ -56,11 +56,11 @@ }, "hashtag": { "follow": { - "action_false": "", - "action_true": "" + "action_false": "Volg", + "action_true": "Ontvolg" }, "filter": { - "action": "" + "action": "Filter hashtag ..." } }, "share": { @@ -99,8 +99,8 @@ "action_true": "Toot losmaken" }, "filter": { - "action_false": "", - "action_true": "" + "action_false": "Filter toot ...", + "action_true": "Filters beheren ..." } } } \ No newline at end of file diff --git a/src/i18n/nl/screens/tabs.json b/src/i18n/nl/screens/tabs.json index 8bbf080b..fe81582c 100644 --- a/src/i18n/nl/screens/tabs.json +++ b/src/i18n/nl/screens/tabs.json @@ -70,16 +70,16 @@ "name": "Push Melding" }, "preferences": { - "name": "" + "name": "Voorkeuren" }, "preferencesFilters": { - "name": "" + "name": "Alle inhoudsfilters" }, "preferencesFilterAdd": { - "name": "" + "name": "Filter Maken" }, "preferencesFilterEdit": { - "name": "" + "name": "Bewerk filter" }, "profile": { "name": "Profiel bewerken" @@ -136,82 +136,82 @@ }, "preferences": { "visibility": { - "title": "", + "title": "Standaard zichtbaarheid van berichten", "options": { - "public": "", - "unlisted": "", - "private": "" + "public": "Openbaar", + "unlisted": "Niet openbaar", + "private": "Alleen volgers" } }, "sensitive": { - "title": "" + "title": "Media standaard als gevoelig markeren" }, "media": { - "title": "", + "title": "Mediaweergave", "options": { - "default": "", - "show_all": "", - "hide_all": "" + "default": "Als gevoelig gemarkeerde media verbergen", + "show_all": "Media altijd tonen", + "hide_all": "Media altijd verbergen" } }, "spoilers": { - "title": "" + "title": "Altijd toots met tekstwaarschuwingen uitklappen" }, "autoplay_gifs": { - "title": "" + "title": "GIF automatisch afspelen in toots" }, "filters": { - "title": "", - "content": "" + "title": "Inhoud Filters", + "content": "{{count}} actief" }, "web_only": { - "title": "", - "description": "" + "title": "Instellingen bijwerken", + "description": "Instellingen hieronder kunnen alleen met behulp van de webUI worden bijgewerkt" } }, "preferencesFilters": { - "expired": "", - "keywords_one": "", - "keywords_other": "", - "statuses_one": "", - "statuses_other": "", - "context": "", + "expired": "Verlopen", + "keywords_one": "{{count}} trefwoord", + "keywords_other": "{{count}} trefwoorden", + "statuses_one": "{{count}} toot", + "statuses_other": "{{count}} toots", + "context": "Van toepassing in <0 />", "contexts": { - "home": "", - "notifications": "", - "public": "", - "thread": "", - "account": "" + "home": "volgend en lijsten", + "notifications": "melding", + "public": "gefedereerd", + "thread": "gesprek", + "account": "profiel" } }, "preferencesFilter": { - "name": "", - "expiration": "", + "name": "Naam", + "expiration": "Vervaldatum", "expirationOptions": { - "0": "", - "1800": "", - "3600": "", - "43200": "", - "86400": "", - "604800": "", - "18144000": "" + "0": "Nooit", + "1800": "Na 30 minuten", + "3600": "Na 1 uur", + "43200": "Na 12 uur", + "86400": "Na 1 dag", + "604800": "Na 1 week", + "18144000": "Na 1 maand" }, - "context": "", + "context": "Van toepassing in", "contexts": { - "home": "", - "notifications": "", - "public": "", - "thread": "", - "account": "" + "home": "Volgend en lijsten", + "notifications": "Melding", + "public": "Federale tijdlijn", + "thread": "Gesprek weergave", + "account": "Profiel weergave" }, - "action": "", + "action": "Bij een overeenkomst", "actions": { - "warn": "", - "hide": "" + "warn": "Ingeklapt maar kan worden onthuld", + "hide": "Volledig verborgen" }, - "keywords": "", - "keyword": "", - "statuses": "" + "keywords": "Komt overeen met deze trefwoorden", + "keyword": "Trefwoord", + "statuses": "Komt overeen met deze toots" }, "profile": { "feedback": { @@ -400,8 +400,8 @@ "name": "<0 /><1>'s media" }, "filter": { - "name": "", - "existed": "" + "name": "Toevoegen aan filter", + "existed": "Bestaat in deze filters" }, "history": { "name": "Geschiedenis bewerken" diff --git a/src/i18n/uk/components/contextMenu.json b/src/i18n/uk/components/contextMenu.json index d313822b..8658de70 100644 --- a/src/i18n/uk/components/contextMenu.json +++ b/src/i18n/uk/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "Підписатися на користувача", "action_true": "Відписатися від користувача" }, - "inLists": "", + "inLists": "Списки, в яких є користувач ...", "showBoosts": { "action_false": "Показати передмухи користувача", "action_true": "Приховати передмухи користувача" @@ -16,12 +16,12 @@ "action_true": "Зняти заглушення з користувача" }, "followAs": { - "trigger": "", + "trigger": "Стежити як ...", "succeed_default": "Тепер ви стежите за @{{target}} з @{{source}}", "succeed_locked": "Запит на стеження за @{{target}} з {{source}} надіслано, очікується затвердження", "failed": "Стежити як" }, - "blockReport": "", + "blockReport": "Заблокувати й поскаржитися", "block": { "action_false": "Заблокувати користувача", "action_true": "Розблокувати користувача", @@ -56,11 +56,11 @@ }, "hashtag": { "follow": { - "action_false": "", - "action_true": "" + "action_false": "Підписатися", + "action_true": "Відписатися" }, "filter": { - "action": "" + "action": "Фільтрувати хештеґ ..." } }, "share": { @@ -99,8 +99,8 @@ "action_true": "Відкріпити дмух" }, "filter": { - "action_false": "", - "action_true": "" + "action_false": "Фільтрувати дмух ...", + "action_true": "Керувати фільтрами ..." } } } \ No newline at end of file diff --git a/src/i18n/uk/screens/tabs.json b/src/i18n/uk/screens/tabs.json index fb5b326a..4ebe4e0d 100644 --- a/src/i18n/uk/screens/tabs.json +++ b/src/i18n/uk/screens/tabs.json @@ -211,7 +211,7 @@ }, "keywords": "Збіг із цими ключовими словами", "keyword": "Ключове слово", - "statuses": "" + "statuses": "Збігається з цими дмухами" }, "profile": { "feedback": { @@ -400,8 +400,8 @@ "name": "<0 /><1> медіа" }, "filter": { - "name": "", - "existed": "" + "name": "Додати фільтр", + "existed": "Існує в цих фільтрах" }, "history": { "name": "Редагувати історію" diff --git a/src/i18n/zh-Hant/components/contextMenu.json b/src/i18n/zh-Hant/components/contextMenu.json index 13c4b51a..d38546d0 100644 --- a/src/i18n/zh-Hant/components/contextMenu.json +++ b/src/i18n/zh-Hant/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "跟隨使用者", "action_true": "取消跟隨使用者" }, - "inLists": "", + "inLists": "包含使用者的列表 ...", "showBoosts": { "action_false": "顯示使用者的轉嘟", "action_true": "隱藏使用者的轉嘟" @@ -16,12 +16,12 @@ "action_true": "解除靜音使用者" }, "followAs": { - "trigger": "", + "trigger": "用其它帳號跟隨 ...", "succeed_default": "@{{source}} 正在跟隨 @{{target}}", "succeed_locked": "已從 {{source}} 發送跟隨請求至 @{{target}},等待同意", "failed": "用其它帳號跟隨" }, - "blockReport": "", + "blockReport": "封鎖並檢舉", "block": { "action_false": "封鎖使用者", "action_true": "解除封鎖使用者", @@ -56,11 +56,11 @@ }, "hashtag": { "follow": { - "action_false": "", - "action_true": "" + "action_false": "跟隨", + "action_true": "取消跟隨" }, "filter": { - "action": "" + "action": "過濾主題標籤 ..." } }, "share": { @@ -99,8 +99,8 @@ "action_true": "取消釘選嘟文" }, "filter": { - "action_false": "", - "action_true": "" + "action_false": "過濾嘟文 ...", + "action_true": "管理過濾器 ..." } } } \ No newline at end of file diff --git a/src/i18n/zh-Hant/screens/tabs.json b/src/i18n/zh-Hant/screens/tabs.json index 57582448..991362e2 100644 --- a/src/i18n/zh-Hant/screens/tabs.json +++ b/src/i18n/zh-Hant/screens/tabs.json @@ -211,7 +211,7 @@ }, "keywords": "符合這些關鍵字", "keyword": "關鍵字", - "statuses": "" + "statuses": "符合這些嘟文" }, "profile": { "feedback": { @@ -400,8 +400,8 @@ "name": "<0 /><1>的媒體" }, "filter": { - "name": "", - "existed": "" + "name": "新增至過濾器", + "existed": "已被過濾" }, "history": { "name": "編輯歷史"