fix: update package dependencies and improve language handling in the header component
This commit is contained in:
@@ -146,7 +146,7 @@
|
|||||||
"react-day-picker": "^9.12.0",
|
"react-day-picker": "^9.12.0",
|
||||||
"react-dom": "^19.2.1",
|
"react-dom": "^19.2.1",
|
||||||
"react-i18next": "^16.5.4",
|
"react-i18next": "^16.5.4",
|
||||||
"react-joyride": "^2.9.3",
|
"react-joyride": "3.0.0-7",
|
||||||
"react-markdown": "^10.1.0",
|
"react-markdown": "^10.1.0",
|
||||||
"reactflow": "^11.11.4",
|
"reactflow": "^11.11.4",
|
||||||
"recharts": "3.5.1",
|
"recharts": "3.5.1",
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
"remark-math": "^6.0.0",
|
"remark-math": "^6.0.0",
|
||||||
"smol-toml": "^1.5.2",
|
"smol-toml": "^1.5.2",
|
||||||
"tailwind-merge": "^3.4.0",
|
"tailwind-merge": "^3.4.0",
|
||||||
"@react-spring/web": "^9.7.5",
|
"@react-spring/web": "10.0.3",
|
||||||
"@use-gesture/react": "^10.3.1"
|
"@use-gesture/react": "^10.3.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import { isElectron } from '@/lib/runtime'
|
|||||||
import { cn } from '@/lib/utils'
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
const LANGUAGE_CODES = ['zh', 'en', 'ja', 'ko'] as const
|
const LANGUAGE_CODES = ['zh', 'en', 'ja', 'ko'] as const
|
||||||
|
const LANGUAGE_NAMES: Record<typeof LANGUAGE_CODES[number], string> = { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어" }
|
||||||
|
|
||||||
interface HeaderProps {
|
interface HeaderProps {
|
||||||
sidebarOpen: boolean
|
sidebarOpen: boolean
|
||||||
@@ -138,12 +139,14 @@ export function Header({
|
|||||||
<Button variant="ghost" size="sm" className="gap-2">
|
<Button variant="ghost" size="sm" className="gap-2">
|
||||||
<Globe className="h-4 w-4" />
|
<Globe className="h-4 w-4" />
|
||||||
<span className="hidden sm:inline text-xs">
|
<span className="hidden sm:inline text-xs">
|
||||||
{t(`language.${currentLang.split('-')[0] as 'zh' | 'en' | 'ja' | 'ko'}`) ?? currentLang}
|
{LANGUAGE_NAMES[currentLang.split('-')[0] as 'zh' | 'en' | 'ja' | 'ko'] ?? currentLang}
|
||||||
</span>
|
</span>
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end">
|
<DropdownMenuContent align="end">
|
||||||
{LANGUAGE_CODES.map((code) => (
|
{
|
||||||
|
|
||||||
|
LANGUAGE_CODES.map((code) => (
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
key={code}
|
key={code}
|
||||||
onClick={() => i18nInstance.changeLanguage(code)}
|
onClick={() => i18nInstance.changeLanguage(code)}
|
||||||
@@ -155,7 +158,7 @@ export function Header({
|
|||||||
{currentLang.split('-')[0] === code && (
|
{currentLang.split('-')[0] === code && (
|
||||||
<span className="mr-2">✓</span>
|
<span className="mr-2">✓</span>
|
||||||
)}
|
)}
|
||||||
{t(`language.${code}`)}
|
{LANGUAGE_NAMES[code]}
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
))}
|
))}
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
|
|||||||
@@ -203,7 +203,6 @@ export function TourRenderer() {
|
|||||||
zIndex: 99999,
|
zIndex: 99999,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
disableAnimation: true,
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"language": { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어" },
|
|
||||||
"header": {
|
"header": {
|
||||||
"collapseSidebar": "Collapse sidebar",
|
"collapseSidebar": "Collapse sidebar",
|
||||||
"expandSidebar": "Expand sidebar",
|
"expandSidebar": "Expand sidebar",
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"language": { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어" },
|
|
||||||
"header": {
|
"header": {
|
||||||
"collapseSidebar": "サイドバーを折りたたむ",
|
"collapseSidebar": "サイドバーを折りたたむ",
|
||||||
"expandSidebar": "サイドバーを展開する",
|
"expandSidebar": "サイドバーを展開する",
|
||||||
@@ -89,7 +88,7 @@
|
|||||||
"animationSpeed": "アニメーション速度",
|
"animationSpeed": "アニメーション速度",
|
||||||
"backgroundImage": "背景画像",
|
"backgroundImage": "背景画像",
|
||||||
"backgroundBlur": "背景ぼかし",
|
"backgroundBlur": "背景ぼかし",
|
||||||
"backgroundOpacity": "背景透明度",
|
"backgroundOpacity": "背景の透明度",
|
||||||
"lightDesc": "常にライトテーマを使用",
|
"lightDesc": "常にライトテーマを使用",
|
||||||
"darkDesc": "常にダークテーマを使用",
|
"darkDesc": "常にダークテーマを使用",
|
||||||
"systemDesc": "システム設定に従って自動切り替え",
|
"systemDesc": "システム設定に従って自動切り替え",
|
||||||
@@ -119,7 +118,7 @@
|
|||||||
"fontFamilySerif": "セリフ (Serif)",
|
"fontFamilySerif": "セリフ (Serif)",
|
||||||
"fontFamilyMono": "等幅 (Monospace)",
|
"fontFamilyMono": "等幅 (Monospace)",
|
||||||
"baseFontSize": "基準フォントサイズ (Base Size)",
|
"baseFontSize": "基準フォントサイズ (Base Size)",
|
||||||
"lineHeight": "行高 (Line Height)",
|
"lineHeight": "行の高さ (Line Height)",
|
||||||
"lineHeightPlaceholder": "行高を選択",
|
"lineHeightPlaceholder": "行高を選択",
|
||||||
"lineHeightCompact": "コンパクト (1.2)",
|
"lineHeightCompact": "コンパクト (1.2)",
|
||||||
"lineHeightNormal": "標準 (1.5)",
|
"lineHeightNormal": "標準 (1.5)",
|
||||||
@@ -186,7 +185,7 @@
|
|||||||
"hide": "非表示",
|
"hide": "非表示",
|
||||||
"show": "表示",
|
"show": "表示",
|
||||||
"copyTip": "クリップボードにコピー",
|
"copyTip": "クリップボードにコピー",
|
||||||
"regenerateShort": "生成",
|
"regenerateShort": "生成する",
|
||||||
"confirmRegenerateFullDesc": "新しい 64 桁のセキュアトークンを生成し、現在の Token を即座に無効にします。新しい Token で再ログインが必要です。この操作は元に戻せません。続けますか?",
|
"confirmRegenerateFullDesc": "新しい 64 桁のセキュアトークンを生成し、現在の Token を即座に無効にします。新しい Token で再ログインが必要です。この操作は元に戻せません。続けますか?",
|
||||||
"confirmGenerate": "生成を確認",
|
"confirmGenerate": "生成を確認",
|
||||||
"tokenStorePlaceholder": "Token はセキュアな Cookie に保存されています",
|
"tokenStorePlaceholder": "Token はセキュアな Cookie に保存されています",
|
||||||
@@ -196,7 +195,7 @@
|
|||||||
"tokenReqTitle": "Token セキュリティ要件:",
|
"tokenReqTitle": "Token セキュリティ要件:",
|
||||||
"tokenValid": "Token のフォーマットは正しく使用できます",
|
"tokenValid": "Token のフォーマットは正しく使用できます",
|
||||||
"updateBtn": "カスタム Token を更新",
|
"updateBtn": "カスタム Token を更新",
|
||||||
"updating": "更新中...",
|
"updating": "更新しています...",
|
||||||
"dialogTitle": "新しい Access Token",
|
"dialogTitle": "新しい Access Token",
|
||||||
"dialogDesc": "これが新しい Token です。すぐに保存してください。このウィンドウを閉じるとログインページにリダイレクトされます。",
|
"dialogDesc": "これが新しい Token です。すぐに保存してください。このウィンドウを閉じるとログインページにリダイレクトされます。",
|
||||||
"dialogTokenLabel": "新しい Token (64 桁セキュアトークン)",
|
"dialogTokenLabel": "新しい Token (64 桁セキュアトークン)",
|
||||||
@@ -247,10 +246,10 @@
|
|||||||
"logCacheSizeDesc": "ログビューアがキャッシュする最大ログ数を制御します。大きい値はより多くのメモリを使用します。",
|
"logCacheSizeDesc": "ログビューアがキャッシュする最大ログ数を制御します。大きい値はより多くのメモリを使用します。",
|
||||||
"logCacheSizeUnit": "件",
|
"logCacheSizeUnit": "件",
|
||||||
"dataSyncIntervalLabel": "ホームデータ更新間隔",
|
"dataSyncIntervalLabel": "ホームデータ更新間隔",
|
||||||
"dataSyncIntervalUnit": "秒",
|
"dataSyncIntervalUnit": "秒間",
|
||||||
"dataSyncIntervalDesc": "ホーム画面の統計データの自動更新間隔を制御します",
|
"dataSyncIntervalDesc": "ホーム画面の統計データの自動更新間隔を制御します",
|
||||||
"wsReconnectLabel": "WebSocket 再接続間隔",
|
"wsReconnectLabel": "WebSocket 再接続間隔",
|
||||||
"wsReconnectUnit": "秒",
|
"wsReconnectUnit": "秒間",
|
||||||
"wsReconnectDesc": "ログ WebSocket 切断後の再接続基本間隔",
|
"wsReconnectDesc": "ログ WebSocket 切断後の再接続基本間隔",
|
||||||
"wsMaxReconnectLabel": "WebSocket 最大再接続回数",
|
"wsMaxReconnectLabel": "WebSocket 最大再接続回数",
|
||||||
"wsMaxReconnectUnit": "回",
|
"wsMaxReconnectUnit": "回",
|
||||||
@@ -294,7 +293,7 @@
|
|||||||
"openSource": "オープンソース",
|
"openSource": "オープンソース",
|
||||||
"aboutApp": "MaiBot Dashboard について",
|
"aboutApp": "MaiBot Dashboard について",
|
||||||
"version": "バージョン:",
|
"version": "バージョン:",
|
||||||
"author": "作者",
|
"author": "開発者",
|
||||||
"techStack": "技術スタック",
|
"techStack": "技術スタック",
|
||||||
"frontendFramework": "フロントエンドフレームワーク",
|
"frontendFramework": "フロントエンドフレームワーク",
|
||||||
"uiComponents": "UI コンポーネント",
|
"uiComponents": "UI コンポーネント",
|
||||||
@@ -384,7 +383,7 @@
|
|||||||
"loading": "読み込み中...",
|
"loading": "読み込み中...",
|
||||||
"error": "エラー",
|
"error": "エラー",
|
||||||
"retry": "再試行",
|
"retry": "再試行",
|
||||||
"save": "保存",
|
"save": "保存する",
|
||||||
"cancel": "キャンセル",
|
"cancel": "キャンセル",
|
||||||
"confirm": "確認",
|
"confirm": "確認",
|
||||||
"delete": "削除",
|
"delete": "削除",
|
||||||
@@ -392,7 +391,7 @@
|
|||||||
"close": "閉じる",
|
"close": "閉じる",
|
||||||
"search": "検索",
|
"search": "検索",
|
||||||
"noData": "データなし",
|
"noData": "データなし",
|
||||||
"success": "成功",
|
"success": "成功しました",
|
||||||
"failed": "失敗"
|
"failed": "失敗"
|
||||||
},
|
},
|
||||||
"restart": {
|
"restart": {
|
||||||
@@ -519,7 +518,7 @@
|
|||||||
"noData": "データなし",
|
"noData": "データなし",
|
||||||
"replied": "返信 {{num}} 件",
|
"replied": "返信 {{num}} 件",
|
||||||
"per100Messages": "100メッセージあたり",
|
"per100Messages": "100メッセージあたり",
|
||||||
"seconds": "秒",
|
"seconds": "秒間",
|
||||||
"hours": "時間",
|
"hours": "時間",
|
||||||
"days": "日"
|
"days": "日"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"language": { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어" },
|
|
||||||
"header": {
|
"header": {
|
||||||
"collapseSidebar": "사이드바 접기",
|
"collapseSidebar": "사이드바 접기",
|
||||||
"expandSidebar": "사이드바 펼치기",
|
"expandSidebar": "사이드바 펼치기",
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"language": { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어" },
|
|
||||||
"header": {
|
"header": {
|
||||||
"collapseSidebar": "收起侧边栏",
|
"collapseSidebar": "收起侧边栏",
|
||||||
"expandSidebar": "展开侧边栏",
|
"expandSidebar": "展开侧边栏",
|
||||||
|
|||||||
Reference in New Issue
Block a user