diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt index 226b123f..6ea61e2c 100644 --- a/fastlane/metadata/en-US/release_notes.txt +++ b/fastlane/metadata/en-US/release_notes.txt @@ -1,7 +1,10 @@ Enjoy toooting! This version includes following improvements and fixes: +- Added 🇺🇦 Slava Ukraini - Automatic setting detected language when tooting - Remember public timeline type selection - Show diffing of edit history +- Allow hiding boosts and replies in home timeline +- Support toot in RTL languages - Added notification for admins - Fix whole word filter matching - Fix tablet cannot delete toot drafts \ No newline at end of file diff --git a/fastlane/metadata/zh-Hans/release_notes.txt b/fastlane/metadata/zh-Hans/release_notes.txt index 7ea1cc90..4b29b0a7 100644 --- a/fastlane/metadata/zh-Hans/release_notes.txt +++ b/fastlane/metadata/zh-Hans/release_notes.txt @@ -1,7 +1,10 @@ toooting愉快!此版本包括以下改进和修复: +- 增加 🇺🇦 Slava Ukraini - 自动识别发嘟语言 - 记住上次公共时间轴选项 - 显示编辑历史的差异 +- 关注列表可隐藏转嘟和回复 - 新增管理员推送通知 +- 支持嘟文右到左文字 - 修复过滤整词功能 - 修复平板不能删除草稿 \ No newline at end of file diff --git a/ios/tooot.xcodeproj/project.pbxproj b/ios/tooot.xcodeproj/project.pbxproj index 190f0d6b..908f700c 100644 --- a/ios/tooot.xcodeproj/project.pbxproj +++ b/ios/tooot.xcodeproj/project.pbxproj @@ -86,6 +86,7 @@ E69EBACE28DF28560057EDEC /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/InfoPlist.strings; sourceTree = ""; }; E6A4895D293C1F740047951A /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/InfoPlist.strings; sourceTree = ""; }; E6C8B26628F5F9FC0062CF2E /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = ""; }; + E6D64C7A294A90840098F3AC /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; /* End PBXFileReference section */ @@ -298,6 +299,7 @@ sv, nl, ca, + uk, ); mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; @@ -530,6 +532,7 @@ E63E7FF0292A828100C76FD4 /* sv */, E6217B7E293C1EBF00B1755E /* nl */, E6A4895D293C1F740047951A /* ca */, + E6D64C7A294A90840098F3AC /* uk */, ); name = InfoPlist.strings; sourceTree = ""; diff --git a/ios/uk.lproj/InfoPlist.strings b/ios/uk.lproj/InfoPlist.strings new file mode 100644 index 00000000..a23b678c --- /dev/null +++ b/ios/uk.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +"NSPhotoLibraryAddUsageDescription" = "Дозвольте tooot зберігати зображення у вашій папці фотоапарата"; +"NSPhotoLibraryUsageDescription" = "Дозвольте tooot зберігати зображення у вашій папці фотоапарата"; diff --git a/package.json b/package.json index 348bc21d..7ca20343 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "react-redux": "^8.0.5", "redux-persist": "^6.0.0", "rn-placeholder": "^3.0.3", + "rtl-detect": "^1.0.4", "valid-url": "^1.0.9", "zeego": "^0.5.0" }, diff --git a/src/@types/app.d.ts b/src/@types/app.d.ts index d3d4f400..3b2b9525 100644 --- a/src/@types/app.d.ts +++ b/src/@types/app.d.ts @@ -8,9 +8,7 @@ declare namespace App { | 'Hashtag' | 'List' | 'Toot' - | 'Account_Default' - | 'Account_All' - | 'Account_Attachments' + | 'Account' | 'Conversations' | 'Bookmarks' | 'Favourites' diff --git a/src/@types/untyped.d.ts b/src/@types/untyped.d.ts index 25b5f1b1..ad27df89 100644 --- a/src/@types/untyped.d.ts +++ b/src/@types/untyped.d.ts @@ -3,6 +3,7 @@ declare module 'htmlparser2-without-node-native' declare module 'react-native-feather' declare module 'react-native-htmlview' declare module 'react-native-toast-message' +declare module 'rtl-detect' declare module '@helpers/features' { const features: { feature: string; version: number; reference?: string }[] diff --git a/src/api/general.ts b/src/api/general.ts index 81e993f5..e29637d3 100644 --- a/src/api/general.ts +++ b/src/api/general.ts @@ -47,9 +47,27 @@ const apiGeneral = async ({ ...(body && { data: body }) }) .then(response => { - return Promise.resolve({ - body: response.data - }) + let links: { + prev?: { id: string; isOffset: boolean } + next?: { id: string; isOffset: boolean } + } = {} + + if (response.headers?.link) { + const linksParsed = response.headers.link.matchAll( + new RegExp('[?&](.*?_id|offset)=(.*?)>; *rel="(.*?)"', 'gi') + ) + for (const link of linksParsed) { + switch (link[3]) { + case 'prev': + links.prev = { id: link[2], isOffset: link[1].includes('offset') } + break + case 'next': + links.next = { id: link[2], isOffset: link[1].includes('offset') } + break + } + } + } + return Promise.resolve({ body: response.data, links }) }) .catch(handleError()) } diff --git a/src/components/Header/Center.tsx b/src/components/Header/Center.tsx index 2a700fab..d61e3bfa 100644 --- a/src/components/Header/Center.tsx +++ b/src/components/Header/Center.tsx @@ -1,6 +1,4 @@ -import Icon from '@components/Icon' import CustomText from '@components/Text' -import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React from 'react' import { View } from 'react-native' @@ -9,16 +7,10 @@ export interface Props { content?: string inverted?: boolean onPress?: () => void - dropdown?: boolean } // Used for Android mostly -const HeaderCenter: React.FC = ({ - content, - inverted = false, - onPress, - dropdown = false -}) => { +const HeaderCenter: React.FC = ({ content, inverted = false, onPress }) => { const { colors } = useTheme() return ( @@ -33,13 +25,6 @@ const HeaderCenter: React.FC = ({ children={content} {...(onPress && { onPress })} /> - ) } diff --git a/src/components/Icon.tsx b/src/components/Icon.tsx index 735620ed..37c7e61e 100644 --- a/src/components/Icon.tsx +++ b/src/components/Icon.tsx @@ -11,6 +11,7 @@ export interface Props { fill?: string strokeWidth?: number style?: StyleProp + crossOut?: boolean } const Icon: React.FC = ({ @@ -20,7 +21,8 @@ const Icon: React.FC = ({ color, fill, strokeWidth = 2, - style + style, + crossOut = false }) => { return ( = ({ fill, strokeWidth })} + {crossOut ? ( + + ) : null} ) } diff --git a/src/components/Parse/HTML.tsx b/src/components/Parse/HTML.tsx index 68b9f48c..e651a66e 100644 --- a/src/components/Parse/HTML.tsx +++ b/src/components/Parse/HTML.tsx @@ -13,7 +13,7 @@ import { useTheme } from '@utils/styles/ThemeManager' import { isEqual } from 'lodash' import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Platform, Pressable, View } from 'react-native' +import { Platform, Pressable, TextStyleIOS, View } from 'react-native' import HTMLView from 'react-native-htmlview' import { useSelector } from 'react-redux' @@ -154,6 +154,7 @@ const renderNode = ({ export interface Props { content: string size?: 'S' | 'M' | 'L' + textStyles?: TextStyleIOS adaptiveSize?: boolean emojis?: Mastodon.Emoji[] mentions?: Mastodon.Mention[] @@ -171,6 +172,7 @@ const ParseHTML = React.memo( ({ content, size = 'M', + textStyles, adaptiveSize = false, emojis, mentions, @@ -196,7 +198,7 @@ const ParseHTML = React.memo( const navigation = useNavigation>() const route = useRoute() const { colors, theme } = useTheme() - const { t, i18n } = useTranslation('componentParse') + const { t } = useTranslation('componentParse') if (!expandHint) { expandHint = t('HTML.defaultHint') } @@ -294,6 +296,7 @@ const ParseHTML = React.memo( } }} style={{ + ...textStyles, height: numberOfLines === 1 && !expanded ? 0 : undefined }} numberOfLines={ @@ -304,7 +307,7 @@ const ParseHTML = React.memo( ) }, - [theme, i18n.language] + [theme] ) return ( diff --git a/src/components/Relationship/Outgoing.tsx b/src/components/Relationship/Outgoing.tsx index f41ea157..70a643e0 100644 --- a/src/components/Relationship/Outgoing.tsx +++ b/src/components/Relationship/Outgoing.tsx @@ -30,8 +30,8 @@ const RelationshipOutgoing = React.memo( haptics('Success') queryClient.setQueryData(queryKeyRelationship, [res]) if (action === 'block') { - const queryKey: QueryKeyTimeline = ['Timeline', { page: 'Following' }] - queryClient.invalidateQueries(queryKey) + const queryKey = ['Timeline', { page: 'Following' }] + queryClient.invalidateQueries({ queryKey, exact: false }) } }, onError: (err: any, { payload: { action } }) => { diff --git a/src/components/Timeline/Shared/Content.tsx b/src/components/Timeline/Shared/Content.tsx index 85985330..d7b799da 100644 --- a/src/components/Timeline/Shared/Content.tsx +++ b/src/components/Timeline/Shared/Content.tsx @@ -2,7 +2,9 @@ import { ParseHTML } from '@components/Parse' import { getInstanceAccount } from '@utils/slices/instancesSlice' import React, { useContext } from 'react' import { useTranslation } from 'react-i18next' +import { Platform } from 'react-native' import { useSelector } from 'react-redux' +import { isRtlLang } from 'rtl-detect' import StatusContext from './Context' export interface Props { @@ -31,6 +33,11 @@ const TimelineContent: React.FC = ({ notificationOwnToot = false, setSpoi numberOfLines={999} highlighted={highlighted} disableDetails={disableDetails} + textStyles={ + Platform.OS === 'ios' && status.language && isRtlLang(status.language) + ? { writingDirection: 'rtl' } + : undefined + } /> = ({ notificationOwnToot = false, setSpoi setSpoilerExpanded={setSpoilerExpanded} highlighted={highlighted} disableDetails={disableDetails} + textStyles={ + Platform.OS === 'ios' && status.language && isRtlLang(status.language) + ? { writingDirection: 'rtl' } + : undefined + } /> ) : ( @@ -62,6 +74,11 @@ const TimelineContent: React.FC = ({ notificationOwnToot = false, setSpoi tags={status.tags} numberOfLines={highlighted || inThread ? 999 : notificationOwnToot ? 2 : undefined} disableDetails={disableDetails} + textStyles={ + Platform.OS === 'ios' && status.language && isRtlLang(status.language) + ? { writingDirection: 'rtl' } + : undefined + } /> )} diff --git a/src/components/Timeline/Shared/Feedback.tsx b/src/components/Timeline/Shared/Feedback.tsx index 8fa8f30a..40d647e7 100644 --- a/src/components/Timeline/Shared/Feedback.tsx +++ b/src/components/Timeline/Shared/Feedback.tsx @@ -37,7 +37,7 @@ const TimelineFeedback = () => { onPress={() => navigation.push('Tab-Shared-Users', { reference: 'statuses', - id: status.id, + status, type: 'reblogged_by', count: status.reblogs_count }) @@ -59,7 +59,7 @@ const TimelineFeedback = () => { onPress={() => navigation.push('Tab-Shared-Users', { reference: 'statuses', - id: status.id, + status, type: 'favourited_by', count: status.favourites_count }) diff --git a/src/components/Timeline/Shared/Filtered.tsx b/src/components/Timeline/Shared/Filtered.tsx index a9495366..28c582e5 100644 --- a/src/components/Timeline/Shared/Filtered.tsx +++ b/src/components/Timeline/Shared/Filtered.tsx @@ -45,6 +45,7 @@ export const shouldFilter = ({ status: Mastodon.Status queryKey: QueryKeyTimeline }): string | null => { + const page = queryKey[1] const instance = getInstance(store.getState()) const ownAccount = getInstanceAccount(store.getState())?.id === status.account?.id @@ -93,11 +94,11 @@ export const shouldFilter = ({ } } - switch (queryKey[1].page) { + switch (page.page) { case 'Following': case 'Local': case 'List': - case 'Account_Default': + case 'Account': if (filter.context.includes('home')) { checkFilter(filter) } diff --git a/src/components/Timeline/Shared/HeaderAndroid.tsx b/src/components/Timeline/Shared/HeaderAndroid.tsx index d05ab384..c0926e24 100644 --- a/src/components/Timeline/Shared/HeaderAndroid.tsx +++ b/src/components/Timeline/Shared/HeaderAndroid.tsx @@ -1,5 +1,4 @@ import menuAccount from '@components/contextMenu/account' -import menuInstance from '@components/contextMenu/instance' import menuShare from '@components/contextMenu/share' import menuStatus from '@components/contextMenu/status' import Icon from '@components/Icon' @@ -31,7 +30,6 @@ const TimelineHeaderAndroid: React.FC = () => { queryKey }) const mStatus = menuStatus({ status, queryKey, rootQueryKey }) - const mInstance = menuInstance({ status, queryKey, rootQueryKey }) return ( @@ -77,16 +75,6 @@ const TimelineHeaderAndroid: React.FC = () => { ))} ))} - - {mInstance.map((mGroup, index) => ( - - {mGroup.map(menu => ( - - - - ))} - - ))} ) : null} diff --git a/src/components/Timeline/Shared/HeaderDefault.tsx b/src/components/Timeline/Shared/HeaderDefault.tsx index 1e482239..f4f699fa 100644 --- a/src/components/Timeline/Shared/HeaderDefault.tsx +++ b/src/components/Timeline/Shared/HeaderDefault.tsx @@ -1,5 +1,4 @@ import menuAccount from '@components/contextMenu/account' -import menuInstance from '@components/contextMenu/instance' import menuShare from '@components/contextMenu/share' import menuStatus from '@components/contextMenu/status' import Icon from '@components/Icon' @@ -38,7 +37,6 @@ const TimelineHeaderDefault: React.FC = () => { queryKey }) const mStatus = menuStatus({ status, queryKey, rootQueryKey }) - const mInstance = menuInstance({ status, queryKey, rootQueryKey }) return ( @@ -116,17 +114,6 @@ const TimelineHeaderDefault: React.FC = () => { ))} ))} - - {mInstance.map((mGroup, index) => ( - - {mGroup.map(menu => ( - - - - - ))} - - ))} diff --git a/src/components/Timeline/Shared/Poll.tsx b/src/components/Timeline/Shared/Poll.tsx index 933d3da9..3339b3bb 100644 --- a/src/components/Timeline/Shared/Poll.tsx +++ b/src/components/Timeline/Shared/Poll.tsx @@ -33,7 +33,7 @@ const TimelinePoll: React.FC = () => { const poll = status.poll const { colors, theme } = useTheme() - const { t, i18n } = useTranslation('componentTimeline') + const { t } = useTranslation('componentTimeline') const [allOptions, setAllOptions] = useState(new Array(status.poll.options.length).fill(false)) @@ -127,7 +127,7 @@ const TimelinePoll: React.FC = () => { ) } } - }, [theme, i18n.language, poll.expired, poll.voted, allOptions, mutation.isLoading]) + }, [theme, poll.expired, poll.voted, allOptions, mutation.isLoading]) const isSelected = useCallback( (index: number): string => diff --git a/src/components/contextMenu/account.ts b/src/components/contextMenu/account.ts index 8d4c7893..c85aa935 100644 --- a/src/components/contextMenu/account.ts +++ b/src/components/contextMenu/account.ts @@ -50,7 +50,7 @@ const menuAccount = ({ setEnabled(true) } }, [openChange, enabled]) - const { data, isFetching } = useRelationshipQuery({ id: account.id, options: { enabled } }) + const { data, isFetched } = useRelationshipQuery({ id: account.id, options: { enabled } }) const queryClient = useQueryClient() const timelineMutation = useTimelineMutation({ @@ -99,8 +99,8 @@ const menuAccount = ({ haptics('Success') queryClient.setQueryData(queryKeyRelationship, [res]) if (action === 'block') { - const queryKey: QueryKeyTimeline = ['Timeline', { page: 'Following' }] - queryClient.invalidateQueries(queryKey) + const queryKey = ['Timeline', { page: 'Following' }] + queryClient.invalidateQueries({ queryKey, exact: false }) } }, onError: (err: any, { payload: { action } }) => { @@ -131,7 +131,7 @@ const menuAccount = ({ type: 'outgoing', payload: { action: 'follow', state: !data?.requested ? data.following : true } }), - disabled: !data || isFetching, + disabled: !data || !isFetched, destructive: false, hidden: false }, @@ -152,9 +152,9 @@ const menuAccount = ({ key: 'account-list', item: { onSelect: () => navigation.navigate('Tab-Shared-Account-In-Lists', { account }), - disabled: Platform.OS !== 'android' ? !data || isFetching : false, + disabled: Platform.OS !== 'android' ? !data || !isFetched : false, destructive: false, - hidden: isFetching ? false : !data?.following + hidden: !isFetched || !data?.following }, title: t('account.inLists'), icon: 'checklist' @@ -169,7 +169,7 @@ const menuAccount = ({ id: account.id, payload: { property: 'mute', currentValue: data?.muting } }), - disabled: Platform.OS !== 'android' ? !data || isFetching : false, + disabled: Platform.OS !== 'android' ? !data || !isFetched : false, destructive: false, hidden: false }, @@ -192,7 +192,7 @@ const menuAccount = ({ id: account.id, payload: { property: 'block', currentValue: data?.blocking } }), - disabled: Platform.OS !== 'android' ? !data || isFetching : false, + disabled: Platform.OS !== 'android' ? !data || !isFetched : false, destructive: !data?.blocking, hidden: false }, diff --git a/src/i18n/ca/common.json b/src/i18n/ca/common.json index c67e4cce..163d8b66 100644 --- a/src/i18n/ca/common.json +++ b/src/i18n/ca/common.json @@ -5,6 +5,7 @@ "cancel": "Cancel·la", "discard": "Descarta", "continue": "Continua", + "create": "Crea", "delete": "Esborra", "done": "Fet" }, diff --git a/src/i18n/ca/components/instance.json b/src/i18n/ca/components/instance.json index de2f42e2..97aa1b2b 100644 --- a/src/i18n/ca/components/instance.json +++ b/src/i18n/ca/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "Domini de la instància" + "placeholder": "" }, "button": "Inicia la sessió", "information": { diff --git a/src/i18n/ca/components/timeline.json b/src/i18n/ca/components/timeline.json index adc39c18..5a0145f4 100644 --- a/src/i18n/ca/components/timeline.json +++ b/src/i18n/ca/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} ha impulsat", "notification": "{{name}} ha impulsat la teva publicació" }, - "update": "L'impuls ha sigut editat" + "update": "L'impuls ha sigut editat", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Afegeix aquesta publicació a marcadors", "function": "Afegeix la publicació a marcadors" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/ca/screens/actions.json b/src/i18n/ca/screens/actions.json index 063f9d09..15dc17ec 100644 --- a/src/i18n/ca/screens/actions.json +++ b/src/i18n/ca/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Text alternatiu" - }, - "notificationsFilter": { - "heading": "Mostra els tipus de notificació", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Sol·licitud de seguiment", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Publicació d'usuaris subscrits", - "update": "L'impuls ha sigut editat" - } } } } \ No newline at end of file diff --git a/src/i18n/ca/screens/compose.json b/src/i18n/ca/screens/compose.json index af53c55f..5f3220e0 100644 --- a/src/i18n/ca/screens/compose.json +++ b/src/i18n/ca/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Cancel·la", "alert": { "title": "Voleu cancel·lar l'edició?", "buttons": { "save": "Desa l'esborrany", - "delete": "Esborra l'esborrany", - "cancel": "Cancel·la" + "delete": "Esborra l'esborrany" } } }, diff --git a/src/i18n/ca/screens/tabs.json b/src/i18n/ca/screens/tabs.json index ebf8b77f..063839e8 100644 --- a/src/i18n/ca/screens/tabs.json +++ b/src/i18n/ca/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Seguint" + "name": "Seguint", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Federat", - "right": "Local" + "federated": "Federat", + "local": "Local", + "trending": "En tendència" } }, "notifications": { "name": "Notificacions" - }, - "me": { - "name": "Sobre mi" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filtra", - "accessibilityHint": "Filtra els tipus de notificacions" + "accessibilityHint": "Filtra els tipus de notificacions", + "title": "Mostra les notificacions", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Sol·licitud de seguiment", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Publicació d'usuaris subscrits", + "update": "L'impuls ha sigut editat", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Favorits" }, + "followedTags": { + "name": "Etiquetes seguides" + }, "fontSize": { "name": "Mida de la font de la publicació" }, @@ -53,7 +70,7 @@ "name": "Usuaris a la llista: {{list}}" }, "listAdd": { - "name": "Afegeix a la llista" + "name": "Crea una llista" }, "listEdit": { "name": "Edita els detalls de la llista" @@ -179,8 +196,8 @@ "settings": "Activa'ls a la configuració" }, "missingServerKey": { - "message": "", - "description": "" + "message": "Servidor mal configurat per a les notificacions push", + "description": "Si us plau, contacta amb l'administrador del teu servidor per a configurar el suport de notificacions push" }, "global": { "heading": "Activa per {{acct}}", @@ -214,6 +231,12 @@ "status": { "heading": "Publicació d'usuaris subscrits" }, + "admin.sign_up": { + "heading": "Administració: Registra" + }, + "admin.report": { + "heading": "Administració: denúncies" + }, "howitworks": "Aprèn com funciona" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Habilitat", - "disabled": "Deshabilitat" - } + "content_true": "Habilitat", + "content_false": "Deshabilitat" }, "update": { "title": "Actualitza a la última versió" @@ -290,9 +311,6 @@ "support": { "heading": "Dona suport al tooot" }, - "review": { - "heading": "Valora al tooot" - }, "contact": { "heading": "Contacta al tooot" }, @@ -330,7 +348,7 @@ "notInLists": "Altres llistes" }, "attachments": { - "name": "Multimèdia de <0 /><1>" + "name": "" }, "hashtag": { "follow": "Segueix", diff --git a/src/i18n/cs/common.json b/src/i18n/cs/common.json index e83caf88..b08510a6 100644 --- a/src/i18n/cs/common.json +++ b/src/i18n/cs/common.json @@ -5,6 +5,7 @@ "cancel": "", "discard": "", "continue": "", + "create": "", "delete": "", "done": "" }, diff --git a/src/i18n/cs/components/timeline.json b/src/i18n/cs/components/timeline.json index 4ed9c372..43556ccc 100644 --- a/src/i18n/cs/components/timeline.json +++ b/src/i18n/cs/components/timeline.json @@ -30,7 +30,9 @@ "default": "", "notification": "" }, - "update": "" + "update": "", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "", "function": "" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/cs/screens/actions.json b/src/i18n/cs/screens/actions.json index 55e9959c..96dce3a8 100644 --- a/src/i18n/cs/screens/actions.json +++ b/src/i18n/cs/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "" - }, - "notificationsFilter": { - "heading": "", - "content": { - "follow": "", - "follow_request": "", - "favourite": "", - "reblog": "", - "mention": "", - "poll": "", - "status": "", - "update": "" - } } } } \ No newline at end of file diff --git a/src/i18n/cs/screens/compose.json b/src/i18n/cs/screens/compose.json index ebf265d9..2a078c68 100644 --- a/src/i18n/cs/screens/compose.json +++ b/src/i18n/cs/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "", "alert": { "title": "", "buttons": { "save": "", - "delete": "", - "cancel": "" + "delete": "" } } }, diff --git a/src/i18n/cs/screens/tabs.json b/src/i18n/cs/screens/tabs.json index c85d6c3c..7fd4a012 100644 --- a/src/i18n/cs/screens/tabs.json +++ b/src/i18n/cs/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "" + "name": "", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "", - "right": "" + "federated": "", + "local": "", + "trending": "" } }, "notifications": { "name": "" - }, - "me": { - "name": "" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityHint": "", + "title": "", + "options": { + "follow": "", + "follow_request": "", + "favourite": "", + "reblog": "", + "mention": "", + "poll": "", + "status": "", + "update": "", + "admin.sign_up": "", + "admin.report": "" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "" }, + "followedTags": { + "name": "" + }, "fontSize": { "name": "" }, @@ -214,6 +231,12 @@ "status": { "heading": "" }, + "admin.sign_up": { + "heading": "" + }, + "admin.report": { + "heading": "" + }, "howitworks": "" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "", - "disabled": "" - } + "content_true": "", + "content_false": "" }, "update": { "title": "" @@ -290,9 +311,6 @@ "support": { "heading": "" }, - "review": { - "heading": "" - }, "contact": { "heading": "" }, diff --git a/src/i18n/de/common.json b/src/i18n/de/common.json index 4e0636a7..904f2597 100644 --- a/src/i18n/de/common.json +++ b/src/i18n/de/common.json @@ -5,8 +5,9 @@ "cancel": "Abbrechen", "discard": "Abbrechen", "continue": "Weiter", + "create": "Erstellen", "delete": "Löschen", - "done": "" + "done": "Fertig" }, "customEmoji": { "accessibilityLabel": "Eigenes Emoji {{emoji}}" diff --git a/src/i18n/de/components/contextMenu.json b/src/i18n/de/components/contextMenu.json index 09a0beb2..881c2913 100644 --- a/src/i18n/de/components/contextMenu.json +++ b/src/i18n/de/components/contextMenu.json @@ -6,7 +6,7 @@ "action_false": "Folgen", "action_true": "Nutzer entfolgen" }, - "inLists": "", + "inLists": "Konten in Listen verwalten", "mute": { "action_false": "Profil stummschalten", "action_true": "Stummschaltung des Nutzers aufheben" diff --git a/src/i18n/de/components/instance.json b/src/i18n/de/components/instance.json index e3d1efdc..3901a0dd 100644 --- a/src/i18n/de/components/instance.json +++ b/src/i18n/de/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "Instanz" + "placeholder": "Domain der Instanz" }, "button": "Login", "information": { diff --git a/src/i18n/de/components/timeline.json b/src/i18n/de/components/timeline.json index 3bd00501..703494bd 100644 --- a/src/i18n/de/components/timeline.json +++ b/src/i18n/de/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} hat geboostet", "notification": "{{name}} hat deinen Tröt geboostet" }, - "update": "Boost wurde bearbeitet" + "update": "Boost wurde bearbeitet", + "admin.sign_up": "{{name}} ist der Instanz beigetreten", + "admin.report": "{{name}} hat gemeldet:" }, "actions": { "reply": { @@ -42,7 +44,7 @@ "options": { "title": "Boost-Sichtbarkeit ändern", "public": "Öffentlicher Boost", - "unlisted": "Boost entfernen" + "unlisted": "Privater Boost" } }, "favourited": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Lesezeichen hinzufügen", "function": "Lesezeichen setzen" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/de/screens/actions.json b/src/i18n/de/screens/actions.json index 5cd3ac4c..938c6238 100644 --- a/src/i18n/de/screens/actions.json +++ b/src/i18n/de/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Alternativtext" - }, - "notificationsFilter": { - "heading": "Benachrichtigungsart anzeigen", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Followeranfrage", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Tröt eines abonnierten Nutzers", - "update": "Boost wurde bearbeitet" - } } } } \ No newline at end of file diff --git a/src/i18n/de/screens/compose.json b/src/i18n/de/screens/compose.json index 303980e9..c03f11b5 100644 --- a/src/i18n/de/screens/compose.json +++ b/src/i18n/de/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Abbrechen", "alert": { "title": "Bearbeitung abbrechen?", "buttons": { "save": "Entwurf speichern", - "delete": "Entwurf löschen", - "cancel": "Abbrechen" + "delete": "Entwurf löschen" } } }, diff --git a/src/i18n/de/screens/tabs.json b/src/i18n/de/screens/tabs.json index 2e0b7e46..ddc2bf9e 100644 --- a/src/i18n/de/screens/tabs.json +++ b/src/i18n/de/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Gefolgt" + "name": "Gefolgt", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Föderiert", - "right": "Lokal" + "federated": "Föderiert", + "local": "Lokal", + "trending": "Im Trend" } }, "notifications": { "name": "Benachrichtigungen" - }, - "me": { - "name": "Über mich" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filter", - "accessibilityHint": "Angezeigte Benachrichtigungstypen filtern" + "accessibilityHint": "Angezeigte Benachrichtigungstypen filtern", + "title": "Benachrichtigungen anzeigen", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Followeranfrage", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Tröt eines abonnierten Nutzers", + "update": "Boost wurde bearbeitet", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Favoriten" }, + "followedTags": { + "name": "Abonnierte Hashtags" + }, "fontSize": { "name": "Schriftgröße" }, @@ -53,7 +70,7 @@ "name": "Benutzer in dieser Liste: {{list}}" }, "listAdd": { - "name": "Eine Liste hinzufügen" + "name": "Eine Liste erstellen" }, "listEdit": { "name": "Listendetails bearbeiten" @@ -179,8 +196,8 @@ "settings": "In den Einstellungen aktivieren" }, "missingServerKey": { - "message": "", - "description": "" + "message": "Server ist nicht für Push-Benachrichtigungen konfiguriert", + "description": "Bitte kontaktiere den Administrator deiner Instanz, um Push-Benachrichtigungen zu ermöglichen" }, "global": { "heading": "Aktivieren für {{acct}}", @@ -214,6 +231,12 @@ "status": { "heading": "Toot eines abonnierten Nutzers" }, + "admin.sign_up": { + "heading": "Admin: Registrierung" + }, + "admin.report": { + "heading": "Admin: Meldungen" + }, "howitworks": "Erfahre, wie das Routing funktioniert" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Aktiviert", - "disabled": "Deaktiviert" - } + "content_true": "Aktiviert", + "content_false": "Deaktiviert" }, "update": { "title": "Auf neueste Version aktualisiert" @@ -290,9 +311,6 @@ "support": { "heading": "Unterstütze Tooot" }, - "review": { - "heading": "Tooot überprüfen" - }, "contact": { "heading": "Nimm Kontakt mit tooot auf" }, @@ -325,12 +343,12 @@ "suspended": "Konto wurde von den Instanzmoderation gesperrt" }, "accountInLists": { - "name": "", - "inLists": "", - "notInLists": "" + "name": "Listen, in denen @{{username}} aufgeführt ist", + "inLists": "In Listen", + "notInLists": "Andere Listen" }, "attachments": { - "name": "<0 /><1>\"s Medien" + "name": "<0 /><1>'s Medien" }, "hashtag": { "follow": "Folgen", diff --git a/src/i18n/en/screens/tabs.json b/src/i18n/en/screens/tabs.json index 6512b438..5d7d1f2d 100644 --- a/src/i18n/en/screens/tabs.json +++ b/src/i18n/en/screens/tabs.json @@ -1,7 +1,11 @@ { "tabs": { "local": { - "name": "Following" + "name": "Following", + "options": { + "showBoosts": "Show boosts", + "showReplies": "Show replies" + } }, "public": { "segments": { @@ -391,7 +395,8 @@ "statuses": { "reblogged_by": "{{count}} boosted", "favourited_by": "{{count}} favourited" - } + }, + "resultIncomplete": "Results from a remote instance is incomplete" } } } \ No newline at end of file diff --git a/src/i18n/es/common.json b/src/i18n/es/common.json index ca8f5ee4..db90f304 100644 --- a/src/i18n/es/common.json +++ b/src/i18n/es/common.json @@ -5,6 +5,7 @@ "cancel": "Cancelar", "discard": "Descartar", "continue": "Continuar", + "create": "Crear", "delete": "Borrar", "done": "Hecho" }, diff --git a/src/i18n/es/components/instance.json b/src/i18n/es/components/instance.json index ab46d601..aa81a637 100644 --- a/src/i18n/es/components/instance.json +++ b/src/i18n/es/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "Dominio de la instancia" + "placeholder": "" }, "button": "Iniciar sesión", "information": { diff --git a/src/i18n/es/components/timeline.json b/src/i18n/es/components/timeline.json index 50304540..9c8607c9 100644 --- a/src/i18n/es/components/timeline.json +++ b/src/i18n/es/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} ha impulsado", "notification": "{{name}} ha impulsado tu toot" }, - "update": "El impulso ha sido editado" + "update": "El impulso ha sido editado", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Añadir este toot en marcadores", "function": "Añadir toot a marcadores" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/es/screens/actions.json b/src/i18n/es/screens/actions.json index 291a1433..a8ddb9ce 100644 --- a/src/i18n/es/screens/actions.json +++ b/src/i18n/es/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Texto alternativo" - }, - "notificationsFilter": { - "heading": "Mostrar tipos de notificación", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Solicitud de seguimiento", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Toot de usuarios suscritos", - "update": "El impulso ha sido editado" - } } } } \ No newline at end of file diff --git a/src/i18n/es/screens/compose.json b/src/i18n/es/screens/compose.json index 60604b07..02e7f647 100644 --- a/src/i18n/es/screens/compose.json +++ b/src/i18n/es/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Cancelar", "alert": { "title": "¿Cancelar edición?", "buttons": { "save": "Guardar borrador", - "delete": "Eliminar borrador", - "cancel": "Cancelar" + "delete": "Eliminar borrador" } } }, diff --git a/src/i18n/es/screens/tabs.json b/src/i18n/es/screens/tabs.json index 61f5dca3..687bbeb8 100644 --- a/src/i18n/es/screens/tabs.json +++ b/src/i18n/es/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Siguiendo" + "name": "Siguiendo", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Federado", - "right": "Local" + "federated": "Federado", + "local": "Local", + "trending": "En tendencia" } }, "notifications": { "name": "Notificaciones" - }, - "me": { - "name": "Sobre mí" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filtrar", - "accessibilityHint": "Filtrar tipos de notificación" + "accessibilityHint": "Filtrar tipos de notificación", + "title": "Mostrar las notificaciones", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Solicitud de seguimiento", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Toot de usuarios suscritos", + "update": "El impulso ha sido editado", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Favoritos" }, + "followedTags": { + "name": "Hashtags seguidos" + }, "fontSize": { "name": "Tamaño de fuente" }, @@ -53,7 +70,7 @@ "name": "Usuarios en la lista: {{list}}" }, "listAdd": { - "name": "Añadir una lista" + "name": "Crea una lista" }, "listEdit": { "name": "Editar detalles de lista" @@ -179,8 +196,8 @@ "settings": "Activar en Ajustes" }, "missingServerKey": { - "message": "", - "description": "" + "message": "Servidor mal configurado para las notificaciones push", + "description": "Por favor, contacte con el administrador de su servidor para configurar el soporte de notificaciones push" }, "global": { "heading": "Habilitar para {{acct}}", @@ -214,6 +231,12 @@ "status": { "heading": "Toot de usuarios suscritos" }, + "admin.sign_up": { + "heading": "Administración: Registrarse" + }, + "admin.report": { + "heading": "Administración: denuncias" + }, "howitworks": "Más información sobre las notificaciones push" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Habilitado", - "disabled": "Deshabilitado" - } + "content_true": "Habilitado", + "content_false": "Deshabilitado" }, "update": { "title": "Actualizar a la última versión" @@ -290,9 +311,6 @@ "support": { "heading": "Apoyar tooot" }, - "review": { - "heading": "Valorar tooot" - }, "contact": { "heading": "Contactar tooot" }, @@ -330,7 +348,7 @@ "notInLists": "Otras listas" }, "attachments": { - "name": "Multimedia de <0 /><1>" + "name": "" }, "hashtag": { "follow": "Seguir", diff --git a/src/i18n/fr/common.json b/src/i18n/fr/common.json index 0b47114c..af8479b8 100644 --- a/src/i18n/fr/common.json +++ b/src/i18n/fr/common.json @@ -3,8 +3,9 @@ "OK": "Ok", "apply": "Confirmer", "cancel": "Annuler", - "discard": "", - "continue": "", + "discard": "Ne pas tenir compte", + "continue": "Continuer", + "create": "", "delete": "", "done": "" }, @@ -24,7 +25,7 @@ }, "separator": ", ", "discard": { - "title": "", - "message": "" + "title": "Modifications non sauvegardées", + "message": "Votre modification n'a pas été enregistrée. Voulez-vous annuler l'enregistrement des modifications ?" } } \ No newline at end of file diff --git a/src/i18n/fr/components/contextMenu.json b/src/i18n/fr/components/contextMenu.json index 3de56f9c..426a9834 100644 --- a/src/i18n/fr/components/contextMenu.json +++ b/src/i18n/fr/components/contextMenu.json @@ -3,7 +3,7 @@ "account": { "title": "Actions de l'utilisateur", "following": { - "action_false": "", + "action_false": "Suivre l'utilisateur", "action_true": "" }, "inLists": "", @@ -20,7 +20,7 @@ } }, "at": { - "direct": "", + "direct": "Message direct", "public": "" }, "copy": { diff --git a/src/i18n/fr/components/instance.json b/src/i18n/fr/components/instance.json index 7bea5931..a0300b8f 100644 --- a/src/i18n/fr/components/instance.json +++ b/src/i18n/fr/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "Domaine d'instance" + "placeholder": "" }, "button": "Connexion", "information": { diff --git a/src/i18n/fr/components/timeline.json b/src/i18n/fr/components/timeline.json index 8e417da4..27665adc 100644 --- a/src/i18n/fr/components/timeline.json +++ b/src/i18n/fr/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} a partagé", "notification": "{{name}} a partagé votre message" }, - "update": "Le reblog a été modifié" + "update": "Le reblog a été modifié", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Ajouter ce pouet aux signets", "function": "Pouet de signet" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/fr/screens/actions.json b/src/i18n/fr/screens/actions.json index bf32e39c..ad1ac1af 100644 --- a/src/i18n/fr/screens/actions.json +++ b/src/i18n/fr/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Texte de remplacement" - }, - "notificationsFilter": { - "heading": "Afficher les notifications", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Demande d'abonnement", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Pouet des utilisateurs abonnés", - "update": "Le reblog a été modifié" - } } } } \ No newline at end of file diff --git a/src/i18n/fr/screens/compose.json b/src/i18n/fr/screens/compose.json index 7fd65c95..de0fbf17 100644 --- a/src/i18n/fr/screens/compose.json +++ b/src/i18n/fr/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Abandonner", "alert": { "title": "Annuler l’édition?", "buttons": { "save": "Enregistrer comme brouillon", - "delete": "Supprimer le brouillon", - "cancel": "Abandonner" + "delete": "Supprimer le brouillon" } } }, diff --git a/src/i18n/fr/screens/tabs.json b/src/i18n/fr/screens/tabs.json index 63032f59..29bc2d53 100644 --- a/src/i18n/fr/screens/tabs.json +++ b/src/i18n/fr/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Suit" + "name": "Suit", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Fédéré", - "right": "Local" + "federated": "Fédéré", + "local": "Local", + "trending": "" } }, "notifications": { "name": "Notifications" - }, - "me": { - "name": "À propos de moi" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filtrer", - "accessibilityHint": "Filtrer les types de notifications affichés" + "accessibilityHint": "Filtrer les types de notifications affichés", + "title": "", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Demande d'abonnement", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Pouet des utilisateurs inscrits", + "update": "Le reblog a été modifié", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Favoris" }, + "followedTags": { + "name": "" + }, "fontSize": { "name": "Taille de la police de Pouet" }, @@ -214,6 +231,12 @@ "status": { "heading": "Pouet des utilisateurs inscrits" }, + "admin.sign_up": { + "heading": "" + }, + "admin.report": { + "heading": "" + }, "howitworks": "Apprenez comment cela fonctionne" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Activé", - "disabled": "Désactivé" - } + "content_true": "Activé", + "content_false": "Désactivé" }, "update": { "title": "Mettre à jour vers la dernière version" @@ -290,9 +311,6 @@ "support": { "heading": "Support de tooot" }, - "review": { - "heading": "Examiner le tooot" - }, "contact": { "heading": "Contacter tooot" }, @@ -330,7 +348,7 @@ "notInLists": "" }, "attachments": { - "name": "<0 /><1>\"s media" + "name": "" }, "hashtag": { "follow": "Suivre", diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts index d0b71546..9ad75d91 100644 --- a/src/i18n/i18n.ts +++ b/src/i18n/i18n.ts @@ -12,6 +12,7 @@ import ko from '@root/i18n/ko' import nl from '@root/i18n/nl' import pt_BR from '@root/i18n/pt_BR' import sv from '@root/i18n/sv' +import uk from '@root/i18n/uk' import vi from '@root/i18n/vi' import zh_Hans from '@root/i18n/zh-Hans' import zh_Hant from '@root/i18n/zh-Hant' @@ -31,6 +32,7 @@ import '@formatjs/intl-pluralrules/locale-data/ko' import '@formatjs/intl-pluralrules/locale-data/nl' import '@formatjs/intl-pluralrules/locale-data/pt' import '@formatjs/intl-pluralrules/locale-data/sv' +import '@formatjs/intl-pluralrules/locale-data/uk' import '@formatjs/intl-pluralrules/locale-data/vi' import '@formatjs/intl-pluralrules/locale-data/zh' @@ -46,6 +48,7 @@ import '@formatjs/intl-numberformat/locale-data/ko' import '@formatjs/intl-numberformat/locale-data/nl' import '@formatjs/intl-numberformat/locale-data/pt' import '@formatjs/intl-numberformat/locale-data/sv' +import '@formatjs/intl-numberformat/locale-data/uk' import '@formatjs/intl-numberformat/locale-data/vi' import '@formatjs/intl-numberformat/locale-data/zh-Hans' import '@formatjs/intl-numberformat/locale-data/zh-Hant' @@ -62,6 +65,7 @@ import '@formatjs/intl-datetimeformat/locale-data/ko' import '@formatjs/intl-datetimeformat/locale-data/nl' import '@formatjs/intl-datetimeformat/locale-data/pt' import '@formatjs/intl-datetimeformat/locale-data/sv' +import '@formatjs/intl-datetimeformat/locale-data/uk' import '@formatjs/intl-datetimeformat/locale-data/vi' import '@formatjs/intl-datetimeformat/locale-data/zh-Hans' import '@formatjs/intl-datetimeformat/locale-data/zh-Hant' @@ -79,6 +83,7 @@ import '@formatjs/intl-relativetimeformat/locale-data/ko' import '@formatjs/intl-relativetimeformat/locale-data/nl' import '@formatjs/intl-relativetimeformat/locale-data/pt' import '@formatjs/intl-relativetimeformat/locale-data/sv' +import '@formatjs/intl-relativetimeformat/locale-data/uk' import '@formatjs/intl-relativetimeformat/locale-data/vi' import '@formatjs/intl-relativetimeformat/locale-data/zh-Hans' import '@formatjs/intl-relativetimeformat/locale-data/zh-Hant' @@ -102,6 +107,7 @@ i18n.use(initReactI18next).init({ nl, 'pt-BR': pt_BR, sv, + uk, vi, 'zh-Hans': zh_Hans, 'zh-Hant': zh_Hant diff --git a/src/i18n/it/common.json b/src/i18n/it/common.json index daed31b9..32526501 100644 --- a/src/i18n/it/common.json +++ b/src/i18n/it/common.json @@ -3,8 +3,9 @@ "OK": "OK", "apply": "Applica", "cancel": "Annulla", - "discard": "", - "continue": "", + "discard": "Scarta", + "continue": "Continua", + "create": "", "delete": "", "done": "" }, @@ -24,7 +25,7 @@ }, "separator": ", ", "discard": { - "title": "", - "message": "" + "title": "Modifiche non salvate", + "message": "Le tue modifiche non sono state salvate. Vuoi scartarle?" } } \ No newline at end of file diff --git a/src/i18n/it/components/contextMenu.json b/src/i18n/it/components/contextMenu.json index 7f216bf5..d3777054 100644 --- a/src/i18n/it/components/contextMenu.json +++ b/src/i18n/it/components/contextMenu.json @@ -3,7 +3,7 @@ "account": { "title": "Azioni utente", "following": { - "action_false": "", + "action_false": "Segui utente", "action_true": "" }, "inLists": "", @@ -20,7 +20,7 @@ } }, "at": { - "direct": "", + "direct": "Messaggio diretto", "public": "" }, "copy": { diff --git a/src/i18n/it/components/instance.json b/src/i18n/it/components/instance.json index 4919837e..b69f1f9f 100644 --- a/src/i18n/it/components/instance.json +++ b/src/i18n/it/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "Dominio dell'istanza" + "placeholder": "" }, "button": "Accedi", "information": { diff --git a/src/i18n/it/components/timeline.json b/src/i18n/it/components/timeline.json index 3b1a40c6..ae7895be 100644 --- a/src/i18n/it/components/timeline.json +++ b/src/i18n/it/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} ha ricondiviso", "notification": "{{name}} ha ricondiviso il tuo toot" }, - "update": "Il link è stato modificato" + "update": "Il link è stato modificato", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Aggiungi questo toot ai segnalibri", "function": "Aggiungi toot ai segnalibri" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/it/screens/actions.json b/src/i18n/it/screens/actions.json index b428b43c..87c42f64 100644 --- a/src/i18n/it/screens/actions.json +++ b/src/i18n/it/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Testo descrittivo" - }, - "notificationsFilter": { - "heading": "Filtra notifiche per tipo", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Richiesta di seguirti", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Toot da utenti seguiti", - "update": "Retoot ha subito una modifica" - } } } } \ No newline at end of file diff --git a/src/i18n/it/screens/compose.json b/src/i18n/it/screens/compose.json index 589f34b1..76860e01 100644 --- a/src/i18n/it/screens/compose.json +++ b/src/i18n/it/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Annulla", "alert": { "title": "Scartare il toot?", "buttons": { "save": "Salva bozza", - "delete": "Elimina bozza", - "cancel": "Annulla" + "delete": "Elimina bozza" } } }, diff --git a/src/i18n/it/screens/tabs.json b/src/i18n/it/screens/tabs.json index f097708a..7a69ec75 100644 --- a/src/i18n/it/screens/tabs.json +++ b/src/i18n/it/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Home" + "name": "Home", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Federazione", - "right": "Locale" + "federated": "Federazione", + "local": "Locale", + "trending": "" } }, "notifications": { "name": "Notifiche" - }, - "me": { - "name": "Profilo" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filtri", - "accessibilityHint": "Filtra le notifiche mostrate per tipo" + "accessibilityHint": "Filtra le notifiche mostrate per tipo", + "title": "", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Richiesta di seguirti", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Toot da utenti seguiti", + "update": "Il link è stato modificato", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Apprezzati" }, + "followedTags": { + "name": "" + }, "fontSize": { "name": "Grandezza del testo dei toot" }, @@ -214,6 +231,12 @@ "status": { "heading": "Toot da utenti seguiti" }, + "admin.sign_up": { + "heading": "" + }, + "admin.report": { + "heading": "" + }, "howitworks": "Scopri come funziona il traversamento dei messaggi" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Abilitato", - "disabled": "Disabilitato" - } + "content_true": "Abilitato", + "content_false": "Disabilitato" }, "update": { "title": "Aggiorna all'ultima versione" @@ -290,9 +311,6 @@ "support": { "heading": "Supporta tooot" }, - "review": { - "heading": "Recensisci tooot" - }, "contact": { "heading": "Contatta tooot" }, @@ -330,7 +348,7 @@ "notInLists": "" }, "attachments": { - "name": "Media di <0 /><1>\"" + "name": "" }, "hashtag": { "follow": "Segui", diff --git a/src/i18n/ja/common.json b/src/i18n/ja/common.json index b2f8b369..f774e735 100644 --- a/src/i18n/ja/common.json +++ b/src/i18n/ja/common.json @@ -5,6 +5,7 @@ "cancel": "キャンセル", "discard": "変更を破棄", "continue": "続ける", + "create": "", "delete": "削除", "done": "完了" }, diff --git a/src/i18n/ja/components/timeline.json b/src/i18n/ja/components/timeline.json index f7ae3da2..519101c3 100644 --- a/src/i18n/ja/components/timeline.json +++ b/src/i18n/ja/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}}さんがブースト", "notification": "{{name}}さんがあなたのトゥートをブーストしました" }, - "update": "ブーストしたトゥートが編集されました" + "update": "ブーストしたトゥートが編集されました", + "admin.sign_up": "{{name}} がインスタンスに参加しました", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "このトゥートをブックマークに追加", "function": "ブックマークトゥート" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/ja/screens/actions.json b/src/i18n/ja/screens/actions.json index d407ed96..0390d4cb 100644 --- a/src/i18n/ja/screens/actions.json +++ b/src/i18n/ja/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "代替テキスト" - }, - "notificationsFilter": { - "heading": "通知の種類を表示", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "フォローリクエスト", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "購読中のユーザーからのトゥート", - "update": "リブログが編集されました" - } } } } \ No newline at end of file diff --git a/src/i18n/ja/screens/compose.json b/src/i18n/ja/screens/compose.json index 31cb0bf8..f39cb2eb 100644 --- a/src/i18n/ja/screens/compose.json +++ b/src/i18n/ja/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "キャンセル", "alert": { "title": "編集をキャンセルしますか?", "buttons": { "save": "下書きを保存", - "delete": "下書きを削除", - "cancel": "キャンセル" + "delete": "下書きを削除" } } }, diff --git a/src/i18n/ja/screens/tabs.json b/src/i18n/ja/screens/tabs.json index 0e4c4939..8cdf0b08 100644 --- a/src/i18n/ja/screens/tabs.json +++ b/src/i18n/ja/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "ホーム" + "name": "ホーム", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "連合", - "right": "ローカル" + "federated": "連合", + "local": "ローカル", + "trending": "トレンド" } }, "notifications": { "name": "通知" - }, - "me": { - "name": "私について" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "フィルター", - "accessibilityHint": "表示される通知の種類をフィルターする" + "accessibilityHint": "表示される通知の種類をフィルターする", + "title": "", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "フォローリクエスト", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "購読したユーザーのトゥート", + "update": "ブーストしたトゥートが編集されました", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "お気に入り" }, + "followedTags": { + "name": "" + }, "fontSize": { "name": "トゥートのフォントサイズ" }, @@ -53,7 +70,7 @@ "name": "リスト {{list}} のユーザー" }, "listAdd": { - "name": "リストに追加" + "name": "" }, "listEdit": { "name": "リストの詳細を編集" @@ -214,6 +231,12 @@ "status": { "heading": "購読したユーザーのトゥート" }, + "admin.sign_up": { + "heading": "" + }, + "admin.report": { + "heading": "" + }, "howitworks": "通知到達(routing)のしくみを学ぶ" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "有効", - "disabled": "無効" - } + "content_true": "有効", + "content_false": "無効" }, "update": { "title": "最新バージョンへのアップデート" @@ -290,9 +311,6 @@ "support": { "heading": "tooot をサポート" }, - "review": { - "heading": "tooot をレビュー" - }, "contact": { "heading": "tooot に関する連絡" }, @@ -330,7 +348,7 @@ "notInLists": "その他のリスト" }, "attachments": { - "name": "<0 /><1>\" のメディア" + "name": "<0 /><1>のメディア" }, "hashtag": { "follow": "フォロー", diff --git a/src/i18n/ko/common.json b/src/i18n/ko/common.json index d6a3c406..ce49034d 100644 --- a/src/i18n/ko/common.json +++ b/src/i18n/ko/common.json @@ -5,6 +5,7 @@ "cancel": "취소", "discard": "취소", "continue": "계속", + "create": "", "delete": "삭제", "done": "완료" }, diff --git a/src/i18n/ko/components/contextMenu.json b/src/i18n/ko/components/contextMenu.json index 976a20b2..5033a27a 100644 --- a/src/i18n/ko/components/contextMenu.json +++ b/src/i18n/ko/components/contextMenu.json @@ -20,8 +20,8 @@ } }, "at": { - "direct": "", - "public": "" + "direct": "개인 메시지", + "public": "공개 메시지" }, "copy": { "action": "툿 복사", diff --git a/src/i18n/ko/components/instance.json b/src/i18n/ko/components/instance.json index c673b5ce..6b717955 100644 --- a/src/i18n/ko/components/instance.json +++ b/src/i18n/ko/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "인스턴스의 도메인" + "placeholder": "" }, "button": "로그인", "information": { diff --git a/src/i18n/ko/components/timeline.json b/src/i18n/ko/components/timeline.json index 8d2d0e6f..1da04abd 100644 --- a/src/i18n/ko/components/timeline.json +++ b/src/i18n/ko/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} 님이 부스트했어요", "notification": "{{name}} 님이 내 툿을 부스트했어요" }, - "update": "리블로그가 수정됨" + "update": "부스트한 툿이 수정됨", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "툿 북마크에 추가", "function": "툿 북마크" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/ko/screens/actions.json b/src/i18n/ko/screens/actions.json index 03919b20..c1f87f17 100644 --- a/src/i18n/ko/screens/actions.json +++ b/src/i18n/ko/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "대체 텍스트" - }, - "notificationsFilter": { - "heading": "알림 종류 표시", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "팔로우 요청", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "구독한 사용자의 툿", - "update": "리블로그가 수정되었습니다." - } } } } \ No newline at end of file diff --git a/src/i18n/ko/screens/compose.json b/src/i18n/ko/screens/compose.json index c96f785b..dbab2698 100644 --- a/src/i18n/ko/screens/compose.json +++ b/src/i18n/ko/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "취소", "alert": { "title": "작성을 취소할까요?", "buttons": { "save": "임시 저장", - "delete": "임시 저장한 내용 삭제", - "cancel": "취소" + "delete": "임시 저장한 내용 삭제" } } }, diff --git a/src/i18n/ko/screens/tabs.json b/src/i18n/ko/screens/tabs.json index 37212eb9..4c0ac658 100644 --- a/src/i18n/ko/screens/tabs.json +++ b/src/i18n/ko/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "팔로우 중" + "name": "팔로우 중", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "연합", - "right": "로컬" + "federated": "연합", + "local": "로컬", + "trending": "" } }, "notifications": { "name": "알림" - }, - "me": { - "name": "내 소개" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "필터", - "accessibilityHint": "받는 알림 종류 선택" + "accessibilityHint": "받는 알림 종류 선택", + "title": "", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "팔로우 요청", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "구독한 사용자의 툿", + "update": "부스트한 툿이 수정됨", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "즐겨찾기" }, + "followedTags": { + "name": "" + }, "fontSize": { "name": "툿 폰트 크기" }, @@ -53,7 +70,7 @@ "name": "{{list}} 리스트의 사용자" }, "listAdd": { - "name": "리스트에 추가" + "name": "" }, "listEdit": { "name": "리스트 상세 편집" @@ -179,8 +196,8 @@ "settings": "설정에서 활성화" }, "missingServerKey": { - "message": "", - "description": "" + "message": "서버가 푸시를 지원하지 않음", + "description": "서버 관리자에게 푸시 알림을 지원하도록 문의해주세요" }, "global": { "heading": "{{acct}} 활성화", @@ -214,6 +231,12 @@ "status": { "heading": "구독한 사용자의 툿" }, + "admin.sign_up": { + "heading": "" + }, + "admin.report": { + "heading": "" + }, "howitworks": "메시지 라우팅 방식 더 알아보기" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "활성화됨", - "disabled": "비활성화됨" - } + "content_true": "활성화됨", + "content_false": "비활성화됨" }, "update": { "title": "최신 버전으로 업데이트" @@ -290,9 +311,6 @@ "support": { "heading": "tooot 기부" }, - "review": { - "heading": "tooot 리뷰" - }, "contact": { "heading": "tooot 연락" }, @@ -330,7 +348,7 @@ "notInLists": "다른 리스트" }, "attachments": { - "name": "<0 /><1>의 미디어" + "name": "" }, "hashtag": { "follow": "팔로우", diff --git a/src/i18n/locales.ts b/src/i18n/locales.ts index 44ef48dc..df5a7f33 100644 --- a/src/i18n/locales.ts +++ b/src/i18n/locales.ts @@ -10,6 +10,7 @@ const LOCALES = { nl: 'Nederlands', 'pt-br': 'Português (Brasil)', sv: 'Svenska', + uk: 'українська', vi: 'Tiếng Việt', 'zh-hans': '简体中文', 'zh-hant': '繁體中文' diff --git a/src/i18n/nl/common.json b/src/i18n/nl/common.json index 02c05685..e9a502bd 100644 --- a/src/i18n/nl/common.json +++ b/src/i18n/nl/common.json @@ -5,6 +5,7 @@ "cancel": "Annuleer", "discard": "Verwijder", "continue": "Ga verder", + "create": "Maak", "delete": "Verwijder", "done": "Gereed" }, diff --git a/src/i18n/nl/components/timeline.json b/src/i18n/nl/components/timeline.json index 68e68fee..6fe4786b 100644 --- a/src/i18n/nl/components/timeline.json +++ b/src/i18n/nl/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} boostte", "notification": "{{name}} boostte jouw toot" }, - "update": "De reblog is bewerkt" + "update": "De reblog is bewerkt", + "admin.sign_up": "{{name}} heeft zich aangesloten bij de instantie", + "admin.report": "{{name}} rapporteerde:" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Toot toevoegen aan bladwijzers", "function": "Voeg deze toot toe aan bladwijzers" - } + }, + "openReport": "Rapportage openen" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/nl/screens/actions.json b/src/i18n/nl/screens/actions.json index 519e01a5..d9b0d313 100644 --- a/src/i18n/nl/screens/actions.json +++ b/src/i18n/nl/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Alternatieve tekst" - }, - "notificationsFilter": { - "heading": "Melding soorten weergeven", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Volgverzoek", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Toot van geabonneerde gebruikers", - "update": "De reblog is bewerkt" - } } } } \ No newline at end of file diff --git a/src/i18n/nl/screens/compose.json b/src/i18n/nl/screens/compose.json index d14dc421..00a0a43c 100644 --- a/src/i18n/nl/screens/compose.json +++ b/src/i18n/nl/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Annuleer", "alert": { "title": "Bewerken annuleren?", "buttons": { "save": "Concept opslaan", - "delete": "Concept verwijderen", - "cancel": "Annuleer" + "delete": "Concept verwijderen" } } }, diff --git a/src/i18n/nl/screens/tabs.json b/src/i18n/nl/screens/tabs.json index c15cc96d..cd60cc59 100644 --- a/src/i18n/nl/screens/tabs.json +++ b/src/i18n/nl/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Volgend" + "name": "Volgend", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Globaal", - "right": "Lokaal" + "federated": "Globaal", + "local": "Lokaal", + "trending": "Trending" } }, "notifications": { "name": "Meldingen" - }, - "me": { - "name": "Over mij" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filter", - "accessibilityHint": "Filter getoonde meldingstypes" + "accessibilityHint": "Filter getoonde meldingstypes", + "title": "Notificaties weergeven", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Volgverzoek", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Toot van geabonneerde gebruikers", + "update": "De reblog is bewerkt", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Favorieten" }, + "followedTags": { + "name": "Gevolgde hashtags" + }, "fontSize": { "name": "Grootte van lettertype" }, @@ -53,7 +70,7 @@ "name": "Gebruikers in de lijst: {{list}}" }, "listAdd": { - "name": "Lijst toevoegen" + "name": "Lijst aanmaken" }, "listEdit": { "name": "Lijstdetails bewerken" @@ -179,8 +196,8 @@ "settings": "Inschakelen in instellingen" }, "missingServerKey": { - "message": "", - "description": "" + "message": "Server is verkeerd geconfigureerd voor push", + "description": "Neem contact op met de serverbeheerder om push-ondersteuning te configureren" }, "global": { "heading": "Inschakelen voor {{acct}}", @@ -214,6 +231,12 @@ "status": { "heading": "Toot van geabonneerde gebruikers" }, + "admin.sign_up": { + "heading": "Admin: registreren" + }, + "admin.report": { + "heading": "Admin: rapporten" + }, "howitworks": "Leer hoe het werkt" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Ingeschakeld", - "disabled": "Uitgeschakeld" - } + "content_true": "Ingeschakeld", + "content_false": "Uitgeschakeld" }, "update": { "title": "Bijwerken naar de laatste versie" @@ -290,9 +311,6 @@ "support": { "heading": "Tooot ondersteunen" }, - "review": { - "heading": "Tooot beoordelen" - }, "contact": { "heading": "Tooot contacteren" }, @@ -330,7 +348,7 @@ "notInLists": "Andere lijsten" }, "attachments": { - "name": "<0 /><1>\"s media" + "name": "<0 /><1>'s media" }, "hashtag": { "follow": "Volg", diff --git a/src/i18n/pl/common.json b/src/i18n/pl/common.json index 59af91e9..fe4bfc45 100644 --- a/src/i18n/pl/common.json +++ b/src/i18n/pl/common.json @@ -3,9 +3,10 @@ "OK": "Ok", "apply": "Zastosuj", "cancel": "Anuluj", - "discard": "", - "continue": "", - "delete": "", + "discard": "Anuluj", + "continue": "Dalej", + "create": "", + "delete": "Usuń", "done": "" }, "customEmoji": { @@ -24,7 +25,7 @@ }, "separator": ", ", "discard": { - "title": "", - "message": "" + "title": "Zmiany nie zostały zapisane", + "message": "Wyjść bez zapisania zmian?" } } \ No newline at end of file diff --git a/src/i18n/pl/components/contextMenu.json b/src/i18n/pl/components/contextMenu.json index 89d1e76e..5a921a57 100644 --- a/src/i18n/pl/components/contextMenu.json +++ b/src/i18n/pl/components/contextMenu.json @@ -3,8 +3,8 @@ "account": { "title": "", "following": { - "action_false": "", - "action_true": "" + "action_false": "Obserwuj", + "action_true": "Przestań obserwować" }, "inLists": "", "mute": { @@ -16,7 +16,7 @@ "action_true": "" }, "reports": { - "action": "" + "action": "Zgłoś i zablokuj" } }, "at": { diff --git a/src/i18n/pl/components/timeline.json b/src/i18n/pl/components/timeline.json index 50d15c09..d823a1d1 100644 --- a/src/i18n/pl/components/timeline.json +++ b/src/i18n/pl/components/timeline.json @@ -30,7 +30,9 @@ "default": "", "notification": "" }, - "update": "" + "update": "", + "admin.sign_up": "{{name}} dołącza do instancji", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "", "function": "" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/pl/screens/actions.json b/src/i18n/pl/screens/actions.json index 55e9959c..96dce3a8 100644 --- a/src/i18n/pl/screens/actions.json +++ b/src/i18n/pl/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "" - }, - "notificationsFilter": { - "heading": "", - "content": { - "follow": "", - "follow_request": "", - "favourite": "", - "reblog": "", - "mention": "", - "poll": "", - "status": "", - "update": "" - } } } } \ No newline at end of file diff --git a/src/i18n/pl/screens/compose.json b/src/i18n/pl/screens/compose.json index ebf265d9..2a078c68 100644 --- a/src/i18n/pl/screens/compose.json +++ b/src/i18n/pl/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "", "alert": { "title": "", "buttons": { "save": "", - "delete": "", - "cancel": "" + "delete": "" } } }, diff --git a/src/i18n/pl/screens/tabs.json b/src/i18n/pl/screens/tabs.json index c85d6c3c..18f3e2b8 100644 --- a/src/i18n/pl/screens/tabs.json +++ b/src/i18n/pl/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "" + "name": "", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "", - "right": "" + "federated": "", + "local": "", + "trending": "" } }, "notifications": { "name": "" - }, - "me": { - "name": "" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityHint": "", + "title": "", + "options": { + "follow": "", + "follow_request": "", + "favourite": "", + "reblog": "", + "mention": "", + "poll": "", + "status": "", + "update": "", + "admin.sign_up": "", + "admin.report": "" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "" }, + "followedTags": { + "name": "" + }, "fontSize": { "name": "" }, @@ -50,13 +67,13 @@ "name": "" }, "listAccounts": { - "name": "" + "name": "Użytkownicy: {{list}}" }, "listAdd": { "name": "" }, "listEdit": { - "name": "" + "name": "Edycja listy" }, "lists": { "name": "" @@ -97,27 +114,27 @@ } }, "listAccounts": { - "heading": "", - "error": "", - "empty": "" + "heading": "Zarządzanie użytkownikami", + "error": "Usuń z listy", + "empty": "Brak użytkowników na liście" }, "listEdit": { - "heading": "", - "title": "", + "heading": "Edytuj szczegóły", + "title": "Nazwa listy", "repliesPolicy": { - "heading": "", + "heading": "Odpowiedzi będą widoczne dla:", "options": { - "none": "", - "list": "", - "followed": "" + "none": "Nikogo", + "list": "Członków listy", + "followed": "Wszystkich obserwowanych" } } }, "listDelete": { - "heading": "", + "heading": "Usuń listę", "confirm": { - "title": "", - "message": "" + "title": "Usunąć listę \"{{list}}\"?", + "message": "Nie będzie można cofnąć tej czynności." } }, "profile": { @@ -214,6 +231,12 @@ "status": { "heading": "" }, + "admin.sign_up": { + "heading": "" + }, + "admin.report": { + "heading": "" + }, "howitworks": "" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "", - "disabled": "" - } + "content_true": "", + "content_false": "" }, "update": { "title": "" @@ -290,9 +311,6 @@ "support": { "heading": "" }, - "review": { - "heading": "" - }, "contact": { "heading": "" }, @@ -356,7 +374,7 @@ } }, "trending": { - "tags": "" + "tags": "Popularne tagi" } }, "sections": { diff --git a/src/i18n/pt_BR/common.json b/src/i18n/pt_BR/common.json index 7b9190b2..64a8c15e 100644 --- a/src/i18n/pt_BR/common.json +++ b/src/i18n/pt_BR/common.json @@ -3,8 +3,9 @@ "OK": "OK", "apply": "Aplicar", "cancel": "Cancelar", - "discard": "", - "continue": "", + "discard": "Descartar", + "continue": "Continuar", + "create": "", "delete": "", "done": "" }, @@ -24,7 +25,7 @@ }, "separator": ", ", "discard": { - "title": "", - "message": "" + "title": "Alterações não salvas", + "message": "Sua alteração não foi salva. Descartar as alterações?" } } \ No newline at end of file diff --git a/src/i18n/pt_BR/components/contextMenu.json b/src/i18n/pt_BR/components/contextMenu.json index 5386e2cf..16215c48 100644 --- a/src/i18n/pt_BR/components/contextMenu.json +++ b/src/i18n/pt_BR/components/contextMenu.json @@ -3,7 +3,7 @@ "account": { "title": "Ações do Usuário", "following": { - "action_false": "", + "action_false": "Seguir usuário", "action_true": "" }, "inLists": "", @@ -20,7 +20,7 @@ } }, "at": { - "direct": "", + "direct": "Mensagem Direta", "public": "" }, "copy": { diff --git a/src/i18n/pt_BR/components/instance.json b/src/i18n/pt_BR/components/instance.json index 5266bfd0..22e4347c 100644 --- a/src/i18n/pt_BR/components/instance.json +++ b/src/i18n/pt_BR/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "Domínio da instância" + "placeholder": "" }, "button": "Entrar", "information": { diff --git a/src/i18n/pt_BR/components/timeline.json b/src/i18n/pt_BR/components/timeline.json index 83fc834e..edb698f3 100644 --- a/src/i18n/pt_BR/components/timeline.json +++ b/src/i18n/pt_BR/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} boostou", "notification": "{{name}} deu boost no teu toot" }, - "update": "Toot foi editado" + "update": "Toot foi editado", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Adicionar este toot aos favoritos", "function": "Salvos" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/pt_BR/screens/actions.json b/src/i18n/pt_BR/screens/actions.json index fa615e27..ed8b457d 100644 --- a/src/i18n/pt_BR/screens/actions.json +++ b/src/i18n/pt_BR/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Texto Alternativo" - }, - "notificationsFilter": { - "heading": "Exibir notificações", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Seguidores pendentes", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Toot de usuários inscritos", - "update": "Toot foi editado" - } } } } \ No newline at end of file diff --git a/src/i18n/pt_BR/screens/compose.json b/src/i18n/pt_BR/screens/compose.json index 0af03ec4..d58a56b3 100644 --- a/src/i18n/pt_BR/screens/compose.json +++ b/src/i18n/pt_BR/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Cancelar", "alert": { "title": "Cancelar edições?", "buttons": { "save": "Salvar rascunho", - "delete": "Apagar rascunho", - "cancel": "Cancelar" + "delete": "Apagar rascunho" } } }, diff --git a/src/i18n/pt_BR/screens/tabs.json b/src/i18n/pt_BR/screens/tabs.json index fdf9fcd3..105fda29 100644 --- a/src/i18n/pt_BR/screens/tabs.json +++ b/src/i18n/pt_BR/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Seguindo" + "name": "Seguindo", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Global", - "right": "Local" + "federated": "Global", + "local": "Local", + "trending": "" } }, "notifications": { "name": "Notificações" - }, - "me": { - "name": "Sobre mim" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filtro", - "accessibilityHint": "Filtrar notificações por tipos" + "accessibilityHint": "Filtrar notificações por tipos", + "title": "", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Solicitações de seguidores pendentes", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Toot de usuários inscritos", + "update": "Toot foi editado", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Favoritos" }, + "followedTags": { + "name": "" + }, "fontSize": { "name": "Tamanho da fonte do Toot" }, @@ -214,6 +231,12 @@ "status": { "heading": "Toot de usuários inscritos" }, + "admin.sign_up": { + "heading": "" + }, + "admin.report": { + "heading": "" + }, "howitworks": "Saiba como funciona o roteamento" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Habilitado", - "disabled": "Desabilitado" - } + "content_true": "Habilitado", + "content_false": "Desabilitado" }, "update": { "title": "Atualize para a versão mais recente" @@ -290,9 +311,6 @@ "support": { "heading": "Suporte tooot" }, - "review": { - "heading": "Revisar tooot" - }, "contact": { "heading": "Contatar tooot" }, @@ -322,7 +340,7 @@ "default": "Toots", "all": "Toots e respostas" }, - "suspended": "" + "suspended": "Conta suspensa pelos moderadores do seu servidor" }, "accountInLists": { "name": "", @@ -330,7 +348,7 @@ "notInLists": "" }, "attachments": { - "name": "<0 /><1>\"s mídia" + "name": "" }, "hashtag": { "follow": "Seguir", diff --git a/src/i18n/sv/common.json b/src/i18n/sv/common.json index bea4cce8..f1695c0c 100644 --- a/src/i18n/sv/common.json +++ b/src/i18n/sv/common.json @@ -5,6 +5,7 @@ "cancel": "Avbryt", "discard": "Kasta bort", "continue": "Fortsätt", + "create": "Skapa", "delete": "Radera", "done": "Klar" }, diff --git a/src/i18n/sv/components/timeline.json b/src/i18n/sv/components/timeline.json index 488048e4..9f9bf022 100644 --- a/src/i18n/sv/components/timeline.json +++ b/src/i18n/sv/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} boostade", "notification": "{{name}} boostade ditt inlägg" }, - "update": "Boosten har redigerats" + "update": "Boosten har redigerats", + "admin.sign_up": "{{name}} registrerade sig på servern", + "admin.report": "{{name}} rapporterade:" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Lägg till detta inlägg till dina bokmärken", "function": "Bokmärk inlägg" - } + }, + "openReport": "Öppna rapport" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/sv/screens/actions.json b/src/i18n/sv/screens/actions.json index 347390cf..938c6238 100644 --- a/src/i18n/sv/screens/actions.json +++ b/src/i18n/sv/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Alternativtext" - }, - "notificationsFilter": { - "heading": "Visa notistyper", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Följarförfrågning", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Inlägg från följda användare", - "update": "Boosten har redigerats" - } } } } \ No newline at end of file diff --git a/src/i18n/sv/screens/compose.json b/src/i18n/sv/screens/compose.json index 001fd497..747df7fa 100644 --- a/src/i18n/sv/screens/compose.json +++ b/src/i18n/sv/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Avbryt", "alert": { "title": "Avbryt redigering?", "buttons": { "save": "Spara utkast", - "delete": "Ta bort utkast", - "cancel": "Avbryt" + "delete": "Ta bort utkast" } } }, diff --git a/src/i18n/sv/screens/tabs.json b/src/i18n/sv/screens/tabs.json index 44f78632..3a890127 100644 --- a/src/i18n/sv/screens/tabs.json +++ b/src/i18n/sv/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Följer" + "name": "Följer", + "options": { + "showBoosts": "Visa boostar", + "showReplies": "Visa svar" + } }, "public": { - "name": "", "segments": { - "left": "Federerat", - "right": "Lokalt" + "federated": "Federerat", + "local": "Lokalt", + "trending": "Trendar" } }, "notifications": { "name": "Notiser" - }, - "me": { - "name": "Om mig" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Filter", - "accessibilityHint": "Filtrera visade notistyper" + "accessibilityHint": "Filtrera visade notistyper", + "title": "Visa notifikationer", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Följarförfrågning", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Inlägg från följda användare", + "update": "Boosten har redigerats", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Favoriter" }, + "followedTags": { + "name": "Följda hashtaggar" + }, "fontSize": { "name": "Storlek på teckensnitt i inlägg" }, @@ -53,7 +70,7 @@ "name": "Användare i listan: {{list}}" }, "listAdd": { - "name": "Lägg till en lista" + "name": "Skapa en lista" }, "listEdit": { "name": "Redigera listans detaljer" @@ -179,8 +196,8 @@ "settings": "Aktivera i inställningar" }, "missingServerKey": { - "message": "", - "description": "" + "message": "Servern är felkonfigurerad för push", + "description": "Kontakta din serveradministratör och be dem konfigurera stöd för push" }, "global": { "heading": "Aktivera för {{acct}}", @@ -214,6 +231,12 @@ "status": { "heading": "Inlägg från följda användare" }, + "admin.sign_up": { + "heading": "Admin: registrera dig" + }, + "admin.report": { + "heading": "Admin: rapporter" + }, "howitworks": "Läs om hur routing fungerar" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Aktiverad", - "disabled": "Inaktiverad" - } + "content_true": "Aktiverad", + "content_false": "Inaktiverad" }, "update": { "title": "Uppdatera till senaste versionen" @@ -290,9 +311,6 @@ "support": { "heading": "Stöd tooot" }, - "review": { - "heading": "Recensera tooot" - }, "contact": { "heading": "Kontakta tooot" }, diff --git a/src/i18n/uk/common.json b/src/i18n/uk/common.json new file mode 100644 index 00000000..af3dbb7b --- /dev/null +++ b/src/i18n/uk/common.json @@ -0,0 +1,31 @@ +{ + "buttons": { + "OK": "OK", + "apply": "Застосувати", + "cancel": "Скасувати", + "discard": "Відхилити", + "continue": "Продовжити", + "create": "Створити", + "delete": "Видалити", + "done": "Готово" + }, + "customEmoji": { + "accessibilityLabel": "Власні емодзі {{emoji}}" + }, + "message": { + "success": { + "message": "{{function}} успішно" + }, + "warning": { + "message": "" + }, + "error": { + "message": "{{function}} не вдалося, спробуйте ще раз" + } + }, + "separator": ", ", + "discard": { + "title": "Зміни не збережено", + "message": "Зміни не збережено. Зберегти зміни?" + } +} \ No newline at end of file diff --git a/src/i18n/uk/components/contextMenu.json b/src/i18n/uk/components/contextMenu.json new file mode 100644 index 00000000..ff210275 --- /dev/null +++ b/src/i18n/uk/components/contextMenu.json @@ -0,0 +1,85 @@ +{ + "accessibilityHint": "Дії для цього дмуху, наприклад, його опублікованого користувача, дмуху", + "account": { + "title": "Дії користувача", + "following": { + "action_false": "Підписатися на користувача", + "action_true": "Відписатися від користувача" + }, + "inLists": "Керувати списками", + "mute": { + "action_false": "Заглушити користувача", + "action_true": "Зняти заглушення з користувача" + }, + "block": { + "action_false": "Заблокувати користувача", + "action_true": "Розблокувати користувача" + }, + "reports": { + "action": "Повідомити та заблокувати користувача" + } + }, + "at": { + "direct": "Особисті повідомлення", + "public": "Публічне повідомлення" + }, + "copy": { + "action": "Скопіювати дмух", + "succeed": "Скопійовано" + }, + "instance": { + "title": "Дія інстанса", + "block": { + "action": "Заблокувати інстанс {{instance}}", + "alert": { + "title": "Підтверджуєте блокування інстанса {{instance}}?", + "message": "Здебільшого ви можете вимкнути звук або заблокувати певного користувача.\n\nПісля блокування інстансу весь її контент, включаючи підписників, буде видалено!", + "buttons": { + "confirm": "Підтвердити" + } + } + } + }, + "share": { + "status": { + "action": "Поділитися дмухом" + }, + "account": { + "action": "Поділитися користувачем" + } + }, + "status": { + "title": "Дії дмуха", + "edit": { + "action": "Редагувати дмух" + }, + "delete": { + "action": "Видалити дмух", + "alert": { + "title": "Видалити?", + "message": "Всі передмухи і уподобання будуть очищені, включаючи всі відповіді.", + "buttons": { + "confirm": "Підтвердити" + } + } + }, + "deleteEdit": { + "action": "Видалити дмух та репост", + "alert": { + "title": "Підтвердьте видалення та повторне розміщення?", + "message": "Всі передмухи і уподобання будуть очищені, включаючи всі відповіді.", + "buttons": { + "confirm": "Підтвердити" + } + } + }, + "mute": { + "action_false": "Заглушити дмух та відповіді", + "action_true": "Увімкнути дмух та відповіді" + }, + "pin": { + "action_false": "Прикріпити дмух", + "action_true": "Відкріпити дмух" + } + } +} \ No newline at end of file diff --git a/src/i18n/uk/components/emojis.json b/src/i18n/uk/components/emojis.json new file mode 100644 index 00000000..a6934eee --- /dev/null +++ b/src/i18n/uk/components/emojis.json @@ -0,0 +1,3 @@ +{ + "frequentUsed": "Часто використовувані" +} \ No newline at end of file diff --git a/src/i18n/uk/components/instance.json b/src/i18n/uk/components/instance.json new file mode 100644 index 00000000..da19b90a --- /dev/null +++ b/src/i18n/uk/components/instance.json @@ -0,0 +1,26 @@ +{ + "server": { + "textInput": { + "placeholder": "Домен інстансу" + }, + "button": "Увійти", + "information": { + "name": "Назва", + "accounts": "Користувачі", + "statuses": "Дмухи", + "domains": "Універси" + }, + "disclaimer": { + "base": "Для входу в систему використовується системний браузер, тому інформація про ваш обліковий запис не буде видимою для додатку tooot." + }, + "terms": { + "base": "Увійшовши в систему, ви приймаєте <0>політику конфіденційності та <1>умови надання послуг." + } + }, + "update": { + "alert": { + "title": "Вхід виконано", + "message": "Ви можете увійти під іншим обліковим записом, зберігши існуючий обліковий запис" + } + } +} \ No newline at end of file diff --git a/src/i18n/uk/components/mediaSelector.json b/src/i18n/uk/components/mediaSelector.json new file mode 100644 index 00000000..324b2a57 --- /dev/null +++ b/src/i18n/uk/components/mediaSelector.json @@ -0,0 +1,10 @@ +{ + "title": "Вибір джерела медіа", + "message": "Дані медіа-EXIF не завантажені", + "options": { + "image": "Завантажити фотографії", + "image_max": "Завантажити фотографії (макс. {{max}})", + "video": "Завантажити відео", + "video_max": "Завантажити відео (макс. {{max}})" + } +} \ No newline at end of file diff --git a/src/i18n/uk/components/parse.json b/src/i18n/uk/components/parse.json new file mode 100644 index 00000000..d5b42af9 --- /dev/null +++ b/src/i18n/uk/components/parse.json @@ -0,0 +1,8 @@ +{ + "HTML": { + "accessibilityHint": "Натисніть, щоб розгорнути або згорнути вміст", + "expanded": "{{hint}}{{moreLines}}", + "moreLines": " ({{count}} більше рядків)", + "defaultHint": "Довгий дмух" + } +} \ No newline at end of file diff --git a/src/i18n/uk/components/relationship.json b/src/i18n/uk/components/relationship.json new file mode 100644 index 00000000..5a0f7eeb --- /dev/null +++ b/src/i18n/uk/components/relationship.json @@ -0,0 +1,16 @@ +{ + "follow": { + "function": "Підписатися на користувача" + }, + "block": { + "function": "Заблокувати користувача" + }, + "button": { + "error": "Помилка завантаження", + "blocked_by": "Заблокований користувачем", + "blocking": "Розблокувати", + "following": "Відписатися", + "requested": "Відкликати запит", + "default": "Підписатися" + } +} \ No newline at end of file diff --git a/src/i18n/uk/components/timeline.json b/src/i18n/uk/components/timeline.json new file mode 100644 index 00000000..b35a9fb9 --- /dev/null +++ b/src/i18n/uk/components/timeline.json @@ -0,0 +1,155 @@ +{ + "empty": { + "error": { + "message": "Помилка завантаження", + "button": "Повторити" + }, + "success": { + "message": "Часова гілка порожня" + } + }, + "end": { + "message": "Це кінець, бажаєте філіжанку кави? <0 />" + }, + "lookback": { + "message": "Останні прочитані в" + }, + "refresh": { + "fetchPreviousPage": "З цього моменту", + "refetch": "До кінця" + }, + "shared": { + "actioned": { + "pinned": "Прикріплено", + "favourite": "{{name}} додав в улюблене дмух", + "status": "{{name}} щойно дмухнув", + "follow": "{{name}} підписався на вас", + "follow_request": "{{name}} відправив запит на підписку", + "poll": "Опитування, у якому ви голосували, закінчилося", + "reblog": { + "default": "{{name}} передмухнув(-ла)", + "notification": "{{name}} передмухнув(-ла) ваш дмух" + }, + "update": "Передмух був відредагований", + "admin.sign_up": "{{name}} приєднався до інстансу", + "admin.report": "{{name}} повідомлено:" + }, + "actions": { + "reply": { + "accessibilityLabel": "Відповісти на дмух" + }, + "reblogged": { + "accessibilityLabel": "Передмухнути", + "function": "Передмухнути", + "options": { + "title": "Виберіть видимість передмуху", + "public": "Публічний передмух", + "unlisted": "Прихований передмух" + } + }, + "favourited": { + "accessibilityLabel": "Додати дмух до улюблених", + "function": "Улюблені дмухи" + }, + "bookmarked": { + "accessibilityLabel": "Додати цей дмух до закладок", + "function": "Закладки дмухів" + }, + "openReport": "Відкрити скаргу" + }, + "actionsUsers": { + "reblogged_by": { + "accessibilityLabel": "{{count}} користувачів передмухнули цей дмух", + "accessibilityHint": "Торкніться, щоб дізнатися про користувачів", + "text": "$t(screenTabs:shared.users.statuses.reblogged_by)" + }, + "favourited_by": { + "accessibilityLabel": "{{count}} користувачів зробили закладку для цього дмуху", + "accessibilityHint": "Торкніться, щоб дізнатися про користувачів", + "text": "$t(screenTabs:shared.users.statuses.favourited_by)" + }, + "history": { + "accessibilityLabel": "Цей дмух було відредаговано {{count}} разів", + "accessibilityHint": "Натисніть для перегляду повної історії редагування", + "text_one": "{{count}} редагування", + "text_other": "{{count}} редагували" + } + }, + "attachment": { + "sensitive": { + "button": "Показати чутливі медіа" + }, + "unsupported": { + "text": "Помилка завантаження", + "button": "Спробуйте віддалене посилання" + } + }, + "avatar": { + "accessibilityLabel": "Аватар {{name}}", + "accessibilityHint": "Натисніть, щоб перейти на сторінку {{name}}" + }, + "content": { + "expandHint": "Прихований вміст" + }, + "filtered": "Відфільтровано: {{phrase}}.", + "fullConversation": "Читати розмови", + "translate": { + "default": "Переклад", + "succeed": "Перекладено {{provider}} з {{source}}", + "failed": "Не вдалося перекласти", + "source_not_supported": "мова дмухів не підтримується", + "target_not_supported": "Цільова мова не підтримується" + }, + "header": { + "shared": { + "account": { + "name": { + "accessibilityHint": "Ім'я для відображення" + }, + "account": { + "accessibilityHint": "Профіль користувача" + } + }, + "application": "через {{application}}", + "edited": { + "accessibilityLabel": "Дмух відредаговано" + }, + "muted": { + "accessibilityLabel": "Дмух приглушений" + }, + "visibility": { + "direct": { + "accessibilityLabel": "Дмухнути особистим повідомленням" + }, + "private": { + "accessibilityLabel": "Дмух видимий лише для підписників" + } + } + }, + "conversation": { + "withAccounts": "З", + "delete": { + "function": "Видалити особисті повідомлення" + } + } + }, + "poll": { + "meta": { + "button": { + "vote": "Голосування", + "refresh": "Оновити" + }, + "count": { + "voters_one": "{{count}} користувач проголосував", + "voters_other": "{{count}} користувачів проголосувало", + "votes_one": "{{count}} голос", + "votes_other": "{{count}} голосів" + }, + "expiration": { + "expired": "Голосування закінчилось", + "until": "Спливає <0 />" + } + } + } + } +} \ No newline at end of file diff --git a/src/i18n/uk/index.ts b/src/i18n/uk/index.ts new file mode 100644 index 00000000..5f2a7a82 --- /dev/null +++ b/src/i18n/uk/index.ts @@ -0,0 +1,18 @@ +export default { + common: require('./common'), + + screens: require('./screens'), + screenActions: require('./screens/actions'), + screenAnnouncements: require('./screens/announcements'), + screenCompose: require('./screens/compose'), + screenImageViewer: require('./screens/imageViewer'), + screenTabs: require('./screens/tabs'), + + componentContextMenu: require('./components/contextMenu'), + componentEmojis: require('./components/emojis'), + componentInstance: require('./components/instance'), + componentMediaSelector: require('./components/mediaSelector'), + componentParse: require('./components/parse'), + componentRelationship: require('./components/relationship'), + componentTimeline: require('./components/timeline') +} diff --git a/src/i18n/uk/screens.json b/src/i18n/uk/screens.json new file mode 100644 index 00000000..943e9da9 --- /dev/null +++ b/src/i18n/uk/screens.json @@ -0,0 +1,18 @@ +{ + "screenshot": { + "title": "Захист конфіденційності", + "message": "Будь ласка, не розкривайте особи інших користувачів, наприклад ім'я користувача, аватар і т.д. Дякуємо!", + "button": "Підтвердити" + }, + "localCorrupt": { + "message": "Вхід вичерпано. Будь ласка, увійдіть знову" + }, + "pushError": { + "message": "Помилка служби push", + "description": "Будь ласка, повторно увімкніть сповіщення push в налаштуваннях" + }, + "shareError": { + "imageNotSupported": "Тип зображення {{type}} не підтримується", + "videoNotSupported": "Тип відео {{type}} не підтримується" + } +} \ No newline at end of file diff --git a/src/i18n/uk/screens/accountSelection.json b/src/i18n/uk/screens/accountSelection.json new file mode 100644 index 00000000..4dab6bcf --- /dev/null +++ b/src/i18n/uk/screens/accountSelection.json @@ -0,0 +1,6 @@ +{ + "heading": "Поділитися з...", + "content": { + "select_account": "Оберіть акаунт" + } +} \ No newline at end of file diff --git a/src/i18n/uk/screens/actions.json b/src/i18n/uk/screens/actions.json new file mode 100644 index 00000000..5088196f --- /dev/null +++ b/src/i18n/uk/screens/actions.json @@ -0,0 +1,7 @@ +{ + "content": { + "altText": { + "heading": "Альтернативний текст" + } + } +} \ No newline at end of file diff --git a/src/i18n/uk/screens/announcements.json b/src/i18n/uk/screens/announcements.json new file mode 100644 index 00000000..91a31325 --- /dev/null +++ b/src/i18n/uk/screens/announcements.json @@ -0,0 +1,10 @@ +{ + "heading": "Оголошення", + "content": { + "published": "Опубліковано <0 />", + "button": { + "read": "Прочитано", + "unread": "Позначити прочитаним" + } + } +} \ No newline at end of file diff --git a/src/i18n/uk/screens/compose.json b/src/i18n/uk/screens/compose.json new file mode 100644 index 00000000..9bf4ccdb --- /dev/null +++ b/src/i18n/uk/screens/compose.json @@ -0,0 +1,173 @@ +{ + "heading": { + "left": { + "alert": { + "title": "Скасувати редагування?", + "buttons": { + "save": "Зберегти чернетку", + "delete": "Видалити чернетку" + } + } + }, + "right": { + "button": { + "default": "Дмух", + "conversation": "Дмух DM", + "reply": "Дмухнути", + "deleteEdit": "Дмух", + "edit": "Дмух", + "share": "Дмух" + }, + "alert": { + "default": { + "title": "Дмухнути не вийшло", + "button": "Спробуйте ще раз" + }, + "removeReply": { + "title": "Дмух для відповіді не знайдено", + "description": "Дмух може бути видалено. Видалити його з вашого посилання?", + "confirm": "Видалити посилання" + } + } + } + }, + "content": { + "root": { + "header": { + "postingAs": "Дмухнути як @{{acct}}@{{domain}}", + "spoilerInput": { + "placeholder": "Попередження спойлера" + }, + "textInput": { + "placeholder": "Що у вас на думці?", + "keyboardImage": { + "exceedMaximum": { + "title": "Досягнута максимальна кількість вкладень", + "OK": "$t(common:buttons.OK)" + } + } + } + }, + "footer": { + "attachments": { + "sensitive": "Позначте вкладення як чутливі", + "remove": { + "accessibilityLabel": "Видалити завантажене вкладення, номер {{attachment}}" + }, + "edit": { + "accessibilityLabel": "Редагувати завантажене вкладення, номер {{attachment}}" + }, + "upload": { + "accessibilityLabel": "Завантажити додаткові вкладення" + } + }, + "emojis": { + "accessibilityHint": "Торкніться, щоб додати емодзі для дмуху" + }, + "poll": { + "option": { + "placeholder": { + "accessibilityLabel": "Варіант опитування {{index}}", + "single": "Один вибір", + "multiple": "Множинний вибір" + } + }, + "quantity": { + "reduce": { + "accessibilityLabel": "Зменшити варіанти відповіді на {{amount}}", + "accessibilityHint": "Досягнута мінімальна кількість варіантів опитування, наразі має {{amount}}" + }, + "increase": { + "accessibilityLabel": "Збільшити варіанти відповіді на {{amount}}", + "accessibilityHint": "Досягнута максимальна кількість варіантів опитування, наразі має {{amount}}" + } + }, + "multiple": { + "heading": "Тип вибору", + "options": { + "single": "Один вибір", + "multiple": "Множинний вибір" + } + }, + "expiration": { + "heading": "Термін дії", + "options": { + "300": "5 хвилин", + "1800": "30 хвилин", + "3600": "1 година", + "21600": "6 годин", + "86400": "1 день", + "259200": "3 дні", + "604800": "7 днів" + } + } + } + }, + "actions": { + "attachment": { + "accessibilityLabel": "Завантажити вкладений файл", + "accessibilityHint": "Функція опитування буде вимкнена, коли є вкладені файли", + "failed": { + "alert": { + "title": "Помилка завантаження", + "button": "Спробуйте ще раз" + } + } + }, + "poll": { + "accessibilityLabel": "Додати голосування", + "accessibilityHint": "Функцію вкладення буде відключено, коли опитування активне" + }, + "visibility": { + "accessibilityLabel": "Видимість дмуху {{visibility}}", + "title": "Видимість дмуху", + "options": { + "public": "Публічний", + "unlisted": "Приватний", + "private": "Тільки для підписників", + "direct": "Особисті повідомлення" + } + }, + "spoiler": { + "accessibilityLabel": "Спойлер" + }, + "emoji": { + "accessibilityLabel": "Додати емодзі", + "accessibilityHint": "Відкрийте панель вибору емодзі, проведіть по горизонталі, щоб змінити сторінку" + } + }, + "drafts_one": "Чернетка ({{count}})", + "drafts_other": "Чернетки ({{count}})" + }, + "editAttachment": { + "header": { + "title": "Редагувати вкладення", + "right": { + "accessibilityLabel": "Зберегти редагування вкладення", + "failed": { + "title": "Редагування не вдалося", + "button": "Спробуйте ще раз" + } + } + }, + "content": { + "altText": { + "heading": "Охарактеризуйте медіа для людей з вадами зору", + "placeholder": "Ви можете додавати опис, іноді так званий alt-текст, вашим медіа, таким чином, вони доступні ще більшій кількості людей, включаючи тих, хто сліпий, чи має проблеми з зором.\n\nХороші описи - це лаконічно, але представте що є у ваших медіа досить точним, щоб зрозуміти їх контекст." + }, + "imageFocus": "Перетягніть круг для оновлення точки фокусу" + } + }, + "draftsList": { + "header": { + "title": "Чернетка" + }, + "warning": "Чернетки зберігаються лише локально, і їх може бути втрачено у нещасних подіях. Рекомендуємо не використовувати чернетки для довгострокового сховища.", + "content": { + "accessibilityHint": "Збережено чернетку, натисніть для редагування чернетки", + "textEmpty": "Вміст порожній" + }, + "checkAttachment": "Перевірка вкладень на сервері..." + } + } +} \ No newline at end of file diff --git a/src/i18n/uk/screens/imageViewer.json b/src/i18n/uk/screens/imageViewer.json new file mode 100644 index 00000000..c2f67e20 --- /dev/null +++ b/src/i18n/uk/screens/imageViewer.json @@ -0,0 +1,16 @@ +{ + "content": { + "actions": { + "accessibilityLabel": "Більше дій на цьому зображення", + "accessibilityHint": "Ви можете зберегти чи поділитися цим зображенням" + }, + "options": { + "save": "Зберегти зображення", + "share": "Поділитись зображенням" + }, + "save": { + "succeed": "Зображення збережено", + "failed": "Не вдалося зберегти зображення" + } + } +} \ No newline at end of file diff --git a/src/i18n/uk/screens/tabs.json b/src/i18n/uk/screens/tabs.json new file mode 100644 index 00000000..efba5d35 --- /dev/null +++ b/src/i18n/uk/screens/tabs.json @@ -0,0 +1,401 @@ +{ + "tabs": { + "local": { + "name": "Підписаний", + "options": { + "showBoosts": "Показати передмухнуті", + "showReplies": "Показувати відповіді" + } + }, + "public": { + "segments": { + "federated": "Глобальна", + "local": "Місцева", + "trending": "Популярне" + } + }, + "notifications": { + "name": "Сповіщення" + } + }, + "common": { + "search": { + "accessibilityLabel": "Пошук", + "accessibilityHint": "Пошук ґештеґів, користувачів або дмухів" + } + }, + "notifications": { + "filters": { + "accessibilityLabel": "Фільтр", + "accessibilityHint": "Відфільтрувати типи сповіщень, що відображаються", + "title": "Показувати сповіщення", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Запит на підписку", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Дмух від підписників", + "update": "Передмух був відредагований", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } + } + }, + "me": { + "stacks": { + "bookmarks": { + "name": "Закладки" + }, + "conversations": { + "name": "Особисті повідомлення" + }, + "favourites": { + "name": "Улюблене" + }, + "followedTags": { + "name": "Стежити за хештегом" + }, + "fontSize": { + "name": "Розмір шрифту дмуху" + }, + "language": { + "name": "Мова" + }, + "list": { + "name": "Список: {{list}}" + }, + "listAccounts": { + "name": "Список користувачів: {{list}}" + }, + "listAdd": { + "name": "Створити список" + }, + "listEdit": { + "name": "Редагувати деталі списку" + }, + "lists": { + "name": "Списки" + }, + "push": { + "name": "Push-сповіщення" + }, + "profile": { + "name": "Редагувати профіль" + }, + "profileName": { + "name": "Редагувати показане ім'я" + }, + "profileNote": { + "name": "Редагувати опис" + }, + "profileFields": { + "name": "Редагувати метадані" + }, + "settings": { + "name": "Налаштування додатку" + }, + "webSettings": { + "name": "Додаткові налаштування акаунта" + }, + "switch": { + "name": "Переключити аккаунт" + } + }, + "fontSize": { + "demo": "

Це демо дмух: smiling_face_with_smiling_eyes:. Ви можете вибрати з декількох варіантів знизу.

Це налаштування впливає лише на основний вміст дмухів, але не на інші розміри шрифту.

", + "sizes": { + "S": "S", + "M": "М - за замовчуванням", + "L": "L", + "XL": "XL", + "XXL": "XXL" + } + }, + "listAccounts": { + "heading": "Керувати користувачами", + "error": "Видалити користувача зі списку", + "empty": "Користувача не додано в цей список" + }, + "listEdit": { + "heading": "Редагувати деталі списку", + "title": "Назва", + "repliesPolicy": { + "heading": "Показати відповіді від:", + "options": { + "none": "Ніхто", + "list": "Користувачів списку", + "followed": "Будь-який користувач, за яким ви стежите" + } + } + }, + "listDelete": { + "heading": "Видалити список", + "confirm": { + "title": "Видалити список \"{{list}}\"?", + "message": "Цю дію не можна скасувати." + } + }, + "profile": { + "feedback": { + "succeed": "{{type}} оновлено", + "failed": "{{type}} оновлення не вдалося, будь ласка, спробуйте ще раз" + }, + "root": { + "name": { + "title": "Ім'я для відображення" + }, + "avatar": { + "title": "Аватар", + "description": "Буде зменшено до 400x400px" + }, + "header": { + "title": "Банер", + "description": "Буде зменшено до 1500x500px" + }, + "note": { + "title": "Опис" + }, + "fields": { + "title": "Метадані", + "total_one": "{{count}} поле", + "total_other": "{{count}} полей" + }, + "visibility": { + "title": "Видимість дмухів", + "options": { + "public": "Публічний", + "unlisted": "Приватний", + "private": "Тільки для підписників" + } + }, + "sensitive": { + "title": "Розміщення чутливої інформації" + }, + "lock": { + "title": "Закрити акаунт", + "description": "Потребує вас вручну затвердити підписників" + }, + "bot": { + "title": "Акаунт бота", + "description": "Цей акаунт виконує автоматичні дії та може не відстежуватися" + } + }, + "fields": { + "group": "Група {{index}}", + "label": "Мітка", + "content": "Контент" + }, + "mediaSelectionFailed": "Не вдалося виконати обробку зображення. Будь ласка, спробуйте ще раз." + }, + "push": { + "notAvailable": "Ваш телефон не підтримує push-сповіщення tooot", + "enable": { + "direct": "Увімкнути push сповіщення", + "settings": "Включити в налаштуваннях" + }, + "missingServerKey": { + "message": "Сервер неправильно налаштовано для push", + "description": "Будь ласка, зверніться до адміністратора сервера для налаштування підтримки push" + }, + "global": { + "heading": "Увімкнути для {{acct}}", + "description": "Повідомлення перенаправляються через сервер tooot" + }, + "decode": { + "heading": "Показати деталі повідомлення", + "description": "Повідомлення, які передаються через сервер tooot, зашифровані, але ви можете декодувати повідомлення на сервері. Наш вихідний код сервера є відкритим вихідним кодом і не має політики журналу." + }, + "default": { + "heading": "За замовчуванням" + }, + "follow": { + "heading": "Новий підписник(-ця)" + }, + "follow_request": { + "heading": "Запит на підписку" + }, + "favourite": { + "heading": "Улюблене" + }, + "reblog": { + "heading": "Передмухнув" + }, + "mention": { + "heading": "згадав (-ла) вас" + }, + "poll": { + "heading": "Опитування успішно оновлено" + }, + "status": { + "heading": "Дмух від підписників" + }, + "admin.sign_up": { + "heading": "Адмін: реєстрація" + }, + "admin.report": { + "heading": "Адмін: звіти" + }, + "howitworks": "Дізнатися, як працює маршрутизація" + }, + "root": { + "announcements": { + "content": { + "unread": "{{amount}} непрочитаних", + "read": "Усі прочитані", + "empty": "Відсутньо" + } + }, + "push": { + "content_true": "Увімкнено", + "content_false": "Вимкнено" + }, + "update": { + "title": "Оновити до останньої версії" + }, + "logout": { + "button": "Вийти", + "alert": { + "title": "Виходиш з системи?", + "message": "Після виходу з системи необхідно повторно увійти в неї", + "buttons": { + "logout": "Вийти" + } + } + } + }, + "settings": { + "fontsize": { + "heading": "$t(me.stacks.fontSize.name)", + "content": { + "S": "$t(me.fontSize.sizes.S)", + "M": "$t(me.fontSize.sizes.M)", + "L": "$t(me.fontSize.sizes.L)", + "XL": "$t(me.fontSize.sizes.XL)", + "XXL": "$t(me.fontSize.sizes.XXL)" + } + }, + "language": { + "heading": "$t(me.stacks.language.name)" + }, + "theme": { + "heading": "Зовнішній вигляд", + "options": { + "auto": "За системними налаштуваннями", + "light": "Світла тема", + "dark": "Темний режим" + } + }, + "darkTheme": { + "heading": "Темна тема", + "options": { + "lighter": "Світліше", + "darker": "Темніше" + } + }, + "browser": { + "heading": "Відкривання посилань", + "options": { + "internal": "Всередині додатку", + "external": "Використовувати системний браузер" + } + }, + "staticEmoji": { + "heading": "Використовувати статичні емодзі", + "description": "Якщо ви стикаєтеся з частими збоями в роботі програми при перегляді списку емодзі, ви можете спробувати використовувати статичні емодзі." + }, + "feedback": { + "heading": "Запропонувати ідею" + }, + "support": { + "heading": "Підтримати tooot" + }, + "contact": { + "heading": "Зв'язатись з tooot" + }, + "version": "Версія: {{version}}", + "instanceVersion": "Версія Mastodon: v{{version}}" + }, + "switch": { + "existing": "Вибрати з авторизованих", + "new": "Увійти до інстансу" + } + }, + "shared": { + "account": { + "actions": { + "accessibilityLabel": "Дії для користувача {{user}}", + "accessibilityHint": "Ви можете приглушити, заблокувати, чи кинути репорт на цього користувача" + }, + "followed_by": " слідує за вами", + "moved": "Користувач перемістився", + "created_at": "Приєднався: {{date}}", + "summary": { + "statuses_count": "{{count}} дмухів", + "following_count": "$t(shared.users.accounts.following)", + "followers_count": "$t(shared.users.accounts.followers)" + }, + "toots": { + "default": "Дмухи", + "all": "Дмухи та відповіді" + }, + "suspended": "Обліковий запис призупинено модераторами вашого інстансу" + }, + "accountInLists": { + "name": "Списки @{{username}}", + "inLists": "У списку", + "notInLists": "Інші списки" + }, + "attachments": { + "name": "<0 /><1> медіа" + }, + "hashtag": { + "follow": "Підписатися", + "unfollow": "Відписатися" + }, + "history": { + "name": "Редагувати історію" + }, + "search": { + "header": { + "prefix": "Пошук", + "placeholder": "кого?.." + }, + "empty": { + "general": "Введіть ключове слово для пошуку $t(screenTabs:shared.search.sections.accounts)$t(screenTabs:shared.search.sections.hashtags) або $t(screenTabs:shared.search.sections.statuses)", + "advanced": { + "header": "Розширений пошук", + "example": { + "account": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)", + "hashtag": "$t(shared.search.header.prefix) $t(shared.search.sections.hashtags)", + "statusLink": "$t(shared.search.header.prefix) $t(shared.search.sections.statuses)", + "accountLink": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)" + } + }, + "trending": { + "tags": "Популярні теги" + } + }, + "sections": { + "accounts": "Користувач", + "hashtags": "Ґештег", + "statuses": "Дмух" + }, + "notFound": "Не вдалося знайти {{searchTerm}} пов'язаний з {{type}}" + }, + "toot": { + "name": "Обговорення" + }, + "users": { + "accounts": { + "following": "Підписки {{count}}", + "followers": "{{count}} підписників" + }, + "statuses": { + "reblogged_by": "{{count}} передмухів", + "favourited_by": "{{count}} улюблених" + } + } + } +} \ No newline at end of file diff --git a/src/i18n/vi/common.json b/src/i18n/vi/common.json index 421903ba..517903aa 100644 --- a/src/i18n/vi/common.json +++ b/src/i18n/vi/common.json @@ -5,6 +5,7 @@ "cancel": "Hủy bỏ", "discard": "Bỏ qua", "continue": "Tiếp tục", + "create": "Tạo", "delete": "Xóa", "done": "Xong" }, diff --git a/src/i18n/vi/components/instance.json b/src/i18n/vi/components/instance.json index b03df3c8..acca9aa1 100644 --- a/src/i18n/vi/components/instance.json +++ b/src/i18n/vi/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "Máy chủ" + "placeholder": "Địa chỉ máy chủ" }, "button": "Đăng nhập", "information": { diff --git a/src/i18n/vi/components/timeline.json b/src/i18n/vi/components/timeline.json index 3dba5244..dc0be9f4 100644 --- a/src/i18n/vi/components/timeline.json +++ b/src/i18n/vi/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} đăng lại", "notification": "{{name}} đăng lại tút của bạn" }, - "update": "Đăng lại đã được sửa" + "update": "Đăng lại đã được sửa", + "admin.sign_up": "{{name}} tham gia máy chủ", + "admin.report": "{{name}} báo cáo:" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "Lưu tút này", "function": "Lưu tút" - } + }, + "openReport": "Mở báo cáo" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/vi/screens/actions.json b/src/i18n/vi/screens/actions.json index 516c6077..5551f751 100644 --- a/src/i18n/vi/screens/actions.json +++ b/src/i18n/vi/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "Văn bản thay thế" - }, - "notificationsFilter": { - "heading": "Những kiểu thông báo cho phép", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "Yêu cầu theo dõi", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "Tút từ người đã theo dõi", - "update": "Đăng lại đã được sửa" - } } } } \ No newline at end of file diff --git a/src/i18n/vi/screens/compose.json b/src/i18n/vi/screens/compose.json index 83b5901c..a2d38e04 100644 --- a/src/i18n/vi/screens/compose.json +++ b/src/i18n/vi/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "Hủy bỏ", "alert": { "title": "Không đăng nữa?", "buttons": { "save": "Lưu bản nháp", - "delete": "Xóa bản nháp", - "cancel": "Hủy bỏ" + "delete": "Xóa bản nháp" } } }, diff --git a/src/i18n/vi/screens/tabs.json b/src/i18n/vi/screens/tabs.json index b198254e..1f62cba9 100644 --- a/src/i18n/vi/screens/tabs.json +++ b/src/i18n/vi/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "Đang theo dõi" + "name": "Đang theo dõi", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "Liên hợp", - "right": "Máy chủ" + "federated": "Liên hợp", + "local": "Máy chủ", + "trending": "Xu hướng" } }, "notifications": { "name": "Thông báo" - }, - "me": { - "name": "Tôi" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "Lọc", - "accessibilityHint": "Lọc các dạng thông báo" + "accessibilityHint": "Lọc các dạng thông báo", + "title": "Hiện thông báo", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "Yêu cầu theo dõi", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "Tút từ người đã theo dõi", + "update": "Đăng lại đã được sửa", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "Đã thích" }, + "followedTags": { + "name": "Hashtag theo dõi" + }, "fontSize": { "name": "Cỡ chữ" }, @@ -53,7 +70,7 @@ "name": "Người trong danh sách: {{list}}" }, "listAdd": { - "name": "Thêm một danh sách" + "name": "Tạo danh sách" }, "listEdit": { "name": "Sửa danh sách" @@ -179,8 +196,8 @@ "settings": "Bật trong cài đặt" }, "missingServerKey": { - "message": "", - "description": "" + "message": "Máy chủ định cấu hình sai để nhận thông báo đẩy", + "description": "Vui lòng liên hệ với quản trị viên máy chủ của bạn để định cấu hình thông báo đẩy" }, "global": { "heading": "Bật cho {{acct}}", @@ -214,6 +231,12 @@ "status": { "heading": "Tút từ người đã theo dõi" }, + "admin.sign_up": { + "heading": "Admin: đăng ký" + }, + "admin.report": { + "heading": "Admin: báo cáo" + }, "howitworks": "Tìm hiểu cách truyền" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "Đã bật", - "disabled": "Đã tắt" - } + "content_true": "Bật", + "content_false": "Tắt" }, "update": { "title": "Cập nhật phiên bản mới" @@ -290,9 +311,6 @@ "support": { "heading": "Ủng hộ tooot" }, - "review": { - "heading": "Đánh giá tooot" - }, "contact": { "heading": "Liên hệ tooot" }, diff --git a/src/i18n/zh-Hans/common.json b/src/i18n/zh-Hans/common.json index a3c7dd6d..7e8894a1 100644 --- a/src/i18n/zh-Hans/common.json +++ b/src/i18n/zh-Hans/common.json @@ -5,6 +5,7 @@ "cancel": "取消", "discard": "丢弃", "continue": "继续", + "create": "创建", "delete": "删除", "done": "完成" }, diff --git a/src/i18n/zh-Hans/components/instance.json b/src/i18n/zh-Hans/components/instance.json index abf40b9b..4fdc13f7 100644 --- a/src/i18n/zh-Hans/components/instance.json +++ b/src/i18n/zh-Hans/components/instance.json @@ -1,7 +1,7 @@ { "server": { "textInput": { - "placeholder": "输入社区服务器地址" + "placeholder": "实例域名" }, "button": "登录", "information": { diff --git a/src/i18n/zh-Hans/components/timeline.json b/src/i18n/zh-Hans/components/timeline.json index 6725dc0d..404ad280 100644 --- a/src/i18n/zh-Hans/components/timeline.json +++ b/src/i18n/zh-Hans/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} 转嘟了", "notification": "{{name}} 转嘟了你的嘟文" }, - "update": "转嘟已被编辑" + "update": "转嘟已被编辑", + "admin.sign_up": "{{name}}加入了实例", + "admin.report": "{{name}}举报:" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "添加此嘟文至书签列表", "function": "喜欢嘟文" - } + }, + "openReport": "打开举报" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/zh-Hans/screens/actions.json b/src/i18n/zh-Hans/screens/actions.json index 56c57a99..3e66a95c 100644 --- a/src/i18n/zh-Hans/screens/actions.json +++ b/src/i18n/zh-Hans/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "替代文本" - }, - "notificationsFilter": { - "heading": "显示通知", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "关注请求", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "订阅用户的嘟文", - "update": "转嘟被编辑" - } } } } \ No newline at end of file diff --git a/src/i18n/zh-Hans/screens/compose.json b/src/i18n/zh-Hans/screens/compose.json index ba2d5dc3..cbe69118 100644 --- a/src/i18n/zh-Hans/screens/compose.json +++ b/src/i18n/zh-Hans/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "退出编辑", "alert": { "title": "确认退出编辑?", "buttons": { "save": "保存草稿", - "delete": "删除草稿", - "cancel": "继续编辑" + "delete": "删除草稿" } } }, diff --git a/src/i18n/zh-Hans/screens/tabs.json b/src/i18n/zh-Hans/screens/tabs.json index bfbd2a44..c847678c 100644 --- a/src/i18n/zh-Hans/screens/tabs.json +++ b/src/i18n/zh-Hans/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "我的关注" + "name": "我的关注", + "options": { + "showBoosts": "显示转嘟", + "showReplies": "显示回复" + } }, "public": { - "name": "", "segments": { - "left": "跨站嘟嘟", - "right": "本站嘟嘟" + "federated": "跨站", + "local": "本站", + "trending": "热门" } }, "notifications": { "name": "通知" - }, - "me": { - "name": "关于我" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "筛选", - "accessibilityHint": "筛选显示的通知类型" + "accessibilityHint": "筛选显示的通知类型", + "title": "显示通知", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "关注请求", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "订阅用户的嘟文", + "update": "转嘟被编辑", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "喜欢" }, + "followedTags": { + "name": "关注的话题标签" + }, "fontSize": { "name": "嘟文字号" }, @@ -53,7 +70,7 @@ "name": "列表中的用户:{{list}}" }, "listAdd": { - "name": "添加列表" + "name": "创建列表" }, "listEdit": { "name": "编辑列表详情" @@ -214,6 +231,12 @@ "status": { "heading": "订阅用户的嘟文" }, + "admin.sign_up": { + "heading": "管理员:用户注册" + }, + "admin.report": { + "heading": "管理员:报告" + }, "howitworks": "了解通知消息转发如何工作" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "已启用", - "disabled": "未启用" - } + "content_true": "已启用", + "content_false": "未启用" }, "update": { "title": "更新至最新版本" @@ -290,9 +311,6 @@ "support": { "heading": "赞助 tooot 开发" }, - "review": { - "heading": "给 tooot 打分" - }, "contact": { "heading": "联系 tooot" }, diff --git a/src/i18n/zh-Hant/common.json b/src/i18n/zh-Hant/common.json index 6132e49a..12e5bc66 100644 --- a/src/i18n/zh-Hant/common.json +++ b/src/i18n/zh-Hant/common.json @@ -5,6 +5,7 @@ "cancel": "取消", "discard": "不儲存", "continue": "繼續", + "create": "建立", "delete": "刪除", "done": "完成" }, diff --git a/src/i18n/zh-Hant/components/timeline.json b/src/i18n/zh-Hant/components/timeline.json index a483f163..f26ff232 100644 --- a/src/i18n/zh-Hant/components/timeline.json +++ b/src/i18n/zh-Hant/components/timeline.json @@ -30,7 +30,9 @@ "default": "{{name}} 轉嘟了", "notification": "{{name}} 轉嘟了您的嘟文" }, - "update": "轉嘟已編輯" + "update": "轉嘟已編輯", + "admin.sign_up": "", + "admin.report": "" }, "actions": { "reply": { @@ -52,7 +54,8 @@ "bookmarked": { "accessibilityLabel": "將嘟文加入書籤", "function": "加入書籤" - } + }, + "openReport": "" }, "actionsUsers": { "reblogged_by": { diff --git a/src/i18n/zh-Hant/screens/actions.json b/src/i18n/zh-Hant/screens/actions.json index d5187c30..0ae1bdd9 100644 --- a/src/i18n/zh-Hant/screens/actions.json +++ b/src/i18n/zh-Hant/screens/actions.json @@ -2,19 +2,6 @@ "content": { "altText": { "heading": "替代文字" - }, - "notificationsFilter": { - "heading": "顯示通知類型", - "content": { - "follow": "$t(screenTabs:me.push.follow.heading)", - "follow_request": "跟隨請求", - "favourite": "$t(screenTabs:me.push.favourite.heading)", - "reblog": "$t(screenTabs:me.push.reblog.heading)", - "mention": "$t(screenTabs:me.push.mention.heading)", - "poll": "$t(screenTabs:me.push.poll.heading)", - "status": "訂閱使用者的嘟文", - "update": "轉嘟被編輯" - } } } } \ No newline at end of file diff --git a/src/i18n/zh-Hant/screens/compose.json b/src/i18n/zh-Hant/screens/compose.json index 4e374c29..78d25b7f 100644 --- a/src/i18n/zh-Hant/screens/compose.json +++ b/src/i18n/zh-Hant/screens/compose.json @@ -1,13 +1,11 @@ { "heading": { "left": { - "button": "取消", "alert": { "title": "確認取消編輯?", "buttons": { "save": "儲存草稿", - "delete": "刪除草稿", - "cancel": "取消" + "delete": "刪除草稿" } } }, diff --git a/src/i18n/zh-Hant/screens/tabs.json b/src/i18n/zh-Hant/screens/tabs.json index 5b715fdb..c5a609d0 100644 --- a/src/i18n/zh-Hant/screens/tabs.json +++ b/src/i18n/zh-Hant/screens/tabs.json @@ -1,20 +1,21 @@ { "tabs": { "local": { - "name": "跟隨中" + "name": "跟隨中", + "options": { + "showBoosts": "", + "showReplies": "" + } }, "public": { - "name": "", "segments": { - "left": "聯邦宇宙", - "right": "本站" + "federated": "聯邦", + "local": "本站", + "trending": "熱門" } }, "notifications": { "name": "通知" - }, - "me": { - "name": "關於我" } }, "common": { @@ -24,9 +25,22 @@ } }, "notifications": { - "filter": { + "filters": { "accessibilityLabel": "過濾器", - "accessibilityHint": "過濾顯示的通知類型" + "accessibilityHint": "過濾顯示的通知類型", + "title": "顯示通知", + "options": { + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "跟隨請求", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "訂閱使用者的嘟文", + "update": "轉嘟已編輯", + "admin.sign_up": "$t(screenTabs:me.push.admin.sign_up.heading)", + "admin.report": "$t(screenTabs:me.push.admin.report.heading)" + } } }, "me": { @@ -40,6 +54,9 @@ "favourites": { "name": "最愛" }, + "followedTags": { + "name": "跟隨主題標籤" + }, "fontSize": { "name": "嘟文字體大小" }, @@ -53,7 +70,7 @@ "name": "使用者在 {{list}} 列表中" }, "listAdd": { - "name": "新增列表" + "name": "建立列表" }, "listEdit": { "name": "編輯列表詳細資料" @@ -179,8 +196,8 @@ "settings": "在設定中啟用" }, "missingServerKey": { - "message": "", - "description": "" + "message": "伺服器推播設定不正確", + "description": "請聯絡您的伺服器管理員啟用推播設定" }, "global": { "heading": "啟用 {{acct}}", @@ -214,6 +231,12 @@ "status": { "heading": "訂閱使用者的嘟文" }, + "admin.sign_up": { + "heading": "管理員:註冊" + }, + "admin.report": { + "heading": "管理員:回報" + }, "howitworks": "了解通知訊息轉發如何工作" }, "root": { @@ -225,10 +248,8 @@ } }, "push": { - "content": { - "enabled": "啟用", - "disabled": "關閉" - } + "content_true": "啟用", + "content_false": "關閉" }, "update": { "title": "已更新到最新版本" @@ -290,9 +311,6 @@ "support": { "heading": "贊助 tooot 開發" }, - "review": { - "heading": "給 tooot 評分" - }, "contact": { "heading": "聯繫 tooot" }, diff --git a/src/screens/Tabs/Local/Root.tsx b/src/screens/Tabs/Local/Root.tsx index 0120fc1c..5bd4d507 100644 --- a/src/screens/Tabs/Local/Root.tsx +++ b/src/screens/Tabs/Local/Root.tsx @@ -1,4 +1,6 @@ -import { HeaderCenter, HeaderRight } from '@components/Header' +import { HeaderRight } from '@components/Header' +import Icon from '@components/Icon' +import CustomText from '@components/Text' import Timeline from '@components/Timeline' import TimelineDefault from '@components/Timeline/Default' import { NativeStackScreenProps } from '@react-navigation/native-stack' @@ -6,66 +8,160 @@ import { TabLocalStackParamList } from '@utils/navigation/navigators' import usePopToTop from '@utils/navigation/usePopToTop' import { useListsQuery } from '@utils/queryHooks/lists' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' +import { getInstanceFollowingPage, updateInstanceFollowingPage } from '@utils/slices/instancesSlice' +import { StyleConstants } from '@utils/styles/constants' +import { useTheme } from '@utils/styles/ThemeManager' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' +import { View } from 'react-native' +import { useDispatch, useSelector } from 'react-redux' import * as DropdownMenu from 'zeego/dropdown-menu' const Root: React.FC> = ({ navigation }) => { + const { colors, mode } = useTheme() const { t } = useTranslation('screenTabs') const { data: lists } = useListsQuery() - const [queryKey, setQueryKey] = useState(['Timeline', { page: 'Following' }]) + const dispatch = useDispatch() + const instanceFollowingPage = useSelector(getInstanceFollowingPage) + const [queryKey, setQueryKey] = useState([ + 'Timeline', + { page: 'Following', ...instanceFollowingPage } + ]) useEffect(() => { + const page = queryKey[1] + navigation.setOptions({ headerTitle: () => ( - 0} - content={ - queryKey[1].page === 'List' && queryKey[1].list?.length - ? lists?.find(list => list.id === queryKey[1].list)?.title - : t('tabs.local.name') - } - /> + + {page.page === 'List' ? ( + + ) : null} + list.id === page.list)?.title + : t('tabs.local.name') + } + /> + {page.page === 'Following' && !instanceFollowingPage.showBoosts ? ( + + ) : null} + {page.page === 'Following' && !instanceFollowingPage.showReplies ? ( + + ) : null} + + - {lists?.length - ? [ - { - key: 'default', - item: { - onSelect: () => setQueryKey(['Timeline', { page: 'Following' }]), - disabled: queryKey[1].page === 'Following', - destructive: false, - hidden: false - }, - title: t('tabs.local.name'), - icon: '' - }, - ...lists?.map(list => ({ - key: list.id, - item: { - onSelect: () => setQueryKey(['Timeline', { page: 'List', list: list.id }]), - disabled: queryKey[1].page === 'List' && queryKey[1].list === list.id, - destructive: false, - hidden: false - }, - title: list.title, - icon: '' - })) - ].map(menu => ( - - - - - )) - : undefined} + + + setQueryKey(['Timeline', { page: 'Following', ...instanceFollowingPage }]) + } + disabled={page.page === 'Following'} + > + + + + { + setQueryKey([ + 'Timeline', + { + page: 'Following', + showBoosts: !instanceFollowingPage.showBoosts, + showReplies: instanceFollowingPage.showReplies + } + ]) + dispatch( + updateInstanceFollowingPage({ showBoosts: !instanceFollowingPage.showBoosts }) + ) + }} + > + + + + { + setQueryKey([ + 'Timeline', + { + page: 'Following', + showBoosts: instanceFollowingPage.showBoosts, + showReplies: !instanceFollowingPage.showReplies + } + ]) + dispatch( + updateInstanceFollowingPage({ showReplies: !instanceFollowingPage.showReplies }) + ) + }} + > + + + + + + + {lists?.length + ? [ + ...lists?.map(list => ({ + key: list.id, + item: { + onSelect: () => setQueryKey(['Timeline', { page: 'List', list: list.id }]), + disabled: page.page === 'List' && page.list === list.id, + destructive: false, + hidden: false + }, + title: list.title, + icon: 'list.bullet' + })) + ].map(menu => ( + + + + + )) + : undefined} + ), @@ -78,7 +174,7 @@ const Root: React.FC ) }) - }, []) + }, [mode, queryKey[1], instanceFollowingPage]) usePopToTop() diff --git a/src/screens/Tabs/Me/Profile/Fields.tsx b/src/screens/Tabs/Me/Profile/Fields.tsx index 6f7a78bf..e461c7b6 100644 --- a/src/screens/Tabs/Me/Profile/Fields.tsx +++ b/src/screens/Tabs/Me/Profile/Fields.tsx @@ -79,7 +79,7 @@ const TabMeProfileFields: React.FC< navigation }) => { const { theme } = useTheme() - const { t, i18n } = useTranslation('screenTabs') + const { t } = useTranslation('screenTabs') const { mutateAsync, status } = useProfileMutation() const allProps: EmojisState['inputProps'] = [] @@ -144,7 +144,7 @@ const TabMeProfileFields: React.FC< /> ) }) - }, [theme, i18n.language, dirty, status, allProps.map(p => p.value)]) + }, [theme, dirty, status, allProps.map(p => p.value)]) return ( diff --git a/src/screens/Tabs/Me/Profile/Name.tsx b/src/screens/Tabs/Me/Profile/Name.tsx index 81dce1d7..c280d57b 100644 --- a/src/screens/Tabs/Me/Profile/Name.tsx +++ b/src/screens/Tabs/Me/Profile/Name.tsx @@ -23,7 +23,7 @@ const TabMeProfileName: React.FC< navigation }) => { const { theme } = useTheme() - const { t, i18n } = useTranslation('screenTabs') + const { t } = useTranslation('screenTabs') const { mutateAsync, status } = useProfileMutation() const [value, setValue] = useState(display_name) @@ -90,7 +90,7 @@ const TabMeProfileName: React.FC< /> ) }) - }, [theme, i18n.language, dirty, status, value]) + }, [theme, dirty, status, value]) return ( diff --git a/src/screens/Tabs/Me/Profile/Note.tsx b/src/screens/Tabs/Me/Profile/Note.tsx index 7fa08dbf..085315f2 100644 --- a/src/screens/Tabs/Me/Profile/Note.tsx +++ b/src/screens/Tabs/Me/Profile/Note.tsx @@ -23,7 +23,7 @@ const TabMeProfileNote: React.FC< navigation }) => { const { theme } = useTheme() - const { t, i18n } = useTranslation('screenTabs') + const { t } = useTranslation('screenTabs') const { mutateAsync, status } = useProfileMutation() const [notes, setNotes] = useState(note) @@ -90,7 +90,7 @@ const TabMeProfileNote: React.FC< /> ) }) - }, [theme, i18n.language, dirty, status, notes]) + }, [theme, dirty, status, notes]) return ( diff --git a/src/screens/Tabs/Shared/Account.tsx b/src/screens/Tabs/Shared/Account.tsx index f467d351..c2becf37 100644 --- a/src/screens/Tabs/Shared/Account.tsx +++ b/src/screens/Tabs/Shared/Account.tsx @@ -26,7 +26,7 @@ const TabSharedAccount: React.FC params: { account } } }) => { - const { t, i18n } = useTranslation('screenTabs') + const { t } = useTranslation('screenTabs') const { colors, mode } = useTheme() const mShare = menuShare({ type: 'account', url: account.url }) @@ -89,8 +89,9 @@ const TabSharedAccount: React.FC const [queryKey, setQueryKey] = useState([ 'Timeline', - { page: 'Account_Default', account: account.id } + { page: 'Account', account: account.id, exclude_reblogs: true, only_media: false } ]) + const page = queryKey[1] const isFetchingTimeline = useIsFetching(queryKey) const fetchedTimeline = useRef(false) useEffect(() => { @@ -113,14 +114,32 @@ const TabSharedAccount: React.FC { switch (nativeEvent.selectedSegmentIndex) { case 0: - setQueryKey([queryKey[0], { ...queryKey[1], page: 'Account_Default' }]) + setQueryKey([ + queryKey[0], + { + ...page, + page: 'Account', + account: account.id, + exclude_reblogs: true, + only_media: false + } + ]) break case 1: - setQueryKey([queryKey[0], { ...queryKey[1], page: 'Account_All' }]) + setQueryKey([ + queryKey[0], + { + ...page, + page: 'Account', + account: account.id, + exclude_reblogs: false, + only_media: false + } + ]) break } }} @@ -152,7 +171,7 @@ const TabSharedAccount: React.FC ) : null} ) - }, [data, fetchedTimeline.current, queryKey[1].page, i18n.language, mode]) + }, [data, fetchedTimeline.current, queryKey[1].page, mode]) return ( <> diff --git a/src/screens/Tabs/Shared/Account/Attachments.tsx b/src/screens/Tabs/Shared/Account/Attachments.tsx index dd6be7d7..64a98782 100644 --- a/src/screens/Tabs/Shared/Account/Attachments.tsx +++ b/src/screens/Tabs/Shared/Account/Attachments.tsx @@ -3,11 +3,11 @@ import Icon from '@components/Icon' import { useNavigation } from '@react-navigation/native' import { StackNavigationProp } from '@react-navigation/stack' import { TabLocalStackParamList } from '@utils/navigation/navigators' -import { useTimelineQuery } from '@utils/queryHooks/timeline' +import { QueryKeyTimeline, useTimelineQuery } from '@utils/queryHooks/timeline' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useCallback, useEffect } from 'react' -import { Dimensions, ListRenderItem, Pressable, StyleSheet, View } from 'react-native' +import { Dimensions, ListRenderItem, Pressable, View } from 'react-native' import { FlatList } from 'react-native-gesture-handler' import Animated, { useAnimatedStyle, withTiming } from 'react-native-reanimated' @@ -15,117 +15,111 @@ export interface Props { account: Mastodon.Account | undefined } -const AccountAttachments = React.memo( - ({ account }: Props) => { - const navigation = useNavigation>() - const { colors } = useTheme() +const AccountAttachments: React.FC = ({ account }) => { + if (!account) return null - const DISPLAY_AMOUNT = 6 + const navigation = useNavigation>() + const { colors } = useTheme() - const width = - (Dimensions.get('screen').width - StyleConstants.Spacing.Global.PagePadding * 2) / 4 + const DISPLAY_AMOUNT = 6 - const queryKeyParams = { - page: 'Account_Attachments' as 'Account_Attachments', - account: account?.id - } - const { data, refetch } = useTimelineQuery({ - ...queryKeyParams, - options: { enabled: false } - }) - useEffect(() => { - if (account?.id) { - refetch() - } - }, [account]) + const width = (Dimensions.get('screen').width - StyleConstants.Spacing.Global.PagePadding * 2) / 4 - const flattenData = data?.pages - ? data.pages - .flatMap(d => [...d.body]) - .filter(status => !(status as Mastodon.Status).sensitive) - .splice(0, DISPLAY_AMOUNT) - : [] - - const renderItem = useCallback>( - ({ item, index }) => { - if (index === DISPLAY_AMOUNT - 1) { - return ( - { - account && navigation.push('Tab-Shared-Attachments', { account }) - }} - children={ - - } - /> - } - /> - ) - } else { - return ( - navigation.push('Tab-Shared-Toot', { toot: item })} - /> - ) - } - }, - [account] - ) - - const styleContainer = useAnimatedStyle(() => { - if (flattenData.length) { - return { - height: withTiming(width + StyleConstants.Spacing.Global.PagePadding * 2), - paddingVertical: StyleConstants.Spacing.Global.PagePadding, - borderTopWidth: 1, - borderTopColor: colors.border - } - } else { - return {} - } - }, [flattenData.length]) - - return ( - - - - ) - }, - (_, next) => next.account === undefined -) - -const styles = StyleSheet.create({ - base: { - flex: 1 + const queryKeyParams: QueryKeyTimeline[1] = { + page: 'Account', + account: account.id, + exclude_reblogs: false, + only_media: true } -}) + const { data, refetch } = useTimelineQuery({ + ...queryKeyParams, + options: { enabled: false } + }) + useEffect(() => { + if (account?.id) { + refetch() + } + }, [account]) + + const flattenData = data?.pages + ? data.pages + .flatMap(d => [...d.body]) + .filter(status => !(status as Mastodon.Status).sensitive) + .splice(0, DISPLAY_AMOUNT) + : [] + + const renderItem = useCallback>( + ({ item, index }) => { + if (index === DISPLAY_AMOUNT - 1) { + return ( + { + account && navigation.push('Tab-Shared-Attachments', { account }) + }} + children={ + + } + /> + } + /> + ) + } else { + return ( + navigation.push('Tab-Shared-Toot', { toot: item })} + /> + ) + } + }, + [account] + ) + + const styleContainer = useAnimatedStyle(() => { + if (flattenData.length) { + return { + height: withTiming(width + StyleConstants.Spacing.Global.PagePadding * 2), + paddingVertical: StyleConstants.Spacing.Global.PagePadding, + borderTopWidth: 1, + borderTopColor: colors.border + } + } else { + return {} + } + }, [flattenData.length]) + + return ( + + + + ) +} export default AccountAttachments diff --git a/src/screens/Tabs/Shared/Account/Information/Account.tsx b/src/screens/Tabs/Shared/Account/Information/Account.tsx index e209e319..54d52c33 100644 --- a/src/screens/Tabs/Shared/Account/Information/Account.tsx +++ b/src/screens/Tabs/Shared/Account/Information/Account.tsx @@ -25,8 +25,8 @@ const AccountInformationAccount: React.FC = ({ account }) => { options: { enabled: account !== undefined } }) - const localInstance = instanceAccount.acct.includes('@') - ? instanceAccount.acct.includes(`@${instanceUri}`) + const localInstance = account?.acct.includes('@') + ? account?.acct.includes(`@${instanceUri}`) : true if (account || (localInstance && instanceAccount)) { @@ -52,7 +52,7 @@ const AccountInformationAccount: React.FC = ({ account }) => { }} selectable > - @{localInstance ? instanceAccount?.acct : account?.acct} + @{account?.acct} {localInstance ? `@${instanceUri}` : null} {relationship?.followed_by ? t('shared.account.followed_by') : null} diff --git a/src/screens/Tabs/Shared/Account/Information/Stats.tsx b/src/screens/Tabs/Shared/Account/Information/Stats.tsx index fe2c4e37..a9ff0751 100644 --- a/src/screens/Tabs/Shared/Account/Information/Stats.tsx +++ b/src/screens/Tabs/Shared/Account/Information/Stats.tsx @@ -53,7 +53,7 @@ const AccountInformationStats: React.FC = ({ account, myInfo }) => { onPress={() => navigation.push('Tab-Shared-Users', { reference: 'accounts', - id: account.id, + account, type: 'following', count: account.following_count }) @@ -77,7 +77,7 @@ const AccountInformationStats: React.FC = ({ account, myInfo }) => { onPress={() => navigation.push('Tab-Shared-Users', { reference: 'accounts', - id: account.id, + account, type: 'followers', count: account.followers_count }) diff --git a/src/screens/Tabs/Shared/Attachments.tsx b/src/screens/Tabs/Shared/Attachments.tsx index 948d2552..a4e75f03 100644 --- a/src/screens/Tabs/Shared/Attachments.tsx +++ b/src/screens/Tabs/Shared/Attachments.tsx @@ -44,7 +44,7 @@ const TabSharedAttachments: React.FC> = ({ navigation, route: { params } }) => { + const { colors } = useTheme() const { t } = useTranslation('screenTabs') useEffect(() => { navigation.setOptions({ @@ -23,8 +29,9 @@ const TabSharedUsers: React.FC> = const { data, hasNextPage, fetchNextPage, isFetchingNextPage } = useUsersQuery({ ...queryKey[1], options: { - getPreviousPageParam: firstPage => firstPage.links?.prev && { min_id: firstPage.links.next }, - getNextPageParam: lastPage => lastPage.links?.next && { max_id: lastPage.links.next } + getPreviousPageParam: firstPage => + firstPage.links?.prev?.id && { min_id: firstPage.links.prev.id }, + getNextPageParam: lastPage => lastPage.links?.next?.id && { max_id: lastPage.links.next.id } } }) const flattenData = data?.pages ? data.pages.flatMap(page => [...page.body]) : [] @@ -49,6 +56,31 @@ const TabSharedUsers: React.FC> = minIndexForVisible: 0, autoscrollToTopThreshold: 2 }} + ListHeaderComponent={ + data?.pages[0]?.warnIncomplete === true ? ( + + + + {t('shared.users.resultIncomplete')} + + + ) : null + } /> ) } diff --git a/src/utils/migrations/instances/migration.ts b/src/utils/migrations/instances/migration.ts index 69f9a1ab..dac284a4 100644 --- a/src/utils/migrations/instances/migration.ts +++ b/src/utils/migrations/instances/migration.ts @@ -133,8 +133,11 @@ const instancesMigration = { 11: (state: { instances: InstanceV10[] }): { instances: InstanceV11[] } => { return { instances: state.instances.map(instance => { + delete instance.timelinesLookback + return { ...instance, + followingPage: { showBoosts: true, showReplies: true }, mePage: { ...instance.mePage, followedTags: { shown: false } }, notifications_filter: { ...instance.notifications_filter, diff --git a/src/utils/migrations/instances/v11.ts b/src/utils/migrations/instances/v11.ts index fc5a578d..e02d72bb 100644 --- a/src/utils/migrations/instances/v11.ts +++ b/src/utils/migrations/instances/v11.ts @@ -1,5 +1,4 @@ import { ComposeStateDraft } from '@screens/Compose/utils/types' -import { QueryKeyTimeline } from '@utils/queryHooks/timeline' export type InstanceV11 = { active: boolean @@ -42,11 +41,9 @@ export type InstanceV11 = { private?: string // legacy } } - timelinesLookback?: { - [key: string]: { - queryKey: QueryKeyTimeline - ids: Mastodon.Status['id'][] - } + followingPage: { + showBoosts: boolean + showReplies: boolean } mePage: { followedTags: { shown: boolean } diff --git a/src/utils/navigation/navigators.ts b/src/utils/navigation/navigators.ts index 9762598a..0e5d2822 100644 --- a/src/utils/navigation/navigators.ts +++ b/src/utils/navigation/navigators.ts @@ -112,13 +112,13 @@ export type TabSharedStackParamList = { 'Tab-Shared-Users': | { reference: 'accounts' - id: Mastodon.Account['id'] + account: Pick type: 'following' | 'followers' count: number } | { reference: 'statuses' - id: Mastodon.Status['id'] + status: Pick type: 'reblogged_by' | 'favourited_by' count: number } diff --git a/src/utils/queryHooks/timeline.ts b/src/utils/queryHooks/timeline.ts index 17f811df..ea7c0fe6 100644 --- a/src/utils/queryHooks/timeline.ts +++ b/src/utils/queryHooks/timeline.ts @@ -18,25 +18,66 @@ import updateStatusProperty from './timeline/updateStatusProperty' export type QueryKeyTimeline = [ 'Timeline', - { - page: App.Pages - hashtag?: Mastodon.Tag['name'] - list?: Mastodon.List['id'] - toot?: Mastodon.Status['id'] - account?: Mastodon.Account['id'] - } + ( + | { + page: Exclude + } + | { + page: 'Following' + showBoosts: boolean + showReplies: boolean + } + | { + page: 'Hashtag' + hashtag: Mastodon.Tag['name'] + } + | { + page: 'List' + list: Mastodon.List['id'] + } + | { + page: 'Toot' + toot: Mastodon.Status['id'] + } + | { + page: 'Account' + account: Mastodon.Account['id'] + exclude_reblogs: boolean + only_media: boolean + } + ) ] const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext) => { - const { page, account, hashtag, list, toot } = queryKey[1] - let params: { [key: string]: string } = { ...pageParam } + const page = queryKey[1] + let params: { [key: string]: string } = { ...pageParam, limit: 40 } - switch (page) { + switch (page.page) { case 'Following': return apiInstance({ method: 'get', url: 'timelines/home', params + }).then(res => { + if (!page.showBoosts || !page.showReplies) { + return { + ...res, + body: res.body + .filter(status => { + if (!page.showBoosts && status.reblog) { + return null + } + if (!page.showReplies && status.in_reply_to_id?.length) { + return null + } + + return status + }) + .filter(s => s) + } + } else { + return res + } }) case 'Local': @@ -91,62 +132,57 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext({ + method: 'get', + url: `accounts/${page.account}/statuses`, + params: { + exclude_replies: 'true', + ...params + } + }) + } else { + const res1 = await apiInstance<(Mastodon.Status & { _pinned: boolean })[]>({ + method: 'get', + url: `accounts/${page.account}/statuses`, + params: { + pinned: 'true' + } + }) + res1.body = res1.body.map(status => { + status._pinned = true + return status + }) + const res2 = await apiInstance({ + method: 'get', + url: `accounts/${page.account}/statuses`, + params: { + exclude_replies: 'true' + } + }) + return { + body: uniqBy([...res1.body, ...res2.body], 'id'), + ...(res2.links.next && { links: { next: res2.links.next } }) + } + } + } else { return apiInstance({ method: 'get', - url: `accounts/${account}/statuses`, + url: `accounts/${page.account}/statuses`, params: { - exclude_replies: 'true', - ...params + ...params, + exclude_replies: page.exclude_reblogs.toString(), + only_media: page.only_media.toString() } }) - } else { - const res1 = await apiInstance<(Mastodon.Status & { _pinned: boolean })[]>({ - method: 'get', - url: `accounts/${account}/statuses`, - params: { - pinned: 'true' - } - }) - res1.body = res1.body.map(status => { - status._pinned = true - return status - }) - const res2 = await apiInstance({ - method: 'get', - url: `accounts/${account}/statuses`, - params: { - exclude_replies: 'true' - } - }) - return { - body: uniqBy([...res1.body, ...res2.body], 'id'), - ...(res2.links.next && { links: { next: res2.links.next } }) - } } - case 'Account_All': - return apiInstance({ - method: 'get', - url: `accounts/${account}/statuses`, - params - }) - - case 'Account_Attachments': - return apiInstance({ - method: 'get', - url: `accounts/${account}/statuses`, - params: { - only_media: 'true', - ...params - } - }) - case 'Hashtag': return apiInstance({ method: 'get', - url: `timelines/tag/${hashtag}`, + url: `timelines/tag/${page.hashtag}`, params }) @@ -174,21 +210,21 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext({ method: 'get', - url: `timelines/list/${list}`, + url: `timelines/list/${page.list}`, params }) case 'Toot': const res1_1 = await apiInstance({ method: 'get', - url: `statuses/${toot}` + url: `statuses/${page.toot}` }) const res2_1 = await apiInstance<{ ancestors: Mastodon.Status[] descendants: Mastodon.Status[] }>({ method: 'get', - url: `statuses/${toot}/context` + url: `statuses/${page.toot}/context` }) return { body: [...res2_1.body.ancestors, res1_1.body, ...res2_1.body.descendants] diff --git a/src/utils/queryHooks/users.ts b/src/utils/queryHooks/users.ts index 75507b99..810ffa03 100644 --- a/src/utils/queryHooks/users.ts +++ b/src/utils/queryHooks/users.ts @@ -6,24 +6,83 @@ import { useInfiniteQuery, UseInfiniteQueryOptions } from '@tanstack/react-query' +import apiGeneral from '@api/general' -export type QueryKeyUsers = [ - 'Users', - TabSharedStackParamList['Tab-Shared-Users'] -] +export type QueryKeyUsers = ['Users', TabSharedStackParamList['Tab-Shared-Users']] -const queryFunction = ({ - queryKey, - pageParam -}: QueryFunctionContext) => { - const { reference, id, type } = queryKey[1] +const queryFunction = ({ queryKey, pageParam }: QueryFunctionContext) => { + const page = queryKey[1] let params: { [key: string]: string } = { ...pageParam } - return apiInstance({ - method: 'get', - url: `${reference}/${id}/${type}`, - params - }) + switch (page.reference) { + case 'statuses': + return apiInstance({ + method: 'get', + url: `${page.reference}/${page.status.id}/${page.type}`, + params + }).then(res => ({ ...res, warnIncomplete: false })) + case 'accounts': + const localInstance = page.account.username === page.account.acct + if (localInstance) { + return apiInstance({ + method: 'get', + url: `${page.reference}/${page.account.id}/${page.type}`, + params + }).then(res => ({ ...res, warnIncomplete: false })) + } else { + const domain = page.account.url.match( + /^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/\n]+)/i + )?.[1] + if (!domain) { + return apiInstance({ + method: 'get', + url: `${page.reference}/${page.account.id}/${page.type}`, + params + }).then(res => ({ ...res, warnIncomplete: true })) + } + return apiGeneral<{ accounts: Mastodon.Account[] }>({ + method: 'get', + domain, + url: 'api/v2/search', + params: { + q: `@${page.account.acct}`, + type: 'accounts', + limit: '1' + } + }) + .then(res => { + if (res?.body?.accounts?.length === 1) { + return apiGeneral({ + method: 'get', + domain, + url: `api/v1/${page.reference}/${res.body.accounts[0].id}/${page.type}`, + params + }) + .catch(() => { + return apiInstance({ + method: 'get', + url: `${page.reference}/${page.account.id}/${page.type}`, + params + }).then(res => ({ ...res, warnIncomplete: true })) + }) + .then(res => ({ ...res, warnIncomplete: false })) + } else { + return apiInstance({ + method: 'get', + url: `${page.reference}/${page.account.id}/${page.type}`, + params + }).then(res => ({ ...res, warnIncomplete: true })) + } + }) + .catch(() => { + return apiInstance({ + method: 'get', + url: `${page.reference}/${page.account.id}/${page.type}`, + params + }).then(res => ({ ...res, warnIncomplete: true })) + }) + } + } } const useUsersQuery = ({ @@ -31,7 +90,7 @@ const useUsersQuery = ({ ...queryKeyParams }: QueryKeyUsers[1] & { options?: UseInfiniteQueryOptions< - InstanceResponse, + InstanceResponse & { warnIncomplete: boolean }, AxiosError > }) => { diff --git a/src/utils/slices/instances/add.ts b/src/utils/slices/instances/add.ts index bb9d3ba4..c059a344 100644 --- a/src/utils/slices/instances/add.ts +++ b/src/utils/slices/instances/add.ts @@ -107,7 +107,10 @@ const addInstance = createAsyncThunk( }, keys: { auth: undefined, public: undefined, private: undefined } }, - timelinesLookback: {}, + followingPage: { + showBoosts: true, + showReplies: true + }, mePage: { followedTags: { shown: false }, lists: { shown: false }, diff --git a/src/utils/slices/instancesSlice.ts b/src/utils/slices/instancesSlice.ts index 87abf486..54ace209 100644 --- a/src/utils/slices/instancesSlice.ts +++ b/src/utils/slices/instancesSlice.ts @@ -81,16 +81,15 @@ const instancesSlice = createSlice({ return newInstance }) }, - updateInstanceTimelineLookback: ( + updateInstanceFollowingPage: ( { instances }, - action: PayloadAction + action: PayloadAction> ) => { const activeIndex = findInstanceActive(instances) - instances[activeIndex] && - (instances[activeIndex].timelinesLookback = { - ...instances[activeIndex].timelinesLookback, - ...action.payload - }) + instances[activeIndex].followingPage = { + ...instances[activeIndex].followingPage, + ...action.payload + } }, updateInstanceMePage: ( { instances }, @@ -360,8 +359,8 @@ export const getInstanceNotificationsFilter = ({ instances: { instances } }: Roo export const getInstancePush = ({ instances: { instances } }: RootState) => instances[findInstanceActive(instances)]?.push -export const getInstanceTimelinesLookback = ({ instances: { instances } }: RootState) => - instances[findInstanceActive(instances)]?.timelinesLookback +export const getInstanceFollowingPage = ({ instances: { instances } }: RootState) => + instances[findInstanceActive(instances)]?.followingPage export const getInstanceMePage = ({ instances: { instances } }: RootState) => instances[findInstanceActive(instances)]?.mePage @@ -379,7 +378,7 @@ export const { updateInstanceDraft, removeInstanceDraft, disableAllPushes, - updateInstanceTimelineLookback, + updateInstanceFollowingPage, updateInstanceMePage, countInstanceEmoji } = instancesSlice.actions diff --git a/yarn.lock b/yarn.lock index 5a678791..7e9c2df6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11339,7 +11339,7 @@ router-ips@^1.0.0: resolved "https://registry.yarnpkg.com/router-ips/-/router-ips-1.0.0.tgz#44e00858ebebc0133d58e40b2cd8a1fbb04203f5" integrity sha512-yBo6F52Un/WYioXbedBGvrKIiofbwt+4cUhdqDb9fNMJBI4D4jOy7jlxxaRVEvICPKU7xMmJDtDFR6YswX/sFQ== -rtl-detect@^1.0.2: +rtl-detect@^1.0.2, rtl-detect@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==