Try out clean Crowdin source strings

This commit is contained in:
Zhiyuan Zheng 2021-03-28 23:31:10 +02:00
parent 267832dd15
commit aab3d8d94d
No known key found for this signature in database
GPG Key ID: 078A93AB607D85E0
106 changed files with 462 additions and 1219 deletions

View File

Before

Width:  |  Height:  |  Size: 383 KiB

After

Width:  |  Height:  |  Size: 383 KiB

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

@ -35,7 +35,7 @@ export interface Props {
}
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()
@ -92,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,7 +131,7 @@ 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>

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

@ -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

@ -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'),
local: require('./screens/local'),
public: require('./screens/public'),
notifications: require('./screens/notifications'),
meRoot: require('./screens/meRoot'),
meConversations: require('./screens/meConversations'),
meBookmarks: require('./screens/meBookmarks'),
meFavourites: require('./screens/meFavourites'),
meLists: require('./screens/meLists'),
meListsList: require('./screens/meListsList'),
meSettings: require('./screens/meSettings'),
meSettingsFontsize: require('./screens/meSettingsFontsize'),
meSettingsPush: require('./screens/meSettingsPush'),
meSwitch: require('./screens/meSwitch'),
sharedAccount: require('./screens/sharedAccount'),
sharedAnnouncements: require('./screens/sharedAnnouncements'),
sharedAttachments: require('./screens/sharedAttachments'),
sharedCompose: require('./screens/sharedCompose'),
sharedSearch: require('./screens/sharedSearch'),
sharedToot: require('./screens/sharedToot'),
sharedUsers: require('./screens/sharedUsers'),
screens: require('./screens'),
screenActions: require('./screens/actions'),
screenAnnouncements: require('./screens/announcements'),
screenCompose: require('./screens/compose'),
screenImageViewer: require('./screens/imageViewer'),
screenTabs: require('./screens/tabs'),
componentInstance: require('./components/instance'),
componentParse: require('./components/parse'),
componentRelationship: require('./components/relationship'),
componentRelativeTime: require('./components/relativeTime'),
componentTimeline: require('./components/timeline'),
screenActions: require('./screens/screenActions'),
screenImageViewer: require('./screens/screenImageViewer')
componentTimeline: require('./components/timeline')
}

View File

@ -1,23 +1,9 @@
{
"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": {
"message": {
"success": {
"message": "{{function}} succeed"
},

View File

@ -1,9 +1,9 @@
{
"strings": {
"prefixAgo": null,
"prefixFromNow": null,
"prefixAgo": "",
"prefixFromNow": "",
"suffixAgo": "ago",
"suffixFromNow": null,
"suffixFromNow": "",
"seconds": "%d seconds",
"minute": "about a minute",
"minutes": "%d minutes",

View File

@ -149,10 +149,10 @@
"refresh": "Refresh"
},
"count": {
"voters": "{{count}} user voted",
"voters_plural": "{{count}} users voted",
"votes": "{{count}} vote",
"votes_plural": "{{count}} votes"
"voters": "{{count}} user voted",
"voters_plural": "{{count}} users voted",
"votes": "{{count}} vote",
"votes_plural": "{{count}} votes"
},
"expiration": {
"expired": "Vote expired",

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

@ -4,7 +4,7 @@
"published": "Published <0 />",
"button": {
"read": "Read",
"unread": "Mark read"
"unread": "Mark as read"
}
}
}

View File

@ -1,3 +0,0 @@
{
"heading": "Following"
}

View File

@ -1,3 +0,0 @@
{
"heading": "Bookmarks"
}

View File

@ -1,3 +0,0 @@
{
"heading": "Direct Messages"
}

View File

@ -1,3 +0,0 @@
{
"heading": "Favourites"
}

View File

@ -1,3 +0,0 @@
{
"heading": "Lists"
}

View File

@ -1,3 +0,0 @@
{
"heading": "List: {{list}}"
}

View File

@ -1,31 +0,0 @@
{
"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 @@
{
"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,15 +0,0 @@
{
"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,40 +0,0 @@
{
"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"
},
"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 @@
{
"heading": "Switch Account",
"content": {
"existing": "Choose from logged in",
"new": "Log in to instance"
}
}

View File

@ -1,3 +0,0 @@
{
"heading": "Notifications"
}

View File

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

View File

@ -1,11 +0,0 @@
{
"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,3 +0,0 @@
{
"heading": "<0 />\"s <1>media</1>"
}

View File

@ -1,26 +0,0 @@
{
"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 @@
{
"heading": "Discussions"
}

View File

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

View File

@ -0,0 +1,233 @@
{
"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": {
"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}}"
},
"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'),
local: require('./screens/local'),
public: require('./screens/public'),
notifications: require('./screens/notifications'),
meRoot: require('./screens/meRoot'),
meConversations: require('./screens/meConversations'),
meBookmarks: require('./screens/meBookmarks'),
meFavourites: require('./screens/meFavourites'),
meLists: require('./screens/meLists'),
meListsList: require('./screens/meListsList'),
meSettings: require('./screens/meSettings'),
meSettingsFontsize: require('./screens/meSettingsFontsize'),
meSettingsPush: require('./screens/meSettingsPush'),
meSwitch: require('./screens/meSwitch'),
sharedAccount: require('./screens/sharedAccount'),
sharedAnnouncements: require('./screens/sharedAnnouncements'),
sharedAttachments: require('./screens/sharedAttachments'),
sharedCompose: require('./screens/sharedCompose'),
sharedSearch: require('./screens/sharedSearch'),
sharedToot: require('./screens/sharedToot'),
sharedUsers: require('./screens/sharedUsers'),
screens: require('./screens'),
screenActions: require('./screens/actions'),
screenAnnouncements: require('./screens/announcements'),
screenCompose: require('./screens/compose'),
screenImageViewer: require('./screens/imageViewer'),
screenTabs: require('./screens/tabs'),
componentInstance: require('./components/instance'),
componentParse: require('./components/parse'),
componentRelationship: require('./components/relationship'),
componentRelativeTime: require('./components/relativeTime'),
componentTimeline: require('./components/timeline'),
screenActions: require('./screens/screenActions'),
screenImageViewer: require('./screens/screenImageViewer')
componentTimeline: require('./components/timeline')
}

View File

@ -1,32 +0,0 @@
{
"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

@ -1,28 +0,0 @@
{
"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,9 +0,0 @@
{
"HTML": {
"expanded": {
"true": "折叠{{hint}}",
"false": "展开{{hint}}"
},
"defaultHint": "全文"
}
}

View File

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

View File

@ -1,20 +0,0 @@
{
"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

@ -1,162 +0,0 @@
{
"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

@ -1,3 +0,0 @@
{
"heading": "我的关注"
}

View File

@ -1,4 +0,0 @@
{
"heading": "书签",
"content": {}
}

View File

@ -1,4 +0,0 @@
{
"heading": "私信",
"content": {}
}

View File

@ -1,4 +0,0 @@
{
"heading": "喜欢",
"content": {}
}

View File

@ -1,4 +0,0 @@
{
"heading": "列表",
"content": {}
}

View File

@ -1,4 +0,0 @@
{
"heading": "列表:{{list}}",
"content": {}
}

View File

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

View File

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

View File

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

View File

@ -1,3 +0,0 @@
{
"heading": "通知"
}

View File

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

View File

@ -1,19 +0,0 @@
{
"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 @@
{
"content": {
"options": {
"save": "保存图片",
"share": "分享图片",
"cancel": "$t(common:buttons.cancel)"
},
"save": {
"function": "保存图片",
"success": "图片保存成功"
}
}
}

View File

@ -1,11 +0,0 @@
{
"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 @@
{
"heading": "公告",
"content": {
"published": "发布于 <0 />",
"button": {
"read": "已读",
"unread": "标记已读"
}
}
}

View File

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

View File

@ -1,156 +0,0 @@
{
"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,26 +0,0 @@
{
"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 @@
{
"heading": "对话"
}

View File

@ -1,12 +0,0 @@
{
"heading": {
"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`
)

View File

@ -34,7 +34,7 @@ const ActionsDomain: React.FC<Props> = ({
displayMessage({
mode,
type: 'success',
message: t('common:toastMessage.success.message', {
message: t('common:message.success.message', {
function: t(`shared.header.actions.domain.block.function`)
})
})

View File

@ -43,7 +43,7 @@ const ActionsStatus: React.FC<Props> = ({
displayMessage({
mode,
type: 'error',
message: t('common:toastMessage.error.message', {
message: t('common:message.error.message', {
function: t(`shared.header.actions.status.${theFunction}.function`)
}),
...(err.status &&

View File

@ -35,7 +35,7 @@ const ScreenAnnouncements: React.FC<ScreenAnnouncementsProp> = ({
const { reduceMotionEnabled } = useAccessibility()
const { mode, theme } = useTheme()
const [index, setIndex] = useState(0)
const { t } = useTranslation('sharedAnnouncements')
const { t } = useTranslation('screenAnnouncements')
const query = useAnnouncementQuery({
showAll,
@ -77,7 +77,7 @@ const ScreenAnnouncements: React.FC<ScreenAnnouncementsProp> = ({
>
<Text style={[styles.published, { color: theme.secondary }]}>
<Trans
i18nKey='sharedAnnouncements:content.published'
i18nKey='screenAnnouncements:content.published'
components={[<RelativeTime date={item.published_at} />]}
/>
</Text>
@ -223,7 +223,7 @@ const ScreenAnnouncements: React.FC<ScreenAnnouncementsProp> = ({
native={false}
onPress={() => navigation.goBack()}
/>
<HeaderCenter content={t('sharedAnnouncements:heading')} />
<HeaderCenter content={t('screenAnnouncements:heading')} />
<View style={{ opacity: 0 }}>
<HeaderRight
content='MoreHorizontal'

View File

@ -54,7 +54,7 @@ const ScreenCompose: React.FC<ScreenComposeProp> = ({
route: { params },
navigation
}) => {
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { theme } = useTheme()
const queryClient = useQueryClient()

View File

@ -19,7 +19,7 @@ const ComposeDraftsList: React.FC<ScreenComposeEditAttachmentProp> = ({
},
navigation
}) => {
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const children = useCallback(
() => <ComposeDraftsListRoot timestamp={timestamp} />,

View File

@ -34,7 +34,7 @@ export interface Props {
const ComposeDraftsListRoot: React.FC<Props> = ({ timestamp }) => {
const { composeDispatch } = useContext(ComposeContext)
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const navigation = useNavigation()
const dispatch = useDispatch()
const { mode, theme } = useTheme()

View File

@ -22,7 +22,7 @@ const ComposeEditAttachment: React.FC<ScreenComposeEditAttachmentProp> = ({
navigation
}) => {
console.log('rendering')
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const headerLeft = useCallback(
() => (

View File

@ -20,7 +20,7 @@ export interface Props {
}
const ComposeEditAttachmentImage: React.FC<Props> = ({ index }) => {
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { theme } = useTheme()
const { composeState, composeDispatch } = useContext(ComposeContext)

View File

@ -12,7 +12,7 @@ export interface Props {
}
const ComposeEditAttachmentRoot: React.FC<Props> = ({ index }) => {
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { mode, theme } = useTheme()
const { composeState, composeDispatch } = useContext(ComposeContext)
const theAttachment = composeState.attachments.uploads[index].remote!

View File

@ -16,7 +16,7 @@ const ComposeEditAttachmentSubmit: React.FC<Props> = ({ index }) => {
const { composeState } = useContext(ComposeContext)
const navigation = useNavigation()
const [isSubmitting, setIsSubmitting] = useState(false)
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const theAttachment = composeState.attachments.uploads[index].remote!

View File

@ -13,7 +13,7 @@ import addAttachment from './Footer/addAttachment'
const ComposeActions: React.FC = () => {
const { showActionSheetWithOptions } = useActionSheet()
const { composeState, composeDispatch } = useContext(ComposeContext)
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { theme } = useTheme()
const attachmentColor = useMemo(() => {

View File

@ -10,7 +10,7 @@ import { useSelector } from 'react-redux'
import ComposeContext from '../utils/createContext'
const ComposeDrafts: React.FC = () => {
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const navigation = useNavigation()
const { composeState } = useContext(ComposeContext)
const instanceDrafts = useSelector(getInstanceDrafts)?.filter(

View File

@ -33,7 +33,7 @@ const DEFAULT_HEIGHT = 200
const ComposeAttachments: React.FC = () => {
const { showActionSheetWithOptions } = useActionSheet()
const { composeState, composeDispatch } = useContext(ComposeContext)
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { theme } = useTheme()
const navigation = useNavigation()

View File

@ -18,7 +18,7 @@ const ComposePoll: React.FC = () => {
},
composeDispatch
} = useContext(ComposeContext)
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { mode, theme } = useTheme()
const [firstRender, setFirstRender] = useState(true)

View File

@ -84,13 +84,13 @@ const addAttachment = async ({
})
Alert.alert(
i18next.t(
'sharedCompose:content.root.actions.attachment.failed.alert.title'
'screenCompose:content.root.actions.attachment.failed.alert.title'
),
undefined,
[
{
text: i18next.t(
'sharedCompose:content.root.actions.attachment.failed.alert.button'
'screenCompose:content.root.actions.attachment.failed.alert.button'
),
onPress: () => {}
}
@ -130,13 +130,13 @@ const addAttachment = async ({
{
options: [
i18next.t(
'sharedCompose:content.root.actions.attachment.actions.options.library'
'screenCompose:content.root.actions.attachment.actions.options.library'
),
i18next.t(
'sharedCompose:content.root.actions.attachment.actions.options.photo'
'screenCompose:content.root.actions.attachment.actions.options.photo'
),
i18next.t(
'sharedCompose:content.root.actions.attachment.actions.options.cancel'
'screenCompose:content.root.actions.attachment.actions.options.cancel'
)
],
cancelButtonIndex: 2
@ -149,15 +149,15 @@ const addAttachment = async ({
if (status !== 'granted') {
Alert.alert(
i18next.t(
'sharedCompose:content.root.actions.attachment.actions.library.alert.title'
'screenCompose:content.root.actions.attachment.actions.library.alert.title'
),
i18next.t(
'sharedCompose:content.root.actions.attachment.actions.library.alert.message'
'screenCompose:content.root.actions.attachment.actions.library.alert.message'
),
[
{
text: i18next.t(
'sharedCompose:content.root.actions.attachment.actions.library.alert.buttons.cancel'
'screenCompose:content.root.actions.attachment.actions.library.alert.buttons.cancel'
),
style: 'cancel',
onPress: () => {
@ -168,7 +168,7 @@ const addAttachment = async ({
},
{
text: i18next.t(
'sharedCompose:content.root.actions.attachment.actions.library.alert.buttons.settings'
'screenCompose:content.root.actions.attachment.actions.library.alert.buttons.settings'
),
style: 'default',
onPress: () => {
@ -195,15 +195,15 @@ const addAttachment = async ({
if (status !== 'granted') {
Alert.alert(
i18next.t(
'sharedCompose:content.root.actions.attachment.actions.photo.alert.title'
'screenCompose:content.root.actions.attachment.actions.photo.alert.title'
),
i18next.t(
'sharedCompose:content.root.actions.attachment.actions.photo.alert.message'
'screenCompose:content.root.actions.attachment.actions.photo.alert.message'
),
[
{
text: i18next.t(
'sharedCompose:content.root.actions.attachment.actions.photo.alert.buttons.cancel'
'screenCompose:content.root.actions.attachment.actions.photo.alert.buttons.cancel'
),
style: 'cancel',
onPress: () => {
@ -214,7 +214,7 @@ const addAttachment = async ({
},
{
text: i18next.t(
'sharedCompose:content.root.actions.attachment.actions.photo.alert.buttons.settings'
'screenCompose:content.root.actions.attachment.actions.photo.alert.buttons.settings'
),
style: 'default',
onPress: () => {

View File

@ -11,7 +11,7 @@ import { useSelector } from 'react-redux'
const ComposePostingAs = React.memo(
() => {
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { theme } = useTheme()
const instanceAccount = useSelector(

View File

@ -8,7 +8,7 @@ import ComposeContext from '../../utils/createContext'
const ComposeSpoilerInput: React.FC = () => {
const { composeState, composeDispatch } = useContext(ComposeContext)
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { mode, theme } = useTheme()
return (

View File

@ -8,7 +8,7 @@ import ComposeContext from '../../utils/createContext'
const ComposeTextInput: React.FC = () => {
const { composeState, composeDispatch } = useContext(ComposeContext)
const { t } = useTranslation('sharedCompose')
const { t } = useTranslation('screenCompose')
const { mode, theme } = useTheme()
return (

View File

@ -20,7 +20,7 @@ const Stack = createNativeStackNavigator<Nav.TabLocalStackParamList>()
const TabLocal = React.memo(
({ navigation }: TabLocalProp) => {
const { t, i18n } = useTranslation('local')
const { t, i18n } = useTranslation('screenTabs')
const screenOptions = useMemo(
() => ({
@ -31,9 +31,9 @@ const TabLocal = React.memo(
)
const screenOptionsRoot = useMemo(
() => ({
headerTitle: t('heading'),
headerTitle: t('tabs.local.name'),
...(Platform.OS === 'android' && {
headerCenter: () => <HeaderCenter content={t('heading')} />
headerCenter: () => <HeaderCenter content={t('tabs.local.name')} />
}),
headerRight: () => (
<HeaderRight

View File

@ -19,7 +19,7 @@ const Stack = createNativeStackNavigator<Nav.TabMeStackParamList>()
const TabMe = React.memo(
() => {
const { t } = useTranslation()
const { t } = useTranslation('screenTabs')
return (
<Stack.Navigator
@ -38,10 +38,10 @@ const TabMe = React.memo(
name='Tab-Me-Bookmarks'
component={ScreenMeBookmarks}
options={({ navigation }: any) => ({
headerTitle: t('meBookmarks:heading'),
headerTitle: t('me.stacks.bookmarks.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meBookmarks:heading')} />
<HeaderCenter content={t('me.stacks.bookmarks.name')} />
)
}),
headerLeft: () => <HeaderLeft onPress={() => navigation.pop(1)} />
@ -51,10 +51,10 @@ const TabMe = React.memo(
name='Tab-Me-Conversations'
component={ScreenMeConversations}
options={({ navigation }: any) => ({
headerTitle: t('meConversations:heading'),
headerTitle: t('me.stacks.conversations.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meConversations:heading')} />
<HeaderCenter content={t('me.stacks.conversations.name')} />
)
}),
headerLeft: () => <HeaderLeft onPress={() => navigation.pop(1)} />
@ -64,10 +64,10 @@ const TabMe = React.memo(
name='Tab-Me-Favourites'
component={ScreenMeFavourites}
options={({ navigation }: any) => ({
headerTitle: t('meFavourites:heading'),
headerTitle: t('me.stacks.favourites.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meFavourites:heading')} />
<HeaderCenter content={t('me.stacks.favourites.name')} />
)
}),
headerLeft: () => <HeaderLeft onPress={() => navigation.pop(1)} />
@ -77,10 +77,10 @@ const TabMe = React.memo(
name='Tab-Me-Lists'
component={ScreenMeLists}
options={({ navigation }: any) => ({
headerTitle: t('meLists:heading'),
headerTitle: t('me.stacks.lists.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meLists:heading')} />
<HeaderCenter content={t('me.stacks.lists.name')} />
)
}),
headerLeft: () => <HeaderLeft onPress={() => navigation.pop(1)} />
@ -90,11 +90,11 @@ const TabMe = React.memo(
name='Tab-Me-Lists-List'
component={ScreenMeListsList}
options={({ route, navigation }: any) => ({
headerTitle: t('meListsList:heading', { list: route.params.title }),
headerTitle: t('me.stacks.list.name', { list: route.params.title }),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter
content={t('meListsList:heading', {
content={t('me.stacks.list.name', {
list: route.params.title
})}
/>
@ -107,10 +107,10 @@ const TabMe = React.memo(
name='Tab-Me-Settings'
component={ScreenMeSettings}
options={({ navigation }: any) => ({
headerTitle: t('meSettings:heading'),
headerTitle: t('me.stacks.settings.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meSettings:heading')} />
<HeaderCenter content={t('me.stacks.settings.name')} />
)
}),
headerLeft: () => <HeaderLeft onPress={() => navigation.pop(1)} />
@ -120,10 +120,10 @@ const TabMe = React.memo(
name='Tab-Me-Settings-Fontsize'
component={ScreenMeSettingsFontsize}
options={({ navigation }: any) => ({
headerTitle: t('meSettingsFontsize:heading'),
headerTitle: t('me.stacks.fontSize.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meSettingsFontsize:heading')} />
<HeaderCenter content={t('me.stacks.fontSize.name')} />
)
}),
headerLeft: () => <HeaderLeft onPress={() => navigation.pop(1)} />
@ -133,10 +133,10 @@ const TabMe = React.memo(
name='Tab-Me-Settings-Push'
component={ScreenMeSettingsPush}
options={({ navigation }: any) => ({
headerTitle: t('meSettingsPush:heading'),
headerTitle: t('me.stacks.push.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meSettingsPush:heading')} />
<HeaderCenter content={t('me.stacks.push.name')} />
)
}),
headerLeft: () => <HeaderLeft onPress={() => navigation.pop(1)} />

View File

@ -37,7 +37,7 @@ const ScreenMeSettingsFontsize: React.FC<StackScreenProps<
'Tab-Me-Settings-Fontsize'
>> = () => {
const { mode, theme } = useTheme()
const { t } = useTranslation('meSettingsFontsize')
const { t } = useTranslation('screenTabs')
const initialSize = useSelector(getSettingsFontsize)
const dispatch = useDispatch()
@ -54,7 +54,7 @@ const ScreenMeSettingsFontsize: React.FC<StackScreenProps<
reblogged: false,
muted: false,
bookmarked: false,
content: t('content.demo'),
content: t('me.fontSize.demo'),
reblog: null,
application: {
name: 'tooot',
@ -97,7 +97,7 @@ const ScreenMeSettingsFontsize: React.FC<StackScreenProps<
}
]}
>
{t(`content.sizes.${mapFontsizeToName(size)}`)}
{t(`me.fontSize.sizes.${mapFontsizeToName(size)}`)}
</Text>
))}
</>
@ -107,7 +107,7 @@ const ScreenMeSettingsFontsize: React.FC<StackScreenProps<
return (
<ScrollView scrollEnabled={false}>
<Text style={[styles.header, { color: theme.primaryDefault }]}>
{t('content.showcase')}
{t('me.fontSize.showcase')}
</Text>
<View>
<ComponentSeparator
@ -121,7 +121,7 @@ const ScreenMeSettingsFontsize: React.FC<StackScreenProps<
/>
</View>
<Text style={[styles.header, { color: theme.primaryDefault }]}>
{t('content.availableSizes')}
{t('me.fontSize.availableSizes')}
</Text>
<View style={styles.sizesDemo}>{sizesDemo}</View>
<View style={styles.controls}>

View File

@ -15,7 +15,7 @@ import { StyleConstants } from '@utils/styles/constants'
import { AppState, Linking } from 'react-native'
const ScreenMeSettingsPush: React.FC = () => {
const { t } = useTranslation('meSettingsPush')
const { t } = useTranslation('screenTabs')
const dispatch = useDispatch()
const instancePush = useSelector(getInstancePush)
@ -53,7 +53,7 @@ const ScreenMeSettingsPush: React.FC = () => {
]).map(alert => (
<MenuRow
key={alert}
title={t(`content.${alert}.heading`)}
title={t(`me.push.${alert}.heading`)}
switchDisabled={
!pushEnabled || !instancePush.global.value || isLoading
}
@ -85,8 +85,8 @@ const ScreenMeSettingsPush: React.FC = () => {
type='text'
content={
pushCanAskAgain
? t('content.enable.direct')
: t('content.enable.settings')
? t('me.push.enable.direct')
: t('me.push.enable.settings')
}
style={{
marginTop: StyleConstants.Spacing.Global.PagePadding,
@ -106,8 +106,8 @@ const ScreenMeSettingsPush: React.FC = () => {
) : null}
<MenuContainer>
<MenuRow
title={t('content.global.heading')}
description={t('content.global.description')}
title={t('me.push.global.heading')}
description={t('me.push.global.description')}
loading={instancePush?.global.loading}
switchDisabled={!pushEnabled || isLoading}
switchValue={
@ -120,8 +120,8 @@ const ScreenMeSettingsPush: React.FC = () => {
</MenuContainer>
<MenuContainer>
<MenuRow
title={t('content.decode.heading')}
description={t('content.decode.description')}
title={t('me.push.decode.heading')}
description={t('me.push.decode.description')}
loading={instancePush?.decode.loading}
switchDisabled={
!pushEnabled || !instancePush?.global.value || isLoading
@ -132,7 +132,7 @@ const ScreenMeSettingsPush: React.FC = () => {
}
/>
<MenuRow
title={t('content.howitworks')}
title={t('me.push.howitworks')}
iconBack='ExternalLink'
onPress={() =>
WebBrowser.openBrowserAsync('https://tooot.app/how-push-works')

View File

@ -6,7 +6,7 @@ import React, { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
const Collections: React.FC = () => {
const { t, i18n } = useTranslation('meRoot')
const { t, i18n } = useTranslation('screenTabs')
const navigation = useNavigation()
const listsQuery = useListsQuery({
@ -20,7 +20,7 @@ const Collections: React.FC = () => {
<MenuRow
iconFront='List'
iconBack='ChevronRight'
title={t('content.collections.lists')}
title={t('me.stacks.lists.name')}
onPress={() => navigation.navigate('Tab-Me-Lists')}
/>
)
@ -44,13 +44,13 @@ const Collections: React.FC = () => {
<MenuRow
iconFront='Clipboard'
iconBack='ChevronRight'
title={t('content.collections.announcements.heading')}
title={t('screenAnnouncements:heading')}
content={
amount
? t('content.collections.announcements.content.unread', {
? t('me.root.announcements.content.unread', {
amount
})
: t('content.collections.announcements.content.read')
: t('me.root.announcements.content.read')
}
onPress={() =>
navigation.navigate('Screen-Announcements', { showAll: true })
@ -67,19 +67,19 @@ const Collections: React.FC = () => {
<MenuRow
iconFront='Mail'
iconBack='ChevronRight'
title={t('content.collections.conversations')}
title={t('me.stacks.conversations.name')}
onPress={() => navigation.navigate('Tab-Me-Conversations')}
/>
<MenuRow
iconFront='Bookmark'
iconBack='ChevronRight'
title={t('content.collections.bookmarks')}
title={t('me.stacks.bookmarks.name')}
onPress={() => navigation.navigate('Tab-Me-Bookmarks')}
/>
<MenuRow
iconFront='Heart'
iconBack='ChevronRight'
title={t('content.collections.favourites')}
title={t('me.stacks.favourites.name')}
onPress={() => navigation.navigate('Tab-Me-Favourites')}
/>
{rowLists}

View File

@ -10,7 +10,7 @@ import { useQueryClient } from 'react-query'
import { useDispatch, useSelector } from 'react-redux'
const Logout: React.FC = () => {
const { t } = useTranslation('meRoot')
const { t } = useTranslation('screenTabs')
const dispatch = useDispatch()
const queryClient = useQueryClient()
const instance = useSelector(getInstance)
@ -18,7 +18,7 @@ const Logout: React.FC = () => {
return (
<Button
type='text'
content={t('content.logout.button')}
content={t('me.root.logout.button')}
style={{
marginHorizontal: StyleConstants.Spacing.Global.PagePadding * 2,
marginBottom: StyleConstants.Spacing.Global.PagePadding * 2
@ -26,11 +26,11 @@ const Logout: React.FC = () => {
destructive
onPress={() =>
Alert.alert(
t('content.logout.alert.title'),
t('content.logout.alert.message'),
t('me.root.logout.alert.title'),
t('me.root.logout.alert.message'),
[
{
text: t('content.logout.alert.buttons.logout'),
text: t('me.root.logout.alert.buttons.logout'),
style: 'destructive' as const,
onPress: () => {
if (instance) {
@ -41,7 +41,7 @@ const Logout: React.FC = () => {
}
},
{
text: t('content.logout.alert.buttons.cancel'),
text: t('me.root.logout.alert.buttons.cancel'),
style: 'cancel' as const
}
]

View File

@ -4,24 +4,15 @@ import React from 'react'
import { useTranslation } from 'react-i18next'
const Settings: React.FC = () => {
const { t } = useTranslation('meRoot')
const { t } = useTranslation('screenTabs')
const navigation = useNavigation()
return (
<MenuContainer>
{/* <MenuRow
iconFront='User'
iconBack='ExternalLink'
title={t('content.accountSettings')}
onPress={() =>
localUrl &&
WebBrowser.openBrowserAsync(`https://${localUrl}/settings/profile`)
}
/> */}
<MenuRow
iconFront='Settings'
iconBack='ChevronRight'
title={t('content.appSettings')}
title={t('me.stacks.settings.name')}
onPress={() => navigation.navigate('Tab-Me-Settings')}
/>
</MenuContainer>

View File

@ -14,22 +14,22 @@ import { useDispatch, useSelector } from 'react-redux'
const SettingsAnalytics: React.FC = () => {
const dispatch = useDispatch()
const { theme } = useTheme()
const { t } = useTranslation('meSettings')
const { t } = useTranslation('screenTabs')
const settingsAnalytics = useSelector(getSettingsAnalytics)
return (
<MenuContainer>
<MenuRow
title={t('content.analytics.heading')}
description={t('content.analytics.description')}
title={t('me.settings.analytics.heading')}
description={t('me.settings.analytics.description')}
switchValue={settingsAnalytics}
switchOnValueChange={() =>
dispatch(changeAnalytics(!settingsAnalytics))
}
/>
<Text style={[styles.version, { color: theme.secondary }]}>
{t('content.version', { version: Constants.manifest.version })}
{t('me.settings.version', { version: Constants.manifest.version })}
</Text>
</MenuContainer>
)

View File

@ -3,7 +3,7 @@ import haptics from '@components/haptics'
import { MenuContainer, MenuRow } from '@components/Menu'
import { useActionSheet } from '@expo/react-native-action-sheet'
import { useNavigation } from '@react-navigation/native'
import i18n from '@root/i18n/i18n'
import { LOCALES } from '@root/i18n/locales'
import androidDefaults from '@utils/slices/instances/push/androidDefaults'
import {
getInstanceActive,
@ -14,7 +14,6 @@ import {
changeBrowser,
changeLanguage,
changeTheme,
getSettingsLanguage,
getSettingsTheme,
getSettingsBrowser,
getSettingsFontsize
@ -32,12 +31,11 @@ const SettingsApp: React.FC = () => {
const dispatch = useDispatch()
const { showActionSheetWithOptions } = useActionSheet()
const { setTheme } = useTheme()
const { t } = useTranslation('meSettings')
const { t, i18n } = useTranslation('screenTabs')
const instances = useSelector(getInstances, () => true)
const instanceActive = useSelector(getInstanceActive)
const settingsFontsize = useSelector(getSettingsFontsize)
const settingsLanguage = useSelector(getSettingsLanguage)
const settingsTheme = useSelector(getSettingsTheme)
const settingsBrowser = useSelector(getSettingsBrowser)
const instancePush = useSelector(
@ -50,11 +48,11 @@ const SettingsApp: React.FC = () => {
{instanceActive !== -1 ? (
<>
<MenuRow
title={t('content.push.heading')}
title={t('me.settings.push.heading')}
content={
instancePush?.global.value
? t('content.push.content.enabled')
: t('content.push.content.disabled')
? t('me.settings.push.content.enabled')
: t('me.settings.push.content.disabled')
}
iconBack='ChevronRight'
onPress={() => {
@ -62,9 +60,9 @@ const SettingsApp: React.FC = () => {
}}
/>
<MenuRow
title={t('content.fontsize.heading')}
title={t('me.settings.fontsize.heading')}
content={t(
`content.fontsize.content.${mapFontsizeToName(settingsFontsize)}`
`me.settings.fontsize.content.${mapFontsizeToName(settingsFontsize)}`
)}
iconBack='ChevronRight'
onPress={() => {
@ -74,22 +72,19 @@ const SettingsApp: React.FC = () => {
</>
) : null}
<MenuRow
title={t('content.language.heading')}
content={t(`content.language.options.${settingsLanguage}`)}
title={t('me.settings.language.heading')}
// @ts-ignore
content={LOCALES[i18n.language]}
iconBack='ChevronRight'
onPress={() => {
const availableLanguages = Object.keys(
i18n.services.resourceStore.data
)
const options = availableLanguages
.map(language => {
return t(`content.language.options.${language}`)
})
.concat(t('content.language.options.cancel'))
const options = Object.keys(LOCALES)
// @ts-ignore
.map(locale => LOCALES[locale])
.concat(t('me.settings.language.options.cancel'))
showActionSheetWithOptions(
{
title: t('content.language.heading'),
title: t('me.settings.language.heading'),
options,
cancelButtonIndex: options.length - 1
},
@ -97,13 +92,13 @@ const SettingsApp: React.FC = () => {
if (buttonIndex < options.length - 1) {
analytics('settings_language_press', {
current: i18n.language,
new: availableLanguages[buttonIndex]
new: options[buttonIndex]
})
haptics('Success')
// @ts-ignore
dispatch(changeLanguage(availableLanguages[buttonIndex]))
i18n.changeLanguage(availableLanguages[buttonIndex])
dispatch(changeLanguage(Object.keys(LOCALES)[buttonIndex]))
i18n.changeLanguage(Object.keys(LOCALES)[buttonIndex])
// Update Android notification channel language
if (Platform.OS === 'android') {
@ -114,7 +109,7 @@ const SettingsApp: React.FC = () => {
`${accountFull}_default`,
{
groupId: accountFull,
name: t('meSettingsPush:content.default.heading'),
name: t('me.push.default.heading'),
...androidDefaults
}
)
@ -123,7 +118,7 @@ const SettingsApp: React.FC = () => {
`${accountFull}_follow`,
{
groupId: accountFull,
name: t('meSettingsPush:content.follow.heading'),
name: t('me.push.follow.heading'),
...androidDefaults
}
)
@ -131,7 +126,7 @@ const SettingsApp: React.FC = () => {
`${accountFull}_favourite`,
{
groupId: accountFull,
name: t('meSettingsPush:content.favourite.heading'),
name: t('me.push.favourite.heading'),
...androidDefaults
}
)
@ -139,7 +134,7 @@ const SettingsApp: React.FC = () => {
`${accountFull}_reblog`,
{
groupId: accountFull,
name: t('meSettingsPush:content.reblog.heading'),
name: t('me.push.reblog.heading'),
...androidDefaults
}
)
@ -147,7 +142,7 @@ const SettingsApp: React.FC = () => {
`${accountFull}_mention`,
{
groupId: accountFull,
name: t('meSettingsPush:content.mention.heading'),
name: t('me.push.mention.heading'),
...androidDefaults
}
)
@ -155,7 +150,7 @@ const SettingsApp: React.FC = () => {
`${accountFull}_poll`,
{
groupId: accountFull,
name: t('meSettingsPush:content.poll.heading'),
name: t('me.push.poll.heading'),
...androidDefaults
}
)
@ -168,18 +163,18 @@ const SettingsApp: React.FC = () => {
}}
/>
<MenuRow
title={t('content.theme.heading')}
content={t(`content.theme.options.${settingsTheme}`)}
title={t('me.settings.theme.heading')}
content={t(`me.settings.theme.options.${settingsTheme}`)}
iconBack='ChevronRight'
onPress={() =>
showActionSheetWithOptions(
{
title: t('content.theme.heading'),
title: t('me.settings.theme.heading'),
options: [
t('content.theme.options.auto'),
t('content.theme.options.light'),
t('content.theme.options.dark'),
t('content.theme.options.cancel')
t('me.settings.theme.options.auto'),
t('me.settings.theme.options.light'),
t('me.settings.theme.options.dark'),
t('me.settings.theme.options.cancel')
],
cancelButtonIndex: 3
},
@ -217,17 +212,17 @@ const SettingsApp: React.FC = () => {
}
/>
<MenuRow
title={t('content.browser.heading')}
content={t(`content.browser.options.${settingsBrowser}`)}
title={t('me.settings.browser.heading')}
content={t(`me.settings.browser.options.${settingsBrowser}`)}
iconBack='ChevronRight'
onPress={() =>
showActionSheetWithOptions(
{
title: t('content.browser.heading'),
title: t('me.settings.browser.heading'),
options: [
t('content.browser.options.internal'),
t('content.browser.options.external'),
t('content.browser.options.cancel')
t('me.settings.browser.options.internal'),
t('me.settings.browser.options.external'),
t('me.settings.browser.options.cancel')
],
cancelButtonIndex: 2
},

View File

@ -18,7 +18,7 @@ const SettingsTooot: React.FC = () => {
const instanceActive = useSelector(getInstanceActive)
const navigation = useNavigation()
const { theme } = useTheme()
const { t } = useTranslation('meSettings')
const { t } = useTranslation('screenTabs')
const { isLoading, data } = useSearchQuery({
term: '@tooot@xmflsct.com',
@ -28,7 +28,7 @@ const SettingsTooot: React.FC = () => {
return (
<MenuContainer>
<MenuRow
title={t('content.support.heading')}
title={t('me.settings.support.heading')}
content={
<Icon
name='Heart'
@ -47,7 +47,7 @@ const SettingsTooot: React.FC = () => {
Updates.releaseChannel?.includes(channel)
) ? (
<MenuRow
title={t('content.review.heading')}
title={t('me.settings.review.heading')}
content={
<Icon
name='Star'
@ -65,7 +65,7 @@ const SettingsTooot: React.FC = () => {
/>
) : null}
<MenuRow
title={t('content.contact.heading')}
title={t('me.settings.contact.heading')}
loading={isLoading}
content={
<Icon

View File

@ -12,7 +12,7 @@ const ScreenMeSwitch: React.FC<StackScreenProps<
Nav.TabMeStackParamList,
'Tab-Me-Switch'
>> = ({ navigation }) => {
const { t } = useTranslation()
const { t } = useTranslation('screenTabs')
return (
<KeyboardAvoidingView
style={{ flex: 1 }}
@ -25,10 +25,10 @@ const ScreenMeSwitch: React.FC<StackScreenProps<
name='Screen-Me-Switch-Root'
component={ScreenMeSwitchRoot}
options={{
headerTitle: t('meSwitch:heading'),
headerTitle: t('me.stacks.switch.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('meSwitch:heading')} />
<HeaderCenter content={t('me.stacks.switch.name')} />
)
}),
headerLeft: () => (

View File

@ -48,7 +48,7 @@ const AccountButton: React.FC<Props> = ({ instance, disabled = false }) => {
}
const ScreenMeSwitchRoot: React.FC = () => {
const { t } = useTranslation('meSwitch')
const { t } = useTranslation('screenTabs')
const { theme } = useTheme()
const instances = useSelector(getInstances)
const instanceActive = useSelector(getInstanceActive)
@ -57,7 +57,7 @@ const ScreenMeSwitchRoot: React.FC = () => {
<ScrollView style={styles.base} keyboardShouldPersistTaps='always'>
<View style={[styles.firstSection, { borderBottomColor: theme.border }]}>
<Text style={[styles.header, { color: theme.primaryDefault }]}>
{t('content.existing')}
{t('me.switch.existing')}
</Text>
<View style={styles.accountButtons}>
{instances.length
@ -88,7 +88,7 @@ const ScreenMeSwitchRoot: React.FC = () => {
<View style={styles.secondSection}>
<Text style={[styles.header, { color: theme.primaryDefault }]}>
{t('content.new')}
{t('me.switch.new')}
</Text>
<ComponentInstance disableHeaderImage goBack />
</View>

View File

@ -15,7 +15,7 @@ const Stack = createNativeStackNavigator<Nav.TabNotificationsStackParamList>()
const TabNotifications = React.memo(
() => {
const navigation = useNavigation()
const { t, i18n } = useTranslation()
const { t, i18n } = useTranslation('screenTabs')
const screenOptions = useMemo(
() => ({
@ -26,10 +26,10 @@ const TabNotifications = React.memo(
)
const screenOptionsRoot = useMemo(
() => ({
headerTitle: t('notifications:heading'),
headerTitle: t('tabs.notifications.name'),
...(Platform.OS === 'android' && {
headerCenter: () => (
<HeaderCenter content={t('notifications:heading')} />
<HeaderCenter content={t('tabs.notifications.name')} />
)
}),
headerRight: () => (

View File

@ -23,7 +23,7 @@ const Stack = createNativeStackNavigator<Nav.TabPublicStackParamList>()
const TabPublic = React.memo(
({ navigation }: TabPublicProps) => {
const { t, i18n } = useTranslation()
const { t, i18n } = useTranslation('screenTabs')
const { mode } = useTheme()
const [segment, setSegment] = useState(0)
@ -32,11 +32,11 @@ const TabPublic = React.memo(
key: App.Pages
}[] = [
{
title: t('public:heading.segments.left'),
title: t('tabs.public.segments.left'),
key: 'LocalPublic'
},
{
title: t('public:heading.segments.right'),
title: t('tabs.public.segments.right'),
key: 'Local'
}
]

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