From 08f3928ebc317794f11a3a3a81e878f24cbde1e6 Mon Sep 17 00:00:00 2001 From: tanomitsu <64388900+tanomitsu@users.noreply.github.com> Date: Tue, 26 May 2026 15:28:29 +0900 Subject: [PATCH] feat: add Japanese (ja) localization - Add ja translations for common, settings, and chores namespaces - Register ja in AVAILABLE_LANGUAGES so it appears in the language picker - Import moment/locale/ja so date and relative-time formatting uses Japanese --- public/locales/ja/chores.json | 75 ++++++++++++ public/locales/ja/common.json | 33 +++++ public/locales/ja/settings.json | 174 +++++++++++++++++++++++++++ src/contexts/LocalizationContext.jsx | 1 + src/i18n/config.js | 1 + 5 files changed, 284 insertions(+) create mode 100644 public/locales/ja/chores.json create mode 100644 public/locales/ja/common.json create mode 100644 public/locales/ja/settings.json diff --git a/public/locales/ja/chores.json b/public/locales/ja/chores.json new file mode 100644 index 0000000..cb1dac3 --- /dev/null +++ b/public/locales/ja/chores.json @@ -0,0 +1,75 @@ +{ + "title": "タスク", + "myChores": "自分のタスク", + "allChores": "すべてのタスク", + "addChore": "タスクを追加", + "editChore": "タスクを編集", + "deleteChore": "タスクを削除", + "completeChore": "タスクを完了", + "dueDate": "期限", + "assignedTo": "担当者", + "priority": "優先度", + "status": "ステータス", + "description": "説明", + "choreView": { + "assignment": "担当", + "assigned": "担当者", + "last": "前回", + "schedule": "スケジュール", + "due": "期限", + "statistics": "統計", + "completed": "完了", + "times": "回", + "details": "詳細", + "createdBy": "作成者", + "na": "該当なし", + "taskCompleted": "タスク完了", + "taskCompletedMessage": "タスクを完了としてマークしました", + "taskCompletionUndone": "タスクの完了を取り消しました。", + "taskSkipUndone": "タスクのスキップを取り消しました。", + "undoSuccessful": "取り消し成功", + "undoFailed": "取り消し失敗", + "undoFailedMessage": "操作を取り消せませんでした。もう一度お試しください。", + "resetTimer": "タイマーをリセット", + "resetTimerConfirmation": "本当にタイマーをリセットしますか?このタスクを開始してからのすべての時間記録が削除されます。", + "clearAllTimeRecords": "すべての時間記録を削除", + "clearAllTimeConfirmation": "このタスクのすべてのタイマーを完全に削除し、「未開始」の状態に戻します。", + "descriptionTitle": "説明", + "description": "説明 :", + "previousNote": "前回のメモ", + "previousNoteLabel": "前回のメモ:", + "subtasksLabel": "サブタスク :", + "taskActions": "タスク操作", + "addNote": "メモを追加", + "additionalNotes": "追加メモ:", + "notePlaceholder": "完了についてのメモを追加...", + "setCustomCompletionTime": "完了時刻をカスタム指定", + "skipTask": "タスクをスキップ", + "skipTaskConfirmation": "本当にこのタスクをスキップしますか?", + "markComplete": "完了としてマーク", + "markAsDone": "完了にする", + "edit": "編集", + "archive": "アーカイブ", + "unarchive": "アーカイブ解除", + "viewHistory": "履歴を表示", + "history": "履歴", + "startTimer": "タイマー開始", + "start": "開始", + "pauseTimer": "タイマー一時停止", + "approve": "承認", + "reject": "却下", + "pendingApproval": "承認待ち", + "undo": "取り消し", + "skip": "スキップ", + "cancel": "キャンセル", + "noPriority": "優先度なし", + "subtasks": "サブタスク", + "noDescription": "説明はありません", + "timer": { + "active": "タイマー動作中", + "paused": "タイマー一時停止中", + "reset": "タイマーをリセット", + "delete": "セッションを削除" + } + } +} diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json new file mode 100644 index 0000000..9b96c62 --- /dev/null +++ b/public/locales/ja/common.json @@ -0,0 +1,33 @@ +{ + "save": "保存", + "cancel": "キャンセル", + "delete": "削除", + "edit": "編集", + "close": "閉じる", + "confirm": "確認", + "loading": "読み込み中...", + "error": "エラー", + "success": "成功", + "warning": "警告", + "refresh": "更新", + "copy": "コピー", + "copied": "コピーしました!", + "settings": "設定", + "yes": "はい", + "no": "いいえ", + "back": "戻る", + "backToCalendar": "カレンダーに戻る", + "logout": "ログアウト", + "version": "バージョン", + "navigation": { + "allTasks": "すべてのタスク", + "archived": "アーカイブ済み", + "things": "Things", + "labels": "ラベル", + "projects": "プロジェクト", + "filters": "フィルター", + "activities": "アクティビティ", + "points": "ポイント", + "settings": "設定" + } +} diff --git a/public/locales/ja/settings.json b/public/locales/ja/settings.json new file mode 100644 index 0000000..75581d5 --- /dev/null +++ b/public/locales/ja/settings.json @@ -0,0 +1,174 @@ +{ + "title": "設定", + "circleSettings": { + "title": "サークル設定", + "description": "アカウントは、サークルを作成または参加すると自動的にそのサークルに接続されます。下記のユニークなサークルコードまたはリンクを共有することで、友達を簡単に招待できます。誰かがサークルへの参加をリクエストした際は、下に通知が表示されます。サークルから脱退したい場合は、「サークルを脱退」ボタンを押してください。", + "circleCode": "サークルコード", + "copyCode": "コードをコピー", + "copyLink": "リンクをコピー", + "codeCopied": "サークルコードをコピーしました!", + "linkCopied": "サークルリンクをコピーしました!", + "joinCircle": "サークルに参加", + "joinCirclePlaceholder": "サークルコードを入力", + "join": "参加", + "leave": "サークルを脱退", + "leaveConfirmTitle": "サークルを脱退", + "leaveConfirmMessage": "本当にこのサークルから脱退しますか?", + "circleMembers": "サークルメンバー", + "circleMemberRequests": "サークル参加リクエスト", + "admin": "管理者", + "member": "メンバー", + "pending": "保留中", + "accept": "承認", + "reject": "拒否", + "makeAdmin": "管理者にする", + "makeMember": "メンバーにする", + "remove": "削除", + "webhookURL": "Webhook URL", + "webhookDescription": "サークルイベントの通知を受け取るための Webhook URL を入力してください", + "webhookPlaceholder": "https://your-webhook-url.com" + }, + "accountSettings": { + "title": "アカウント設定", + "subscription": "サブスクリプション", + "subscriptionStatus": "現在のプラン", + "free": "無料", + "plus": "Plus", + "upgrade": "アップグレード", + "cancel": "キャンセル", + "changePassword": "パスワードを変更", + "password": "パスワード", + "dangerZone": "危険な操作", + "dangerZoneDescription": "アカウントを削除すると元に戻すことはできません。十分にご確認ください。", + "deleteAccount": "アカウントを削除" + }, + "localization": { + "title": "地域設定", + "description": "言語、日付形式、地域の設定をカスタマイズします。", + "language": "言語", + "languageDescription": "使用する言語を選択してください", + "dateFormat": "日付形式", + "dateFormatDescription": "アプリケーション全体で日付をどのように表示するかを選択します", + "timeFormat": "時刻形式", + "timeFormatDescription": "12時間表記または24時間表記を選択します", + "12hour": "12時間 (AM/PM)", + "24hour": "24時間", + "firstDayOfWeek": "週の開始曜日", + "firstDayOfWeekDescription": "週の最初の曜日を選択します", + "sunday": "日曜日", + "monday": "月曜日", + "saturday": "土曜日", + "formats": { + "mdy": "MM/DD/YYYY (米国)", + "dmy": "DD/MM/YYYY (欧州)", + "ymd": "YYYY-MM-DD (ISO)", + "long": "長い形式 (例: January 1, 2024)", + "short": "短い形式 (例: Jan 1, 2024)" + } + }, + "sidepanel": { + "title": "サイドパネルのカスタマイズ", + "description": "サイドパネル内のカードのレイアウトと表示をカスタマイズします。この機能はタブレットやデスクトップなど大画面のデバイスでのみ利用できます。" + }, + "theme": { + "title": "テーマ設定", + "description": "サイトの見た目を選択します。単一のテーマを選ぶか、システム設定に同期して昼夜のテーマを自動で切り替えることができます。", + "themeMode": "テーマモード", + "light": "ライト", + "dark": "ダーク", + "system": "システム" + }, + "notifications": { + "settingsSaved": "設定を保存しました", + "settingsSaveFailed": "設定の保存に失敗しました", + "invalidWebhook": "Webhook URL が無効です" + }, + "profile": { + "title": "プロフィール設定", + "description": "表示名とプロフィール写真を更新します。", + "photoUpdated": "写真を更新しました", + "photoUpdatedMessage": "プロフィール写真が正常に更新されました!", + "uploadFailed": "アップロード失敗", + "uploadFailedMessage": "写真のアップロードに失敗しました。もう一度お試しください。", + "profileUpdated": "プロフィールを更新しました", + "profileUpdatedMessage": "プロフィール情報が正常に保存されました!", + "updateFailed": "更新失敗", + "updateFailedMessage": "プロフィールを更新できませんでした。接続を確認してから再度お試しください。", + "changePhoto": "写真を変更", + "displayName": "表示名", + "displayNamePlaceholder": "表示名を入力してください", + "timezone": "タイムゾーン", + "timezonePlaceholder": "タイムゾーンを選択してください", + "save": "保存", + "cancel": "キャンセル" + }, + "overview": { + "title": "設定", + "subtitle": "体験をカスタマイズし、アカウント設定を管理します", + "upgrade": { + "title": "Plus へアップグレード", + "description": "強力な機能を解放して、生産性を向上させましょう", + "button": "今すぐアップグレード", + "features": { + "richText": "リッチテキストの説明", + "notifications": "タスク通知", + "apiIntegrations": "API 連携", + "advancedAutomation": "高度な自動化" + } + }, + "sections": { + "profile": { + "title": "プロフィール設定", + "description": "プロフィール情報、写真、表示名、タイムゾーンを更新します。" + }, + "circle": { + "title": "サークル設定", + "description": "サークルの管理、メンバーの招待、参加リクエストへの対応を行います。" + }, + "account": { + "title": "アカウント設定", + "description": "サブスクリプションの管理、パスワード変更、アカウント削除を行います。" + }, + "subaccounts": { + "title": "管理アカウント", + "description": "サブアカウントを作成・管理し、ログインや割り当てられたタスクの完了を行えるようにします。" + }, + "notifications": { + "title": "通知", + "description": "プッシュ通知、メール通知、タスクの通知先を設定します。" + }, + "mfa": { + "title": "多要素認証", + "description": "認証アプリを使った MFA でセキュリティをさらに強化します。" + }, + "apitokens": { + "title": "API トークン", + "description": "サードパーティ連携や API アクセス用のトークンを生成・管理します。" + }, + "storage": { + "title": "ストレージ設定", + "description": "データのバックアップと復元、ローカルストレージと同期の設定を管理します。" + }, + "sidepanel": { + "title": "サイドパネルのカスタマイズ", + "description": "サイドパネルのカードのレイアウトと表示をカスタマイズします。" + }, + "theme": { + "title": "テーマ設定", + "description": "好みのテーマを選択し、ダーク/ライトモードの設定を行います。" + }, + "localization": { + "title": "地域設定", + "description": "言語、日付形式、時刻形式、地域の設定をカスタマイズします。" + }, + "advanced": { + "title": "詳細設定", + "description": "Webhook、リアルタイム更新、その他の高度な機能を設定して生産性を高めます。" + }, + "developer": { + "title": "開発者設定", + "description": "認証トークン、SSE 接続、デバッグデータなどの技術情報を確認できます。" + } + } + } +} diff --git a/src/contexts/LocalizationContext.jsx b/src/contexts/LocalizationContext.jsx index bfd5016..3172400 100644 --- a/src/contexts/LocalizationContext.jsx +++ b/src/contexts/LocalizationContext.jsx @@ -25,6 +25,7 @@ export const AVAILABLE_LANGUAGES = [ { code: 'es', name: 'Spanish', nativeName: 'Español' }, { code: 'fr', name: 'French', nativeName: 'Français' }, { code: 'nl', name: 'Dutch', nativeName: 'Nederlands' }, + { code: 'ja', name: 'Japanese', nativeName: '日本語' }, ] export const LocalizationProvider = ({ children }) => { diff --git a/src/i18n/config.js b/src/i18n/config.js index 1b3589f..437d6d8 100644 --- a/src/i18n/config.js +++ b/src/i18n/config.js @@ -1,6 +1,7 @@ import i18n from 'i18next' import LanguageDetector from 'i18next-browser-languagedetector' import HttpBackend from 'i18next-http-backend' +import 'moment/locale/ja' import { initReactI18next } from 'react-i18next' i18n