From 88e6d1dd0e85925598a3785900300d7d11d4c2e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=85=E5=9D=82=E6=9F=9A=E6=9C=88?= Date: Sun, 8 Mar 2026 13:31:23 +0900 Subject: [PATCH 1/2] feat(i18n): add comprehensive Japanese (ja-JP) localization --- client/i18next.config.ts | 1 + client/src/i18n/locales/en/translation.json | 3 +- client/src/i18n/locales/es/translation.json | 3 +- .../locales/ja/components/admin/common.json | 12 +++ .../locales/ja/components/admin/modals.json | 8 ++ .../locales/ja/components/admin/selector.json | 7 ++ .../ja/components/admin/tabs/apiKeys.json | 33 +++++++ .../ja/components/admin/tabs/dashboard.json | 31 +++++++ .../ja/components/admin/tabs/shares.json | 49 ++++++++++ .../ja/components/admin/tabs/snippets.json | 57 ++++++++++++ .../ja/components/admin/tabs/users.json | 63 +++++++++++++ .../src/i18n/locales/ja/components/auth.json | 90 ++++++++++++++++++ .../locales/ja/components/categories.json | 12 +++ .../locales/ja/components/common/buttons.json | 56 +++++++++++ .../ja/components/common/dropdowns.json | 6 ++ .../ja/components/common/markdown.json | 15 +++ .../locales/ja/components/common/modals.json | 7 ++ .../i18n/locales/ja/components/search.json | 30 ++++++ .../i18n/locales/ja/components/settings.json | 93 +++++++++++++++++++ .../locales/ja/components/snippets/edit.json | 57 ++++++++++++ .../locales/ja/components/snippets/embed.json | 26 ++++++ .../components/snippets/list/snippetCard.json | 37 ++++++++ .../snippets/list/snippetCardMenu.json | 11 +++ .../components/snippets/list/snippetList.json | 3 + .../snippets/list/snippetRecycleCardMenu.json | 4 + .../locales/ja/components/snippets/share.json | 48 ++++++++++ .../ja/components/snippets/view/all.json | 29 ++++++ .../ja/components/snippets/view/common.json | 56 +++++++++++ .../ja/components/snippets/view/public.json | 18 ++++ .../ja/components/snippets/view/recycle.json | 37 ++++++++ .../src/i18n/locales/ja/components/utils.json | 9 ++ client/src/i18n/locales/ja/translation.json | 52 +++++++++++ client/src/i18n/locales/ru/translation.json | 3 +- client/src/i18n/resources/index.ts | 3 + client/src/i18n/resources/ja.ts | 61 ++++++++++++ client/src/i18n/types.ts | 1 + 36 files changed, 1028 insertions(+), 3 deletions(-) create mode 100644 client/src/i18n/locales/ja/components/admin/common.json create mode 100644 client/src/i18n/locales/ja/components/admin/modals.json create mode 100644 client/src/i18n/locales/ja/components/admin/selector.json create mode 100644 client/src/i18n/locales/ja/components/admin/tabs/apiKeys.json create mode 100644 client/src/i18n/locales/ja/components/admin/tabs/dashboard.json create mode 100644 client/src/i18n/locales/ja/components/admin/tabs/shares.json create mode 100644 client/src/i18n/locales/ja/components/admin/tabs/snippets.json create mode 100644 client/src/i18n/locales/ja/components/admin/tabs/users.json create mode 100644 client/src/i18n/locales/ja/components/auth.json create mode 100644 client/src/i18n/locales/ja/components/categories.json create mode 100644 client/src/i18n/locales/ja/components/common/buttons.json create mode 100644 client/src/i18n/locales/ja/components/common/dropdowns.json create mode 100644 client/src/i18n/locales/ja/components/common/markdown.json create mode 100644 client/src/i18n/locales/ja/components/common/modals.json create mode 100644 client/src/i18n/locales/ja/components/search.json create mode 100644 client/src/i18n/locales/ja/components/settings.json create mode 100644 client/src/i18n/locales/ja/components/snippets/edit.json create mode 100644 client/src/i18n/locales/ja/components/snippets/embed.json create mode 100644 client/src/i18n/locales/ja/components/snippets/list/snippetCard.json create mode 100644 client/src/i18n/locales/ja/components/snippets/list/snippetCardMenu.json create mode 100644 client/src/i18n/locales/ja/components/snippets/list/snippetList.json create mode 100644 client/src/i18n/locales/ja/components/snippets/list/snippetRecycleCardMenu.json create mode 100644 client/src/i18n/locales/ja/components/snippets/share.json create mode 100644 client/src/i18n/locales/ja/components/snippets/view/all.json create mode 100644 client/src/i18n/locales/ja/components/snippets/view/common.json create mode 100644 client/src/i18n/locales/ja/components/snippets/view/public.json create mode 100644 client/src/i18n/locales/ja/components/snippets/view/recycle.json create mode 100644 client/src/i18n/locales/ja/components/utils.json create mode 100644 client/src/i18n/locales/ja/translation.json create mode 100644 client/src/i18n/resources/ja.ts diff --git a/client/i18next.config.ts b/client/i18next.config.ts index b3298b95..354cd2b0 100644 --- a/client/i18next.config.ts +++ b/client/i18next.config.ts @@ -7,6 +7,7 @@ export default defineConfig({ Locale.en, Locale.ru, Locale.es, + Locale.ja, ], extract: { input: 'src/**/*.{js,jsx,ts,tsx}', diff --git a/client/src/i18n/locales/en/translation.json b/client/src/i18n/locales/en/translation.json index 82e2feb7..a94474f0 100644 --- a/client/src/i18n/locales/en/translation.json +++ b/client/src/i18n/locales/en/translation.json @@ -24,7 +24,8 @@ "locale": { "en": "English", "es": "Spanish", - "ru": "Russian" + "ru": "Russian", + "ja": "Japanese" }, "no": "no", "or": "or", diff --git a/client/src/i18n/locales/es/translation.json b/client/src/i18n/locales/es/translation.json index e1044160..c95701b2 100644 --- a/client/src/i18n/locales/es/translation.json +++ b/client/src/i18n/locales/es/translation.json @@ -24,7 +24,8 @@ "locale": { "en": "Inglés", "es": "Español", - "ru": "Ruso" + "ru": "Ruso", + "ja": "Japonés" }, "no": "no", "or": "o", diff --git a/client/src/i18n/locales/ja/components/admin/common.json b/client/src/i18n/locales/ja/components/admin/common.json new file mode 100644 index 00000000..ef5c4441 --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/common.json @@ -0,0 +1,12 @@ +{ + "adminTable": { + "defaultEmptyMessage": "データが見つかりません", + "defaultLoadingMessage": "読み込み中..." + }, + "filterInput": { + "defaultPlaceholder": "検索..." + }, + "filterSelect": { + "defaultPlaceholder": "選択..." + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/admin/modals.json b/client/src/i18n/locales/ja/components/admin/modals.json new file mode 100644 index 00000000..c0a60497 --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/modals.json @@ -0,0 +1,8 @@ +{ + "snippetViewModal": { + "error": { + "failedLoad": "スニペットの読み込みに失敗しました" + }, + "title": "スニペットを読み込み中..." + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/admin/selector.json b/client/src/i18n/locales/ja/components/admin/selector.json new file mode 100644 index 00000000..79699f74 --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/selector.json @@ -0,0 +1,7 @@ +{ + "apiKeys": "APIキー", + "dashboard": "ダッシュボード", + "shares": "共有", + "snippets": "スニペット", + "users": "ユーザー" +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/admin/tabs/apiKeys.json b/client/src/i18n/locales/ja/components/admin/tabs/apiKeys.json new file mode 100644 index 00000000..edee5a17 --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/tabs/apiKeys.json @@ -0,0 +1,33 @@ +{ + "apiKeyDeletedSuccessfully": "APIキーを削除しました", + "columns": { + "labels": { + "actions": "アクション", + "created": "作成日時", + "lastUsed": "最終使用日時", + "name": "名前", + "owner": "所有者", + "status": "ステータス" + } + }, + "confirmationModal": { + "message": "このAPIキーを削除してもよろしいですか?キーの所有者はAPIにアクセスできなくなります。この操作は取り消せません。", + "title": "APIキーを削除" + }, + "entityName_one": "APIキー", + "entityName_other": "APIキー", + "error": { + "default": "APIキーの削除に失敗しました" + }, + "filters": { + "userId": "ユーザーIDで絞り込み" + }, + "status": { + "active": "有効", + "inactive": "無効" + }, + "table": { + "emptyMessage": "APIキーが見つかりません", + "loadingMessage": "APIキーを読み込み中..." + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/admin/tabs/dashboard.json b/client/src/i18n/locales/ja/components/admin/tabs/dashboard.json new file mode 100644 index 00000000..b5cf17db --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/tabs/dashboard.json @@ -0,0 +1,31 @@ +{ + "card": { + "apiKeys": { + "title": "APIキー" + }, + "shares": { + "title": "共有" + }, + "snippets": { + "apiKeys": { + "active": "有効" + }, + "shares": { + "total": "合計" + }, + "title": "スニペット", + "viewType": { + "private": "非公開", + "public": "公開" + } + }, + "users": { + "authType": { + "internal": "内部", + "oidc": "OIDC" + }, + "title": "ユーザー" + } + }, + "loadingMessage": "統計を読み込み中..." +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/admin/tabs/shares.json b/client/src/i18n/locales/ja/components/admin/tabs/shares.json new file mode 100644 index 00000000..d753ac26 --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/tabs/shares.json @@ -0,0 +1,49 @@ +{ + "action": { + "copyShareLink": "共有リンクをコピー", + "delete": "共有を削除", + "viewSnippet": "スニペットを表示" + }, + "columns": { + "labels": { + "actions": "アクション", + "auth": "認証必須", + "created": "作成日時", + "expires": "有効期限", + "id": "共有ID", + "owner": "所有者", + "title": "タイトル" + } + }, + "confirmationModal": { + "message": "この共有リンクを削除してもよろしいですか?リンクを持つ誰もスニペットにアクセスできなくなります。この操作は取り消せません。", + "title": "共有を削除" + }, + "entityName_one": "共有", + "entityName_other": "共有", + "error": { + "delete": { + "default": "共有の削除に失敗しました" + } + }, + "filters": { + "authType": { + "all": "すべての認証タイプ", + "public": "公開", + "requiresAuth": "認証必須" + }, + "userId": "ユーザーIDで絞り込み" + }, + "success": { + "copied": { + "default": "共有リンクをクリップボードにコピーしました" + }, + "delete": { + "default": "共有を削除しました" + } + }, + "table": { + "emptyMessage": "共有が見つかりません", + "loadingMessage": "共有を読み込み中..." + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/admin/tabs/snippets.json b/client/src/i18n/locales/ja/components/admin/tabs/snippets.json new file mode 100644 index 00000000..1c759c19 --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/tabs/snippets.json @@ -0,0 +1,57 @@ +{ + "action": { + "delete": "スニペットを削除", + "makePrivate": "非公開にする", + "makePublic": "公開する", + "scanForOffensiveContent": "不適切なコンテンツをスキャン", + "showAllSnippets": "すべてのスニペットを表示", + "viewSnippet": "スニペットを表示" + }, + "columns": { + "labels": { + "actions": "アクション", + "fragments": "フラグメント", + "owner": "所有者", + "title": "タイトル", + "updated": "更新日時", + "visibility": "公開状態" + } + }, + "confirmationModal": { + "message": "このスニペットを完全に削除してもよろしいですか?この操作は取り消せません。", + "title": "スニペットを削除" + }, + "containsOffensiveWords": "不適切な言葉を含んでいます: {{words}}", + "entityName_one": "スニペット", + "entityName_other": "スニペット", + "error": { + "delete": { + "default": "スニペットの削除に失敗しました" + }, + "update": { + "default": "スニペットの公開状態の更新に失敗しました" + } + }, + "filters": { + "search": "スニペットを検索...", + "userId": "ユーザーID", + "visibility": { + "all": "すべての公開状態", + "private": "非公開", + "public": "公開" + } + }, + "offensiveContentMessage": "不適切なコンテンツを含む{{total}}件の{{entityName}}が見つかりました", + "success": { + "delete": { + "default": "スニペットを削除しました" + }, + "update": { + "default": "スニペットの公開状態を更新しました" + } + }, + "table": { + "emptyMessage": "スニペットが見つかりません", + "loadingMessage": "スニペットを読み込み中..." + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/admin/tabs/users.json b/client/src/i18n/locales/ja/components/admin/tabs/users.json new file mode 100644 index 00000000..b540b4e2 --- /dev/null +++ b/client/src/i18n/locales/ja/components/admin/tabs/users.json @@ -0,0 +1,63 @@ +{ + "action": { + "activate": "ユーザーを有効化", + "deactivate": "ユーザーを無効化", + "delete": "ユーザーを削除" + }, + "columns": { + "labels": { + "actions": "アクション", + "apiKeysCount": "APIキー", + "authType": "認証タイプ", + "created": "作成日時", + "email": "メールアドレス", + "lastLogin": "最終ログイン", + "snippetsCount": "スニペット", + "status": "ステータス", + "username": "ユーザー名" + } + }, + "confirmationModal": { + "message": "このユーザーを削除してもよろしいですか?すべてのスニペット、APIキー、共有が完全に削除されます。この操作は取り消せません。", + "title": "ユーザーを削除" + }, + "entityName_one": "ユーザー", + "entityName_other": "ユーザー", + "error": { + "delete": { + "default": "ユーザーの削除に失敗しました" + }, + "update": { + "default": "ユーザーの更新に失敗しました" + } + }, + "filters": { + "authType": { + "all": "すべての認証タイプ", + "internal": "内部", + "oidc": "OIDC" + }, + "search": "ユーザーを検索...", + "status": { + "active": "有効", + "all": "すべてのステータス", + "inactive": "無効" + } + }, + "status": { + "active": "有効", + "inactive": "無効" + }, + "success": { + "delete": { + "default": "ユーザーを削除しました" + }, + "update": { + "default": "ユーザーのステータスを更新しました" + } + }, + "table": { + "emptyMessage": "ユーザーが見つかりません", + "loadingMessage": "ユーザーを読み込み中..." + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/auth.json b/client/src/i18n/locales/ja/components/auth.json new file mode 100644 index 00000000..90a1b22c --- /dev/null +++ b/client/src/i18n/locales/ja/components/auth.json @@ -0,0 +1,90 @@ +{ + "apiKeysModal": { + "created": "作成日時", + "createKey": "キーを作成", + "deleteApiKey": "APIキーを削除", + "enterKeyName": "キー名を入力", + "lastUsed": "最終使用日時", + "newApiKey": "新しいAPIキー(今すぐコピーしてください。再表示されません)", + "notApiKeys": "APIキーが見つかりません", + "title": "APIキー", + "yourApiKeys": "あなたのAPIキー" + }, + "authProvider": { + "error": { + "failedCreateAnonymousSession": "匿名セッションの初期化に失敗しました" + }, + "info": { + "logoutSuccess": "ログアウトしました" + } + }, + "changePasswordModal": { + "confirmNewPassword": "新しいパスワード(確認用)", + "currentPassword": "現在のパスワード", + "error": { + "default": "パスワードの変更に失敗しました", + "newPasswordMustBeAtLeastCharacters": "新しいパスワードは最低{{minLength}}文字以上である必要があります", + "newPasswordsDoNotMatch": "新しいパスワードが一致しません" + }, + "newPassword": "新しいパスワード", + "passwordChangedSuccessfully": "パスワードを変更しました", + "process": "パスワードを変更中...", + "title": "パスワードを変更" + }, + "login": { + "account": "アカウント", + "browsePublicSnippets": "公開スニペットを閲覧", + "create": "アカウントを作成", + "error": { + "invalidUsernameOrPassword": "ユーザー名またはパスワードが正しくありません" + }, + "orContinueWithPassword": "またはパスワードで続行", + "pleaseSignInToContinue": "続行するにはサインインしてください", + "signingIn": "サインイン中..." + }, + "oidc": { + "error": { + "auth_failed": "認証に失敗しました。ログイン試行がキャンセルされたか、セッションの有効期限が切れている可能性があります。もう一度お試しください。", + "config_error": "SSO設定でエラーが発生しました。管理者にお問い合わせください。", + "default": "認証中に予期しないエラーが発生しました。もう一度お試しください。", + "provider_error": "アイデンティティプロバイダーでエラーが発生したか、利用できません。後でもう一度お試しください、または管理者にお問い合わせください。", + "registration_disabled": "このByteStashインスタンスでは、新しいアカウントの登録が現在無効になっています。管理者にお問い合わせください。" + } + }, + "register": { + "browsePublicSnippets": "公開スニペットを閲覧", + "creatingAccount": "アカウントを作成中...", + "disabled": { + "description": "新しいアカウントの登録は現在無効になっています。", + "link": { + "text": "ログインに戻る" + }, + "title": "登録無効" + }, + "error": { + "default": "登録に失敗しました", + "passwordsDoNotMatch": "パスワードが一致しません" + }, + "firstAccountDescription": "これが作成される最初のアカウントです。既存のすべてのスニペットがこのアカウントに自動的に移行されます。", + "notAvailable": { + "description": "内部アカウント登録が無効になっており、SSOプロバイダーが設定されていません。管理者にお問い合わせください。", + "title": "登録利用不可" + }, + "signInToYourAccount": "アカウントにサインイン", + "title": "アカウントを作成" + }, + "signIn": { + "completing": "サインインを完了中...", + "with": "{{displayName}}でサインイン" + }, + "signOut": { + "completing": "サインアウトを完了中..." + }, + "userDropdown": { + "adminPanel": "管理パネル", + "apiKeys": "APIキー", + "changePassword": "パスワードを変更", + "signIn": "サインイン", + "signOut": "サインアウト" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/categories.json b/client/src/i18n/locales/ja/components/categories.json new file mode 100644 index 00000000..6f673a5d --- /dev/null +++ b/client/src/i18n/locales/ja/components/categories.json @@ -0,0 +1,12 @@ +{ + "categoryList": { + "moreCount": "他{{moreCount}}件", + "noData": "カテゴリなし", + "showLess": "折りたたむ" + }, + "categorySuggestions": { + "addNewLabel": "新規追加", + "placeholder": "カテゴリを検索...", + "title": "カテゴリ" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/common/buttons.json b/client/src/i18n/locales/ja/components/common/buttons.json new file mode 100644 index 00000000..7e8f474c --- /dev/null +++ b/client/src/i18n/locales/ja/components/common/buttons.json @@ -0,0 +1,56 @@ +{ + "copyButton": { + "title": "クリップボードにコピー" + }, + "downloadArchiveButton": { + "error": { + "failedDownload": "アーカイブのダウンロードに失敗しました" + }, + "fileLabel_one": "{{count, number}}ファイル", + "fileLabel_other": "{{count, number}}ファイル", + "label": "すべてダウンロード", + "success": { + "downloadedAll": "すべてのコードフラグメントをダウンロードしました" + }, + "title": "すべてのファイルをZIPアーカイブとしてダウンロード" + }, + "downloadButton": { + "error": { + "failedDownload": "ファイルのダウンロードに失敗しました" + }, + "success": { + "downloaded": "\"{{fileName}}\"をダウンロードしました" + }, + "title": "{{fileName}}をダウンロード", + "warning": { + "nothing": "ダウンロードするものがありません" + } + }, + "fileUploadButton": { + "error": { + "unknown": "不明なエラー" + }, + "info": { + "duplicateDetected": "重複ファイルが検出されました", + "duplicatesDetected_one": "{{count, number}}個の重複ファイルが検出されました", + "duplicatesDetected_other": "{{count, number}}個の重複ファイルが検出されました" + }, + "label": "コードファイルをアップロード", + "loadFromUrl": { + "contentMaxSizeError": "コンテンツサイズは{{max}}未満である必要があります", + "invalidUrl": "有効なURLを入力してください", + "label": "URLから読み込み", + "title": "URLからコードを読み込み(例: GitHubの生のリンク)" + }, + "success": { + "filesUploaded_one": "{{count, number}}個のファイルをアップロードしました", + "filesUploaded_other": "{{count, number}}個のファイルをアップロードしました", + "fileUploaded": "\"{{fileName}}\"をアップロードしました", + "someFilesUploaded": "{{total}}個のファイルのうち{{successCount}}個をアップロードしました" + }, + "title": "フラグメントを自動作成するためにコードファイルをアップロード" + }, + "rawButton": { + "title": "生データを開く" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/common/dropdowns.json b/client/src/i18n/locales/ja/components/common/dropdowns.json new file mode 100644 index 00000000..b7b1f774 --- /dev/null +++ b/client/src/i18n/locales/ja/components/common/dropdowns.json @@ -0,0 +1,6 @@ +{ + "baseDropdown": { + "addNewLabel": "新規追加", + "defaultPlaceholder": "値を選択または入力" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/common/markdown.json b/client/src/i18n/locales/ja/components/common/markdown.json new file mode 100644 index 00000000..8915d6bc --- /dev/null +++ b/client/src/i18n/locales/ja/components/common/markdown.json @@ -0,0 +1,15 @@ +{ + "mermaid": { + "copyCode": "Mermaidコードをコピー", + "downloadPNG": "PNGとしてダウンロード", + "downloadSVG": "SVGとしてダウンロード", + "exitFullscreen": "全画面を終了", + "fullscreen": "全画面", + "renderError": "Mermaidダイアグラムのレンダリングに失敗しました:", + "renderErrorFallback": "ダイアグラムのレンダリングエラー", + "resetView": "ビューをリセット", + "title": "Mermaidダイアグラム", + "zoomIn": "ズームイン", + "zoomOut": "ズームアウト" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/common/modals.json b/client/src/i18n/locales/ja/components/common/modals.json new file mode 100644 index 00000000..7435bdd4 --- /dev/null +++ b/client/src/i18n/locales/ja/components/common/modals.json @@ -0,0 +1,7 @@ +{ + "changelogModal": { + "error": { + "default": "変更ログの読み込みに失敗しました。後でもう一度お試しください。" + } + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/search.json b/client/src/i18n/locales/ja/components/search.json new file mode 100644 index 00000000..06f5e170 --- /dev/null +++ b/client/src/i18n/locales/ja/components/search.json @@ -0,0 +1,30 @@ +{ + "action": { + "clear": "検索をクリア", + "newSnippet": "新しいスニペット", + "openSettings": "設定を開く", + "recycleBin": "ゴミ箱", + "showAll": "すべて表示", + "showFavorites": "お気に入りを表示" + }, + "categories": { + "addNew": "新規追加", + "title": "カテゴリ" + }, + "defaultPlaceholder": "スニペットを検索...(#を入力して利用可能なすべてのカテゴリを表示)", + "filter": { + "language": { + "all": "すべての言語" + } + }, + "sort": { + "alphaAsc": "アルファベット順 A-Z", + "alphaDesc": "アルファベット順 Z-A", + "newestFirst": "新しい順", + "oldestFirst": "古い順" + }, + "view": { + "grid": "グリッド表示", + "list": "リスト表示" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/settings.json b/client/src/i18n/locales/ja/components/settings.json new file mode 100644 index 00000000..408ed28c --- /dev/null +++ b/client/src/i18n/locales/ja/components/settings.json @@ -0,0 +1,93 @@ +{ + "settingsModal": { + "block": { + "category": { + "expandCategories": { + "description": "カテゴリグループを自動的に展開", + "label": "カテゴリを展開" + }, + "showCategories": { + "description": "スニペットのカテゴリラベルを表示", + "label": "カテゴリを表示" + }, + "title": "カテゴリ" + }, + "dataManagement": { + "export": { + "label": "スニペットをエクスポート" + }, + "import": { + "errors": { + "failed": "\"{{title}}\"のインポートに失敗しました: {{error}}", + "occurred_one": "{{count, number}}件のエラーが発生しました", + "occurred_other": "{{count, number}}件のエラーが発生しました" + }, + "label": "スニペットをインポート", + "progress": "スニペットをインポート中..." + }, + "title": "データ管理" + }, + "locale": { + "title": "ロケール" + }, + "search": { + "includeCodeInSearch": { + "description": "タイトルだけでなくコード内容も検索", + "label": "検索にコードを含める" + }, + "title": "検索" + }, + "theme": { + "title": "テーマ" + }, + "view": { + "compactView": { + "description": "スニペットをよりコンパクトな形式で表示", + "label": "コンパクト表示" + }, + "previewLines": { + "description": "スニペットリストにコードのプレビューを表示", + "label": "コードプレビューを表示" + }, + "showCodePreview": { + "description": "プレビューに表示する最大行数(1-20)", + "label": "プレビュー行数" + }, + "showLineNumbers": { + "description": "コードブロックに行番号を表示", + "label": "行番号を表示" + }, + "title": "表示" + } + }, + "export": { + "error": { + "default": "スニペットのエクスポートに失敗しました", + "noSnippets": "エクスポート可能なスニペットがありません" + }, + "markdown": { + "error": { + "default": "Markdownのエクスポートに失敗しました" + }, + "success": { + "default": "Markdownのエクスポートが成功しました" + }, + "warning": { + "default": "エクスポート可能なスニペットがありません" + } + }, + "success": { + "default": "{{total}}件のスニペットをエクスポートしました" + } + }, + "import": { + "error": { + "default": "スニペットのインポートに失敗しました" + }, + "hasFailed": "{{succeeded}}件のスニペットをインポートしましたが、{{failed}}件失敗しました。詳細はコンソールを確認してください。", + "successOnly_one": "{{succeeded}}件のスニペットをインポートしました。設定を閉じて確認してください。", + "successOnly_other": "{{succeeded}}件のスニペットをインポートしました。設定を閉じて確認してください。" + }, + "title": "設定" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/edit.json b/client/src/i18n/locales/ja/components/snippets/edit.json new file mode 100644 index 00000000..add8a378 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/edit.json @@ -0,0 +1,57 @@ +{ + "editSnippetModal": { + "addSnippet": "新しいスニペットを追加", + "editSnippet": "スニペットを編集", + "error": { + "savingFailed": "スニペットの保存中にエラーが発生しました。もう一度お試しください。" + }, + "form": { + "categories": { + "counter": "{{categories}}/{{max}}カテゴリ", + "label": "カテゴリ(最大{{max}})", + "placeholder": "カテゴリを入力してEnterまたはカンマを押してください" + }, + "codeFragments": { + "add": "新しいフラグメントを追加", + "label": "コードフラグメント({{fragments}})" + }, + "description": { + "label": "説明", + "placeholder": "スニペットの簡単な説明を書いてください" + }, + "isPublic": { + "description": "公開スニペットは認証なしで誰でも閲覧できます", + "label": "スニペットを公開する" + }, + "title": { + "counter": "{{characters}}/{{max}}文字", + "label": "タイトル", + "placeholder": "スニペットのタイトルを入力してください(最大{{max}}文字)" + } + }, + "fragmentRequired": "少なくとも1つのコードフラグメントが必要です", + "mustHaveFileNames": "すべてのフラグメントにはファイル名が必要です", + "unsavedChanges": "保存されていない変更があります。閉じてもよろしいですか?" + }, + "fragmentEditor": { + "action": { + "collapse": "折りたたむ", + "delete": "削除", + "expand": "展開" + }, + "form": { + "fileName": { + "placeholder": "ファイル名" + }, + "language": { + "placeholder": "言語を選択", + "sections": { + "other": "その他", + "used": "使用済み" + } + } + }, + "moveDown": "下に移動", + "moveUp": "上に移動" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/embed.json b/client/src/i18n/locales/ja/components/snippets/embed.json new file mode 100644 index 00000000..b74acb58 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/embed.json @@ -0,0 +1,26 @@ +{ + "embedCopyButton": { + "title": "クリップボードにコピー" + }, + "embedModal": { + "form": { + "embedCode": "埋め込みコード", + "fragmentToShow": { + "all": "すべてのフラグメント", + "label": "表示するフラグメント(オプション)" + }, + "showDescription": "説明を表示", + "showFileHeaders": "ファイルヘッダーを表示", + "showPoweredBy": "\"Powered by ByteStash\"を表示", + "showTitle": "タイトルを表示", + "theme": "テーマ" + }, + "subTitle": "埋め込みをカスタマイズ", + "title": "スニペットを埋め込む" + }, + "embedView": { + "error": { + "default": "スニペットの読み込みに失敗しました" + } + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/list/snippetCard.json b/client/src/i18n/locales/ja/components/snippets/list/snippetCard.json new file mode 100644 index 00000000..aba15a4f --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/list/snippetCard.json @@ -0,0 +1,37 @@ +{ + "confirmationModalDelete": { + "confirmLabel": { + "isRecycleView": { + "false": "ゴミ箱に移動", + "true": "完全に削除" + } + }, + "message": { + "isRecycleView": { + "false": "\"{{title}}\"をゴミ箱に移動してもよろしいですか?", + "true": "\"{{title}}\"を完全に削除してもよろしいですか?この操作は取り消せません。" + } + }, + "title": { + "isRecycleView": { + "false": "ゴミ箱に移動", + "true": "削除の確認" + } + } + }, + "confirmationModalRestore": { + "message": "\"{{title}}\"を復元してもよろしいですか?", + "title": "復元の確認" + }, + "date": { + "ago": "{{date}}前", + "expiringSoon": "まもなく期限切れ", + "left": "残り{{date}}" + }, + "defaultDescription": "説明なし", + "defaultUpdateTime": "不明", + "favorite": "お気に入り", + "pinned": "固定", + "public": "公開", + "shared": "共有中" +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/list/snippetCardMenu.json b/client/src/i18n/locales/ja/components/snippets/list/snippetCardMenu.json new file mode 100644 index 00000000..fbdfe010 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/list/snippetCardMenu.json @@ -0,0 +1,11 @@ +{ + "addToFavorites": "お気に入りに追加", + "deleteSnippet": "スニペットを削除", + "duplicateSnippet": "スニペットを複製", + "editSnippet": "スニペットを編集", + "openInNewTab": "新しいタブで開く", + "pinSnippet": "スニペットを固定", + "removeFromFavorites": "お気に入りから削除", + "shareSnippet": "スニペットを共有", + "unpinSnippet": "固定を解除" +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/list/snippetList.json b/client/src/i18n/locales/ja/components/snippets/list/snippetList.json new file mode 100644 index 00000000..5615b0e8 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/list/snippetList.json @@ -0,0 +1,3 @@ +{ + "noSnippetsMatch": "検索条件に一致するスニペットがありません" +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/list/snippetRecycleCardMenu.json b/client/src/i18n/locales/ja/components/snippets/list/snippetRecycleCardMenu.json new file mode 100644 index 00000000..e4166c11 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/list/snippetRecycleCardMenu.json @@ -0,0 +1,4 @@ +{ + "deleteSnippet": "スニペットを削除", + "restoreSnippet": "スニペットを復元" +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/share.json b/client/src/i18n/locales/ja/components/snippets/share.json new file mode 100644 index 00000000..c6a1784a --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/share.json @@ -0,0 +1,48 @@ +{ + "sharedSnippetView": { + "browsePublicSnippets": "公開スニペットを閲覧", + "loadingSnippet": "スニペットを読み込み中...", + "snippetExpired": "この共有スニペットの有効期限が切れています", + "snippetNotFound": "スニペットが見つかりません" + }, + "shareMenu": { + "activeShareLinks": { + "buttons": { + "copy": "リンクをコピー", + "delete": "共有リンクを削除", + "requiresAuth": { + "false": "スニペットを埋め込む", + "true": "認証不要のスニペットのみ埋め込み可能" + } + }, + "date": { + "expired": "期限切れ", + "neverExpires": "有効期限なし" + }, + "noLinks": "有効な共有リンクなし", + "relativeExpiryTime": "{{date}}後に期限切れ", + "requiresAuth": { + "false": "公開アクセス", + "true": "保護済み - 認証が必要" + }, + "title": "有効な共有リンク" + }, + "createButtonText": "共有リンクを作成", + "error": { + "created": "共有リンクの作成に失敗しました", + "deleted": "共有リンクの削除に失敗しました", + "invalidDuration": "期間の形式が無効です。1h、2d、30mなどを使用してください。", + "load": "共有の読み込みに失敗しました", + "unknownExpiryTime": "有効期限が不明です" + }, + "expiresIn": "有効期限(例: 1h、2d、30m)", + "expiresInPlaceholder": "無期限", + "requiresAuth": "認証を要求", + "subTitle": "新しい共有リンクを作成", + "success": { + "created": "共有リンクを作成しました", + "deleted": "共有リンクを削除しました" + }, + "title": "スニペットを共有" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/view/all.json b/client/src/i18n/locales/ja/components/snippets/view/all.json new file mode 100644 index 00000000..984584a7 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/view/all.json @@ -0,0 +1,29 @@ +{ + "defaultUpdateTime": "不明", + "fullCodeView": { + "dateTimeAgo": "{{dateTime}}前", + "defaultDescription": "説明なし" + }, + "snippetModal": { + "confirmationModal": { + "confirmLabel": { + "isRecycleView": { + "false": "ゴミ箱に移動", + "true": "完全に削除" + } + }, + "message": { + "isRecycleView": { + "false": "\"{{title}}\"をゴミ箱に移動してもよろしいですか?", + "true": "\"{{title}}\"を完全に削除してもよろしいですか?この操作は取り消せません。" + } + }, + "title": { + "isRecycleView": { + "false": "ゴミ箱に移動", + "true": "削除の確認" + } + } + } + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/view/common.json b/client/src/i18n/locales/ja/components/snippets/view/common.json new file mode 100644 index 00000000..fa3763e0 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/view/common.json @@ -0,0 +1,56 @@ +{ + "authAwareSnippetView": { + "error": { + "snippetLoad": "スニペットの読み込みに失敗しました", + "snippetRequireAuth": "このスニペットを表示するには認証が必要です" + } + }, + "baseSnippetStorage": { + "error": { + "sessionExpired": "セッションの有効期限が切れました。再度サインインしてください。", + "snippetCreated": "スニペットの作成に失敗しました", + "snippetUpdated": "スニペットの更新に失敗しました" + }, + "success": { + "displayAll": "すべてのスニペットを表示中", + "displayFavorites": "お気に入りのスニペットを表示中", + "snippetCreated": "新しいスニペットを作成しました", + "snippetUpdated": "スニペットを更新しました" + } + }, + "browsePublicSnippets": "公開スニペットを閲覧", + "filter": { + "filteredByCategories": "カテゴリで絞り込み" + }, + "loadingSnippets": "スニペットを読み込み中...", + "signIn": "サインイン", + "sippetNotFound": "スニペットが見つかりません", + "snippetContentArea": { + "error": { + "duplicateSnippet": "スニペットの複製に失敗しました", + "loadSnippets": "スニペットの読み込みに失敗しました", + "moveSnippetToRecycleBin": "スニペットをゴミ箱に移動できませんでした。もう一度お試しください。", + "sessionExpired": "セッションの有効期限が切れました。再度サインインしてください。", + "updateFavoriteStatusAdded": "お気に入りのステータスを更新できませんでした。もう一度お試しください。", + "updateFavoriteStatusDeleted": "お気に入りのステータスを更新できませんでした。もう一度お試しください。", + "updatePinStatusAdded": "固定のステータスを更新できませんでした。もう一度お試しください。", + "updatePinStatusDeleted": "固定のステータスを更新できませんでした。もう一度お試しください。" + }, + "success": { + "duplicateSnippet": "スニペットを複製しました", + "moveSnippetToRecycleBin": "スニペットをゴミ箱に移動しました", + "updateFavoriteStatusAdded": "スニペットをお気に入りに追加しました", + "updateFavoriteStatusDeleted": "スニペットをお気に入りから削除しました", + "updatePinStatusAdded": "スニペットを固定しました", + "updatePinStatusDeleted": "スニペットの固定を解除しました" + } + }, + "storageHeader": { + "private": "非公開スニペットを表示しています。あなたのみがこれらのスニペットを表示・変更できます。", + "public": "公開スニペットを表示しています。これらのスニペットは読み取り専用で、誰でも閲覧できます。" + }, + "viewSwitch": { + "private": "非公開", + "public": "公開" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/view/public.json b/client/src/i18n/locales/ja/components/snippets/view/public.json new file mode 100644 index 00000000..fa027530 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/view/public.json @@ -0,0 +1,18 @@ +{ + "publicSnippetContentArea": { + "error": { + "addSnippetToCollection": "スニペットをコレクションに追加できませんでした", + "failedLoadSnippets": "公開スニペットの読み込みに失敗しました" + }, + "filter": { + "byCategories": "カテゴリで絞り込み" + }, + "info": { + "requireAuth": "このスニペットをコレクションに追加するにはサインインしてください" + }, + "loadingSnippets": "スニペットを読み込み中...", + "success": { + "addSnippetToCollection": "スニペットをコレクションに追加しました" + } + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/snippets/view/recycle.json b/client/src/i18n/locales/ja/components/snippets/view/recycle.json new file mode 100644 index 00000000..8ed843f2 --- /dev/null +++ b/client/src/i18n/locales/ja/components/snippets/view/recycle.json @@ -0,0 +1,37 @@ +{ + "recycleSnippetContentArea": { + "error": { + "deleteSnippet": "スニペットの削除に失敗しました", + "loadSnippets": "スニペットの読み込みに失敗しました", + "restoreSnippet": "スニペットの復元に失敗しました", + "sessionExpired": "セッションの有効期限が切れました。再度サインインしてください。" + }, + "filter": { + "byCategories": "カテゴリで絞り込み" + }, + "loadingSnippets": "スニペットを読み込み中...", + "success": { + "deleteSnippet": "スニペットを削除しました", + "restoreSnippet": "スニペットを復元しました" + } + }, + "recycleSnippetStorage": { + "backToSnippets": "スニペットに戻る", + "confirmationModal": { + "message": "ゴミ箱のすべてのスニペットを完全にクリアしてもよろしいですか?この操作は取り消せません。", + "title": "削除の確認" + }, + "description": "ゴミ箱のスニペットは30日後に完全に削除されます", + "error": { + "clear": "ゴミ箱をクリアできませんでした。もう一度お試しください。", + "sessionExpired": "セッションの有効期限が切れました。再度サインインしてください。" + }, + "info": { + "noSnippets": "クリアするゴミ箱のスニペットがありません" + }, + "recycleBin": "ゴミ箱", + "success": { + "clear": "ゴミ箱のすべてのスニペットをクリアしました" + } + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/components/utils.json b/client/src/i18n/locales/ja/components/utils.json new file mode 100644 index 00000000..2b37f122 --- /dev/null +++ b/client/src/i18n/locales/ja/components/utils.json @@ -0,0 +1,9 @@ +{ + "config": { + "caution": "注意", + "important": "重要", + "note": "注", + "tip": "ヒント", + "warning": "警告" + } +} \ No newline at end of file diff --git a/client/src/i18n/locales/ja/translation.json b/client/src/i18n/locales/ja/translation.json new file mode 100644 index 00000000..8f523fc8 --- /dev/null +++ b/client/src/i18n/locales/ja/translation.json @@ -0,0 +1,52 @@ +{ + "action": { + "addSnippet": "スニペットを追加", + "cancel": "キャンセル", + "changePassword": "パスワードを変更", + "clear": "クリア", + "clearAll": "すべてクリア", + "close": "閉じる", + "confirm": "確認", + "createAccount": "アカウントを作成", + "delete": "削除", + "edit": "編集", + "hidePassword": "パスワードを非表示", + "load": "読み込み", + "maximize": "最大化", + "minimize": "最小化", + "restore": "復元", + "save": "保存", + "showPassword": "パスワードを表示", + "signIn": "サインイン" + }, + "confirmPassword": "パスワード(確認用)", + "loading": "読み込み中...", + "locale": { + "en": "英語", + "es": "スペイン語", + "ru": "ロシア語", + "ja": "日本語" + }, + "no": "いいえ", + "or": "または", + "pagination": { + "next": "次へ", + "pageOf": "{{totalPages}}ページ中{{currentPage}}ページ目", + "previous": "前へ", + "total": "全{{total}}件", + "useSnippetPagination": { + "error": { + "failedSnippetsLoad": "スニペットの読み込みに失敗しました", + "sessionExpired": "セッションの有効期限が切れました。再度サインインしてください。" + } + } + }, + "password": "パスワード", + "showing": "表示中", + "theme": { + "dark": "ダーク", + "light": "ライト", + "system": "システム" + }, + "username": "ユーザー名" +} \ No newline at end of file diff --git a/client/src/i18n/locales/ru/translation.json b/client/src/i18n/locales/ru/translation.json index dca7e8be..fc1ac79f 100644 --- a/client/src/i18n/locales/ru/translation.json +++ b/client/src/i18n/locales/ru/translation.json @@ -24,7 +24,8 @@ "locale": { "en": "Английский", "es": "Испанский", - "ru": "Русский" + "ru": "Русский", + "ja": "Японский" }, "no": "нет", "or": "или", diff --git a/client/src/i18n/resources/index.ts b/client/src/i18n/resources/index.ts index 12ce06e5..7f354252 100644 --- a/client/src/i18n/resources/index.ts +++ b/client/src/i18n/resources/index.ts @@ -1,9 +1,12 @@ import { resources as enResources } from './en'; import { resources as ruResources } from './ru'; import { resources as esResources } from './es'; +import { resources as jaResources } from './ja'; + export const resources = { en: enResources, ru: ruResources, es: esResources, + ja: jaResources, }; \ No newline at end of file diff --git a/client/src/i18n/resources/ja.ts b/client/src/i18n/resources/ja.ts new file mode 100644 index 00000000..d4311b64 --- /dev/null +++ b/client/src/i18n/resources/ja.ts @@ -0,0 +1,61 @@ +import translation from '../locales/ja/translation.json' +import componentsAdminCommon from '../locales/ja/components/admin/common.json' +import componentsAdminModals from '../locales/ja/components/admin/modals.json' +import componentsAdminSelector from '../locales/ja/components/admin/selector.json' +import componentsAdminApiKeysTab from '../locales/ja/components/admin/tabs/apiKeys.json' +import componentsAdminUsersTab from '../locales/ja/components/admin/tabs/users.json' +import componentsAdminSharesTab from '../locales/ja/components/admin/tabs/shares.json' +import componentsAdminSnippetsTab from '../locales/ja/components/admin/tabs/snippets.json' +import componentsAdminDashboardTab from '../locales/ja/components/admin/tabs/dashboard.json' +import componentsAuth from '../locales/ja/components/auth.json' +import componentsCategories from '../locales/ja/components/categories.json' +import componentsCommonButtons from '../locales/ja/components/common/buttons.json' +import componentsCommonDropdowns from '../locales/ja/components/common/dropdowns.json' +import componentsCommonModals from '../locales/ja/components/common/modals.json' +import componentsSearch from '../locales/ja/components/search.json' +import componentsSettings from '../locales/ja/components/settings.json' +import componentsSnippetsEdit from '../locales/ja/components/snippets/edit.json' +import componentsSnippetsEmbed from '../locales/ja/components/snippets/embed.json' +import componentsSnippetsListSnippetCard from '../locales/ja/components/snippets/list/snippetCard.json' +import componentsSnippetsListSnippetCardMenu from '../locales/ja/components/snippets/list/snippetCardMenu.json' +import componentsSnippetsListSnippetList from '../locales/ja/components/snippets/list/snippetList.json' +import componentsSnippetsListSnippetRecycleCardMenu from '../locales/ja/components/snippets/list/snippetRecycleCardMenu.json' +import componentsSnippetsShare from '../locales/ja/components/snippets/share.json' +import componentsSnippetsViewAll from '../locales/ja/components/snippets/view/all.json' +import componentsSnippetsViewCommon from '../locales/ja/components/snippets/view/common.json' +import componentsSnippetsViewPublic from '../locales/ja/components/snippets/view/public.json' +import componentsSnippetsViewRecycle from '../locales/ja/components/snippets/view/recycle.json' +import componentsCommonMarkdown from '../locales/ja/components/common/markdown.json' +import componentsUtils from '../locales/ja/components/utils.json' + +export const resources = { + translation, + 'components/admin/common': componentsAdminCommon, + 'components/admin/modals': componentsAdminModals, + 'components/admin/selector': componentsAdminSelector, + 'components/admin/tabs/apiKeys': componentsAdminApiKeysTab, + 'components/admin/tabs/users': componentsAdminUsersTab, + 'components/admin/tabs/shares': componentsAdminSharesTab, + 'components/admin/tabs/snippets': componentsAdminSnippetsTab, + 'components/admin/tabs/dashboard': componentsAdminDashboardTab, + 'components/auth': componentsAuth, + 'components/categories': componentsCategories, + 'components/common/buttons': componentsCommonButtons, + 'components/common/dropdowns': componentsCommonDropdowns, + 'components/common/markdown': componentsCommonMarkdown, + 'components/common/modals': componentsCommonModals, + 'components/search': componentsSearch, + 'components/settings': componentsSettings, + 'components/snippets/edit': componentsSnippetsEdit, + 'components/snippets/embed': componentsSnippetsEmbed, + 'components/snippets/list/snippetCard': componentsSnippetsListSnippetCard, + 'components/snippets/list/snippetCardMenu': componentsSnippetsListSnippetCardMenu, + 'components/snippets/list/snippetList': componentsSnippetsListSnippetList, + 'components/snippets/list/snippetRecycleCardMenu': componentsSnippetsListSnippetRecycleCardMenu, + 'components/snippets/share': componentsSnippetsShare, + 'components/snippets/view/all': componentsSnippetsViewAll, + 'components/snippets/view/common': componentsSnippetsViewCommon, + 'components/snippets/view/public': componentsSnippetsViewPublic, + 'components/snippets/view/recycle': componentsSnippetsViewRecycle, + 'components/utils': componentsUtils, +}; \ No newline at end of file diff --git a/client/src/i18n/types.ts b/client/src/i18n/types.ts index f589ee30..6b33e7c7 100644 --- a/client/src/i18n/types.ts +++ b/client/src/i18n/types.ts @@ -2,4 +2,5 @@ export enum Locale { en = 'en', ru = 'ru', es = 'es', + ja = 'ja', } \ No newline at end of file From 31fc5ee99b203cdf56522a2d7ccb13c1ade8b9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=85=E5=9D=82=E6=9F=9A=E6=9C=88?= Date: Sun, 8 Mar 2026 23:17:17 +0900 Subject: [PATCH 2/2] [fix] Mistake of not including ja locale --- client/src/i18n/constants.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/i18n/constants.ts b/client/src/i18n/constants.ts index 752b869b..c5ea212f 100644 --- a/client/src/i18n/constants.ts +++ b/client/src/i18n/constants.ts @@ -4,6 +4,7 @@ export const LOCALE_ISO_CODES: Record = { [Locale.en]: 'en-US', [Locale.ru]: 'ru-RU', [Locale.es]: 'es-ES', + [Locale.ja]: 'ja-JP', }; export const DEFAULT_LOCALE: Locale = Locale.en; export const DEFAULT_LOCALE_ISO_CODE = LOCALE_ISO_CODES[Locale.en]; \ No newline at end of file