1
0
mirror of https://github.com/tooot-app/app synced 2025-05-28 18:04:18 +02:00

Merge branch 'main' into release

This commit is contained in:
xmflsct 2023-01-27 23:11:40 +01:00
commit 6bdf53d4dc
202 changed files with 5721 additions and 2114 deletions

View File

@ -1,5 +1,5 @@
diff --git a/RNFastImage.podspec b/RNFastImage.podspec
index db0fada63fc06191f8620d336d244edde6c3dba3..b6ffe6c77ab1fd5b821525f6f0b7363a13cba3a0 100644
index db0fada63fc06191f8620d336d244edde6c3dba3..9c22c36f6978530da21afe143324ff79b4e96454 100644
--- a/RNFastImage.podspec
+++ b/RNFastImage.podspec
@@ -16,6 +16,6 @@ Pod::Spec.new do |s|
@ -8,7 +8,7 @@ index db0fada63fc06191f8620d336d244edde6c3dba3..b6ffe6c77ab1fd5b821525f6f0b7363a
s.dependency 'React-Core'
- s.dependency 'SDWebImage', '~> 5.11.1'
- s.dependency 'SDWebImageWebPCoder', '~> 0.8.4'
+ s.dependency 'SDWebImage', '~> 5.14.3'
+ s.dependency 'SDWebImage', '~> 5.15.0'
+ s.dependency 'SDWebImageWebPCoder', '~> 0.9.1'
end
diff --git a/android/build.gradle b/android/build.gradle

View File

@ -16,7 +16,7 @@ PODS:
- ExpoModulesCore
- EXNotifications (0.17.0):
- ExpoModulesCore
- Expo (47.0.12):
- Expo (47.0.13):
- ExpoModulesCore
- ExpoCrypto (12.1.0):
- ExpoModulesCore
@ -301,11 +301,11 @@ PODS:
- React-Core
- react-native-blurhash (1.1.10):
- React-Core
- react-native-cameraroll (5.2.1):
- react-native-cameraroll (5.2.3):
- React-Core
- react-native-image-picker (4.10.3):
- react-native-image-picker (5.0.1):
- React-Core
- react-native-ios-context-menu (1.15.1):
- react-native-ios-context-menu (1.15.3):
- React-Core
- react-native-language-detection (0.2.2):
- React
@ -318,12 +318,12 @@ PODS:
- React-Core
- react-native-pager-view (6.1.2):
- React-Core
- react-native-paste-input (0.5.2):
- react-native-paste-input (0.6.0):
- React-Core
- Swime (= 3.0.6)
- react-native-quick-base64 (2.0.5):
- React-Core
- react-native-safe-area-context (4.4.1):
- react-native-safe-area-context (4.5.0):
- RCT-Folly
- RCTRequired
- RCTTypeSafety
@ -403,11 +403,11 @@ PODS:
- React-Core
- RNFastImage (8.6.3):
- React-Core
- SDWebImage (~> 5.14.3)
- SDWebImage (~> 5.15.0)
- SDWebImageWebPCoder (~> 0.9.1)
- RNGestureHandler (2.8.0):
- RNGestureHandler (2.9.0):
- React-Core
- RNReanimated (2.13.0):
- RNReanimated (2.14.4):
- DoubleConversion
- FBLazyVector
- FBReactNativeSpec
@ -434,23 +434,23 @@ PODS:
- React-RCTText
- ReactCommon/turbomodule/core
- Yoga
- RNScreens (3.18.2):
- RNScreens (3.19.0):
- React-Core
- React-RCTImage
- RNSentry (4.12.0):
- RNSentry (4.13.0):
- React-Core
- Sentry/HybridSDK (= 7.31.3)
- Sentry/HybridSDK (= 7.31.5)
- RNShareMenu (6.0.0):
- React
- RNSVG (13.6.0):
- RNSVG (13.7.0):
- React-Core
- SDWebImage (5.14.3):
- SDWebImage/Core (= 5.14.3)
- SDWebImage/Core (5.14.3)
- SDWebImage (5.15.0):
- SDWebImage/Core (= 5.15.0)
- SDWebImage/Core (5.15.0)
- SDWebImageWebPCoder (0.9.1):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.13)
- Sentry/HybridSDK (7.31.3)
- Sentry/HybridSDK (7.31.5)
- Swime (3.0.6)
- Yoga (1.14.0)
@ -716,7 +716,7 @@ SPEC CHECKSUMS:
EXFileSystem: 60602b6eefa6873f97172c684b7537c9760b50d6
EXFont: 319606bfe48c33b5b5063fb0994afdc496befe80
EXNotifications: babce2a87b7922051354fcfe7a74dd279b7e272a
Expo: f48d305fda3e4e501d686e6bad7d8c8373828279
Expo: b9fa98bf260992312ee3c424400819fb9beadafe
ExpoCrypto: 6eb2a5ede7d95b7359a5f0391ee0c5d2ecd144b3
ExpoHaptics: 129d3f8d44c2205adcdf8db760602818463d5437
ExpoKeepAwake: 69b59d0a8d2b24de9f82759c39b3821fec030318
@ -756,17 +756,17 @@ SPEC CHECKSUMS:
React-logger: 1623c216abaa88974afce404dc8f479406bbc3a0
react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3
react-native-blurhash: add4df9a937b4e021a24bc67a0714f13e0bd40b7
react-native-cameraroll: f94bf9f46c998963ecd2bb6e9a3f9cca59b6d9f1
react-native-image-picker: 60f4246eb5bb7187fc15638a8c1f13abd3820695
react-native-ios-context-menu: b170594b4448c0cd10c79e13432216bac99de1ac
react-native-cameraroll: 5b25d0be40185d02e522bf2abf8a1ba4e8faa107
react-native-image-picker: 8cb4280e2c1efc3daeb2d9d597f9429a60472e40
react-native-ios-context-menu: e529171ba760a1af7f2ef0729f5a7f4d226171c5
react-native-language-detection: f414937fa715108ab50a6269a3de0bcb95e4ceb0
react-native-menu: 9d7d6f819cc7fa14a15cf86888c53f3240d86f1b
react-native-mmkv: 69b9c003f10afdd01addf7c6ee784ce42ee2eff3
react-native-netinfo: 2517ad504b3d303e90d7a431b0fcaef76d207983
react-native-pager-view: 54bed894cecebe28cede54c01038d9d1e122de43
react-native-paste-input: 88709b4fd586ea8cc56ba5e2fc4cdfe90597730c
react-native-paste-input: 5182843692fd2ec72be50f241a38a49796e225d7
react-native-quick-base64: e657e9197e61b60a9dec49807843052b830da254
react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc
react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097
React-perflogger: 8c79399b0500a30ee8152d0f9f11beae7fc36595
React-RCTActionSheet: 7316773acabb374642b926c19aef1c115df5c466
@ -782,16 +782,16 @@ SPEC CHECKSUMS:
ReactCommon: 349be31adeecffc7986a0de875d7fb0dcf4e251c
RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60
RNCClipboard: 2834e1c4af68697089cdd455ee4a4cdd198fa7dd
RNFastImage: 756ab178acb5e3f11d8b0a931956fbd9da8d6e54
RNGestureHandler: 62232ba8f562f7dea5ba1b3383494eb5bf97a4d3
RNReanimated: ce445c233a6ff5600223484a88ad5704945d972a
RNScreens: 34cc502acf1b916c582c60003dc3089fa01dc66d
RNSentry: 4c09f4dd9740cb9b33e94303de5b6d0dbeb0737d
RNFastImage: bd611b5635f1e0f43c8ccf597b1ef6ee0d0f966d
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
RNReanimated: 6668b0587bebd4b15dd849b99e5a9c70fc12ed95
RNScreens: ea4cd3a853063cda19a4e3c28d2e52180c80f4eb
RNSentry: acebe4104a6f5915ae871eb59dc73f13dcc92ef7
RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3
RNSVG: 3a79c0c4992213e4f06c08e62730c5e7b9e4dc17
SDWebImage: 9c36e66c8ce4620b41a7407698dda44211a96764
RNSVG: d787d64ca06b9158e763ad2638a8c4edce00782a
SDWebImage: 9bec4c5cdd9579e1f57104735ee0c37df274d593
SDWebImageWebPCoder: 18503de6621dd2c420d680e33d46bf8e1d5169b0
Sentry: 08884c523575ec0f6690d94ed3ccb0246a1600bf
Sentry: 4c9babff9034785067c896fd580b1f7de44da020
Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
Yoga: 99caf8d5ab45e9d637ee6e0174ec16fbbb01bcfc

View File

@ -1,6 +1,6 @@
{
"name": "tooot",
"version": "4.8.3",
"version": "4.8.4",
"description": "tooot for Mastodon",
"author": "xmflsct <me@xmflsct.com>",
"license": "GPL-3.0-or-later",
@ -24,26 +24,26 @@
"@formatjs/intl-numberformat": "^8.3.3",
"@formatjs/intl-pluralrules": "^5.1.8",
"@formatjs/intl-relativetimeformat": "^11.1.8",
"@mattermost/react-native-paste-input": "^0.5.2",
"@mattermost/react-native-paste-input": "^0.6.0",
"@neverdull-agency/expo-unlimited-secure-store": "^1.0.10",
"@react-native-async-storage/async-storage": "~1.17.11",
"@react-native-camera-roll/camera-roll": "^5.2.1",
"@react-native-camera-roll/camera-roll": "^5.2.3",
"@react-native-clipboard/clipboard": "^1.11.1",
"@react-native-community/blur": "^4.3.0",
"@react-native-community/netinfo": "9.3.7",
"@react-native-community/segmented-control": "^2.2.2",
"@react-native-firebase/app": "^16.5.0",
"@react-native-firebase/app": "^16.5.2",
"@react-native-menu/menu": "^0.7.3",
"@react-navigation/bottom-tabs": "^6.5.2",
"@react-navigation/native": "^6.1.1",
"@react-navigation/native-stack": "^6.9.7",
"@react-navigation/stack": "^6.3.10",
"@sentry/react-native": "4.12.0",
"@react-navigation/bottom-tabs": "^6.5.3",
"@react-navigation/native": "^6.1.2",
"@react-navigation/native-stack": "^6.9.8",
"@react-navigation/stack": "^6.3.11",
"@sentry/react-native": "4.13.0",
"@sharcoux/slider": "^6.1.1",
"@tanstack/react-query": "^4.20.9",
"axios": "^1.2.2",
"@tanstack/react-query": "^4.23.0",
"axios": "^1.2.4",
"diff": "^5.1.0",
"expo": "^47.0.12",
"expo": "^47.0.13",
"expo-auth-session": "^3.8.0",
"expo-av": "^13.1.0",
"expo-constants": "^14.1.0",
@ -62,7 +62,7 @@
"expo-video-thumbnails": "^7.1.0",
"expo-web-browser": "~12.0.0",
"htmlparser2": "^8.0.1",
"i18next": "^22.4.8",
"i18next": "^22.4.9",
"linkify-it": "^4.0.1",
"lodash": "^4.17.21",
"react": "^18.2.0",
@ -72,21 +72,20 @@
"react-native": "^0.70.6",
"react-native-blurhash": "^1.1.10",
"react-native-fast-image": "^8.6.3",
"react-native-feather": "^1.1.2",
"react-native-flash-message": "^0.4.0",
"react-native-gesture-handler": "~2.8.0",
"react-native-image-picker": "^4.10.3",
"react-native-ios-context-menu": "^1.15.1",
"react-native-gesture-handler": "~2.9.0",
"react-native-image-picker": "^5.0.1",
"react-native-ios-context-menu": "^1.15.3",
"react-native-language-detection": "^0.2.2",
"react-native-mmkv": "^2.5.1",
"react-native-pager-view": "^6.1.2",
"react-native-quick-base64": "^2.0.5",
"react-native-reanimated": "^2.13.0",
"react-native-reanimated": "^2.14.4",
"react-native-reanimated-zoom": "^0.3.3",
"react-native-safe-area-context": "^4.4.1",
"react-native-screens": "^3.18.2",
"react-native-safe-area-context": "^4.5.0",
"react-native-screens": "^3.19.0",
"react-native-share-menu": "^6.0.0",
"react-native-svg": "^13.6.0",
"react-native-svg": "^13.7.0",
"react-native-swipe-list-view": "^3.2.9",
"react-native-tab-view": "^3.3.4",
"react-redux": "^8.0.5",
@ -102,14 +101,15 @@
"@types/diff": "^5.0.2",
"@types/linkify-it": "^3.0.2",
"@types/lodash": "^4.14.191",
"@types/react": "^18.0.26",
"@types/react": "^18.0.27",
"@types/react-dom": "^18.0.10",
"@types/react-native": "^0.70.8",
"@types/react-native": "^0.70.9",
"@types/react-native-share-menu": "^5.0.2",
"@types/url-parse": "^1.4.8",
"babel-plugin-module-resolver": "^4.1.0",
"babel-plugin-module-resolver": "^5.0.0",
"babel-plugin-transform-remove-console": "^6.9.4",
"chalk": "^4.1.2",
"deprecated-react-native-prop-types": "^4.0.0",
"dotenv": "^16.0.3",
"react-native-clean-project": "^4.0.1",
"typescript": "^4.9.4"

View File

@ -452,6 +452,7 @@ declare namespace Mastodon {
'posting:default:language'?: string
'reading:expand:media'?: 'default' | 'show_all' | 'hide_all'
'reading:expand:spoilers'?: boolean
'reading:autoplay:gifs'?: boolean
}
type PushSubscription = {

View File

@ -1,5 +1,4 @@
declare module 'gl-react-blurhash'
declare module 'react-native-feather'
declare module 'react-native-toast-message'
declare module 'rtl-detect'

View File

@ -68,7 +68,7 @@ const ComponentAccount: React.FC<PropsWithChildren & Props> = ({ account, props,
</View>
{props.onPress && !props.disabled ? (
<Icon
name='ChevronRight'
name='chevron-right'
size={StyleConstants.Font.Size.L}
color={colors.secondary}
style={{ marginLeft: 8 }}

View File

@ -1,4 +1,4 @@
import Icon from '@components/Icon'
import Icon, { IconName } from '@components/Icon'
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React, { useState } from 'react'
@ -6,21 +6,17 @@ import { AccessibilityProps, Pressable, StyleProp, View, ViewStyle } from 'react
import { Loading } from './Loading'
import CustomText from './Text'
export interface Props {
export type Props = {
accessibilityLabel?: AccessibilityProps['accessibilityLabel']
accessibilityHint?: AccessibilityProps['accessibilityHint']
style?: StyleProp<ViewStyle>
type: 'icon' | 'text'
content: string
selected?: boolean
loading?: boolean
destructive?: boolean
disabled?: boolean
strokeWidth?: number
size?: 'S' | 'M' | 'L'
fontBold?: boolean
spacing?: 'XS' | 'S' | 'M' | 'L'
@ -28,7 +24,7 @@ export interface Props {
overlay?: boolean
onPress: () => void
}
} & ({ type: 'icon'; content: IconName } | { type: 'text'; content: string })
const Button: React.FC<Props> = ({
accessibilityLabel,
@ -40,7 +36,6 @@ const Button: React.FC<Props> = ({
loading = false,
destructive = false,
disabled = false,
strokeWidth,
size = 'M',
fontBold = false,
spacing = 'S',
@ -81,7 +76,6 @@ const Button: React.FC<Props> = ({
<Icon
name={content}
color={mainColor()}
strokeWidth={strokeWidth}
style={{ opacity: loading ? 0 : 1 }}
size={StyleConstants.Font.Size[size] * (size === 'L' ? 1.25 : 1)}
/>

View File

@ -39,7 +39,7 @@ const EmojisButton: React.FC = () => {
}}
>
<Icon
name={emojis.current && emojis.current.length ? 'Smile' : 'Meh'}
name={emojis.current && emojis.current.length ? 'smile' : 'meh'}
size={24}
color={
emojis.current && emojis.current.length ? colors.primaryDefault : colors.disabled

View File

@ -188,7 +188,7 @@ const EmojisList = () => {
paddingRight: StyleConstants.Spacing.S
}}
>
<Icon name='Search' size={StyleConstants.Font.Size.L} color={colors.secondary} />
<Icon name='search' size={StyleConstants.Font.Size.L} color={colors.secondary} />
</View>
<TextInput
style={{
@ -214,7 +214,7 @@ const EmojisList = () => {
emojisDispatch({ type: 'target', payload: -1 })
}}
>
<Icon name='ChevronDown' size={StyleConstants.Font.Size.L} color={colors.secondary} />
<Icon name='chevron-down' size={StyleConstants.Font.Size.L} color={colors.secondary} />
</Pressable>
</View>
<SectionList

111
src/components/Filter.tsx Normal file
View File

@ -0,0 +1,111 @@
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { Fragment } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import { View, ViewStyle } from 'react-native'
import { TouchableNativeFeedback } from 'react-native-gesture-handler'
import Icon from './Icon'
import CustomText from './Text'
export type Props = {
onPress: () => void
filter: Mastodon.Filter<'v2'>
button?: React.ReactNode
style?: ViewStyle
}
export const Filter: React.FC<Props> = ({ onPress, filter, button, style }) => {
const { t } = useTranslation(['common', 'screenTabs'])
const { colors } = useTheme()
return (
<TouchableNativeFeedback onPress={onPress}>
<View
style={{
paddingVertical: StyleConstants.Spacing.S,
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.backgroundDefault,
...style
}}
>
<View style={{ flex: 1 }}>
<CustomText
fontStyle='M'
children={filter.title}
style={{ color: colors.primaryDefault }}
numberOfLines={1}
/>
<View
style={{
flexDirection: 'row',
alignItems: 'center',
marginVertical: StyleConstants.Spacing.XS
}}
>
{filter.expires_at && new Date() > new Date(filter.expires_at) ? (
<CustomText
fontStyle='S'
fontWeight='Bold'
children={t('screenTabs:me.preferencesFilters.expired')}
style={{ color: colors.red, marginRight: StyleConstants.Spacing.M }}
/>
) : null}
{filter.keywords?.length ? (
<CustomText
children={t('screenTabs:me.preferencesFilters.keywords', {
count: filter.keywords.length
})}
style={{ color: colors.primaryDefault }}
/>
) : null}
{filter.keywords?.length && filter.statuses?.length ? (
<CustomText
children={t('common:separator')}
style={{ color: colors.primaryDefault }}
/>
) : null}
{filter.statuses?.length ? (
<CustomText
children={t('screenTabs:me.preferencesFilters.statuses', {
count: filter.statuses.length
})}
style={{ color: colors.primaryDefault }}
/>
) : null}
</View>
<CustomText
style={{ color: colors.secondary }}
children={
<Trans
ns='screenTabs'
i18nKey='me.preferencesFilters.context'
components={[
<>
{filter.context.map((c, index) => (
<Fragment key={index}>
<CustomText
style={{ color: colors.secondary }}
children={t(`screenTabs:me.preferencesFilters.contexts.${c}`)}
/>
<CustomText children={t('common:separator')} />
</Fragment>
))}
</>
]}
/>
}
/>
</View>
{button || (
<Icon
name='chevron-right'
size={StyleConstants.Font.Size.L}
color={colors.primaryDefault}
style={{ marginLeft: 8 }}
/>
)}
</View>
</TouchableNativeFeedback>
)
}

View File

@ -22,7 +22,7 @@ const ComponentHashtag: React.FC<PropsWithChildren & Props> = ({
const navigation = useNavigation<StackNavigationProp<TabLocalStackParamList>>()
const onPress = () => {
navigation.push('Tab-Shared-Hashtag', { hashtag: hashtag.name })
navigation.push('Tab-Shared-Hashtag', { tag_name: hashtag.name })
}
const padding = StyleConstants.Spacing.Global.PagePadding

View File

@ -1,21 +1,19 @@
import Icon from '@components/Icon'
import Icon, { IconName } 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 { Pressable } from 'react-native'
export interface Props {
type?: 'icon' | 'text'
content?: string
export type Props = {
native?: boolean
background?: boolean
onPress: () => void
}
} & ({ type?: undefined; content?: IconName } | { type: 'text'; content: string })
const HeaderLeft: React.FC<Props> = ({
type = 'icon',
type,
content,
native = true,
background = false,
@ -25,18 +23,18 @@ const HeaderLeft: React.FC<Props> = ({
const children = () => {
switch (type) {
case 'icon':
return (
<Icon
color={colors.primaryDefault}
name={content || 'ChevronLeft'}
size={StyleConstants.Spacing.M * 1.25}
/>
)
case 'text':
return (
<CustomText fontStyle='M' style={{ color: colors.primaryDefault }} children={content} />
)
default:
return (
<Icon
color={colors.primaryDefault}
name={content || 'chevron-left'}
size={StyleConstants.Spacing.M * 1.25}
/>
)
}
}
@ -52,7 +50,7 @@ const HeaderLeft: React.FC<Props> = ({
minHeight: 44,
minWidth: 44,
marginLeft: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S,
...(type === 'icon' && {
...(type === undefined && {
borderRadius: 100
}),
...(type === 'text' && {

View File

@ -1,4 +1,4 @@
import Icon from '@components/Icon'
import Icon, { IconName } from '@components/Icon'
import { Loading } from '@components/Loading'
import CustomText from '@components/Text'
import { StyleConstants } from '@utils/styles/constants'
@ -6,13 +6,11 @@ import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
import { AccessibilityProps, Pressable, View } from 'react-native'
export interface Props {
export type Props = {
accessibilityLabel?: string
accessibilityHint?: string
accessibilityState?: AccessibilityProps['accessibilityState']
type?: 'icon' | 'text'
content: string
native?: boolean
background?: boolean
@ -21,7 +19,7 @@ export interface Props {
destructive?: boolean
onPress: () => void
}
} & ({ type?: undefined; content: IconName } | { type: 'text'; content: string })
const HeaderRight: React.FC<Props> = ({
// Accessibility - Start
@ -29,7 +27,7 @@ const HeaderRight: React.FC<Props> = ({
accessibilityHint,
accessibilityState,
// Accessibility - End
type = 'icon',
type,
content,
native = true,
background = false,
@ -38,7 +36,7 @@ const HeaderRight: React.FC<Props> = ({
destructive = false,
onPress
}) => {
const { colors, theme } = useTheme()
const { colors } = useTheme()
const loadingSpinkit = () =>
loading ? (
@ -49,18 +47,6 @@ const HeaderRight: React.FC<Props> = ({
const children = () => {
switch (type) {
case 'icon':
return (
<>
<Icon
name={content}
style={{ opacity: loading ? 0 : 1 }}
size={StyleConstants.Spacing.M * 1.25}
color={disabled ? colors.secondary : destructive ? colors.red : colors.primaryDefault}
/>
{loadingSpinkit()}
</>
)
case 'text':
return (
<>
@ -80,6 +66,18 @@ const HeaderRight: React.FC<Props> = ({
{loadingSpinkit()}
</>
)
default:
return (
<>
<Icon
name={content}
style={{ opacity: loading ? 0 : 1 }}
size={StyleConstants.Spacing.M * 1.25}
color={disabled ? colors.secondary : destructive ? colors.red : colors.primaryDefault}
/>
{loadingSpinkit()}
</>
)
}
}
@ -100,7 +98,7 @@ const HeaderRight: React.FC<Props> = ({
minHeight: 44,
minWidth: 44,
marginRight: native ? -StyleConstants.Spacing.S : StyleConstants.Spacing.S,
...(type === 'icon' && {
...(type === undefined && {
borderRadius: 100
}),
...(type === 'text' && {

23
src/components/Hr.tsx Normal file
View File

@ -0,0 +1,23 @@
import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import { View, ViewStyle } from 'react-native'
const Hr: React.FC<{ style?: ViewStyle }> = ({ style }) => {
const { colors } = useTheme()
return (
<View
style={[
{
borderTopColor: colors.border,
borderTopWidth: 1,
height: 1,
paddingVertical: StyleConstants.Spacing.S
},
style
]}
/>
)
}
export default Hr

View File

@ -1,15 +1,16 @@
import React, { createElement } from 'react'
import FeatherNames from '@expo/vector-icons/build/vendor/react-native-vector-icons/glyphmaps/Feather.json'
import Feather from '@expo/vector-icons/Feather'
import React from 'react'
import { AccessibilityProps, StyleProp, View, ViewStyle } from 'react-native'
import * as FeatherIcon from 'react-native-feather'
export type IconName = keyof typeof FeatherNames
export interface Props {
accessibilityLabel?: AccessibilityProps['accessibilityLabel']
name: string
name: IconName
size: number
color: string
fill?: string
strokeWidth?: number
style?: StyleProp<ViewStyle>
crossOut?: boolean
}
@ -19,8 +20,6 @@ const Icon: React.FC<Props> = ({
name,
size,
color,
fill,
strokeWidth = 2,
style,
crossOut = false
}) => {
@ -37,13 +36,7 @@ const Icon: React.FC<Props> = ({
}
]}
>
{createElement(FeatherIcon[name], {
width: size,
height: size,
color,
fill,
strokeWidth
})}
<Feather name={name} size={size} color={color} />
{crossOut ? (
<View
style={{
@ -51,7 +44,7 @@ const Icon: React.FC<Props> = ({
transform: [{ rotate: '45deg' }],
width: size * 1.35,
borderBottomColor: color,
borderBottomWidth: strokeWidth
borderBottomWidth: 2
}}
/>
) : null}

View File

@ -9,7 +9,9 @@ import CustomText from './Text'
export type Props = {
title?: string
multiline?: boolean
} & Pick<NonNullable<EmojisState['inputProps'][0]>, 'value' | 'selection' | 'isFocused'> &
invalid?: boolean
} & Pick<NonNullable<EmojisState['inputProps'][0]>, 'value'> &
Pick<Partial<EmojisState['inputProps'][0]>, 'isFocused' | 'selection'> &
Omit<
TextInputProps,
| 'style'
@ -27,8 +29,9 @@ const ComponentInput = forwardRef(
{
title,
multiline = false,
invalid = false,
value: [value, setValue],
selection: [selection, setSelection],
selection,
isFocused,
...props
}: Props,
@ -43,7 +46,7 @@ const ComponentInput = forwardRef(
paddingHorizontal: withTiming(StyleConstants.Spacing.XS),
left: withTiming(StyleConstants.Spacing.S),
top: withTiming(-(StyleConstants.Font.Size.S / 2) - 2),
backgroundColor: withTiming(colors.backgroundDefault)
backgroundColor: colors.backgroundDefault
}
} else {
return {
@ -62,7 +65,7 @@ const ComponentInput = forwardRef(
borderWidth: 1,
marginVertical: StyleConstants.Spacing.S,
padding: StyleConstants.Spacing.S,
borderColor: colors.border,
borderColor: invalid ? colors.red : colors.border,
flexDirection: multiline ? 'column' : 'row',
alignItems: 'stretch'
}}
@ -78,9 +81,13 @@ const ComponentInput = forwardRef(
}}
value={value}
onChangeText={setValue}
onFocus={() => (isFocused.current = true)}
onBlur={() => (isFocused.current = false)}
onSelectionChange={({ nativeEvent }) => setSelection(nativeEvent.selection)}
{...(isFocused !== undefined && {
onFocus: () => (isFocused.current = true),
onBlur: () => (isFocused.current = false)
})}
{...(selection !== undefined && {
onSelectionChange: ({ nativeEvent }) => selection[1](nativeEvent.selection)
})}
{...(multiline && {
multiline,
numberOfLines: Platform.OS === 'android' ? 5 : undefined

View File

@ -235,12 +235,7 @@ const ComponentInstance: React.FC<Props> = ({
/>
</View>
) : null}
<View
style={{
marginTop: StyleConstants.Spacing.L,
marginHorizontal: StyleConstants.Spacing.Global.PagePadding
}}
>
<View style={{ marginTop: StyleConstants.Spacing.L }}>
<View
style={{
flexDirection: 'row',
@ -345,7 +340,7 @@ const ComponentInstance: React.FC<Props> = ({
}}
>
<Icon
name='Lock'
name='lock'
size={StyleConstants.Font.Size.S}
color={colors.secondary}
style={{
@ -365,7 +360,7 @@ const ComponentInstance: React.FC<Props> = ({
}}
>
<Icon
name='CheckSquare'
name='check-square'
size={StyleConstants.Font.Size.S}
color={colors.secondary}
style={{

View File

@ -1,17 +1,19 @@
import { StyleConstants } from '@utils/styles/constants'
import React from 'react'
import { View } from 'react-native'
import { View, ViewStyle } from 'react-native'
export interface Props {
style?: ViewStyle
children: React.ReactNode
}
const MenuContainer: React.FC<Props> = ({ children }) => {
const MenuContainer: React.FC<Props> = ({ style, children }) => {
return (
<View
style={{
paddingHorizontal: StyleConstants.Spacing.Global.PagePadding,
marginBottom: StyleConstants.Spacing.Global.PagePadding
marginBottom: StyleConstants.Spacing.Global.PagePadding,
...style
}}
>
{children}

View File

@ -1,4 +1,4 @@
import Icon from '@components/Icon'
import Icon, { IconName } from '@components/Icon'
import { Loading } from '@components/Loading'
import CustomText from '@components/Text'
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
@ -10,7 +10,7 @@ import { View } from 'react-native'
import { State, Switch, TapGestureHandler } from 'react-native-gesture-handler'
export interface Props {
iconFront?: any
iconFront?: IconName
iconFrontColor?: ColorDefinitions
title: string
@ -22,7 +22,7 @@ export interface Props {
switchDisabled?: boolean
switchOnValueChange?: () => void
iconBack?: 'ChevronRight' | 'ExternalLink' | 'Check'
iconBack?: 'chevron-right' | 'external-link' | 'check'
iconBackColor?: ColorDefinitions
loading?: boolean
@ -44,7 +44,7 @@ const MenuRow: React.FC<Props> = ({
loading = false,
onPress
}) => {
const { colors, theme } = useTheme()
const { colors } = useTheme()
const { screenReaderEnabled } = useAccessibility()
return (

View File

@ -54,13 +54,13 @@ const Message = React.forwardRef<FlashMessage>((_, ref) => {
const { colors, theme } = useTheme()
enum iconMapping {
success = 'CheckCircle',
danger = 'XCircle',
warning = 'AlertCircle',
none = '',
default = '',
info = '',
auto = ''
success = 'check-circle',
danger = 'x-circle',
warning = 'alert-circle',
none = 'x',
default = 'x',
info = 'x',
auto = 'x'
}
enum colorMapping {
success = 'blue',

View File

@ -0,0 +1,29 @@
import { useHeaderHeight } from '@react-navigation/elements'
import { StyleConstants } from '@utils/styles/constants'
import { forwardRef, PropsWithChildren, RefObject } from 'react'
import { KeyboardAvoidingView, Platform, ScrollView } from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
export const ModalScrollView = forwardRef(
({ children }: PropsWithChildren, ref: RefObject<ScrollView>) => {
const headerHeight = useHeaderHeight()
return (
<KeyboardAvoidingView
style={{ flex: 1 }}
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
keyboardVerticalOffset={headerHeight}
>
<SafeAreaView style={{ flex: 1 }} edges={['bottom']}>
<ScrollView
ref={ref}
keyboardShouldPersistTaps='always'
contentContainerStyle={{ padding: StyleConstants.Spacing.Global.PagePadding }}
>
{children}
</ScrollView>
</SafeAreaView>
</KeyboardAvoidingView>
)
}
)

View File

@ -69,6 +69,7 @@ const ParseHTML: React.FC<Props> = ({
const [followedTags] = useAccountStorage.object('followed_tags')
const MAX_ALLOWED_LINES = 35
const [totalLines, setTotalLines] = useState<number>()
const [expanded, setExpanded] = useState(highlighted)
@ -146,7 +147,7 @@ const ParseHTML: React.FC<Props> = ({
tag?.length &&
!disableDetails &&
!sameHashtag &&
navigation.push('Tab-Shared-Hashtag', { hashtag: tag })
navigation.push('Tab-Shared-Hashtag', { tag_name: tag })
}
children={children}
/>
@ -202,9 +203,7 @@ const ParseHTML: React.FC<Props> = ({
onPress={async () => {
if (!disableDetails) {
if (shouldBeTag) {
navigation.push('Tab-Shared-Hashtag', {
hashtag: content.substring(1)
})
navigation.push('Tab-Shared-Hashtag', { tag_name: content.substring(1) })
} else {
await openLink(href, navigation)
}
@ -275,14 +274,18 @@ const ParseHTML: React.FC<Props> = ({
hint: expandHint,
moreLines:
numberOfLines > 1 && typeof totalLines === 'number'
? t('HTML.moreLines', { count: totalLines - numberOfLines })
? t('HTML.moreLines', {
count:
totalLines === MAX_ALLOWED_LINES
? (`${totalLines - numberOfLines}+` as unknown as number)
: totalLines - numberOfLines
})
: ''
})}
/>
<Icon
name={expanded ? 'Minimize2' : 'Maximize2'}
name={expanded ? 'minimize-2' : 'maximize-2'}
color={colors.primaryDefault}
strokeWidth={2}
size={StyleConstants.Font.Size[size]}
/>
</Pressable>
@ -304,7 +307,11 @@ const ParseHTML: React.FC<Props> = ({
height: numberOfLines === 1 && !expanded ? 0 : undefined
}}
numberOfLines={
typeof totalLines === 'number' ? (expanded ? 999 : numberOfLines) : undefined
typeof totalLines === 'number'
? expanded
? 999
: numberOfLines
: Math.max(MAX_ALLOWED_LINES, numberOfLines)
}
selectable={selectable}
/>

View File

@ -51,7 +51,7 @@ const RelationshipIncoming: React.FC<Props> = ({ id }) => {
<Button
round
type='icon'
content='X'
content='x'
loading={mutation.isLoading}
onPress={() =>
mutation.mutate({
@ -64,7 +64,7 @@ const RelationshipIncoming: React.FC<Props> = ({ id }) => {
<Button
round
type='icon'
content='Check'
content='check'
loading={mutation.isLoading}
onPress={() =>
mutation.mutate({

View File

@ -13,7 +13,6 @@ import { StyleConstants } from '@utils/styles/constants'
import { useTheme } from '@utils/styles/ThemeManager'
import React from 'react'
import { useTranslation } from 'react-i18next'
import { View } from 'react-native'
export interface Props {
id: Mastodon.Account['id']
@ -127,11 +126,11 @@ const RelationshipOutgoing: React.FC<Props> = ({ id }: Props) => {
const isPageNotifications = name === 'Tab-Notifications-Root'
return (
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<>
{!isPageNotifications && canFollowNotify && query.data?.following ? (
<Button
type='icon'
content={query.data.notifying ? 'BellOff' : 'Bell'}
content={query.data.notifying ? 'bell-off' : 'bell'}
round
onPress={() =>
mutation.mutate({
@ -155,7 +154,7 @@ const RelationshipOutgoing: React.FC<Props> = ({ id }: Props) => {
loading={query.isLoading || mutation.isLoading}
disabled={query.isError || query.data?.blocked_by}
/>
</View>
</>
)
}

View File

@ -8,27 +8,52 @@ import { ParseEmojis } from './Parse'
import CustomText from './Text'
export interface Props {
title?: string
multiple?: boolean
options: { selected: boolean; content: string }[]
setOptions: React.Dispatch<React.SetStateAction<{ selected: boolean; content: string }[]>>
disabled?: boolean
invalid?: boolean
}
const Selections: React.FC<Props> = ({
title,
multiple = false,
options,
setOptions,
disabled = false
disabled = false,
invalid = false
}) => {
const { colors } = useTheme()
const isSelected = (index: number): string =>
const isSelected = (index: number) =>
options[index].selected
? `Check${multiple ? 'Square' : 'Circle'}`
: `${multiple ? 'Square' : 'Circle'}`
? multiple
? 'check-square'
: 'check-circle'
: multiple
? 'square'
: 'circle'
return (
<View>
<View style={{ marginVertical: StyleConstants.Spacing.S }}>
{title ? (
<CustomText
fontStyle='M'
children={title}
style={{ color: disabled ? colors.disabled : colors.primaryDefault }}
/>
) : null}
<View
style={{
paddingHorizontal: StyleConstants.Spacing.M,
paddingVertical: StyleConstants.Spacing.XS,
marginTop: StyleConstants.Spacing.S,
borderWidth: 1,
borderColor: disabled ? colors.disabled : invalid ? colors.red : colors.border
}}
>
{options.map((option, index) => (
<Pressable
key={index}
@ -38,7 +63,9 @@ const Selections: React.FC<Props> = ({
if (multiple) {
haptics('Light')
setOptions(options.map((o, i) => (i === index ? { ...o, selected: !o.selected } : o)))
setOptions(
options.map((o, i) => (i === index ? { ...o, selected: !o.selected } : o))
)
} else {
if (!option.selected) {
haptics('Light')
@ -58,14 +85,14 @@ const Selections: React.FC<Props> = ({
<View style={{ flex: 1, flexDirection: 'row' }}>
<Icon
style={{
paddingTop: StyleConstants.Font.LineHeight.M - StyleConstants.Font.Size.M,
marginTop: (StyleConstants.Font.LineHeight.M - StyleConstants.Font.Size.M) / 2,
marginRight: StyleConstants.Spacing.S
}}
name={isSelected(index)}
size={StyleConstants.Font.Size.M}
color={disabled ? colors.disabled : colors.primaryDefault}
/>
<CustomText style={{ flex: 1 }}>
<CustomText fontStyle='S' style={{ flex: 1 }}>
<ParseEmojis
content={option.content}
style={{ color: disabled ? colors.disabled : colors.primaryDefault }}
@ -75,6 +102,7 @@ const Selections: React.FC<Props> = ({
</Pressable>
))}
</View>
</View>
)
}

View File

@ -68,7 +68,7 @@ const Sparkline: React.FC<Props> = ({ data, width, height, margin = 0 }) => {
const fillPoints = linePoints.concat(closePolyPoints)
return (
<Svg height={height} width={width} style={{ marginRight: margin }}>
<Svg height={height} width={width} style={{ marginRight: margin }} fill='none'>
<G>
<Path d={'M' + fillPoints.join(' ')} fill={colors.blue} fillOpacity={0.1} />
<Path

View File

@ -0,0 +1,57 @@
import { StyleConstants } from '@utils/styles/constants'
import { ColorValue, TouchableNativeFeedback, View } from 'react-native'
import { SwipeListView } from 'react-native-swipe-list-view'
import haptics from './haptics'
import Icon, { IconName } from './Icon'
import ComponentSeparator from './Separator'
export type Props = {
actions: {
onPress: (item: any) => void
color: ColorValue
icon: IconName
haptic?: Parameters<typeof haptics>['0']
}[]
}
export const SwipeToActions = <T extends unknown>({
actions,
...rest
}: Props & SwipeListView<T>['props']) => {
const perActionWidth = StyleConstants.Spacing.L * 2 + StyleConstants.Font.Size.L
return (
<SwipeListView
renderHiddenItem={({ item }) => (
<View style={{ flex: 1, flexDirection: 'row', justifyContent: 'flex-end' }}>
{actions.map((action, index) => (
<TouchableNativeFeedback
key={index}
onPress={() => {
haptics(action.haptic || 'Light')
action.onPress({ item })
}}
>
<View
style={{
paddingHorizontal: StyleConstants.Spacing.L,
flexBasis: perActionWidth,
backgroundColor: action.color,
justifyContent: 'center',
alignItems: 'center'
}}
>
<Icon name={action.icon} color='white' size={StyleConstants.Font.Size.L} />
</View>
</TouchableNativeFeedback>
))}
</View>
)}
rightOpenValue={-perActionWidth * actions.length}
disableRightSwipe
closeOnRowPress
ItemSeparatorComponent={ComponentSeparator}
{...rest}
/>
)
}

View File

@ -29,7 +29,7 @@ const TimelineEmpty: React.FC<Props> = ({ queryKey }) => {
case 'error':
return (
<>
<Icon name='Frown' size={StyleConstants.Font.Size.L} color={colors.primaryDefault} />
<Icon name='frown' size={StyleConstants.Font.Size.L} color={colors.primaryDefault} />
<CustomText
fontStyle='M'
style={{
@ -47,7 +47,7 @@ const TimelineEmpty: React.FC<Props> = ({ queryKey }) => {
return (
<>
<Icon
name='Smartphone'
name='smartphone'
size={StyleConstants.Font.Size.L}
color={colors.primaryDefault}
/>

View File

@ -38,7 +38,7 @@ const TimelineFooter: React.FC<Props> = ({ queryKey, disableInfinity }) => {
ns='componentTimeline'
i18nKey='end.message'
components={[
<Icon name='Coffee' size={StyleConstants.Font.Size.S} color={colors.secondary} />
<Icon name='coffee' size={StyleConstants.Font.Size.S} color={colors.secondary} />
]}
/>
</CustomText>

View File

@ -276,7 +276,7 @@ const TimelineRefresh: React.FC<Props> = ({
]}
children={
<Icon
name='ArrowLeft'
name='arrow-left'
size={StyleConstants.Font.Size.M}
color={colors.primaryDefault}
/>

View File

@ -46,7 +46,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='Anchor'
name='anchor'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -58,7 +58,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='Heart'
name='heart'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -72,7 +72,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='UserPlus'
name='user-plus'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -86,7 +86,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='UserPlus'
name='user-plus'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -100,7 +100,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='BarChart2'
name='bar-chart-2'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -112,7 +112,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='Repeat'
name='repeat'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -130,7 +130,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='Activity'
name='activity'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -144,7 +144,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='BarChart2'
name='bar-chart-2'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -156,7 +156,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='Users'
name='users'
size={StyleConstants.Font.Size.S}
color={iconColor}
style={styles.icon}
@ -168,7 +168,7 @@ const TimelineActioned: React.FC<Props> = ({ action, isNotification, ...rest })
return (
<>
<Icon
name='AlertOctagon'
name='alert-octagon'
size={StyleConstants.Font.Size.S}
color={colors.red}
style={styles.icon}

View File

@ -165,7 +165,7 @@ const TimelineActions: React.FC = () => {
const childrenReply = () => (
<>
<Icon name='MessageCircle' color={iconColor} size={StyleConstants.Font.Size.L} />
<Icon name='message-circle' color={iconColor} size={StyleConstants.Font.Size.L} />
{status.replies_count > 0 ? (
<CustomText
fontStyle='S'
@ -186,7 +186,7 @@ const TimelineActions: React.FC = () => {
return (
<>
<Icon
name='Repeat'
name='repeat'
color={disabled ? colors.disabled : color(status.reblogged)}
crossOut={disabled}
size={StyleConstants.Font.Size.L}
@ -212,7 +212,7 @@ const TimelineActions: React.FC = () => {
const color = (state: boolean) => (state ? colors.red : colors.secondary)
return (
<>
<Icon name='Heart' color={color(status.favourited)} size={StyleConstants.Font.Size.L} />
<Icon name='heart' color={color(status.favourited)} size={StyleConstants.Font.Size.L} />
{status.favourites_count > 0 ? (
<CustomText
fontStyle='S'
@ -227,7 +227,7 @@ const TimelineActions: React.FC = () => {
const childrenBookmark = () => {
const color = (state: boolean) => (state ? colors.yellow : colors.secondary)
return (
<Icon name='Bookmark' color={color(status.bookmarked)} size={StyleConstants.Font.Size.L} />
<Icon name='bookmark' color={color(status.bookmarked)} size={StyleConstants.Font.Size.L} />
)
}

View File

@ -216,7 +216,7 @@ const TimelineAttachment = () => {
) : (
<Button
type='icon'
content='EyeOff'
content='eye-off'
round
overlay
onPress={() => {

View File

@ -92,7 +92,7 @@ const AttachmentAudio: React.FC<Props> = ({ total, index, sensitiveShown, audio
) : null}
<Button
type='icon'
content={audioPlaying ? 'PauseCircle' : 'PlayCircle'}
content={audioPlaying ? 'pause-circle' : 'play-circle'}
size='L'
round
overlay

View File

@ -1,6 +1,6 @@
import Button from '@components/Button'
import { useAccessibility } from '@utils/accessibility/AccessibilityManager'
import { useGlobalStorage } from '@utils/storage/actions'
import { useAccountStorage, useGlobalStorage } from '@utils/storage/actions'
import { StyleConstants } from '@utils/styles/constants'
import { ResizeMode, Video, VideoFullscreenUpdate } from 'expo-av'
import { Platform } from 'expo-modules-core'
@ -28,6 +28,11 @@ const AttachmentVideo: React.FC<Props> = ({
}) => {
const { reduceMotionEnabled } = useAccessibility()
const [autoplayGifv] = useGlobalStorage.boolean('app.auto_play_gifv')
const [preferences] = useAccountStorage.object('preferences')
const shouldAutoplayGifv =
preferences?.['reading:autoplay:gifs'] !== undefined
? preferences['reading:autoplay:gifs']
: autoplayGifv
const videoPlayer = useRef<Video>(null)
const [videoLoading, setVideoLoading] = useState(false)
@ -63,7 +68,7 @@ const AttachmentVideo: React.FC<Props> = ({
resizeMode={videoResizeMode}
{...(gifv
? {
shouldPlay: reduceMotionEnabled || !autoplayGifv ? false : true,
shouldPlay: reduceMotionEnabled || !shouldAutoplayGifv ? false : true,
isMuted: true,
isLooping: true,
source: { uri: video.url }
@ -82,7 +87,7 @@ const AttachmentVideo: React.FC<Props> = ({
Platform.OS === 'android' &&
(await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT))
Platform.OS === 'android' && setVideoResizeMode(ResizeMode.COVER)
if (gifv && !reduceMotionEnabled && autoplayGifv) {
if (gifv && !reduceMotionEnabled && shouldAutoplayGifv) {
videoPlayer.current?.playAsync()
} else {
videoPlayer.current?.pauseAsync()
@ -116,20 +121,20 @@ const AttachmentVideo: React.FC<Props> = ({
video.blurhash ? (
<Blurhash blurhash={video.blurhash} style={{ width: '100%', height: '100%' }} />
) : null
) : !gifv || (gifv && (reduceMotionEnabled || !autoplayGifv)) ? (
) : !gifv || (gifv && (reduceMotionEnabled || !shouldAutoplayGifv)) ? (
<Button
round
overlay
size='L'
type='icon'
content='PlayCircle'
content='play-circle'
onPress={playOnPress}
loading={videoLoading}
/>
) : null}
<AttachmentAltText sensitiveShown={sensitiveShown} text={video.description} />
</Pressable>
{gifv && !autoplayGifv ? (
{gifv && !shouldAutoplayGifv ? (
<Button
style={{
position: 'absolute',

View File

@ -99,7 +99,7 @@ export const shouldFilter = ({
break
}
}
const queryKeyFilters: QueryKeyFilters = ['Filters']
const queryKeyFilters: QueryKeyFilters = ['Filters', { version: 'v1' }]
queryClient.getQueryData<Mastodon.Filter<'v1'>[]>(queryKeyFilters)?.forEach(filter => {
if (returnFilter) {
return

View File

@ -43,7 +43,7 @@ const TimelineHeaderAndroid: React.FC = () => {
}}
>
<Icon
name='MoreHorizontal'
name='more-horizontal'
color={colors.secondary}
size={StyleConstants.Font.Size.L}
/>

View File

@ -87,7 +87,7 @@ const HeaderConversation = ({ conversation }: Props) => {
id: conversation.id
})
}
children={<Icon name='Trash' color={colors.secondary} size={StyleConstants.Font.Size.L} />}
children={<Icon name='trash' color={colors.secondary} size={StyleConstants.Font.Size.L} />}
/>
</View>
)

View File

@ -58,7 +58,7 @@ const TimelineHeaderDefault: React.FC = () => {
>
{isRemote ? (
<Icon
name='Wifi'
name='wifi'
size={StyleConstants.Font.Size.M}
color={colors.secondary}
style={{ marginRight: StyleConstants.Spacing.S }}
@ -80,7 +80,7 @@ const TimelineHeaderDefault: React.FC = () => {
<DropdownMenu.Root onOpenChange={setOpenChange}>
<DropdownMenu.Trigger>
<Icon
name='MoreHorizontal'
name='more-horizontal'
color={colors.secondary}
size={StyleConstants.Font.Size.L}
/>

View File

@ -81,7 +81,7 @@ const TimelineHeaderNotification: React.FC<Props> = ({ notification }) => {
<DropdownMenu.Root onOpenChange={setOpenChange}>
<DropdownMenu.Trigger>
<Icon
name='MoreHorizontal'
name='more-horizontal'
color={colors.secondary}
size={StyleConstants.Font.Size.L}
/>

View File

@ -35,7 +35,7 @@ const HeaderSharedCreated: React.FC<Props> = ({ created_at }) => {
{status.edited_at && !highlighted ? (
<Icon
accessibilityLabel={t('shared.header.shared.edited.accessibilityLabel')}
name='Edit'
name='edit'
size={StyleConstants.Font.Size.S}
color={colors.secondary}
style={{ marginLeft: StyleConstants.Spacing.S }}

View File

@ -13,7 +13,7 @@ const HeaderSharedMuted: React.FC = () => {
return status?.muted ? (
<Icon
accessibilityLabel={t('shared.header.shared.muted.accessibilityLabel')}
name='VolumeX'
name='volume-x'
size={StyleConstants.Font.Size.M}
color={colors.secondary}
style={{ marginLeft: StyleConstants.Spacing.S }}

View File

@ -16,7 +16,7 @@ const HeaderSharedVisibility: React.FC = () => {
return (
<Icon
accessibilityLabel={t('shared.header.shared.visibility.private.accessibilityLabel')}
name='Unlock'
name='unlock'
size={StyleConstants.Font.Size.S}
color={colors.secondary}
style={styles.visibility}
@ -26,7 +26,7 @@ const HeaderSharedVisibility: React.FC = () => {
return (
<Icon
accessibilityLabel={t('shared.header.shared.visibility.private.accessibilityLabel')}
name='Lock'
name='lock'
size={StyleConstants.Font.Size.S}
color={colors.secondary}
style={styles.visibility}
@ -36,7 +36,7 @@ const HeaderSharedVisibility: React.FC = () => {
return (
<Icon
accessibilityLabel={t('shared.header.shared.visibility.direct.accessibilityLabel')}
name='Mail'
name='mail'
size={StyleConstants.Font.Size.S}
color={colors.secondary}
style={styles.visibility}

View File

@ -117,10 +117,14 @@ const TimelinePoll: React.FC = () => {
}
}
const isSelected = (index: number): string =>
const isSelected = (index: number) =>
allOptions[index]
? `Check${poll.multiple ? 'Square' : 'Circle'}`
: `${poll.multiple ? 'Square' : 'Circle'}`
? poll.multiple
? 'check-square'
: 'check-circle'
: poll.multiple
? 'square'
: 'circle'
const pollBodyDisallow = () => {
const maxValue = maxBy(poll.options, option => option.votes_count)?.votes_count
@ -129,12 +133,12 @@ const TimelinePoll: React.FC = () => {
<View style={{ flex: 1, flexDirection: 'row' }}>
<Icon
style={{
paddingTop: StyleConstants.Font.LineHeight.M - StyleConstants.Font.Size.M,
marginTop: (StyleConstants.Font.LineHeight.M - StyleConstants.Font.Size.M) / 2,
marginRight: StyleConstants.Spacing.S
}}
name={
`${poll.own_votes?.includes(index) ? 'Check' : ''}${
poll.multiple ? 'Square' : 'Circle'
`${poll.own_votes?.includes(index) ? 'check-' : ''}${
poll.multiple ? 'square' : 'circle'
}` as any
}
size={StyleConstants.Font.Size.M}
@ -201,7 +205,7 @@ const TimelinePoll: React.FC = () => {
<View style={{ flex: 1, flexDirection: 'row' }}>
<Icon
style={{
paddingTop: StyleConstants.Font.LineHeight.M - StyleConstants.Font.Size.M,
marginTop: (StyleConstants.Font.LineHeight.M - StyleConstants.Font.Size.M) / 2,
marginRight: StyleConstants.Spacing.S
}}
name={isSelected(index)}

View File

@ -145,12 +145,12 @@ const Timeline: React.FC<Props> = ({
ref={customFLRef || flRef}
scrollEventThrottle={16}
onScroll={onScroll}
windowSize={7}
windowSize={5}
data={flattenPages(data)}
{...(customProps?.renderItem
? { renderItem: customProps.renderItem }
: { renderItem: ({ item }) => <TimelineDefault item={item} queryKey={queryKey} /> })}
initialNumToRender={6}
initialNumToRender={3}
maxToRenderPerBatch={3}
onEndReached={() => !disableInfinity && !isFetchingNextPage && fetchNextPage()}
onEndReachedThreshold={0.75}

View File

@ -0,0 +1,96 @@
import haptics from '@components/haptics'
import { displayMessage } from '@components/Message'
import { useNavigation } from '@react-navigation/native'
import { NativeStackNavigationProp } from '@react-navigation/native-stack'
import { useQueryClient } from '@tanstack/react-query'
import { featureCheck } from '@utils/helpers/featureCheck'
import { TabSharedStackParamList } from '@utils/navigation/navigators'
import { QueryKeyFollowedTags, useTagMutation, useTagQuery } from '@utils/queryHooks/tags'
import { QueryKeyTimeline } from '@utils/queryHooks/timeline'
import { useTranslation } from 'react-i18next'
const menuHashtag = ({
tag_name,
queryKey
}: {
tag_name: Mastodon.Tag['name']
queryKey?: QueryKeyTimeline
}): ContextMenu => {
const navigation =
useNavigation<NativeStackNavigationProp<TabSharedStackParamList, any, undefined>>()
const { t } = useTranslation(['common', 'componentContextMenu'])
const canFollowTags = featureCheck('follow_tags')
const queryClient = useQueryClient()
const {
data,
isFetching: tagIsFetching,
refetch: tagRefetch
} = useTagQuery({ tag_name, options: { enabled: canFollowTags } })
const tagMutation = useTagMutation({
onSuccess: () => {
haptics('Light')
tagRefetch()
const queryKeyFollowedTags: QueryKeyFollowedTags = ['FollowedTags']
queryClient.invalidateQueries({ queryKey: queryKeyFollowedTags })
},
onError: (err: any, { to }) => {
displayMessage({
type: 'error',
message: t('common:message.error.message', {
function: t('componentContextMenu:hashtag.follow', {
defaultValue: 'false',
context: to.toString()
})
}),
...(err.status &&
typeof err.status === 'number' &&
err.data &&
err.data.error &&
typeof err.data.error === 'string' && {
description: err.data.error
})
})
}
})
const menus: ContextMenu = []
menus.push([
{
type: 'item',
key: 'hashtag-follow',
props: {
onSelect: () =>
typeof data?.following === 'boolean' &&
tagMutation.mutate({ tag_name, to: !data.following }),
disabled: tagIsFetching,
destructive: false,
hidden: !canFollowTags
},
title: t('componentContextMenu:hashtag.follow.action', {
defaultValue: 'false',
context: (data?.following || false).toString()
}),
icon: data?.following ? 'rectangle.stack.badge.minus' : 'rectangle.stack.badge.plus'
},
{
type: 'item',
key: 'hashtag-filter',
props: {
onSelect: () => navigation.navigate('Tab-Shared-Filter', { source: 'hashtag', tag_name }),
disabled: false,
destructive: false,
hidden: !canFollowTags
},
title: t('componentContextMenu:hashtag.filter.action'),
icon: 'line.3.horizontal.decrease'
}
])
return menus
}
export default menuHashtag

View File

@ -231,6 +231,22 @@ const menuStatus = ({
context: (status.pinned || false).toString()
}),
icon: status.pinned ? 'pin.slash' : 'pin'
},
{
type: 'item',
key: 'status-filter',
props: {
// @ts-ignore
onSelect: () => navigation.navigate('Tab-Shared-Filter', { source: 'status', status, queryKey }),
disabled: false,
destructive: false,
hidden: !('filtered' in status)
},
title: t('componentContextMenu:status.filter.action', {
defaultValue: 'false',
context: (!!status.filtered?.length).toString()
}),
icon: status.pinned ? 'rectangle.badge.checkmark' : 'rectangle.badge.xmark'
}
])

View File

@ -73,17 +73,18 @@ const openLink = async (url: string, navigation?: any) => {
}
}
switch (getGlobalStorage.string('app.browser')) {
// Some links might end with an empty space at the end that triggers an error
switch (getGlobalStorage.string('app.browser')) {
case 'external':
await Linking.openURL(url.trim())
break
case 'internal':
default:
await WebBrowser.openBrowserAsync(url.trim(), {
dismissButtonStyle: 'close',
enableBarCollapsing: true,
...(await browserPackage())
})
break
case 'external':
await Linking.openURL(url.trim())
}).catch(() => Linking.openURL(url.trim()))
break
}
}

View File

@ -6,7 +6,7 @@
"action_false": "Segueix l'usuari",
"action_true": "Deixa de seguir l'usuari"
},
"inLists": "Llistes que continguin l'usuari",
"inLists": "Llistes que hi sigui l'usuari...",
"showBoosts": {
"action_false": "Mostra els impulsos de l'usuari",
"action_true": "Oculta els impulsos de l'usuari"
@ -16,12 +16,12 @@
"action_true": "Deixa de silenciar l'usuari"
},
"followAs": {
"trigger": "Segueix com...",
"trigger": "",
"succeed_default": "Seguint a @{{target}} com @{{source}}",
"succeed_locked": "Enviada la sol·licitud de seguiment a @{{target}} com {{source}}, pendent d'aprovar-la",
"failed": "Segueix com"
},
"blockReport": "Bloqueja i denuncia...",
"blockReport": "Bloqueja i denuncia",
"block": {
"action_false": "Bloqueja l'usuari",
"action_true": "Deixa de bloquejar l'usuari",
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "Segueix",
"action_true": "Deixa de seguir"
},
"filter": {
"action": "Filtra l'etiqueta..."
}
},
"share": {
"status": {
"action": "Comparteix la publicació"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Fixa la publicació",
"action_true": "Deixa de fixar la publicació"
},
"filter": {
"action_false": "Filtra la publicació...",
"action_true": "Gestiona els filtres..."
}
}
}

View File

@ -98,7 +98,7 @@
"match_v2_one": "Filtrat per {{filters}}.",
"match_v2_other": "Filtrat per {{count}} filtres, {{filters}}."
},
"fullConversation": "Llegeix conversacions",
"fullConversation": "Llegeix converses",
"translate": {
"default": "Tradueix",
"succeed": "Traduït per {{provider}} des de l'idioma {{source}}",

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Descriu el contingut per a persones amb discapacitat visual",
"placeholder": "Pots afegir una descripció, també conegut com a text alternatiu, als teus fitxers perquè siguin accessibles a més persones, també aquelles amb discapacitat visual.\n\nLes bones descripcions han de ser concises, però que s'expressin tot el que surt als fitxers amb exactitud per poder entendre el seu context."
},
"imageFocus": "Arrossega el cercle per a canviar el seu punt d'atenció"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Notificacions push"
},
"preferences": {
"name": "Preferències"
},
"preferencesFilters": {
"name": "Tots els filtres de continguts"
},
"preferencesFilterAdd": {
"name": "Crea un filtre"
},
"preferencesFilterEdit": {
"name": "Edita el filtre"
},
"profile": {
"name": "Edita el teu perfil"
},
@ -84,9 +96,6 @@
"settings": {
"name": "Configuració de l'aplicació"
},
"webSettings": {
"name": "Més configuracions del compte"
},
"switch": {
"name": "Canvia de compte"
}
@ -125,6 +134,85 @@
"message": "Aquesta acció no es pot desfer."
}
},
"preferences": {
"visibility": {
"title": "Visibilitat de la publicació per defecte",
"options": {
"public": "Públic",
"unlisted": "Sense llistar",
"private": "Només als seguidors"
}
},
"sensitive": {
"title": "Marca el contingut com a sensible"
},
"media": {
"title": "Mostra el contingut multimèdia",
"options": {
"default": "Amaga el contingut multimèdia com a sensible",
"show_all": "Mostra sempre el contingut multimèdia",
"hide_all": "Amaga sempre el contingut multimèdia"
}
},
"spoilers": {
"title": "Amplia sempre el contingut amb alertes"
},
"autoplay_gifs": {
"title": "Autoreprodueix els GIF"
},
"filters": {
"title": "Filtres de continguts",
"content": "{{count}} actiu/s"
},
"web_only": {
"title": "Actualitza la configuració",
"description": "Les configuracions següents només es poden actualitzant fent servir el web"
}
},
"preferencesFilters": {
"expired": "Caducat",
"keywords_one": "{{count}} paraula clau",
"keywords_other": "{{count}} paraules clau",
"statuses_one": "{{count}} publicació",
"statuses_other": "{{count}} publicacions",
"context": "Aplica a <0 />",
"contexts": {
"home": "Seguits i llistes",
"notifications": "Notificació",
"public": "federat",
"thread": "Conversa",
"account": "Perfil"
}
},
"preferencesFilter": {
"name": "Nom",
"expiration": "Venciment",
"expirationOptions": {
"0": "Mai",
"1800": "Després de 30 minuts",
"3600": "Després d'una hora",
"43200": "Després de 12 hores",
"86400": "Després d'un dia",
"604800": "Després d'una setmana",
"18144000": "Després d'un mes"
},
"context": "Aplica a",
"contexts": {
"home": "Seguits i llistes",
"notifications": "Notificació",
"public": "Línia de temps federada",
"thread": "Vista de conversa",
"account": "Vista del perfil"
},
"action": "Quan coincideix",
"actions": {
"warn": "",
"hide": "Amagat completament"
},
"keywords": "Coincidències per aquestes paraules claus",
"keyword": "Paraula clau",
"statuses": "Coincideixen aquestes publicacions"
},
"profile": {
"feedback": {
"succeed": "{{type}} actualitzat",
@ -150,17 +238,6 @@
"total_one": "{{count}} camp",
"total_other": "{{count}} camps"
},
"visibility": {
"title": "Visibilitat",
"options": {
"public": "Públic",
"unlisted": "Sense llistar",
"private": "Només als seguidors"
}
},
"sensitive": {
"title": "Continguts multimèdia sensibles"
},
"lock": {
"title": "Fes el compte privat",
"description": "Caldrà l'aprovació manual de seguidors nous"
@ -322,15 +399,15 @@
"attachments": {
"name": "Multimèdia de <0 /><1></1>"
},
"hashtag": {
"follow": "Segueix",
"unfollow": "Deixa de seguir"
"filter": {
"name": "Afegeix al filtre",
"existed": "Existia sota aquests filtres"
},
"history": {
"name": "Edita l'historial"
},
"report": {
"name": "Denuncia {{acct}}",
"name": "Denúncia a {{acct}}",
"report": "Denúncia",
"forward": {
"heading": "Envia anònimament al servidor remot {{instance}}"

View File

@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": ""
@ -88,6 +97,10 @@
"pin": {
"action_false": "",
"action_true": ""
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "",
"placeholder": ""
},
"imageFocus": ""
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": ""
},
"preferences": {
"name": ""
},
"preferencesFilters": {
"name": ""
},
"preferencesFilterAdd": {
"name": ""
},
"preferencesFilterEdit": {
"name": ""
},
"profile": {
"name": ""
},
@ -84,9 +96,6 @@
"settings": {
"name": ""
},
"webSettings": {
"name": ""
},
"switch": {
"name": ""
}
@ -125,6 +134,85 @@
"message": ""
}
},
"preferences": {
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"media": {
"title": "",
"options": {
"default": "",
"show_all": "",
"hide_all": ""
}
},
"spoilers": {
"title": ""
},
"autoplay_gifs": {
"title": ""
},
"filters": {
"title": "",
"content": ""
},
"web_only": {
"title": "",
"description": ""
}
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "",
"statuses_other": "",
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
}
},
"preferencesFilter": {
"name": "",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
},
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
},
"action": "",
"actions": {
"warn": "",
"hide": ""
},
"keywords": "",
"keyword": "",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "",
@ -150,17 +238,6 @@
"total_one": "",
"total_other": ""
},
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"lock": {
"title": "",
"description": ""
@ -322,9 +399,9 @@
"attachments": {
"name": ""
},
"hashtag": {
"follow": "",
"unfollow": ""
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": ""

View File

@ -6,7 +6,7 @@
"action_false": "Folgen",
"action_true": "Nutzer entfolgen"
},
"inLists": "Listen mit Nutzern",
"inLists": "",
"showBoosts": {
"action_false": "",
"action_true": ""
@ -16,12 +16,12 @@
"action_true": "Stummschaltung des Nutzers aufheben"
},
"followAs": {
"trigger": "Folgen als…",
"trigger": "",
"succeed_default": "Folgt nun @{{target}} als @{{source}}",
"succeed_locked": "Follower-Anfrage an @{{target}} mit {{source}} gesendet, Bestätigung ausstehend",
"failed": "Folgen als…"
},
"blockReport": "Blockieren und melden…",
"blockReport": "",
"block": {
"action_false": "Nutzer blockieren",
"action_true": "User entblocken",
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": "Tröt teilen"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Tröt anheften",
"action_true": "Tröt nicht mehr anheften"
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Beschreibe den Inhalt für Sehbehinderte",
"placeholder": "Du kannst den Inhalten eine Beschreibung hinzufügen, auch \"Alt-Text\" genannt, damit sie für mehr Menschen zugänglich sind - auch für Blinde oder Sehbehinderte.\n\nGute Beschreibungen sind kurz und prägnant, geben aber den Inhalt Ihrer Medien genau genug wieder, um den Kontext zu verstehen."
},
"imageFocus": "Ziehe den Fokuskreis, um den Fokuspunkt zu aktualisieren"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Push-Benachrichtigung"
},
"preferences": {
"name": "Einstellungen"
},
"preferencesFilters": {
"name": "Inhaltsfilter"
},
"preferencesFilterAdd": {
"name": "Filterregel erstellen"
},
"preferencesFilterEdit": {
"name": "Filter bearbeiten"
},
"profile": {
"name": "Profil bearbeiten"
},
@ -84,9 +96,6 @@
"settings": {
"name": "App-Einstellungen"
},
"webSettings": {
"name": "Kontoeinstellungen"
},
"switch": {
"name": "Konto wechseln"
}
@ -125,6 +134,85 @@
"message": "Diese Aktion kann nicht rückgängig gemacht werden."
}
},
"preferences": {
"visibility": {
"title": "Standard-Einstellung für die Sichtbarkeit des Tröts",
"options": {
"public": "Öffentlich",
"unlisted": "Ungelistet",
"private": "Nur für Follower"
}
},
"sensitive": {
"title": "Medien immer als sensibel kennzeichnen"
},
"media": {
"title": "Medien-Anzeige",
"options": {
"default": "Als heikel gekennzeichnete Medien ausblenden",
"show_all": "Medien immer anzeigen",
"hide_all": "Medien immer verstecken"
}
},
"spoilers": {
"title": "Beiträge mit Inhaltswarnungen immer ausklappen"
},
"autoplay_gifs": {
"title": "GIFs automatisch abspielen"
},
"filters": {
"title": "Inhaltsfilter",
"content": "{{count}} aktiv"
},
"web_only": {
"title": "Einstellungen aktualisieren",
"description": "Nachfolgende Einstellungen können nur über das Web-Interface aktualisiert werden"
}
},
"preferencesFilters": {
"expired": "Abgelaufen",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "{{count}} Tröt",
"statuses_other": "{{count}} Tröts",
"context": "Läuft in <0 /> ab",
"contexts": {
"home": "Gefolgte und Listen",
"notifications": "Benachrichtigung",
"public": "Föderiert",
"thread": "Unterhaltung",
"account": "Profil"
}
},
"preferencesFilter": {
"name": "Name",
"expiration": "Ablaufdatum",
"expirationOptions": {
"0": "Niemals",
"1800": "Nach 30 Minuten",
"3600": "Nach einer Stunde",
"43200": "Nach 12 Stunden",
"86400": "Nach einem Tag",
"604800": "Nach einer Woche",
"18144000": "Nach einem Monat"
},
"context": "",
"contexts": {
"home": "Gefolgte und Listen",
"notifications": "Benachrichtigung",
"public": "Föderierte Timeline",
"thread": "Unterhaltungsansicht",
"account": "Profilansicht"
},
"action": "Bei Übereinstimmung",
"actions": {
"warn": "Verdeckt, kann aber aufgedeckt werden",
"hide": "Vollständig verdeckt"
},
"keywords": "",
"keyword": "Stichwörter",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "{{type}} aktualisiert",
@ -150,17 +238,6 @@
"total_one": "{{count}} Feld",
"total_other": "{{count}} Felder"
},
"visibility": {
"title": "Sichtbarkeit des Beitrags",
"options": {
"public": "Öffentlich",
"unlisted": "Ungelistet",
"private": "Nur für Follower"
}
},
"sensitive": {
"title": "Expliziten Beitrag posten"
},
"lock": {
"title": "Konto sperren",
"description": "Follower manuell bestätigen"
@ -322,9 +399,9 @@
"attachments": {
"name": "<0 /><1>'s Medien</1>"
},
"hashtag": {
"follow": "Folgen",
"unfollow": "Entfolgen"
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": "Bearbeitungsverlauf"

View File

@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": "Κοινοποίηση ανάρτησης"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Κρέμασμα ανάρτησης",
"action_true": "Ξεκρέμασμα ανάρτησης"
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Περιγραφή πολυμέσων για άτομα με προβλήματα όρασης",
"placeholder": "Μπορείτε να προσθέσετε μια περιγραφή, που μερικές φορές ονομάζεται alt-text, στα πολυμέσα σας, ώστε να είναι προσβάσιμα σε ακόμα περισσότερους ανθρώπους, συμπεριλαμβανομένων εκείνων που είναι τυφλοί ή έχουν προβλήματα όρασης.\n\nΟι καλές περιγραφές είναι συνοπτικές, αλλά παρουσιάζουν τι απεικονίζεται με αρκετή ακρίβεια ώστε να είναι κατανοητό το συγκείμενο."
},
"imageFocus": "Σύρετε τον κύκλο για να την ενημέρωση του κέντρου προσοχής"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Ειδοποιήσεις push"
},
"preferences": {
"name": ""
},
"preferencesFilters": {
"name": ""
},
"preferencesFilterAdd": {
"name": ""
},
"preferencesFilterEdit": {
"name": ""
},
"profile": {
"name": "Επεξεργασία προφίλ"
},
@ -84,9 +96,6 @@
"settings": {
"name": "Ρυθμίσεις εφαρμογής"
},
"webSettings": {
"name": "Περισσότερες ρυθμίσεις λογαριασμού"
},
"switch": {
"name": "Εναλλαγή λογαριασμού"
}
@ -125,6 +134,85 @@
"message": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί."
}
},
"preferences": {
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"media": {
"title": "",
"options": {
"default": "",
"show_all": "",
"hide_all": ""
}
},
"spoilers": {
"title": ""
},
"autoplay_gifs": {
"title": ""
},
"filters": {
"title": "",
"content": ""
},
"web_only": {
"title": "",
"description": ""
}
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "",
"statuses_other": "",
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
}
},
"preferencesFilter": {
"name": "",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
},
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
},
"action": "",
"actions": {
"warn": "",
"hide": ""
},
"keywords": "",
"keyword": "",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "{{type}}: ενημερώθηκε",
@ -150,17 +238,6 @@
"total_one": "{{count}} πεδίο",
"total_other": "{{count}} πεδία"
},
"visibility": {
"title": "Ορατότητα αναρτήσεων",
"options": {
"public": "Δημόσια",
"unlisted": "Χωρίς καταχώρηση",
"private": "Μόνο για τους ακολούθους"
}
},
"sensitive": {
"title": "Ανάρτηση πολυμέσων ευαίσθητης φύσης"
},
"lock": {
"title": "Κλείδωμα λογαριασμού",
"description": "Είναι απαραίτητη η χειρονακτική έγκριση των ακολούθων σας"
@ -322,9 +399,9 @@
"attachments": {
"name": "<0 /><1> πολυμέσα</1>"
},
"hashtag": {
"follow": "Ακολουθήστε",
"unfollow": "Διακοπή παρακολούθησης"
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": "Ιστορικό επεξεργασίας"

View File

@ -6,7 +6,7 @@
"action_false": "Follow user",
"action_true": "Unfollow user"
},
"inLists": "Lists containing user",
"inLists": "Lists containing user ...",
"showBoosts": {
"action_false": "Show user's boosts",
"action_true": "Hide users's boosts"
@ -16,12 +16,12 @@
"action_true": "Unmute user"
},
"followAs": {
"trigger": "Follow as...",
"trigger": "Follow as ...",
"succeed_default": "Now following @{{target}} with @{{source}}",
"succeed_locked": "Sent follow request to @{{target}} with {{source}}, pending approval",
"failed": "Follow as"
},
"blockReport": "Block and report...",
"blockReport": "Block and report",
"block": {
"action_false": "Block user",
"action_true": "Unblock user",
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "Follow",
"action_true": "Unfollow"
},
"filter": {
"action": "Filter hashtag ..."
}
},
"share": {
"status": {
"action": "Share toot"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Pin toot",
"action_true": "Unpin toot"
},
"filter": {
"action_false": "Filter toot ...",
"action_true": "Manage filters ..."
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Describe media for the visually impaired",
"placeholder": "You can add a description, sometimes called alt-text, to your media so they are accessible to even more people, including those who are blind or visually impaired.\n\nGood descriptions are concise, but present what is in your media accurately enough to understand their context."
},
"imageFocus": "Drag the focus circle to update focus point"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Push Notification"
},
"preferences": {
"name": "Preferences"
},
"preferencesFilters": {
"name": "All content filters"
},
"preferencesFilterAdd": {
"name": "Create a Filter"
},
"preferencesFilterEdit": {
"name": "Edit Filter"
},
"profile": {
"name": "Edit Profile"
},
@ -84,9 +96,6 @@
"settings": {
"name": "App Settings"
},
"webSettings": {
"name": "More Account Settings"
},
"switch": {
"name": "Switch Account"
}
@ -125,6 +134,85 @@
"message": "This action is not recoverable."
}
},
"preferences": {
"visibility": {
"title": "Default posting visibility",
"options": {
"public": "Public",
"unlisted": "Unlisted",
"private": "Followers only"
}
},
"sensitive": {
"title": "Default mark media as sensitive"
},
"media": {
"title": "Media display",
"options": {
"default": "Hide media marked as sensitive",
"show_all": "Always show media",
"hide_all": "Always hide media"
}
},
"spoilers": {
"title": "Auto expand toots with content warning"
},
"autoplay_gifs": {
"title": "Autoplay GIF in toots"
},
"filters": {
"title": "Content filters",
"content": "{{count}} active"
},
"web_only": {
"title": "Update settings",
"description": "Settings below can only be updated using the web UI"
}
},
"preferencesFilters": {
"expired": "Expired",
"keywords_one": "{{count}} keyword",
"keywords_other": "{{count}} keywords",
"statuses_one": "{{count}} toot",
"statuses_other": "{{count}} toots",
"context": "Applies in <0 />",
"contexts": {
"home": "following and lists",
"notifications": "notification",
"public": "federated",
"thread": "conversation",
"account": "profile"
}
},
"preferencesFilter": {
"name": "Name",
"expiration": "Expiration",
"expirationOptions": {
"0": "Never",
"1800": "After 30 minutes",
"3600": "After 1 hour",
"43200": "After 12 hours",
"86400": "After 1 day",
"604800": "After 1 week",
"18144000": "After 1 month"
},
"context": "Applies in",
"contexts": {
"home": "Following and lists",
"notifications": "Notification",
"public": "Federated timeline",
"thread": "Conversation view",
"account": "Profile view"
},
"action": "When matched",
"actions": {
"warn": "Collapsed but can be revealed",
"hide": "Hidden completely"
},
"keywords": "Matches for these keywords",
"keyword": "Keyword",
"statuses": "Matches these toots"
},
"profile": {
"feedback": {
"succeed": "{{type}} updated",
@ -150,17 +238,6 @@
"total_one": "{{count}} field",
"total_other": "{{count}} fields"
},
"visibility": {
"title": "Posting Visibility",
"options": {
"public": "Public",
"unlisted": "Unlisted",
"private": "Followers only"
}
},
"sensitive": {
"title": "Posting Media Sensitive"
},
"lock": {
"title": "Lock Account",
"description": "Requires you to manually approve followers"
@ -322,9 +399,9 @@
"attachments": {
"name": "<0 /><1>'s media</1>"
},
"hashtag": {
"follow": "Follow",
"unfollow": "Unfollow"
"filter": {
"name": "Add to filter",
"existed": "Existed in these filters"
},
"history": {
"name": "Edit History"

View File

@ -6,7 +6,7 @@
"action_false": "Seguir usuario",
"action_true": "Dejar de seguir usuario"
},
"inLists": "Listas que contienen el usuario",
"inLists": "Listas que contienen el usuario...",
"showBoosts": {
"action_false": "Mostrar los impulsos del usuario",
"action_true": "Ocultar los impulsos del usuario"
@ -16,12 +16,12 @@
"action_true": "Dejar de silenciar al usuario"
},
"followAs": {
"trigger": "Seguir como...",
"trigger": "",
"succeed_default": "Siguiendo @{{target}} como @{{source}}",
"succeed_locked": "Enviado la solicitud de seguimiento a @{{target}} como {{source}}, pendiente de aprobación",
"failed": "Seguir como"
},
"blockReport": "Bloquear y denunciar...",
"blockReport": "Bloquear y denunciar",
"block": {
"action_false": "Bloquear usuario",
"action_true": "Desbloquear usuario",
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "Seguir",
"action_true": "Dejar de seguir"
},
"filter": {
"action": "Filtrar la etiqueta..."
}
},
"share": {
"status": {
"action": "Compartir toot"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Fijar toot",
"action_true": "Desfijar toot"
},
"filter": {
"action_false": "Filtrar la publicación...",
"action_true": "Gestiona los filtros..."
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Describir para personas con dificultades de visión",
"placeholder": "Añade una descripción, también llamada texto alternativo, a tu archivo y haz que sea más accesible, incluso para personas ciegas o con dificultades de visión.\n\nLo mejor es que sean concisas, pero que expresen todo lo que aparece en las imágenes con exactitud para dar contexto."
},
"imageFocus": "Arrastra el círculo para cambiar el punto de atención"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Notificaciones push"
},
"preferences": {
"name": "Preferencias"
},
"preferencesFilters": {
"name": "Todos los filtros de contenido"
},
"preferencesFilterAdd": {
"name": "Crear filtro"
},
"preferencesFilterEdit": {
"name": "Editar filtro"
},
"profile": {
"name": "Editar perfil"
},
@ -84,9 +96,6 @@
"settings": {
"name": "Ajustes de la aplicación"
},
"webSettings": {
"name": "Más ajustes de la cuenta"
},
"switch": {
"name": "Cambiar de cuenta"
}
@ -125,6 +134,85 @@
"message": "Esta acción no se podrá deshacer."
}
},
"preferences": {
"visibility": {
"title": "Visibilidad de publicación predeterminada",
"options": {
"public": "Público",
"unlisted": "No listado",
"private": "Solo seguidores"
}
},
"sensitive": {
"title": "Marcar el contenido multimedia como sensibles por defecto"
},
"media": {
"title": "Mostrar el contenido multimedia",
"options": {
"default": "Ocultar los contenidos multimedia marcados como sensibles",
"show_all": "Mostrar siempre el contenido multimedia",
"hide_all": "Siempre ocultar el contenido multimedia"
}
},
"spoilers": {
"title": "Siempre expandir las publicaciones marcadas con advertencias de contenido"
},
"autoplay_gifs": {
"title": "Reproduce automáticamente los GIF"
},
"filters": {
"title": "Filtros de contenido",
"content": "{{count}} activo"
},
"web_only": {
"title": "Actualizar ajustes",
"description": "Los ajustes a continuación solo se pueden actualizar mediante la interfaz web"
}
},
"preferencesFilters": {
"expired": "Expirado",
"keywords_one": "{{count}} palabra clave",
"keywords_other": "{{count}} palabras clave",
"statuses_one": "{{count}} publicación",
"statuses_other": "{{count}} publicaciones",
"context": "Se aplica en <0 />",
"contexts": {
"home": "Seguidos y listas",
"notifications": "Notificación",
"public": "Federado",
"thread": "Conversación",
"account": "Perfil"
}
},
"preferencesFilter": {
"name": "Nombre",
"expiration": "Vencimiento",
"expirationOptions": {
"0": "Nunca",
"1800": "Después de 30 minutos",
"3600": "Después de 1 hora",
"43200": "Después de 12 horas",
"86400": "Después de 1 día",
"604800": "Después de 1 semana",
"18144000": "Después de 1 mes"
},
"context": "Se aplica en",
"contexts": {
"home": "Seguidos y listas",
"notifications": "Notificación",
"public": "Cronología federada",
"thread": "Vista de conversación",
"account": "Vista de perfil"
},
"action": "Al coincidir",
"actions": {
"warn": "",
"hide": "Oculto completamente"
},
"keywords": "Coincide con estas palabras clave",
"keyword": "Palabra clave",
"statuses": "Coincide con estas publicaciones"
},
"profile": {
"feedback": {
"succeed": "{{type}} actualizado",
@ -150,17 +238,6 @@
"total_one": "{{count}} campo",
"total_other": "{{count}} campos"
},
"visibility": {
"title": "Visibilidad de publicación",
"options": {
"public": "Público",
"unlisted": "No listado",
"private": "Solo seguidores"
}
},
"sensitive": {
"title": "Publicar contenido multimedia sensible"
},
"lock": {
"title": "Hacer la cuenta privada",
"description": "Necesitas aprobar manualmente los seguidores nuevos"
@ -322,9 +399,9 @@
"attachments": {
"name": "Multimedia de <0 /><1></1>"
},
"hashtag": {
"follow": "Seguir",
"unfollow": "Dejar de seguir"
"filter": {
"name": "Añadir al filtro",
"existed": "Existe en estos filtros"
},
"history": {
"name": "Historial de ediciones"

32
src/i18n/eu/common.json Normal file
View File

@ -0,0 +1,32 @@
{
"buttons": {
"OK": "Ados",
"apply": "Aplikatu",
"cancel": "Utzi",
"discard": "Baztertu",
"continue": "Jarraitu",
"create": "Sortu",
"delete": "Ezabatu",
"done": "Eginda",
"confirm": "Berretsi"
},
"customEmoji": {
"accessibilityLabel": "Emoji pertsonalizatua {{emoji}}"
},
"message": {
"success": {
"message": "{{function}} ongi burutu da"
},
"warning": {
"message": ""
},
"error": {
"message": "{{function}}-(e)k huts egin du, mesedez, saia zaitez berriro"
}
},
"separator": ", ",
"discard": {
"title": "Aldaketa ez da gorde",
"message": "Zuk eginiko aldaketa ez da gorde. Baztertu nahi al duzu?"
}
}

View File

@ -0,0 +1,106 @@
{
"accessibilityHint": "",
"account": {
"title": "",
"following": {
"action_false": "",
"action_true": ""
},
"inLists": "Erabiltzaile hau zerrenda hauetan dago...",
"showBoosts": {
"action_false": "",
"action_true": ""
},
"mute": {
"action_false": "",
"action_true": ""
},
"followAs": {
"trigger": "Honela jarraitu...",
"succeed_default": "",
"succeed_locked": "",
"failed": ""
},
"blockReport": "Blokeatu eta salatu",
"block": {
"action_false": "",
"action_true": "",
"alert": {
"title": ""
}
},
"reports": {
"action": "",
"alert": {
"title": ""
}
}
},
"at": {
"direct": "",
"public": ""
},
"copy": {
"action": "",
"succeed": ""
},
"instance": {
"title": "",
"block": {
"action": "",
"alert": {
"title": "",
"message": ""
}
}
},
"hashtag": {
"follow": {
"action_false": "Jarraitu",
"action_true": "Jarraitzeari utzi"
},
"filter": {
"action": "Traola iragazi..."
}
},
"share": {
"status": {
"action": ""
},
"account": {
"action": ""
}
},
"status": {
"title": "",
"edit": {
"action": ""
},
"delete": {
"action": "",
"alert": {
"title": "",
"message": ""
}
},
"deleteEdit": {
"action": "",
"alert": {
"title": "",
"message": ""
}
},
"mute": {
"action_false": "",
"action_true": ""
},
"pin": {
"action_false": "",
"action_true": ""
},
"filter": {
"action_false": "Tuta iragazi...",
"action_true": "Iragazkiak kudeatu..."
}
}
}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,27 @@
{
"server": {
"textInput": {
"placeholder": "Instantziaren domeinua"
},
"whitelisted": "Baliteke instantzia hau zerrenda zuri batean egotea eta toootek bertako data ezin eskura ahal izatea saioa hasi aurretik.",
"button": "Saioa hasi",
"information": {
"name": "Izena",
"accounts": "Erabiltzaileak",
"statuses": "Tutak",
"domains": "Domeinuak"
},
"disclaimer": {
"base": "Saioa hasteko prozesuak sistemako nabigatzailea erabiltzen du, beraz, zure kontuko informazioa ez da tooot aplikazioarentzat ikusgarri izango."
},
"terms": {
"base": "Saio hastean, <0>pribatutasun-politika</0> eta <1>zerbitzuaren terminoak</1> onartzen dituzu."
}
},
"update": {
"alert": {
"title": "Instantzia honetan saioa hasita",
"message": "Beste kontu batekin saioa has dezakezu, saioa hasita duen kontua mantentzen delarik"
}
}
}

View File

@ -0,0 +1,10 @@
{
"title": "",
"message": "",
"options": {
"image": "",
"image_max": "",
"video": "",
"video_max": ""
}
}

View File

@ -0,0 +1,8 @@
{
"HTML": {
"accessibilityHint": "",
"expanded": "{{hint}}{{moreLines}}",
"moreLines": " ({{count}} lerro gehiago)",
"defaultHint": "Tut luzea"
}
}

View File

@ -0,0 +1,16 @@
{
"follow": {
"function": "Erabiltzailea jarraitu"
},
"block": {
"function": "Erabiltzailea blokeatu"
},
"button": {
"error": "Errorea kargatzean",
"blocked_by": "Erabiltzaileak blokeatua",
"blocking": "Desblokeatu",
"following": "Jarraitzeari utzi",
"requested": "Eskaera baztertu",
"default": "Jarraitu"
}
}

View File

@ -0,0 +1,162 @@
{
"empty": {
"error": {
"message": "Errorea kargatzean",
"button": "Berriro saiatu"
},
"success": {
"message": "Denbora-lerroa hutsik"
}
},
"end": {
"message": "Amaitu dugu, katilu bat <0 /> nahi?"
},
"lookback": {
"message": "Azkenekoz irakurria"
},
"refresh": {
"fetchPreviousPage": "Berrienak hemendik hasita",
"refetch": "Azkenekora arte"
},
"shared": {
"actioned": {
"pinned": "Finkatua",
"favourite": "{{name}}-(e)k zure tuta gogoko du",
"status": "{{name}}-(e)k tut bat bidali berri du",
"follow": "{{name}}-(e)k jarraitu zaitu",
"follow_request": "{{name}}-(e)k zu jarraitzeko eskaera egin du",
"poll": "Erantzun zenuen inkesta bat amaitu da",
"reblog": {
"default": "{{name}}-(e)k bultzatu du",
"notification": "{{name}}-(e)k zure tuta bultzatu du"
},
"update": "Bultzada editatua izan da",
"admin.sign_up": "{{name}} instantziara elkartu da",
"admin.report": "{{name}}-(e)k zera salatu du:"
},
"actions": {
"reply": {
"accessibilityLabel": "Tut honi erantzun"
},
"reblogged": {
"accessibilityLabel": "Tut hau bultzatu",
"function": "Tuta bultzatu",
"options": {
"title": "",
"public": "",
"unlisted": ""
}
},
"favourited": {
"accessibilityLabel": "",
"function": ""
},
"bookmarked": {
"accessibilityLabel": "",
"function": ""
},
"openReport": ""
},
"actionsUsers": {
"reblogged_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
},
"favourited_by": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text": ""
},
"history": {
"accessibilityLabel": "",
"accessibilityHint": "",
"text_one": "",
"text_other": ""
}
},
"attachment": {
"sensitive": {
"button": ""
},
"unsupported": {
"text": "",
"button": ""
},
"altText": ""
},
"avatar": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"content": {
"expandHint": ""
},
"filtered": {
"reveal": "",
"match_v1": "",
"match_v2_one": "",
"match_v2_other": ""
},
"fullConversation": "",
"translate": {
"default": "",
"succeed": "",
"failed": "",
"source_not_supported": "",
"target_not_supported": ""
},
"header": {
"shared": {
"account": {
"name": {
"accessibilityHint": ""
},
"account": {
"accessibilityHint": ""
}
},
"application": "",
"edited": {
"accessibilityLabel": ""
},
"muted": {
"accessibilityLabel": ""
},
"replies": "",
"visibility": {
"direct": {
"accessibilityLabel": ""
},
"private": {
"accessibilityLabel": ""
}
}
},
"conversation": {
"withAccounts": "",
"delete": {
"function": ""
}
}
},
"poll": {
"meta": {
"button": {
"vote": "",
"refresh": ""
},
"count": {
"voters_one": "",
"voters_other": "",
"votes_one": "",
"votes_other": ""
},
"expiration": {
"expired": "",
"until": ""
}
}
}
}
}

17
src/i18n/eu/screens.json Normal file
View File

@ -0,0 +1,17 @@
{
"screenshot": {
"title": "",
"message": ""
},
"localCorrupt": {
"message": ""
},
"pushError": {
"message": "",
"description": ""
},
"shareError": {
"imageNotSupported": "",
"videoNotSupported": ""
}
}

View File

@ -0,0 +1,6 @@
{
"heading": "",
"content": {
"select_account": ""
}
}

View File

@ -0,0 +1,10 @@
{
"heading": "",
"content": {
"published": "",
"button": {
"read": "",
"unread": ""
}
}
}

View File

@ -0,0 +1,171 @@
{
"heading": {
"left": {
"alert": {
"title": "",
"buttons": {
"save": "",
"delete": ""
}
}
},
"right": {
"button": {
"default": "",
"conversation": "",
"reply": "",
"deleteEdit": "",
"edit": "",
"share": ""
},
"alert": {
"default": {
"title": "",
"button": ""
},
"removeReply": {
"title": "",
"description": "",
"confirm": ""
}
}
}
},
"content": {
"root": {
"header": {
"postingAs": "",
"spoilerInput": {
"placeholder": ""
},
"textInput": {
"placeholder": "",
"keyboardImage": {
"exceedMaximum": {
"title": ""
}
}
}
},
"footer": {
"attachments": {
"sensitive": "",
"remove": {
"accessibilityLabel": ""
},
"edit": {
"accessibilityLabel": ""
},
"upload": {
"accessibilityLabel": ""
}
},
"emojis": {
"accessibilityHint": ""
},
"poll": {
"option": {
"placeholder": {
"accessibilityLabel": "",
"single": "",
"multiple": ""
}
},
"quantity": {
"reduce": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"increase": {
"accessibilityLabel": "",
"accessibilityHint": ""
}
},
"multiple": {
"heading": "",
"options": {
"single": "",
"multiple": ""
}
},
"expiration": {
"heading": "",
"options": {
"300": "",
"1800": "",
"3600": "",
"21600": "",
"86400": "",
"259200": "",
"604800": ""
}
}
}
},
"actions": {
"attachment": {
"accessibilityLabel": "",
"accessibilityHint": "",
"failed": {
"alert": {
"title": "",
"button": ""
}
}
},
"poll": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"visibility": {
"accessibilityLabel": "",
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": "",
"direct": ""
}
},
"spoiler": {
"accessibilityLabel": ""
},
"emoji": {
"accessibilityLabel": "",
"accessibilityHint": ""
}
},
"drafts_one": "",
"drafts_other": ""
},
"editAttachment": {
"header": {
"title": "",
"right": {
"accessibilityLabel": "",
"failed": {
"title": "",
"button": ""
}
}
},
"content": {
"altText": {
"heading": "",
"placeholder": ""
}
}
},
"draftsList": {
"header": {
"title": ""
},
"warning": "",
"content": {
"accessibilityHint": "",
"textEmpty": ""
},
"checkAttachment": ""
}
}
}

View File

@ -0,0 +1,16 @@
{
"content": {
"actions": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"options": {
"save": "",
"share": ""
},
"save": {
"succeed": "",
"failed": ""
}
}
}

View File

@ -0,0 +1,475 @@
{
"tabs": {
"local": {
"name": "",
"options": {
"showBoosts": "",
"showReplies": ""
}
},
"public": {
"segments": {
"federated": "",
"local": "",
"trending": ""
}
},
"notifications": {
"name": ""
}
},
"common": {
"search": {
"accessibilityLabel": "",
"accessibilityHint": ""
}
},
"notifications": {
"filters": {
"accessibilityLabel": "",
"accessibilityHint": "",
"title": ""
}
},
"me": {
"stacks": {
"bookmarks": {
"name": ""
},
"conversations": {
"name": ""
},
"favourites": {
"name": ""
},
"followedTags": {
"name": ""
},
"fontSize": {
"name": ""
},
"language": {
"name": ""
},
"list": {
"name": ""
},
"listAccounts": {
"name": ""
},
"listAdd": {
"name": ""
},
"listEdit": {
"name": ""
},
"lists": {
"name": ""
},
"push": {
"name": ""
},
"preferences": {
"name": ""
},
"preferencesFilters": {
"name": ""
},
"preferencesFilterAdd": {
"name": ""
},
"preferencesFilterEdit": {
"name": ""
},
"profile": {
"name": ""
},
"profileName": {
"name": ""
},
"profileNote": {
"name": ""
},
"profileFields": {
"name": ""
},
"settings": {
"name": ""
},
"switch": {
"name": ""
}
},
"fontSize": {
"demo": "",
"sizes": {
"S": "",
"M": "",
"L": "",
"XL": "",
"XXL": ""
}
},
"listAccounts": {
"heading": "",
"error": "",
"empty": ""
},
"listEdit": {
"heading": "",
"title": "",
"repliesPolicy": {
"heading": "",
"options": {
"none": "",
"list": "",
"followed": ""
}
}
},
"listDelete": {
"heading": "",
"confirm": {
"title": "",
"message": ""
}
},
"preferences": {
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"media": {
"title": "",
"options": {
"default": "",
"show_all": "",
"hide_all": ""
}
},
"spoilers": {
"title": ""
},
"autoplay_gifs": {
"title": ""
},
"filters": {
"title": "",
"content": ""
},
"web_only": {
"title": "",
"description": ""
}
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "",
"statuses_other": "",
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
}
},
"preferencesFilter": {
"name": "",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
},
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
},
"action": "",
"actions": {
"warn": "",
"hide": ""
},
"keywords": "",
"keyword": "",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "",
"failed": ""
},
"root": {
"name": {
"title": ""
},
"avatar": {
"title": "",
"description": ""
},
"header": {
"title": "",
"description": ""
},
"note": {
"title": ""
},
"fields": {
"title": "",
"total_one": "",
"total_other": ""
},
"lock": {
"title": "",
"description": ""
},
"bot": {
"title": "",
"description": ""
}
},
"fields": {
"group": "",
"label": "",
"content": ""
},
"mediaSelectionFailed": ""
},
"push": {
"notAvailable": "",
"enable": {
"direct": "",
"settings": ""
},
"missingServerKey": {
"message": "",
"description": ""
},
"global": {
"heading": "",
"description": ""
},
"decode": {
"heading": "",
"description": ""
},
"default": {
"heading": ""
},
"follow": {
"heading": ""
},
"follow_request": {
"heading": ""
},
"favourite": {
"heading": ""
},
"reblog": {
"heading": ""
},
"mention": {
"heading": ""
},
"poll": {
"heading": ""
},
"status": {
"heading": ""
},
"update": {
"heading": ""
},
"admin.sign_up": {
"heading": ""
},
"admin.report": {
"heading": ""
},
"howitworks": ""
},
"root": {
"announcements": {
"content": {
"unread": "",
"read": "",
"empty": ""
}
},
"push": {
"content_true": "",
"content_false": ""
},
"logout": {
"button": "",
"alert": {
"title": "",
"message": "",
"buttons": {
"logout": ""
}
}
}
},
"settings": {
"theme": {
"heading": "",
"options": {
"auto": "",
"light": "",
"dark": ""
}
},
"darkTheme": {
"heading": "",
"options": {
"lighter": "",
"darker": ""
}
},
"browser": {
"heading": "",
"options": {
"internal": "",
"external": ""
}
},
"autoplayGifv": {
"heading": ""
},
"feedback": {
"heading": ""
},
"support": {
"heading": ""
},
"contact": {
"heading": ""
},
"version": "",
"instanceVersion": ""
},
"switch": {
"existing": "",
"new": ""
}
},
"shared": {
"account": {
"actions": {
"accessibilityLabel": "",
"accessibilityHint": ""
},
"followed_by": "",
"moved": "",
"created_at": "",
"summary": {
"statuses_count": ""
},
"toots": {
"default": "",
"all": ""
},
"suspended": ""
},
"accountInLists": {
"name": "",
"inLists": "",
"notInLists": ""
},
"attachments": {
"name": ""
},
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": ""
},
"report": {
"name": "",
"report": "",
"forward": {
"heading": ""
},
"reasons": {
"heading": "",
"spam": "",
"other": "",
"violation": ""
},
"comment": {
"heading": ""
},
"violatedRules": {
"heading": ""
}
},
"search": {
"header": {
"prefix": "",
"placeholder": ""
},
"empty": {
"general": "",
"advanced": {
"header": "",
"example": {
"account": "",
"hashtag": "",
"statusLink": "",
"accountLink": ""
}
},
"trending": {
"tags": ""
}
},
"sections": {
"accounts": "",
"hashtags": "",
"statuses": ""
},
"notFound": "",
"noResult": ""
},
"toot": {
"name": "",
"remoteFetch": {
"title": "",
"message": ""
}
},
"users": {
"accounts": {
"following": "",
"followers": ""
},
"statuses": {
"reblogged_by": "",
"favourited_by": ""
},
"resultIncomplete": ""
}
}
}

View File

@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": "Partager le pouet"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Pouet épinglé",
"action_true": "Détacher le pouet"
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Décrire cette photo pour les personnes malvoyantes",
"placeholder": "Vous pouvez ajouter une description, parfois appelée alt-text, à vos médias afin qu'ils soient accessibles à un plus grand nombre de personnes, y compris celles qui sont aveugles ou malvoyantes.\n\nLes bonnes descriptions sont concises, ou présentent ce qui est dans vos médias avec suffisamment de précision pour comprendre leur contexte."
},
"imageFocus": "Faites glisser le cercle de focus pour mettre à jour le point de focus"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Push de notification"
},
"preferences": {
"name": ""
},
"preferencesFilters": {
"name": ""
},
"preferencesFilterAdd": {
"name": ""
},
"preferencesFilterEdit": {
"name": ""
},
"profile": {
"name": "Modifier le profil"
},
@ -84,9 +96,6 @@
"settings": {
"name": "Paramètres de l'application"
},
"webSettings": {
"name": "Plus de paramètres de compte"
},
"switch": {
"name": "Passer sur un autre compte"
}
@ -125,6 +134,85 @@
"message": "Cette action ne peut être annulé."
}
},
"preferences": {
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"media": {
"title": "",
"options": {
"default": "",
"show_all": "",
"hide_all": ""
}
},
"spoilers": {
"title": ""
},
"autoplay_gifs": {
"title": ""
},
"filters": {
"title": "",
"content": ""
},
"web_only": {
"title": "",
"description": ""
}
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "",
"statuses_other": "",
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
}
},
"preferencesFilter": {
"name": "",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
},
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
},
"action": "",
"actions": {
"warn": "",
"hide": ""
},
"keywords": "",
"keyword": "",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "{{type}} mis à jour",
@ -150,17 +238,6 @@
"total_one": "Champ {{count}}",
"total_other": "Champ {{count}}"
},
"visibility": {
"title": "Visibilité de la publication",
"options": {
"public": "Public",
"unlisted": "Non listé",
"private": "Abonné·e·s uniquement"
}
},
"sensitive": {
"title": "Publication de médias sensibles"
},
"lock": {
"title": "Verrouiller le compte",
"description": "Nécessite que vous approuviez manuellement chaque abonné·e"
@ -322,9 +399,9 @@
"attachments": {
"name": "Média de <0 /><1></1>"
},
"hashtag": {
"follow": "Suivre",
"unfollow": "Ne plus suivre"
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": "Modifier l'historique"

View File

@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": "Condividi toot"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Fissa toot",
"action_true": "Togli toot all'alto"
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Descrizione media per ipovedenti",
"placeholder": "Puoi aggiungere una descrizione (anche chiamata alt-text) ai tuoi media, così da renderli accessibili a molte più persone, incluse quelle con disabilità visive.\n\nUna buona descrizione è concisa ma presenta il contenuto del media in modo abbastanza accurato da farne capire il contesto."
},
"imageFocus": "Trascina il cerchio per modificare il punto focale della foto"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Notifiche push"
},
"preferences": {
"name": ""
},
"preferencesFilters": {
"name": ""
},
"preferencesFilterAdd": {
"name": ""
},
"preferencesFilterEdit": {
"name": ""
},
"profile": {
"name": "Modifica profilo"
},
@ -84,9 +96,6 @@
"settings": {
"name": "Impostazioni app"
},
"webSettings": {
"name": "Altre impostazioni account"
},
"switch": {
"name": "Cambia account"
}
@ -125,6 +134,85 @@
"message": ""
}
},
"preferences": {
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"media": {
"title": "",
"options": {
"default": "",
"show_all": "",
"hide_all": ""
}
},
"spoilers": {
"title": ""
},
"autoplay_gifs": {
"title": ""
},
"filters": {
"title": "",
"content": ""
},
"web_only": {
"title": "",
"description": ""
}
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "",
"statuses_other": "",
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
}
},
"preferencesFilter": {
"name": "",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
},
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
},
"action": "",
"actions": {
"warn": "",
"hide": ""
},
"keywords": "",
"keyword": "",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "{{type}} aggiornato",
@ -150,17 +238,6 @@
"total_one": "{{count}} campo",
"total_other": "{{count}} campi"
},
"visibility": {
"title": "Privacy dei post predefinita",
"options": {
"public": "Pubblico",
"unlisted": "Non listato",
"private": "Solo seguaci"
}
},
"sensitive": {
"title": "Segna sempre i media come sensibili"
},
"lock": {
"title": "Blocca account",
"description": "Richiede che approvi i seguaci manualmente"
@ -322,9 +399,9 @@
"attachments": {
"name": "Media di <0 /><1>\"</1>"
},
"hashtag": {
"follow": "Segui",
"unfollow": "Smetti di seguire"
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": "Cronologia delle modifiche"

View File

@ -8,8 +8,8 @@
},
"inLists": "",
"showBoosts": {
"action_false": "",
"action_true": ""
"action_false": "ブーストを表示する",
"action_true": "ブーストを非表示にする"
},
"mute": {
"action_false": "ユーザーをミュート",
@ -17,22 +17,22 @@
},
"followAs": {
"trigger": "",
"succeed_default": "",
"succeed_locked": "",
"failed": ""
"succeed_default": "{{source}} として @{{target}} をフォローしました",
"succeed_locked": "{{source}} として @{{target}} へのフォロー申請を送りました。現在承認待ちです",
"failed": "別ユーザーとしてフォロー"
},
"blockReport": "",
"block": {
"action_false": "ユーザーをブロック",
"action_true": "ユーザーのブロックを解除",
"alert": {
"title": ""
"title": "@{{username}} をブロックしますか?"
}
},
"reports": {
"action": "ユーザーの報告とブロック",
"alert": {
"title": ""
"title": "@{{username}} を通報し、ブロックしますか?"
}
}
},
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": "トゥートを共有"
@ -88,6 +97,10 @@
"pin": {
"action_false": "トゥートを固定",
"action_true": "トゥートの固定を解除"
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -3,7 +3,7 @@
"textInput": {
"placeholder": "インスタンスのドメイン"
},
"whitelisted": "",
"whitelisted": "このインスタンスは、ログインせずにデータを取得できない設定になっている可能性があります。",
"button": "ログイン",
"information": {
"name": "名前",
@ -12,7 +12,7 @@
"domains": "接続連合数"
},
"disclaimer": {
"base": "ログインにはシステムのブラウザを使用するため、あなたのアカウント情報は tooot アプリには表示されません。"
"base": "あなたのログイン情報の安全のため、ログインはシステムのブラウズを経由して行われます。 tooot アプリにパスワード等は送られません。"
},
"terms": {
"base": "ログインすることで、 tooot の <0>プライバシーポリシー</0> および <1>利用規約</1> に同意したことになります。"

View File

@ -32,7 +32,7 @@
},
"update": "ブーストしたトゥートが編集されました",
"admin.sign_up": "{{name}} がインスタンスに参加しました",
"admin.report": ""
"admin.report": "{{name}} が報告しました:"
},
"actions": {
"reply": {
@ -55,7 +55,7 @@
"accessibilityLabel": "このトゥートをブックマークに追加",
"function": "ブックマークトゥート"
},
"openReport": ""
"openReport": "報告を開く"
},
"actionsUsers": {
"reblogged_by": {
@ -83,7 +83,7 @@
"text": "読み込みエラー",
"button": "リモートリンクを試す"
},
"altText": ""
"altText": "代替テキスト"
},
"avatar": {
"accessibilityLabel": "{{name}}のアバター",
@ -93,10 +93,10 @@
"expandHint": "内容を非表示にする"
},
"filtered": {
"reveal": "",
"match_v1": "",
"match_v2_one": "",
"match_v2_other": ""
"reveal": "表示する",
"match_v1": "フィルター: {{phrase}}",
"match_v2_one": "フィルター: {{filters}}",
"match_v2_other": "フィルター ({{count}}): {{filters}}"
},
"fullConversation": "スレッドを読む",
"translate": {
@ -116,14 +116,14 @@
"accessibilityHint": "ユーザーのアカウント名"
}
},
"application": "",
"application": "{{application}} より",
"edited": {
"accessibilityLabel": "トゥートが編集されました"
},
"muted": {
"accessibilityLabel": "トゥートがミュートされました"
},
"replies": "",
"replies": "返信先: <0 />",
"visibility": {
"direct": {
"accessibilityLabel": "トゥートはダイレクトメッセージです"

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "閲覧が難しいユーザーへの説明",
"placeholder": "目の不自由な人や視覚障がいを持つ人を含むより多くの人がメディアにアクセスできるようになる、代替テキスト(alt-text)とも呼ばれる説明をメディアに追加することができます。\n\n簡潔でありながらも、メディアの文脈を正確に理解できるような表現が良い説明です。"
},
"imageFocus": "円形の枠をドラッグしてサムネイルの焦点にしたい場所を更新します"
}
}
},
"draftsList": {

View File

@ -3,8 +3,8 @@
"local": {
"name": "ホーム",
"options": {
"showBoosts": "",
"showReplies": ""
"showBoosts": "トゥートのブーストも表示する",
"showReplies": "他トゥートへの返信も表示する"
}
},
"public": {
@ -28,7 +28,7 @@
"filters": {
"accessibilityLabel": "フィルター",
"accessibilityHint": "表示される通知の種類をフィルターする",
"title": ""
"title": "表示する通知"
}
},
"me": {
@ -43,7 +43,7 @@
"name": "お気に入り"
},
"followedTags": {
"name": ""
"name": "フォロー中のハッシュタグ"
},
"fontSize": {
"name": "トゥートのフォントサイズ"
@ -58,7 +58,7 @@
"name": "リスト {{list}} のユーザー"
},
"listAdd": {
"name": ""
"name": "リストを作成"
},
"listEdit": {
"name": "リストの詳細を編集"
@ -69,6 +69,18 @@
"push": {
"name": "プッシュ通知"
},
"preferences": {
"name": ""
},
"preferencesFilters": {
"name": ""
},
"preferencesFilterAdd": {
"name": ""
},
"preferencesFilterEdit": {
"name": ""
},
"profile": {
"name": "プロフィールを編集"
},
@ -84,9 +96,6 @@
"settings": {
"name": "アプリの設定"
},
"webSettings": {
"name": "アカウントの設定"
},
"switch": {
"name": "アカウントを切り替える"
}
@ -125,6 +134,85 @@
"message": "この操作は復元できません。"
}
},
"preferences": {
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"media": {
"title": "",
"options": {
"default": "",
"show_all": "",
"hide_all": ""
}
},
"spoilers": {
"title": ""
},
"autoplay_gifs": {
"title": ""
},
"filters": {
"title": "",
"content": ""
},
"web_only": {
"title": "",
"description": ""
}
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "",
"statuses_other": "",
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
}
},
"preferencesFilter": {
"name": "",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
},
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
},
"action": "",
"actions": {
"warn": "",
"hide": ""
},
"keywords": "",
"keyword": "",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "{{type}} がアップデートされました",
@ -150,17 +238,6 @@
"total_one": "{{count}} つのフィールド",
"total_other": "{{count}} つのフィールド"
},
"visibility": {
"title": "デフォルトの投稿の公開範囲",
"options": {
"public": "公開",
"unlisted": "未収載",
"private": "フォロワー限定"
}
},
"sensitive": {
"title": "メディアを常に閲覧注意として投稿する"
},
"lock": {
"title": "承認制アカウント",
"description": "フォロワーを手動で承認する必要があります"
@ -184,8 +261,8 @@
"settings": "設定で有効にする"
},
"missingServerKey": {
"message": "",
"description": ""
"message": "このサーバーはプッシュ通知に対応していません",
"description": "プッシュ通知機能の有効化についてサーバーの管理者にお問い合わせください"
},
"global": {
"heading": "{{acct}} の通知を有効にする",
@ -223,10 +300,10 @@
"heading": "ブーストしたトゥートが編集されました"
},
"admin.sign_up": {
"heading": ""
"heading": "管理者用: 新規登録"
},
"admin.report": {
"heading": ""
"heading": "管理者用: 報告案件"
},
"howitworks": "通知到達(routing)のしくみを学ぶ"
},
@ -266,7 +343,7 @@
"heading": "ダークテーマ",
"options": {
"lighter": "デフォルト",
"darker": ""
"darker": "トゥルーブラック"
}
},
"browser": {
@ -277,7 +354,7 @@
}
},
"autoplayGifv": {
"heading": ""
"heading": "タイムラインでGIFを自動再生"
},
"feedback": {
"heading": "機能リクエスト"
@ -322,30 +399,30 @@
"attachments": {
"name": "<0 /><1>のメディア</1>"
},
"hashtag": {
"follow": "フォロー",
"unfollow": "フォロー解除"
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": "編集履歴"
},
"report": {
"name": "",
"report": "",
"name": "{{acct}} の違反報告",
"report": "報告",
"forward": {
"heading": ""
"heading": "匿名で相手のサーバー {{instance}} にも送る"
},
"reasons": {
"heading": "",
"spam": "",
"other": "",
"violation": ""
"heading": "このアカウントを通報する理由はなんですか?",
"spam": "スパムだから",
"other": "他の理由があるから",
"violation": "サーバー・インスタンスの規則を破っているから"
},
"comment": {
"heading": ""
"heading": "他に何か意見はありますか?"
},
"violatedRules": {
"heading": ""
"heading": "サーバー・インスタンスの規則違反"
}
},
"search": {
@ -374,13 +451,13 @@
"statuses": "投稿"
},
"notFound": "{{type}} <bold>{{searchTerm}}</bold> は見つかりませんでした",
"noResult": ""
"noResult": "何も見つかりません。別の検索用語でお試しください。"
},
"toot": {
"name": "スレッド",
"remoteFetch": {
"title": "",
"message": ""
"title": "外部の内容が含まれます",
"message": "ローカルのインスタンスに特定のコンテンツのコピーが無い場合、リモートから直接取得することになります。これらのコンテンツに対しても通常同様の行動ができます。"
}
},
"users": {
@ -392,7 +469,7 @@
"reblogged_by": "{{count}} ブースト",
"favourited_by": "{{count}} お気に入り"
},
"resultIncomplete": ""
"resultIncomplete": "リモートインスタンスからの結果は不完全な場合があります"
}
}
}

View File

@ -6,7 +6,7 @@
"action_false": "사용자 팔로우",
"action_true": "사용자 팔로우 해제"
},
"inLists": "사용자를 포함한 리스트",
"inLists": "",
"showBoosts": {
"action_false": "사용자의 부스트 보이기",
"action_true": "사용자의 부스트 숨기기"
@ -17,9 +17,9 @@
},
"followAs": {
"trigger": "",
"succeed_default": "",
"succeed_locked": "",
"failed": ""
"succeed_default": "@{{source}} 계정에서 @{{target}} 계정을 팔로우 했어요.",
"succeed_locked": "@{{source}} 계정에서 @{{target}} 계정의 팔로우 승인을 요청했어요.",
"failed": "특정 계정에서 팔로우"
},
"blockReport": "",
"block": {
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": "툿 공유"
@ -88,6 +97,10 @@
"pin": {
"action_false": "툿 고정",
"action_true": "툿 고정 해제"
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "시각장애인을 위한 미디어 설명",
"placeholder": "미디어에 '대체 텍스트'라고도 하는 설명을 추가하여, 시각 장애가 있는 사람들을 포함해 더 많은 사람들이 접근하도록 할 수 있어요.\n\n좋은 설명은 간결하지만, 미디어의 내용을 정확하게 표현하여 문맥을 파악할 수 있는 것이에요."
},
"imageFocus": "포커스 원을 드래그하여 포커스 포인트를 업데이트할 수 있어요"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "푸시 알림"
},
"preferences": {
"name": ""
},
"preferencesFilters": {
"name": ""
},
"preferencesFilterAdd": {
"name": ""
},
"preferencesFilterEdit": {
"name": ""
},
"profile": {
"name": "프로필 편집"
},
@ -84,9 +96,6 @@
"settings": {
"name": "앱 설정"
},
"webSettings": {
"name": "더 많은 계정 설정"
},
"switch": {
"name": "계정 전환"
}
@ -125,6 +134,85 @@
"message": "이 작업은 되돌릴 수 없습니다."
}
},
"preferences": {
"visibility": {
"title": "",
"options": {
"public": "",
"unlisted": "",
"private": ""
}
},
"sensitive": {
"title": ""
},
"media": {
"title": "",
"options": {
"default": "",
"show_all": "",
"hide_all": ""
}
},
"spoilers": {
"title": ""
},
"autoplay_gifs": {
"title": ""
},
"filters": {
"title": "",
"content": ""
},
"web_only": {
"title": "",
"description": ""
}
},
"preferencesFilters": {
"expired": "",
"keywords_one": "",
"keywords_other": "",
"statuses_one": "",
"statuses_other": "",
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
}
},
"preferencesFilter": {
"name": "",
"expiration": "",
"expirationOptions": {
"0": "",
"1800": "",
"3600": "",
"43200": "",
"86400": "",
"604800": "",
"18144000": ""
},
"context": "",
"contexts": {
"home": "",
"notifications": "",
"public": "",
"thread": "",
"account": ""
},
"action": "",
"actions": {
"warn": "",
"hide": ""
},
"keywords": "",
"keyword": "",
"statuses": ""
},
"profile": {
"feedback": {
"succeed": "{{type}} 업데이트됨",
@ -150,17 +238,6 @@
"total_one": "{{count}}개 필드",
"total_other": "{{count}}개 필드"
},
"visibility": {
"title": "공개 범위",
"options": {
"public": "공개",
"unlisted": "공개 타임라인에 비표시",
"private": "팔로워만"
}
},
"sensitive": {
"title": "미디어를 민감함 표시 후 게시"
},
"lock": {
"title": "계정 잠그기",
"description": "직접 승인한 사람만 나를 팔로우 할 수 있어요"
@ -322,9 +399,9 @@
"attachments": {
"name": "<0 /><1>의 미디어</1>"
},
"hashtag": {
"follow": "팔로우",
"unfollow": "팔로우 해제"
"filter": {
"name": "",
"existed": ""
},
"history": {
"name": "수정 이력"
@ -374,7 +451,7 @@
"statuses": "툿"
},
"notFound": "<bold>{{searchTerm}}</bold>와 관련된 {{type}}을 찾을 수 없어요",
"noResult": ""
"noResult": "검색 결과가 없어요. 다른 검색어로 다시 시도해주세요."
},
"toot": {
"name": "대화",

View File

@ -6,7 +6,7 @@
"action_false": "Volg gebruiker",
"action_true": "Ontvolg"
},
"inLists": "Lijsten waarin gebruiker staat",
"inLists": "Lijsten met gebruiker...",
"showBoosts": {
"action_false": "Boosts van gebruiker weergeven",
"action_true": "Boosts van gebruiker verbergen"
@ -16,12 +16,12 @@
"action_true": "Dempen opheffen voor gebruiker"
},
"followAs": {
"trigger": "Volg als...",
"trigger": "Volg als ...",
"succeed_default": "Je volgt nu @{{target}} met @{{source}}",
"succeed_locked": "Verstuurde het volgverzoek naar @{{target}} met {{source}}, in afwachting van goedkeuring",
"failed": "Volg als"
},
"blockReport": "Blokkeren en rapporten...",
"blockReport": "Blokkeren en rapporten",
"block": {
"action_false": "Gebruiker blokkeren",
"action_true": "Gebruiker deblokkeren",
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "Volg",
"action_true": "Ontvolg"
},
"filter": {
"action": "Filter hashtag ..."
}
},
"share": {
"status": {
"action": "Toot delen"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Toot vastzetten",
"action_true": "Toot losmaken"
},
"filter": {
"action_false": "Filter toot ...",
"action_true": "Filters beheren ..."
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Omschrijf deze media voor mensen met een visuele beperking",
"placeholder": "Je kan een beschrijving aan je media toevoegen, ook wel bekend als alt-text, zodat deze voor meer mensen toegankelijk wordt. Bijvoorbeeld voor mensen met een visuele beperking.\n\nGoede beschrijvingen zijn beknopt, maar geven nauwkeurig genoeg weer wat er in de media staat om de context ervan te begrijpen."
},
"imageFocus": "Sleep de focuscirkel om het focuspunt bij te werken"
}
}
},
"draftsList": {

View File

@ -69,6 +69,18 @@
"push": {
"name": "Push Melding"
},
"preferences": {
"name": "Voorkeuren"
},
"preferencesFilters": {
"name": "Alle inhoudsfilters"
},
"preferencesFilterAdd": {
"name": "Filter Maken"
},
"preferencesFilterEdit": {
"name": "Bewerk filter"
},
"profile": {
"name": "Profiel bewerken"
},
@ -84,9 +96,6 @@
"settings": {
"name": "App Instellingen"
},
"webSettings": {
"name": "Meer Accountinstellingen"
},
"switch": {
"name": "Account wisselen"
}
@ -125,6 +134,85 @@
"message": "Deze actie kan niet worden hersteld."
}
},
"preferences": {
"visibility": {
"title": "Standaard zichtbaarheid van berichten",
"options": {
"public": "Openbaar",
"unlisted": "Niet openbaar",
"private": "Alleen volgers"
}
},
"sensitive": {
"title": "Media standaard als gevoelig markeren"
},
"media": {
"title": "Mediaweergave",
"options": {
"default": "Als gevoelig gemarkeerde media verbergen",
"show_all": "Media altijd tonen",
"hide_all": "Media altijd verbergen"
}
},
"spoilers": {
"title": "Altijd toots met tekstwaarschuwingen uitklappen"
},
"autoplay_gifs": {
"title": "GIF automatisch afspelen in toots"
},
"filters": {
"title": "Inhoud Filters",
"content": "{{count}} actief"
},
"web_only": {
"title": "Instellingen bijwerken",
"description": "Instellingen hieronder kunnen alleen met behulp van de webUI worden bijgewerkt"
}
},
"preferencesFilters": {
"expired": "Verlopen",
"keywords_one": "{{count}} trefwoord",
"keywords_other": "{{count}} trefwoorden",
"statuses_one": "{{count}} toot",
"statuses_other": "{{count}} toots",
"context": "Van toepassing in <0 />",
"contexts": {
"home": "volgend en lijsten",
"notifications": "melding",
"public": "gefedereerd",
"thread": "gesprek",
"account": "profiel"
}
},
"preferencesFilter": {
"name": "Naam",
"expiration": "Vervaldatum",
"expirationOptions": {
"0": "Nooit",
"1800": "Na 30 minuten",
"3600": "Na 1 uur",
"43200": "Na 12 uur",
"86400": "Na 1 dag",
"604800": "Na 1 week",
"18144000": "Na 1 maand"
},
"context": "Van toepassing in",
"contexts": {
"home": "Volgend en lijsten",
"notifications": "Melding",
"public": "Federale tijdlijn",
"thread": "Gesprek weergave",
"account": "Profiel weergave"
},
"action": "Bij een overeenkomst",
"actions": {
"warn": "Ingeklapt maar kan worden onthuld",
"hide": "Volledig verborgen"
},
"keywords": "Komt overeen met deze trefwoorden",
"keyword": "Trefwoord",
"statuses": "Komt overeen met deze toots"
},
"profile": {
"feedback": {
"succeed": "{{type}} bijgewerkt",
@ -150,17 +238,6 @@
"total_one": "{{count}} veld",
"total_other": "{{count}} velden"
},
"visibility": {
"title": "Post zichtbaarheid",
"options": {
"public": "Openbaar",
"unlisted": "Niet openbaar",
"private": "Alleen volgers"
}
},
"sensitive": {
"title": "Posten van gevoelige media"
},
"lock": {
"title": "Account vergrendelen",
"description": "Vereist dat je handmatig volgers goedkeurt"
@ -322,9 +399,9 @@
"attachments": {
"name": "<0 /><1>'s media</1>"
},
"hashtag": {
"follow": "Volg",
"unfollow": "Ontvolg"
"filter": {
"name": "Toevoegen aan filter",
"existed": "Bestaat in deze filters"
},
"history": {
"name": "Geschiedenis bewerken"

View File

@ -6,7 +6,7 @@
"action_false": "Obserwuj",
"action_true": "Przestań obserwować"
},
"inLists": "Listy zawierające użytkownika",
"inLists": "",
"showBoosts": {
"action_false": "Pokaż podbicia użytkownika",
"action_true": "Ukryj podbicia użytkowników"
@ -16,12 +16,12 @@
"action_true": "Wyłącz wyciszenie"
},
"followAs": {
"trigger": "Obserwuj jako...",
"trigger": "",
"succeed_default": "Teraz obserwujesz @{{target}} z @{{source}}",
"succeed_locked": "Wysłano prośbę o obserwowanie do @{{target}} z {{source}}, oczekiwanie na zatwierdzenie",
"failed": "Obserwuj jako"
},
"blockReport": "Zablokuj i zgłoś...",
"blockReport": "",
"block": {
"action_false": "Zablokuj użytkownika",
"action_true": "Odblokuj użytkownika",
@ -54,6 +54,15 @@
}
}
},
"hashtag": {
"follow": {
"action_false": "",
"action_true": ""
},
"filter": {
"action": ""
}
},
"share": {
"status": {
"action": "Udostępnij wpis"
@ -88,6 +97,10 @@
"pin": {
"action_false": "Przypnij wpis",
"action_true": "Odepnij wpis"
},
"filter": {
"action_false": "",
"action_true": ""
}
}
}

View File

@ -153,8 +153,7 @@
"altText": {
"heading": "Opis dla niedowidzących",
"placeholder": "Możesz dodać opis, czasami nazywany tekstem alternatywnym czy alt-text, dla Twoich mediów, dzięki czemu będą one dostępne dla jeszcze większej liczby osób, w tym dla osób niewidomych lub niedowidzących.\n\nDobre opisy są zwięzłe, ale prezentują to, co w twoich mediach jest wystarczająco dokładne, aby zrozumieć ich kontekst."
},
"imageFocus": "Przeciągnij okrąg ogniskowy, aby zaktualizować punkt ogniskowy"
}
}
},
"draftsList": {

Some files were not shown because too many files have changed in this diff Show More