From 003a63e79d17918f8ccfba772e500c70a7a97aaa Mon Sep 17 00:00:00 2001 From: Euigyom Kim Date: Wed, 4 Feb 2026 10:37:34 +0900 Subject: [PATCH 1/2] feat: add i18n setup and initial ko/en resources --- bun.lock | 467 ++++++++++++++++++++++++-- i18next-parser.config.cjs | 12 + package.json | 8 +- public/locales/en/common.json | 412 +++++++++++++++++++++++ public/locales/ko/common.json | 412 +++++++++++++++++++++++ src/App.tsx | 104 +++--- src/i18n/index.ts | 29 ++ src/main.tsx | 1 + src/ui/components/AccountAdd.tsx | 20 +- src/ui/components/AccountLabel.tsx | 4 +- src/ui/components/AccountSelector.tsx | 8 +- src/ui/components/ComposeBox.tsx | 137 ++++---- src/ui/components/InfoModal.tsx | 26 +- src/ui/components/MobileMenus.tsx | 17 +- src/ui/components/PomodoroTimer.tsx | 52 +-- src/ui/components/ReactionPicker.tsx | 42 +-- src/ui/components/SettingsModal.tsx | 88 +++-- src/ui/components/StatusModal.tsx | 20 +- src/ui/components/TimelineSection.tsx | 357 ++++++++++---------- src/ui/components/ToastHost.tsx | 6 +- src/ui/content/oss.en.md | 7 + src/ui/content/shortcuts.ts | 106 +++--- src/ui/content/terms.en.md | 3 + src/ui/hooks/useEmojiManager.ts | 58 ++-- src/ui/hooks/useTimeline.ts | 10 +- src/ui/pages/InfoPages.tsx | 154 +++++---- src/ui/state/AppContext.tsx | 3 +- src/ui/utils/linkify.ts | 3 +- src/ui/utils/timeline.ts | 22 +- 29 files changed, 1990 insertions(+), 598 deletions(-) create mode 100644 i18next-parser.config.cjs create mode 100644 public/locales/en/common.json create mode 100644 public/locales/ko/common.json create mode 100644 src/i18n/index.ts create mode 100644 src/ui/content/oss.en.md create mode 100644 src/ui/content/terms.en.md diff --git a/bun.lock b/bun.lock index 37b8b5f..3b8c3e4 100644 --- a/bun.lock +++ b/bun.lock @@ -7,8 +7,12 @@ "dependencies": { "dompurify": "^3.3.1", "emoji-datasource": "^16.0.0", + "i18next": "^25.8.1", + "i18next-browser-languagedetector": "^8.2.0", + "i18next-http-backend": "^3.0.2", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-i18next": "^16.5.4", "wrangler": "3.90.0", }, "devDependencies": { @@ -16,6 +20,7 @@ "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.1", + "i18next-parser": "^9.3.0", "typescript": "^5.5.4", "vite": "^5.4.0", "vite-plugin-svgr": "^4.5.0", @@ -55,6 +60,8 @@ "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], @@ -81,54 +88,64 @@ "@esbuild-plugins/node-modules-polyfill": ["@esbuild-plugins/node-modules-polyfill@0.2.2", "", { "dependencies": { "escape-string-regexp": "^4.0.0", "rollup-plugin-node-polyfills": "^0.2.1" }, "peerDependencies": { "esbuild": "*" } }, "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], + "@gulpjs/to-absolute-glob": ["@gulpjs/to-absolute-glob@4.0.0", "", { "dependencies": { "is-negated-glob": "^1.0.0" } }, "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], @@ -139,6 +156,8 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], @@ -223,6 +242,8 @@ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/minimatch": ["@types/minimatch@3.0.5", "", {}, "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="], + "@types/node": ["@types/node@25.0.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA=="], "@types/node-forge": ["@types/node-forge@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw=="], @@ -233,6 +254,8 @@ "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], + "@types/symlink-or-copy": ["@types/symlink-or-copy@1.2.2", "", {}, "sha512-MQ1AnmTLOncwEf9IVU+B2e4Hchrku5N67NkgcAHW0p3sdzPe0FNMANxEm6OJUzPniEQGkeT3OROLlCwZJLWFZA=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], @@ -241,16 +264,46 @@ "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "as-table": ["as-table@1.0.55", "", { "dependencies": { "printable-characters": "^1.0.42" } }, "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ=="], + "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.11", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ=="], + "bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="], + "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "broccoli-node-api": ["broccoli-node-api@1.7.0", "", {}, "sha512-QIqLSVJWJUVOhclmkmypJJH9u9s/aWH4+FH6Q6Ju5l+Io4dtwqdPUNmDfw40o6sxhbZHhqGujDJuHTML1wG8Yw=="], + + "broccoli-node-info": ["broccoli-node-info@2.2.0", "", {}, "sha512-VabSGRpKIzpmC+r+tJueCE5h8k6vON7EIMMWu6d/FyPdtijwLQ7QvzShEw+m3mHoDzUaj/kiZsDYrS8X2adsBg=="], + + "broccoli-output-wrapper": ["broccoli-output-wrapper@3.2.5", "", { "dependencies": { "fs-extra": "^8.1.0", "heimdalljs-logger": "^0.1.10", "symlink-or-copy": "^1.2.0" } }, "sha512-bQAtwjSrF4Nu0CK0JOy5OZqw9t5U0zzv2555EA/cF8/a8SLDTIetk9UgrtMVw7qKLKdSpOZ2liZNeZZDaKgayw=="], + + "broccoli-plugin": ["broccoli-plugin@4.0.7", "", { "dependencies": { "broccoli-node-api": "^1.7.0", "broccoli-output-wrapper": "^3.2.5", "fs-merger": "^3.2.1", "promise-map-series": "^0.3.0", "quick-temp": "^0.1.8", "rimraf": "^3.0.2", "symlink-or-copy": "^1.3.1" } }, "sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg=="], + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], @@ -259,14 +312,40 @@ "capnp-ts": ["capnp-ts@0.7.0", "", { "dependencies": { "debug": "^4.3.1", "tslib": "^2.2.0" } }, "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g=="], + "cheerio": ["cheerio@1.2.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg=="], + + "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colors": ["colors@1.4.0", "", {}, "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="], + + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + "cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], + "cross-fetch": ["cross-fetch@4.0.0", "", { "dependencies": { "node-fetch": "^2.6.12" } }, "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "data-uri-to-buffer": ["data-uri-to-buffer@2.0.2", "", {}, "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA=="], @@ -277,19 +356,37 @@ "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + "dompurify": ["dompurify@3.3.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="], + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], "emoji-datasource": ["emoji-datasource@16.0.0", "", {}, "sha512-/qHKqK5Nr3+8zhgO6kHmF43Fm5C8HNn0AaFRIpgw8HF3+uF0Vfc8jgLI1ZQS5ba1vBzksS8NBCjHejwLb2D/Sg=="], + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "encoding-sniffer": ["encoding-sniffer@0.2.1", "", { "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" } }, "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw=="], + + "ensure-posix-path": ["ensure-posix-path@1.1.1", "", {}, "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw=="], + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "eol": ["eol@0.9.1", "", {}, "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg=="], + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -297,8 +394,26 @@ "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], + "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + + "fs-merger": ["fs-merger@3.2.1", "", { "dependencies": { "broccoli-node-api": "^1.7.0", "broccoli-node-info": "^2.1.0", "fs-extra": "^8.0.1", "fs-tree-diff": "^2.0.1", "walk-sync": "^2.2.0" } }, "sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug=="], + + "fs-mkdirp-stream": ["fs-mkdirp-stream@2.0.1", "", { "dependencies": { "graceful-fs": "^4.2.8", "streamx": "^2.12.0" } }, "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw=="], + + "fs-tree-diff": ["fs-tree-diff@2.0.1", "", { "dependencies": { "@types/symlink-or-copy": "^1.2.0", "heimdalljs-logger": "^0.1.7", "object-assign": "^4.1.0", "path-posix": "^1.0.0", "symlink-or-copy": "^1.1.8" } }, "sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -307,18 +422,70 @@ "get-source": ["get-source@2.0.12", "", { "dependencies": { "data-uri-to-buffer": "^2.0.0", "source-map": "^0.6.1" } }, "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w=="], + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "glob-stream": ["glob-stream@8.0.3", "", { "dependencies": { "@gulpjs/to-absolute-glob": "^4.0.0", "anymatch": "^3.1.3", "fastq": "^1.13.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "is-negated-glob": "^1.0.0", "normalize-path": "^3.0.0", "streamx": "^2.12.5" } }, "sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A=="], + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gulp-sort": ["gulp-sort@2.0.0", "", { "dependencies": { "through2": "^2.0.1" } }, "sha512-MyTel3FXOdh1qhw1yKhpimQrAmur9q1X0ZigLmCOxouQD+BD3za9/89O+HfbgBQvvh4igEbp0/PUWO+VqGYG1g=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "heimdalljs": ["heimdalljs@0.2.6", "", { "dependencies": { "rsvp": "~3.2.1" } }, "sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA=="], + + "heimdalljs-logger": ["heimdalljs-logger@0.1.10", "", { "dependencies": { "debug": "^2.2.0", "heimdalljs": "^0.2.6" } }, "sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g=="], + + "html-parse-stringify": ["html-parse-stringify@3.0.1", "", { "dependencies": { "void-elements": "3.1.0" } }, "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="], + + "htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="], + + "i18next": ["i18next@25.8.1", "", { "dependencies": { "@babel/runtime": "^7.28.4" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-nFFxhwcRNggIrkv2hx/xMYVMG7Z8iMUA4ZuH4tgcbZiI0bK1jn3kSDIXNWuQDt1xVAu7mb7Qn82TpH7ZAk/okA=="], + + "i18next-browser-languagedetector": ["i18next-browser-languagedetector@8.2.0", "", { "dependencies": { "@babel/runtime": "^7.23.2" } }, "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g=="], + + "i18next-http-backend": ["i18next-http-backend@3.0.2", "", { "dependencies": { "cross-fetch": "4.0.0" } }, "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g=="], + + "i18next-parser": ["i18next-parser@9.3.0", "", { "dependencies": { "@babel/runtime": "^7.25.0", "broccoli-plugin": "^4.0.7", "cheerio": "^1.0.0", "colors": "^1.4.0", "commander": "^12.1.0", "eol": "^0.9.1", "esbuild": "^0.25.0", "fs-extra": "^11.2.0", "gulp-sort": "^2.0.0", "i18next": "^23.5.1 || ^24.2.0", "js-yaml": "^4.1.0", "lilconfig": "^3.1.3", "rsvp": "^4.8.5", "sort-keys": "^5.0.0", "typescript": "^5.0.4", "vinyl": "^3.0.0", "vinyl-fs": "^4.0.0" }, "bin": { "i18next": "bin/cli.js" } }, "sha512-VaQqk/6nLzTFx1MDiCZFtzZXKKyBV6Dv0cJMFM/hOt4/BWHWRgYafzYfVQRUzotwUwjqeNCprWnutzD/YAGczg=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-negated-glob": ["is-negated-glob@1.0.0", "", {}, "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-valid-glob": ["is-valid-glob@1.0.0", "", {}, "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "itty-time": ["itty-time@1.0.6", "", {}, "sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw=="], + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], @@ -329,6 +496,12 @@ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "lead": ["lead@4.0.0", "", {}, "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], @@ -339,10 +512,18 @@ "magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], + "matcher-collection": ["matcher-collection@2.0.1", "", { "dependencies": { "@types/minimatch": "^3.0.3", "minimatch": "^3.0.2" } }, "sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ=="], + "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], "miniflare": ["miniflare@3.20241106.1", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "^8.8.0", "acorn-walk": "^8.2.0", "capnp-ts": "^0.7.0", "exit-hook": "^2.2.1", "glob-to-regexp": "^0.4.1", "stoppable": "^1.1.0", "undici": "^5.28.4", "workerd": "1.20241106.1", "ws": "^8.18.0", "youch": "^3.2.2", "zod": "^3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-dM3RBlJE8rUFxnqlPCaFCq0E7qQqEQvKbYX7W/APGCK+rLcyLmEBzC4GQR/niXdNM/oV6gdg9AA50ghnn2ALuw=="], + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "mktemp": ["mktemp@2.0.2", "", {}, "sha512-Q9wJ/xhzeD9Wua1MwDN2v3ah3HENsUVSlzzL9Qw149cL9hHZkXtQGl3Eq36BbdLV+/qUwaP1WtJQ+H/+Oxso8g=="], + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="], @@ -351,18 +532,46 @@ "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "node-forge": ["node-forge@1.3.3", "", {}, "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="], "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "now-and-later": ["now-and-later@3.0.0", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], + + "parse5-parser-stream": ["parse5-parser-stream@7.1.2", "", { "dependencies": { "parse5": "^7.0.0" } }, "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + "path-posix": ["path-posix@1.0.0", "", {}, "sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], @@ -377,20 +586,40 @@ "printable-characters": ["printable-characters@1.0.42", "", {}, "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ=="], + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "promise-map-series": ["promise-map-series@0.3.0", "", {}, "sha512-3npG2NGhTc8BWBolLLf8l/92OxMGaRLbqvIh9wjCHhDXNvk4zsxaTaCpiCunW09qWPrN2zeNSNwRLVBrQQtutA=="], + + "quick-temp": ["quick-temp@0.1.9", "", { "dependencies": { "mktemp": "^2.0.1", "rimraf": "^5.0.10", "underscore.string": "~3.3.6" } }, "sha512-yI0h7tIhKVObn03kD+Ln9JFi4OljD28lfaOsTdfpTR0xzrhGOod+q66CjGafUqYX2juUfT9oHIGrTBBo22mkRA=="], + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + "react-i18next": ["react-i18next@16.5.4", "", { "dependencies": { "@babel/runtime": "^7.28.4", "html-parse-stringify": "^3.0.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "i18next": ">= 25.6.2", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g=="], + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "remove-trailing-separator": ["remove-trailing-separator@1.1.0", "", {}, "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw=="], + + "replace-ext": ["replace-ext@2.0.0", "", {}, "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug=="], + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-options": ["resolve-options@2.0.0", "", { "dependencies": { "value-or-function": "^4.0.0" } }, "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A=="], + "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + "rollup": ["rollup@4.54.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.54.0", "@rollup/rollup-android-arm64": "4.54.0", "@rollup/rollup-darwin-arm64": "4.54.0", "@rollup/rollup-darwin-x64": "4.54.0", "@rollup/rollup-freebsd-arm64": "4.54.0", "@rollup/rollup-freebsd-x64": "4.54.0", "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", "@rollup/rollup-linux-arm-musleabihf": "4.54.0", "@rollup/rollup-linux-arm64-gnu": "4.54.0", "@rollup/rollup-linux-arm64-musl": "4.54.0", "@rollup/rollup-linux-loong64-gnu": "4.54.0", "@rollup/rollup-linux-ppc64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-musl": "4.54.0", "@rollup/rollup-linux-s390x-gnu": "4.54.0", "@rollup/rollup-linux-x64-gnu": "4.54.0", "@rollup/rollup-linux-x64-musl": "4.54.0", "@rollup/rollup-openharmony-arm64": "4.54.0", "@rollup/rollup-win32-arm64-msvc": "4.54.0", "@rollup/rollup-win32-ia32-msvc": "4.54.0", "@rollup/rollup-win32-x64-gnu": "4.54.0", "@rollup/rollup-win32-x64-msvc": "4.54.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw=="], "rollup-plugin-inject": ["rollup-plugin-inject@3.0.2", "", { "dependencies": { "estree-walker": "^0.6.1", "magic-string": "^0.25.3", "rollup-pluginutils": "^2.8.1" } }, "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w=="], @@ -399,52 +628,134 @@ "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="], + "rsvp": ["rsvp@4.8.5", "", {}, "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], "selfsigned": ["selfsigned@2.4.1", "", { "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" } }, "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q=="], "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + "sort-keys": ["sort-keys@5.1.0", "", { "dependencies": { "is-plain-obj": "^4.0.0" } }, "sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ=="], + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "sourcemap-codec": ["sourcemap-codec@1.4.8", "", {}, "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="], + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + "stacktracey": ["stacktracey@2.1.8", "", { "dependencies": { "as-table": "^1.0.36", "get-source": "^2.0.12" } }, "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw=="], "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], + "stream-composer": ["stream-composer@1.0.2", "", { "dependencies": { "streamx": "^2.13.2" } }, "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w=="], + + "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="], + + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "svg-parser": ["svg-parser@2.0.4", "", {}, "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="], + "symlink-or-copy": ["symlink-or-copy@1.3.1", "", {}, "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA=="], + + "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], + + "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], + + "through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="], + + "to-through": ["to-through@3.0.0", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], - "undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + "underscore.string": ["underscore.string@3.3.6", "", { "dependencies": { "sprintf-js": "^1.1.1", "util-deprecate": "^1.0.2" } }, "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ=="], + + "undici": ["undici@7.20.0", "", {}, "sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], "unenv": ["unenv-nightly@2.0.0-20241111-080453-894aa31", "", { "dependencies": { "defu": "^6.1.4", "ohash": "^1.1.4", "pathe": "^1.1.2", "ufo": "^1.5.4" } }, "sha512-0W39QQOQ9VE8kVVUpGwEG+pZcsCXk5wqNG6rDPE6Gr+fiA69LR0qERM61hW5KCOkC1/ArCFrfCGjwHyyv/bI0Q=="], + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "value-or-function": ["value-or-function@4.0.0", "", {}, "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg=="], + + "vinyl": ["vinyl@3.0.1", "", { "dependencies": { "clone": "^2.1.2", "remove-trailing-separator": "^1.1.0", "replace-ext": "^2.0.0", "teex": "^1.0.1" } }, "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA=="], + + "vinyl-contents": ["vinyl-contents@2.0.0", "", { "dependencies": { "bl": "^5.0.0", "vinyl": "^3.0.0" } }, "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q=="], + + "vinyl-fs": ["vinyl-fs@4.0.2", "", { "dependencies": { "fs-mkdirp-stream": "^2.0.1", "glob-stream": "^8.0.3", "graceful-fs": "^4.2.11", "iconv-lite": "^0.6.3", "is-valid-glob": "^1.0.0", "lead": "^4.0.0", "normalize-path": "3.0.0", "resolve-options": "^2.0.0", "stream-composer": "^1.0.2", "streamx": "^2.14.0", "to-through": "^3.0.0", "value-or-function": "^4.0.0", "vinyl": "^3.0.1", "vinyl-sourcemap": "^2.0.0" } }, "sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA=="], + + "vinyl-sourcemap": ["vinyl-sourcemap@2.0.0", "", { "dependencies": { "convert-source-map": "^2.0.0", "graceful-fs": "^4.2.10", "now-and-later": "^3.0.0", "streamx": "^2.12.5", "vinyl": "^3.0.0", "vinyl-contents": "^2.0.0" } }, "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q=="], + "vite": ["vite@5.4.21", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw=="], "vite-plugin-svgr": ["vite-plugin-svgr@4.5.0", "", { "dependencies": { "@rollup/pluginutils": "^5.2.0", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0" }, "peerDependencies": { "vite": ">=2.6.0" } }, "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA=="], + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + + "walk-sync": ["walk-sync@2.2.0", "", { "dependencies": { "@types/minimatch": "^3.0.3", "ensure-posix-path": "^1.1.0", "matcher-collection": "^2.0.0", "minimatch": "^3.0.4" } }, "sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "workerd": ["workerd@1.20241106.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20241106.1", "@cloudflare/workerd-darwin-arm64": "1.20241106.1", "@cloudflare/workerd-linux-64": "1.20241106.1", "@cloudflare/workerd-linux-arm64": "1.20241106.1", "@cloudflare/workerd-windows-64": "1.20241106.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-1GdKl0kDw8rrirr/ThcK66Kbl4/jd4h8uHx5g7YHBrnenY5SX1UPuop2cnCzYUxlg55kPjzIqqYslz1muRFgFw=="], "wrangler": ["wrangler@3.90.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.3.4", "@cloudflare/workers-shared": "0.8.0", "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "blake3-wasm": "^2.1.5", "chokidar": "^4.0.1", "date-fns": "^4.1.0", "esbuild": "0.17.19", "itty-time": "^1.0.6", "miniflare": "3.20241106.1", "nanoid": "^3.3.3", "path-to-regexp": "^6.3.0", "resolve": "^1.22.8", "resolve.exports": "^2.0.2", "selfsigned": "^2.0.1", "source-map": "^0.6.1", "unenv": "npm:unenv-nightly@2.0.0-20241111-080453-894aa31", "workerd": "1.20241106.1", "xxhash-wasm": "^1.0.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20241106.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-E/6E9ORAl987+3kP8wDiE3L1lj9r4vQ32/dl5toIxIkSMssmPRQVdxqwgMxbxJrytbFNo8Eo6swgjd4y4nUaLg=="], + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], @@ -455,12 +766,110 @@ "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "broccoli-output-wrapper/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "fs-merger/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "heimdalljs/rsvp": ["rsvp@3.2.1", "", {}, "sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg=="], + + "heimdalljs-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "htmlparser2/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], + + "i18next-parser/i18next": ["i18next@24.2.3", "", { "dependencies": { "@babel/runtime": "^7.26.10" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A=="], + + "miniflare/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + + "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "quick-temp/rimraf": ["rimraf@5.0.10", "", { "dependencies": { "glob": "^10.3.7" }, "bin": { "rimraf": "dist/esm/bin.mjs" } }, "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ=="], + "rollup-plugin-inject/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], "rollup-pluginutils/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "vite/esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + "wrangler/esbuild": ["esbuild@0.17.19", "", { "optionalDependencies": { "@esbuild/android-arm": "0.17.19", "@esbuild/android-arm64": "0.17.19", "@esbuild/android-x64": "0.17.19", "@esbuild/darwin-arm64": "0.17.19", "@esbuild/darwin-x64": "0.17.19", "@esbuild/freebsd-arm64": "0.17.19", "@esbuild/freebsd-x64": "0.17.19", "@esbuild/linux-arm": "0.17.19", "@esbuild/linux-arm64": "0.17.19", "@esbuild/linux-ia32": "0.17.19", "@esbuild/linux-loong64": "0.17.19", "@esbuild/linux-mips64el": "0.17.19", "@esbuild/linux-ppc64": "0.17.19", "@esbuild/linux-riscv64": "0.17.19", "@esbuild/linux-s390x": "0.17.19", "@esbuild/linux-x64": "0.17.19", "@esbuild/netbsd-x64": "0.17.19", "@esbuild/openbsd-x64": "0.17.19", "@esbuild/sunos-x64": "0.17.19", "@esbuild/win32-arm64": "0.17.19", "@esbuild/win32-ia32": "0.17.19", "@esbuild/win32-x64": "0.17.19" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw=="], + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "broccoli-output-wrapper/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "broccoli-output-wrapper/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "fs-merger/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "fs-merger/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "heimdalljs-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "quick-temp/rimraf/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.17.19", "", { "os": "android", "cpu": "arm" }, "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A=="], "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.17.19", "", { "os": "android", "cpu": "arm64" }, "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA=="], @@ -504,5 +913,13 @@ "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.17.19", "", { "os": "win32", "cpu": "ia32" }, "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw=="], "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.17.19", "", { "os": "win32", "cpu": "x64" }, "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA=="], + + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "quick-temp/rimraf/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "quick-temp/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], } } diff --git a/i18next-parser.config.cjs b/i18next-parser.config.cjs new file mode 100644 index 0000000..e677c42 --- /dev/null +++ b/i18next-parser.config.cjs @@ -0,0 +1,12 @@ +module.exports = { + locales: ["ko", "en"], + input: ["src/**/*.{ts,tsx}"], + output: "public/locales/$LOCALE/$NAMESPACE.json", + defaultNamespace: "common", + defaultValue: "", + keySeparator: ".", + namespaceSeparator: ":", + createOldCatalogs: false, + keepRemoved: true, + sort: true +}; diff --git a/package.json b/package.json index 31a135d..59eb9c7 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,18 @@ "dev:preview": "bun run build && bunx wrangler pages dev dist", "preview": "vite preview", "test": "bun test", - "test:watch": "bun test --watch" + "test:watch": "bun test --watch", + "i18n:extract": "bunx i18next --config i18next-parser.config.cjs" }, "dependencies": { "dompurify": "^3.3.1", "emoji-datasource": "^16.0.0", + "i18next": "^25.8.1", + "i18next-browser-languagedetector": "^8.2.0", + "i18next-http-backend": "^3.0.2", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-i18next": "^16.5.4", "wrangler": "3.90.0" }, "devDependencies": { @@ -23,6 +28,7 @@ "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.3.1", + "i18next-parser": "^9.3.0", "typescript": "^5.5.4", "vite": "^5.4.0", "vite-plugin-svgr": "^4.5.0" diff --git a/public/locales/en/common.json b/public/locales/en/common.json new file mode 100644 index 0000000..99a024a --- /dev/null +++ b/public/locales/en/common.json @@ -0,0 +1,412 @@ +{ + "actions": { + "add": "Add", + "cancel": "Cancel", + "close": "Close", + "reload": "Reload", + "remove": "Remove", + "selectHint": "Select (Enter)", + "send": "Send" + }, + "accountAdd": { + "closeAria": "Close add account", + "closeLabel": "Close add account", + "connectWithOAuth": "Connect with OAuth", + "connecting": "Connecting...", + "oauthRedirectHint": "You'll be redirected back after OAuth approval.", + "openAria": "Add account", + "openLabel": "Add account", + "serverAddress": "Server address", + "serverPlaceholder": "mastodon.social" + }, + "accountLabel": { + "unknown": "Unknown" + }, + "accountSelector": { + "empty": "No accounts registered.", + "placeholder": "Select an account.", + "shortcutHint": "Select account (Ctrl+Shift+A)", + "shortcutHintCompact": "Select account (A)" + }, + "app": { + "logoAlt": "Deck logo", + "logoHomeAria": "Deck home", + "mobileBlocker": { + "aria": "Mobile notice", + "description": "The multi-column interface is limited on mobile. Please use desktop or tablet.", + "title": "This app isn't available on mobile ๐Ÿ™‡โ€โ™‚๏ธ" + }, + "sidebarDescription": "Switch between multiple accounts and monitor timelines in real time.", + "sourceCode": "Source code", + "tagline": "Open-source fediverse web client" + }, + "colorScheme": { + "dark": "Dark", + "light": "Light", + "system": "System" + }, + "compose": { + "aria": "Compose", + "attachments": { + "addAria": "Add image", + "addHint": "Add image (Ctrl+Shift+I)", + "previewAria": "Image preview", + "selectedImageAlt": "Selected image", + "selectedImageOriginalAlt": "Original selected image" + }, + "cw": { + "aria": "Content warning", + "placeholder": "Enter content warning", + "toggleAria": "Toggle content warning", + "toggleHint": "Content warning (Ctrl+Shift+W)" + }, + "closeAria": "Close compose", + "emojiPanel": { + "aria": "Emoji palette", + "emojiAria": "Emoji {{label}}", + "empty": "No emojis available.", + "loading": "Loading emojis...", + "noSearchResults": "No search results.", + "openAria": "Open emoji palette", + "openHint": "Open emoji palette (Ctrl+Shift+E)", + "searchAria": "Search emojis", + "searchPlaceholder": "Search emojis", + "searchResults": "Search results", + "selectAccount": "Please select an account.", + "standardDividerAria": "Standard emoji divider", + "standardTitle": "Standard emoji" + }, + "emojiSuggestions": { + "aria": "Emoji suggestions", + "itemAria": "Emoji {{label}}" + }, + "inputHint": "Compose (N / Ctrl+Shift+N)", + "openAria": "Open compose", + "placeholder": "What's on your mind?", + "replyingTo": "Replying to: {{summary}}", + "submitAria": "Post", + "submitHint": "Send (Ctrl+Enter)", + "submitting": "Posting...", + "title": "Compose", + "visibility": { + "direct": "DM", + "hint": "Visibility (Ctrl+Shift+O)", + "private": "Followers", + "public": "Public", + "publicWarning": "Posting publicly. Please be cautious with sensitive content.", + "unlisted": "Unlisted" + } + }, + "confirm": { + "clearLocalStorage": "Clear all local data? Accounts and settings will be reset.", + "removeAccount": "Remove this account?" + }, + "emojiCategory": { + "activities": "Activities", + "animals": "Animals & Nature", + "flags": "Flags", + "food": "Food & Drink", + "objects": "Objects", + "other": "Other", + "people": "People & Body", + "recent": "Recent", + "smileys": "Smileys & Emotion", + "symbols": "Symbols", + "travel": "Travel & Places" + }, + "errors": { + "accountAlreadyRegistered": "This account is already registered.", + "accountReauthNotFound": "Couldn't find the account to reauthenticate.", + "accountRequired": "Please select an account.", + "appContextRequired": "AppContext provider is required.", + "appRegistrationLoadFailed": "Couldn't load app registration details.", + "bookmarkFailed": "Failed to process bookmark.", + "boostFailed": "Failed to process boost.", + "characterLimitExceeded": "Character limit ({{limit}} chars) exceeded.", + "composeFailed": "Failed to publish the post.", + "emojisLoadFailed": "Failed to load emojis.", + "likeFailed": "Failed to process like.", + "oauth": { + "failed": "OAuth processing failed.", + "invalidState": "OAuth state is invalid. Please try again.", + "misskeyMissingSession": "Couldn't receive Misskey session info. Please try again.", + "misskeySessionMismatch": "Misskey session info doesn't match. Please try again.", + "missingCode": "Couldn't receive the OAuth code. Please try again." + }, + "oauthConnectFailed": "Failed to connect via OAuth.", + "reactionAlreadyExists": "You've already reacted. Remove it first.", + "reactionFailed": "Failed to process reaction.", + "reactionMisskeyOnly": "Reactions are only available on Misskey accounts.", + "serverAddressRequired": "Please enter a server address.", + "statusDeleteFailed": "Failed to delete the post.", + "threadLoadFailed": "Couldn't load the thread.", + "timelineLoadFailed": "Couldn't load the timeline.", + "timelineLoadMoreFailed": "Couldn't load more posts." + }, + "infoModal": { + "closeAria": "Close {{title}}" + }, + "infoPages": { + "backToTimeline": "Back to timeline", + "license": "License", + "oss": "Open-source list", + "shortcuts": "Shortcuts", + "terms": "Terms of service" + }, + "language": { + "english": "English", + "korean": "Korean" + }, + "mention": { + "viewProfile": "View profile: {{name}}" + }, + "menu": { + "closeAria": "Close menu", + "openAria": "Open menu", + "title": "Menu" + }, + "notifications": { + "badgeCount": "{{count}}", + "badgeOver": "99+", + "close": "Close notifications", + "empty": "No notifications to display.", + "loading": "Loading notifications...", + "open": "Open notifications", + "openHint": "Open notifications (G)", + "openWithCount": "Open notifications (new {{badge}})", + "title": "Notifications", + "toast": "New notification received.", + "toastAction": "Go to the column with notifications", + "toastActionAria": "Go to the column where notifications arrived" + }, + "oauth": { + "authenticating": "Authenticating with OAuth..." + }, + "pomodoro": { + "controls": { + "reset": "Reset", + "resetHint": "Reset (X)", + "start": "Start", + "stop": "Stop", + "toggleHint": "Start/Stop (S)" + }, + "focusSession": { + "description": "Pomodoro timer is running.
Timeline stays hidden until focus ends.", + "title": "๐ŸŽฏ Focus session in progress" + }, + "nextSession": "Switch to next session", + "progress": { + "completed": "Session {{session}} ({{label}} complete)", + "pending": "Session {{session}} (pending)" + }, + "session": { + "break": "Break", + "focus": "Focus", + "longBreak": "Long break" + }, + "todos": { + "addAria": "Add todo", + "aria": "Pomodoro todos", + "completeAria": "Complete todo: {{text}}", + "inputAria": "Pomodoro todo input", + "inputHint": "Add task (F) ยท โ†‘ to list ยท ESC blur", + "listHint": "Up/Down move ยท Space complete ยท D delete ยท โ†’ timeline ยท ESC clear", + "placeholder": "Add a task", + "removeAria": "Remove todo: {{text}}" + } + }, + "reactions": { + "add": "Reaction", + "addAria": "Add reaction", + "panelAria": "Select reaction" + }, + "sectionMenu": { + "addLeft": "Add section to the left", + "addRight": "Add section to the right", + "moveLeft": "Move left", + "moveRight": "Move right", + "openAria": "Open section menu", + "openHint": "Open section menu (M)", + "openOrigin": "View on origin server", + "refresh": "Refresh", + "remove": "Remove section", + "settings": "Section settings" + }, + "sectionSettings": { + "customEmojis": { + "description": "Show custom emojis in names and content.", + "title": "Show custom emojis" + }, + "profileImages": { + "description": "Show profile images only in this section.", + "title": "Show profile images" + }, + "reactions": { + "description": "Show reactions from servers that support them.", + "title": "Show reactions" + }, + "sectionSize": { + "aria": "Set section width", + "description": "Adjust the column width for this section.", + "large": "Large", + "medium": "Medium", + "small": "Small", + "title": "Section width" + }, + "title": "Section settings" + }, + "settings": { + "account": { + "description": "Select an account to reauthenticate or remove.", + "reauth": "Reauthenticate", + "reauthAria": "Reauthenticate account", + "reauthing": "Reauthenticating...", + "removeAria": "Remove account", + "title": "Account management" + }, + "colorScheme": { + "aria": "Select color mode", + "description": "Follow system settings or lock light/dark mode.", + "title": "Color mode" + }, + "language": { + "aria": "Select language", + "description": "Choose the display language.", + "title": "Language" + }, + "pomodoro": { + "break": "Break", + "description": "Show the Pomodoro timer in the sidebar.", + "focus": "Focus", + "longBreak": "Long break", + "timerDescription": "Set focus, break, and long break minutes.", + "timerTitle": "Pomodoro durations", + "title": "Pomodoro timer" + }, + "storage": { + "clear": "Clear all", + "clearAria": "Clear local storage", + "description": "Delete all local data including accounts and settings.", + "title": "Clear local storage" + }, + "theme": { + "aria": "Select theme", + "description": "Choose from Default, Christmas, Sky Pink, Monochrome, and Matcha Core.", + "title": "Theme" + }, + "open": "Open settings", + "title": "Settings" + }, + "shortcuts": { + "compose": { + "attachMedia": "Attach media", + "blur": "Blur compose input", + "focus": "Focus compose input", + "focusWhileActive": "Focus compose input (while active)", + "note": "Applies within the compose area.", + "openAccountSelector": "Open account selector", + "openVisibility": "Open visibility selector", + "submit": "Post", + "title": "Compose", + "toggleContentWarning": "Toggle content warning", + "toggleEmojiPanel": "Toggle emoji panel" + }, + "emojiPanel": { + "close": "Close emoji picker", + "navigate": "Navigate emojis/categories", + "note": "Works only when the emoji picker is open.", + "select": "Insert selected emoji / react", + "title": "Emoji panel / reactions", + "toggleCategory": "Collapse/expand categories" + }, + "imageViewer": { + "close": "Close image viewer", + "navigate": "Navigate images", + "title": "Image viewer" + }, + "pomodoro": { + "focusTask": "Focus add-task input", + "reset": "Reset Pomodoro timer", + "title": "Pomodoro timer", + "toggle": "Start/stop Pomodoro timer" + }, + "selected": { + "boost": "Boost", + "closeMenu": "Close open menu", + "likeOrReaction": "Like (Mastodon) / โค๏ธ reaction (Misskey)", + "navigateMenu": "Navigate open menu", + "note": "Works only when a post is selected.", + "openAccount": "Open account selector", + "openColumnMenu": "Open column menu", + "openMedia": "Open attached media", + "openNotifications": "Open notifications", + "openProfile": "Open author profile", + "openReactions": "Open reaction palette (Misskey)", + "openStatus": "Open post popup (or select item in open menus)", + "openTimelineMenu": "Open timeline menu", + "reply": "Reply", + "title": "Selected post controls" + }, + "suggestions": { + "close": "Close suggestions", + "insert": "Insert suggested emoji", + "navigate": "Navigate suggestions", + "note": "Works only when the suggestion list is open.", + "title": "Emoji suggestions" + }, + "timeline": { + "clearSelection": "Clear selection", + "moveColumn": "Move to adjacent column", + "moveVertical": "Move up/down within selected posts", + "selectLeftmost": "Select leftmost post when nothing is selected", + "title": "Timeline navigation" + } + }, + "status": { + "boostedBy": "Boosted by ", + "threadLoading": "Loading thread...", + "title": "Post", + "viewAria": "View post" + }, + "themes": { + "christmas": "Christmas", + "default": "Default", + "matchaCore": "Matcha Core", + "monochrome": "Monochrome", + "skyPink": "Sky Pink" + }, + "timeline": { + "accountRequired": "Select an account to load the timeline.", + "actionsAria": "Timeline actions", + "bookmarks": "Bookmarks", + "empty": { + "bookmarks": "No bookmarked posts.", + "default": "No posts to display.", + "notifications": "No notifications to display." + }, + "federated": "Federated", + "global": "Global", + "home": "Home", + "loadingMore": "Loading more...", + "local": "Local", + "notifications": "Notifications", + "pending": { + "action": "View", + "aria": "Show {{label}} new posts", + "label": "{{label}} new posts", + "sr": "{{label}} new posts have arrived.", + "title": "Show new posts" + }, + "scrollTop": "Scroll to top", + "selectAria": "Select timeline: {{label}}", + "selectHint": "Select timeline (T)", + "selectMenuAria": "Select timeline", + "social": "Social" + }, + "toast": { + "bookmarkAdded": "Bookmarked.", + "bookmarkRemoved": "Bookmark removed.", + "close": "Close", + "closeAria": "Close toast" + } +} diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json new file mode 100644 index 0000000..62b0736 --- /dev/null +++ b/public/locales/ko/common.json @@ -0,0 +1,412 @@ +{ + "actions": { + "add": "์ถ”๊ฐ€", + "cancel": "์ทจ์†Œ", + "close": "๋‹ซ๊ธฐ", + "reload": "๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ", + "remove": "์‚ญ์ œ", + "selectHint": "์„ ํƒ (Enter)", + "send": "์ „์†ก" + }, + "accountAdd": { + "closeAria": "๊ณ„์ • ์ถ”๊ฐ€ ๋‹ซ๊ธฐ", + "closeLabel": "๊ณ„์ • ์ถ”๊ฐ€ ๋‹ซ๊ธฐ", + "connectWithOAuth": "OAuth๋กœ ์—ฐ๊ฒฐ", + "connecting": "์—ฐ๊ฒฐ ์ค‘...", + "oauthRedirectHint": "OAuth ์Šน์ธ ํ›„ ์ž๋™์œผ๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.", + "openAria": "๊ณ„์ • ์ถ”๊ฐ€", + "openLabel": "๊ณ„์ • ์ถ”๊ฐ€", + "serverAddress": "์„œ๋ฒ„ ์ฃผ์†Œ", + "serverPlaceholder": "mastodon.social" + }, + "accountLabel": { + "unknown": "์•Œ ์ˆ˜ ์—†์Œ" + }, + "accountSelector": { + "empty": "๋“ฑ๋ก๋œ ๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.", + "placeholder": "๊ณ„์ •์„ ์„ ํƒํ•˜์„ธ์š”.", + "shortcutHint": "๊ณ„์ • ์„ ํƒ (Ctrl+Shift+A)", + "shortcutHintCompact": "๊ณ„์ • ์„ ํƒ (A)" + }, + "app": { + "logoAlt": "Deck ๋กœ๊ณ ", + "logoHomeAria": "Deck ํ™ˆ", + "mobileBlocker": { + "aria": "๋ชจ๋ฐ”์ผ ์•ˆ๋‚ด", + "description": "๋ฉ€ํ‹ฐ ์ปฌ๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค ํŠน์„ฑ์ƒ ๋ชจ๋ฐ”์ผ ์ง€์›์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ ๋˜๋Š” ํƒœ๋ธ”๋ฆฟ์—์„œ ์ด์šฉํ•ด ์ฃผ์„ธ์š”.", + "title": "๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‡โ€โ™‚๏ธ" + }, + "sidebarDescription": "์—ฌ๋Ÿฌ ๊ณ„์ •์„ ์ „ํ™˜ํ•˜๊ณ  ํƒ€์ž„๋ผ์ธ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "sourceCode": "์†Œ์Šค ์ฝ”๋“œ", + "tagline": "์˜คํ”ˆ์†Œ์Šค ํŽ˜๋””๋ฒ„์Šค ์›น ํด๋ผ์ด์–ธํŠธ" + }, + "colorScheme": { + "dark": "๋‹คํฌ", + "light": "๋ผ์ดํŠธ", + "system": "์‹œ์Šคํ…œ" + }, + "compose": { + "aria": "๊ธ€ ์ž‘์„ฑ", + "attachments": { + "addAria": "์ด๋ฏธ์ง€ ์ถ”๊ฐ€", + "addHint": "์ด๋ฏธ์ง€ ์ถ”๊ฐ€ (Ctrl+Shift+I)", + "previewAria": "์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ", + "selectedImageAlt": "์„ ํƒํ•œ ์ด๋ฏธ์ง€", + "selectedImageOriginalAlt": "์„ ํƒํ•œ ์ด๋ฏธ์ง€ ์›๋ณธ" + }, + "cw": { + "aria": "์ฝ˜ํ…์ธ  ๊ฒฝ๊ณ ", + "placeholder": "CW ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”", + "toggleAria": "์ฝ˜ํ…์ธ  ๊ฒฝ๊ณ  ์ž…๋ ฅ", + "toggleHint": "์ฝ˜ํ…์ธ  ๊ฒฝ๊ณ  ์ž…๋ ฅ (Ctrl+Shift+W)" + }, + "closeAria": "๊ธ€์“ฐ๊ธฐ ๋‹ซ๊ธฐ", + "emojiPanel": { + "aria": "์ด๋ชจ์ง€ ํŒ”๋ ›ํŠธ", + "emojiAria": "์ด๋ชจ์ง€ {{label}}", + "empty": "์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ชจ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.", + "loading": "์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...", + "noSearchResults": "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.", + "openAria": "์ด๋ชจ์ง€ ํŒ”๋ ›ํŠธ ์—ด๊ธฐ", + "openHint": "์ด๋ชจ์ง€ ํŒ”๋ ›ํŠธ ์—ด๊ธฐ (Ctrl+Shift+E)", + "searchAria": "์ด๋ชจ์ง€ ๊ฒ€์ƒ‰", + "searchPlaceholder": "์ด๋ชจ์ง€ ๊ฒ€์ƒ‰", + "searchResults": "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ", + "selectAccount": "๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.", + "standardDividerAria": "ํ‘œ์ค€ ์ด๋ชจ์ง€ ๊ตฌ๋ถ„์„ ", + "standardTitle": "ํ‘œ์ค€ ์ด๋ชจ์ง€" + }, + "emojiSuggestions": { + "aria": "์ด๋ชจ์ง€ ์ถ”์ฒœ", + "itemAria": "์ด๋ชจ์ง€ {{label}}" + }, + "inputHint": "๊ธ€ ์ž‘์„ฑ (N / Ctrl+Shift+N)", + "openAria": "๊ธ€์“ฐ๊ธฐ ์—ด๊ธฐ", + "placeholder": "์ง€๊ธˆ ๋ฌด์Šจ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๋‚˜์š”?", + "replyingTo": "๋‹ต๊ธ€ ๋Œ€์ƒ: {{summary}}", + "submitAria": "๊ฒŒ์‹œ", + "submitHint": "์ „์†ก (Ctrl+Enter)", + "submitting": "๊ฒŒ์‹œ ์ค‘...", + "title": "๊ธ€์“ฐ๊ธฐ", + "visibility": { + "direct": "DM", + "hint": "๊ณต๊ฐœ ๋ฒ”์œ„ (Ctrl+Shift+O)", + "private": "ํŒ”๋กœ์›Œ", + "public": "์ „์ฒด ๊ณต๊ฐœ", + "publicWarning": "์ „์ฒด ๊ณต๊ฐœ๋กœ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ๋‚ด์šฉ์€ ์ฃผ์˜ํ•ด์ฃผ์„ธ์š”.", + "unlisted": "๋ฏธ๋“ฑ๋ก" + } + }, + "confirm": { + "clearLocalStorage": "๋กœ์ปฌ ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ• ๊นŒ์š”? ๊ณ„์ •๊ณผ ์„ค์ • ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.", + "removeAccount": "์ด ๊ณ„์ •์„ ์‚ญ์ œํ• ๊นŒ์š”?" + }, + "emojiCategory": { + "activities": "ํ™œ๋™", + "animals": "๋™๋ฌผ/์ž์—ฐ", + "flags": "๊ตญ๊ธฐ", + "food": "์Œ์‹", + "objects": "์‚ฌ๋ฌผ", + "other": "๊ธฐํƒ€", + "people": "์‚ฌ๋žŒ/์†", + "recent": "์ตœ๊ทผ ์‚ฌ์šฉ", + "smileys": "ํ‘œ์ •", + "symbols": "๊ธฐํ˜ธ", + "travel": "์—ฌํ–‰/์žฅ์†Œ" + }, + "errors": { + "accountAlreadyRegistered": "์ด๋ฏธ ๋“ฑ๋ก๋œ ๊ณ„์ •์ž…๋‹ˆ๋‹ค.", + "accountReauthNotFound": "์žฌ์ธ์ฆํ•  ๊ณ„์ •์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.", + "accountRequired": "๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.", + "appContextRequired": "AppContext provider๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.", + "appRegistrationLoadFailed": "์•ฑ ๋“ฑ๋ก ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.", + "bookmarkFailed": "๋ถ๋งˆํฌ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "boostFailed": "๋ถ€์ŠคํŠธ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "characterLimitExceeded": "๊ธ€์ž ์ˆ˜ ์ œํ•œ({{limit}}์ž)์„ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.", + "composeFailed": "๊ธ€ ์ž‘์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "emojisLoadFailed": "์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.", + "likeFailed": "์ข‹์•„์š” ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "oauth": { + "failed": "OAuth ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "invalidState": "OAuth ์ƒํƒœ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.", + "misskeyMissingSession": "๋ฏธ์Šคํ‚ค ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.", + "misskeySessionMismatch": "๋ฏธ์Šคํ‚ค ์„ธ์…˜ ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.", + "missingCode": "OAuth ์ฝ”๋“œ๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”." + }, + "oauthConnectFailed": "OAuth ์—ฐ๊ฒฐ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "reactionAlreadyExists": "์ด๋ฏธ ๋ฆฌ์•ก์…˜์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ทจ์†Œํ•ด์ฃผ์„ธ์š”.", + "reactionFailed": "๋ฆฌ์•ก์…˜ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "reactionMisskeyOnly": "๋ฆฌ์•ก์…˜์€ ๋ฏธ์Šคํ‚ค ๊ณ„์ •์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "serverAddressRequired": "์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.", + "statusDeleteFailed": "๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", + "threadLoadFailed": "์Šค๋ ˆ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.", + "timelineLoadFailed": "ํƒ€์ž„๋ผ์ธ์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.", + "timelineLoadMoreFailed": "์ถ”๊ฐ€ ๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "infoModal": { + "closeAria": "{{title}} ๋‹ซ๊ธฐ" + }, + "infoPages": { + "backToTimeline": "ํƒ€์ž„๋ผ์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ", + "license": "๋ผ์ด์„ ์Šค", + "oss": "์˜คํ”ˆ์†Œ์Šค ๋ชฉ๋ก", + "shortcuts": "๋‹จ์ถ•ํ‚ค", + "terms": "์ด์šฉ์•ฝ๊ด€" + }, + "language": { + "english": "์˜์–ด", + "korean": "ํ•œ๊ตญ์–ด" + }, + "mention": { + "viewProfile": "{{name}} ํ”„๋กœํ•„ ๋ณด๊ธฐ" + }, + "menu": { + "closeAria": "๋ฉ”๋‰ด ๋‹ซ๊ธฐ", + "openAria": "๋ฉ”๋‰ด ์—ด๊ธฐ", + "title": "๋ฉ”๋‰ด" + }, + "notifications": { + "badgeCount": "{{count}}๊ฐœ", + "badgeOver": "99๊ฐœ ์ด์ƒ", + "close": "์•Œ๋ฆผ ๋‹ซ๊ธฐ", + "empty": "ํ‘œ์‹œํ•  ์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค.", + "loading": "์•Œ๋ฆผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...", + "open": "์•Œ๋ฆผ ์—ด๊ธฐ", + "openHint": "์•Œ๋ฆผ ์—ด๊ธฐ (G)", + "openWithCount": "์•Œ๋ฆผ ์—ด๊ธฐ (์ƒˆ ์•Œ๋ฆผ {{badge}})", + "title": "์•Œ๋ฆผ", + "toast": "์ƒˆ ์•Œ๋ฆผ์ด ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.", + "toastAction": "์•Œ๋ฆผ ๋ฐ›์€ ์ปฌ๋Ÿผ์œผ๋กœ ์ด๋™", + "toastActionAria": "์•Œ๋ฆผ์ด ๋„์ฐฉํ•œ ์ปฌ๋Ÿผ์œผ๋กœ ์ด๋™" + }, + "oauth": { + "authenticating": "OAuth ์ธ์ฆ ์ค‘..." + }, + "pomodoro": { + "controls": { + "reset": "๋ฆฌ์…‹", + "resetHint": "๋ฆฌ์…‹ (X)", + "start": "์‹œ์ž‘", + "stop": "์ •์ง€", + "toggleHint": "์‹œ์ž‘/์ •์ง€ (S)" + }, + "focusSession": { + "description": "๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ๊ฐ€ ๋™์ž‘ ์ค‘์ž…๋‹ˆ๋‹ค.
ํƒ€์ž„๋ผ์ธ์€ ์ง‘์ค‘์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.", + "title": "๐ŸŽฏ ์ง‘์ค‘ ์„ธ์…˜ ์ง„ํ–‰ ์ค‘" + }, + "nextSession": "๋‹ค์Œ ์„ธ์…˜์œผ๋กœ ์ „ํ™˜", + "progress": { + "completed": "์„ธ์…˜ {{session}} ({{label}} ์™„๋ฃŒ)", + "pending": "์„ธ์…˜ {{session}} (์ง„ํ–‰ ์ „)" + }, + "session": { + "break": "ํœด์‹", + "focus": "์ง‘์ค‘", + "longBreak": "๊ธด ํœด์‹" + }, + "todos": { + "addAria": "ํˆฌ๋‘ ์ถ”๊ฐ€", + "aria": "๋ฝ€๋ชจ๋„๋กœ ํˆฌ๋‘", + "completeAria": "ํ•  ์ผ ์™„๋ฃŒ: {{text}}", + "inputAria": "๋ฝ€๋ชจ๋„๋กœ ํˆฌ๋‘ ์ž…๋ ฅ", + "inputHint": "ํ•  ์ผ ์ถ”๊ฐ€ (F) ยท โ†‘ ๋ชฉ๋ก ์ด๋™ ยท ESC ํฌ์ปค์Šค ํ•ด์ œ", + "listHint": "โ†‘/โ†“ ์ด๋™ ยท Space ์™„๋ฃŒ ยท D ์‚ญ์ œ ยท โ†’ ํƒ€์ž„๋ผ์ธ ์ด๋™ ยท ESC ์„ ํƒ ํ•ด์ œ", + "placeholder": "ํ•  ์ผ ์ถ”๊ฐ€", + "removeAria": "ํ•  ์ผ ์‚ญ์ œ: {{text}}" + } + }, + "reactions": { + "add": "๋ฆฌ์•ก์…˜", + "addAria": "๋ฆฌ์•ก์…˜ ์ถ”๊ฐ€", + "panelAria": "๋ฆฌ์•ก์…˜ ์„ ํƒ" + }, + "sectionMenu": { + "addLeft": "์™ผ์ชฝ ์„น์…˜ ์ถ”๊ฐ€", + "addRight": "์˜ค๋ฅธ์ชฝ ์„น์…˜ ์ถ”๊ฐ€", + "moveLeft": "์™ผ์ชฝ์œผ๋กœ ์ด๋™", + "moveRight": "์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™", + "openAria": "์„น์…˜ ๋ฉ”๋‰ด ์—ด๊ธฐ", + "openHint": "์„น์…˜ ๋ฉ”๋‰ด ์—ด๊ธฐ (M)", + "openOrigin": "์›๋ณธ ์„œ๋ฒ„์—์„œ ๋ณด๊ธฐ", + "refresh": "์ƒˆ๋กœ๊ณ ์นจ", + "remove": "์„น์…˜ ์‚ญ์ œ", + "settings": "์„น์…˜ ์„ค์ •" + }, + "sectionSettings": { + "customEmojis": { + "description": "์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋ณธ๋ฌธ์— ์ปค์Šคํ…€ ์ด๋ชจ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.", + "title": "์ปค์Šคํ…€ ์ด๋ชจ์ง€ ํ‘œ์‹œ" + }, + "profileImages": { + "description": "์ด ์„น์…˜์—์„œ๋งŒ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.", + "title": "ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ํ‘œ์‹œ" + }, + "reactions": { + "description": "๋ฆฌ์•ก์…˜์„ ์ง€์›ํ•˜๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฆฌ์•ก์…˜์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.", + "title": "๋ฆฌ์•ก์…˜ ํ‘œ์‹œ" + }, + "sectionSize": { + "aria": "์„น์…˜ ํญ ์„ค์ •", + "description": "์ด ์„น์…˜์˜ ๊ฐ€๋กœ ํญ์„ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.", + "large": "๋Œ€", + "medium": "์ค‘", + "small": "์†Œ", + "title": "์„น์…˜ ํญ" + }, + "title": "์„น์…˜ ์„ค์ •" + }, + "settings": { + "account": { + "description": "๊ณ„์ •์„ ์„ ํƒํ•˜์—ฌ ์žฌ์ธ์ฆํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.", + "reauth": "์žฌ์ธ์ฆ", + "reauthAria": "๊ณ„์ • ์žฌ์ธ์ฆ", + "reauthing": "์žฌ์ธ์ฆ ์ค‘...", + "removeAria": "๊ณ„์ • ์‚ญ์ œ", + "title": "๊ณ„์ • ๊ด€๋ฆฌ" + }, + "colorScheme": { + "aria": "์ƒ‰์ƒ ๋ชจ๋“œ ์„ ํƒ", + "description": "์‹œ์Šคํ…œ ์„ค์ •์„ ๋”ฐ๋ฅด๊ฑฐ๋‚˜ ๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.", + "title": "์ƒ‰์ƒ ๋ชจ๋“œ" + }, + "language": { + "aria": "์–ธ์–ด ์„ ํƒ", + "description": "ํ‘œ์‹œ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.", + "title": "์–ธ์–ด" + }, + "pomodoro": { + "break": "ํœด์‹", + "description": "์‚ฌ์ด๋“œ๋ฐ”์— ๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.", + "focus": "์ง‘์ค‘", + "longBreak": "๊ธด ํœด์‹", + "timerDescription": "์ง‘์ค‘, ํœด์‹, ๊ธด ํœด์‹ ์‹œ๊ฐ„์„ ๋ถ„ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.", + "timerTitle": "๋ฝ€๋ชจ๋„๋กœ ์‹œ๊ฐ„ ์„ค์ •", + "title": "๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ" + }, + "storage": { + "clear": "๋ชจ๋‘ ์‚ญ์ œ", + "clearAria": "๋กœ์ปฌ ์ €์žฅ์†Œ ์ดˆ๊ธฐํ™”", + "description": "๊ณ„์ •๊ณผ ์„ค์ •์„ ํฌํ•จํ•œ ๋ชจ๋“  ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.", + "title": "๋กœ์ปฌ ์ €์žฅ์†Œ ์ดˆ๊ธฐํ™”" + }, + "theme": { + "aria": "ํ…Œ๋งˆ ์„ ํƒ", + "description": "๊ธฐ๋ณธ, ํฌ๋ฆฌ์Šค๋งˆ์Šค, ํ•˜๋Š˜ํ•‘ํฌ, ๋ชจ๋…ธํ†ค ํ…Œ๋งˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.", + "title": "ํ…Œ๋งˆ" + }, + "open": "์„ค์ • ์—ด๊ธฐ", + "title": "์„ค์ •" + }, + "shortcuts": { + "compose": { + "attachMedia": "๋ฏธ๋””์–ด ์ฒจ๋ถ€", + "blur": "๊ธ€์“ฐ๊ธฐ ์ž…๋ ฅ ํฌ์ปค์Šค ํ•ด์ œ", + "focus": "๊ธ€์“ฐ๊ธฐ ์ž…๋ ฅ์œผ๋กœ ์ด๋™", + "focusWhileActive": "๊ธ€์“ฐ๊ธฐ ์ž…๋ ฅ์œผ๋กœ ์ด๋™ (ํฌ์ปค์Šค ์ค‘)", + "note": "๊ธ€์“ฐ๊ธฐ ์˜์—ญ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.", + "openAccountSelector": "๊ณ„์ • ์„ ํƒ ์—ด๊ธฐ", + "openVisibility": "๊ณต๊ฐœ ๋ฒ”์œ„ ์„ ํƒ", + "submit": "๊ธ€ ์˜ฌ๋ฆฌ๊ธฐ", + "title": "๊ธ€์“ฐ๊ธฐ", + "toggleContentWarning": "๋‚ด์šฉ ๊ฒฝ๊ณ  ํ† ๊ธ€", + "toggleEmojiPanel": "์ด๋ชจ์ง€ ํŒจ๋„ ํ† ๊ธ€" + }, + "emojiPanel": { + "close": "์ด๋ชจ์ง€ ์„ ํƒ ๋‹ซ๊ธฐ", + "navigate": "์ด๋ชจ์ง€/์นดํ…Œ๊ณ ๋ฆฌ ์ด๋™", + "note": "์ด๋ชจ์ง€ ์„ ํƒ ํŒ์˜ค๋ฒ„๊ฐ€ ์—ด๋ ค ์žˆ์„ ๋•Œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.", + "select": "์„ ํƒ๋œ ์ด๋ชจ์ง€ ์ž…๋ ฅ/๋ฆฌ์•ก์…˜", + "title": "์ด๋ชจ์ง€ ํŒจ๋„/๋ฆฌ์•ก์…˜", + "toggleCategory": "์นดํ…Œ๊ณ ๋ฆฌ ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ" + }, + "imageViewer": { + "close": "์ด๋ฏธ์ง€ ๋ณด๊ธฐ ๋‹ซ๊ธฐ", + "navigate": "์ด๋ฏธ์ง€ ์ด๋™", + "title": "์ด๋ฏธ์ง€ ๋ทฐ์–ด" + }, + "pomodoro": { + "focusTask": "ํ•  ์ผ ์ถ”๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ด๋™", + "reset": "๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ ๋ฆฌ์…‹", + "title": "๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ", + "toggle": "๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ ์‹œ์ž‘/์ •์ง€" + }, + "selected": { + "boost": "๋ถ€์ŠคํŠธ", + "closeMenu": "์—ด๋ฆฐ ๋ฉ”๋‰ด ๋‹ซ๊ธฐ", + "likeOrReaction": "์ข‹์•„์š” (๋งˆ์Šคํ† ๋ˆ) / โค๏ธ ๋ฆฌ์•ก์…˜ (๋ฏธ์Šคํ‚ค)", + "navigateMenu": "์—ด๋ฆฐ ๋ฉ”๋‰ด์—์„œ ํ•ญ๋ชฉ ์ด๋™", + "note": "๊ธ€์„ ์„ ํƒํ•œ ์ƒํƒœ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.", + "openAccount": "๊ณ„์ • ์„ ํƒ ์—ด๊ธฐ", + "openColumnMenu": "์ปฌ๋Ÿผ ๋ฉ”๋‰ด ์—ด๊ธฐ", + "openMedia": "์ฒจ๋ถ€ ์ด๋ฏธ์ง€ ์—ด๊ธฐ", + "openNotifications": "์•Œ๋ฆผ ์—ด๊ธฐ", + "openProfile": "์ž‘์„ฑ์ž ํ”„๋กœํ•„ ํŒ์—… ์—ด๊ธฐ", + "openReactions": "๋ฆฌ์•ก์…˜ ํŒ”๋ ˆํŠธ ์—ด๊ธฐ (๋ฏธ์Šคํ‚ค)", + "openStatus": "๊ธ€ ํŒ์—… ์—ด๊ธฐ (์—ด๋ฆฐ ๋ฉ”๋‰ด์—์„œ๋Š” ํ•ญ๋ชฉ ์„ ํƒ)", + "openTimelineMenu": "ํƒ€์ž„๋ผ์ธ ๋ฉ”๋‰ด ์—ด๊ธฐ", + "reply": "๋‹ต๊ธ€ ์ž‘์„ฑ", + "title": "์„ ํƒ๋œ ๊ธ€ ์ปจํŠธ๋กค" + }, + "suggestions": { + "close": "์ถ”์ฒœ ๋‹ซ๊ธฐ", + "insert": "์ถ”์ฒœ ์ด๋ชจ์ง€ ์ž…๋ ฅ", + "navigate": "์ถ”์ฒœ ํ•ญ๋ชฉ ์ด๋™", + "note": "์ถ”์ฒœ ๋ชฉ๋ก์ด ์—ด๋ ค ์žˆ์„ ๋•Œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.", + "title": "์ด๋ชจ์ง€ ์ถ”์ฒœ" + }, + "timeline": { + "clearSelection": "์„ ํƒ ํ•ด์ œ", + "moveColumn": "์ด์›ƒ ์ปฌ๋Ÿผ์œผ๋กœ ์ด๋™", + "moveVertical": "์„ ํƒ๋œ ๊ธ€ ์œ„์•„๋ž˜ ์ด๋™", + "selectLeftmost": "์„ ํƒ์ด ์—†์„ ๋•Œ ์™ผ์ชฝ ์ฒซ ๊ธ€์„ ์„ ํƒ", + "title": "ํƒ€์ž„๋ผ์ธ ์ด๋™" + } + }, + "status": { + "boostedBy": " ๋‹˜์ด ๋ถ€์ŠคํŠธํ•จ", + "threadLoading": "์Šค๋ ˆ๋“œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘", + "title": "๊ฒŒ์‹œ๊ธ€", + "viewAria": "๊ธ€ ๋ณด๊ธฐ" + }, + "themes": { + "christmas": "ํฌ๋ฆฌ์Šค๋งˆ์Šค", + "default": "๊ธฐ๋ณธ", + "matchaCore": "๋ง์ฐจ์ฝ”์–ด", + "monochrome": "๋ชจ๋…ธํ†ค", + "skyPink": "ํ•˜๋Š˜ํ•‘ํฌ" + }, + "timeline": { + "accountRequired": "๊ณ„์ •์„ ์„ ํƒํ•˜๋ฉด ํƒ€์ž„๋ผ์ธ์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.", + "actionsAria": "ํƒ€์ž„๋ผ์ธ ์ž‘์—…", + "bookmarks": "๋ถ๋งˆํฌ", + "empty": { + "bookmarks": "๋ถ๋งˆํฌํ•œ ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.", + "default": "ํ‘œ์‹œํ•  ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.", + "notifications": "ํ‘œ์‹œํ•  ์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค." + }, + "federated": "์—ฐํ•ฉ", + "global": "๊ธ€๋กœ๋ฒŒ", + "home": "ํ™ˆ", + "loadingMore": "๋” ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...", + "local": "๋กœ์ปฌ", + "notifications": "์•Œ๋ฆผ", + "pending": { + "action": "๋ณด๊ธฐ", + "aria": "์ƒˆ ๊ธ€ {{label}}๊ฐœ ํ‘œ์‹œ", + "label": "์ƒˆ ๊ธ€ {{label}}๊ฐœ", + "sr": "์ƒˆ ๊ธ€ {{label}}๊ฐœ๊ฐ€ ์ƒˆ๋กœ ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.", + "title": "์ƒˆ ๊ธ€ ํ‘œ์‹œ" + }, + "scrollTop": "์ตœ์ƒ๋‹จ์œผ๋กœ ์ด๋™", + "selectAria": "ํƒ€์ž„๋ผ์ธ ์„ ํƒ: {{label}}", + "selectHint": "ํƒ€์ž„๋ผ์ธ ์„ ํƒ (T)", + "selectMenuAria": "ํƒ€์ž„๋ผ์ธ ์„ ํƒ", + "social": "์†Œ์…œ" + }, + "toast": { + "bookmarkAdded": "๋ถ๋งˆํฌํ–ˆ์Šต๋‹ˆ๋‹ค.", + "bookmarkRemoved": "๋ถ๋งˆํฌ๋ฅผ ์ทจ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.", + "close": "๋‹ซ๊ธฐ", + "closeAria": "ํ† ์ŠคํŠธ ๋‹ซ๊ธฐ" + } +} diff --git a/src/App.tsx b/src/App.tsx index 79dafc5..8e47022 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,5 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; import type { Account, ReactionInput, Status, TimelineType } from "./domain/types"; import { AccountAdd } from "./ui/components/AccountAdd"; import { AccountSelector } from "./ui/components/AccountSelector"; @@ -82,6 +83,7 @@ const parseRoute = (): Route => { }; export const App = () => { + const { t } = useTranslation(); const [themeMode, setThemeMode] = useState(() => getStoredTheme()); const [colorScheme, setColorScheme] = useState(() => getStoredColorScheme()); const [showPomodoro, setShowPomodoro] = useState(() => { @@ -297,23 +299,23 @@ export const App = () => { if (!pending || !state || pending.state !== state) { clearPendingOAuth(); - setActionError("OAuth ์ƒํƒœ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.oauth.invalidState")); return; } if (pending.platform === "mastodon" && !code) { clearPendingOAuth(); - setActionError("OAuth ์ฝ”๋“œ๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.oauth.missingCode")); return; } if (pending.platform === "misskey") { if (!session) { clearPendingOAuth(); - setActionError("๋ฏธ์Šคํ‚ค ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.oauth.misskeyMissingSession")); return; } if (session !== pending.sessionId) { clearPendingOAuth(); - setActionError("๋ฏธ์Šคํ‚ค ์„ธ์…˜ ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.oauth.misskeySessionMismatch")); return; } } @@ -344,7 +346,7 @@ export const App = () => { if (pending.accountId) { const existing = accountsState.accounts.find((account) => account.id === pending.accountId); if (!existing) { - setActionError("์žฌ์ธ์ฆํ•  ๊ณ„์ •์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(t("errors.accountReauthNotFound")); return; } const updated: Account = { @@ -369,7 +371,7 @@ export const App = () => { account.handle === fullHandle ); if (existing) { - setActionError("์ด๋ฏธ ๋“ฑ๋ก๋œ ๊ณ„์ •์ž…๋‹ˆ๋‹ค."); + setActionError(t("errors.accountAlreadyRegistered")); accountsState.setActiveAccount(existing.id); return; } @@ -382,7 +384,7 @@ export const App = () => { emojis: verified.emojis ?? [] }); } catch (err) { - setActionError(err instanceof Error ? err.message : "OAuth ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(err instanceof Error ? err.message : t("errors.oauth.failed")); } finally { clearPendingOAuth(); setOauthLoading(false); @@ -390,7 +392,7 @@ export const App = () => { }; void addAccountWithToken(); - }, [accountsState, services.api, services.oauth]); + }, [accountsState, services.api, services.oauth, t]); useEffect(() => { const value = themeMode === "default" ? "" : themeMode; @@ -465,7 +467,7 @@ export const App = () => { const needsRegister = !cached || cached.redirectUri !== redirectUri || cached.platform === "misskey"; const registered = needsRegister ? await services.oauth.registerApp(normalizedUrl, redirectUri) : cached; if (!registered) { - throw new Error("์•ฑ ๋“ฑ๋ก ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."); + throw new Error(t("errors.appRegistrationLoadFailed")); } if (needsRegister && registered.platform === "mastodon") { saveRegisteredApp(registered); @@ -477,21 +479,19 @@ export const App = () => { } catch { setReauthLoading(false); } - }, [accountsState.accounts, settingsAccountId, services.oauth]); + }, [accountsState.accounts, settingsAccountId, services.oauth, t]); const handleSettingsRemove = useCallback(() => { if (!settingsAccountId) return; - const confirmed = window.confirm("์ด ๊ณ„์ •์„ ์‚ญ์ œํ• ๊นŒ์š”?"); + const confirmed = window.confirm(t("confirm.removeAccount")); if (confirmed) { accountsState.removeAccount(settingsAccountId); setSettingsAccountId(null); } - }, [settingsAccountId, accountsState]); + }, [accountsState, settingsAccountId, t]); const handleClearLocalStorage = useCallback(() => { - const confirmed = window.confirm( - "๋กœ์ปฌ ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ• ๊นŒ์š”? ๊ณ„์ •๊ณผ ์„ค์ • ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค." - ); + const confirmed = window.confirm(t("confirm.clearLocalStorage")); if (!confirmed) { return; } @@ -501,7 +501,7 @@ export const App = () => { /* noop */ } window.location.reload(); - }, []); + }, [t]); const isEditableElement = useCallback((element: Element | null) => { if (!element) { @@ -898,7 +898,7 @@ export const App = () => { setMentionSeed(null); return true; } catch (err) { - setActionError(err instanceof Error ? err.message : "๊ธ€ ์ž‘์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(err instanceof Error ? err.message : t("errors.composeFailed")); return false; } }; @@ -957,16 +957,16 @@ export const App = () => { const handleReaction = useCallback( async (account: Account | null, status: Status, reaction: ReactionInput) => { if (!account) { - setActionError("๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.accountRequired")); return; } if (account.platform !== "misskey") { - setActionError("๋ฆฌ์•ก์…˜์€ ๋ฏธ์Šคํ‚ค ๊ณ„์ •์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."); + setActionError(t("errors.reactionMisskeyOnly")); return; } const target = status.reblog ?? status; if (target.myReaction && target.myReaction !== reaction.name) { - setActionError("์ด๋ฏธ ๋ฆฌ์•ก์…˜์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ทจ์†Œํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.reactionAlreadyExists")); return; } setActionError(null); @@ -981,11 +981,11 @@ export const App = () => { updateStatusEverywhere(account.id, updated); } } catch (err) { - setActionError(err instanceof Error ? err.message : "๋ฆฌ์•ก์…˜ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(err instanceof Error ? err.message : t("errors.reactionFailed")); updateStatusEverywhere(account.id, target); } }, - [services.api, updateStatusEverywhere] + [services.api, t, updateStatusEverywhere] ); const composeAccountSelector = ( @@ -1104,14 +1104,14 @@ export const App = () => { return (
- - Deck ๋กœ๊ณ  + + {t("app.logoAlt")}
-
+
-

๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‡โ€โ™‚๏ธ

+

{t("app.mobileBlocker.title")}

- ๋ฉ€ํ‹ฐ ์ปฌ๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค ํŠน์„ฑ์ƒ ๋ชจ๋ฐ”์ผ ์ง€์›์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํ†ฑ ๋˜๋Š” ํƒœ๋ธ”๋ฆฟ์—์„œ ์ด์šฉํ•ด ์ฃผ์„ธ์š”. + {t("app.mobileBlocker.description")}

@@ -1175,14 +1175,14 @@ export const App = () => { {route === "home" ? (
- Deck ๋กœ๊ณ  + {t("app.logoAlt")}

Deck

-

์˜คํ”ˆ์†Œ์Šค ํŽ˜๋””๋ฒ„์Šค ์›น ํด๋ผ์ด์–ธํŠธ

+

{t("app.tagline")}

- ์—ฌ๋Ÿฌ ๊ณ„์ •์„ ์ „ํ™˜ํ•˜๊ณ  ํƒ€์ž„๋ผ์ธ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + {t("app.sidebarDescription")}

@@ -1252,14 +1252,18 @@ export const App = () => { {hasAccounts ? (
- {oauthLoading ?

OAuth ์ธ์ฆ ์ค‘...

: null} + {oauthLoading ?

{t("oauth.authenticating")}

: null} {route === "home" ? (
{showPomodoro && pomodoroSessionType === "focus" && pomodoroIsRunning ? (
-

๐ŸŽฏ ์ง‘์ค‘ ์„ธ์…˜ ์ง„ํ–‰ ์ค‘

-

๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ๊ฐ€ ๋™์ž‘ ์ค‘์ž…๋‹ˆ๋‹ค.
ํƒ€์ž„๋ผ์ธ์€ ์ง‘์ค‘์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.

+

{t("pomodoro.focusSession.title")}

+

+ + ๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ๊ฐ€ ๋™์ž‘ ์ค‘์ž…๋‹ˆ๋‹ค.
ํƒ€์ž„๋ผ์ธ์€ ์ง‘์ค‘์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค. +
+

) : null} @@ -1426,7 +1430,7 @@ export const App = () => { }} onToggleFavourite={async (status) => { if (!composeAccount) { - setActionError("๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.accountRequired")); return; } setActionError(null); @@ -1437,12 +1441,12 @@ export const App = () => { // Update the status in modal setSelectedStatus(updated); } catch (err) { - setActionError(err instanceof Error ? err.message : "์ข‹์•„์š” ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(err instanceof Error ? err.message : t("errors.likeFailed")); } }} onToggleReblog={async (status) => { if (!composeAccount) { - setActionError("๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.accountRequired")); return; } setActionError(null); @@ -1452,12 +1456,12 @@ export const App = () => { : await services.api.reblog(composeAccount, status.id); setSelectedStatus(updated); } catch (err) { - setActionError(err instanceof Error ? err.message : "๋ถ€์ŠคํŠธ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(err instanceof Error ? err.message : t("errors.boostFailed")); } }} onToggleBookmark={async (status) => { if (!composeAccount) { - setActionError("๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."); + setActionError(t("errors.accountRequired")); return; } setActionError(null); @@ -1468,12 +1472,12 @@ export const App = () => { : await services.api.bookmark(composeAccount, status.id); setSelectedStatus(updated); if (isBookmarking) { - showToast("๋ถ๋งˆํฌํ–ˆ์Šต๋‹ˆ๋‹ค."); + showToast(t("toast.bookmarkAdded")); } else { - showToast("๋ถ๋งˆํฌ๋ฅผ ์ทจ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค."); + showToast(t("toast.bookmarkRemoved")); } } catch (err) { - setActionError(err instanceof Error ? err.message : "๋ถ๋งˆํฌ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(err instanceof Error ? err.message : t("errors.bookmarkFailed")); } }} onDelete={async (status) => { @@ -1485,7 +1489,7 @@ export const App = () => { await services.api.deleteStatus(composeAccount, status.id); setSelectedStatus(null); } catch (err) { - setActionError(err instanceof Error ? err.message : "๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."); + setActionError(err instanceof Error ? err.message : t("errors.statusDeleteFailed")); } }} activeHandle={ diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..65ea33e --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,29 @@ +import i18n from "i18next"; +import HttpBackend from "i18next-http-backend"; +import LanguageDetector from "i18next-browser-languagedetector"; +import { initReactI18next } from "react-i18next"; + +export const SUPPORTED_LANGUAGES = ["ko", "en"] as const; + +void i18n + .use(HttpBackend) + .use(LanguageDetector) + .use(initReactI18next) + .init({ + fallbackLng: "ko", + supportedLngs: SUPPORTED_LANGUAGES, + defaultNS: "common", + ns: ["common"], + backend: { + loadPath: "/locales/{{lng}}/{{ns}}.json" + }, + detection: { + order: ["localStorage", "navigator"], + caches: ["localStorage"] + }, + interpolation: { + escapeValue: false + } + }); + +export default i18n; diff --git a/src/main.tsx b/src/main.tsx index 2e4212b..5c21ee7 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,6 +1,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; import { App } from "./App"; +import "./i18n"; import { MastodonHttpClient } from "./infra/MastodonHttpClient"; import { MastodonStreamingClient } from "./infra/MastodonStreamingClient"; import { MastodonOAuthClient } from "./infra/MastodonOAuthClient"; diff --git a/src/ui/components/AccountAdd.tsx b/src/ui/components/AccountAdd.tsx index 8b8ef7e..2e6c2e1 100644 --- a/src/ui/components/AccountAdd.tsx +++ b/src/ui/components/AccountAdd.tsx @@ -1,4 +1,5 @@ import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; import type { OAuthClient } from "../../services/OAuthClient"; import { normalizeInstanceUrl } from "../utils/account"; import { createOauthState, loadRegisteredApp, saveRegisteredApp, storePendingOAuth } from "../utils/oauth"; @@ -13,12 +14,13 @@ export const AccountAdd = ({ const [loading, setLoading] = useState(false); const [showForm, setShowForm] = useState(false); const { showToast } = useToast(); + const { t } = useTranslation(); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); const normalizedUrl = normalizeInstanceUrl(instanceUrl); if (!normalizedUrl) { - showToast("์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.", { tone: "error" }); + showToast(t("errors.serverAddressRequired"), { tone: "error" }); return; } @@ -32,7 +34,7 @@ export const AccountAdd = ({ const needsRegister = !cached || cached.redirectUri !== redirectUri || cached.platform === "misskey"; const registered = needsRegister ? await oauth.registerApp(normalizedUrl, redirectUri) : cached; if (!registered) { - throw new Error("์•ฑ ๋“ฑ๋ก ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."); + throw new Error(t("errors.appRegistrationLoadFailed")); } if (needsRegister && registered.platform === "mastodon") { saveRegisteredApp(registered); @@ -42,7 +44,7 @@ export const AccountAdd = ({ const authorizeUrl = oauth.buildAuthorizeUrl(registered, state); window.location.assign(authorizeUrl); } catch (err) { - showToast(err instanceof Error ? err.message : "OAuth ์—ฐ๊ฒฐ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", { tone: "error" }); + showToast(err instanceof Error ? err.message : t("errors.oauthConnectFailed"), { tone: "error" }); } finally { setLoading(false); } @@ -54,7 +56,7 @@ export const AccountAdd = ({ type="button" className="account-add-button header button-with-icon" onClick={() => setShowForm((prev) => !prev)} - aria-label={showForm ? "๊ณ„์ • ์ถ”๊ฐ€ ๋‹ซ๊ธฐ" : "๊ณ„์ • ์ถ”๊ฐ€"} + aria-label={showForm ? t("accountAdd.closeAria") : t("accountAdd.openAria")} aria-expanded={showForm} > {showForm ? ( @@ -68,26 +70,26 @@ export const AccountAdd = ({ )} - {showForm ? "๊ณ„์ • ์ถ”๊ฐ€ ๋‹ซ๊ธฐ" : "๊ณ„์ • ์ถ”๊ฐ€"} + {showForm ? t("accountAdd.closeLabel") : t("accountAdd.openLabel")} {showForm ? (
-

OAuth ์Šน์ธ ํ›„ ์ž๋™์œผ๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.

+

{t("accountAdd.oauthRedirectHint")}

) : null}
diff --git a/src/ui/components/AccountLabel.tsx b/src/ui/components/AccountLabel.tsx index 46eed39..18e02f6 100644 --- a/src/ui/components/AccountLabel.tsx +++ b/src/ui/components/AccountLabel.tsx @@ -1,4 +1,5 @@ import React from "react"; +import { useTranslation } from "react-i18next"; import type { CustomEmoji } from "../../domain/types"; export interface AccountLabelProps { @@ -125,7 +126,8 @@ export const AccountLabel: React.FC = ({ textAsDiv = false, boldName = false }) => { - const effectiveDisplayName = displayName || name || instanceUrl || "์•Œ ์ˆ˜ ์—†์Œ"; + const { t } = useTranslation(); + const effectiveDisplayName = displayName || name || instanceUrl || t("accountLabel.unknown"); const isInteractive = !!(onClick || accountUrl); // ํˆดํŒ์— ํ‘œ์‹œํ•  ์ „์ฒด ํ…์ŠคํŠธ ๊ณ„์‚ฐ diff --git a/src/ui/components/AccountSelector.tsx b/src/ui/components/AccountSelector.tsx index 90052d2..d81027a 100644 --- a/src/ui/components/AccountSelector.tsx +++ b/src/ui/components/AccountSelector.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; import type { Account } from "../../domain/types"; import type { Ref } from "react"; import { formatHandle } from "../utils/account"; @@ -27,6 +28,7 @@ export const AccountSelector = ({ const detailsRef = useRef(null); const dropdownRef = useRef(null); const selectionChangeRef = useRef(false); + const { t } = useTranslation(); useClickOutside(dropdownRef, dropdownOpen, () => setDropdownOpen(false)); @@ -123,7 +125,7 @@ export const AccountSelector = ({ {activeAccount ? ( ) : ( - ๊ณ„์ •์„ ์„ ํƒํ•˜์„ธ์š”. + {t("accountSelector.placeholder")} )}
diff --git a/src/ui/components/ComposeBox.tsx b/src/ui/components/ComposeBox.tsx index 67e947c..873e4fb 100644 --- a/src/ui/components/ComposeBox.tsx +++ b/src/ui/components/ComposeBox.tsx @@ -1,4 +1,5 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; import type { Account, Visibility } from "../../domain/types"; import type { MastodonApi } from "../../services/MastodonApi"; import { useEmojiManager, type EmojiItem } from "../hooks/useEmojiManager"; @@ -24,13 +25,6 @@ const parseVisibility = (value: string | null): Visibility | null => { const getVisibilityStorageKey = (accountId: string | null | undefined) => accountId ? `${VISIBILITY_KEY_PREFIX}.${accountId}` : VISIBILITY_KEY_PREFIX; -const visibilityOptions: { value: Visibility; label: string }[] = [ - { value: "public", label: "์ „์ฒด ๊ณต๊ฐœ" }, - { value: "unlisted", label: "๋ฏธ๋“ฑ๋ก" }, - { value: "private", label: "ํŒ”๋กœ์›Œ" }, - { value: "direct", label: "DM" } -]; - const ZERO_WIDTH_SPACE = "\u200b"; export const ComposeBox = ({ @@ -56,6 +50,7 @@ export const ComposeBox = ({ account: Account | null; api: MastodonApi; }) => { + const { t } = useTranslation(); const [text, setText] = useState(""); const [emojiQuery, setEmojiQuery] = useState<{ value: string; @@ -105,6 +100,16 @@ export const ComposeBox = ({ const { showToast } = useToast(); const lastEmojiErrorRef = useRef(null); + const visibilityOptions = useMemo( + () => [ + { value: "public" as const, label: t("compose.visibility.public") }, + { value: "unlisted" as const, label: t("compose.visibility.unlisted") }, + { value: "private" as const, label: t("compose.visibility.private") }, + { value: "direct" as const, label: t("compose.visibility.direct") } + ], + [t] + ); + const handleAccountSelectionDone = useCallback(() => { requestAnimationFrame(() => { textareaRef.current?.focus(); @@ -137,7 +142,7 @@ export const ComposeBox = ({ lastEmojiErrorRef.current = null; return; } - const message = emojiError ?? "์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."; + const message = emojiError ?? t("errors.emojisLoadFailed"); if (message === lastEmojiErrorRef.current) { return; } @@ -260,7 +265,9 @@ export const ComposeBox = ({ // ๋ฌธ์ž ์ˆ˜ ์ œํ•œ ๊ฒ€์‚ฌ if (characterLimit && currentCharCount > characterLimit) { - showToast(`๊ธ€์ž ์ˆ˜ ์ œํ•œ(${characterLimit.toLocaleString()}์ž)์„ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.`, { tone: "error" }); + showToast(t("errors.characterLimitExceeded", { limit: characterLimit.toLocaleString() }), { + tone: "error" + }); return; } @@ -851,9 +858,9 @@ export const ComposeBox = ({ ) : null} {replyingTo ? (
- ๋‹ต๊ธ€ ๋Œ€์ƒ: {replyingTo.summary} + {t("compose.replyingTo", { summary: replyingTo.summary })}
) : null} @@ -865,8 +872,8 @@ export const ComposeBox = ({ type="text" value={cwText} onChange={(event) => setCwText(event.target.value)} - placeholder="CW ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”" - aria-label="์ฝ˜ํ…์ธ  ๊ฒฝ๊ณ " + placeholder={t("compose.cw.placeholder")} + aria-label={t("compose.cw.aria")} disabled={isSubmitting} /> @@ -880,9 +887,9 @@ export const ComposeBox = ({ setText(nextValue); updateEmojiQuery(nextValue, event.target.selectionStart ?? nextValue.length); }} - placeholder="์ง€๊ธˆ ๋ฌด์Šจ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๋‚˜์š”?" - aria-label="๊ธ€ ์ž‘์„ฑ" - title="๊ธ€ ์ž‘์„ฑ (N / Ctrl+Shift+N)" + placeholder={t("compose.placeholder")} + aria-label={t("compose.aria")} + title={t("compose.inputHint")} rows={4} onPaste={handlePaste} disabled={isSubmitting} @@ -932,7 +939,7 @@ export const ComposeBox = ({ }} /> {emojiSuggestions.length > 0 ? ( -
+
{emojiSuggestions.map((emoji, index) => { const isActive = index === emojiSuggestionIndex; const label = emoji.shortcode ? `:${emoji.shortcode}:` : emoji.label; @@ -943,7 +950,7 @@ export const ComposeBox = ({ className={`compose-emoji-suggestion${isActive ? " is-active" : ""}`} role="option" aria-selected={isActive} - aria-label={`์ด๋ชจ์ง€ ${label}`} + aria-label={t("compose.emojiSuggestions.itemAria", { label })} onMouseDown={(event) => event.preventDefault()} onClick={() => handleEmojiSuggestionSelect(emoji)} > @@ -972,17 +979,17 @@ export const ComposeBox = ({ resetImageZoom(); setActiveImageId(item.id); }} - aria-label="์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ" + aria-label={t("compose.attachments.previewAria")} > - ์„ ํƒํ•œ ์ด๋ฏธ์ง€ + {t("compose.attachments.selectedImageAlt")} ))} {/* ์ด๋ฏธ์ง€ ์ถ”๊ฐ€ ๋ฒ„ํŠผ */}
{visibilityState.visibility === "public" ? (

- ์ „์ฒด ๊ณต๊ฐœ๋กœ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ๋‚ด์šฉ์€ ์ฃผ์˜ํ•ด์ฃผ์„ธ์š”. + {t("compose.visibility.publicWarning")}

) : null}
@@ -1021,7 +1028,7 @@ export const ComposeBox = ({ value={visibilityState.visibility} onChange={(event) => setVisibilityState(prev => ({ ...prev, visibility: event.target.value as Visibility }))} disabled={isSubmitting} - title="๊ณต๊ฐœ ๋ฒ”์œ„ (Ctrl+Shift+O)" + title={t("compose.visibility.hint")} > {visibilityOptions.map((option) => (
@@ -1080,45 +1087,45 @@ export const ComposeBox = ({
- {!account ?

๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

: null} + {!account ?

{t("compose.emojiPanel.selectAccount")}

: null} {account ? (
setEmojiSearchQuery(event.target.value)} - placeholder="์ด๋ชจ์ง€ ๊ฒ€์ƒ‰" - aria-label="์ด๋ชจ์ง€ ๊ฒ€์ƒ‰" + placeholder={t("compose.emojiPanel.searchPlaceholder")} + aria-label={t("compose.emojiPanel.searchAria")} disabled={emojiStatus === "loading"} />
) : null} {account && emojiStatus === "loading" ? ( -

์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...

+

{t("compose.emojiPanel.loading")}

) : null} {account && emojiStatus === "error" ? (
-

{emojiError ?? "์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."}

+

{emojiError ?? t("errors.emojisLoadFailed")}

) : null} {account && emojiCategories.length === 0 ? ( -

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ชจ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

+

{t("compose.emojiPanel.empty")}

) : null} {account && emojiCategories.length > 0 ? ( <> {hasEmojiSearch ? (
- ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ + {t("compose.emojiPanel.searchResults")} {emojiSearchResults.length}
{emojiSearchResults.length > 0 ? ( @@ -1129,7 +1136,7 @@ export const ComposeBox = ({ type="button" className="compose-emoji-button" onClick={() => handleEmojiSelect(emoji)} - aria-label={`์ด๋ชจ์ง€ ${emoji.label}`} + aria-label={t("compose.emojiPanel.emojiAria", { label: emoji.label })} title={emoji.shortcode ? `:${emoji.shortcode}:` : undefined} data-emoji-nav="emoji" data-emoji-id={emoji.id} @@ -1145,7 +1152,7 @@ export const ComposeBox = ({ ))}
) : ( -

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

+

{t("compose.emojiPanel.noSearchResults")}

)} ) : null} @@ -1175,7 +1182,7 @@ export const ComposeBox = ({ type="button" className="compose-emoji-button" onClick={() => handleEmojiSelect(emoji)} - aria-label={`์ด๋ชจ์ง€ ${emoji.label}`} + aria-label={t("compose.emojiPanel.emojiAria", { label: emoji.label })} title={emoji.shortcode ? `:${emoji.shortcode}:` : undefined} data-emoji-nav="emoji" data-emoji-id={emoji.id} @@ -1215,14 +1222,14 @@ export const ComposeBox = ({ {category.emojis.map((emoji) => ( ์„ ํƒํ•œ ์ด๋ฏธ์ง€ ์›๋ณธ { - switch (type) { - case "terms": - return "์ด์šฉ์•ฝ๊ด€"; - case "license": - return "๋ผ์ด์„ ์Šค"; - case "oss": - return "์˜คํ”ˆ์†Œ์Šค ๋ชฉ๋ก"; - case "shortcuts": - return "๋‹จ์ถ•ํ‚ค"; - default: - return ""; - } +const INFO_MODAL_TITLE_KEYS: Record = { + terms: "infoPages.terms", + license: "infoPages.license", + oss: "infoPages.oss", + shortcuts: "infoPages.shortcuts" }; const InfoModalContent = ({ type }: { type: InfoModalType }) => { @@ -32,15 +25,16 @@ const InfoModalContent = ({ type }: { type: InfoModalType }) => { }; export const InfoModal = ({ type, onClose }: { type: InfoModalType; onClose: () => void }) => { - const title = getInfoModalTitle(type); + const { t } = useTranslation(); + const title = t(INFO_MODAL_TITLE_KEYS[type]); return (

{title}

-
diff --git a/src/ui/components/MobileMenus.tsx b/src/ui/components/MobileMenus.tsx index 81b3992..7cf57d5 100644 --- a/src/ui/components/MobileMenus.tsx +++ b/src/ui/components/MobileMenus.tsx @@ -1,4 +1,5 @@ import type { ReactNode } from "react"; +import { useTranslation } from "react-i18next"; import type { Account, Visibility } from "../../domain/types"; import type { MastodonApi } from "../../services/MastodonApi"; import type { OAuthClient } from "../../services/OAuthClient"; @@ -34,6 +35,7 @@ export const MobileComposeMenu = ({ onCancelReply, mentionText }: MobileComposeMenuProps) => { + const { t } = useTranslation(); if (!open) { return null; } @@ -43,14 +45,14 @@ export const MobileComposeMenu = ({
-

๊ธ€์“ฐ๊ธฐ

+

{t("compose.title")}

{composeAccount ? ( @@ -77,6 +79,7 @@ type MobileMenuProps = { }; export const MobileMenu = ({ open, onClose, onOpenSettings, oauth }: MobileMenuProps) => { + const { t } = useTranslation(); if (!open) { return null; } @@ -86,9 +89,9 @@ export const MobileMenu = ({ open, onClose, onOpenSettings, oauth }: MobileMenuP
-

๋ฉ”๋‰ด

-
@@ -108,7 +111,7 @@ export const MobileMenu = ({ open, onClose, onOpenSettings, oauth }: MobileMenuP - ์„ค์ • ์—ด๊ธฐ + {t("settings.open")}
diff --git a/src/ui/components/PomodoroTimer.tsx b/src/ui/components/PomodoroTimer.tsx index 98ce46d..2fa60e9 100644 --- a/src/ui/components/PomodoroTimer.tsx +++ b/src/ui/components/PomodoroTimer.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; type SessionType = "focus" | "break" | "longBreak"; @@ -21,17 +22,6 @@ type PomodoroTimerProps = { // TOTAL_SESSIONS์„ targetCycles์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๊ณ„์‚ฐ -const getSessionLabel = (type: SessionType): string => { - switch (type) { - case "focus": - return "์ง‘์ค‘"; - case "break": - return "ํœด์‹"; - case "longBreak": - return "๊ธด ํœด์‹"; - } -}; - const formatTime = (seconds: number): string => { const mins = Math.floor(seconds / 60); const secs = seconds % 60; @@ -48,11 +38,17 @@ export const PomodoroTimer = ({ onRequestClearTimelineSelection, onRequestSelectTimelineAtY, }: PomodoroTimerProps) => { + const { t } = useTranslation(); const targetCycles = 4; // ๊ณ ์ •๋œ 4์‚ฌ์ดํด const focusDuration = focusMinutes * 60; const breakDuration = breakMinutes * 60; const longBreakDuration = longBreakMinutes * 60; + const getSessionLabel = useCallback( + (type: SessionType) => t(`pomodoro.session.${type}`), + [t] + ); + const getSessionInfo = useCallback( (sess: number): { type: SessionType; duration: number } => { const totalSessions = targetCycles * 2; @@ -406,7 +402,11 @@ export const PomodoroTimer = ({
); } @@ -582,7 +582,7 @@ export const PomodoroTimer = ({ type="button" className={`pomodoro-mode-toggle${sessionInfo.type === "break" ? " break" : ""}${sessionInfo.type === "longBreak" ? " long-break" : ""}`} onClick={handleSessionToggle} - aria-label="๋‹ค์Œ ์„ธ์…˜์œผ๋กœ ์ „ํ™˜" + aria-label={t("pomodoro.nextSession")} > {getSessionLabel(sessionInfo.type)} {sessionInfo.type === "focus" ? focusCount : ""} @@ -601,29 +601,29 @@ export const PomodoroTimer = ({ type="button" className="pomodoro-button pomodoro-start" onClick={handleStart} - title="์‹œ์ž‘/์ •์ง€ (S)" + title={t("pomodoro.controls.toggleHint")} > - {isRunning ? "์ •์ง€" : "์‹œ์ž‘"} + {isRunning ? t("pomodoro.controls.stop") : t("pomodoro.controls.start")}
-
+
{displayedTodos.length > 0 ? (
0 ? 0 : -1} onKeyDownCapture={handleTodoKeyDown} - title="โ†‘/โ†“ ์ด๋™ ยท Space ์™„๋ฃŒ ยท D ์‚ญ์ œ ยท โ†’ ํƒ€์ž„๋ผ์ธ ์ด๋™ ยท ESC ์„ ํƒ ํ•ด์ œ" + title={t("pomodoro.todos.listHint")} > {displayedTodos.map((item) => (
handleToggleTodo(item.id)} - aria-label={`ํ•  ์ผ ์™„๋ฃŒ: ${item.text}`} + aria-label={t("pomodoro.todos.completeAria", { text: item.text })} /> {item.text}
diff --git a/src/ui/components/ReactionPicker.tsx b/src/ui/components/ReactionPicker.tsx index 96391bb..9c7447c 100644 --- a/src/ui/components/ReactionPicker.tsx +++ b/src/ui/components/ReactionPicker.tsx @@ -1,4 +1,5 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; import type { Account, ReactionInput } from "../../domain/types"; import type { MastodonApi } from "../../services/MastodonApi"; import { useClickOutside } from "../hooks/useClickOutside"; @@ -18,6 +19,7 @@ export const ReactionPicker = ({ onSelect: (reaction: ReactionInput) => void; buttonDataAction?: string; }) => { + const { t } = useTranslation(); const [open, setOpen] = useState(false); const [panelStyle, setPanelStyle] = useState({}); const [recentOpen, setRecentOpen] = useState(true); @@ -49,13 +51,13 @@ export const ReactionPicker = ({ lastEmojiErrorRef.current = null; return; } - const message = emojiError ?? "์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."; + const message = emojiError ?? t("errors.emojisLoadFailed"); if (message === lastEmojiErrorRef.current) { return; } lastEmojiErrorRef.current = message; showToast(message, { tone: "error" }); - }, [emojiError, emojiStatus, showToast]); + }, [emojiError, emojiStatus, showToast, t]); const emojiSearchResults = useMemo(() => { if (!emojiSearchQuery.trim()) { @@ -383,11 +385,11 @@ export const ReactionPicker = ({ disabled={disabled} ref={buttonRef} data-action={buttonDataAction} - aria-label="๋ฆฌ์•ก์…˜ ์ถ”๊ฐ€" + aria-label={t("reactions.addAria")} aria-haspopup="dialog" aria-expanded={open} > - ๋ฆฌ์•ก์…˜ + {t("reactions.add")} {open ? ( <> @@ -396,7 +398,7 @@ export const ReactionPicker = ({ className="reaction-picker-panel" role="dialog" aria-modal="true" - aria-label="๋ฆฌ์•ก์…˜ ์„ ํƒ" + aria-label={t("reactions.panelAria")} ref={panelRef} style={panelStyle} onKeyDown={handleEmojiPanelKeyDown} @@ -404,39 +406,39 @@ export const ReactionPicker = ({ tabIndex={-1} >
- {!account ?

๊ณ„์ •์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

: null} + {!account ?

{t("errors.accountRequired")}

: null} {account ? (
setEmojiSearchQuery(event.target.value)} - placeholder="์ด๋ชจ์ง€ ๊ฒ€์ƒ‰" - aria-label="์ด๋ชจ์ง€ ๊ฒ€์ƒ‰" + placeholder={t("compose.emojiPanel.searchPlaceholder")} + aria-label={t("compose.emojiPanel.searchAria")} disabled={emojiStatus === "loading"} />
) : null} {account && emojiStatus === "loading" ? ( -

์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...

+

{t("compose.emojiPanel.loading")}

) : null} {account && emojiStatus === "error" ? (
-

{emojiError ?? "์ด๋ชจ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."}

+

{emojiError ?? t("errors.emojisLoadFailed")}

) : null} {account && emojiCategories.length === 0 ? ( -

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ชจ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

+

{t("compose.emojiPanel.empty")}

) : null} {account && emojiCategories.length > 0 ? ( <> {hasEmojiSearch ? (
- ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ + {t("compose.emojiPanel.searchResults")} {emojiSearchResults.length}
{emojiSearchResults.length > 0 ? ( @@ -447,7 +449,7 @@ export const ReactionPicker = ({ type="button" className="compose-emoji-button" onClick={() => handleSelect(emoji)} - aria-label={`์ด๋ชจ์ง€ ${emoji.label}`} + aria-label={t("compose.emojiPanel.emojiAria", { label: emoji.label })} title={emoji.shortcode ? `:${emoji.shortcode}:` : undefined} data-emoji-nav="emoji" data-emoji-id={emoji.id} @@ -463,7 +465,7 @@ export const ReactionPicker = ({ ))}
) : ( -

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

+

{t("compose.emojiPanel.noSearchResults")}

)} ) : null} @@ -493,7 +495,7 @@ export const ReactionPicker = ({ type="button" className="compose-emoji-button" onClick={() => handleSelect(emoji)} - aria-label={`์ด๋ชจ์ง€ ${emoji.label}`} + aria-label={t("compose.emojiPanel.emojiAria", { label: emoji.label })} title={emoji.shortcode ? `:${emoji.shortcode}:` : undefined} data-emoji-nav="emoji" data-emoji-id={emoji.id} @@ -536,7 +538,7 @@ export const ReactionPicker = ({ type="button" className="compose-emoji-button" onClick={() => handleSelect(emoji)} - aria-label={`์ด๋ชจ์ง€ ${emoji.label}`} + aria-label={t("compose.emojiPanel.emojiAria", { label: emoji.label })} title={emoji.shortcode ? `:${emoji.shortcode}:` : undefined} data-emoji-nav="emoji" data-emoji-id={emoji.id} @@ -559,9 +561,9 @@ export const ReactionPicker = ({
- ํ‘œ์ค€ ์ด๋ชจ์ง€ + {t("compose.emojiPanel.standardTitle")}
) : null} {standardEmojiCategories.map((category) => { @@ -588,7 +590,7 @@ export const ReactionPicker = ({ type="button" className="compose-emoji-button" onClick={() => handleSelect(emoji)} - aria-label={`์ด๋ชจ์ง€ ${emoji.label}`} + aria-label={t("compose.emojiPanel.emojiAria", { label: emoji.label })} title={emoji.shortcode ? `:${emoji.shortcode}:` : undefined} data-emoji-nav="emoji" data-emoji-id={emoji.id} diff --git a/src/ui/components/SettingsModal.tsx b/src/ui/components/SettingsModal.tsx index ac3cc08..69294fe 100644 --- a/src/ui/components/SettingsModal.tsx +++ b/src/ui/components/SettingsModal.tsx @@ -1,6 +1,8 @@ import type { AccountsState } from "../state/AppContext"; import type { ColorScheme, ThemeMode } from "../utils/theme"; import { AccountSelector } from "./AccountSelector"; +import { useTranslation } from "react-i18next"; +import { SUPPORTED_LANGUAGES } from "../../i18n"; type SettingsModalProps = { open: boolean; @@ -49,6 +51,7 @@ export const SettingsModal = ({ onPomodoroBreakChange, onPomodoroLongBreakChange }: SettingsModalProps) => { + const { t, i18n } = useTranslation(); if (!open) { return null; } @@ -58,20 +61,20 @@ export const SettingsModal = ({
-

์„ค์ •

+

{t("settings.title")}

- ๊ณ„์ • ๊ด€๋ฆฌ -

๊ณ„์ •์„ ์„ ํƒํ•˜์—ฌ ์žฌ์ธ์ฆํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

+ {t("settings.account.title")} +

{t("settings.account.description")}

- {reauthLoading ? "์žฌ์ธ์ฆ ์ค‘..." : "์žฌ์ธ์ฆ"} + {reauthLoading ? t("settings.account.reauthing") : t("settings.account.reauth")}
- ํ…Œ๋งˆ -

๊ธฐ๋ณธ, ํฌ๋ฆฌ์Šค๋งˆ์Šค, ํ•˜๋Š˜ํ•‘ํฌ, ๋ชจ๋…ธํ†ค ํ…Œ๋งˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

+ {t("settings.theme.title")} +

{t("settings.theme.description")}

- ์ƒ‰์ƒ ๋ชจ๋“œ -

์‹œ์Šคํ…œ ์„ค์ •์„ ๋”ฐ๋ฅด๊ฑฐ๋‚˜ ๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

+ {t("settings.colorScheme.title")} +

{t("settings.colorScheme.description")}

- ๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ -

์‚ฌ์ด๋“œ๋ฐ”์— ๋ฝ€๋ชจ๋„๋กœ ํƒ€์ด๋จธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

+ {t("settings.language.title")} +

{t("settings.language.description")}

+
+ +
+
+
+ {t("settings.pomodoro.title")} +

{t("settings.pomodoro.description")}