feat: add Japanese, Arabic, Hindi, Portuguese locales + new currencies

- 4 new locale files (ja, ar, hi, pt) with 567 keys each - full coverage
- Japanese (日本語): Hiragana/Kanji script
- Arabic (العربية): RTL-ready text
- Hindi (हिन्दी): Devanagari script
- Portuguese (Português): Brazilian Portuguese
- SUPPORTED_LOCALES updated in i18n.js (10 → 14 locales)
- LOCALE_LABELS updated in oikos-locale-picker.js
- New currencies: AED, BRL, INR, SAR added to budget settings
- Service Worker v31: new locale files pre-cached in APP_SHELL
- Docs: README, SPEC.md, BACKLOG.md, CHANGELOG.md updated
This commit is contained in:
Ulas
2026-04-14 10:28:17 +02:00
parent 3f387b616e
commit 8af730e9cf
13 changed files with 2426 additions and 6 deletions
+599
View File
@@ -0,0 +1,599 @@
{
"common": {
"save": "保存",
"cancel": "キャンセル",
"delete": "削除",
"edit": "編集",
"close": "閉じる",
"create": "作成",
"add": "追加",
"back": "戻る",
"next": "次へ",
"loading": "読み込み中…",
"saving": "保存中…",
"required": "このフィールドは必須です。",
"error": "エラー",
"allFieldsRequired": "すべてのフィールドを入力してください。",
"today": "今日",
"tomorrow": "明日",
"skipToContent": "コンテンツへスキップ",
"reload": "再読み込み",
"errorOccurred": "問題が発生しました。",
"unexpectedError": "予期しないエラーが発生しました。",
"errorGeneric": "エラーが発生しました。",
"updateAvailable": "アップデートがあります - 最新版を使うためにページを再読み込みしてください。",
"titleRequired": "タイトルは必須です",
"nameRequired": "名前は必須です",
"contentRequired": "内容は必須です",
"all": "すべて",
"unknownError": "不明なエラー",
"confirm": "確認",
"undo": "元に戻す"
},
"nav": {
"dashboard": "ダッシュボード",
"tasks": "タスク",
"calendar": "カレンダー",
"meals": "食事",
"shopping": "買い物",
"notes": "メモ",
"contacts": "連絡先",
"budget": "家計",
"settings": "設定",
"main": "メインナビゲーション",
"navigation": "ナビゲーション",
"quickActions": "クイックアクション"
},
"dashboard": {
"title": "ダッシュボード",
"greetingMorning": "おはようございます、{{name}}",
"greetingDay": "こんにちは、{{name}}",
"greetingEvening": "こんばんは、{{name}}",
"allDone": "すべて完了",
"noEvents": "予定なし",
"noPinnedNotes": "固定メモなし",
"todayMeals": "今日の食事",
"allLink": "すべて",
"weekLink": "今週",
"urgentTasksChip": "緊急タスク {{count}} 件",
"urgentTasksChipPlural": "緊急タスク {{count}} 件",
"eventsChip": "今日の予定 {{count}} 件",
"eventsChipPlural": "今日の予定 {{count}} 件",
"todayMealChip": "今日:{{title}}",
"loadError": "ダッシュボードの読み込みに失敗しました。",
"weatherRefresh": "天気を更新",
"weatherRefreshTitle": "更新",
"weatherUpdated": "天気を更新しました",
"weatherFeelsLike": "体感 {{temp}}° · {{humidity}}% · 風速 {{wind}} km/h",
"fabTaskLabel": "タスクを追加",
"fabCalendarLabel": "予定を追加",
"fabShoppingLabel": "買い物を追加",
"fabNoteLabel": "メモを追加",
"fabTask": "タスク",
"fabCalendar": "予定",
"fabShopping": "買い物",
"fabNote": "メモ",
"overdue": "期限切れ",
"dueSoon": "今日が期限",
"dueTomorrow": "明日が期限",
"allDay": "終日",
"shoppingMore": "+{{count}} 件",
"weather": "天気",
"customize": "カスタマイズ",
"customizeTitle": "ウィジェットのカスタマイズ",
"customizeReset": "デフォルト",
"customizeSaved": "ダッシュボードを保存しました",
"customizeMoveUp": "上へ",
"customizeMoveDown": "下へ"
},
"tasks": {
"title": "タスク",
"newTask": "新しいタスク",
"editTask": "タスクを編集",
"emptyTitle": "タスクなし - すべて完了?",
"emptyDescription": "+ ボタンで新しいタスクを作成できます。",
"titleLabel": "タイトル *",
"titlePlaceholder": "何をする必要がありますか?",
"descriptionLabel": "メモ",
"descriptionPlaceholder": "任意の詳細…",
"priorityLabel": "優先度",
"categoryLabel": "カテゴリー",
"dueDateLabel": "期限",
"dueTimeLabel": "時刻",
"assignedLabel": "担当者",
"assignedNobody": "- なし -",
"statusLabel": "ステータス",
"priorityUrgent": "緊急",
"priorityHigh": "高",
"priorityMedium": "中",
"priorityLow": "低",
"priorityNone": "なし",
"statusOpen": "未着手",
"statusInProgress": "進行中",
"statusDone": "完了",
"categoryHousehold": "家事",
"categorySchool": "学校",
"categoryShopping": "買い物",
"categoryRepair": "修理",
"categoryHealth": "健康",
"categoryFinance": "財務",
"categoryLeisure": "余暇",
"categoryMisc": "その他",
"overdue": "期限切れ",
"overdueDay": "{{count}} 日超過",
"dueToday": "今日が期限",
"dueTomorrow": "明日が期限",
"groupOverdue": "期限切れ",
"groupToday": "今日",
"groupThisWeek": "今週",
"groupNextWeek": "来週",
"groupLater": "後で",
"groupNoDate": "日付なし",
"markDone": "{{title}} を完了としてマーク",
"editButton": "タスクを編集",
"swipeOpen": "開く",
"swipeDone": "完了",
"swipeEdit": "編集",
"subtaskAdd": "+ サブタスクを追加",
"subtaskToggle": "サブタスクを表示",
"subtaskMarkDone": "{{title}} を完了としてマーク",
"deleteConfirm": "タスクとすべてのサブタスクを削除しますか?",
"savedToast": "タスクを保存しました。",
"createdToast": "タスクを作成しました。",
"deletedToast": "タスクを削除しました。",
"loadError": "タスクの読み込みに失敗しました。",
"subtaskPrompt": "サブタスク:",
"kanbanOpen": "未着手",
"kanbanInProgress": "進行中",
"kanbanDone": "完了",
"kanbanMoveToInProgress": "進行中に移動",
"kanbanMoveToDone": "完了としてマーク",
"kanbanMoveToOpen": "再度開く",
"recurring": "繰り返し",
"listView": "リスト表示",
"kanbanView": "かんばん表示"
},
"shopping": {
"title": "買い物",
"noLists": "リストなし",
"noListsDescription": "+ ボタンでリストを作成できます。",
"emptyList": "リストは空です",
"emptyListDescription": "上の入力欄から商品を追加してください。",
"newListPrompt": "新しいリスト名:",
"newListButton": "新しいリストを作成",
"renameListPrompt": "新しいリスト名:",
"deleteListConfirm": "リスト「{{name}}」とすべての商品を削除しますか?",
"deletedListToast": "リストを削除しました。",
"itemDeletedToast": "「{{name}}」を削除しました。",
"itemsRemovedToast": "{{count}} 件の商品を削除しました。",
"clearChecked": "チェック済みを削除 ({{count}})",
"itemNamePlaceholder": "商品を追加…",
"itemQtyPlaceholder": "数量",
"itemNameLabel": "商品名",
"itemQtyLabel": "数量",
"categoryLabel": "カテゴリー",
"addItemLabel": "商品を追加",
"renameListLabel": "リストの名前を変更",
"deleteListLabel": "リストを削除",
"swipeBack": "戻る",
"swipeCheck": "チェック",
"swipeDelete": "削除",
"markDoneLabel": "{{name}} をチェック",
"markUndoneLabel": "{{name}} のチェックを外す",
"deleteItemLabel": "{{name}} を削除",
"listsLoadError": "リストの読み込みに失敗しました。",
"itemsLoadError": "商品の読み込みに失敗しました。",
"catFruitVeg": "野菜・果物",
"catBakery": "パン・焼き菓子",
"catDairy": "乳製品",
"catMeatFish": "肉・魚",
"catFrozen": "冷凍食品",
"catDrinks": "飲み物",
"catHousehold": "日用品",
"catDrugstore": "薬局",
"catMisc": "その他"
},
"meals": {
"title": "食事計画",
"noMealPlanned": "食事の計画なし",
"addMeal": "{{type}} を追加",
"editMeal": "食事を編集",
"addMealTitle": "食事を追加",
"deleteMeal": "食事を削除",
"transferToShoppingList": "材料を買い物リストへ",
"today": "今日",
"prevWeek": "前の週",
"nextWeek": "次の週",
"loadError": "食事計画の読み込みに失敗しました。",
"typeBreakfast": "朝食",
"typeLunch": "昼食",
"typeDinner": "夕食",
"typeSnack": "間食",
"dayMo": "月",
"dayDi": "火",
"dayMi": "水",
"dayDo": "木",
"dayFr": "金",
"daySa": "土",
"daySo": "日",
"dateLabel": "日付",
"mealTypeLabel": "食事の種類",
"titleLabel": "タイトル *",
"titlePlaceholder": "例:カレーライス",
"notesLabel": "メモ",
"notesPlaceholder": "任意…",
"ingredientsLabel": "材料",
"addIngredient": "材料を追加",
"ingredientNamePlaceholder": "材料",
"ingredientQtyPlaceholder": "量",
"removeIngredient": "材料を削除",
"transferLabel": "材料を買い物リストに追加",
"transferNow": "今すぐ追加",
"noShoppingLists": "買い物リストがありません",
"transferSuccess": "{{count}} 種の材料を追加しました",
"transferSuccessPlural": "{{count}} 種の材料を追加しました",
"transferAlreadyDone": "すべての材料が追加済みです",
"ingredientCount": "材料 {{count}} 種",
"ingredientCountPlural": "材料 {{count}} 種",
"titleRequired": "タイトルは必須です",
"loadingIndicator": "読み込み中…",
"recipeUrlLabel": "レシピリンク(任意)",
"recipeUrlPlaceholder": "https://…",
"openRecipe": "レシピを開く"
},
"calendar": {
"title": "カレンダー",
"newEvent": "新しい予定",
"editEvent": "予定を編集",
"addEvent": "予定を追加",
"deleteEvent": "予定を削除",
"noEvents": "選択した期間に予定はありません。",
"today": "今日",
"back": "戻る",
"forward": "次へ",
"viewMonth": "月",
"viewWeek": "週",
"viewDay": "日",
"viewAgenda": "一覧",
"allDay": "終日",
"allDayShort": "終日",
"moreEvents": "+{{count}} 件",
"weekNumberLabel": "第 {{week}} 週 · {{month}} {{year}}",
"agendaFrom": "{{date}} から",
"titleLabel": "タイトル *",
"titlePlaceholder": "例:歯医者",
"allDayToggle": "終日",
"startDateLabel": "開始日",
"startTimeLabel": "開始時刻",
"endDateLabel": "終了日",
"endTimeLabel": "終了時刻",
"fromLabel": "開始",
"toLabel": "終了",
"locationLabel": "場所",
"locationPlaceholder": "任意",
"assignedLabel": "担当者",
"assignedNobody": "- なし -",
"colorLabel": "色 {{color}}",
"descriptionLabel": "説明",
"descriptionPlaceholder": "任意…",
"popupEdit": "編集",
"deleteConfirm": "「{{title}}」を削除しますか?",
"createdToast": "予定を作成しました",
"savedToast": "予定を保存しました",
"deletedToast": "予定を削除しました",
"loadError": "予定の読み込みに失敗しました。",
"saveError": "保存に失敗しました",
"deleteError": "削除に失敗しました",
"titleRequired": "タイトルは必須です",
"monthJanuary": "1月",
"monthFebruary": "2月",
"monthMarch": "3月",
"monthApril": "4月",
"monthMay": "5月",
"monthJune": "6月",
"monthJuly": "7月",
"monthAugust": "8月",
"monthSeptember": "9月",
"monthOctober": "10月",
"monthNovember": "11月",
"monthDecember": "12月",
"dayShortSunday": "日",
"dayShortMonday": "月",
"dayShortTuesday": "火",
"dayShortWednesday": "水",
"dayShortThursday": "木",
"dayShortFriday": "金",
"dayShortSaturday": "土",
"dayLongSunday": "日曜日",
"dayLongMonday": "月曜日",
"dayLongTuesday": "火曜日",
"dayLongWednesday": "水曜日",
"dayLongThursday": "木曜日",
"dayLongFriday": "金曜日",
"dayLongSaturday": "土曜日",
"timeSuffix": ""
},
"notes": {
"title": "メモボード",
"newNote": "新しいメモ",
"editNote": "メモを編集",
"addNoteLabel": "新しいメモ",
"searchPlaceholder": "メモを検索…",
"emptyTitle": "メモなし",
"emptyDescription": "+ ボタンで新しいメモを作成できます。",
"noResultsTitle": "結果なし",
"noResultsDescription": "「{{query}}」を含むメモはありません。",
"titleLabel": "タイトル(任意)",
"titlePlaceholder": "タイトルなし",
"contentLabel": "内容",
"contentMarkdownHint": "Markdown 形式対応)",
"contentPlaceholder": "メモを入力…",
"colorLabel": "色",
"pinnedLabel": "固定(ダッシュボードに表示)",
"pinAction": "固定",
"unpinAction": "固定を解除",
"deleteLabel": "メモを削除",
"deleteConfirm": "メモを削除しますか?",
"createdToast": "メモを作成しました",
"savedToast": "メモを保存しました",
"deletedToast": "メモを削除しました",
"loadError": "メモの読み込みに失敗しました。",
"formatBold": "太字 (Ctrl+B)",
"formatItalic": "斜体 (Ctrl+I)",
"formatUnderline": "下線 (Ctrl+U)",
"formatStrikethrough": "取り消し線",
"formatHeading": "見出し",
"formatList": "リスト",
"formatOrderedList": "番号付きリスト",
"formatChecklist": "チェックリスト",
"formatLink": "リンク",
"formatCode": "コード",
"formatQuote": "引用",
"formatDivider": "区切り線"
},
"contacts": {
"title": "連絡先",
"newContact": "新しい連絡先",
"editContact": "連絡先を編集",
"addButton": "新規",
"newContactLabel": "新しい連絡先",
"searchPlaceholder": "名前、電話番号またはメールで検索…",
"importButton": "インポート",
"importLabel": "vCard から連絡先をインポート",
"importTooltip": "vCard をインポート",
"emptyTitle": "連絡先なし",
"emptyDescription": "+ ボタンで新しい連絡先を追加できます。",
"filterAll": "すべて",
"nameLabel": "名前 *",
"namePlaceholder": "フルネーム",
"categoryLabel": "カテゴリー",
"phoneLabel": "電話番号",
"phonePlaceholder": "+81 …",
"emailLabel": "メール",
"emailPlaceholder": "name@example.com",
"addressLabel": "住所",
"addressPlaceholder": "町名、都市",
"notesLabel": "メモ",
"notesPlaceholder": "任意…",
"callLabel": "電話をかける",
"emailActionLabel": "メールを送る",
"mapsLabel": "地図で開く",
"exportLabel": "vCard としてエクスポート",
"exportTooltip": "vCard をエクスポート",
"deleteLabel": "連絡先を削除",
"deleteConfirm": "連絡先を削除しますか?",
"deletePersonConfirm": "「{{name}}」を削除しますか?",
"savedToast": "連絡先を保存しました",
"updatedToast": "連絡先を更新しました",
"deletedToast": "連絡先を削除しました",
"importedToast": "{{name}} をインポートしました。",
"importError": "インポートに失敗しました:{{error}}",
"vcardNoName": "vCard に名前が含まれていません。",
"catDoctor": "医師",
"catSchool": "学校・保育園",
"catAuthority": "官公庁",
"catInsurance": "保険",
"catCraftsman": "職人",
"catEmergency": "緊急連絡先",
"catMisc": "その他",
"categoryDoctor": "医師",
"categorySchool": "学校・保育園",
"categoryAuthority": "官公庁",
"categoryInsurance": "保険",
"categoryCraftsman": "職人",
"categoryEmergency": "緊急連絡先",
"categoryOther": "その他"
},
"budget": {
"title": "家計",
"newEntry": "新しい項目",
"editEntry": "項目を編集",
"addEntryLabel": "項目を追加",
"newEntryFabLabel": "新しい項目",
"currentMonth": "今月",
"prevMonth": "先月",
"nextMonth": "来月",
"income": "収入",
"expenses": "支出",
"balance": "残高",
"byCategory": "カテゴリー別",
"transactions": "取引",
"emptyTitle": "今月の項目なし",
"emptyDescription": "+ ボタンで家計項目を追加できます。",
"csvExport": "CSV",
"typeExpense": "支出",
"typeIncome": "収入",
"titleLabel": "タイトル *",
"titlePlaceholder": "例:スーパーでの買い物",
"amountLabel": "金額 *",
"amountPlaceholder": "0",
"categoryLabel": "カテゴリー",
"dateLabel": "日付 *",
"recurringLabel": "繰り返し",
"deleteLabel": "項目を削除",
"deleteConfirm": "項目を削除しますか?",
"deletePersonConfirm": "「{{title}}」を削除しますか?",
"addedToast": "項目を追加しました",
"savedToast": "項目を保存しました",
"deletedToast": "項目を削除しました",
"loadError": "家計の読み込みに失敗しました。",
"trendNeutral": "- {{month}} と同じ",
"validAmountRequired": "有効な金額を入力してください",
"dateRequired": "日付は必須です",
"catFood": "食費",
"catRent": "家賃",
"catInsurance": "保険",
"catMobility": "交通費",
"catLeisure": "娯楽",
"catClothing": "衣服",
"catHealth": "医療",
"catEducation": "教育",
"catMisc": "その他",
"loadingIndicator": "読み込み中…"
},
"settings": {
"title": "設定",
"tabGeneral": "一般",
"tabMeals": "食事",
"tabBudget": "家計",
"tabShopping": "買い物",
"tabCalendar": "カレンダー",
"tabAccount": "アカウント",
"tabsAriaLabel": "設定カテゴリー",
"sectionDesign": "デザイン",
"sectionShopping": "買い物",
"shoppingCategoriesLabel": "買い物カテゴリー",
"shoppingCategoriesHint": "カテゴリーの追加、名前変更、削除、並び替えができます。",
"shoppingCategoryPlaceholder": "新しいカテゴリー…",
"shoppingCategoryRenameHint": "クリックして名前を変更",
"shoppingCategoryRenamePrompt": "新しいカテゴリー名:",
"shoppingCategoryMoveUp": "カテゴリーを上へ",
"shoppingCategoryMoveDown": "カテゴリーを下へ",
"shoppingCategoryDelete": "カテゴリーを削除",
"shoppingCategoryDeleteConfirm": "カテゴリー「{{name}}」を削除しますか?既存の商品は次のカテゴリーに移動されます。",
"shoppingCategoryAdded": "カテゴリーを追加しました。",
"shoppingCategoryRenamed": "カテゴリー名を変更しました。",
"shoppingCategoryDeleted": "カテゴリーを削除しました。",
"sectionAccount": "マイアカウント",
"sectionCalendarSync": "カレンダー同期",
"sectionFamily": "家族メンバー",
"cardAppearance": "外観",
"themeSystem": "システム設定",
"themeSysLabel": "システム設定を使用",
"themeLight": "ライト",
"themeLightLabel": "ライトテーマ",
"themeDark": "ダーク",
"themeDarkLabel": "ダークテーマ",
"changePassword": "パスワードを変更",
"currentPasswordLabel": "現在のパスワード",
"newPasswordLabel": "新しいパスワード",
"confirmPasswordLabel": "新しいパスワードを確認",
"savePassword": "パスワードを保存",
"passwordMismatch": "パスワードが一致しません。",
"passwordSavedToast": "パスワードを変更しました。",
"googleCalendar": "Google カレンダー",
"appleCalendar": "Apple カレンダー (iCloud)",
"syncNow": "今すぐ同期",
"disconnect": "接続を切断",
"connectGoogle": "Google に接続",
"connected": "接続済み",
"connectedLastSync": "接続済み · 最終同期:{{date}}",
"notConnected": "未接続",
"notConfigured": "未設定(.env 変数が不足しています)",
"configured": "設定済み(.env 経由)",
"configuredLastSync": "設定済み(.env 経由) · 最終同期:{{date}}",
"syncSuccess": "{{provider}} を同期しました。",
"disconnectedToast": "{{provider}} を切断しました。",
"googleOnlyAdmin": "Google カレンダーに接続できるのは管理者のみです。",
"appleOnlyAdmin": "Apple カレンダーに接続できるのは管理者のみです。",
"caldavUrlLabel": "CalDAV サーバー URL",
"caldavUrlPlaceholder": "https://caldav.icloud.com",
"appleIdLabel": "Apple ID(メール)",
"applePasswordLabel": "アプリ専用パスワード",
"applePasswordHint": "<strong>appleid.apple.com → セキュリティ</strong> でパスワードを作成してください。",
"appleConnectBtn": "接続してテスト",
"appleConnecting": "接続中…",
"appleConnectedToast": "Apple カレンダーを接続しました。",
"syncSuccessGoogle": "Google カレンダーの同期接続に成功しました。",
"syncSuccessApple": "Apple カレンダーの同期接続に成功しました。",
"syncErrorGoogle": "Google への接続に失敗しました。もう一度お試しください。",
"syncErrorApple": "Apple への接続に失敗しました。もう一度お試しください。",
"addMember": "+ メンバーを追加",
"newMemberTitle": "新しい家族メンバー",
"usernameLabel": "ユーザー名",
"displayNameLabel": "表示名",
"memberPasswordLabel": "パスワード",
"colorLabel": "色",
"roleLabel": "役割",
"roleMember": "メンバー",
"roleAdmin": "管理者",
"createMember": "作成",
"cancelAddMember": "キャンセル",
"memberAddedToast": "{{name}} を追加しました。",
"deleteMemberConfirm": "{{name}} を削除しますか?",
"memberDeletedToast": "{{name}} を削除しました。",
"deleteMemberLabel": "削除",
"logout": "ログアウト",
"synchronizing": "同期中…",
"googleDisconnectConfirm": "Google カレンダーの接続を切断しますか?",
"appleDisconnectConfirm": "Apple カレンダーの接続を切断しますか?",
"localeSystem": "システム設定",
"localeLabel": "言語",
"languageTitle": "言語",
"sectionMeals": "食事計画",
"mealTypesLabel": "表示する食事の種類",
"mealTypesHint": "選択した食事の種類のみ食事計画に表示されます。",
"mealTypesSaved": "食事計画の設定を保存しました。",
"mealTypesMinOne": "少なくとも1つの食事の種類を有効にしてください。",
"sectionBudget": "家計",
"currencyLabel": "通貨",
"currencyHint": "家計全体で使用する通貨を設定します。",
"currencySaved": "通貨を保存しました。"
},
"login": {
"tagline": "家族計画。安全。プライバシー重視。オープンソース。",
"usernameLabel": "ユーザー名",
"usernamePlaceholder": "ユーザー名",
"passwordLabel": "パスワード",
"passwordPlaceholder": "••••••••",
"loginButton": "ログイン",
"loggingIn": "ログイン中…",
"tooManyAttempts": "試行回数が多すぎます。しばらくお待ちください。",
"invalidCredentials": "ユーザー名またはパスワードが正しくありません。"
},
"install": {
"title": "Oikos をインストール",
"subtitle": "アプリに追加",
"iosTip1": " をタップ",
"iosTip2": " → 「ホーム画面に追加」",
"installButton": "インストール",
"dismissLabel": "閉じる"
},
"modal": {
"closeLabel": "閉じる",
"overlayLabel": "モーダルダイアログの背景"
},
"rrule": {
"freqNone": "繰り返しなし",
"freqDaily": "毎日",
"freqWeekly": "毎週",
"freqMonthly": "毎月",
"dayMo": "月",
"dayTu": "火",
"dayWe": "水",
"dayTh": "木",
"dayFr": "金",
"daySa": "土",
"daySu": "日",
"labelRepeat": "繰り返し",
"labelEvery": "毎",
"labelOnDays": "曜日",
"labelUntil": "終了日(任意)",
"unitDay": "日",
"unitDays": "日",
"unitWeek": "週",
"unitWeeks": "週",
"unitMonth": "ヶ月",
"unitMonths": "ヶ月"
}
}