From 1bf9a1336f7f214f715cbec68a75570d6948c526 Mon Sep 17 00:00:00 2001 From: Hikali-47041 Date: Mon, 12 Sep 2022 19:30:41 +0900 Subject: [PATCH 1/8] Fix typo "browser" --- src/i18n/en/components/instance.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/en/components/instance.json b/src/i18n/en/components/instance.json index 73412475..b66fda37 100644 --- a/src/i18n/en/components/instance.json +++ b/src/i18n/en/components/instance.json @@ -11,7 +11,7 @@ "domains": "Universes" }, "disclaimer": { - "base": "Logging in process uses system broswer that, your account information won't be visible to tooot app." + "base": "Logging in process uses system browser that, your account information won't be visible to tooot app." }, "terms": { "base": "By logging in, you agree to the <0>privacy policy and <1>terms of service." From 79a488c84a5dd63d8654111735c2b6a0e29099a8 Mon Sep 17 00:00:00 2001 From: xmflsct Date: Tue, 13 Sep 2022 21:53:44 +0200 Subject: [PATCH 2/8] Fix poll input --- package.json | 2 +- src/screens/Compose/Root.tsx | 42 ++++------ src/screens/Compose/utils/types.d.ts | 115 +++++++++++++-------------- 3 files changed, 74 insertions(+), 85 deletions(-) diff --git a/package.json b/package.json index bc4a51a2..7f88d524 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "versions": { "major": 4, "minor": 3, - "patch": 0 + "patch": 1 }, "description": "tooot app for Mastodon", "author": "xmflsct ", diff --git a/src/screens/Compose/Root.tsx b/src/screens/Compose/Root.tsx index 5afeaf54..9aeb08f9 100644 --- a/src/screens/Compose/Root.tsx +++ b/src/screens/Compose/Root.tsx @@ -5,13 +5,7 @@ import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { chunk, forEach, groupBy, sortBy } from 'lodash' import React, { useContext, useEffect, useMemo, useRef } from 'react' -import { - AccessibilityInfo, - findNodeHandle, - FlatList, - StyleSheet, - View -} from 'react-native' +import { AccessibilityInfo, findNodeHandle, FlatList, StyleSheet, View } from 'react-native' import { Circle } from 'react-native-animated-spinkit' import ComposeActions from './Root/Actions' import ComposePosting from './Posting' @@ -79,8 +73,7 @@ const ComposeRoot = React.memo( const { isFetching, data, refetch } = useSearchQuery({ type: - composeState.tag?.type === 'accounts' || - composeState.tag?.type === 'hashtags' + composeState.tag?.type === 'accounts' || composeState.tag?.type === 'hashtags' ? composeState.tag.type : undefined, term: composeState.tag?.text.substring(1), @@ -89,8 +82,7 @@ const ComposeRoot = React.memo( useEffect(() => { if ( - (composeState.tag?.type === 'accounts' || - composeState.tag?.type === 'hashtags') && + (composeState.tag?.type === 'accounts' || composeState.tag?.type === 'hashtags') && composeState.tag?.text ) { refetch() @@ -106,10 +98,8 @@ const ComposeRoot = React.memo( title: string data: Pick[][] }[] = [] - forEach( - groupBy(sortBy(emojisData, ['category', 'shortcode']), 'category'), - (value, key) => - sortedEmojis.push({ title: key, data: chunk(value, 5) }) + forEach(groupBy(sortBy(emojisData, ['category', 'shortcode']), 'category'), (value, key) => + sortedEmojis.push({ title: key, data: chunk(value, 5) }) ) if (frequentEmojis.length) { sortedEmojis.unshift({ @@ -132,15 +122,22 @@ const ComposeRoot = React.memo( if (isFetching) { return ( - + ) } }, [isFetching]) + const Footer = useMemo( + () => ( + + ), + [accessibleRefAttachments.current, accessibleRefEmojis.current] + ) + return ( ( - - )} + ListFooterComponent={Footer} ItemSeparatorComponent={ComponentSeparator} // @ts-ignore data={data ? data[composeState.tag?.type] : undefined} diff --git a/src/screens/Compose/utils/types.d.ts b/src/screens/Compose/utils/types.d.ts index 3b89b956..7f4102d8 100644 --- a/src/screens/Compose/utils/types.d.ts +++ b/src/screens/Compose/utils/types.d.ts @@ -43,20 +43,17 @@ export type ComposeState = { emoji: { active: boolean emojis: - | { - title: string - data: Pick[][] - }[] - | undefined + | { + title: string + data: Pick[][] + }[] + | undefined } poll: { active: boolean total: number options: { - '0': string | undefined - '1': string | undefined - '2': string | undefined - '3': string | undefined + [key: string]: string | undefined } multiple: boolean expire: '300' | '1800' | '3600' | '21600' | '86400' | '259200' | '604800' @@ -76,69 +73,69 @@ export type ComposeState = { export type ComposeAction = | { - type: 'loadDraft' - payload: ComposeStateDraft - } + type: 'loadDraft' + payload: ComposeStateDraft + } | { - type: 'dirty' - payload: ComposeState['dirty'] - } + type: 'dirty' + payload: ComposeState['dirty'] + } | { - type: 'posting' - payload: ComposeState['posting'] - } + type: 'posting' + payload: ComposeState['posting'] + } | { - type: 'spoiler' - payload: Partial - } + type: 'spoiler' + payload: Partial + } | { - type: 'text' - payload: Partial - } + type: 'text' + payload: Partial + } | { - type: 'tag' - payload: ComposeState['tag'] - } + type: 'tag' + payload: ComposeState['tag'] + } | { - type: 'emoji' - payload: ComposeState['emoji'] - } + type: 'emoji' + payload: ComposeState['emoji'] + } | { - type: 'poll' - payload: Partial - } + type: 'poll' + payload: Partial + } | { - type: 'attachments/sensitive' - payload: Pick - } + type: 'attachments/sensitive' + payload: Pick + } | { - type: 'attachment/upload/start' - payload: Pick - } + type: 'attachment/upload/start' + payload: Pick + } | { - type: 'attachment/upload/end' - payload: { remote: Mastodon.Attachment; local: Asset } - } + type: 'attachment/upload/end' + payload: { remote: Mastodon.Attachment; local: Asset } + } | { - type: 'attachment/upload/fail' - payload: ExtendedAttachment['local']['hash'] - } + type: 'attachment/upload/fail' + payload: ExtendedAttachment['local']['hash'] + } | { - type: 'attachment/delete' - payload: NonNullable['id'] - } + type: 'attachment/delete' + payload: NonNullable['id'] + } | { - type: 'attachment/edit' - payload: ExtendedAttachment['remote'] - } + type: 'attachment/edit' + payload: ExtendedAttachment['remote'] + } | { - type: 'visibility' - payload: ComposeState['visibility'] - } + type: 'visibility' + payload: ComposeState['visibility'] + } | { - type: 'textInputFocus' - payload: Partial - } + type: 'textInputFocus' + payload: Partial + } | { - type: 'removeReply' - } + type: 'removeReply' + } From b537c38e9c8eeb85283d179a48fe1d5127b19941 Mon Sep 17 00:00:00 2001 From: xmflsct Date: Tue, 13 Sep 2022 21:55:07 +0200 Subject: [PATCH 3/8] New Crowdin updates (#373) * New translations common.json (Japanese) * New translations common.json (Japanese) * New translations instance.json (Japanese) * New translations parse.json (Japanese) * New translations relationship.json (Japanese) * New translations timeline.json (Japanese) * New translations actions.json (Japanese) * New translations announcements.json (Japanese) * New translations compose.json (Japanese) * New translations screens.json (Japanese) * New translations mediaSelector.json (Japanese) * New translations emojis.json (Japanese) * New translations contextMenu.json (Japanese) * New translations accountSelection.json (Japanese) * Add some Japanese translations Co-authored-by: Hikali-47041 --- src/i18n/ja/common.json | 14 +- src/i18n/ja/components/contextMenu.json | 58 ++--- src/i18n/ja/components/emojis.json | 4 +- src/i18n/ja/components/instance.json | 24 +- src/i18n/ja/components/mediaSelector.json | 16 +- src/i18n/ja/components/parse.json | 6 +- src/i18n/ja/components/relationship.json | 16 +- src/i18n/ja/components/timeline.json | 126 ++++----- src/i18n/ja/screens.json | 16 +- src/i18n/ja/screens/accountSelection.json | 4 +- src/i18n/ja/screens/actions.json | 20 +- src/i18n/ja/screens/announcements.json | 8 +- src/i18n/ja/screens/compose.json | 154 +++++------ src/i18n/ja/screens/imageViewer.json | 14 +- src/i18n/ja/screens/tabs.json | 297 +++++++++++----------- 15 files changed, 389 insertions(+), 388 deletions(-) diff --git a/src/i18n/ja/common.json b/src/i18n/ja/common.json index d17849b2..f6541c23 100644 --- a/src/i18n/ja/common.json +++ b/src/i18n/ja/common.json @@ -1,22 +1,22 @@ { "buttons": { - "OK": "", - "apply": "", - "cancel": "" + "OK": "はい", + "apply": "適用", + "cancel": "キャンセル" }, "customEmoji": { - "accessibilityLabel": "" + "accessibilityLabel": "カスタム絵文字 {{emoji}}" }, "message": { "success": { - "message": "" + "message": "{{function}} が成功しました" }, "warning": { "message": "" }, "error": { - "message": "" + "message": "{{function}} に失敗しました。もういちどお試しください。" } }, - "separator": "" + "separator": ", " } \ No newline at end of file diff --git a/src/i18n/ja/components/contextMenu.json b/src/i18n/ja/components/contextMenu.json index ba398d8a..2f8dcf94 100644 --- a/src/i18n/ja/components/contextMenu.json +++ b/src/i18n/ja/components/contextMenu.json @@ -1,76 +1,76 @@ { "accessibilityHint": "", "account": { - "title": "", + "title": "ユーザーアクション", "mute": { - "action_false": "", - "action_true": "" + "action_false": "ユーザーをミュート", + "action_true": "ユーザーのミュートを解除" }, "block": { - "action_false": "", - "action_true": "" + "action_false": "ユーザーをブロック", + "action_true": "ユーザーのブロックを解除" }, "reports": { - "action": "" + "action": "ユーザーを報告" } }, "copy": { - "action": "", - "succeed": "" + "action": "トゥートをコピー", + "succeed": "コピー完了" }, "instance": { - "title": "", + "title": "インスタンスアクション", "block": { - "action": "", + "action": "インスタンスをブロック {{instance}}", "alert": { - "title": "", - "message": "", + "title": "インスタンス {{instance}} をブロックしますか?", + "message": "ほとんどの場合、特定のユーザーをミュートまたはブロックすることができます。\n\nインスタンスをブロックすると、このインスタンスからフォロワーを含むすべてのコンテンツが削除されます!", "buttons": { - "confirm": "" + "confirm": "確定" } } } }, "share": { "status": { - "action": "" + "action": "トゥートを共有" }, "account": { - "action": "" + "action": "ユーザーを共有" } }, "status": { - "title": "", + "title": "トゥートのアクション", "edit": { - "action": "" + "action": "トゥートを編集" }, "delete": { - "action": "", + "action": "トゥートを削除", "alert": { - "title": "", - "message": "", + "title": "削除しますか?", + "message": "この投稿へのすべてのお気に入り登録やブーストは消去され、すべての返信は孤立することになります。", "buttons": { - "confirm": "" + "confirm": "確定" } } }, "deleteEdit": { - "action": "", + "action": "トゥートを削除し、再投稿する", "alert": { - "title": "", - "message": "", + "title": "削除して再投稿しますか?", + "message": "この投稿へのすべてのお気に入り登録やブーストは消去され、すべての返信は孤立することになります。", "buttons": { - "confirm": "" + "confirm": "確定" } } }, "mute": { - "action_false": "", - "action_true": "" + "action_false": "トゥートと返信をミュート", + "action_true": "トゥートと返信のミュートを解除" }, "pin": { - "action_false": "", - "action_true": "" + "action_false": "トゥートを固定", + "action_true": "トゥートの固定を解除" } } } \ No newline at end of file diff --git a/src/i18n/ja/components/emojis.json b/src/i18n/ja/components/emojis.json index 9e26dfee..35e5c6bd 100644 --- a/src/i18n/ja/components/emojis.json +++ b/src/i18n/ja/components/emojis.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "frequentUsed": "よく使う絵文字" +} \ No newline at end of file diff --git a/src/i18n/ja/components/instance.json b/src/i18n/ja/components/instance.json index 3f2cd6e8..8a556d94 100644 --- a/src/i18n/ja/components/instance.json +++ b/src/i18n/ja/components/instance.json @@ -1,29 +1,29 @@ { "server": { "textInput": { - "placeholder": "" + "placeholder": "インスタンスのドメイン" }, - "button": "", + "button": "ログイン", "information": { - "name": "", - "accounts": "", - "statuses": "", - "domains": "" + "name": "名前", + "accounts": "ユーザー", + "statuses": "トゥート", + "domains": "接続連合数" }, "disclaimer": { - "base": "" + "base": "ログインにはシステムのブラウザを使用するため、あなたのアカウント情報は tooot アプリには表示されません。" }, "terms": { - "base": "" + "base": "ログインすることで、 tooot の <0>プライバシーポリシー および <1>利用規約 に同意したことになります。" } }, "update": { "alert": { - "title": "", - "message": "", + "title": "このインスタンスにログインしました", + "message": "既存のアカウントにログインしたまま、他のアカウントにログインできます", "buttons": { - "cancel": "", - "continue": "" + "cancel": "$t(common:buttons.cancel)", + "continue": "続行" } } } diff --git a/src/i18n/ja/components/mediaSelector.json b/src/i18n/ja/components/mediaSelector.json index a57c70b5..d811edee 100644 --- a/src/i18n/ja/components/mediaSelector.json +++ b/src/i18n/ja/components/mediaSelector.json @@ -1,17 +1,17 @@ { - "title": "", + "title": "メディアソースを選択", "options": { - "image": "", - "image_max": "", - "video": "", - "video_max": "" + "image": "写真をアップロード", + "image_max": "写真をアップロード (最大{{max}}枚)", + "video": "動画をアップロード", + "video_max": "動画をアップロード (最大{{max}}本)" }, "library": { "alert": { - "title": "", - "message": "", + "title": "権限がありません", + "message": "アップロードするにはフォトライブラリの読み取り許可が必要です", "buttons": { - "settings": "" + "settings": "設定を更新する" } } } diff --git a/src/i18n/ja/components/parse.json b/src/i18n/ja/components/parse.json index fc364f0e..a87611a8 100644 --- a/src/i18n/ja/components/parse.json +++ b/src/i18n/ja/components/parse.json @@ -1,8 +1,8 @@ { "HTML": { - "accessibilityHint": "", + "accessibilityHint": "タップして内容を展開または折りたたむ", "expanded": "{{hint}}{{totalLines}}", - "totalLines": "", - "defaultHint": "" + "totalLines": " ({{count}} 行)", + "defaultHint": "長いトゥート" } } \ No newline at end of file diff --git a/src/i18n/ja/components/relationship.json b/src/i18n/ja/components/relationship.json index ccf2aa7b..b97342a9 100644 --- a/src/i18n/ja/components/relationship.json +++ b/src/i18n/ja/components/relationship.json @@ -1,16 +1,16 @@ { "follow": { - "function": "" + "function": "ユーザーをフォロー" }, "block": { - "function": "" + "function": "ユーザーをブロック" }, "button": { - "error": "", - "blocked_by": "", - "blocking": "", - "following": "", - "requested": "", - "default": "" + "error": "読み込みエラー", + "blocked_by": "ブロックされてます", + "blocking": "ブロックを解除", + "following": "フォローを解除", + "requested": "リクエストを取り消す", + "default": "フォロー" } } \ No newline at end of file diff --git a/src/i18n/ja/components/timeline.json b/src/i18n/ja/components/timeline.json index e7dcf23e..077114dc 100644 --- a/src/i18n/ja/components/timeline.json +++ b/src/i18n/ja/components/timeline.json @@ -1,145 +1,145 @@ { "empty": { "error": { - "message": "", - "button": "" + "message": "読み込みエラー", + "button": "再試行" }, "success": { - "message": "" + "message": "表示するものがありません" } }, "end": { - "message": "" + "message": "スレッドの末端です。コーヒーはいかがですか <0 />" }, "lookback": { - "message": "" + "message": "最終閲覧" }, "refresh": { - "fetchPreviousPage": "", - "refetch": "" + "fetchPreviousPage": "前のページを取得", + "refetch": "更新" }, "shared": { "actioned": { - "pinned": "", - "favourite": "", - "status": "", - "follow": "", - "follow_request": "", - "poll": "", + "pinned": "固定された投稿", + "favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました", + "status": "{name}さんが投稿しました", + "follow": "{name}さんにフォローされました", + "follow_request": "{{name}}さんがフォローをリクエストしました", + "poll": "アンケートが終了しました", "reblog": { - "default": "", - "notification": "" + "default": "{name}さんがブースト", + "notification": "{name}さんがあなたのトゥートをブーストしました" }, - "update": "" + "update": "ブーストしたトゥートが編集されました" }, "actions": { "reply": { - "accessibilityLabel": "" + "accessibilityLabel": "このトゥートに返信" }, "reblogged": { - "accessibilityLabel": "", - "function": "" + "accessibilityLabel": "このトゥートをブーストしますか?", + "function": "トゥートをブースト" }, "favourited": { - "accessibilityLabel": "", - "function": "" + "accessibilityLabel": "このトゥートをお気に入りに追加", + "function": "お気に入りトゥート" }, "bookmarked": { - "accessibilityLabel": "", - "function": "" + "accessibilityLabel": "このトゥートをブックマークに追加", + "function": "ブックマークトゥート" } }, "actionsUsers": { "reblogged_by": { - "accessibilityLabel": "", - "accessibilityHint": "", - "text": "" + "accessibilityLabel": "{{count}}人がこのトゥートをブーストしました", + "accessibilityHint": "タップしてユーザーを確認", + "text": "$t(screenTabs:shared.users.statuses.reblogged_by)" }, "favourited_by": { - "accessibilityLabel": "", - "accessibilityHint": "", - "text": "" + "accessibilityLabel": "{{count}}人がこのトゥートをお気に入りしました", + "accessibilityHint": "タップしてユーザーを確認", + "text": "$t(screenTabs:shared.users.statuses.favourited_by)" }, "history": { - "accessibilityLabel": "", - "accessibilityHint": "", - "text_one": "", - "text_other": "" + "accessibilityLabel": "このトゥートは{{count}}回編集されました", + "accessibilityHint": "タップして全編集履歴を表示", + "text_one": "{{count}}回 編集", + "text_other": "{{count}}回 編集" } }, "attachment": { "sensitive": { - "button": "" + "button": "閲覧注意のメディアを表示" }, "unsupported": { - "text": "", - "button": "" + "text": "読み込みエラー", + "button": "リモートリンクを試す" } }, "avatar": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "{{name}}のアバター", + "accessibilityHint": "{{name}}のページに移動するにはタップしてください" }, "content": { - "expandHint": "" + "expandHint": "内容を非表示にする" }, - "filtered": "", - "fullConversation": "", + "filtered": "フィルター済み", + "fullConversation": "スレッドを読む", "translate": { - "default": "", - "succeed": "", - "failed": "", - "source_not_supported": "", - "target_not_supported": "" + "default": "翻訳", + "succeed": "{{provider}} によって {{source}} から翻訳されました", + "failed": "翻訳できませんでした", + "source_not_supported": "サポートされていない言語のトゥートです", + "target_not_supported": "ターゲットの言語の翻訳はサポートされてません" }, "header": { "shared": { "account": { "name": { - "accessibilityHint": "" + "accessibilityHint": "ユーザーの表示名" }, "account": { - "accessibilityHint": "" + "accessibilityHint": "ユーザーのアカウント名" } }, - "application": "", + "application": "{{application}}", "edited": { - "accessibilityLabel": "" + "accessibilityLabel": "トゥートが編集されました" }, "muted": { - "accessibilityLabel": "" + "accessibilityLabel": "トゥートがミュートされました" }, "visibility": { "direct": { - "accessibilityLabel": "" + "accessibilityLabel": "トゥートはダイレクトメッセージです" }, "private": { - "accessibilityLabel": "" + "accessibilityLabel": "トゥートはフォロワーのみに公開されます" } } }, "conversation": { - "withAccounts": "", + "withAccounts": "@ ", "delete": { - "function": "" + "function": "ダイレクトメッセージを削除" } } }, "poll": { "meta": { "button": { - "vote": "", - "refresh": "" + "vote": "投票", + "refresh": "更新" }, "count": { - "voters_one": "", - "voters_other": "", - "votes_one": "", - "votes_other": "" + "voters_one": "{{count}} 人が投票", + "voters_other": "{{count}} 人が投票", + "votes_one": "{{count}} 票", + "votes_other": "{{count}} 票" }, "expiration": { - "expired": "", - "until": "" + "expired": "終了", + "until": "終了 <0 />" } } } diff --git a/src/i18n/ja/screens.json b/src/i18n/ja/screens.json index 59b67261..59dc7caf 100644 --- a/src/i18n/ja/screens.json +++ b/src/i18n/ja/screens.json @@ -1,18 +1,18 @@ { "screenshot": { - "title": "", - "message": "", - "button": "" + "title": "プライバシー保護", + "message": "ユーザー名やアバターなど、他のユーザーを特定する情報は公開しないでください。", + "button": "確定" }, "localCorrupt": { - "message": "" + "message": "ログイン期限が切れました。もう一度ログインしてください。" }, "pushError": { - "message": "", - "description": "" + "message": "プッシュサービスのエラー", + "description": "設定でプッシュ通知を再度有効にしてください" }, "shareError": { - "imageNotSupported": "", - "videoNotSupported": "" + "imageNotSupported": "画像ファイル形式 {{type}} はサポートされていません", + "videoNotSupported": "動画ファイル形式 {{type}} はサポートされていません" } } \ No newline at end of file diff --git a/src/i18n/ja/screens/accountSelection.json b/src/i18n/ja/screens/accountSelection.json index b16795a6..ac0e4f25 100644 --- a/src/i18n/ja/screens/accountSelection.json +++ b/src/i18n/ja/screens/accountSelection.json @@ -1,6 +1,6 @@ { - "heading": "", + "heading": "共有先", "content": { - "select_account": "" + "select_account": "アカウントを選択" } } \ No newline at end of file diff --git a/src/i18n/ja/screens/actions.json b/src/i18n/ja/screens/actions.json index 55e9959c..ece927fd 100644 --- a/src/i18n/ja/screens/actions.json +++ b/src/i18n/ja/screens/actions.json @@ -1,19 +1,19 @@ { "content": { "altText": { - "heading": "" + "heading": "代替テキスト" }, "notificationsFilter": { - "heading": "", + "heading": "表示する通知の種類", "content": { - "follow": "", - "follow_request": "", - "favourite": "", - "reblog": "", - "mention": "", - "poll": "", - "status": "", - "update": "" + "follow": "$t(screenTabs:me.push.follow.heading)", + "follow_request": "フォローリクエスト", + "favourite": "$t(screenTabs:me.push.favourite.heading)", + "reblog": "$t(screenTabs:me.push.reblog.heading)", + "mention": "$t(screenTabs:me.push.mention.heading)", + "poll": "$t(screenTabs:me.push.poll.heading)", + "status": "購読中のユーザーからのトゥート", + "update": "編集されたリブログ" } } } diff --git a/src/i18n/ja/screens/announcements.json b/src/i18n/ja/screens/announcements.json index 95737a45..45cf366f 100644 --- a/src/i18n/ja/screens/announcements.json +++ b/src/i18n/ja/screens/announcements.json @@ -1,10 +1,10 @@ { - "heading": "", + "heading": "お知らせ", "content": { - "published": "", + "published": "公開 <0 />", "button": { - "read": "", - "unread": "" + "read": "既読", + "unread": "既読にする" } } } \ No newline at end of file diff --git a/src/i18n/ja/screens/compose.json b/src/i18n/ja/screens/compose.json index ceb1afd4..4d3b2b36 100644 --- a/src/i18n/ja/screens/compose.json +++ b/src/i18n/ja/screens/compose.json @@ -1,35 +1,35 @@ { "heading": { "left": { - "button": "", + "button": "キャンセル", "alert": { - "title": "", + "title": "編集をキャンセルしますか?", "buttons": { - "save": "", - "delete": "", - "cancel": "" + "save": "下書きを保存", + "delete": "下書きを削除", + "cancel": "キャンセル" } } }, "right": { "button": { - "default": "", - "conversation": "", - "reply": "", - "deleteEdit": "", - "edit": "", - "share": "" + "default": "トゥート", + "conversation": "DMをトゥート", + "reply": "トゥートに返信", + "deleteEdit": "トゥート", + "edit": "トゥート", + "share": "トゥート" }, "alert": { "default": { - "title": "", - "button": "" + "title": "トゥートに失敗しました", + "button": "もう一度やり直す" }, "removeReply": { - "title": "", - "description": "", - "cancel": "", - "confirm": "" + "title": "返信されたトゥートが見つかりませんでした", + "description": "返信されたトゥートが削除された可能性があります。参照から削除しますか?", + "cancel": "$t(common:buttons.cancel)", + "confirm": "参照を削除" } } } @@ -37,143 +37,143 @@ "content": { "root": { "header": { - "postingAs": "", + "postingAs": "@{{acct}}@{{domain}} としてトゥート", "spoilerInput": { - "placeholder": "" + "placeholder": "注意書き" }, "textInput": { - "placeholder": "", + "placeholder": "今なにかんがえてるの?", "keyboardImage": { "exceedMaximum": { - "title": "", - "OK": "" + "title": "アップロードできるメディアの数の上限に達しました", + "OK": "$t(common:buttons.OK)" } } } }, "footer": { "attachments": { - "sensitive": "", + "sensitive": "メディアを閲覧注意にする", "remove": { - "accessibilityLabel": "" + "accessibilityLabel": "{{attachment}} のメディアを削除する" }, "edit": { - "accessibilityLabel": "" + "accessibilityLabel": "{{attachment}} のメディアを編集する" }, "upload": { - "accessibilityLabel": "" + "accessibilityLabel": "アップロードするメディアを追加する" } }, "emojis": { - "accessibilityHint": "" + "accessibilityHint": "タップして絵文字を追加" }, "poll": { "option": { "placeholder": { - "accessibilityLabel": "", - "single": "", - "multiple": "" + "accessibilityLabel": "投票オプション {{index}}", + "single": "単一選択項目", + "multiple": "複数選択項目" } }, "quantity": { "reduce": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "投票の選択肢を {{amount}} に減らす", + "accessibilityHint": "最小の投票数 {{amount}} に到達しました" }, "increase": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "投票の選択肢を {{amount}} に増やす", + "accessibilityHint": "最大の投票数 {{amount}} に到達しました" } }, "multiple": { - "heading": "", + "heading": "投票タイプ", "options": { - "single": "", - "multiple": "", - "cancel": "" + "single": "単一選択式", + "multiple": "複数選択式", + "cancel": "$t(common:buttons.cancel)" } }, "expiration": { - "heading": "", + "heading": "終了時間", "options": { - "300": "", - "1800": "", - "3600": "", - "21600": "", - "86400": "", - "259200": "", - "604800": "", - "cancel": "" + "300": "5分", + "1800": "30分", + "3600": "1時間", + "21600": "6時間", + "86400": "1日", + "259200": "3日", + "604800": "7日", + "cancel": "$t(common:buttons.cancel)" } } } }, "actions": { "attachment": { - "accessibilityLabel": "", - "accessibilityHint": "", + "accessibilityLabel": "メディアをアップロード", + "accessibilityHint": "メディアをアップロードした場合、投票機能は無効化されます", "failed": { "alert": { - "title": "", - "button": "" + "title": "アップロードに失敗", + "button": "再試行" } } }, "poll": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "投票を追加", + "accessibilityHint": "投票がアクティブな場合、メディアのアップロードは無効化されます" }, "visibility": { - "accessibilityLabel": "", - "title": "", + "accessibilityLabel": "公開範囲は {{visibility}} です", + "title": "公開範囲", "options": { - "public": "", - "unlisted": "", - "private": "", - "direct": "", - "cancel": "" + "public": "公開", + "unlisted": "未収載", + "private": "フォロワー限定", + "direct": "ダイレクトメッセージ", + "cancel": "$t(common:buttons.cancel)" } }, "spoiler": { - "accessibilityLabel": "" + "accessibilityLabel": "スポイラーの設定" }, "emoji": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "絵文字を追加", + "accessibilityHint": "絵文字選択パネルを開き、横にスワイプしてページを変更します" } }, - "drafts_one": "", - "drafts_other": "" + "drafts_one": "下書き ({{count}})", + "drafts_other": "下書き ({{count}})" }, "editAttachment": { "header": { - "title": "", + "title": "メディアを編集", "right": { - "accessibilityLabel": "", + "accessibilityLabel": "メディアの編集を保存", "failed": { - "title": "", - "button": "" + "title": "編集に失敗", + "button": "再試行" } } }, "content": { "altText": { - "heading": "", - "placeholder": "" + "heading": "閲覧が難しいユーザーへの説明", + "placeholder": "目の不自由な人や視覚障がいを持つ人を含むより多くの人がメディアにアクセスできるようになる、代替テキスト(alt-text)とも呼ばれる説明をメディアに追加することができます。\n\n簡潔でありながらも、メディアの文脈を正確に理解できるような表現が良い説明です。" }, - "imageFocus": "" + "imageFocus": "円形の枠をドラッグしてサムネイルの焦点にしたい場所を更新します" } }, "draftsList": { "header": { - "title": "" + "title": "下書き" }, - "warning": "", + "warning": "下書きは端末内のみに保存されます。下書きが不幸な出来事によって失われる可能性があります。そのため下書きを長期保存のために使用しないことを推奨します。", "content": { - "accessibilityHint": "", - "textEmpty": "" + "accessibilityHint": "下書きを保存しました。タップしてこの下書きを編集します", + "textEmpty": "コンテンツが空です" }, - "checkAttachment": "" + "checkAttachment": "サーバー上にあるメディアを確認しています…" } } } \ No newline at end of file diff --git a/src/i18n/ja/screens/imageViewer.json b/src/i18n/ja/screens/imageViewer.json index ad2b495c..8b2d2ab8 100644 --- a/src/i18n/ja/screens/imageViewer.json +++ b/src/i18n/ja/screens/imageViewer.json @@ -1,17 +1,17 @@ { "content": { "actions": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "この画像に対するほかのアクション", + "accessibilityHint": "この画像を保存または共有できます" }, "options": { - "save": "", - "share": "", - "cancel": "" + "save": "画像を保存", + "share": "画像を共有", + "cancel": "$t(common:buttons.cancel)" }, "save": { - "succeed": "", - "failed": "" + "succeed": "画像を保存しました", + "failed": "画像の保存に失敗しました" } } } \ No newline at end of file diff --git a/src/i18n/ja/screens/tabs.json b/src/i18n/ja/screens/tabs.json index 7d6ca206..b8d9d635 100644 --- a/src/i18n/ja/screens/tabs.json +++ b/src/i18n/ja/screens/tabs.json @@ -1,353 +1,352 @@ { "tabs": { "local": { - "name": "" + "name": "ホーム" }, "public": { "name": "", "segments": { - "left": "", - "right": "" + "left": "連合", + "right": "ローカル" } }, "notifications": { - "name": "" + "name": "通知" }, "me": { - "name": "" + "name": "私について" } }, "common": { "search": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "検索", + "accessibilityHint": "ハッシュタグ、ユーザー、トゥートを検索" } }, "notifications": { "filter": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "フィルター", + "accessibilityHint": "表示される通知の種類をフィルターする" } }, "me": { "stacks": { "bookmarks": { - "name": "" + "name": "ブックマーク" }, "conversations": { - "name": "" + "name": "ダイレクトメッセージ" }, "favourites": { - "name": "" + "name": "お気に入り" }, "fontSize": { - "name": "" + "name": "トゥートのフォントサイズ" }, "language": { - "name": "" + "name": "言語" }, "lists": { - "name": "" + "name": "リスト" }, "list": { - "name": "" + "name": "リスト: {{list}}" }, "push": { - "name": "" + "name": "プッシュ通知" }, "profile": { - "name": "" + "name": "プロフィールを編集" }, "profileName": { - "name": "" + "name": "表示名を編集" }, "profileNote": { - "name": "" + "name": "説明文を編集" }, "profileFields": { - "name": "" + "name": "プロフィール補足情報を編集" }, "settings": { - "name": "" + "name": "アプリの設定" }, "webSettings": { - "name": "" + "name": "アカウントの設定" }, "switch": { - "name": "" + "name": "アカウントを切り替える" } }, "fontSize": { - "demo": "", + "demo": "

これはトゥートの例です。😊 フォントサイズを以下の選択肢から選択できます。

この設定はトゥートのメインコンテンツにのみ影響し、他のフォントサイズには影響しません。

", "sizes": { - "S": "", - "M": "", - "L": "", - "XL": "", - "XXL": "" + "S": "小", + "M": "中 (デフォルト)", + "L": "大", + "XL": "特大", + "XXL": "最大" } }, "profile": { "cancellation": { - "title": "", - "message": "", + "title": "変更を破棄", + "message": "変更は保存されていません。変更の保存を破棄しますか?", "buttons": { - "cancel": "", - "discard": "" + "cancel": "$t(common:buttons.cancel)", + "discard": "破棄" } }, "feedback": { - "succeed": "", - "failed": "" + "succeed": "{{type}} がアップデートされました", + "failed": "{{type}} のアップデートに失敗しました。もういちどお試しください" }, "root": { "name": { - "title": "" + "title": "表示名" }, "avatar": { - "title": "", - "description": "" + "title": "アイコン", + "description": "400x400pxまで縮小されます" }, "header": { - "title": "", - "description": "" + "title": "ヘッダー", + "description": "1500x1500pxまで縮小されます" }, "note": { - "title": "" + "title": "プロフィール説明文" }, "fields": { - "title": "", - "total_one": "", - "total_other": "" + "title": "プロフィール補足情報", + "total_one": "{{count}} つのフィールド", + "total_other": "{{count}} つのフィールド" }, "visibility": { - "title": "", + "title": "デフォルトの投稿の公開範囲", "options": { - "public": "", - "unlisted": "", - "private": "", - "cancel": "" + "public": "公開", + "unlisted": "未収載", + "private": "フォロワー限定", + "cancel": "$t(common:buttons.cancel)" } }, "sensitive": { - "title": "" + "title": "メディアを常に閲覧注意として投稿する" }, "lock": { - "title": "", - "description": "" + "title": "承認制アカウント", + "description": "フォロワーを手動で承認する必要があります" }, "bot": { - "title": "", - "description": "" + "title": "ボットアカウント", + "description": "このアカウントを主に自動で動作するものとし、人による監視がされていない可能性があるものとします" } }, "fields": { - "group": "", - "label": "", - "content": "" + "group": "グループ {{index}}", + "label": "ラベル", + "content": "内容" }, - "mediaSelectionFailed": "" + "mediaSelectionFailed": "画像処理に失敗しました。もういちどお試しください。" }, "push": { - "notAvailable": "", + "notAvailable": "あなたがお使いのデバイスでは tooot のプッシュ通知をサポートしていません", "enable": { - "direct": "", - "settings": "" + "direct": "プッシュ通知を有効にする", + "settings": "設定で有効にする" }, "global": { - "heading": "", - "description": "" + "heading": "{{acct}} の通知を有効にする", + "description": "メッセージは tooot のサーバー経由で到達します" }, "decode": { - "heading": "", - "description": "" + "heading": "メッセージの詳細を表示", + "description": "tooot のサーバーを介して到達するメッセージは暗号化されますが、サーバー上でメッセージを復号することを選択できます。サーバーのソースコードはオープンソースであり、ログを保存することはありません。" }, "default": { - "heading": "" + "heading": "デフォルト" }, "follow": { - "heading": "" + "heading": "新しいフォロワー" }, "follow_request": { - "heading": "" + "heading": "フォローリクエスト" }, "favourite": { - "heading": "" + "heading": "お気に入り" }, "reblog": { - "heading": "" + "heading": "ブースト" }, "mention": { - "heading": "" + "heading": "返信" }, "poll": { - "heading": "" + "heading": "投票" }, "status": { - "heading": "" + "heading": "購読したユーザーのトゥート" }, - "howitworks": "" + "howitworks": "通知到達(routing)のしくみを学ぶ" }, "root": { "announcements": { "content": { - "unread": "", - "read": "", - "empty": "" + "unread": "未読数: {{amount}}", + "read": "すべて読みました", + "empty": "ありません" } }, "push": { "content": { - "enabled": "", - "disabled": "" + "enabled": "有効", + "disabled": "無効" } }, "update": { - "title": "" + "title": "最新バージョンへのアップデート" }, "logout": { - "button": "", + "button": "ログアウト", "alert": { - "title": "", - "message": "", + "title": "ログアウトしますか?", + "message": "ログアウトすると、再度ログインする必要があります", "buttons": { - "logout": "", - "cancel": "" + "logout": "ログアウト", + "cancel": "$t(common:buttons.cancel)" } } } }, "settings": { "fontsize": { - "heading": "", + "heading": "$t(me.stacks.fontSize.name)", "content": { - "S": "", - "M": "", - "L": "", - "XL": "", - "XXL": "" + "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": "", + "heading": "$t(me.stacks.language.name)", "options": { - "cancel": "" + "cancel": "$t(common:buttons.cancel)" } }, "theme": { - "heading": "", + "heading": "外観", "options": { - "auto": "", - "light": "", - "dark": "", - "cancel": "" + "auto": "システムの設定に従う", + "light": "ライトモード", + "dark": "ダークモード", + "cancel": "$t(common:buttons.cancel)" } }, "darkTheme": { - "heading": "", + "heading": "ダークテーマ", "options": { - "lighter": "", - "darker": "", - "cancel": "" + "lighter": "明るめ", + "darker": "暗め", + "cancel": "$t(common:buttons.cancel)" } }, "browser": { - "heading": "", + "heading": "リンクを開く", "options": { - "internal": "", - "external": "", - "cancel": "" + "internal": "アプリ内で開く", + "external": "システムブラウザを使用する", + "cancel": "$t(common:buttons.cancel)" } }, "staticEmoji": { - "heading": "", - "description": "" + "heading": "静的な絵文字リスト", + "description": "絵文字リストを表示しているときにアプリが頻繁にクラッシュする場合、代わりにアニメーションが無効化された絵文字リストを使用してみてください。" }, "feedback": { - "heading": "" + "heading": "機能リクエスト" }, "support": { - "heading": "" + "heading": "tooot をサポート" }, "review": { - "heading": "" + "heading": "tooot をレビュー" }, "contact": { - "heading": "" + "heading": "tooot に関する連絡" }, "analytics": { - "heading": "", - "description": "" + "heading": "ソフトウェア改善への協力", + "description": "ユーザーに関連しない情報のみ収集します" }, - "version": "", - "instanceVersion": "" + "version": "バージョン v{{version}}", + "instanceVersion": "Mastodonのバージョン v{{version}}" }, "switch": { - "existing": "", - "new": "" + "existing": "ログイン済みのアカウント", + "new": "インスタンスに新規ログイン" } }, "shared": { "account": { "actions": { - "accessibilityLabel": "", - "accessibilityHint": "" + "accessibilityLabel": "ユーザー {{user}} に対するアクション", + "accessibilityHint": "このユーザーをミュート、ブロック、報告または共有できます" }, - "followed_by": "", - "moved": "", - "created_at": "", + "followed_by": "はあなたをフォローしています", + "moved": "ユーザーは引っ越ししました", + "created_at": "登録日: {{date}}", "summary": { - "statuses_count": "", - "following_count": "", - "followers_count": "" - }, + "statuses_count": "{{count}} 投稿", + "following_count": "$t(shared.users.accounts.following)", + "followers_count": "$t(shared.users.accounts.followers)" }, "toots": { - "default": "", - "all": "" + "default": "投稿", + "all": "投稿と返信" } }, "attachments": { - "name": "" + "name": "<0 /><1>\" のメディア" }, "search": { "header": { - "prefix": "", - "placeholder": "" + "prefix": "検索", + "placeholder": "検索したいことは…?" }, "empty": { - "general": "", + "general": "検索キーワードを入力して$t(screenTabs:shared.search.sections.accounts)$t(screenTabs:shared.search.sections.hashtags) または $t(screenTabs:shared.search.sections.statuses)を検索", "advanced": { - "header": "", + "header": "高度な検索のフォーマット", "example": { - "account": "", - "hashtag": "", - "statusLink": "", - "accountLink": "" + "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": "" + "accounts": "ユーザー", + "hashtags": "ハッシュタグ", + "statuses": "投稿" }, - "notFound": "" + "notFound": "{{type}} {{searchTerm}} は見つかりませんでした" }, "toot": { - "name": "" + "name": "スレッド" }, "users": { "accounts": { - "following": "", - "followers": "" + "following": "{{count}} フォロー", + "followers": "{{count}} フォロワー" }, "statuses": { - "reblogged_by": "", - "favourited_by": "" + "reblogged_by": "{{count}} ブースト", + "favourited_by": "{{count}} お気に入り" } }, "history": { - "name": "" + "name": "編集履歴" } } } \ No newline at end of file From 969d4abe0e2e161d469399c0fcf68d23a7c0b42e Mon Sep 17 00:00:00 2001 From: xmflsct Date: Wed, 14 Sep 2022 21:52:16 +0200 Subject: [PATCH 4/8] Move image viewer to a new plugin --- package.json | 1 + src/components/GracefullyImage.tsx | 36 +- .../ImageViewer/@types/extensions.d.ts | 7 - src/screens/ImageViewer/@types/index.ts | 17 - src/screens/ImageViewer/Root.tsx | 132 ------ .../components/ImageItem.android.tsx | 123 ------ .../ImageViewer/components/ImageItem.d.ts | 32 -- .../ImageViewer/components/ImageItem.ios.tsx | 177 -------- .../hooks/useAnimatedComponents.ts | 40 -- .../ImageViewer/hooks/useDoubleTapToZoom.ts | 64 --- .../ImageViewer/hooks/useImageIndexChange.ts | 31 -- .../ImageViewer/hooks/usePanResponder.ts | 406 ------------------ .../ImageViewer/hooks/useRequestClose.ts | 23 - src/screens/ImageViewer/utils.ts | 147 ------- src/screens/ImagesViewer.tsx | 160 +++++-- yarn.lock | 5 + 16 files changed, 128 insertions(+), 1273 deletions(-) delete mode 100644 src/screens/ImageViewer/@types/extensions.d.ts delete mode 100644 src/screens/ImageViewer/@types/index.ts delete mode 100644 src/screens/ImageViewer/Root.tsx delete mode 100644 src/screens/ImageViewer/components/ImageItem.android.tsx delete mode 100644 src/screens/ImageViewer/components/ImageItem.d.ts delete mode 100644 src/screens/ImageViewer/components/ImageItem.ios.tsx delete mode 100644 src/screens/ImageViewer/hooks/useAnimatedComponents.ts delete mode 100644 src/screens/ImageViewer/hooks/useDoubleTapToZoom.ts delete mode 100644 src/screens/ImageViewer/hooks/useImageIndexChange.ts delete mode 100644 src/screens/ImageViewer/hooks/usePanResponder.ts delete mode 100644 src/screens/ImageViewer/hooks/useRequestClose.ts delete mode 100644 src/screens/ImageViewer/utils.ts diff --git a/package.json b/package.json index 7f88d524..4281b154 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "react-native-language-detection": "^0.1.0", "react-native-pager-view": "^5.4.25", "react-native-reanimated": "^2.9.1", + "react-native-reanimated-zoom": "^0.3.0", "react-native-safe-area-context": "^4.3.1", "react-native-screens": "^3.16.0", "react-native-share-menu": "^6.0.0", diff --git a/src/components/GracefullyImage.tsx b/src/components/GracefullyImage.tsx index 01db6c04..5afcbff6 100644 --- a/src/components/GracefullyImage.tsx +++ b/src/components/GracefullyImage.tsx @@ -67,9 +67,7 @@ const GracefullyImage = ({ const onLoad = () => { setImageLoaded(true) if (setImageDimensions && source.uri) { - Image.getSize(source.uri, (width, height) => - setImageDimensions({ width, height }) - ) + Image.getSize(source.uri, (width, height) => setImageDimensions({ width, height })) } } const onError = () => { @@ -81,22 +79,9 @@ const GracefullyImage = ({ const blurhashView = useMemo(() => { if (hidden || !imageLoaded) { if (blurhash) { - return ( - - ) + return } else { - return ( - - ) + return } } else { return null @@ -105,26 +90,17 @@ const GracefullyImage = ({ return ( @@ -161,66 +172,71 @@ const ScreenImagesViewer = ({ onPress={onPress} /> - { - analytics('imageviewer_more_press') - showActionSheetWithOptions( - { - options: [ - t('content.options.save'), - t('content.options.share'), - t('content.options.cancel') - ], - cancelButtonIndex: 2, - userInterfaceStyle: mode - }, - async buttonIndex => { - switch (buttonIndex) { - case 0: - analytics('imageviewer_more_save_press') - saveImage({ - messageRef, - theme, - image: imageUrls[currentIndex] - }) - break - case 1: - analytics('imageviewer_more_share_press') - switch (Platform.OS) { - case 'ios': - await Share.share({ url: imageUrls[currentIndex].url }) - break - case 'android': - await Share.share({ - message: imageUrls[currentIndex].url - }) - break - } - break - } - } - ) - }} + navigation.goBack()} > - item.id} - renderItem={renderItem} - onViewableItemsChanged={onViewableItemsChanged} - viewabilityConfig={{ - itemVisiblePercentThreshold: 50 + { + analytics('imageviewer_more_press') + showActionSheetWithOptions( + { + options: [ + t('content.options.save'), + t('content.options.share'), + t('content.options.cancel') + ], + cancelButtonIndex: 2, + userInterfaceStyle: mode + }, + async buttonIndex => { + switch (buttonIndex) { + case 0: + analytics('imageviewer_more_save_press') + saveImage({ + messageRef, + theme, + image: imageUrls[currentIndex] + }) + break + case 1: + analytics('imageviewer_more_share_press') + switch (Platform.OS) { + case 'ios': + await Share.share({ url: imageUrls[currentIndex].url }) + break + case 'android': + await Share.share({ + message: imageUrls[currentIndex].url + }) + break + } + break + } + } + ) }} - initialScrollIndex={initialIndex} - getItemLayout={(_, index) => ({ - length: SCREEN_WIDTH, - offset: SCREEN_WIDTH * index, - index - })} - /> - + > + item.id} + renderItem={renderItem} + onViewableItemsChanged={onViewableItemsChanged} + viewabilityConfig={{ + itemVisiblePercentThreshold: 50 + }} + initialScrollIndex={initialIndex} + getItemLayout={(_, index) => ({ + length: SCREEN_WIDTH, + offset: SCREEN_WIDTH * index, + index + })} + /> + + ) From 29b39ea5ac94e32898d9c75d2af1bd1402db521e Mon Sep 17 00:00:00 2001 From: xmflsct Date: Wed, 14 Sep 2022 22:47:38 +0200 Subject: [PATCH 7/8] New Crowdin updates (#380) * New translations instance.json (German) * New translations timeline.json (Japanese) * New translations instance.json (Italian) * New translations instance.json (Japanese) * New translations instance.json (Korean) * New translations instance.json (Chinese Simplified) * New translations instance.json (Vietnamese) * New translations instance.json (Portuguese, Brazilian) * New translations relationship.json (Japanese) * New translations contextMenu.json (Japanese) * New translations announcements.json (Japanese) * New translations compose.json (Japanese) * New translations actions.json (Japanese) * New translations imageViewer.json (Japanese) * New translations tabs.json (Japanese) * New translations common.json (Japanese) * New translations instance.json (German) * New translations timeline.json (Japanese) * New translations instance.json (Italian) * New translations instance.json (Japanese) * New translations instance.json (Korean) * New translations instance.json (Chinese Simplified) * New translations instance.json (Vietnamese) * New translations instance.json (Portuguese, Brazilian) * New translations contextMenu.json (Japanese) * New translations compose.json (Japanese) * New translations tabs.json (Japanese) * New translations announcements.json (Japanese) * New translations imageViewer.json (Japanese) * New translations common.json (Japanese) * New translations contextMenu.json (German) * New translations contextMenu.json (Italian) * New translations accountSelection.json (Italian) * New translations contextMenu.json (Portuguese, Brazilian) * New translations accountSelection.json (Portuguese, Brazilian) * New translations contextMenu.json (Japanese) --- src/i18n/de/components/contextMenu.json | 6 +++--- src/i18n/it/components/contextMenu.json | 2 +- src/i18n/it/screens/accountSelection.json | 4 ++-- src/i18n/ja/common.json | 2 +- src/i18n/ja/components/contextMenu.json | 8 ++++---- src/i18n/ja/components/relationship.json | 6 +++--- src/i18n/ja/components/timeline.json | 6 +++--- src/i18n/ja/screens/actions.json | 4 ++-- src/i18n/ja/screens/compose.json | 6 +++--- src/i18n/ja/screens/tabs.json | 11 ++++++----- src/i18n/pt_BR/components/contextMenu.json | 2 +- src/i18n/pt_BR/screens/accountSelection.json | 4 ++-- 12 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/i18n/de/components/contextMenu.json b/src/i18n/de/components/contextMenu.json index fac251f1..d83f947b 100644 --- a/src/i18n/de/components/contextMenu.json +++ b/src/i18n/de/components/contextMenu.json @@ -4,7 +4,7 @@ "title": "Benutzeraktionen", "mute": { "action_false": "Profil stummschalten", - "action_true": "" + "action_true": "Stummschaltung Nutzers aufheben" }, "block": { "action_false": "Nutzer blockieren", @@ -16,7 +16,7 @@ }, "copy": { "action": "", - "succeed": "" + "succeed": "Kopiert" }, "instance": { "title": "", @@ -65,7 +65,7 @@ } }, "mute": { - "action_false": "", + "action_false": "Diesen Tröt sowie die Antworten stummschalten", "action_true": "" }, "pin": { diff --git a/src/i18n/it/components/contextMenu.json b/src/i18n/it/components/contextMenu.json index 0c4b851c..abfcd532 100644 --- a/src/i18n/it/components/contextMenu.json +++ b/src/i18n/it/components/contextMenu.json @@ -16,7 +16,7 @@ }, "copy": { "action": "", - "succeed": "" + "succeed": "Copiato" }, "instance": { "title": "Azione sull'istanza", diff --git a/src/i18n/it/screens/accountSelection.json b/src/i18n/it/screens/accountSelection.json index b16795a6..770adb7a 100644 --- a/src/i18n/it/screens/accountSelection.json +++ b/src/i18n/it/screens/accountSelection.json @@ -1,6 +1,6 @@ { - "heading": "", + "heading": "Condividi con...", "content": { - "select_account": "" + "select_account": "Seleziona conto" } } \ No newline at end of file diff --git a/src/i18n/ja/common.json b/src/i18n/ja/common.json index f6541c23..c0702a88 100644 --- a/src/i18n/ja/common.json +++ b/src/i18n/ja/common.json @@ -15,7 +15,7 @@ "message": "" }, "error": { - "message": "{{function}} に失敗しました。もういちどお試しください。" + "message": "{{function}} 接続に失敗しました。再試行してください。" } }, "separator": ", " diff --git a/src/i18n/ja/components/contextMenu.json b/src/i18n/ja/components/contextMenu.json index 2f8dcf94..95dbc129 100644 --- a/src/i18n/ja/components/contextMenu.json +++ b/src/i18n/ja/components/contextMenu.json @@ -1,5 +1,5 @@ { - "accessibilityHint": "", + "accessibilityHint": "このトゥートへのアクション、投稿されたユーザー、トゥート自体など", "account": { "title": "ユーザーアクション", "mute": { @@ -23,7 +23,7 @@ "block": { "action": "インスタンスをブロック {{instance}}", "alert": { - "title": "インスタンス {{instance}} をブロックしますか?", + "title": "インスタンス {{instance}} をブロックしますか?", "message": "ほとんどの場合、特定のユーザーをミュートまたはブロックすることができます。\n\nインスタンスをブロックすると、このインスタンスからフォロワーを含むすべてのコンテンツが削除されます!", "buttons": { "confirm": "確定" @@ -47,7 +47,7 @@ "delete": { "action": "トゥートを削除", "alert": { - "title": "削除しますか?", + "title": "削除しますか?", "message": "この投稿へのすべてのお気に入り登録やブーストは消去され、すべての返信は孤立することになります。", "buttons": { "confirm": "確定" @@ -57,7 +57,7 @@ "deleteEdit": { "action": "トゥートを削除し、再投稿する", "alert": { - "title": "削除して再投稿しますか?", + "title": "削除して再投稿しますか?", "message": "この投稿へのすべてのお気に入り登録やブーストは消去され、すべての返信は孤立することになります。", "buttons": { "confirm": "確定" diff --git a/src/i18n/ja/components/relationship.json b/src/i18n/ja/components/relationship.json index b97342a9..2392b7ae 100644 --- a/src/i18n/ja/components/relationship.json +++ b/src/i18n/ja/components/relationship.json @@ -7,10 +7,10 @@ }, "button": { "error": "読み込みエラー", - "blocked_by": "ブロックされてます", + "blocked_by": "ユーザーによってブロック", "blocking": "ブロックを解除", - "following": "フォローを解除", - "requested": "リクエストを取り消す", + "following": "フォローをやめる", + "requested": "リクエストを削除", "default": "フォロー" } } \ No newline at end of file diff --git a/src/i18n/ja/components/timeline.json b/src/i18n/ja/components/timeline.json index 077114dc..35bb6170 100644 --- a/src/i18n/ja/components/timeline.json +++ b/src/i18n/ja/components/timeline.json @@ -37,7 +37,7 @@ "accessibilityLabel": "このトゥートに返信" }, "reblogged": { - "accessibilityLabel": "このトゥートをブーストしますか?", + "accessibilityLabel": "このトゥートをブーストしますか?", "function": "トゥートをブースト" }, "favourited": { @@ -128,8 +128,8 @@ "poll": { "meta": { "button": { - "vote": "投票", - "refresh": "更新" + "vote": "回答", + "refresh": "再読み込み" }, "count": { "voters_one": "{{count}} 人が投票", diff --git a/src/i18n/ja/screens/actions.json b/src/i18n/ja/screens/actions.json index ece927fd..d407ed96 100644 --- a/src/i18n/ja/screens/actions.json +++ b/src/i18n/ja/screens/actions.json @@ -4,7 +4,7 @@ "heading": "代替テキスト" }, "notificationsFilter": { - "heading": "表示する通知の種類", + "heading": "通知の種類を表示", "content": { "follow": "$t(screenTabs:me.push.follow.heading)", "follow_request": "フォローリクエスト", @@ -13,7 +13,7 @@ "mention": "$t(screenTabs:me.push.mention.heading)", "poll": "$t(screenTabs:me.push.poll.heading)", "status": "購読中のユーザーからのトゥート", - "update": "編集されたリブログ" + "update": "リブログが編集されました" } } } diff --git a/src/i18n/ja/screens/compose.json b/src/i18n/ja/screens/compose.json index 4d3b2b36..5caeff56 100644 --- a/src/i18n/ja/screens/compose.json +++ b/src/i18n/ja/screens/compose.json @@ -3,7 +3,7 @@ "left": { "button": "キャンセル", "alert": { - "title": "編集をキャンセルしますか?", + "title": "編集をキャンセルしますか?", "buttons": { "save": "下書きを保存", "delete": "下書きを削除", @@ -27,7 +27,7 @@ }, "removeReply": { "title": "返信されたトゥートが見つかりませんでした", - "description": "返信されたトゥートが削除された可能性があります。参照から削除しますか?", + "description": "返信されたトゥートが削除された可能性があります。参照から削除しますか?", "cancel": "$t(common:buttons.cancel)", "confirm": "参照を削除" } @@ -42,7 +42,7 @@ "placeholder": "注意書き" }, "textInput": { - "placeholder": "今なにかんがえてるの?", + "placeholder": "今なにかんがえてるの?", "keyboardImage": { "exceedMaximum": { "title": "アップロードできるメディアの数の上限に達しました", diff --git a/src/i18n/ja/screens/tabs.json b/src/i18n/ja/screens/tabs.json index b8d9d635..56847216 100644 --- a/src/i18n/ja/screens/tabs.json +++ b/src/i18n/ja/screens/tabs.json @@ -90,7 +90,7 @@ "profile": { "cancellation": { "title": "変更を破棄", - "message": "変更は保存されていません。変更の保存を破棄しますか?", + "message": "変更は保存されていません。変更の保存を破棄しますか?", "buttons": { "cancel": "$t(common:buttons.cancel)", "discard": "破棄" @@ -113,7 +113,7 @@ "description": "1500x1500pxまで縮小されます" }, "note": { - "title": "プロフィール説明文" + "title": "プロフィール補足情報" }, "fields": { "title": "プロフィール補足情報", @@ -208,7 +208,7 @@ "logout": { "button": "ログアウト", "alert": { - "title": "ログアウトしますか?", + "title": "ログアウトしますか?", "message": "ログアウトすると、再度ログインする必要があります", "buttons": { "logout": "ログアウト", @@ -299,7 +299,8 @@ "summary": { "statuses_count": "{{count}} 投稿", "following_count": "$t(shared.users.accounts.following)", - "followers_count": "$t(shared.users.accounts.followers)" }, + "followers_count": "$t(shared.users.accounts.followers)" + }, "toots": { "default": "投稿", "all": "投稿と返信" @@ -311,7 +312,7 @@ "search": { "header": { "prefix": "検索", - "placeholder": "検索したいことは…?" + "placeholder": "検索したいことは…?" }, "empty": { "general": "検索キーワードを入力して$t(screenTabs:shared.search.sections.accounts)$t(screenTabs:shared.search.sections.hashtags) または $t(screenTabs:shared.search.sections.statuses)を検索", diff --git a/src/i18n/pt_BR/components/contextMenu.json b/src/i18n/pt_BR/components/contextMenu.json index 87bc4c52..82634dde 100644 --- a/src/i18n/pt_BR/components/contextMenu.json +++ b/src/i18n/pt_BR/components/contextMenu.json @@ -16,7 +16,7 @@ }, "copy": { "action": "", - "succeed": "" + "succeed": "Copiado" }, "instance": { "title": "Ação da Instância", diff --git a/src/i18n/pt_BR/screens/accountSelection.json b/src/i18n/pt_BR/screens/accountSelection.json index b16795a6..028754ab 100644 --- a/src/i18n/pt_BR/screens/accountSelection.json +++ b/src/i18n/pt_BR/screens/accountSelection.json @@ -1,6 +1,6 @@ { - "heading": "", + "heading": "Compartilhar com ...", "content": { - "select_account": "" + "select_account": "Selecione a conta" } } \ No newline at end of file From 535268c680488d764d92f5332d7592d0a0893e21 Mon Sep 17 00:00:00 2001 From: xmflsct Date: Wed, 14 Sep 2022 23:04:35 +0200 Subject: [PATCH 8/8] Added Japanese --- README.md | 7 +++++++ fastlane/Deliverfile | 2 +- src/i18n/i18n.ts | 7 ++++++- src/i18n/ja/_all.ts | 18 ++++++++++++++++++ src/i18n/locales.ts | 1 + 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/i18n/ja/_all.ts diff --git a/README.md b/README.md index 0e64ec9f..dd99cf9d 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,19 @@ ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/tooot-app/app/build) ![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/tooot-app/app/build/candidate?label=build%20candidate) ![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/tooot-app/app/build/release?label=build%20release) +## Contribute to translation + +Please **do not** create a pull request to update translation. tooot's translation is managed through [https://crowdin.tooot.app/](https://crowdin.tooot.app/) and Crowdin struggles to properly sync two ways. If there is a minor update and you do not want to register an account on Crowdin, please open an issue. + + ## Special thanks [@forenta](https://github.com/forenta) for German translation [@andrigamerita](https://github.com/andrigamerita) for Italian translation +[@Hikaru](https://github.com/Hikali-47041) and [@la_la](https://mstdn.jp/@la_la_la) for Japanese translation + [@hellojaccc](https://github.com/hellojaccc) for Korean translation [@luizpicolo](https://github.com/luizpicolo) for Brazilian Portuguese diff --git a/fastlane/Deliverfile b/fastlane/Deliverfile index 30cb08e4..e86817ae 100644 --- a/fastlane/Deliverfile +++ b/fastlane/Deliverfile @@ -1,4 +1,4 @@ -languages(['zh-Hans', 'vi', 'ko', 'en-US', 'de-DE']) +languages(['de-DE', 'en-US', 'it', 'ko', 'pt-BR', 'vi', 'zh-Hans']) name({ 'default' => "tooot" diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts index 37ace006..1991c2c3 100644 --- a/src/i18n/i18n.ts +++ b/src/i18n/i18n.ts @@ -4,6 +4,7 @@ import { initReactI18next } from 'react-i18next' import de from '@root/i18n/de/_all' import en from '@root/i18n/en/_all' import it from '@root/i18n/it/_all' +import ja from '@root/i18n/ja/_all' import ko from '@root/i18n/ko/_all' import pt_BR from '@root/i18n/pt_BR/_all' import vi from '@root/i18n/vi/_all' @@ -16,6 +17,7 @@ import '@formatjs/intl-pluralrules/polyfill' import '@formatjs/intl-pluralrules/locale-data/de' import '@formatjs/intl-pluralrules/locale-data/en' import '@formatjs/intl-pluralrules/locale-data/it' +import '@formatjs/intl-pluralrules/locale-data/ja' import '@formatjs/intl-pluralrules/locale-data/ko' import '@formatjs/intl-pluralrules/locale-data/pt' import '@formatjs/intl-pluralrules/locale-data/vi' @@ -25,6 +27,7 @@ import '@formatjs/intl-numberformat/polyfill' import '@formatjs/intl-numberformat/locale-data/de' import '@formatjs/intl-numberformat/locale-data/en' import '@formatjs/intl-numberformat/locale-data/it' +import '@formatjs/intl-numberformat/locale-data/ja' import '@formatjs/intl-numberformat/locale-data/ko' import '@formatjs/intl-numberformat/locale-data/pt' import '@formatjs/intl-numberformat/locale-data/vi' @@ -34,6 +37,7 @@ import '@formatjs/intl-datetimeformat/polyfill' import '@formatjs/intl-datetimeformat/locale-data/de' import '@formatjs/intl-datetimeformat/locale-data/en' import '@formatjs/intl-datetimeformat/locale-data/it' +import '@formatjs/intl-datetimeformat/locale-data/ja' import '@formatjs/intl-datetimeformat/locale-data/ko' import '@formatjs/intl-datetimeformat/locale-data/pt' import '@formatjs/intl-datetimeformat/locale-data/vi' @@ -44,6 +48,7 @@ import '@formatjs/intl-relativetimeformat/polyfill' import '@formatjs/intl-relativetimeformat/locale-data/de' import '@formatjs/intl-relativetimeformat/locale-data/en' import '@formatjs/intl-relativetimeformat/locale-data/it' +import '@formatjs/intl-relativetimeformat/locale-data/ja' import '@formatjs/intl-relativetimeformat/locale-data/ko' import '@formatjs/intl-relativetimeformat/locale-data/pt' import '@formatjs/intl-relativetimeformat/locale-data/vi' @@ -56,7 +61,7 @@ i18n.use(initReactI18next).init({ ns: ['common'], defaultNS: 'common', - resources: { 'zh-Hans': zh_Hans, vi, 'pt-BR': pt_BR, ko, it, en, de }, + resources: { de, en, it, ja, ko, 'pt-BR': pt_BR, vi, 'zh-Hans': zh_Hans }, returnEmptyString: false, saveMissing: true, diff --git a/src/i18n/ja/_all.ts b/src/i18n/ja/_all.ts new file mode 100644 index 00000000..5f2a7a82 --- /dev/null +++ b/src/i18n/ja/_all.ts @@ -0,0 +1,18 @@ +export default { + common: require('./common'), + + screens: require('./screens'), + screenActions: require('./screens/actions'), + screenAnnouncements: require('./screens/announcements'), + screenCompose: require('./screens/compose'), + screenImageViewer: require('./screens/imageViewer'), + screenTabs: require('./screens/tabs'), + + componentContextMenu: require('./components/contextMenu'), + componentEmojis: require('./components/emojis'), + componentInstance: require('./components/instance'), + componentMediaSelector: require('./components/mediaSelector'), + componentParse: require('./components/parse'), + componentRelationship: require('./components/relationship'), + componentTimeline: require('./components/timeline') +} diff --git a/src/i18n/locales.ts b/src/i18n/locales.ts index d9d4f560..af9769b3 100644 --- a/src/i18n/locales.ts +++ b/src/i18n/locales.ts @@ -2,6 +2,7 @@ const LOCALES = { de: 'Deutsch', en: 'English', it: 'Italiano', + ja: '日本語', ko: '한국어', 'pt-BR': 'Português (Brasil)', vi: 'Tiếng Việt',