feat: add JMAP FileNode file storage backend and file settings

- Implement JMAP FileNode client methods (get, query, list, create,
  update, destroy, copy) with Stalwart-compatible flat name encoding
- Add FileNode/FileNodeFilter types to JMAP type definitions
- Create file-store with Zustand for file management state (navigate,
  upload, delete, rename, move, cut/copy/paste, undo, favorites)
- Add folder tree sidebar component for sidebar navigation layout
- Add files settings dialog and settings page component with options
  for view mode, sort, icons, thumbnails, hidden files, folder layout
- Update files page and file browser to support JMAP FileNode backend
  alongside WebDAV, with folder layout switching and settings integration
- Add settings tab for files configuration in the settings page
- Add translation keys for file settings, calendar subscriptions,
  identity deletion, contact deletion, email navigation, and
  reconnection messages across all 8 locales
- Change WebDAV file storage to File storage in availability messages
- Enhance translations test to verify source-referenced keys exist in
  the en locale
- Fix duplicate JSX attribute in folder-tree-sidebar
This commit is contained in:
Linus Rath
2026-03-16 01:05:59 +01:00
parent 73d6e581b7
commit 716db8d003
18 changed files with 2984 additions and 202 deletions
+124 -10
View File
@@ -260,7 +260,9 @@
"delete": "削除",
"star": "スター (s)",
"unstar": "スター解除 (s)",
"compose": "新規作成 (c)"
"compose": "新規作成 (c)",
"previous": "前のメール",
"next": "次のメール"
},
"spam": {
"button_title": "迷惑メールを報告",
@@ -300,7 +302,10 @@
"no_calendar": "カレンダーが利用できません",
"select_calendar": "カレンダーを選択",
"already_in_calendar": "カレンダーに登録済み"
}
},
"previous": "前へ",
"next": "次へ",
"send": "送信"
},
"email_composer": {
"new_message": "新規メッセージ",
@@ -362,7 +367,9 @@
"continue_draft": "下書きを続ける",
"close_draft_title": "下書きを保存または破棄しますか?",
"close_draft_message": "未保存の変更があります。下書きとして保存しますか、それとも破棄しますか?",
"save_draft": "下書きを保存"
"save_draft": "下書きを保存",
"drop_files": "ファイルをドロップして添付",
"show_less": "折りたたむ"
},
"confirm_dialog": {
"confirm": "確認",
@@ -385,7 +392,8 @@
"yes": "はい",
"no": "いいえ",
"unknown": "不明",
"app_title": "ウェブメール"
"app_title": "ウェブメール",
"reconnecting": "接続が切れました。再接続を試みています…"
},
"notifications": {
"email_sent": "メールを送信しました",
@@ -491,7 +499,8 @@
"templates": "テンプレート",
"folders": "フォルダー",
"keywords": "キーワード",
"security": "セキュリティ"
"security": "セキュリティ",
"files": "ファイル"
},
"tab_groups": {
"general": "一般",
@@ -1055,6 +1064,55 @@
"empty": "テンプレート名は必須です",
"too_long": "テンプレート名は200文字以内にしてください"
}
},
"files": {
"display": {
"title": "表示",
"description": "ファイルとフォルダーの表示方法を設定します"
},
"default_view": {
"label": "デフォルトビュー",
"description": "グリッドまたはリストレイアウトを選択します",
"list": "リスト",
"grid": "グリッド"
},
"default_sort": {
"label": "デフォルトの並べ替え",
"description": "ファイルのデフォルトの並べ替えを選択します",
"name": "名前",
"size": "サイズ",
"modified": "更新日"
},
"sort_direction": {
"label": "並べ替え方向",
"description": "昇順または降順を選択します",
"ascending": "昇順",
"descending": "降順"
},
"icons": {
"title": "アイコン",
"description": "ファイルアイコンの外観を設定します"
},
"show_icons": {
"label": "ファイルアイコンを表示",
"description": "ファイルとフォルダーの横にアイコンを表示します"
},
"colored_icons": {
"label": "カラーアイコン",
"description": "モノクロの代わりにカラフルなアイコンを使用します"
},
"show_thumbnails": {
"label": "サムネイルを表示",
"description": "画像ファイルのアイコンの代わりにプレビューを表示します"
},
"behavior": {
"title": "動作",
"description": "ファイルブラウザーの動作を設定します"
},
"show_hidden": {
"label": "隠しファイルを表示",
"description": "ドットで始まるファイルとフォルダーを表示します"
}
}
},
"errors": {
@@ -1208,7 +1266,9 @@
"identity_name": "送信者情報を使用して送信: {name}",
"identity_short": "{name}経由",
"subaddress_tag": "+{tag}"
}
},
"delete_button": "削除",
"delete_confirm_title": "IDの削除"
},
"templates": {
"picker_title": "テンプレートを選択",
@@ -1385,7 +1445,8 @@
"name_required": "名前は必須です",
"email_invalid": "有効なメールアドレスを入力してください",
"email_error_inline": "メールアドレスの形式が正しくありません",
"save_failed": "連絡先の保存に失敗しました"
"save_failed": "連絡先の保存に失敗しました",
"delete": "削除"
},
"groups": {
"create": "新しいグループ",
@@ -1663,7 +1724,40 @@
"error_delete": "カレンダーの削除に失敗しました",
"caldav_url": "CalDAV URL",
"copy_url": "CalDAV URLをコピー",
"url_copied": "CalDAV URLをクリップボードにコピーしました"
"url_copied": "CalDAV URLをクリップボードにコピーしました",
"confirm_clear": "\"{name}\"のすべてのイベントを削除しますか?この操作は元に戻せません。",
"clear_events": "イベントを削除",
"events_cleared": "{count}件のイベントを削除しました",
"error_clear": "カレンダーイベントの削除に失敗しました"
},
"subscription": {
"title": "iCal購読",
"section_title": "iCal購読",
"description": "外部のiCalendarフィードを購読します。イベントは自動的に専用のカレンダーに同期されます。https://およびwebcal://のURLに対応しています。",
"url_label": "カレンダーURL",
"url_placeholder": "https://example.com/calendar.ics または webcal://...",
"name_label": "カレンダー名",
"name_placeholder": "例:祝日",
"color_label": "色",
"refresh_interval": "更新間隔",
"interval_15": "15分ごと",
"interval_30": "30分ごと",
"interval_60": "1時間ごと",
"interval_360": "6時間ごと",
"interval_1440": "毎日",
"subscribe": "購読する",
"subscribing": "購読中...",
"invalid_url": "有効なURLを入力してください",
"success": "\"{name}\"を購読しました",
"error": "購読の追加に失敗しました",
"refresh": "今すぐ更新",
"refresh_success": "購読を更新しました",
"refresh_error": "購読の更新に失敗しました",
"unsubscribe": "購読解除",
"confirm_delete": "\"{name}\"の購読を解除しますか?カレンダーとすべてのイベントが削除されます。",
"deleted": "購読を解除しました",
"delete_error": "購読の解除に失敗しました",
"last_refreshed": "最終更新: {time}"
}
},
"advanced_search": {
@@ -1741,7 +1835,7 @@
"rename_success": "正常に名前を変更しました",
"rename_error": "名前の変更に失敗しました",
"download_error": "ダウンロードに失敗しました",
"not_available": "WebDAVファイルストレージはこのサーバーで利用できません",
"not_available": "ファイルストレージはこのサーバーで利用できません",
"cancel": "キャンセル",
"create": "作成",
"save": "保存",
@@ -1782,6 +1876,26 @@
"undo_error": "元に戻すのに失敗しました",
"toolbar": "ファイル操作",
"file_list": "ファイルとフォルダ",
"context_menu": "操作"
"context_menu": "操作",
"settings_title": "ファイル設定",
"settings_display": "表示",
"settings_default_view": "デフォルトビュー",
"settings_default_view_desc": "グリッドまたはリストレイアウトを選択します",
"settings_default_sort": "デフォルトの並べ替え",
"settings_default_sort_desc": "ファイルのデフォルトの並べ替えを選択します",
"settings_sort_direction": "並べ替え方向",
"settings_sort_direction_desc": "昇順または降順を選択します",
"settings_ascending": "昇順",
"settings_descending": "降順",
"settings_icons": "アイコン",
"settings_show_icons": "ファイルアイコンを表示",
"settings_show_icons_desc": "ファイルとフォルダーの横にアイコンを表示します",
"settings_colored_icons": "カラーアイコン",
"settings_colored_icons_desc": "モノクロの代わりにカラフルなアイコンを使用します",
"settings_show_thumbnails": "サムネイルを表示",
"settings_show_thumbnails_desc": "画像ファイルのアイコンの代わりにプレビューを表示します",
"settings_behavior": "動作",
"settings_show_hidden": "隠しファイルを表示",
"settings_show_hidden_desc": "ドットで始まるファイルとフォルダーを表示します"
}
}