Merge pull request #92 from tooot-app/main

Nightly 210329
This commit is contained in:
xmflsct 2021-03-30 00:19:27 +02:00 committed by GitHub
commit 850bcf4f41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
145 changed files with 1716 additions and 1761 deletions

View File

@ -2,7 +2,6 @@ name: build
on:
push:
branches:
- main
- candidate
- release

View File

@ -2,7 +2,7 @@ GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.3)
activesupport (5.2.4.5)
activesupport (5.2.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
@ -15,7 +15,7 @@ GEM
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.1.1)
aws-partitions (1.432.0)
aws-partitions (1.436.0)
aws-sdk-core (3.113.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
@ -24,7 +24,7 @@ GEM
aws-sdk-kms (1.43.0)
aws-sdk-core (~> 3, >= 3.112.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.91.0)
aws-sdk-s3 (1.93.0)
aws-sdk-core (~> 3, >= 3.112.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.1)
@ -97,7 +97,7 @@ GEM
faraday_middleware (1.0.0)
faraday (~> 1.0)
fastimage (2.2.3)
fastlane (2.178.0)
fastlane (2.179.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.3, < 3.0.0)
artifactory (~> 3.0)
@ -196,7 +196,7 @@ GEM
jwt (2.2.2)
memoist (0.16.2)
mini_magick (4.11.0)
mini_mime (1.0.2)
mini_mime (1.0.3)
minitest (5.14.4)
molinillo (0.6.6)
multi_json (1.15.0)
@ -260,7 +260,7 @@ GEM
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
ruby
universal-darwin-20
DEPENDENCIES
cocoapods

View File

Before

Width:  |  Height:  |  Size: 383 KiB

After

Width:  |  Height:  |  Size: 383 KiB

10
crowdin.yml Normal file
View File

@ -0,0 +1,10 @@
# 'preserve_hierarchy': true
files:
[
{
'source': '/src/i18n/en/**/*.json',
'translation': '/src/i18n/%osx_locale%/**/%original_file_name%',
'ignore': ['*.ts'],
},
]

View File

@ -1,4 +1,4 @@
fastlane_version "2.178.0"
fastlane_version "2.179.0"
skip_docs
ensure_env_vars(

View File

@ -88,7 +88,8 @@ const App: React.FC = () => {
log('log', 'App', 'bootstrapped')
if (bootstrapped) {
log('log', 'App', 'loading actual app :)')
i18n.changeLanguage(getSettingsLanguage(store.getState()))
const language = getSettingsLanguage(store.getState())
i18n.changeLanguage(language)
return (
<ActionSheetProvider>
<AccessibilityManager>

View File

@ -28,15 +28,14 @@ import { useDispatch, useSelector } from 'react-redux'
import * as Sentry from 'sentry-expo'
const Stack = createNativeStackNavigator<Nav.RootStackParamList>()
export const navigationRef = createRef<NavigationContainerRef>()
export interface Props {
localCorrupt?: string
}
export const navigationRef = createRef<NavigationContainerRef>()
const Screens: React.FC<Props> = ({ localCorrupt }) => {
const { t } = useTranslation('common')
const { t } = useTranslation('screens')
const dispatch = useDispatch()
const instanceActive = useSelector(getInstanceActive)
const { mode, theme } = useTheme()
@ -93,7 +92,7 @@ const Screens: React.FC<Props> = ({ localCorrupt }) => {
const showLocalCorrect = () => {
if (localCorrupt) {
displayMessage({
message: t('index.localCorrupt'),
message: t('localCorrupt.message'),
description: localCorrupt.length ? localCorrupt : undefined,
type: 'error',
mode

View File

@ -131,13 +131,30 @@ const ComponentInstance: React.FC<Props> = ({
{!disableHeaderImage ? (
<View style={styles.imageContainer}>
<Image
source={require('assets/screens/meRoot/welcome.png')}
source={require('assets/images/welcome.png')}
style={styles.image}
/>
</View>
) : null}
<View style={styles.base}>
<View style={styles.inputRow}>
<TextInput
style={[
styles.prefix,
{
borderBottomColor: instanceQuery.isError
? theme.red
: theme.border
}
]}
editable={false}
children={
<Text
style={{ color: theme.primaryDefault }}
children='https://'
/>
}
/>
<TextInput
style={[
styles.textInput,
@ -246,6 +263,11 @@ const styles = StyleSheet.create({
flexDirection: 'row',
marginHorizontal: StyleConstants.Spacing.Global.PagePadding
},
prefix: {
borderBottomWidth: 1,
...StyleConstants.FontStyle.M,
paddingRight: StyleConstants.Spacing.XS
},
textInput: {
flex: 1,
borderBottomWidth: 1,

View File

@ -41,7 +41,7 @@ const RelationshipIncoming: React.FC<Props> = ({ id }) => {
displayMessage({
type: 'error',
mode,
message: t('common:toastMessage.error.message', {
message: t('common:message.error.message', {
function: t(`relationship:${type}.function`)
}),
...(err.status &&

View File

@ -42,7 +42,7 @@ const RelationshipOutgoing = React.memo(
displayMessage({
mode,
type: 'error',
message: t('common:toastMessage.error.message', {
message: t('common:message.error.message', {
function: t(`${action}.function`)
}),
...(err.status &&

View File

@ -139,7 +139,7 @@ const Timeline: React.FC<Props> = ({
ref={customFLRef || flRef}
scrollEventThrottle={16}
onScroll={onScroll}
windowSize={10}
windowSize={7}
data={flattenData}
initialNumToRender={6}
maxToRenderPerBatch={3}

View File

@ -85,7 +85,7 @@ const TimelineActions: React.FC<Props> = ({
displayMessage({
mode,
type: 'error',
message: t('common:toastMessage.error.message', {
message: t('common:message.error.message', {
function: t(
`shared.actions.${correctParam.payload.property}.function`
)

View File

@ -2,7 +2,7 @@ import analytics from '@components/analytics'
import GracefullyImage from '@components/GracefullyImage'
import { StyleConstants } from '@utils/styles/constants'
import React, { useCallback } from 'react'
import { StyleSheet } from 'react-native'
import { StyleSheet, View } from 'react-native'
import attachmentAspectRatio from './aspectRatio'
export interface Props {
@ -21,16 +21,15 @@ const AttachmentImage = React.memo(
}, [])
return (
<GracefullyImage
hidden={sensitiveShown}
uri={{ original: image.preview_url, remote: image.remote_url }}
blurhash={image.blurhash}
onPress={onPress}
style={[
styles.base,
{ aspectRatio: attachmentAspectRatio({ total, index }) }
]}
/>
<View style={styles.base}>
<GracefullyImage
hidden={sensitiveShown}
uri={{ original: image.preview_url, remote: image.remote_url }}
blurhash={image.blurhash}
onPress={onPress}
style={[{ aspectRatio: attachmentAspectRatio({ total, index }) }]}
/>
</View>
)
},
(prev, next) => prev.sensitiveShown === next.sensitiveShown

View File

@ -1,7 +1,7 @@
import Button from '@components/Button'
import { StyleConstants } from '@utils/styles/constants'
import { Video } from 'expo-av'
import React, { useCallback, useEffect, useRef, useState } from 'react'
import React, { useCallback, useRef, useState } from 'react'
import { Pressable, StyleSheet, View } from 'react-native'
import { Blurhash } from 'react-native-blurhash'
import attachmentAspectRatio from './aspectRatio'
@ -54,12 +54,6 @@ const AttachmentVideo: React.FC<Props> = ({
})
}, [videoLoaded, videoPosition])
useEffect(() => {
if (gifv) {
videoPlayer.current?.setIsLoopingAsync(true)
}
}, [])
return (
<View
style={[
@ -76,7 +70,12 @@ const AttachmentVideo: React.FC<Props> = ({
}}
usePoster
{...(gifv
? { shouldPlay: true, source: { uri: video.url } }
? {
shouldPlay: true,
isMuted: true,
isLooping: true,
source: { uri: video.url }
}
: {
resizeMode: 'cover',
posterSource: { uri: video.preview_url },

View File

@ -59,7 +59,7 @@ const HeaderConversation = React.memo(
displayMessage({
mode,
type: 'error',
message: t('common:toastMessage.error.message', {
message: t('common:message.error.message', {
function: t(`shared.header.conversation.delete.function`)
}),
...(err.status &&

View File

@ -63,7 +63,7 @@ const TimelinePoll: React.FC<Props> = ({
displayMessage({
mode,
type: 'error',
message: t('common:toastMessage.error.message', {
message: t('common:message.error.message', {
// @ts-ignore
function: t(`shared.poll.meta.button.${theParams.payload.type}`)
}),
@ -269,12 +269,14 @@ const TimelinePoll: React.FC<Props> = ({
return (
<Text style={[styles.votes, { color: theme.secondary }]}>
{t('shared.poll.meta.count.voters', { count: poll.voters_count })}
{' • '}
</Text>
)
} else if (poll.votes_count !== null) {
return (
<Text style={[styles.votes, { color: theme.secondary }]}>
{t('shared.poll.meta.count.votes', { count: poll.votes_count })}
{' • '}
</Text>
)
}

View File

@ -1,37 +1,16 @@
export default {
common: require('./common').default,
common: require('./common'),
local: require('./screens/local').default,
screens: require('./screens'),
screenActions: require('./screens/actions'),
screenAnnouncements: require('./screens/announcements'),
screenCompose: require('./screens/compose'),
screenImageViewer: require('./screens/imageViewer'),
screenTabs: require('./screens/tabs'),
public: require('./screens/public').default,
notifications: require('./screens/notifications').default,
meRoot: require('./screens/meRoot').default,
meConversations: require('./screens/meConversations').default,
meBookmarks: require('./screens/meBookmarks').default,
meFavourites: require('./screens/meFavourites').default,
meLists: require('./screens/meLists').default,
meListsList: require('./screens/meListsList').default,
meSettings: require('./screens/meSettings').default,
meSettingsFontsize: require('./screens/meSettingsFontsize').default,
meSettingsPush: require('./screens/meSettingsPush').default,
meSwitch: require('./screens/meSwitch').default,
sharedAccount: require('./screens/sharedAccount').default,
sharedAnnouncements: require('./screens/sharedAnnouncements').default,
sharedAttachments: require('./screens/sharedAttachments').default,
sharedCompose: require('./screens/sharedCompose').default,
sharedSearch: require('./screens/sharedSearch').default,
sharedToot: require('./screens/sharedToot').default,
sharedUsers: require('./screens/sharedUsers').default,
componentInstance: require('./components/instance').default,
componentParse: require('./components/parse').default,
componentRelationship: require('./components/relationship').default,
componentRelativeTime: require('./components/relativeTime').default,
componentTimeline: require('./components/timeline').default,
screenActions: require('./screens/screenActions').default,
screenImageViewer: require('./screens/screenImageViewer').default
componentInstance: require('./components/instance'),
componentParse: require('./components/parse'),
componentRelationship: require('./components/relationship'),
componentRelativeTime: require('./components/relativeTime'),
componentTimeline: require('./components/timeline')
}

18
src/i18n/en/common.json Normal file
View File

@ -0,0 +1,18 @@
{
"buttons": {
"apply": "Apply",
"cancel": "Cancel"
},
"message": {
"success": {
"message": "{{function}} succeed"
},
"warning": {
"message": ""
},
"error": {
"message": "{{function}} failed, please retry"
}
},
"separator": ", "
}

View File

@ -1,33 +0,0 @@
export default {
network: {
disconnected: {
message: 'Lost network connection',
description: "Please check your phone's network setting"
}
},
screenshot: {
title: 'Privacy Protection',
message:
"Please do not disclose other user's identity, such as username, avatar, etc. Thank you!",
button: 'Confirm'
},
index: {
localCorrupt: 'Login expired, please login again'
},
buttons: {
apply: 'Apply',
cancel: 'Cancel'
},
toastMessage: {
success: {
message: '{{function}} succeed'
},
warning: {
message: ''
},
error: {
message: '{{function}} failed, please retry'
}
},
separator: ', '
}

View File

@ -0,0 +1,28 @@
{
"server": {
"textInput": {
"placeholder": "Instance' domain"
},
"button": "Login",
"information": {
"name": "Name",
"accounts": "Users",
"statuses": "Toots",
"domains": "Universes"
},
"disclaimer": {
"base": "Logging in process uses system broswer that, your account information won't be visible to tooot app. Read more ",
"privacy": "privacy policy"
}
},
"update": {
"alert": {
"title": "Logged in to this instance",
"message": "You can login to another account, keeping existing logged in account",
"buttons": {
"cancel": "$t(common:buttons.cancel)",
"continue": "Continue"
}
}
}
}

View File

@ -1,31 +0,0 @@
export default {
server: {
textInput: { placeholder: "Instance' domain" },
privateInstance: 'Private instance, peeping not allowed',
EULA: { base: 'I have read and agreed to ', EULA: 'EULA' },
button: 'Login',
information: {
name: 'Name',
description: { heading: 'Description', expandHint: 'description' },
accounts: 'Users',
statuses: 'Toots',
domains: 'Universes'
},
disclaimer: {
base:
"Logging in process uses system broswer that, your account information won't be visible to tooot app. Read more ",
privacy: 'privacy policy'
}
},
update: {
alert: {
title: 'Logged in to this instance',
message:
'You can login to another account, keeping existing logged in account',
buttons: {
cancel: '$t(common:buttons.cancel)',
continue: 'Continue'
}
}
}
}

View File

@ -0,0 +1,9 @@
{
"HTML": {
"expanded": {
"true": "Fold {{hint}}",
"false": "Expand {{hint}}"
},
"defaultHint": "article"
}
}

View File

@ -1,9 +0,0 @@
export default {
HTML: {
expanded: {
true: 'Fold {{hint}}',
false: 'Expand {{hint}}'
},
defaultHint: 'article'
}
}

View File

@ -0,0 +1,16 @@
{
"follow": {
"function": "Follow user"
},
"block": {
"function": "Block user"
},
"button": {
"error": "Loading error",
"blocked_by": "Blocked by user",
"blocking": "Unblock",
"following": "Unfollow",
"requested": "Withdraw request",
"default": "Follow"
}
}

View File

@ -1,16 +0,0 @@
export default {
follow: {
function: 'Follow user'
},
block: {
function: 'Block user'
},
button: {
error: 'Loading error',
blocked_by: 'Blocked by user',
blocking: 'Unblock',
following: 'Unfollow',
requested: 'Withdraw request',
default: 'Follow'
}
}

View File

@ -0,0 +1,20 @@
{
"strings": {
"prefixAgo": "",
"prefixFromNow": "",
"suffixAgo": "ago",
"suffixFromNow": "",
"seconds": "%d seconds",
"minute": "about a minute",
"minutes": "%d minutes",
"hour": "about an hour",
"hours": "about %d hours",
"day": "a day",
"days": "%d days",
"month": "about a month",
"months": "%d months",
"year": "about a year",
"years": "%d years",
"wordSeparator": " "
}
}

View File

@ -1,21 +0,0 @@
export default {
strings: {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: 'ago',
// suffixFromNow: 'from now',
suffixFromNow: null,
seconds: '%d seconds',
minute: 'about a minute',
minutes: '%d minutes',
hour: 'about an hour',
hours: 'about %d hours',
day: 'a day',
days: '%d days',
month: 'about a month',
months: '%d months',
year: 'about a year',
years: '%d years',
wordSeparator: ' '
}
}

View File

@ -0,0 +1,164 @@
{
"empty": {
"error": {
"message": "Loading error",
"button": "Retry"
},
"success": {
"message": "Timeline empty"
}
},
"end": {
"message": "The end, what about a cup of <0 />"
},
"refresh": {
"fetchPreviousPage": "Newer from here",
"refetch": "To latest"
},
"shared": {
"actioned": {
"pinned": "Pinned",
"favourite": "{{name}} favourited your toot",
"status": "{{name}} just posted",
"follow": "{{name}} followed you",
"follow_request": "{{name}} requested following you",
"poll": "A poll you have voted in has ended",
"reblog": {
"default": "{{name}} boosted",
"notification": "{{name}} boosted your toot"
}
},
"actions": {
"favourited": {
"function": "Favourite toot"
},
"reblogged": {
"function": "Boost toot"
},
"bookmarked": {
"function": "Bookmark toot"
}
},
"actionsUsers": {
"reblogged_by": "$t(screenTabs:shared.users.statuses.reblogged_by)",
"favourited_by": "$t(screenTabs:shared.users.statuses.favourited_by)"
},
"attachment": {
"sensitive": {
"button": "Show sensitive media"
},
"unsupported": {
"text": "Loading error",
"button": "Try remote link"
}
},
"content": {
"expandHint": "hidden content"
},
"fullConversation": "Read conversations",
"header": {
"shared": {
"application": "Tooted with {{application}}"
},
"conversation": {
"withAccounts": "With",
"delete": {
"function": "Delete direct message"
}
},
"actions": {
"account": {
"heading": "About user",
"mute": {
"function": "Mute user",
"button": "Mute @{{acct}}"
},
"block": {
"function": "Block user",
"button": "Block @{{acct}}"
},
"reports": {
"function": "Report user",
"button": "Report @{{acct}}"
}
},
"domain": {
"heading": "About instance",
"block": {
"function": "Block instance",
"button": "Block instance {{domain}}"
},
"alert": {
"title": "Confirm blocking {{domain}} ?",
"message": "Mostly you can mute or block certain user.\n\nAfter blocking instance, all its content including followers from this instance will be removed!",
"buttons": {
"confirm": "Confirm blocking",
"cancel": "$t(common:buttons.cancel)"
}
}
},
"share": {
"status": {
"heading": "Share toot",
"button": "Share link to this toot"
},
"account": {
"heading": "Share user",
"button": "Share link to this user"
}
},
"status": {
"heading": "About toot",
"delete": {
"function": "Delete toot",
"button": "Delete this toot"
},
"edit": {
"function": "Delete toot",
"button": "Delete and re-draft",
"alert": {
"title": "Confirm deleting toot?",
"message": "Are you sure to delete and re-draft this toot? All boosts and favourites will be cleared, including all replies.",
"buttons": {
"confirm": "Confirm deleting",
"cancel": "$t(common:buttons.cancel)"
}
}
},
"mute": {
"function": "Mute toot",
"button": {
"positive": "Mute this toot and replies",
"negative": "Unmute this toot and replies"
}
},
"pin": {
"function": "Pin",
"button": {
"positive": "Pin this toot",
"negative": "Unpin this toot"
}
}
}
}
},
"poll": {
"meta": {
"button": {
"vote": "Vote",
"refresh": "Refresh"
},
"count": {
"voters": "{{count}} user voted",
"voters_plural": "{{count}} users voted",
"votes": "{{count}} vote",
"votes_plural": "{{count}} votes"
},
"expiration": {
"expired": "Vote expired",
"until": "Expires in <0 />"
}
}
}
}
}

View File

@ -1,160 +0,0 @@
export default {
empty: {
error: {
message: 'Loading error',
button: 'Retry'
},
success: {
message: 'Timeline empty'
}
},
end: {
message: 'The end, what about a cup of <0 />'
},
refresh: {
fetchPreviousPage: 'Newer from here',
refetch: 'To latest'
},
shared: {
actioned: {
pinned: 'Pinned',
favourite: '{{name}} favourited your toot',
status: '{{name}} just posted',
follow: '{{name}} followed you',
follow_request: '{{name}} requested following you',
poll: 'A poll you have voted in has ended',
reblog: {
default: '{{name}} boosted',
notification: '{{name}} boosted your toot'
}
},
actions: {
favourited: {
function: 'Favourite toot'
},
reblogged: {
function: 'Boost toot'
},
bookmarked: {
function: 'Bookmark toot'
}
},
actionsUsers: {
reblogged_by: '$t(sharedUsers:heading.statuses.reblogged_by)',
favourited_by: '$t(sharedUsers:heading.statuses.favourited_by)'
},
attachment: {
sensitive: {
button: 'Show sensitive media'
},
unsupported: {
text: 'Loading error',
button: 'Try remote link'
}
},
content: {
expandHint: 'hidden content'
},
fullConversation: 'Read conversations',
header: {
shared: {
application: 'Tooted with {{application}}'
},
conversation: {
withAccounts: 'With',
delete: {
function: 'Delete direct message'
}
},
actions: {
account: {
heading: 'About user',
mute: {
function: 'Mute user',
button: 'Mute @{{acct}}'
},
block: {
function: 'Block user',
button: 'Block @{{acct}}'
},
reports: {
function: 'Report user',
button: 'Report @{{acct}}'
}
},
domain: {
heading: 'About instance',
block: {
function: 'Block instance',
button: 'Block instance {{domain}}'
},
alert: {
title: 'Confirm blocking {{domain}} ?',
message:
'Mostly you can mute or block certain user.\n\nAfter blocking instance, all its content including followers from this instance will be removed!',
buttons: {
confirm: 'Confirm blocking',
cancel: '$t(common:buttons.cancel)'
}
}
},
share: {
status: { heading: 'Share toot', button: 'Share link to this toot' },
account: { heading: 'Share user', button: 'Share link to this user' }
},
status: {
heading: 'About toot',
delete: {
function: 'Delete toot',
button: 'Delete this toot'
},
edit: {
function: 'Delete toot',
button: 'Delete and re-draft',
alert: {
title: 'Confirm deleting toot?',
message:
'Are you sure to delete and re-draft this toot? All boosts and favourites will be cleared, including all replies.',
buttons: {
confirm: 'Confirm deleting',
cancel: '$t(common:buttons.cancel)'
}
}
},
mute: {
function: 'Mute toot',
button: {
positive: 'Mute this toot and replies',
negative: 'Unmute this toot and replies'
}
},
pin: {
function: 'Pin',
button: {
positive: 'Pin this toot',
negative: 'Unpin this toot'
}
}
}
}
},
poll: {
meta: {
button: {
vote: 'Vote',
refresh: 'Refresh'
},
count: {
voters: '{{count}} user voted • ',
voters_plural: '{{count}} users voted • ',
votes: '{{count}} vote • ',
votes_plural: '{{count}} votes • '
},
expiration: {
expired: 'Vote expired',
until: 'Expires in <0 />'
}
}
}
}
}

20
src/i18n/en/screens.json Normal file
View File

@ -0,0 +1,20 @@
{
"network": {
"disconnected": {
"message": "Lost network connection",
"description": "Please check your phone's network setting"
}
},
"screenshot": {
"title": "Privacy Protection",
"message": "Please do not disclose other user's identity, such as username, avatar, etc. Thank you!",
"button": "Confirm"
},
"localCorrupt": {
"message": "Login expired, please login again"
},
"pushError": {
"message": "Push service error",
"description": "Please re-enable push notification in settings"
}
}

View File

@ -0,0 +1,19 @@
{
"content": {
"button": {
"apply": "$t(common:buttons.apply)",
"cancel": "$t(common:buttons.cancel)"
},
"notificationsFilter": {
"heading": "Show notification types",
"content": {
"follow": "$t(screenTabs:me.push.follow.heading)",
"favourite": "$t(screenTabs:me.push.favourite.heading)",
"reblog": "$t(screenTabs:me.push.reblog.heading)",
"mention": "$t(screenTabs:me.push.mention.heading)",
"poll": "$t(screenTabs:me.push.poll.heading)",
"follow_request": "Follow request"
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"heading": "Announcements",
"content": {
"published": "Published <0 />",
"button": {
"read": "Read",
"unread": "Mark as read"
}
}
}

View File

@ -0,0 +1,157 @@
{
"heading": {
"left": {
"button": "Cancel",
"alert": {
"title": "Cancel editing?",
"buttons": {
"save": "Save draft",
"delete": "Delete draft",
"cancel": "Cancel"
}
}
},
"right": {
"button": {
"default": "Toot",
"conversation": "Toot DM",
"reply": "Toot reply",
"edit": "Toot"
},
"alert": {
"default": {
"title": "Tooting failed",
"button": "Try again"
},
"removeReply": {
"title": "Replied toot could not be found",
"description": "Replied toot could have been deleted. Do you want to remove it from your reference?",
"cancel": "$t(common:buttons.cancel)",
"confirm": "Remove reference"
}
}
}
},
"content": {
"root": {
"header": {
"postingAs": "Tooting as @{{acct}}@{{domain}}",
"spoilerInput": {
"placeholder": "Spoiler warning message"
},
"textInput": {
"placeholder": "What's on your mind"
}
},
"footer": {
"attachments": {
"sensitive": "Mark attachments as sensitive"
},
"poll": {
"option": {
"placeholder": {
"single": "Single choice",
"multiple": "Multiple choice"
}
},
"multiple": {
"heading": "Choice type",
"options": {
"single": "Single choice",
"multiple": "Multiple choice",
"cancel": "$t(common:buttons.cancel)"
}
},
"expiration": {
"heading": "Validity",
"options": {
"300": "5 minutes",
"1800": "30 minutes",
"3600": "1 hour",
"21600": "6 hours",
"86400": "1 day",
"259200": "3 days",
"604800": "7 days",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"actions": {
"attachment": {
"actions": {
"options": {
"library": "Upload from photo library",
"photo": "Upload with camera",
"cancel": "$t(common:buttons.cancel)"
},
"library": {
"alert": {
"title": "No permission",
"message": "Require photo library read permission to upload",
"buttons": {
"settings": "Update setting",
"cancel": "Cancel"
}
}
},
"photo": {
"alert": {
"title": "No permission",
"message": "Require camera usage permission to upload",
"buttons": {
"settings": "Update setting",
"cancel": "Cancel"
}
}
}
},
"failed": {
"alert": {
"title": "Upload failed",
"button": "Try again"
}
}
},
"visibility": {
"title": "Toot visibility",
"options": {
"public": "Public",
"unlisted": "Unlisted",
"private": "Followers only",
"direct": "Direct message",
"cancel": "$t(common:buttons.cancel)"
}
}
},
"drafts": "Draft ({{count}})",
"drafts_plural": "Drafts ({{count}})"
},
"editAttachment": {
"header": {
"title": "Edit attachment",
"right": {
"failed": {
"title": "Editing failed",
"button": "Try again"
}
}
},
"content": {
"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": {
"header": {
"title": "Draft"
},
"content": {
"textEmpty": "Content empty"
}
}
}
}

View File

@ -0,0 +1,13 @@
{
"content": {
"options": {
"save": "Save image",
"share": "Share iamge",
"cancel": "$t(common:buttons.cancel)"
},
"save": {
"function": "Saving image",
"success": "Image saved"
}
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: 'Following'
}

View File

@ -1,4 +0,0 @@
export default {
heading: 'Bookmarks',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: 'Direct Messages',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: 'Favourites',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: 'Lists',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: 'List: {{list}}',
content: {}
}

View File

@ -1,31 +0,0 @@
export default {
content: {
collections: {
conversations: '$t(meConversations:heading)',
bookmarks: '$t(meBookmarks:heading)',
favourites: '$t(meFavourites:heading)',
lists: '$t(meLists:heading)',
announcements: {
heading: '$t(sharedAnnouncements:heading)',
content: {
unread: '{{amount}} unread',
read: 'All read',
empty: 'None'
}
}
},
accountSettings: 'Account Settings',
appSettings: '$t(meSettings:heading)',
logout: {
button: 'Log out',
alert: {
title: 'Logging out?',
message: 'After logging out, you need to log in again',
buttons: {
logout: 'Logout',
cancel: '$t(common:buttons.cancel)'
}
}
}
}
}

View File

@ -1,65 +0,0 @@
export default {
heading: 'Settings',
content: {
push: {
heading: '$t(meSettingsPush:heading)',
content: {
enabled: 'Enabled',
disabled: 'Disabled'
}
},
fontsize: {
heading: '$t(meSettingsFontsize:heading)',
content: {
S: '$t(meSettingsFontsize:content.sizes.S)',
M: '$t(meSettingsFontsize:content.sizes.M)',
L: '$t(meSettingsFontsize:content.sizes.L)',
XL: '$t(meSettingsFontsize:content.sizes.XL)',
XXL: '$t(meSettingsFontsize:content.sizes.XXL)'
}
},
language: {
heading: 'Language',
options: {
en: 'English',
'zh-Hans': '简体中文',
cancel: '$t(common:buttons.cancel)'
}
},
theme: {
heading: 'Appearance',
options: {
auto: 'As system',
light: 'Light mode',
dark: 'Dark mode',
cancel: '$t(common:buttons.cancel)'
}
},
browser: {
heading: 'Opening link',
options: {
internal: 'Inside app',
external: 'Use system browser',
cancel: '$t(common:buttons.cancel)'
}
},
cache: {
heading: 'Clear cache',
empty: 'Cache empty'
},
support: {
heading: 'Support tooot'
},
review: {
heading: 'Review tooot'
},
contact: {
heading: 'Contact tooot'
},
analytics: {
heading: 'Help us improve',
description: 'Collecting only non-user relative usage'
},
version: 'Version v{{version}}'
}
}

View File

@ -1,10 +0,0 @@
export default {
heading: 'Toot Font Size',
content: {
showcase: 'Example toot',
demo:
'<p>This is a demo toot😊. You can choose from several options from below.<br /><br />This setting only affects the main content of toots, but not other font sizes.</p>',
availableSizes: 'Available sizes',
sizes: { S: 'S', M: 'M - Default', L: 'L', XL: 'XL', XXL: 'XXL' }
}
}

View File

@ -1,41 +0,0 @@
export default {
heading: 'Push Notification',
content: {
enable: {
direct: 'Enable push notification',
settings: 'Enable in settings'
},
global: {
heading: 'Enable push notification',
description: "Messages are routed through tooot's server"
},
decode: {
heading: 'Show message details',
description:
"Messages routed through tooot's server are encrypted, but you can choose to decode the message on the server. Our server source code is open source, and no log policy."
},
default: {
heading: 'Default' // Android notification channel name only
},
follow: {
heading: 'New follower'
},
favourite: {
heading: 'Favourited'
},
reblog: {
heading: 'Boosted'
},
mention: {
heading: 'Mentioned you'
},
poll: {
heading: 'Poll updates'
},
howitworks: 'Learn how routing works'
},
error: {
message: 'Push service error',
description: 'Please re-enable push notification in settings'
}
}

View File

@ -1,7 +0,0 @@
export default {
heading: 'Switch Account',
content: {
existing: 'Choose from logged in',
new: 'Log in to instance'
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: 'Notifications'
}

View File

@ -1,8 +0,0 @@
export default {
heading: {
segments: {
left: 'Federated',
right: 'Local'
}
}
}

View File

@ -1,19 +0,0 @@
export default {
content: {
button: {
apply: '$t(common:buttons.apply)',
cancel: '$t(common:buttons.cancel)'
},
notificationsFilter: {
heading: 'Show notification types',
content: {
follow: '$t(meSettingsPush:content.follow.heading)',
favourite: '$t(meSettingsPush:content.favourite.heading)',
reblog: '$t(meSettingsPush:content.reblog.heading)',
mention: '$t(meSettingsPush:content.mention.heading)',
poll: '$t(meSettingsPush:content.poll.heading)',
follow_request: 'Follow request'
}
}
}
}

View File

@ -1,13 +0,0 @@
export default {
content: {
options: {
save: 'Save image',
share: 'Share iamge',
cancel: '$t(common:buttons.cancel)'
},
save: {
function: 'Saving image',
success: 'Image saved'
}
}
}

View File

@ -1,11 +0,0 @@
export default {
content: {
moved: 'User moved',
created_at: 'Registered: {{date}}',
summary: {
statuses_count: '{{count}} toots',
following_count: '$t(sharedUsers:heading.accounts.following)',
followers_count: '$t(sharedUsers:heading.accounts.followers)'
}
}
}

View File

@ -1,10 +0,0 @@
export default {
heading: 'Announcements',
content: {
published: 'Published <0 />',
button: {
read: 'Read',
unread: 'Mark read'
}
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: '<0 />\'s <1>media</1>'
}

View File

@ -1,159 +0,0 @@
export default {
heading: {
left: {
button: 'Cancel',
alert: {
title: 'Cancel editing?',
buttons: {
save: 'Save draft',
delete: 'Delete draft',
cancel: 'Cancel'
}
}
},
right: {
button: {
default: 'Toot',
conversation: 'Toot DM',
reply: 'Toot reply',
edit: 'Toot'
},
alert: {
default: {
title: 'Tooting failed',
button: 'Try again'
},
removeReply: {
title: 'Replied toot could not be found',
description:
'Replied toot could have been deleted. Do you want to remove it from your reference?',
cancel: '$t(common:buttons.cancel)',
confirm: 'Remove reference'
}
}
}
},
content: {
root: {
header: {
postingAs: 'Tooting as @{{acct}}@{{domain}}',
spoilerInput: {
placeholder: 'Spoiler warning message'
},
textInput: {
placeholder: "What's on your mind"
}
},
footer: {
attachments: {
sensitive: 'Mark attachments as sensitive'
},
poll: {
option: {
placeholder: {
single: 'Single choice',
multiple: 'Multiple choice'
}
},
multiple: {
heading: 'Choice type',
options: {
single: 'Single choice',
multiple: 'Multiple choice',
cancel: '$t(common:buttons.cancel)'
}
},
expiration: {
heading: 'Validity',
options: {
'300': '5 minutes',
'1800': '30 minutes',
'3600': '1 hour',
'21600': '6 hours',
'86400': '1 day',
'259200': '3 days',
'604800': '7 days',
cancel: '$t(common:buttons.cancel)'
}
}
}
},
actions: {
attachment: {
actions: {
options: {
library: 'Upload from photo library',
photo: 'Upload with camera',
cancel: '$t(common:buttons.cancel)'
},
library: {
alert: {
title: 'No permission',
message: 'Require photo library read permission to upload',
buttons: {
settings: 'Update setting',
cancel: 'Cancel'
}
}
},
photo: {
alert: {
title: 'No permission',
message: 'Require camera usage permission to upload',
buttons: {
settings: 'Update setting',
cancel: 'Cancel'
}
}
}
},
failed: {
alert: {
title: 'Upload failed',
button: 'Try again'
}
}
},
visibility: {
title: 'Toot visibility',
options: {
public: 'Public',
unlisted: 'Unlisted',
private: 'Followers only',
direct: 'Direct message',
cancel: '$t(common:buttons.cancel)'
}
}
},
drafts: 'Draft ({{count}})',
drafts_plural: 'Drafts ({{count}})'
},
editAttachment: {
header: {
title: 'Edit attachment',
right: {
failed: {
title: 'Editing failed',
button: 'Try again'
}
}
},
content: {
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: {
header: {
title: 'Draft'
},
content: {
textEmpty: 'Content empty'
}
}
}
}

View File

@ -1,31 +0,0 @@
export default {
content: {
header: {
prefix: 'Search',
placeholder: 'for...'
},
empty: {
general:
'Enter keyword to search for <bold>$t(sharedSearch:content.sections.accounts)</bold>、<bold>$t(sharedSearch:content.sections.hashtags)</bold> or <bold>$t(sharedSearch:content.sections.statuses)</bold>',
advanced: {
header: 'Advanced search',
example: {
account:
'$t(sharedSearch:content.header.prefix)$t(sharedSearch:content.sections.accounts)',
hashtag:
'$t(sharedSearch:content.header.prefix)$t(sharedSearch:content.sections.hashtags)',
statusLink:
'$t(sharedSearch:content.header.prefix)$t(sharedSearch:content.sections.statuses)',
accountLink:
'$t(sharedSearch:content.header.prefix)$t(sharedSearch:content.sections.accounts)'
}
}
},
sections: {
accounts: 'User',
hashtags: 'Hashtag',
statuses: 'Toot'
},
notFound: 'Cannot find <bold>{{searchTerm}}</bold> related {{type}}'
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: 'Discussions'
}

View File

@ -1,12 +0,0 @@
export default {
heading: {
accounts: {
following: 'Following {{count}}',
followers: '{{count}} followers'
},
statuses: {
reblogged_by: '{{count}} boosted',
favourited_by: '{{count}} favourited'
}
}
}

View File

@ -0,0 +1,227 @@
{
"tabs": {
"local": {
"name": "Following"
},
"public": {
"name": "",
"segments": {
"left": "Federated",
"right": "Local"
}
},
"notifications": {
"name": "Notifications"
},
"me": {
"name": "About me"
}
},
"me": {
"stacks": {
"bookmarks": {
"name": "Bookmarks"
},
"conversations": {
"name": "Direct Messages"
},
"favourites": {
"name": "Favourites"
},
"fontSize": {
"name": "Toot Font Size"
},
"lists": {
"name": "Lists"
},
"list": {
"name": "List: {{list}}"
},
"push": {
"name": "Push Notification"
},
"settings": {
"name": "Settings"
},
"switch": {
"name": "Switch Account"
}
},
"fontSize": {
"showcase": "Example toot",
"demo": "<p>This is a demo toot😊. You can choose from several options from below.<br /><br />This setting only affects the main content of toots, but not other font sizes.</p>",
"availableSizes": "Available sizes",
"sizes": {
"S": "S",
"M": "M - Default",
"L": "L",
"XL": "XL",
"XXL": "XXL"
}
},
"push": {
"enable": {
"direct": "Enable push notification",
"settings": "Enable in settings"
},
"global": {
"heading": "Enable push notification",
"description": "Messages are routed through tooot's server"
},
"decode": {
"heading": "Show message details",
"description": "Messages routed through tooot's server are encrypted, but you can choose to decode the message on the server. Our server source code is open source, and no log policy."
},
"default": {
"heading": "Default"
},
"follow": {
"heading": "New follower"
},
"favourite": {
"heading": "Favourited"
},
"reblog": {
"heading": "Boosted"
},
"mention": {
"heading": "Mentioned you"
},
"poll": {
"heading": "Poll updates"
},
"howitworks": "Learn how routing works"
},
"root": {
"announcements": {
"content": {
"unread": "{{amount}} unread",
"read": "All read",
"empty": "None"
}
},
"logout": {
"button": "Log out",
"alert": {
"title": "Logging out?",
"message": "After logging out, you need to log in again",
"buttons": {
"logout": "Logout",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"settings": {
"push": {
"heading": "$t(me.stacks.push.name)",
"content": {
"enabled": "Enabled",
"disabled": "Disabled"
}
},
"fontsize": {
"heading": "$t(me.stacks.fontSize.name)",
"content": {
"S": "$t(me.fontSize.sizes.S)",
"M": "$t(me.fontSize.sizes.M)",
"L": "$t(me.fontSize.sizes.L)",
"XL": "$t(me.fontSize.sizes.XL)",
"XXL": "$t(me.fontSize.sizes.XXL)"
}
},
"language": {
"heading": "Language",
"options": {
"cancel": "$t(common:buttons.cancel)"
}
},
"theme": {
"heading": "Appearance",
"options": {
"auto": "As system",
"light": "Light mode",
"dark": "Dark mode",
"cancel": "$t(common:buttons.cancel)"
}
},
"browser": {
"heading": "Opening link",
"options": {
"internal": "Inside app",
"external": "Use system browser",
"cancel": "$t(common:buttons.cancel)"
}
},
"support": {
"heading": "Support tooot"
},
"review": {
"heading": "Review tooot"
},
"contact": {
"heading": "Contact tooot"
},
"analytics": {
"heading": "Help us improve",
"description": "Collecting only non-user relative usage"
},
"version": "Version v{{version}}"
},
"switch": {
"existing": "Choose from logged in",
"new": "Log in to instance"
}
},
"shared": {
"account": {
"moved": "User moved",
"created_at": "Registered on: {{date}}",
"summary": {
"statuses_count": "{{count}} toots",
"following_count": "$t(shared.users.accounts.following)",
"followers_count": "$t(shared.users.accounts.followers)"
}
},
"attachments": {
"name": "<0 /><1>\"s media</1>"
},
"search": {
"header": {
"prefix": "Searching",
"placeholder": "for..."
},
"empty": {
"general": "Enter keyword to search for <bold>$t(screenTabs:shared.search.sections.accounts)</bold>、<bold>$t(screenTabs:shared.search.sections.hashtags)</bold> or <bold>$t(screenTabs:shared.search.sections.statuses)</bold>",
"advanced": {
"header": "Advanced search",
"example": {
"account": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)",
"hashtag": "$t(shared.search.header.prefix) $t(shared.search.sections.hashtags)",
"statusLink": "$t(shared.search.header.prefix) $t(shared.search.sections.statuses)",
"accountLink": "$t(shared.search.header.prefix) $t(shared.search.sections.accounts)"
}
}
},
"sections": {
"accounts": "User",
"hashtags": "Hashtag",
"statuses": "Toot"
},
"notFound": "Cannot find <bold>{{searchTerm}}</bold> related {{type}}"
},
"toot": {
"name": "Discussions"
},
"users": {
"accounts": {
"following": "Following {{count}}",
"followers": "{{count}} followers"
},
"statuses": {
"reblogged_by": "{{count}} boosted",
"favourited_by": "{{count}} favourited"
}
}
}
}

6
src/i18n/locales.ts Normal file
View File

@ -0,0 +1,6 @@
const LOCALES = {
en: 'English',
'zh-Hans': '简体中文'
} as {en: string}
export { LOCALES }

View File

@ -1,37 +1,16 @@
export default {
common: require('./common').default,
common: require('./common'),
local: require('./screens/local').default,
screens: require('./screens'),
screenActions: require('./screens/actions'),
screenAnnouncements: require('./screens/announcements'),
screenCompose: require('./screens/compose'),
screenImageViewer: require('./screens/imageViewer'),
screenTabs: require('./screens/tabs'),
public: require('./screens/public').default,
notifications: require('./screens/notifications').default,
meRoot: require('./screens/meRoot').default,
meConversations: require('./screens/meConversations').default,
meBookmarks: require('./screens/meBookmarks').default,
meFavourites: require('./screens/meFavourites').default,
meLists: require('./screens/meLists').default,
meListsList: require('./screens/meListsList').default,
meSettings: require('./screens/meSettings').default,
meSettingsFontsize: require('./screens/meSettingsFontsize').default,
meSettingsPush: require('./screens/meSettingsPush').default,
meSwitch: require('./screens/meSwitch').default,
sharedAccount: require('./screens/sharedAccount').default,
sharedAnnouncements: require('./screens/sharedAnnouncements').default,
sharedAttachments: require('./screens/sharedAttachments').default,
sharedCompose: require('./screens/sharedCompose').default,
sharedSearch: require('./screens/sharedSearch').default,
sharedToot: require('./screens/sharedToot').default,
sharedUsers: require('./screens/sharedUsers').default,
componentInstance: require('./components/instance').default,
componentParse: require('./components/parse').default,
componentRelationship: require('./components/relationship').default,
componentRelativeTime: require('./components/relativeTime').default,
componentTimeline: require('./components/timeline').default,
screenActions: require('./screens/screenActions').default,
screenImageViewer: require('./screens/screenImageViewer').default
componentInstance: require('./components/instance'),
componentParse: require('./components/parse'),
componentRelationship: require('./components/relationship'),
componentRelativeTime: require('./components/relativeTime'),
componentTimeline: require('./components/timeline')
}

View File

@ -0,0 +1,18 @@
{
"buttons": {
"apply": "应用",
"cancel": "取消"
},
"message": {
"success": {
"message": "{{function}}成功"
},
"warning": {
"message": ""
},
"error": {
"message": "{{function}}失败,请重试"
}
},
"separator": ""
}

View File

@ -1,32 +0,0 @@
export default {
network: {
disconnected: {
message: '无法连接到网络',
description: '请检查手机设置里的网络连接'
}
},
screenshot: {
title: '隐私保护',
message: '请确保不要泄露其它用户的敏感信息,例如用户名、头像等,谢谢!',
button: '好的'
},
index: {
localCorrupt: '登录已过期,请重新登录'
},
buttons: {
apply: '应用',
cancel: '取消'
},
toastMessage: {
success: {
message: '{{function}}成功'
},
warning: {
message: ''
},
error: {
message: '{{function}}失败,请重试'
}
},
separator: ''
}

View File

@ -0,0 +1,28 @@
{
"server": {
"textInput": {
"placeholder": "输入社区服务器地址"
},
"button": "登录",
"information": {
"name": "社区名称",
"accounts": "用户总数",
"statuses": "嘟文总数",
"domains": "连结总数"
},
"disclaimer": {
"base": "登录过程将使用系统浏览器你的账号登录信息tooot应用无法读取。详见 ",
"privacy": "隐私条款"
}
},
"update": {
"alert": {
"title": "此社区已登录",
"message": "你可以登录同个社区的另一个账号,不影响已登录的账号",
"buttons": {
"cancel": "$t(common:buttons.cancel)",
"continue": "继续"
}
}
}
}

View File

@ -1,30 +0,0 @@
export default {
server: {
textInput: { placeholder: '输入社区服务器地址' },
privateInstance: '非公开社区, 不能围观',
EULA: { base: '我阅读并同意 ', EULA: '最终用户条款' },
button: '登录',
information: {
name: '社区名称',
description: { heading: '社区简介', expandHint: '简介' },
accounts: '用户总数',
statuses: '嘟文总数',
domains: '连结总数'
},
disclaimer: {
base:
'登录过程将使用系统浏览器你的账号登录信息tooot应用无法读取。详见 ',
privacy: '隐私条款'
}
},
update: {
alert: {
title: '此社区已登录',
message: '你可以登录同个社区的另一个账号,不影响已登录的账号',
buttons: {
cancel: '$t(common:buttons.cancel)',
continue: '继续'
}
}
}
}

View File

@ -0,0 +1,9 @@
{
"HTML": {
"expanded": {
"true": "折叠{{hint}}",
"false": "展开{{hint}}"
},
"defaultHint": "全文"
}
}

View File

@ -1,9 +0,0 @@
export default {
HTML: {
expanded: {
true: '折叠{{hint}}',
false: '展开{{hint}}'
},
defaultHint: '全文'
}
}

View File

@ -0,0 +1,16 @@
{
"follow": {
"function": "关注"
},
"block": {
"function": "屏蔽"
},
"button": {
"error": "读取错误",
"blocked_by": "被用户屏蔽",
"blocking": "取消屏蔽",
"following": "取消关注",
"requested": "取消关注请求",
"default": "关注"
}
}

View File

@ -1,16 +0,0 @@
export default {
follow: {
function: '关注'
},
block: {
function: '屏蔽'
},
button: {
error: '读取错误',
blocked_by: '被用户屏蔽',
blocking: '取消屏蔽',
following: '取消关注',
requested: '取消关注请求',
default: '关注'
}
}

View File

@ -0,0 +1,20 @@
{
"strings": {
"prefixAgo": "",
"prefixFromNow": "",
"suffixAgo": "前",
"suffixFromNow": "",
"seconds": "%d秒",
"minute": "1分钟",
"minutes": "%d分钟",
"hour": "1小时",
"hours": "%d小时",
"day": "1天",
"days": "%d天",
"month": "1个月",
"months": "%d月",
"year": "大约1年",
"years": "%d年",
"wordSeparator": ""
}
}

View File

@ -1,20 +0,0 @@
export default {
strings: {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: '前',
suffixFromNow: '后',
seconds: '%d秒',
minute: '1分钟',
minutes: '%d分钟',
hour: '1小时',
hours: '%d小时',
day: '1天',
days: '%d天',
month: '1个月',
months: '%d月',
year: '大约1年',
years: '%d年',
wordSeparator: ''
}
}

View File

@ -0,0 +1,164 @@
{
"empty": {
"error": {
"message": "加载错误",
"button": "重试"
},
"success": {
"message": "空无一物"
}
},
"end": {
"message": "居然刷到底了,喝杯 <0 /> 吧"
},
"refresh": {
"fetchPreviousPage": "较新于此的嘟嘟",
"refetch": "最新的嘟嘟"
},
"shared": {
"actioned": {
"pinned": "置顶",
"favourite": "{{name}} 喜欢了你的嘟文",
"status": "{{name}} 刚刚发嘟",
"follow": "{{name}} 开始关注你",
"follow_request": "{{name}} 请求关注你",
"poll": "你参与的投票已结束",
"reblog": {
"default": "{{name}} 转嘟了",
"notification": "{{name}} 转嘟了你的嘟文"
}
},
"actions": {
"favourited": {
"function": "喜欢嘟文"
},
"reblogged": {
"function": "转嘟"
},
"bookmarked": {
"function": "喜欢嘟文"
}
},
"actionsUsers": {
"reblogged_by": "$t(screenTabs:shared.users.statuses.reblogged_by)",
"favourited_by": "$t(screenTabs:shared.users.statuses.favourited_by)"
},
"attachment": {
"sensitive": {
"button": "显示敏感内容"
},
"unsupported": {
"text": "附件读取错误",
"button": "尝试远程链接"
}
},
"content": {
"expandHint": "隐藏内容"
},
"fullConversation": "阅读全部对话",
"header": {
"shared": {
"application": "发自于 {{application}}"
},
"conversation": {
"withAccounts": "与",
"delete": {
"function": "删除私信"
}
},
"actions": {
"account": {
"heading": "关于用户",
"mute": {
"function": "隐藏 @{{acct}} 的嘟文",
"button": "隐藏 @{{acct}} 的嘟文"
},
"block": {
"function": "屏蔽 @{{acct}}",
"button": "屏蔽 @{{acct}}"
},
"reports": {
"function": "举报 @{{acct}}",
"button": "举报 @{{acct}}"
}
},
"domain": {
"heading": "关于社区",
"block": {
"function": "屏蔽社区",
"button": "屏蔽社区 {{domain}}"
},
"alert": {
"title": "确定要屏蔽 {{domain}} 吗?",
"message": "多数情况下,隐藏或屏蔽特定用户即可。\n\n屏蔽之后来自此社区的所有内容将不再出现在你的时间轴里。同时来自该社区的关注者将被移除。请谨慎使用。",
"buttons": {
"confirm": "确定屏蔽整个社区",
"cancel": "$t(common:buttons.cancel)"
}
}
},
"share": {
"status": {
"heading": "分享嘟文",
"button": "分享此条嘟文的链接"
},
"account": {
"heading": "分享用户",
"button": "分享此用户的链接"
}
},
"status": {
"heading": "关于嘟文",
"delete": {
"function": "删除",
"button": "删除此条嘟文"
},
"edit": {
"function": "删除",
"button": "删除并重新编辑此条嘟文",
"alert": {
"title": "确认删除嘟文?",
"message": "确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将会失去关联。",
"buttons": {
"confirm": "删除并重新编辑",
"cancel": "$t(common:buttons.cancel)"
}
}
},
"mute": {
"function": "静音",
"button": {
"positive": "静音此条嘟文及对话",
"negative": "取消静音此条嘟文及对话"
}
},
"pin": {
"function": "置顶",
"button": {
"positive": "置顶此条嘟文",
"negative": "取消置顶此条嘟文"
}
}
}
}
},
"poll": {
"meta": {
"button": {
"vote": "投票",
"refresh": "刷新"
},
"count": {
"voters": "已投{{count}}人",
"voters_plural": "已投{{count}}人",
"votes": "{{count}}票",
"votes_plural": "{{count}}票"
},
"expiration": {
"expired": "投票已结束",
"until": "<0 />截止"
}
}
}
}
}

View File

@ -1,158 +0,0 @@
export default {
empty: {
error: {
message: '加载错误',
button: '重试'
},
success: {
message: '空无一物'
}
},
end: {
message: '居然刷到底了,喝杯 <0 /> 吧'
},
refresh: {
fetchPreviousPage: '较新于此的嘟嘟',
refetch: '最新的嘟嘟'
},
shared: {
actioned: {
pinned: '置顶',
favourite: '{{name}} 喜欢了你的嘟文',
status: '{{name}} 刚刚发嘟',
follow: '{{name}} 开始关注你',
follow_request: '{{name}} 请求关注你',
poll: '你参与的投票已结束',
reblog: {
default: '{{name}} 转嘟了',
notification: '{{name}} 转嘟了你的嘟文'
}
},
actions: {
favourited: {
function: '喜欢嘟文'
},
reblogged: {
function: '转嘟'
},
bookmarked: {
function: '喜欢嘟文'
}
},
actionsUsers: {
reblogged_by: '$t(sharedUsers:heading.statuses.reblogged_by)',
favourited_by: '$t(sharedUsers:heading.statuses.favourited_by)'
},
attachment: {
sensitive: {
button: '显示敏感内容'
},
unsupported: {
text: '附件读取错误',
button: '尝试远程链接'
}
},
content: {
expandHint: '隐藏内容'
},
fullConversation: '阅读全部对话',
header: {
shared: {
application: '发自于 {{application}}'
},
conversation: {
withAccounts: '与',
delete: {
function: '删除私信'
}
},
actions: {
account: {
heading: '关于用户',
mute: {
function: '隐藏 @{{acct}} 的嘟文',
button: '隐藏 @{{acct}} 的嘟文'
},
block: {
function: '屏蔽 @{{acct}}',
button: '屏蔽 @{{acct}}'
},
reports: {
function: '举报 @{{acct}}',
button: '举报 @{{acct}}'
}
},
domain: {
heading: '关于社区',
block: {
function: '屏蔽社区',
button: '屏蔽社区 {{domain}}'
},
alert: {
title: '确定要屏蔽 {{domain}} 吗?',
message:
'多数情况下,隐藏或屏蔽特定用户即可。\n\n屏蔽之后来自此社区的所有内容将不再出现在你的时间轴里。同时来自该社区的关注者将被移除。请谨慎使用。',
buttons: {
confirm: '确定屏蔽整个社区',
cancel: '$t(common:buttons.cancel)'
}
}
},
share: {
status: { heading: '分享嘟文', button: '分享此条嘟文的链接' },
account: { heading: '分享用户', button: '分享此用户的链接' }
},
status: {
heading: '关于嘟文',
delete: {
function: '删除',
button: '删除此条嘟文'
},
edit: {
function: '删除',
button: '删除并重新编辑此条嘟文',
alert: {
title: '确认删除嘟文?',
message:
'确定要删除这条嘟文并重新编辑它吗?所有相关的转嘟和喜欢都会被清除,回复将会失去关联。',
buttons: {
confirm: '删除并重新编辑',
cancel: '$t(common:buttons.cancel)'
}
}
},
mute: {
function: '静音',
button: {
positive: '静音此条嘟文及对话',
negative: '取消静音此条嘟文及对话'
}
},
pin: {
function: '置顶',
button: {
positive: '置顶此条嘟文',
negative: '取消置顶此条嘟文'
}
}
}
}
},
poll: {
meta: {
button: {
vote: '投票',
refresh: '刷新'
},
count: {
voters: '已投{{count}}人 • ',
votes: '已投{{count}}票 • '
},
expiration: {
expired: '投票已结束',
until: '<0 />截止'
}
}
}
}
}

View File

@ -0,0 +1,20 @@
{
"network": {
"disconnected": {
"message": "无法连接到网络",
"description": "请检查手机设置里的网络连接"
}
},
"screenshot": {
"title": "隐私保护",
"message": "请确保不要泄露其它用户的敏感信息,例如用户名、头像等,谢谢!",
"button": "确认"
},
"localCorrupt": {
"message": "登录已过期,请重新登录"
},
"pushError": {
"message": "推送服务错误",
"description": "请在设置中重新尝试启用推送通知"
}
}

View File

@ -0,0 +1,19 @@
{
"content": {
"button": {
"apply": "$t(common:buttons.apply)",
"cancel": "$t(common:buttons.cancel)"
},
"notificationsFilter": {
"heading": "显示通知",
"content": {
"follow": "$t(screenTabs:me.push.follow.heading)",
"favourite": "$t(screenTabs:me.push.favourite.heading)",
"reblog": "$t(screenTabs:me.push.reblog.heading)",
"mention": "$t(screenTabs:me.push.mention.heading)",
"poll": "$t(screenTabs:me.push.poll.heading)",
"follow_request": "关注请求"
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"heading": "公告",
"content": {
"published": "发布于 <0 />",
"button": {
"read": "已读",
"unread": "标记为已读"
}
}
}

View File

@ -0,0 +1,157 @@
{
"heading": {
"left": {
"button": "退出编辑",
"alert": {
"title": "确认退出编辑?",
"buttons": {
"save": "保存草稿",
"delete": "删除草稿",
"cancel": "继续编辑"
}
}
},
"right": {
"button": {
"default": "发嘟嘟",
"conversation": "发私信",
"reply": "发布回复",
"edit": "发嘟嘟"
},
"alert": {
"default": {
"title": "发布失败",
"button": "返回重试"
},
"removeReply": {
"title": "回复的嘟文不存在",
"description": "回复的嘟文可能已被删除。确认移除回复嘟文的关联?",
"cancel": "$t(common:buttons.cancel)",
"confirm": "移除关联"
}
}
}
},
"content": {
"root": {
"header": {
"postingAs": "以 @{{acct}}@{{domain}} 发嘟",
"spoilerInput": {
"placeholder": "折叠部分的警告信息"
},
"textInput": {
"placeholder": "想说点什么呢"
}
},
"footer": {
"attachments": {
"sensitive": "标记附件为敏感内容"
},
"poll": {
"option": {
"placeholder": {
"single": "单选项",
"multiple": "多选项"
}
},
"multiple": {
"heading": "可选项",
"options": {
"single": "单选",
"multiple": "多选",
"cancel": "$t(common:buttons.cancel)"
}
},
"expiration": {
"heading": "有效期",
"options": {
"300": "5分钟",
"1800": "30分钟",
"3600": "1小时",
"21600": "6小时",
"86400": "1天",
"259200": "3天",
"604800": "7天",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"actions": {
"attachment": {
"actions": {
"options": {
"library": "从相册上传",
"photo": "拍摄上传",
"cancel": "$t(common:buttons.cancel)"
},
"library": {
"alert": {
"title": "无读取权限",
"message": "需要读取相册权限才能上传附件",
"buttons": {
"settings": "去更新设置",
"cancel": "取消上传"
}
}
},
"photo": {
"alert": {
"title": "无拍照权限",
"message": "需要使用相机权限才能上传附件",
"buttons": {
"settings": "去更新设置",
"cancel": "取消上传"
}
}
}
},
"failed": {
"alert": {
"title": "上传失败",
"button": "返回重试"
}
}
},
"visibility": {
"title": "嘟文可见范围",
"options": {
"public": "公开",
"unlisted": "不公开",
"private": "仅关注者",
"direct": "私信",
"cancel": "$t(common:buttons.cancel)"
}
}
},
"drafts": "草稿 ({{count}})",
"drafts_plural": "草稿 ({{count}})"
},
"editAttachment": {
"header": {
"title": "编辑附件",
"right": {
"failed": {
"title": "编辑失败",
"button": "返回重试"
}
}
},
"content": {
"altText": {
"heading": "为附件添加文字说明",
"placeholder": "你可以为附件添加文字说明,以便更多人可以查看他们(包括视力障碍或视力受损人士)。\n\n优质的描述应该简洁明了但要准确地描述照片中的内容以便用户理解其含义。"
},
"imageFocus": "在预览图上拖动圆圈,以选择缩略图的焦点"
}
},
"draftsList": {
"header": {
"title": "草稿"
},
"content": {
"textEmpty": "无正文内容"
}
}
}
}

View File

@ -0,0 +1,13 @@
{
"content": {
"options": {
"save": "保存图片",
"share": "分享图片",
"cancel": "$t(common:buttons.cancel)"
},
"save": {
"function": "保存图片",
"success": "图片保存成功"
}
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: '我的关注'
}

View File

@ -1,4 +0,0 @@
export default {
heading: '书签',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: '私信',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: '喜欢',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: '列表',
content: {}
}

View File

@ -1,4 +0,0 @@
export default {
heading: '列表:{{list}}',
content: {}
}

View File

@ -1,31 +0,0 @@
export default {
content: {
collections: {
conversations: '$t(meConversations:heading)',
bookmarks: '$t(meBookmarks:heading)',
favourites: '$t(meFavourites:heading)',
lists: '$t(meLists:heading)',
announcements: {
heading: '$t(sharedAnnouncements:heading)',
content: {
unread: '{{amount}} 条未读公告',
read: '无未读公告',
empty: '无公告'
}
}
},
accountSettings: '账户设置',
appSettings: '$t(meSettings:heading)',
logout: {
button: '退出当前账号',
alert: {
title: '确认退出登录?',
message: '退出登录后,需要重新认证账号',
buttons: {
logout: '退出登录',
cancel: '$t(common:buttons.cancel)'
}
}
}
}
}

View File

@ -1,65 +0,0 @@
export default {
heading: '设置',
content: {
push: {
heading: '$t(meSettingsPush:heading)',
content: {
enabled: '已开启',
disabled: '已关闭'
}
},
fontsize: {
heading: '$t(meSettingsFontsize:heading)',
content: {
S: '$t(meSettingsFontsize:content.sizes.S)',
M: '$t(meSettingsFontsize:content.sizes.M)',
L: '$t(meSettingsFontsize:content.sizes.L)',
XL: '$t(meSettingsFontsize:content.sizes.XL)',
XXL: '$t(meSettingsFontsize:content.sizes.XXL)'
}
},
language: {
heading: '切换语言',
options: {
en: 'English',
'zh-Hans': '简体中文',
cancel: '$t(common:buttons.cancel)'
}
},
theme: {
heading: '应用外观',
options: {
auto: '跟随系统',
light: '浅色模式',
dark: '深色模式',
cancel: '$t(common:buttons.cancel)'
}
},
browser: {
heading: '外部链接',
options: {
internal: '应用内打开',
external: '浏览器打开',
cancel: '$t(common:buttons.cancel)'
}
},
cache: {
heading: '清空缓存',
empty: '暂无缓存'
},
support: {
heading: '赞助 tooot 开发'
},
review: {
heading: '给 tooot 打分'
},
contact: {
heading: '联系 tooot'
},
analytics: {
heading: '帮助我们改进',
description: '收集不与用户相关联的使用信息'
},
version: '版本 v{{version}}'
}
}

View File

@ -1,10 +0,0 @@
export default {
heading: '嘟文字号',
content: {
showcase: '嘟文示例',
demo:
'<p>这是一条测试用的嘟文😊。以下是可供选择的字号,从小号至超大号。<br /><br />这个设置仅会调整嘟文的正文字号,不影响其它字号。</p>',
availableSizes: '可选字号',
sizes: { S: '小号', M: '默认', L: '大号', XL: '特大号', XXL: '超大号' }
}
}

View File

@ -1,41 +0,0 @@
export default {
heading: '推送通知',
content: {
enable: {
direct: '启用tooot推送通知',
settings: '去系统设置启用'
},
global: {
heading: '启用通知',
description: '通知消息将经由tooot服务器转发'
},
decode: {
heading: '显示通知内容',
description:
'经由tooot服务器中转的通知消息已被加密但可以允许tooot服务器解密并转发消息。tooot消息服务器源码开源且不留存任何日志。'
},
default: {
heading: '默认通知' // Android notification channel name only
},
follow: {
heading: '新关注者'
},
favourite: {
heading: '嘟文被喜欢'
},
reblog: {
heading: '嘟文被转嘟'
},
mention: {
heading: '嘟文提及你'
},
poll: {
heading: '投票更新'
},
howitworks: '了解通知消息转发如何工作'
},
error: {
message: '推送服务错误',
description: '请在设置中重新尝试启用推送通知'
}
}

View File

@ -1,7 +0,0 @@
export default {
heading: '切换账号',
content: {
existing: '选择已登录的账号',
new: '登录新社区'
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: '通知'
}

View File

@ -1,8 +0,0 @@
export default {
heading: {
segments: {
left: '跨站嘟嘟',
right: '本站嘟嘟'
}
}
}

View File

@ -1,19 +0,0 @@
export default {
content: {
button: {
apply: '$t(common:buttons.apply)',
cancel: '$t(common:buttons.cancel)'
},
notificationsFilter: {
heading: '显示通知',
content: {
follow: '$t(meSettingsPush:content.follow.heading)',
favourite: '$t(meSettingsPush:content.favourite.heading)',
reblog: '$t(meSettingsPush:content.reblog.heading)',
mention: '$t(meSettingsPush:content.mention.heading)',
poll: '$t(meSettingsPush:content.poll.heading)',
follow_request: '关注请求'
}
}
}
}

View File

@ -1,13 +0,0 @@
export default {
content: {
options: {
save: '保存图片',
share: '分享图片',
cancel: '$t(common:buttons.cancel)'
},
save: {
function: '保存图片',
success: '图片保存成功'
}
}
}

View File

@ -1,11 +0,0 @@
export default {
content: {
moved: '账户已迁移',
created_at: '注册时间:{{date}}',
summary: {
statuses_count: '{{count}} 条嘟文',
following_count: '$t(sharedUsers:heading.accounts.following)',
followers_count: '$t(sharedUsers:heading.accounts.followers)'
}
}
}

View File

@ -1,10 +0,0 @@
export default {
heading: '公告',
content: {
published: '发布于 <0 />',
button: {
read: '已读',
unread: '标记已读'
}
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: '<0 /> <1>的媒体</1>'
}

View File

@ -1,157 +0,0 @@
export default {
heading: {
left: {
button: '退出编辑',
alert: {
title: '确认退出编辑?',
buttons: {
save: '保存草稿',
delete: '删除草稿',
cancel: '继续编辑'
}
}
},
right: {
button: {
default: '发嘟嘟',
conversation: '发私信',
reply: '发布回复',
edit: '发嘟嘟'
},
alert: {
default: {
title: '发布失败',
button: '返回重试'
},
removeReply: {
title: '回复的嘟文不存在',
description: '回复的嘟文可能已被删除。确认移除回复嘟文的关联?',
cancel: '$t(common:buttons.cancel)',
confirm: '移除关联'
}
}
}
},
content: {
root: {
header: {
postingAs: '以 @{{acct}}@{{domain}} 发嘟',
spoilerInput: {
placeholder: '折叠部分的警告信息'
},
textInput: {
placeholder: '想说点什么呢'
}
},
footer: {
attachments: {
sensitive: '标记附件为敏感内容'
},
poll: {
option: {
placeholder: {
single: '单选项',
multiple: '多选项'
}
},
multiple: {
heading: '可选项',
options: {
single: '单选',
multiple: '多选',
cancel: '$t(common:buttons.cancel)'
}
},
expiration: {
heading: '有效期',
options: {
'300': '5分钟',
'1800': '30分钟',
'3600': '1小时',
'21600': '6小时',
'86400': '1天',
'259200': '3天',
'604800': '7天',
cancel: '$t(common:buttons.cancel)'
}
}
}
},
actions: {
attachment: {
actions: {
options: {
library: '从相册上传',
photo: '拍摄上传',
cancel: '$t(common:buttons.cancel)'
},
library: {
alert: {
title: '无读取权限',
message: '需要读取相册权限才能上传附件',
buttons: {
settings: '去更新设置',
cancel: '取消上传'
}
}
},
photo: {
alert: {
title: '无拍照权限',
message: '需要使用相机权限才能上传附件',
buttons: {
settings: '去更新设置',
cancel: '取消上传'
}
}
}
},
failed: {
alert: {
title: '上传失败',
button: '返回重试'
}
}
},
visibility: {
title: '嘟文可见范围',
options: {
public: '公开',
unlisted: '不公开',
private: '仅关注者',
direct: '私信',
cancel: '$t(common:buttons.cancel)'
}
}
},
drafts: '草稿 ({{count}})'
},
editAttachment: {
header: {
title: '编辑附件',
right: {
failed: {
title: '编辑失败',
button: '返回重试'
}
}
},
content: {
altText: {
heading: '为附件添加文字说明',
placeholder:
'你可以为附件添加文字说明,以便更多人可以查看他们(包括视力障碍或视力受损人士)。\n\n优质的描述应该简洁明了但要准确地描述照片中的内容以便用户理解其含义。'
},
imageFocus: '在预览图上拖动圆圈,以选择缩略图的焦点'
}
},
draftsList: {
header: {
title: '草稿'
},
content: {
textEmpty: '无正文内容'
}
}
}
}

View File

@ -1,31 +0,0 @@
export default {
content: {
header: {
prefix: '搜索',
placeholder: '什么呢'
},
empty: {
general:
'输入关键词搜索<bold>$t(sharedSearch:content.sections.accounts)</bold>、<bold>$t(sharedSearch:content.sections.hashtags)</bold>或者<bold>$t(sharedSearch:content.sections.statuses)</bold>',
advanced: {
header: '高级搜索格式',
example: {
account:
'$t(sharedSearch:content.header.prefix)$t(sharedSearch:content.sections.accounts)',
hashtag:
'$t(sharedSearch:content.header.prefix)$t(sharedSearch:content.sections.hashtags)',
statusLink:
'$t(sharedSearch:content.header.prefix)指定$t(sharedSearch:content.sections.statuses)',
accountLink:
'$t(sharedSearch:content.header.prefix)$t(sharedSearch:content.sections.accounts)'
}
}
},
sections: {
accounts: '用户',
hashtags: '话题标签',
statuses: '嘟文'
},
notFound: '找不到 <bold>{{searchTerm}}</bold> 相关的 {{type}}'
}
}

View File

@ -1,3 +0,0 @@
export default {
heading: '对话'
}

View File

@ -1,12 +0,0 @@
export default {
heading: {
accounts: {
following: '关注 {{count}} 人',
followers: '被 {{count}} 人关注'
},
statuses: {
reblogged_by: '{{count}} 人转嘟',
favourited_by: '{{count}} 人喜欢'
}
}
}

View File

@ -0,0 +1,227 @@
{
"tabs": {
"local": {
"name": "我的关注"
},
"public": {
"name": "",
"segments": {
"left": "跨站嘟嘟",
"right": "本站嘟嘟"
}
},
"notifications": {
"name": "通知"
},
"me": {
"name": "关于我"
}
},
"me": {
"stacks": {
"bookmarks": {
"name": "书签"
},
"conversations": {
"name": "私信"
},
"favourites": {
"name": "喜欢"
},
"fontSize": {
"name": "嘟文字号"
},
"lists": {
"name": "列表"
},
"list": {
"name": "列表:{{list}}"
},
"push": {
"name": "推送通知"
},
"settings": {
"name": "设置"
},
"switch": {
"name": "切换账号"
}
},
"fontSize": {
"showcase": "嘟文示例",
"demo": "<p>这是一条测试用的嘟文😊。以下是可供选择的字号,从小号至超大号。<br /><br />这个设置仅会调整嘟文的正文字号,不影响其它字号。</p>",
"availableSizes": "可选字号",
"sizes": {
"S": "小号",
"M": "默认",
"L": "大号",
"XL": "特大号",
"XXL": "超大号"
}
},
"push": {
"enable": {
"direct": "启用推送通知",
"settings": "在系统设置中启用"
},
"global": {
"heading": "启用tooot推送通知",
"description": "通知消息将经由tooot服务器转发"
},
"decode": {
"heading": "显示通知内容",
"description": "经由tooot服务器中转的通知消息已被加密但可以允许tooot服务器解密并转发消息。tooot消息服务器源码开源且不留存任何日志。"
},
"default": {
"heading": "默认通知"
},
"follow": {
"heading": "新关注者"
},
"favourite": {
"heading": "嘟文被喜欢"
},
"reblog": {
"heading": "嘟文被转嘟"
},
"mention": {
"heading": "嘟文提及你"
},
"poll": {
"heading": "投票更新"
},
"howitworks": "了解通知消息转发如何工作"
},
"root": {
"announcements": {
"content": {
"unread": "{{amount}}条未读公告",
"read": "无未读公告",
"empty": "无公告"
}
},
"logout": {
"button": "退出当前账号",
"alert": {
"title": "确认退出登录?",
"message": "退出登录后,需要重新认证账号",
"buttons": {
"logout": "退出登录",
"cancel": "$t(common:buttons.cancel)"
}
}
}
},
"settings": {
"push": {
"heading": "$t(me.stacks.push.name)",
"content": {
"enabled": "已启用",
"disabled": "已禁用"
}
},
"fontsize": {
"heading": "$t(me.stacks.fontSize.name)",
"content": {
"S": "$t(me.fontSize.sizes.S)",
"M": "$t(me.fontSize.sizes.M)",
"L": "$t(me.fontSize.sizes.L)",
"XL": "$t(me.fontSize.sizes.XL)",
"XXL": "$t(me.fontSize.sizes.XXL)"
}
},
"language": {
"heading": "切换语言",
"options": {
"cancel": "$t(common:buttons.cancel)"
}
},
"theme": {
"heading": "应用外观",
"options": {
"auto": "跟随系统",
"light": "浅色模式",
"dark": "深色模式",
"cancel": "$t(common:buttons.cancel)"
}
},
"browser": {
"heading": "外部链接",
"options": {
"internal": "应用内打开",
"external": "浏览器打开",
"cancel": "$t(common:buttons.cancel)"
}
},
"support": {
"heading": "赞助 tooot 开发"
},
"review": {
"heading": "给 tooot 打分"
},
"contact": {
"heading": "联系 tooot"
},
"analytics": {
"heading": "帮助我们改进",
"description": "收集不与用户相关联的使用信息"
},
"version": "版本 v{{version}}"
},
"switch": {
"existing": "选择已登录的账号",
"new": "登录新社区"
}
},
"shared": {
"account": {
"moved": "账户已迁移",
"created_at": "注册时间:{{date}}",
"summary": {
"statuses_count": "{{count}} 条嘟文",
"following_count": "$t(shared.users.accounts.following)",
"followers_count": "$t(shared.users.accounts.followers)"
}
},
"attachments": {
"name": "<0 /><1>的媒体</1>"
},
"search": {
"header": {
"prefix": "搜索",
"placeholder": "什么呢"
},
"empty": {
"general": "输入关键词搜索<bold>$t(screenTabs:shared.search.sections.accounts)</bold>、<bold>$t(screenTabs:shared.search.sections.hashtags)</bold>或者<bold>$t(screenTabs:shared.search.sections.statuses)</bold>",
"advanced": {
"header": "高级搜索格式",
"example": {
"account": "$t(shared.search.header.prefix)指定$t(shared.search.sections.accounts)",
"hashtag": "$t(shared.search.header.prefix)指定$t(shared.search.sections.hashtags)",
"statusLink": "$t(shared.search.header.prefix)指定$t(shared.search.sections.statuses)",
"accountLink": "$t(shared.search.header.prefix)指定$t(shared.search.sections.accounts)"
}
}
},
"sections": {
"accounts": "用户",
"hashtags": "话题标签",
"statuses": "嘟文"
},
"notFound": "找不到 <bold>{{searchTerm}}</bold> 相关的 {{type}}"
},
"toot": {
"name": "对话"
},
"users": {
"accounts": {
"following": "关注 {{count}} 人",
"followers": "被 {{count}} 人关注"
},
"statuses": {
"reblogged_by": "{{count}} 人转嘟",
"favourited_by": "{{count}} 人喜欢"
}
}
}
}

View File

@ -34,7 +34,7 @@ const ActionsAccount: React.FC<Props> = ({
displayMessage({
mode,
type: 'success',
message: t('common:toastMessage.success.message', {
message: t('common:message.success.message', {
function: t(
`shared.header.actions.account.${theParams.payload.property}.function`,
{
@ -49,7 +49,7 @@ const ActionsAccount: React.FC<Props> = ({
displayMessage({
mode,
type: 'error',
message: t('common:toastMessage.error.message', {
message: t('common:message.error.message', {
function: t(
`shared.header.actions.account.${theParams.payload.property}.function`
)

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