@@ -169,45 +173,56 @@ const Select = ({
)
}
-const SupportedWallets = () => (
-
-
-
-
- {/* {Object.values(WALLET_ICONS).map((icon, i) => (
+const SupportedWallets = () => {
+ const t = useTranslations('FauxBridge')
+
+ return (
+
+
+
+ {t('Supported wallets')}
+
+
+ {/* {Object.values(WALLET_ICONS).map((icon, i) => (
{icon({ width: 24, height: 24 })}
))} */}
-
+
+
+
+ {/* Connected */}
+
-
- {/* Connected */}
-
-
-)
+ )
+}
-const HistoricMax = () => (
-
-
-)
+ )
+}
const RightAngle = ({ height }) => {
const width = height / 2
@@ -229,42 +244,46 @@ const RightAngle = ({ height }) => {
)
}
-const BridgeButton = () => (
-
-
-
-)
+ {t('Bridge')}
+
+
+
+
+
+
+ )
+}
diff --git a/packages/synapse-interface/components/input/DeadlineInput.tsx b/packages/synapse-interface/components/input/DeadlineInput.tsx
index e098c0db00..3fcc8c74d6 100644
--- a/packages/synapse-interface/components/input/DeadlineInput.tsx
+++ b/packages/synapse-interface/components/input/DeadlineInput.tsx
@@ -1,3 +1,5 @@
+import { useTranslations } from 'next-intl'
+
export const DeadlineInput = ({
deadlineMinutes,
setDeadlineMinutes,
@@ -5,6 +7,8 @@ export const DeadlineInput = ({
deadlineMinutes: string
setDeadlineMinutes: (value: string) => void
}) => {
+ const t = useTranslations('Time')
+
return (
diff --git a/packages/synapse-interface/components/layouts/LandingPageWrapper/PageFooter.tsx b/packages/synapse-interface/components/layouts/LandingPageWrapper/PageFooter.tsx
index 336ae3a037..82d8ccfb7e 100644
--- a/packages/synapse-interface/components/layouts/LandingPageWrapper/PageFooter.tsx
+++ b/packages/synapse-interface/components/layouts/LandingPageWrapper/PageFooter.tsx
@@ -1,4 +1,5 @@
-import Grid from '@tw/Grid'
+import { useTranslations } from 'next-intl'
+
import Link from 'next/link'
import {
@@ -116,6 +117,7 @@ const supportList: FooterDataProps[] = [
]
export function PageFooter() {
+ const t = useTranslations('Nav')
return (
@@ -134,10 +136,10 @@ export function PageFooter() {
target="_blank"
rel="noreferrer"
>
- Terms of Use
+ {t('Terms of Use')}
- |
+ {t('|')}
@@ -165,6 +167,7 @@ function FooterBlock({ elements }: { elements: FooterDataProps[] }) {
function DisplayText({ element }: { element: FooterDataProps }) {
const { text, url, type } = element
+ const t = useTranslations('Nav')
if (type === FooterType.URL) {
return (
@@ -175,7 +178,7 @@ function DisplayText({ element }: { element: FooterDataProps }) {
target="_blank"
rel="noreferrer"
>
- {text}
+ {t(text)}
)
@@ -186,11 +189,11 @@ function DisplayText({ element }: { element: FooterDataProps }) {
className="duration-75 hover:text-white hover:text-opacity-100 transform-gpu hover:transition-all"
href={url}
>
- {text}
+ {t(text)}
)
} else {
- return {text}
+ return {t(text)}
}
}
diff --git a/packages/synapse-interface/components/layouts/LandingPageWrapper/index.tsx b/packages/synapse-interface/components/layouts/LandingPageWrapper/index.tsx
index eb54d7fbc6..dc1cb52a4d 100644
--- a/packages/synapse-interface/components/layouts/LandingPageWrapper/index.tsx
+++ b/packages/synapse-interface/components/layouts/LandingPageWrapper/index.tsx
@@ -2,6 +2,8 @@ import { Fragment } from 'react'
import { useRouter } from 'next/router'
import { Popover, Transition } from '@headlessui/react'
import { MenuIcon, XIcon } from '@heroicons/react/outline'
+import { useTranslations } from 'next-intl'
+
import Grid from '@tw/Grid'
import ForumIcon from '@icons/ForumIcon'
import TwitterIcon from '@icons/TwitterIcon'
@@ -19,7 +21,6 @@ import {
LANDING_PATH,
TELEGRAM_URL,
TWITTER_URL,
- getBuySynUrl,
} from '@/constants/urls'
import { NAVIGATION } from '@/constants/routes'
import { MoreButton } from './MoreButton'
@@ -30,6 +31,7 @@ import {
useMaintenance,
} from '@/components/Maintenance/Maintenance'
import { AnnouncementBanner } from '@/components/Maintenance/components/AnnouncementBanner'
+import { LanguageSelector } from '@/components/LanguageSelector'
const wrapperClassNames = {
textColor: 'text-zinc-800 dark:text-zinc-200',
@@ -72,6 +74,8 @@ export function LandingPageWrapper({ children }: { children: any }) {
}
export function LandingNav() {
+ const t = useTranslations('Nav')
+
return (
@@ -81,7 +85,7 @@ export function LandingNav() {
data-test-id="mobile-navbar-button"
className="p-2 text-gray-400 rounded-md hover:bg-gray-800 focus:outline-none"
>
- Open menu
+ {t('Open menu')}
@@ -94,6 +98,7 @@ export function LandingNav() {
+
{({ open }) => (
@@ -129,14 +134,15 @@ export function LandingNav() {
- Close menu
+ {t('Close menu')}
-
@@ -181,11 +187,13 @@ export function PopoverPanelContainer({
}
function TopBarButtons() {
+ const t = useTranslations('Nav')
+
const topBarNavLinks = Object.entries(NAVIGATION).map(([key, value]) => (
))
diff --git a/packages/synapse-interface/components/layouts/StandardPageContainer.tsx b/packages/synapse-interface/components/layouts/StandardPageContainer.tsx
index 270d12081e..8c408194f5 100644
--- a/packages/synapse-interface/components/layouts/StandardPageContainer.tsx
+++ b/packages/synapse-interface/components/layouts/StandardPageContainer.tsx
@@ -1,8 +1,9 @@
-import { useEffect, useState } from 'react'
+import { useEffect } from 'react'
import toast from 'react-hot-toast'
+import { useTranslations } from 'next-intl'
+
import { CHAINS_BY_ID } from '@constants/chains'
import { getNetworkTextColor } from '@styles/chains'
-import { Chain } from '@/utils/types/index'
import { AcceptedChainId } from '@constants/chains'
const StandardPageContainer = ({
@@ -20,16 +21,7 @@ const StandardPageContainer = ({
address: string
connectedChainId: number
}) => {
- // useEffect(() => {
- // if (!address) return
-
- // toast(
- //
- //
Switched account to
- //
{address}
- //
- // )
- // }, [address])
+ const t = useTranslations('Wallet')
useEffect(() => {
if (!connectedChainId) return
@@ -39,18 +31,17 @@ const StandardPageContainer = ({
if (unsupported) {
unsupportedToaster = toast.error(
- `Connected to an unsupported network. Please switch networks.`,
+ t('Connected to an unsupported network; Please switch networks.'),
{ id: 'unsupported-popup', duration: 5000 }
)
} else {
toast(
<>
- Connected to the{' '}
+ {t('Connected to')}{' '}
{' '}
{chain?.altName ?? chain?.name}{' '}
- chain
>,
{ id: 'standard-popup', duration: 5000 }
)
diff --git a/packages/synapse-interface/components/ui/ChainSelector.tsx b/packages/synapse-interface/components/ui/ChainSelector.tsx
index faf325359d..3eee869fc6 100644
--- a/packages/synapse-interface/components/ui/ChainSelector.tsx
+++ b/packages/synapse-interface/components/ui/ChainSelector.tsx
@@ -1,5 +1,6 @@
import React, { useEffect, useState } from 'react'
import { useDispatch } from 'react-redux'
+import { useTranslations } from 'next-intl'
import { type Chain } from '@/utils/types'
import { SelectSpecificNetworkButton } from '@/components/ui/SelectSpecificNetworkButton'
@@ -26,6 +27,8 @@ export function ChainSelector({
const [currentId, setCurrentId] = useState(null)
const dispatch = useDispatch()
+ const t = useTranslations('Bridge')
+
const handleSetChainId = (chainId) => {
if (selectedItem?.id !== chainId) {
const eventTitle = `[${action} User Action] Sets new ${
@@ -99,7 +102,7 @@ export function ChainSelector({
key={dataTestId}
dataTestId={dataTestId}
label={label}
- placeholder={placeholder ?? 'Network'}
+ placeholder={placeholder ?? t('Network')}
selectedItem={selectedItem}
searchStr={searchStr}
onSearch={onSearch}
diff --git a/packages/synapse-interface/components/ui/NewTag.tsx b/packages/synapse-interface/components/ui/NewTag.tsx
index e944864b0c..009a8c4204 100644
--- a/packages/synapse-interface/components/ui/NewTag.tsx
+++ b/packages/synapse-interface/components/ui/NewTag.tsx
@@ -1,11 +1,14 @@
+import { useTranslations } from 'next-intl'
+
import { joinClassNames } from '@/utils/joinClassNames'
export const NewTag = () => {
+ const t = useTranslations('Bridge')
const classNames = {
space: 'px-2 py-[2px] rounded-md',
border: 'border border-fuchsia-500',
background: 'bg-gradient-to-r from-fuchsia-950 to-purple-900',
font: 'text-sm ',
}
- return New!
+ return {t('New')}!
}
diff --git a/packages/synapse-interface/components/ui/SearchResults.tsx b/packages/synapse-interface/components/ui/SearchResults.tsx
index e6d548abc3..0ccc242095 100644
--- a/packages/synapse-interface/components/ui/SearchResults.tsx
+++ b/packages/synapse-interface/components/ui/SearchResults.tsx
@@ -1,11 +1,15 @@
+import { useTranslations } from 'next-intl'
+
export const SearchResults = ({ searchStr }: { searchStr: string }) => {
+ const t = useTranslations('Search')
+
return (
{searchStr && (
- No other results found for
{searchStr} .
+ {t('No other results found for')}
{searchStr} .
- Want to see it supported on Synapse? Let us know!
+ {t('Want to see it supported on Synapse? Let us know!')}
)}
diff --git a/packages/synapse-interface/components/ui/SelectSpecificNetworkButton.tsx b/packages/synapse-interface/components/ui/SelectSpecificNetworkButton.tsx
index 7709dd3f8a..91a067138e 100644
--- a/packages/synapse-interface/components/ui/SelectSpecificNetworkButton.tsx
+++ b/packages/synapse-interface/components/ui/SelectSpecificNetworkButton.tsx
@@ -107,7 +107,7 @@ const ChainTokens = ({
className="flex items-center cursor-pointer hover-trigger text-sm text-secondary -space-x-1.5"
>
{balanceTokens?.slice(0, max).map((token: TokenAndBalance) => {
- return
+ return
})}
{remainder > 0 && (
diff --git a/packages/synapse-interface/components/ui/SelectorWrapper.tsx b/packages/synapse-interface/components/ui/SelectorWrapper.tsx
index 7b2ad657e7..4ee40f43cf 100644
--- a/packages/synapse-interface/components/ui/SelectorWrapper.tsx
+++ b/packages/synapse-interface/components/ui/SelectorWrapper.tsx
@@ -1,4 +1,5 @@
import React, { useEffect, useRef } from 'react'
+import { useTranslations } from 'next-intl'
import { getActiveStyleForButton, getHoverStyleForButton } from '@/styles/hover'
import { DropDownArrowSvg } from '@/components/icons/DropDownArrowSvg'
@@ -60,6 +61,8 @@ export const SelectorWrapper = ({
useCloseOnOutsideClick(parentRef, () => onClose())
+ const t = useTranslations()
+
const buttonClassNames = {
flex: 'flex items-center gap-2',
space: 'px-2 py-1.5 rounded',
@@ -119,7 +122,7 @@ export const SelectorWrapper = ({
diff --git a/packages/synapse-interface/components/ui/TranslatedText.tsx b/packages/synapse-interface/components/ui/TranslatedText.tsx
new file mode 100644
index 0000000000..bd47eefa98
--- /dev/null
+++ b/packages/synapse-interface/components/ui/TranslatedText.tsx
@@ -0,0 +1,16 @@
+import React from 'react'
+import { useTranslations } from 'next-intl'
+
+interface TranslatedTextProps {
+ namespace: string
+ id: string
+}
+
+export const TranslatedText: React.FC
= ({
+ namespace,
+ id,
+}) => {
+ const t = useTranslations(namespace)
+
+ return <>{t(id)}>
+}
diff --git a/packages/synapse-interface/messages/ar.json b/packages/synapse-interface/messages/ar.json
new file mode 100644
index 0000000000..b52b6f617d
--- /dev/null
+++ b/packages/synapse-interface/messages/ar.json
@@ -0,0 +1,378 @@
+{
+ "Activity": {
+ "Activity": "النشاط",
+ "Your pending and recent transactions will appear here": "ستظهر المعاملات المعلقة والأخيرة هنا.",
+ "Loading activity": "تحميل النشاط",
+ "No transactions in last 30 days": "لا توجد معاملات خلال آخر 30 يومًا.",
+ "Recent": "الأخيرة",
+ "Explorer": "المستكشف",
+ "remaining": "المتبقية",
+ "Select": "اختر",
+ "Selected": "تم الاختيار"
+ },
+ "Bridge": {
+ "Bridge": "الجسر",
+ "Send your assets across chains": "أرسل أصولك عبر السلاسل.",
+ "Bridge paused": "الجسر متوقف مؤقتًا",
+ "Please select Origin Network": "يرجى اختيار شبكة المصدر",
+ "Please select Destination network": "يرجى اختيار شبكة الوجهة",
+ "Please select an Origin token": "يرجى اختيار رمز المصدر",
+ "Bridge {symbol}": "جسر {symbol}",
+ "Connect Wallet to Bridge": "اتصل بالمحفظة للجسر",
+ "Amount must be greater than fee": "يجب أن يكون المبلغ أكبر من الرسوم",
+ "Error in bridge quote": "خطأ في عرض الجسر",
+ "Invalid bridge quote": "عرض الجسر غير صالح",
+ "Insufficient balance": "رصيد غير كافٍ",
+ "Invalid Destination address": "عنوان وجهة غير صالح",
+ "Confirm destination address": "تأكيد عنوان الوجهة",
+ "Switch to {chainName}": "التبديل إلى {chainName}",
+ "Switching chains": "التبديل بين السلاسل",
+ "Approve {symbol}": "الموافقة على {symbol}",
+ "Approving": "الموافقة",
+ "Bridging": "الربط",
+ "Max": "الأقصى",
+ "available": "المتاح",
+ "Available": "المتاح",
+ "calculating gas": "حساب الغاز",
+ "New": "جديد",
+ "Gas token": "رمز الغاز",
+ "Not bridgeable": "غير قابل للجسر",
+ "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}": "تم بدء الجسر بنجاح من {fromToken} على {originChainName} إلى {toToken} على {destinationChainName}",
+ "Slippage": "الانزلاق",
+ "Router": "الموجه",
+ "Powered by Synapse": "مدعوم من سينابس",
+ "Will also receive": "سيتم أيضًا استلام",
+ "From": "من",
+ "FromWithEllipsis": "من…",
+ "ToWithEllipsis": "إلى…",
+ "To": "إلى",
+ "In": "في",
+ "Out": "خارج",
+ "Network": "شبكة",
+ "Select origin token": "اختر رمز المصدر",
+ "All chains": "جميع السلاسل",
+ "SendWithEllipsis": "إرسال…",
+ "All sendable tokens": "جميع الرموز القابلة للإرسال",
+ "All other tokens": "جميع الرموز الأخرى",
+ "ReceiveWithEllipsis": "استلام…",
+ "All receivable tokens": "جميع الرموز القابلة للاستلام",
+ "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "تم العثور على مسار لجسر {debouncedFromValue} {fromToken} على {fromChainId} إلى {toToken} على {toChainId}",
+ "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "لم يتم العثور على مسار لجسر {debouncedFromValue} {fromToken} على {fromChainId} إلى {toToken} على {toChainId}"
+ },
+ "Completed": {
+ "to": "إلى",
+ "Today": "اليوم",
+ "Completed": "مكتمل"
+ },
+ "Destination": {
+ "WarningMessage1": "مطلوب:",
+ "WarningMessage2": "تحقق من عنوان الوجهة الخاص بك للمتابعة.",
+ "WarningMessage3": "لا",
+ "WarningMessage4": "ترسل الأصول إلى عنوان الحفظ أو البورصة. قد يكون من المستحيل استرداد أموالك."
+ },
+ "FauxBridge": {
+ "▼": "▼",
+ "Supported wallets": "المحافظ المدعومة",
+ "40,668 ETH": "40,668 إيثيريوم",
+ "Fantom": "فانتوم",
+ "Ethereum": "إيثيريوم",
+ "Jan 29, 2022 - #1": "29 يناير 2022 - #1",
+ "Max": "الأقصى",
+ "Enter Bridge": "دخول الجسر",
+ "Bridge": "الجسر"
+ },
+ "Landing": {
+ "BridgeSection": {
+ "Powering": "تزويد الجسر الأكثر شهرة بالطاقة",
+ "Synapse Bridge": "جسر سينابس",
+ "Built on top of": "تم بناؤه فوق بنية تحتية عبر السلاسل تتيح للمستخدمين نقل الأصول بسلاسة عبر جميع سلاسل الكتل. أصبح الجسر الطريقة الأكثر استخدامًا لنقل الأصول عبر السلاسل، حيث يقدم تكاليف منخفضة وسرعة وأمان.",
+ "Deep Liquidity": "السيولة العميقة",
+ "Swap native assets": "تبادل الأصول الأصلية باستخدام مجمعات سيولة AMM عبر السلاسل",
+ "Wide Support": "دعم واسع",
+ "Access": "الوصول إلى أكثر من 16 سلسلة من سلاسل الكتل EVM وغير EVM مع المزيد من التكاملات القادمة قريبًا",
+ "Developer Friendly": "ملائم للمطورين",
+ "Integrate": "دمج جسر الرموز عبر السلاسل بسهولة في تطبيقك اللامركزي"
+ },
+ "ExplorerSection": {
+ "Battle tested": "بنية تحتية تم اختبارها في المعارك",
+ "Synapse has processed": "سينابس عالج ملايين المعاملات وعشرات المليارات في الأصول المنقولة عبر الجسر.",
+ "Go to Explorer": "انتقل إلى المستكشف",
+ "Total Value Locked": "القيمة الإجمالية المقفلة",
+ "Total Bridge Volume": "إجمالي حجم الجسر",
+ "Total TX Count": "إجمالي عدد المعاملات"
+ },
+ "HeroSection": {
+ "title": "اتصال آمن عبر السلاسل",
+ "description": "سينابس هي الشبكة الأكثر استخدامًا، القابلة للتوسيع، والأمنة للاتصال عبر السلاسل. ابني تطبيقات حقيقية عبر السلاسل باستخدام بروتوكول سينابس.",
+ "buildButton": "ابني على سينابس",
+ "enterBridgeButton": "دخول الجسر"
+ },
+ "HowItWorksSection": {
+ "How it all works": "كيف يعمل كل شيء",
+ "description": "تستخدم العقود الذكية من سلسلة واحدة الموجه الرسائل سينابس لإرسال الرسالة إلى سلسلة الوجهة، حيث يقوم موجه الرسائل المقابل بإرسالها إلى العقد الوجهة. يتم التحقق من الرسائل بشكل متفائل لضمان الأمان وعدم الاعتماد."
+ },
+ "IntegrationSection": {
+ "Widely integrated": "دمج واسع",
+ "Synapse is": "سينابس مدمج على نطاق واسع عبر الشبكات الأكثر استخدامًا من الطبقة الأولى والطبقة الثانية لتجربة سلسة عبر السلاسل.",
+ "Layer": "طبقة"
+ },
+ "ResourcesSection": {
+ "Get started now": "ابدأ الآن",
+ "Find the resources": "ابحث عن الموارد التي تحتاجها لإنشاء تكاملات مع سينابس.",
+ "References": "المراجع",
+ "See references": "شاهد المراجع",
+ "Documentation": "التوثيق",
+ "Read detailed": "اقرأ تفصيلًا شاملاً عن واجهات برمجة التطبيقات والعقود الذكية الخاصة بنا",
+ "Read the docs": "اقرأ الوثائق",
+ "Tutorials": "الدروس التعليمية",
+ "Watch tutorials": "شاهد دروس تفاعلية لتتعلم كيفية عمل سينابس",
+ "Go to tutorials": "انتقل إلى الدروس التعليمية"
+ },
+ "UseCasesSection": {
+ "title": "حالات الاستخدام",
+ "subtitle": "إليك معاينة لما يمكنك فعله باستخدام سينابس.",
+ "useCases": [
+ {
+ "title": "التبادل عبر السلاسل",
+ "description": "تبديل أي أصل على أي سلسلة باستخدام تحويلات الرموز عبر سينابس"
+ },
+ {
+ "title": "أسواق الأموال العالمية",
+ "description": "الاقتراض والإقراض عبر أي سلسلة باستخدام مجمعات سينابس"
+ },
+ {
+ "title": "الألعاب متعددة السلاسل",
+ "description": "إنشاء تجارب ألعاب فريدة تصل إلى سلاسل متعددة"
+ }
+ ]
+ },
+ "SecuritySection": {
+ "title": "اتصال آمن بكل سلسلة",
+ "description": {
+ "part1": "سينابس يتكون من",
+ "strong1": "إطار عمل للرسائل عبر السلاسل",
+ "part2": "و",
+ "strong2": "طريقة آمنة اقتصاديًا",
+ "part3": "للوصول إلى توافق حول صلاحية المعاملات عبر السلاسل، مما يمكن المطورين من بناء تطبيقات أصلية حقيقية عبر السلاسل."
+ },
+ "extensibleHeader": "قابل للتوسيع",
+ "extensibleDescription": "يمكن نشر عقود الرسائل عبر السلاسل الخاصة بسينابس عبر أي سلسلة",
+ "secureHeader": "آمن",
+ "secureDescription": "سينابس يستخدم نموذج أمني متفائل لضمان سلامة الرسائل عبر السلاسل",
+ "generalizedHeader": "معمم",
+ "generalizedDescription": "يمكن إرسال أي بيانات عشوائية عبر السلاسل بما في ذلك استدعاءات العقود وNFTs واللقطات والمزيد"
+ }
+ },
+ "LanguageSelector": {
+ "Language": "اللغة"
+ },
+ "Pools": {
+ "Actions": "الإجراءات",
+ "Approve": "الموافقة",
+ "Back to Pool": "العودة إلى المجمع",
+ "Back to Pools": "العودة إلى المجمعات",
+ "Switch to": "التبديل إلى",
+ "to interact with the": "للتفاعل مع",
+ "pool": "المجمع",
+ "Invalid Pool ID": "معرف المجمع غير صالح",
+ "Deposit": "الإيداع",
+ "Withdraw": "السحب",
+ "Stake": "الرهن",
+ "Staked": "مرهون",
+ "Staking": "جار الرهن",
+ "Unstake": "إلغاء الرهن",
+ "Unstaked": "غير مرهون",
+ "Unstaking": "جار إلغاء الرهن",
+ "Insufficient balance": "رصيد غير كافٍ",
+ "Earned": "المكتسب",
+ "Claim": "المطالبة",
+ "Claiming": "جار المطالبة",
+ "Approving": "جار الموافقة",
+ "You will receive": "ستستلم",
+ "Withdraw Percentage": "نسبة السحب",
+ "Add Liquidity": "إضافة السيولة",
+ "Remove Liquidity": "إزالة السيولة",
+ "Rewards": "المكافآت",
+ "base": "الأساس",
+ "reward": "المكافأة",
+ "Daily APR": "APR اليومي",
+ "Weekly APR": "APR الأسبوعي",
+ "Yearly APR": "APR السنوي",
+ "Yearly APY": "APY السنوي",
+ "Stake your LP Tokens": "ارهن رموز LP الخاصة بك",
+ "Incentivized Pools": "المجمعات المشجعة",
+ "Contributors are rewarded": "يتم مكافأة المساهمين على توازن المجمعات.",
+ "Unincentivized Pools": "المجمعات غير المشجعة",
+ "Pools without contributor rewards": "المجمعات بدون مكافآت للمساهمين.",
+ "Migrated Pools": "المجمعات التي تم نقلها",
+ "Pools migrated to new reward contracts": "المجمعات التي تم نقلها إلى عقود مكافآت جديدة.",
+ "Withdrawal completed": "تم اكتمال السحب",
+ "Claim completed": "تم اكتمال المطالبة",
+ "Completed withdrawal": "تم اكتمال السحب",
+ "Successfully approved on": "تمت الموافقة بنجاح على",
+ "Stake completed": "تم اكتمال الرهن",
+ "Liquidity added": "تمت إضافة السيولة",
+ "Your balances": "أرصدتك",
+ "DepositButton": {
+ "insufficientBalance": "رصيد غير كافٍ",
+ "connectWallet": "اتصل بالمحفظة للجسر",
+ "switchChain": "التبديل إلى {chainName}",
+ "switchingChains": "جار التبديل بين السلاسل",
+ "approveTokens": "الموافقة على الرموز",
+ "approving": "جار الموافقة",
+ "deposit": "إيداع",
+ "depositing": "جار الإيداع"
+ },
+ "WithdrawButton": {
+ "insufficientBalance": "رصيد غير كافٍ",
+ "connectWallet": "اربط المحفظة",
+ "switchChain": "التبديل إلى {chainName}",
+ "switchingChains": "جار التبديل بين السلاسل",
+ "approveToken": "الموافقة على الرمز",
+ "approving": "جار الموافقة",
+ "withdraw": "سحب",
+ "withdrawing": "جار السحب…"
+ },
+ "Other": {
+ "Bonus": "المكافأة",
+ "Price impact": "تأثير السعر",
+ "Currency Reserves": "احتياطات العملة",
+ "Pool Info": "معلومات المجمع",
+ "Trading Fee": "رسوم التداول",
+ "Virtual Price": "السعر الافتراضي",
+ "Total Liquidity": "إجمالي السيولة",
+ "Total Liquidity USD": "إجمالي السيولة بالدولار الأمريكي",
+ "Requesting approval": "طلب الموافقة",
+ "Starting your deposit": "بدء الإيداع…",
+ "Starting your claim": "بدء المطالبة…"
+ }
+ },
+ "Portfolio": {
+ "Portfolio": "المحفظة",
+ "Loading assets": "تحميل الأصول",
+ "Synapse is the most widely used, extensible, and secure cross-chain communications network": "سينابس هي شبكة الأكثر استخدامًا، القابلة للتوسيع، والأمنة للاتصال عبر السلاسل.",
+ "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction": "احصل على عروض المسار في لوحة الجسر، واتصل بمحفظتك عندما تكون مستعدًا لتقديم معاملة.",
+ "Gas token": "رمز الغاز",
+ "Available": "المتاح",
+ "This chain is not yet supported; New chain or token support can be discussed on": "هذه السلسلة غير مدعومة بعد. يمكن مناقشة دعم سلسلة أو رمز جديد على",
+ "or": "أو",
+ "Discord": "ديسكورد",
+ "Twitter": "تويتر",
+ "Viewing": "عرض",
+ "Tokens, chains": "الرموز، السلاسل",
+ "Bridge txs": "معاملات الجسر",
+ "Search": "البحث"
+ },
+ "Search": {
+ "No other results found for": "لم يتم العثور على نتائج أخرى لـ",
+ "No results found for": "لم يتم العثور على نتائج لـ",
+ "Want to see it supported on Synapse? Let us know!": "تريد رؤيته مدعومًا على سينابس؟ دعنا نعرف!",
+ "Find": "اعثر"
+ },
+ "Settings": {
+ "Settings": "الإعدادات",
+ "Close": "إغلاق",
+ "Options": "الخيارات",
+ "Show withdrawal address": "إظهار عنوان السحب",
+ "Allows bridging to another address": "يسمح بالجسر إلى عنوان آخر."
+ },
+ "Swap": {
+ "Swap": "المبادلة",
+ "Exchange assets on chain": "تبادل الأصول على السلسلة.",
+ "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}": "تم التبديل بنجاح من {swapFromToken} إلى {swapToToken} على {currentChainName}",
+ "available": "المتاح",
+ "Expected price on": "السعر المتوقع على",
+ "Slippage": "الانزلاق",
+ "Swap paused": "التبادل موقف مؤقتا",
+ "Please select Origin network": "يرجى اختيار شبكة المصدر",
+ "Swaps are not available on this network": "المقايضات غير متاحة على هذه شبكة",
+ "Please select token": "يرجى اختيار الرمز",
+ "Connect Wallet to Swap": "اتصل بالمحفظة للمبادلة",
+ "Insufficient balance": "رصيد غير كافٍ",
+ "Switch to": "التبديل إلى",
+ "Switching chains": "جار التبديل بين السلاسل",
+ "Approve": "الموافقة",
+ "Approving": "جار الموافقة",
+ "Swapping": "جار التبديل",
+ "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}": "تم العثور على مسار للتبديل من {value} {fromSymbol} على {chain} إلى {toSymbol}",
+ "Initiating swap from {fromSymbol} to {toSymbol} on {chain}": "بدء التبديل من {fromSymbol} إلى {toSymbol} على {chain}",
+ "Swapping {fromSymbol} on {chain} to {toSymbol}": "جار التبديل من {fromSymbol} على {chain} إلى {toSymbol}"
+ },
+ "Time": {
+ "d": "ي",
+ "min": "د",
+ "Waiting": "انتظار",
+ "Began": "بدأ",
+ "Complete": "مكتمل",
+ "Reverted": "تم الرجوع",
+ "Transaction reverted, funds returned": "تم الرجوع عن المعاملة، تم إرجاع الأموال",
+ "What's taking so long?": "لماذا يستغرق الأمر وقتًا طويلًا؟",
+ "FAQ": "الأسئلة الشائعة",
+ "Support": "الدعم",
+ "minutes": "دقائق",
+ "seconds": "ثوانٍ",
+ "m remaining": "م متبقية",
+ "s remaining": "ث متبقية",
+ "Clear notification": "مسح الإشعار",
+ "Clear transaction": "مسح المعاملات",
+ "Contact Support (Discord)": "اتصل بالدعم (ديسكورد)"
+ },
+ "Nav": {
+ "Open menu": "فتح القائمة",
+ "Close menu": "إغلاق القائمة",
+ "Terms of Use": "شروط الاستخدام",
+ "Privacy Policy": "سياسة الخصوصية",
+ "|": "|",
+ "About": "حول",
+ "Bridge": "الجسر",
+ "Swap": "المبادلة",
+ "Pools": "المجمعات",
+ "Stake": "الرهن",
+ "Explorer": "المستكشف",
+ "Interchain Network": "شبكة بين السلاسل",
+ "Solana Bridge": "جسر سولانا",
+ "Careers": "الوظائف",
+ "Documentation": "التوثيق",
+ "GitHub": "جيت هاب",
+ "Blog": "المدونة",
+ "Discord": "ديسكورد",
+ "Twitter": "تويتر",
+ "Forum": "المنتدى",
+ "Telegram": "تليجرام",
+ "Functions": "الوظائف",
+ "Developers": "المطورون",
+ "Support": "الدعم"
+ },
+ "ReturnToMonke": {
+ "Choose Synapse": "اختر سينابس",
+ "Generate Synaptic Profile Picture": "توليد صورة ملف تعريف سينابس",
+ "Drag and drop image here": "اسحب وأسقط الصورة هنا",
+ "Select different image?": "اختر صورة مختلفة؟",
+ "Download": "تحميل",
+ "Click to Upload or": "انقر للرفع او "
+ },
+ "Wallet": {
+ "Connect": "الاتصال",
+ "Connected": "متصل",
+ "Connected to": "متصل بـ",
+ "Connecting": "جار الاتصال",
+ "Switch Network": "التبديل إلى شبكة أخرى",
+ "Connect Wallet": "اتصل بالمحفظة",
+ "Wrong Network": "شبكة خاطئة",
+ "No bridgeable assets found for {address} on {chainName}": "لم يتم العثور على أصول قابلة للجسر لـ {address} على {chainName}",
+ "Don't see a chain or token you want to bridge?": "لا ترى سلسلة أو رمزًا ترغب في جسره؟",
+ "Let us know on": "دعنا نعرف على",
+ "or": "أو",
+ "Connected to an unsupported network; Please switch networks": "متصل بشبكة غير مدعومة؛ يرجى التبديل إلى شبكة أخرى.",
+ "Discord": "ديسكورد",
+ "Twitter": "تويتر"
+ },
+ "Warning": {
+ "Warning! The Harmony bridge has been exploited": "تحذير! تم استغلال جسر هارموني.",
+ "Do not bridge via Harmony unless you understand the risks involved": "لا تقم بالجسر عبر هارموني إلا إذا كنت تفهم المخاطر المتضمنة.",
+ "Warning! The Fantom bridge has been exploited": "تحذير! تم استغلال جسر فانتوم.",
+ "Do not bridge via Fantom unless you understand the risks involved": "لا تقم بالجسر عبر فانتوم إلا إذا كنت تفهم المخاطر المتضمنة.",
+ "Alert: Transactions to Dogechain are temporarily paused": "تنبيه: تم إيقاف المعاملات إلى دوغتشين مؤقتًا.",
+ "You may still bridge funds from Dogechain to any supported destination chain": "لا يزال بإمكانك جسر الأموال من دوغتشين إلى أي سلسلة وجهة مدعومة."
+ }
+}
diff --git a/packages/synapse-interface/messages/en-US.json b/packages/synapse-interface/messages/en-US.json
new file mode 100644
index 0000000000..4784ee82d4
--- /dev/null
+++ b/packages/synapse-interface/messages/en-US.json
@@ -0,0 +1,378 @@
+{
+ "Activity": {
+ "Activity": "Activity",
+ "Your pending and recent transactions will appear here": "Your pending and recent transactions will appear here.",
+ "Loading activity": "Loading activity",
+ "No transactions in last 30 days": "No transactions in last 30 days.",
+ "Recent": "Recent",
+ "Explorer": "Explorer",
+ "remaining": "remaining",
+ "Select": "Select",
+ "Selected": "Selected"
+ },
+ "Bridge": {
+ "Bridge": "Bridge",
+ "Send your assets across chains": "Send your assets across chains.",
+ "Bridge paused": "Bridge paused",
+ "Please select Origin Network": "Please select Origin Network",
+ "Please select Destination network": "Please select Destination network",
+ "Please select an Origin token": "Please select an Origin token",
+ "Bridge {symbol}": "Bridge {symbol}",
+ "Connect Wallet to Bridge": "Connect Wallet to Bridge",
+ "Amount must be greater than fee": "Amount must be greater than fee",
+ "Error in bridge quote": "Error in bridge quote",
+ "Invalid bridge quote": "Invalid bridge quote",
+ "Insufficient balance": "Insufficient balance",
+ "Invalid Destination address": "Invalid Destination address",
+ "Confirm destination address": "Confirm destination address",
+ "Switch to {chainName}": "Switch to {chainName}",
+ "Switching chains": "Switching chains",
+ "Approve {symbol}": "Approve {symbol}",
+ "Approving": "Approving",
+ "Bridging": "Bridging",
+ "Max": "Max",
+ "available": "available",
+ "Available": "Available",
+ "calculating gas": "calculating gas",
+ "New": "New",
+ "Gas token": "Gas token",
+ "Not bridgeable": "Not bridgeable",
+ "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}": "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}",
+ "Slippage": "Slippage",
+ "Router": "Router",
+ "Powered by Synapse": "Powered by Synapse",
+ "Will also receive": "Will also receive",
+ "From": "From",
+ "FromWithEllipsis": "From…",
+ "ToWithEllipsis": "To…",
+ "To": "To",
+ "In": "In",
+ "Out": "Out",
+ "Network": "Network",
+ "Select origin token": "Select origin token",
+ "All chains": "All chains",
+ "SendWithEllipsis": "Send…",
+ "All sendable tokens": "All sendable tokens",
+ "All other tokens": "All other tokens",
+ "ReceiveWithEllipsis": "Receive…",
+ "All receivable tokens": "All receivable tokens",
+ "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}",
+ "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}"
+ },
+ "Completed": {
+ "to": "to",
+ "Today": "Today",
+ "Completed": "Completed"
+ },
+ "Destination": {
+ "WarningMessage1": "Required:",
+ "WarningMessage2": "Verify your destination address to continue.",
+ "WarningMessage3": "Do not",
+ "WarningMessage4": "send assets to a custodial or exchange address. It may be impossible to recover your funds."
+ },
+ "FauxBridge": {
+ "▼": "▼",
+ "Supported wallets": "Supported wallets",
+ "40,668 ETH": "40,668 ETH",
+ "Fantom": "Fantom",
+ "Ethereum": "Ethereum",
+ "Jan 29, 2022 - #1": "Jan 29, 2022 - #1",
+ "Max": "Max",
+ "Enter Bridge": "Enter Bridge",
+ "Bridge": "Bridge"
+ },
+ "Landing": {
+ "BridgeSection": {
+ "Powering": "Powering the most popular bridge",
+ "Synapse Bridge": "Synapse Bridge",
+ "Built on top of": "is built on top of the cross-chain infrastructure enabling users to seamlessly transfer assets across all blockchains. The Bridge has become the most widely-used method to move assets cross-chain, offering low cost, fast, and secure bridging.",
+ "Deep Liquidity": "Deep Liquidity",
+ "Swap native assets": "Swap native assets using our cross-chain AMM liquidity pools",
+ "Wide Support": "Wide Support",
+ "Access": "Access over 16 different EVM and non-EVM blockchains with more integrations coming soon",
+ "Developer Friendly": "Developer Friendly",
+ "Integrate": "Easily integrate cross-chain token bridging natively into your decentralized application"
+ },
+ "ExplorerSection": {
+ "Battle tested": "Battled-test infrastructure",
+ "Synapse has processed": "Synapse has processed millions of transactions and tens of billions in bridged assets.",
+ "Go to Explorer": "Go to Explorer",
+ "Total Value Locked": "Total Value Locked",
+ "Total Bridge Volume": "Total Bridge Volume",
+ "Total TX Count": "Total TX Count"
+ },
+ "HeroSection": {
+ "title": "Secure cross-chain communication",
+ "description": "Synapse is the most widely used, extensible, secure cross-chain communications network. Build truly cross-chain applications using the Synapse Protocol.",
+ "buildButton": "Build on Synapse",
+ "enterBridgeButton": "Enter Bridge"
+ },
+ "HowItWorksSection": {
+ "How it all works": "How it all works",
+ "description": "Smart contracts from one chain use the Synapse Messaging Router to send the message to the destination chain, where a corresponding Messaging Router sends it to the destination contract. Messages are optimistically verified to ensure security and trustlessness."
+ },
+ "IntegrationSection": {
+ "Widely integrated": "Widely integrated",
+ "Synapse is": "Synapse is widely integrated across the most-used Layer 1 and Layer 2 networks for a seamless cross-chain experience.",
+ "Layer": "Layer"
+ },
+ "ResourcesSection": {
+ "Get started now": "Get started now",
+ "Find the resources": "Find the resources you need to create integrations with Synapse.",
+ "References": "References",
+ "See references": "See references",
+ "Documentation": "Documentation",
+ "Read detailed": "Read a detailed breakdown of our APIs and smart contracts",
+ "Read the docs": "Read the docs",
+ "Tutorials": "Tutorials",
+ "Watch tutorials": "Watch interactive tutorials to learn how Synapse works",
+ "Go to tutorials": "Go to tutorials"
+ },
+ "UseCasesSection": {
+ "title": "Use cases",
+ "subtitle": "Here's a preview of what you can do using Synapse.",
+ "useCases": [
+ {
+ "title": "Cross-chain exchange",
+ "description": "Swap any asset on any blockchain using Synapse token swaps"
+ },
+ {
+ "title": "Universal money markets",
+ "description": "Borrow and lend assets across any blockchain using Synapse pools"
+ },
+ {
+ "title": "Multi-chain gaming",
+ "description": "Create unique gaming experiences that access multiple blockchains"
+ }
+ ]
+ },
+ "SecuritySection": {
+ "title": "Securely connect every blockchain",
+ "description": {
+ "part1": "Synapse is comprised of a",
+ "strong1": "cross-chain messaging framework",
+ "part2": "and an",
+ "strong2": "economically secure method",
+ "part3": "to reach consensus on the validity of cross-chain transactions, enabling developers to build truly native cross-chain apps."
+ },
+ "extensibleHeader": "Extensible",
+ "extensibleDescription": "Synapse's cross-chain messaging contracts can be deployed across any blockchain",
+ "secureHeader": "Secure",
+ "secureDescription": "Synapse employs an Optimistic security model to ensure integrity of cross-chain messages",
+ "generalizedHeader": "Generalized",
+ "generalizedDescription": "Any arbitrary data can be sent across chains including contract calls, NFTs, snapshots, and more"
+ }
+ },
+ "LanguageSelector": {
+ "Language": "Language"
+ },
+ "Pools": {
+ "Actions": "Actions",
+ "Approve": "Approve",
+ "Back to Pool": "Back to Pool",
+ "Back to Pools": "Back to Pools",
+ "Switch to": "Switch to",
+ "to interact with the": "to interact with the",
+ "pool": "pool",
+ "Invalid Pool ID": "Invalid Pool ID",
+ "Deposit": "Deposit",
+ "Withdraw": "Withdraw",
+ "Stake": "Stake",
+ "Staked": "Staked",
+ "Staking": "Staking",
+ "Unstake": "Unstake",
+ "Unstaked": "Unstaked",
+ "Unstaking": "Unstaking",
+ "Insufficient balance": "Insufficient balance",
+ "Earned": "Earned",
+ "Claim": "Claim",
+ "Claiming": "Claiming",
+ "Approving": "Approving",
+ "You will receive": "You will receive",
+ "Withdraw Percentage": "Withdraw Percentage",
+ "Add Liquidity": "Add Liquidity",
+ "Remove Liquidity": "Remove Liquidity",
+ "Rewards": "Rewards",
+ "base": "base",
+ "reward": "reward",
+ "Daily APR": "Daily APR",
+ "Weekly APR": "Weekly APR",
+ "Yearly APR": "Yearly APR",
+ "Yearly APY": "Yearly APY",
+ "Stake your LP Tokens": "Stake your LP Tokens",
+ "Incentivized Pools": "Incentivized Pools",
+ "Contributors are rewarded": "Contributors are rewarded for balancing asset pools.",
+ "Unincentivized Pools": "Unincentivized Pools",
+ "Pools without contributor rewards": "Pools without contributor rewards.",
+ "Migrated Pools": "Migrated Pools",
+ "Pools migrated to new reward contracts": "Pools migrated to new reward contracts.",
+ "Withdrawal completed": "Withdrawal completed",
+ "Claim completed": "Claim completed",
+ "Completed withdrawal": "Completed withdrawal",
+ "Successfully approved on": "Successfully approved on",
+ "Stake completed": "Stake completed",
+ "Liquidity added": "Liquidity added",
+ "Your balances": "Your balances",
+ "DepositButton": {
+ "insufficientBalance": "Insufficient Balance",
+ "connectWallet": "Connect Wallet to Bridge",
+ "switchChain": "Switch to {chainName}",
+ "switchingChains": "Switching chains",
+ "approveTokens": "Approve Token(s)",
+ "approving": "Approving",
+ "deposit": "Deposit",
+ "depositing": "Depositing"
+ },
+ "WithdrawButton": {
+ "insufficientBalance": "Insufficient Balance",
+ "connectWallet": "Connect Wallet to Bridge",
+ "switchChain": "Switch to {chainName}",
+ "switchingChains": "Switching chains",
+ "approveToken": "Approve Token",
+ "approving": "Approving",
+ "withdraw": "Withdraw",
+ "withdrawing": "Withdrawing..."
+ },
+ "Other": {
+ "Bonus": "Bonus",
+ "Price impact": "Price impact",
+ "Currency Reserves": "Currency Reserves",
+ "Pool Info": "Pool Info ",
+ "Trading Fee": "Trading Fee",
+ "Virtual Price": "Virtual Price",
+ "Total Liquidity": "Total Liquidity",
+ "Total Liquidity USD": "Total Liquidity USD",
+ "Requesting approval": "Requesting approval",
+ "Starting your deposit": "Starting your deposit...",
+ "Starting your claim": "Starting your claim..."
+ }
+ },
+ "Portfolio": {
+ "Portfolio": "Portfolio",
+ "Loading assets": "Loading assets",
+ "Synapse is the most widely used, extensible, and secure cross-chain communications network": "Synapse is the most widely used, extensible, and secure cross-chain communications network.",
+ "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction": "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction.",
+ "Gas token": "Gas token",
+ "Available": "Available",
+ "This chain is not yet supported; New chain or token support can be discussed on": "This chain is not yet supported. New chain or token support can be discussed on",
+ "or": "or",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Viewing": "Viewing",
+ "Tokens, chains": "Tokens, chains",
+ "Bridge txs": "Bridge txs",
+ "Search": "Search"
+ },
+ "Search": {
+ "No other results found for": "No other results found for",
+ "No results found for": "No results found for",
+ "Want to see it supported on Synapse? Let us know!": "Want to see it supported on Synapse? Let us know!",
+ "Find": "Find"
+ },
+ "Settings": {
+ "Settings": "Settings",
+ "Close": "Close",
+ "Options": "Options",
+ "Show withdrawal address": "Show withdrawal address",
+ "Allows bridging to another address": "Allows bridging to another address."
+ },
+ "Swap": {
+ "Swap": "Swap",
+ "Exchange assets on chain": "Exchange assets on chain.",
+ "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}": "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}",
+ "available": "available",
+ "Expected price on": "Expected price on",
+ "Slippage": "Slippage",
+ "Swap paused": "Swap paused",
+ "Please select Origin network": "Please select Origin network",
+ "Swaps are not available on this network": "Swaps are not available on this network",
+ "Please select token": "Please select token",
+ "Connect Wallet to Swap": "Connect Wallet to Swap",
+ "Insufficient balance": "Insufficient balance",
+ "Switch to": "Switch to",
+ "Switching chains": "Switching chains",
+ "Approve": "Approve",
+ "Approving": "Approving",
+ "Swapping": "Swapping",
+ "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}": "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}",
+ "Initiating swap from {fromSymbol} to {toSymbol} on {chain}": "Initiating swap from {fromSymbol} to {toSymbol} on {chain}",
+ "Swapping {fromSymbol} on {chain} to {toSymbol}": "Swapping {fromSymbol} on {chain} to {toSymbol}"
+ },
+ "Time": {
+ "d": "d",
+ "min": "min",
+ "Waiting": "Waiting",
+ "Began": "Began",
+ "Complete": "Complete",
+ "Reverted": "Reverted",
+ "Transaction reverted, funds returned": "Transaction reverted, funds returned",
+ "What's taking so long?": "What's taking so long?",
+ "FAQ": "F.A.Q",
+ "Support": "Support",
+ "minutes": "minutes",
+ "seconds": "seconds",
+ "m remaining": "m remaining",
+ "s remaining": "s remaining",
+ "Clear notification": "Clear notification",
+ "Clear transaction": "Clear transaction",
+ "Contact Support (Discord)": "Contact Support (Discord)"
+ },
+ "Nav": {
+ "Open menu": "Open menu",
+ "Close menu": "Close menu",
+ "Terms of Use": "Terms of Use",
+ "Privacy Policy": "Privacy Policy",
+ "|": "|",
+ "About": "About",
+ "Bridge": "Bridge",
+ "Swap": "Swap",
+ "Pools": "Pools",
+ "Stake": "Stake",
+ "Explorer": "Explorer",
+ "Interchain Network": "Interchain Network",
+ "Solana Bridge": "Solana Bridge",
+ "Careers": "Careers",
+ "Documentation": "Documentation",
+ "GitHub": "GitHub",
+ "Blog": "Blog",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Forum": "Forum",
+ "Telegram": "Telegram",
+ "Functions": "Functions",
+ "Developers": "Developers",
+ "Support": "Support"
+ },
+ "ReturnToMonke": {
+ "Choose Synapse": "Choose Synapse",
+ "Generate Synaptic Profile Picture": "Generate Synaptic Profile Picture",
+ "Drag and drop image here": "Drag and drop image here",
+ "Select different image?": "Select different image?",
+ "Download": "Download",
+ "Click to Upload or": "Click to Upload or"
+ },
+ "Wallet": {
+ "Connect": "Connect",
+ "Connected": "Connected",
+ "Connected to": "Connected to",
+ "Connecting": "Connecting",
+ "Switch Network": "Switch Network",
+ "Connect Wallet": "Connect Wallet",
+ "Wrong Network": "Wrong Network",
+ "No bridgeable assets found for {address} on {chainName}": "No bridgeable assets found for {address} on {chainName}",
+ "Don't see a chain or token you want to bridge?": "Don't see a chain or token you want to bridge?",
+ "Let us know on": "Let us know on",
+ "or": "or",
+ "Connected to an unsupported network; Please switch networks": "Connected to an unsupported network. Please switch networks.",
+ "Discord": "Discord",
+ "Twitter": "Twitter"
+ },
+ "Warning": {
+ "Warning! The Harmony bridge has been exploited": "Warning! The Harmony bridge has been exploited.",
+ "Do not bridge via Harmony unless you understand the risks involved": "Do not bridge via Harmony unless you understand the risks involved.",
+ "Warning! The Fantom bridge has been exploited": "Warning! The Fantom bridge has been exploited.",
+ "Do not bridge via Fantom unless you understand the risks involved": "Do not bridge via Fantom unless you understand the risks involved.",
+ "Alert: Transactions to Dogechain are temporarily paused": "Alert: Transactions to Dogechain are temporarily paused.",
+ "You may still bridge funds from Dogechain to any supported destination chain": "You may still bridge funds from Dogechain to any supported destination chain."
+ }
+}
diff --git a/packages/synapse-interface/messages/es.json b/packages/synapse-interface/messages/es.json
new file mode 100644
index 0000000000..dee3724b09
--- /dev/null
+++ b/packages/synapse-interface/messages/es.json
@@ -0,0 +1,378 @@
+{
+ "Activity": {
+ "Activity": "Actividad",
+ "Your pending and recent transactions will appear here": "Tus transacciones pendientes y recientes aparecerán aquí.",
+ "Loading activity": "Cargando actividad",
+ "No transactions in last 30 days": "No hay transacciones en los últimos 30 días.",
+ "Recent": "Reciente",
+ "Explorer": "Explorador",
+ "remaining": "restante",
+ "Select": "Seleccionar",
+ "Selected": "Seleccionado"
+ },
+ "Bridge": {
+ "Bridge": "Puente",
+ "Send your assets across chains": "Envía tus activos entre cadenas.",
+ "Bridge paused": "Puente en pausa",
+ "Please select Origin Network": "Por favor, selecciona la Red de Origen",
+ "Please select Destination network": "Por favor, selecciona la red de Destino",
+ "Please select an Origin token": "Por favor, selecciona un token de Origen",
+ "Bridge {symbol}": "Puente {symbol}",
+ "Connect Wallet to Bridge": "Conecta la Wallet para usar el Puente",
+ "Amount must be greater than fee": "La cantidad debe ser mayor que la comisión",
+ "Error in bridge quote": "Error en la cotización del puente",
+ "Invalid bridge quote": "Cotización del puente inválida",
+ "Insufficient balance": "Saldo insuficiente",
+ "Invalid Destination address": "Dirección de Destino inválida",
+ "Confirm destination address": "Confirma la dirección de destino",
+ "Switch to {chainName}": "Cambiar a {chainName}",
+ "Switching chains": "Cambiando cadenas",
+ "Approve {symbol}": "Aprobar {symbol}",
+ "Approving": "Aprobando",
+ "Bridging": "Realizando puente",
+ "Max": "Máx",
+ "available": "disponible",
+ "Available": "Disponible",
+ "calculating gas": "calculando gas",
+ "New": "Nuevo",
+ "Gas token": "Token de gas",
+ "Not bridgeable": "No se puede hacer puente",
+ "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}": "Se inició con éxito el puente de {fromToken} en {originChainName} a {toToken} en {destinationChainName}",
+ "Slippage": "Deslizamiento",
+ "Router": "Enrutador",
+ "Powered by Synapse": "Impulsado por Synapse",
+ "Will also receive": "También recibirá",
+ "From": "Desde",
+ "FromWithEllipsis": "Desde…",
+ "ToWithEllipsis": "Hacia…",
+ "To": "Hacia",
+ "In": "Entrada",
+ "Out": "Salida",
+ "Network": "Red",
+ "Select origin token": "Seleccionar token de origen",
+ "All chains": "Todas las cadenas",
+ "SendWithEllipsis": "Enviar…",
+ "All sendable tokens": "Todos los tokens enviables",
+ "All other tokens": "Todos los demás tokens",
+ "ReceiveWithEllipsis": "Recibir…",
+ "All receivable tokens": "Todos los tokens recibibles",
+ "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "Ruta encontrada para el puente de {debouncedFromValue} {fromToken} en {fromChainId} a {toToken} en {toChainId}",
+ "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "No se encontró ruta para el puente de {debouncedFromValue} {fromToken} en {fromChainId} a {toToken} en {toChainId}"
+ },
+ "Completed": {
+ "to": "a",
+ "Today": "Hoy",
+ "Completed": "Completado"
+ },
+ "Destination": {
+ "WarningMessage1": "Requerido:",
+ "WarningMessage2": "Verifica tu dirección de destino para continuar.",
+ "WarningMessage3": "No",
+ "WarningMessage4": "envíes activos a una dirección de custodia o de intercambio. Podría ser imposible recuperar tus fondos."
+ },
+ "FauxBridge": {
+ "▼": "▼",
+ "Supported wallets": "Wallets compatibles",
+ "40,668 ETH": "40,668 ETH",
+ "Fantom": "Fantom",
+ "Ethereum": "Ethereum",
+ "Jan 29, 2022 - #1": "29 de enero de 2022 - #1",
+ "Max": "Máx",
+ "Enter Bridge": "Entrar al Puente",
+ "Bridge": "Puente"
+ },
+ "Landing": {
+ "BridgeSection": {
+ "Powering": "Impulsando el puente más popular",
+ "Synapse Bridge": "Puente Synapse",
+ "Built on top of": "está construido sobre la infraestructura de cadena cruzada que permite a los usuarios transferir activos sin problemas a través de todas las cadenas de bloques. El Puente se ha convertido en el método más utilizado para mover activos entre cadenas, ofreciendo un puente de bajo costo, rápido y seguro.",
+ "Deep Liquidity": "Liquidez Profunda",
+ "Swap native assets": "Intercambia activos nativos usando nuestras piscinas de liquidez AMM de cadena cruzada",
+ "Wide Support": "Amplio Soporte",
+ "Access": "Accede a más de 16 cadenas de bloques EVM y no EVM diferentes con más integraciones próximamente",
+ "Developer Friendly": "Amigable para Desarrolladores",
+ "Integrate": "Integra fácilmente el puente de tokens entre cadenas de forma nativa en tu aplicación descentralizada"
+ },
+ "ExplorerSection": {
+ "Battle tested": "Infraestructura probada en batalla",
+ "Synapse has processed": "Synapse ha procesado millones de transacciones y decenas de miles de millones en activos puenteados.",
+ "Go to Explorer": "Ir al Explorador",
+ "Total Value Locked": "Valor Total Bloqueado",
+ "Total Bridge Volume": "Volumen Total del Puente",
+ "Total TX Count": "Recuento Total de TX"
+ },
+ "HeroSection": {
+ "title": "Comunicación entre cadenas asegurada",
+ "description": "Synapse es la red de comunicaciones entre cadenas más utilizada, extensible y segura. Construye aplicaciones verdaderamente entre cadenas usando el Protocolo Synapse.",
+ "buildButton": "Construir en Synapse",
+ "enterBridgeButton": "Entrar al Puente"
+ },
+ "HowItWorksSection": {
+ "How it all works": "Cómo funciona todo",
+ "description": "Los contratos inteligentes de una cadena utilizan el Router de Mensajería de Synapse para enviar el mensaje a la cadena de destino, donde un Router de Mensajería correspondiente lo envía al contrato de destino. Los mensajes se verifican de manera optimista para garantizar la seguridad y la confianza."
+ },
+ "IntegrationSection": {
+ "Widely integrated": "Ampliamente integrado",
+ "Synapse is": "Synapse está ampliamente integrado en las redes de Capa 1 y Capa 2 más utilizadas para una experiencia fluida entre cadenas.",
+ "Layer": "Capa"
+ },
+ "ResourcesSection": {
+ "Get started now": "Comienza ahora",
+ "Find the resources": "Encuentra los recursos que necesitas para crear integraciones con Synapse.",
+ "References": "Referencias",
+ "See references": "Ver referencias",
+ "Documentation": "Documentación",
+ "Read detailed": "Lee un desglose detallado de nuestras APIs y contratos inteligentes",
+ "Read the docs": "Leer la documentación",
+ "Tutorials": "Tutoriales",
+ "Watch tutorials": "Mira tutoriales interactivos para aprender cómo funciona Synapse",
+ "Go to tutorials": "Ir a los tutoriales"
+ },
+ "UseCasesSection": {
+ "title": "Casos de uso",
+ "subtitle": "Aquí tienes una vista previa de lo que puedes hacer usando Synapse.",
+ "useCases": [
+ {
+ "title": "Intercambio entre cadenas",
+ "description": "Intercambia cualquier activo en cualquier cadena de bloques usando los intercambios de tokens de Synapse"
+ },
+ {
+ "title": "Mercados monetarios universales",
+ "description": "Pide prestado y presta activos en cualquier cadena de bloques usando las piscinas de Synapse"
+ },
+ {
+ "title": "Juegos multi-cadena",
+ "description": "Crea experiencias de juego únicas que accedan a múltiples cadenas de bloques"
+ }
+ ]
+ },
+ "SecuritySection": {
+ "title": "Conecta de forma segura todas las cadenas de bloques",
+ "description": {
+ "part1": "Synapse está compuesto por un",
+ "strong1": "marco de mensajería entre cadenas",
+ "part2": "y un",
+ "strong2": "método económicamente seguro",
+ "part3": "para alcanzar consenso sobre la validez de las transacciones entre cadenas, permitiendo a los desarrolladores construir aplicaciones verdaderamente nativas entre cadenas."
+ },
+ "extensibleHeader": "Extensible",
+ "extensibleDescription": "Los contratos de mensajería entre cadenas de Synapse se pueden implementar en cualquier cadena de bloques",
+ "secureHeader": "Seguro",
+ "secureDescription": "Synapse emplea un modelo de seguridad Optimista para garantizar la integridad de los mensajes entre cadenas",
+ "generalizedHeader": "Generalizado",
+ "generalizedDescription": "Se pueden enviar datos arbitrarios entre cadenas, incluyendo llamadas a contratos, NFTs, instantáneas y más"
+ }
+ },
+ "LanguageSelector": {
+ "Language": "Idioma"
+ },
+ "Pools": {
+ "Actions": "Acciones",
+ "Approve": "Aprobar",
+ "Back to Pool": "Volver a la Piscina",
+ "Back to Pools": "Volver a las Piscinas",
+ "Switch to": "Cambiar a",
+ "to interact with the": "para interactuar con la",
+ "pool": "piscina",
+ "Invalid Pool ID": "ID de Piscina Inválido",
+ "Deposit": "Depositar",
+ "Withdraw": "Retirar",
+ "Stake": "Depositar",
+ "Staked": "Depositado",
+ "Staking": "Depositando",
+ "Unstake": "Retirar",
+ "Unstaked": "Retirado",
+ "Unstaking": "Retirando",
+ "Insufficient balance": "Saldo insuficiente",
+ "Earned": "Ganado",
+ "Claim": "Reclamar",
+ "Claiming": "Reclamando",
+ "Approving": "Aprobando",
+ "You will receive": "Recibirás",
+ "Withdraw Percentage": "Porcentaje de Retiro",
+ "Add Liquidity": "Añadir Liquidez",
+ "Remove Liquidity": "Eliminar Liquidez",
+ "Rewards": "Recompensas",
+ "base": "base",
+ "reward": "recompensa",
+ "Daily APR": "APR Diario",
+ "Weekly APR": "APR Semanal",
+ "Yearly APR": "APR Anual",
+ "Yearly APY": "APY Anual",
+ "Stake your LP Tokens": "Apuesta tus Tokens LP",
+ "Incentivized Pools": "Piscinas Incentivadas",
+ "Contributors are rewarded": "Los contribuyentes son recompensados por equilibrar las piscinas de activos.",
+ "Unincentivized Pools": "Piscinas No Incentivadas",
+ "Pools without contributor rewards": "Piscinas sin recompensas para contribuyentes.",
+ "Migrated Pools": "Piscinas Migradas",
+ "Pools migrated to new reward contracts": "Piscinas migradas a nuevos contratos de recompensa.",
+ "Withdrawal completed": "Retiro completado",
+ "Claim completed": "Reclamo completado",
+ "Completed withdrawal": "Retiro completado",
+ "Successfully approved on": "Aprobado con éxito en",
+ "Stake completed": "Apuesta completada",
+ "Liquidity added": "Liquidez añadida",
+ "Your balances": "Tus saldos",
+ "DepositButton": {
+ "insufficientBalance": "Saldo Insuficiente",
+ "connectWallet": "Conectar Wallet para el Puente",
+ "switchChain": "Cambiar a {chainName}",
+ "switchingChains": "Cambiando cadenas",
+ "approveTokens": "Aprobar Token(s)",
+ "approving": "Aprobando",
+ "deposit": "Depositar",
+ "depositing": "Depositando"
+ },
+ "WithdrawButton": {
+ "insufficientBalance": "Saldo Insuficiente",
+ "connectWallet": "Conectar Wallet para el Puente",
+ "switchChain": "Cambiar a {chainName}",
+ "switchingChains": "Cambiando cadenas",
+ "approveToken": "Aprobar Token",
+ "approving": "Aprobando",
+ "withdraw": "Retirar",
+ "withdrawing": "Retirando..."
+ },
+ "Other": {
+ "Bonus": "Bono",
+ "Price impact": "Impacto en el precio",
+ "Currency Reserves": "Reservas de Moneda",
+ "Pool Info": "Información de la Piscina ",
+ "Trading Fee": "Comisión de Negociación",
+ "Virtual Price": "Precio Virtual",
+ "Total Liquidity": "Liquidez Total",
+ "Total Liquidity USD": "Liquidez Total en USD",
+ "Requesting approval": "Solicitando aprobación",
+ "Starting your deposit": "Iniciando tu depósito...",
+ "Starting your claim": "Iniciando tu reclamo..."
+ }
+ },
+ "Portfolio": {
+ "Portfolio": "Portafolio",
+ "Loading assets": "Cargando activos",
+ "Synapse is the most widely used, extensible, and secure cross-chain communications network": "Synapse es la red de comunicaciones entre cadenas más utilizada, extensible y segura.",
+ "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction": "Obtén cotizaciones de rutas en el panel del Puente y conecta tu Wallet cuando estés listo para enviar una transacción.",
+ "Gas token": "Token de gasolina",
+ "Available": "Disponible",
+ "This chain is not yet supported; New chain or token support can be discussed on": "Esta cadena aún no es compatible. El soporte para nuevas cadenas o tokens se puede discutir en",
+ "or": "o",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Viewing": "Viendo",
+ "Tokens, chains": "Tokens, cadenas",
+ "Bridge txs": "Transacciones del puente",
+ "Search": "Buscar"
+ },
+ "Search": {
+ "No other results found for": "No se encontraron otros resultados para",
+ "No results found for": "No se encontraron resultados para",
+ "Want to see it supported on Synapse? Let us know!": "¿Quieres verlo compatible en Synapse? ¡Háznos saber!",
+ "Find": "Encontrar"
+ },
+ "Settings": {
+ "Settings": "Configuración",
+ "Close": "Cerrar",
+ "Options": "Opciones",
+ "Show withdrawal address": "Mostrar dirección de retiro",
+ "Allows bridging to another address": "Permite el puente a otra dirección."
+ },
+ "Swap": {
+ "Swap": "Intercambiar",
+ "Exchange assets on chain": "Intercambiar activos en la cadena.",
+ "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}": "Intercambio exitoso de {swapFromToken} a {swapToToken} en {currentChainName}",
+ "available": "disponible",
+ "Expected price on": "Precio esperado en",
+ "Slippage": "Deslizamiento",
+ "Swap paused": "Intercambio en pausa",
+ "Please select Origin network": "Por favor, selecciona la red de Origen",
+ "Swaps are not available on this network": "Los intercambios no están disponibles en esta red",
+ "Please select token": "Por favor, selecciona un token",
+ "Connect Wallet to Swap": "Conecta la Wallet para Intercambiar",
+ "Insufficient balance": "Saldo insuficiente",
+ "Switch to": "Cambiar a",
+ "Switching chains": "Cambiando cadenas",
+ "Approve": "Aprobar",
+ "Approving": "Aprobando",
+ "Swapping": "Intercambiando",
+ "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}": "Ruta encontrada para intercambiar {value} {fromSymbol} en {chain} a {toSymbol}",
+ "Initiating swap from {fromSymbol} to {toSymbol} on {chain}": "Iniciando intercambio de {fromSymbol} a {toSymbol} en {chain}",
+ "Swapping {fromSymbol} on {chain} to {toSymbol}": "Intercambiando {fromSymbol} en {chain} a {toSymbol}"
+ },
+ "Time": {
+ "d": "d",
+ "min": "min",
+ "Waiting": "Esperando",
+ "Began": "Comenzó",
+ "Complete": "Completo",
+ "Reverted": "Revertido",
+ "Transaction reverted, funds returned": "Transacción revertida, fondos devueltos",
+ "What's taking so long?": "¿Por qué está tardando tanto?",
+ "FAQ": "Preguntas frecuentes",
+ "Support": "Soporte",
+ "minutes": "minutos",
+ "seconds": "segundos",
+ "m remaining": "m restantes",
+ "s remaining": "s restantes",
+ "Clear notification": "Borrar notificación",
+ "Clear transaction": "Borrar transacciones",
+ "Contact Support (Discord)": "Contactar Soporte (Discord)"
+ },
+ "Nav": {
+ "Open menu": "Abrir menú",
+ "Close menu": "Cerrar menú",
+ "Terms of Use": "Términos de Uso",
+ "Privacy Policy": "Política de Privacidad",
+ "|": "|",
+ "About": "Acerca de",
+ "Bridge": "Puente",
+ "Swap": "Intercambiar",
+ "Pools": "Piscinas",
+ "Stake": "Apostar",
+ "Explorer": "Explorador",
+ "Interchain Network": "Red Intercadenas",
+ "Solana Bridge": "Puente Solana",
+ "Careers": "Carreras",
+ "Documentation": "Documentación",
+ "GitHub": "GitHub",
+ "Blog": "Blog",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Forum": "Foro",
+ "Telegram": "Telegram",
+ "Functions": "Funciones",
+ "Developers": "Desarrolladores",
+ "Support": "Soporte"
+ },
+ "ReturnToMonke": {
+ "Choose Synapse": "Elige Synapse",
+ "Generate Synaptic Profile Picture": "Generar Imagen de Perfil Sináptica",
+ "Drag and drop image here": "Arrastra y suelta la imagen aquí",
+ "Select different image?": "¿Seleccionar una imagen diferente?",
+ "Download": "Descargar",
+ "Click to Upload or": "Haz clic para Subir o"
+ },
+ "Wallet": {
+ "Connect": "Conectar",
+ "Connected": "Conectado",
+ "Connected to": "Conectado a",
+ "Connecting": "Conectando",
+ "Switch Network": "Cambiar Red",
+ "Connect Wallet": "Conectar Wallet",
+ "Wrong Network": "Red Incorrecta",
+ "No bridgeable assets found for {address} on {chainName}": "No se encontraron activos puenteables para {address} en {chainName}",
+ "Don't see a chain or token you want to bridge?": "¿No ves una cadena o token que quieras puentear?",
+ "Let us know on": "Háznos saber en",
+ "or": "o",
+ "Connected to an unsupported network; Please switch networks": "Conectado a una red no compatible. Por favor, cambia de red.",
+ "Discord": "Discord",
+ "Twitter": "Twitter"
+ },
+ "Warning": {
+ "Warning! The Harmony bridge has been exploited": "¡Advertencia! El puente de Harmony ha sido comprometido.",
+ "Do not bridge via Harmony unless you understand the risks involved": "No uses el puente a través de Harmony a menos que entiendas los riesgos involucrados.",
+ "Warning! The Fantom bridge has been exploited": "¡Advertencia! El puente de Fantom ha sido comprometido.",
+ "Do not bridge via Fantom unless you understand the risks involved": "No uses el puente a través de Fantom a menos que entiendas los riesgos involucrados.",
+ "Alert: Transactions to Dogechain are temporarily paused": "Alerta: Las transacciones a Dogechain están temporalmente en pausa.",
+ "You may still bridge funds from Dogechain to any supported destination chain": "Aún puedes puentear fondos desde Dogechain a cualquier cadena de destino compatible."
+ }
+}
diff --git a/packages/synapse-interface/messages/fr.json b/packages/synapse-interface/messages/fr.json
new file mode 100644
index 0000000000..2541e4c68f
--- /dev/null
+++ b/packages/synapse-interface/messages/fr.json
@@ -0,0 +1,378 @@
+{
+ "Activity": {
+ "Activity": "Activité",
+ "Your pending and recent transactions will appear here": "Vos transactions en attente et récentes apparaîtront ici.",
+ "Loading activity": "Chargement de l'activité",
+ "No transactions in last 30 days": "Aucune transaction au cours des 30 derniers jours.",
+ "Recent": "Récent",
+ "Explorer": "Explorateur",
+ "remaining": "restant",
+ "Select": "Sélectionner",
+ "Selected": "Sélectionné"
+ },
+ "Bridge": {
+ "Bridge": "Bridge",
+ "Send your assets across chains": "Envoyez vos actifs à travers les chaînes.",
+ "Bridge paused": "Bridge en pause",
+ "Please select Origin Network": "Veuillez sélectionner le réseau d'origine",
+ "Please select Destination network": "Veuillez sélectionner le réseau de destination",
+ "Please select an Origin token": "Veuillez sélectionner un jeton d'origine",
+ "Bridge {symbol}": "Bridge {symbol}",
+ "Connect Wallet to Bridge": "Connecter le portefeuille au bridge",
+ "Amount must be greater than fee": "Le montant doit être supérieur aux frais",
+ "Error in bridge quote": "Erreur dans la citation du bridge",
+ "Invalid bridge quote": "Citation de bridge invalide",
+ "Insufficient balance": "Solde insuffisant",
+ "Invalid Destination address": "Adresse de destination invalide",
+ "Confirm destination address": "Confirmer l'adresse de destination",
+ "Switch to {chainName}": "Passer à {chainName}",
+ "Switching chains": "Changement de chaînes",
+ "Approve {symbol}": "Approuver {symbol}",
+ "Approving": "Approbation en cours",
+ "Bridging": "Transfert en cours",
+ "Max": "Max",
+ "available": "disponible",
+ "Available": "Disponible",
+ "calculating gas": "calcul du gaz",
+ "New": "Nouveau",
+ "Gas token": "Jeton de gaz",
+ "Not bridgeable": "Non transférable",
+ "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}": "Transfert initié avec succès de {fromToken} sur {originChainName} vers {toToken} sur {destinationChainName}",
+ "Slippage": "Glissement",
+ "Router": "Routeur",
+ "Powered by Synapse": "Propulsé par Synapse",
+ "Will also receive": "Recevra également",
+ "From": "De",
+ "FromWithEllipsis": "De…",
+ "ToWithEllipsis": "Vers…",
+ "To": "Vers",
+ "In": "Entrée",
+ "Out": "Sortie",
+ "Network": "Réseau",
+ "Select origin token": "Sélectionner le jeton d'origine",
+ "All chains": "Toutes les chaînes",
+ "SendWithEllipsis": "Envoyer…",
+ "All sendable tokens": "Tous les jetons envoyables",
+ "All other tokens": "Tous les autres jetons",
+ "ReceiveWithEllipsis": "Recevoir…",
+ "All receivable tokens": "Tous les jetons recevables",
+ "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "Route trouvée pour le transfert de {debouncedFromValue} {fromToken} sur {fromChainId} vers {toToken} sur {toChainId}",
+ "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "Aucune route trouvée pour le transfert de {debouncedFromValue} {fromToken} sur {fromChainId} vers {toToken} sur {toChainId}"
+ },
+ "Completed": {
+ "to": "vers",
+ "Today": "Aujourd'hui",
+ "Completed": "Terminé"
+ },
+ "Destination": {
+ "WarningMessage1": "Requis :",
+ "WarningMessage2": "Vérifiez votre adresse de destination pour continuer.",
+ "WarningMessage3": "N'envoyez pas",
+ "WarningMessage4": "d'actifs à une adresse de dépôt ou d'échange. Il pourrait être impossible de récupérer vos fonds."
+ },
+ "FauxBridge": {
+ "▼": "▼",
+ "Supported wallets": "Portefeuilles pris en charge",
+ "40,668 ETH": "40 668 ETH",
+ "Fantom": "Fantom",
+ "Ethereum": "Ethereum",
+ "Jan 29, 2022 - #1": "29 jan. 2022 - #1",
+ "Max": "Max",
+ "Enter Bridge": "Entrer dans le bridge",
+ "Bridge": "Bridge"
+ },
+ "Landing": {
+ "BridgeSection": {
+ "Powering": "Alimenter le bridge le plus populaire",
+ "Synapse Bridge": "Bridge Synapse",
+ "Built on top of": "est construit sur l'infrastructure inter-chaînes permettant aux utilisateurs de transférer facilement des actifs à travers toutes les blockchains. Le Bridge est devenu la méthode la plus utilisée pour déplacer des actifs entre les chaînes, offrant un transfert à faible coût, rapide et sécurisé.",
+ "Deep Liquidity": "Liquidité profonde",
+ "Swap native assets": "Échangez des actifs natifs en utilisant nos pools de liquidité AMM inter-chaînes",
+ "Wide Support": "Large support",
+ "Access": "Accédez à plus de 16 blockchains EVM et non-EVM différentes avec plus d'intégrations à venir prochainement",
+ "Developer Friendly": "Convivial pour les développeurs",
+ "Integrate": "Intégrez facilement le transfert de jetons inter-chaînes de manière native dans votre application décentralisée"
+ },
+ "ExplorerSection": {
+ "Battle tested": "Infrastructure éprouvée",
+ "Synapse has processed": "Synapse a traité des millions de transactions et des dizaines de milliards d'actifs transférés.",
+ "Go to Explorer": "Aller à l'explorateur",
+ "Total Value Locked": "Valeur totale verrouillée",
+ "Total Bridge Volume": "Volume total du bridge",
+ "Total TX Count": "Nombre total de transactions"
+ },
+ "HeroSection": {
+ "title": "Communication inter-chaînes sécurisée",
+ "description": "Synapse est le réseau de communications inter-chaînes le plus utilisé, extensible et sécurisé. Construisez des applications véritablement inter-chaînes en utilisant le protocole Synapse.",
+ "buildButton": "Construire sur Synapse",
+ "enterBridgeButton": "Entrer dans le bridge"
+ },
+ "HowItWorksSection": {
+ "How it all works": "Comment tout fonctionne",
+ "description": "Les contrats intelligents d'une chaîne utilisent le routeur de messagerie Synapse pour envoyer le message à la chaîne de destination, où un routeur de messagerie correspondant l'envoie au contrat de destination. Les messages sont vérifiés de manière optimiste pour garantir la sécurité et la non-confiance."
+ },
+ "IntegrationSection": {
+ "Widely integrated": "Largement intégré",
+ "Synapse is": "Synapse est largement intégré à travers les réseaux Layer 1 et Layer 2 les plus utilisés pour une expérience inter-chaînes fluide.",
+ "Layer": "Couche"
+ },
+ "ResourcesSection": {
+ "Get started now": "Commencez maintenant",
+ "Find the resources": "Trouvez les ressources dont vous avez besoin pour créer des intégrations avec Synapse.",
+ "References": "Références",
+ "See references": "Voir les références",
+ "Documentation": "Documentation",
+ "Read detailed": "Lisez une description détaillée de nos API et contrats intelligents",
+ "Read the docs": "Lire la documentation",
+ "Tutorials": "Tutoriels",
+ "Watch tutorials": "Regardez des tutoriels interactifs pour apprendre comment fonctionne Synapse",
+ "Go to tutorials": "Aller aux tutoriels"
+ },
+ "UseCasesSection": {
+ "title": "Cas d'utilisation",
+ "subtitle": "Voici un aperçu de ce que vous pouvez faire en utilisant Synapse.",
+ "useCases": [
+ {
+ "title": "Échange inter-chaînes",
+ "description": "Échangez n'importe quel actif sur n'importe quelle blockchain en utilisant les échanges de jetons Synapse"
+ },
+ {
+ "title": "Marchés monétaires universels",
+ "description": "Empruntez et prêtez des actifs à travers n'importe quelle blockchain en utilisant les pools Synapse"
+ },
+ {
+ "title": "Jeux multi-chaînes",
+ "description": "Créez des expériences de jeu uniques qui accèdent à plusieurs blockchains"
+ }
+ ]
+ },
+ "SecuritySection": {
+ "title": "Connectez en toute sécurité chaque blockchain",
+ "description": {
+ "part1": "Synapse est composé d'un",
+ "strong1": "cadre de messagerie inter-chaînes",
+ "part2": "et d'une",
+ "strong2": "méthode économiquement sûre",
+ "part3": "pour atteindre un consensus sur la validité des transactions inter-chaînes, permettant aux développeurs de construire des applications véritablement natives inter-chaînes."
+ },
+ "extensibleHeader": "Extensible",
+ "extensibleDescription": "Les contrats de messagerie inter-chaînes de Synapse peuvent être déployés sur n'importe quelle blockchain",
+ "secureHeader": "Sécurisé",
+ "secureDescription": "Synapse emploie un modèle de sécurité optimiste pour assurer l'intégrité des messages inter-chaînes",
+ "generalizedHeader": "Généralisé",
+ "generalizedDescription": "Toute donnée arbitraire peut être envoyée à travers les chaînes, y compris les appels de contrat, les NFT, les instantanés, et plus encore"
+ }
+ },
+ "LanguageSelector": {
+ "Language": "Langue"
+ },
+ "Pools": {
+ "Actions": "Actions",
+ "Approve": "Approuver",
+ "Back to Pool": "Retour au pool",
+ "Back to Pools": "Retour aux pools",
+ "Switch to": "Passer à",
+ "to interact with the": "pour interagir avec le",
+ "pool": "pool",
+ "Invalid Pool ID": "ID de pool invalide",
+ "Deposit": "Dépôt",
+ "Withdraw": "Retrait",
+ "Stake": "Staker",
+ "Staked": "Staké",
+ "Staking": "Staking",
+ "Unstake": "Déstaker",
+ "Unstaked": "Déstaké",
+ "Unstaking": "Déstakage",
+ "Insufficient balance": "Solde insuffisant",
+ "Earned": "Gagné",
+ "Claim": "Réclamer",
+ "Claiming": "Réclamation",
+ "Approving": "Approbation",
+ "You will receive": "Vous recevrez",
+ "Withdraw Percentage": "Pourcentage de retrait",
+ "Add Liquidity": "Ajouter de la liquidité",
+ "Remove Liquidity": "Retirer de la liquidité",
+ "Rewards": "Récompenses",
+ "base": "base",
+ "reward": "récompense",
+ "Daily APR": "APR quotidien",
+ "Weekly APR": "APR hebdomadaire",
+ "Yearly APR": "APR annuel",
+ "Yearly APY": "APY annuel",
+ "Stake your LP Tokens": "Stakez vos jetons LP",
+ "Incentivized Pools": "Pools incités",
+ "Contributors are rewarded": "Les contributeurs sont récompensés pour équilibrer les pools d'actifs.",
+ "Unincentivized Pools": "Pools non incités",
+ "Pools without contributor rewards": "Pools sans récompenses pour les contributeurs.",
+ "Migrated Pools": "Pools migrés",
+ "Pools migrated to new reward contracts": "Pools migrés vers de nouveaux contrats de récompense.",
+ "Withdrawal completed": "Retrait terminé",
+ "Claim completed": "Réclamation terminée",
+ "Completed withdrawal": "Retrait terminé",
+ "Successfully approved on": "Approuvé avec succès sur",
+ "Stake completed": "Stake terminé",
+ "Liquidity added": "Liquidité ajoutée",
+ "Your balances": "Vos soldes",
+ "DepositButton": {
+ "insufficientBalance": "Solde insuffisant",
+ "connectWallet": "Connecter le portefeuille pour transférer",
+ "switchChain": "Passer à {chainName}",
+ "switchingChains": "Changement de chaîne en cours",
+ "approveTokens": "Approuver le(s) jeton(s)",
+ "approving": "Approbation en cours",
+ "deposit": "Déposer",
+ "depositing": "Dépôt en cours"
+ },
+ "WithdrawButton": {
+ "insufficientBalance": "Solde insuffisant",
+ "connectWallet": "Connecter le portefeuille pour transférer",
+ "switchChain": "Passer à {chainName}",
+ "switchingChains": "Changement de chaîne en cours",
+ "approveToken": "Approuver le jeton",
+ "approving": "Approbation en cours",
+ "withdraw": "Retirer",
+ "withdrawing": "Retrait en cours..."
+ },
+ "Other": {
+ "Bonus": "Bonus",
+ "Price impact": "Impact du prix",
+ "Currency Reserves": "Réserves monétaires",
+ "Pool Info": "Informations sur le pool",
+ "Trading Fee": "Frais de trading",
+ "Virtual Price": "Prix virtuel",
+ "Total Liquidity": "Liquidité totale",
+ "Total Liquidity USD": "Liquidité totale USD",
+ "Requesting approval": "Demande d'approbation",
+ "Starting your deposit": "Début du dépôt...",
+ "Starting your claim": "Début de la réclamation..."
+ }
+ },
+ "Portfolio": {
+ "Portfolio": "Portefeuille",
+ "Loading assets": "Chargement des actifs",
+ "Synapse is the most widely used, extensible, and secure cross-chain communications network": "Synapse est le réseau de communications inter-chaînes le plus utilisé, extensible et sécurisé.",
+ "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction": "Obtenez des devis de route dans le panneau Bridge et connectez votre portefeuille lorsque vous êtes prêt à soumettre une transaction.",
+ "Gas token": "Jeton de gaz",
+ "Available": "Disponible",
+ "This chain is not yet supported; New chain or token support can be discussed on": "Cette chaîne n'est pas encore prise en charge. Le support de nouvelles chaînes ou jetons peut être discuté sur",
+ "or": "ou",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Viewing": "Affichage",
+ "Tokens, chains": "Jetons, chaînes",
+ "Bridge txs": "Transactions de bridge",
+ "Search": "Rechercher"
+ },
+ "Search": {
+ "No other results found for": "Aucun autre résultat trouvé pour",
+ "No results found for": "Aucun résultat trouvé pour",
+ "Want to see it supported on Synapse? Let us know!": "Vous voulez le voir pris en charge sur Synapse ? Faites-le nous savoir !",
+ "Find": "Trouver"
+ },
+ "Settings": {
+ "Settings": "Paramètres",
+ "Close": "Fermer",
+ "Options": "Options",
+ "Show withdrawal address": "Afficher l'adresse de retrait",
+ "Allows bridging to another address": "Permet le transfert vers une autre adresse."
+ },
+ "Swap": {
+ "Swap": "Échanger",
+ "Exchange assets on chain": "Échanger des actifs sur la chaîne.",
+ "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}": "Échange réussi de {swapFromToken} à {swapToToken} sur {currentChainName}",
+ "available": "disponible",
+ "Expected price on": "Prix attendu sur",
+ "Slippage": "Glissement",
+ "Swap paused": "Échange en pause",
+ "Please select Origin network": "Veuillez sélectionner le réseau d'origine",
+ "Swaps are not available on this network": "Les échanges ne sont pas disponibles sur ce réseau",
+ "Please select token": "Veuillez sélectionner un jeton",
+ "Connect Wallet to Swap": "Connecter le portefeuille pour échanger",
+ "Insufficient balance": "Solde insuffisant",
+ "Switch to": "Passer à",
+ "Switching chains": "Changement de chaînes",
+ "Approve": "Approuver",
+ "Approving": "Approbation en cours",
+ "Swapping": "Échange en cours",
+ "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}": "Route trouvée pour échanger {value} {fromSymbol} sur {chain} vers {toSymbol}",
+ "Initiating swap from {fromSymbol} to {toSymbol} on {chain}": "Initiation de l'échange de {fromSymbol} vers {toSymbol} sur {chain}",
+ "Swapping {fromSymbol} on {chain} to {toSymbol}": "Échange de {fromSymbol} sur {chain} vers {toSymbol}"
+ },
+ "Time": {
+ "d": "j",
+ "min": "min",
+ "Waiting": "En attente",
+ "Began": "Commencé",
+ "Complete": "Terminé",
+ "Reverted": "Annulé",
+ "Transaction reverted, funds returned": "Transaction annulée, fonds retournés",
+ "What's taking so long?": "Qu'est-ce qui prend tant de temps ?",
+ "FAQ": "FAQ",
+ "Support": "Support",
+ "minutes": "minutes",
+ "seconds": "secondes",
+ "m remaining": "m restantes",
+ "s remaining": "s restantes",
+ "Clear notification": "Effacer la notification",
+ "Clear transaction": "Effacer la transaction",
+ "Contact Support (Discord)": "Contactez le support (Discord)"
+ },
+ "Nav": {
+ "Open menu": "Ouvrir le menu",
+ "Close menu": "Fermer le menu",
+ "Terms of Use": "Conditions d'utilisation",
+ "Privacy Policy": "Politique de confidentialité",
+ "|": "|",
+ "About": "À propos",
+ "Bridge": "Bridge",
+ "Swap": "Échanger",
+ "Pools": "Pools",
+ "Stake": "Staker",
+ "Explorer": "Explorateur",
+ "Interchain Network": "Réseau Interchain",
+ "Solana Bridge": "Bridge Solana",
+ "Careers": "Carrières",
+ "Documentation": "Documentation",
+ "GitHub": "GitHub",
+ "Blog": "Blog",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Forum": "Forum",
+ "Telegram": "Telegram",
+ "Functions": "Fonctions",
+ "Developers": "Développeurs",
+ "Support": "Support"
+ },
+ "ReturnToMonke": {
+ "Choose Synapse": "Choisir Synapse",
+ "Generate Synaptic Profile Picture": "Générer une photo de profil synaptique",
+ "Drag and drop image here": "Glissez et déposez l'image ici",
+ "Select different image?": "Sélectionner une image différente ?",
+ "Download": "Télécharger",
+ "Click to Upload or": "Cliquez pour télécharger ou"
+ },
+ "Wallet": {
+ "Connect": "Connecter",
+ "Connected": "Connecté",
+ "Connected to": "Connecté à",
+ "Connecting": "Connexion en cours",
+ "Switch Network": "Changer de réseau",
+ "Connect Wallet": "Connecter le portefeuille",
+ "Wrong Network": "Mauvais réseau",
+ "No bridgeable assets found for {address} on {chainName}": "Aucun actif transférable trouvé pour {address} sur {chainName}",
+ "Don't see a chain or token you want to bridge?": "Vous ne voyez pas une chaîne ou un jeton que vous voulez transférer ?",
+ "Let us know on": "Faites-le nous savoir sur",
+ "or": "ou",
+ "Connected to an unsupported network; Please switch networks": "Connecté à un réseau non pris en charge. Veuillez changer de réseau.",
+ "Discord": "Discord",
+ "Twitter": "Twitter"
+ },
+ "Warning": {
+ "Warning! The Harmony bridge has been exploited": "Attention ! Le bridge Harmony a été exploité.",
+ "Do not bridge via Harmony unless you understand the risks involved": "Ne transférez pas via Harmony à moins de comprendre les risques impliqués.",
+ "Warning! The Fantom bridge has been exploited": "Attention ! Le bridge Fantom a été exploité.",
+ "Do not bridge via Fantom unless you understand the risks involved": "Ne transférez pas via Fantom à moins de comprendre les risques impliqués.",
+ "Alert: Transactions to Dogechain are temporarily paused": "Alerte : Les transactions vers Dogechain sont temporairement suspendues.",
+ "You may still bridge funds from Dogechain to any supported destination chain": "Vous pouvez toujours transférer des fonds de Dogechain vers toute chaîne de destination prise en charge."
+ }
+}
diff --git a/packages/synapse-interface/messages/jp.json b/packages/synapse-interface/messages/jp.json
new file mode 100644
index 0000000000..1d23dd39a9
--- /dev/null
+++ b/packages/synapse-interface/messages/jp.json
@@ -0,0 +1,378 @@
+{
+ "Activity": {
+ "Activity": "アクティビティ",
+ "Your pending and recent transactions will appear here": "保留中および最近の取引がここに表示されます。",
+ "Loading activity": "アクティビティを読み込み中",
+ "No transactions in last 30 days": "過去30日間の取引はありません。",
+ "Recent": "最近",
+ "Explorer": "エクスプローラー",
+ "remaining": "残り",
+ "Select": "選択",
+ "Selected": "選択済み"
+ },
+ "Bridge": {
+ "Bridge": "ブリッジ",
+ "Send your assets across chains": "チェーン間でアセットを送信します。",
+ "Bridge paused": "ブリッジ一時停止中",
+ "Please select Origin Network": "オリジンネットワークを選択してください",
+ "Please select Destination network": "宛先ネットワークを選択してください",
+ "Please select an Origin token": "オリジントークンを選択してください",
+ "Bridge {symbol}": "{symbol}をブリッジ",
+ "Connect Wallet to Bridge": "ウォレットを接続してブリッジ",
+ "Amount must be greater than fee": "金額は手数料より大きくなければなりません",
+ "Error in bridge quote": "ブリッジ見積もりでエラーが発生しました",
+ "Invalid bridge quote": "無効なブリッジ見積もり",
+ "Insufficient balance": "残高不足",
+ "Invalid Destination address": "無効な宛先アドレス",
+ "Confirm destination address": "宛先アドレスを確認",
+ "Switch to {chainName}": "{chainName}に切り替え",
+ "Switching chains": "チェーンを切り替え中",
+ "Approve {symbol}": "{symbol}を承認",
+ "Approving": "承認中",
+ "Bridging": "ブリッジ中",
+ "Max": "最大",
+ "available": "利用可能",
+ "Available": "利用可能",
+ "calculating gas": "ガス料金を計算中",
+ "New": "新規",
+ "Gas token": "ガストークン",
+ "Not bridgeable": "ブリッジ不可",
+ "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}": "{originChainName}の{fromToken}から{destinationChainName}の{toToken}へのブリッジを正常に開始しました",
+ "Slippage": "スリッページ",
+ "Router": "ルーター",
+ "Powered by Synapse": "Synapseによって提供",
+ "Will also receive": "また受け取ります",
+ "From": "送信元",
+ "FromWithEllipsis": "送信元…",
+ "ToWithEllipsis": "送信先…",
+ "To": "送信先",
+ "In": "入力",
+ "Out": "出力",
+ "Network": "ネットワーク",
+ "Select origin token": "オリジントークンを選択",
+ "All chains": "すべてのチェーン",
+ "SendWithEllipsis": "送信…",
+ "All sendable tokens": "すべての送信可能トークン",
+ "All other tokens": "その他すべてのトークン",
+ "ReceiveWithEllipsis": "受取…",
+ "All receivable tokens": "すべての受取可能トークン",
+ "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "{fromChainId}の{debouncedFromValue} {fromToken}から{toChainId}の{toToken}へのブリッジのルートが見つかりました",
+ "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "{fromChainId}の{debouncedFromValue} {fromToken}から{toChainId}の{toToken}へのブリッジのルートが見つかりませんでした"
+ },
+ "Completed": {
+ "to": "へ",
+ "Today": "今日",
+ "Completed": "完了"
+ },
+ "Destination": {
+ "WarningMessage1": "必須:",
+ "WarningMessage2": "続行するには宛先アドレスを確認してください。",
+ "WarningMessage3": "絶対に",
+ "WarningMessage4": "カストディアルや取引所のアドレスにアセットを送信しないでください。資金を回収できなくなる可能性があります。"
+ },
+ "FauxBridge": {
+ "▼": "▼",
+ "Supported wallets": "サポートされているウォレット",
+ "40,668 ETH": "40,668 ETH",
+ "Fantom": "Fantom",
+ "Ethereum": "Ethereum",
+ "Jan 29, 2022 - #1": "2022年1月29日 - #1",
+ "Max": "最大",
+ "Enter Bridge": "ブリッジに入る",
+ "Bridge": "ブリッジ"
+ },
+ "Landing": {
+ "BridgeSection": {
+ "Powering": "最も人気のあるブリッジを駆動",
+ "Synapse Bridge": "Synapse ブリッジ",
+ "Built on top of": "はクロスチェーンインフラストラクチャーの上に構築され、ユーザーがすべてのブロックチェーン間でシームレスにアセットを転送できるようにします。このブリッジは、低コスト、高速、安全なブリッジングを提供し、クロスチェーンでアセットを移動する最も広く使用される方法となっています。",
+ "Deep Liquidity": "深い流動性",
+ "Swap native assets": "クロスチェーンAMM流動性プールを使用してネイティブアセットをスワップ",
+ "Wide Support": "幅広いサポート",
+ "Access": "16以上の異なるEVMおよび非EVMブロックチェーンにアクセス可能で、さらに多くの統合が近日登場予定",
+ "Developer Friendly": "開発者フレンドリー",
+ "Integrate": "分散型アプリケーションにクロスチェーントークンブリッジングを簡単に統合"
+ },
+ "ExplorerSection": {
+ "Battle tested": "戦いで試されたインフラストラクチャ",
+ "Synapse has processed": "Synapseは何百万もの取引と何百億ものブリッジされたアセットを処理してきました。",
+ "Go to Explorer": "エクスプローラーに移動",
+ "Total Value Locked": "総ロック値",
+ "Total Bridge Volume": "総ブリッジ量",
+ "Total TX Count": "総取引数"
+ },
+ "HeroSection": {
+ "title": "セキュアなクロスチェーンコミュニケーション",
+ "description": "Synapseは最も広く使用され、拡張可能で、安全なクロスチェーン通信ネットワークです。Synapseプロトコルを使用して真のクロスチェーンアプリケーションを構築しましょう。",
+ "buildButton": "Synapseで構築",
+ "enterBridgeButton": "ブリッジに入る"
+ },
+ "HowItWorksSection": {
+ "How it all works": "すべての仕組み",
+ "description": "あるチェーンのスマートコントラクトがSynapse Messaging Routerを使用してメッセージを宛先チェーンに送信し、対応するMessaging Routerが宛先コントラクトにメッセージを送信します。メッセージは楽観的に検証され、セキュリティと信頼性が確保されます。"
+ },
+ "IntegrationSection": {
+ "Widely integrated": "広く統合されている",
+ "Synapse is": "Synapseは、シームレスなクロスチェーン体験のために、最も使用されているレイヤー1およびレイヤー2ネットワーク全体で広く統合されています。",
+ "Layer": "レイヤー"
+ },
+ "ResourcesSection": {
+ "Get started now": "今すぐ始める",
+ "Find the resources": "Synapseとの統合を作成するために必要なリソースを見つけてください。",
+ "References": "リファレンス",
+ "See references": "リファレンスを見る",
+ "Documentation": "ドキュメンテーション",
+ "Read detailed": "APIとスマートコントラクトの詳細な内訳を読む",
+ "Read the docs": "ドキュメントを読む",
+ "Tutorials": "チュートリアル",
+ "Watch tutorials": "Synapseの仕組みを学ぶためのインタラクティブなチュートリアルを見る",
+ "Go to tutorials": "チュートリアルに行く"
+ },
+ "UseCasesSection": {
+ "title": "ユースケース",
+ "subtitle": "Synapseを使用して何ができるかのプレビューです。",
+ "useCases": [
+ {
+ "title": "クロスチェーン取引所",
+ "description": "Synapseトークンスワップを使用して任意のブロックチェーン上の任意のアセットをスワップ"
+ },
+ {
+ "title": "ユニバーサルマネーマーケット",
+ "description": "Synapseプールを使用して任意のブロックチェーン間で資産を借入・貸出"
+ },
+ {
+ "title": "マルチチェーンゲーミング",
+ "description": "複数のブロックチェーンにアクセスするユニークなゲーミング体験を作成"
+ }
+ ]
+ },
+ "SecuritySection": {
+ "title": "すべてのブロックチェーンを安全に接続",
+ "description": {
+ "part1": "Synapseは",
+ "strong1": "クロスチェーンメッセージングフレームワーク",
+ "part2": "と",
+ "strong2": "経済的に安全な方法",
+ "part3": "からなり、クロスチェーントランザクションの有効性についてコンセンサスに達することができ、開発者が真のネイティブクロスチェーンアプリを構築できるようにします。"
+ },
+ "extensibleHeader": "拡張可能",
+ "extensibleDescription": "Synapseのクロスチェーンメッセージングコントラクトは任意のブロックチェーンにデプロイ可能",
+ "secureHeader": "安全",
+ "secureDescription": "Synapseは楽観的セキュリティモデルを採用し、クロスチェーンメッセージの整合性を確保",
+ "generalizedHeader": "汎用的",
+ "generalizedDescription": "コントラクトコール、NFT、スナップショットなど、任意のデータをチェーン間で送信可能"
+ }
+ },
+ "LanguageSelector": {
+ "Language": "言語"
+ },
+ "Pools": {
+ "Actions": "アクション",
+ "Approve": "承認",
+ "Back to Pool": "プールに戻る",
+ "Back to Pools": "プール一覧に戻る",
+ "Switch to": "切り替える",
+ "to interact with the": "と相互作用するために",
+ "pool": "プール",
+ "Invalid Pool ID": "無効なプールID",
+ "Deposit": "デポジット",
+ "Withdraw": "引き出し",
+ "Stake": "ステーク",
+ "Staked": "ステーク済み",
+ "Staking": "ステーキング中",
+ "Unstake": "アンステーク",
+ "Unstaked": "アンステーク済み",
+ "Unstaking": "アンステーキング中",
+ "Insufficient balance": "残高不足",
+ "Earned": "獲得済み",
+ "Claim": "請求",
+ "Claiming": "請求中",
+ "Approving": "承認中",
+ "You will receive": "受け取る額",
+ "Withdraw Percentage": "引き出し割合",
+ "Add Liquidity": "流動性を追加",
+ "Remove Liquidity": "流動性を削除",
+ "Rewards": "報酬",
+ "base": "ベース",
+ "reward": "報酬",
+ "Daily APR": "日次APR",
+ "Weekly APR": "週次APR",
+ "Yearly APR": "年次APR",
+ "Yearly APY": "年次APY",
+ "Stake your LP Tokens": "LPトークンをステーク",
+ "Incentivized Pools": "インセンティブ付きプール",
+ "Contributors are rewarded": "貢献者はアセットプールのバランスを取ることで報酬を得ます。",
+ "Unincentivized Pools": "インセンティブなしプール",
+ "Pools without contributor rewards": "貢献者報酬のないプール。",
+ "Migrated Pools": "移行済みプール",
+ "Pools migrated to new reward contracts": "新しい報酬コントラクトに移行されたプール。",
+ "Withdrawal completed": "引き出し完了",
+ "Claim completed": "請求完了",
+ "Completed withdrawal": "引き出し完了",
+ "Successfully approved on": "で正常に承認されました",
+ "Stake completed": "ステーク完了",
+ "Liquidity added": "流動性追加完了",
+ "Your balances": "あなたの残高",
+ "DepositButton": {
+ "insufficientBalance": "残高不足",
+ "connectWallet": "ウォレットを接続してブリッジ",
+ "switchChain": "{chainName}に切り替え",
+ "switchingChains": "チェーンを切り替え中",
+ "approveTokens": "トークンを承認",
+ "approving": "承認中",
+ "deposit": "デポジット",
+ "depositing": "デポジット中"
+ },
+ "WithdrawButton": {
+ "insufficientBalance": "残高不足",
+ "connectWallet": "ウォレットを接続してブリッジ",
+ "switchChain": "{chainName}に切り替え",
+ "switchingChains": "チェーンを切り替え中",
+ "approveToken": "トークンを承認",
+ "approving": "承認中",
+ "withdraw": "引き出し",
+ "withdrawing": "引き出し中..."
+ },
+ "Other": {
+ "Bonus": "ボーナス",
+ "Price impact": "価格影響",
+ "Currency Reserves": "通貨準備金",
+ "Pool Info": "プール情報",
+ "Trading Fee": "取引手数料",
+ "Virtual Price": "仮想価格",
+ "Total Liquidity": "総流動性",
+ "Total Liquidity USD": "総流動性(USD)",
+ "Requesting approval": "承認をリクエスト中",
+ "Starting your deposit": "デポジットを開始中...",
+ "Starting your claim": "請求を開始中..."
+ }
+ },
+ "Portfolio": {
+ "Portfolio": "ポートフォリオ",
+ "Loading assets": "アセットを読み込み中",
+ "Synapse is the most widely used, extensible, and secure cross-chain communications network": "Synapseは最も広く使用され、拡張可能で安全なクロスチェーン通信ネットワークです。",
+ "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction": "ブリッジパネルでルート見積もりを取得し、取引を提出する準備ができたらウォレットを接続してください。",
+ "Gas token": "ガストークン",
+ "Available": "利用可能",
+ "This chain is not yet supported; New chain or token support can be discussed on": "このチェーンはまだサポートされていません。新しいチェーンまたはトークンのサポートについては、以下で議論できます:",
+ "or": "または",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Viewing": "表示中",
+ "Tokens, chains": "トークン、チェーン",
+ "Bridge txs": "ブリッジ取引",
+ "Search": "検索"
+ },
+ "Search": {
+ "No other results found for": "他の結果は見つかりませんでした:",
+ "No results found for": "結果が見つかりませんでした:",
+ "Want to see it supported on Synapse? Let us know!": "Synapseでサポートされることを望みますか?お知らせください!",
+ "Find": "検索"
+ },
+ "Settings": {
+ "Settings": "設定",
+ "Close": "閉じる",
+ "Options": "オプション",
+ "Show withdrawal address": "出金アドレスを表示",
+ "Allows bridging to another address": "別のアドレスへのブリッジを許可します。"
+ },
+ "Swap": {
+ "Swap": "スワップ",
+ "Exchange assets on chain": "チェーン上でアセットを交換。",
+ "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}": "{currentChainName}で{swapFromToken}から{swapToToken}へのスワップが成功しました",
+ "available": "利用可能",
+ "Expected price on": "予想価格:",
+ "Slippage": "スリッページ",
+ "Swap paused": "スワップ一時停止中",
+ "Please select Origin network": "オリジンネットワークを選択してください",
+ "Swaps are not available on this network": "このネットワークではスワップは利用できません",
+ "Please select token": "トークンを選択してください",
+ "Connect Wallet to Swap": "ウォレットを接続してスワップ",
+ "Insufficient balance": "残高不足",
+ "Switch to": "切り替える",
+ "Switching chains": "チェーンを切り替え中",
+ "Approve": "承認",
+ "Approving": "承認中",
+ "Swapping": "スワップ中",
+ "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}": "{chain}上の{value} {fromSymbol}から{toSymbol}へのスワップルートが見つかりました",
+ "Initiating swap from {fromSymbol} to {toSymbol} on {chain}": "{chain}上で{fromSymbol}から{toSymbol}へのスワップを開始中",
+ "Swapping {fromSymbol} on {chain} to {toSymbol}": "{chain}上の{fromSymbol}から{toSymbol}へスワップ中"
+ },
+ "Time": {
+ "d": "日",
+ "min": "分",
+ "Waiting": "待機中",
+ "Began": "開始",
+ "Complete": "完了",
+ "Reverted": "取り消し",
+ "Transaction reverted, funds returned": "取引が取り消されました。資金が返還されました",
+ "What's taking so long?": "なぜ時間がかかっているのですか?",
+ "FAQ": "よくある質問",
+ "Support": "サポート",
+ "minutes": "分",
+ "seconds": "秒",
+ "m remaining": "分残り",
+ "s remaining": "秒残り",
+ "Clear notification": "通知をクリア",
+ "Clear transaction": "トランザクションをクリア",
+ "Contact Support (Discord)": "サポートにお問い合わせください (Discord)"
+ },
+ "Nav": {
+ "Open menu": "メニューを開く",
+ "Close menu": "メニューを閉じる",
+ "Terms of Use": "利用規約",
+ "Privacy Policy": "プライバシーポリシー",
+ "|": "|",
+ "About": "概要",
+ "Bridge": "ブリッジ",
+ "Swap": "スワップ",
+ "Pools": "プール",
+ "Stake": "ステーク",
+ "Explorer": "エクスプローラー",
+ "Interchain Network": "インターチェーンネットワーク",
+ "Solana Bridge": "Solanaブリッジ",
+ "Careers": "採用情報",
+ "Documentation": "ドキュメンテーション",
+ "GitHub": "GitHub",
+ "Blog": "ブログ",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Forum": "フォーラム",
+ "Telegram": "Telegram",
+ "Functions": "機能",
+ "Developers": "開発者",
+ "Support": "サポート"
+ },
+ "ReturnToMonke": {
+ "Choose Synapse": "Synapseを選択",
+ "Generate Synaptic Profile Picture": "Synapticプロフィール画像を生成",
+ "Drag and drop image here": "ここに画像をドラッグ&ドロップ",
+ "Select different image?": "別の画像を選択しますか?",
+ "Download": "ダウンロード",
+ "Click to Upload or": "クリックしてアップロードするか"
+ },
+ "Wallet": {
+ "Connect": "接続",
+ "Connected": "接続済み",
+ "Connected to": "接続先:",
+ "Connecting": "接続中",
+ "Switch Network": "ネットワークを切り替え",
+ "Connect Wallet": "ウォレットを接続",
+ "Wrong Network": "ネットワークが間違っています",
+ "No bridgeable assets found for {address} on {chainName}": "{chainName}の{address}でブリッジ可能なアセットが見つかりません",
+ "Don't see a chain or token you want to bridge?": "ブリッジしたいチェーンまたはトークンが表示されていませんか?",
+ "Let us know on": "以下でお知らせください:",
+ "or": "または",
+ "Connected to an unsupported network; Please switch networks": "サポートされていないネットワークに接続されています。ネットワークを切り替えてください。",
+ "Discord": "Discord",
+ "Twitter": "Twitter"
+ },
+ "Warning": {
+ "Warning! The Harmony bridge has been exploited": "警告!Harmonyブリッジが攻撃を受けました。",
+ "Do not bridge via Harmony unless you understand the risks involved": "関連するリスクを理解していない限り、Harmonyを介してブリッジしないでください。",
+ "Warning! The Fantom bridge has been exploited": "警告!Fantomブリッジが攻撃を受けました。",
+ "Do not bridge via Fantom unless you understand the risks involved": "関連するリスクを理解していない限り、Fantomを介してブリッジしないでください。",
+ "Alert: Transactions to Dogechain are temporarily paused": "警告:Dogechainへの取引は一時的に停止しています。",
+ "You may still bridge funds from Dogechain to any supported destination chain": "Dogechainからサポートされている任意の宛先チェーンへの資金のブリッジは引き続き可能です。"
+ }
+}
diff --git a/packages/synapse-interface/messages/tr.json b/packages/synapse-interface/messages/tr.json
new file mode 100644
index 0000000000..34ad00a1f9
--- /dev/null
+++ b/packages/synapse-interface/messages/tr.json
@@ -0,0 +1,378 @@
+{
+ "Activity": {
+ "Activity": "Etkinlik",
+ "Your pending and recent transactions will appear here": "Bekleyen ve son işlemleriniz burada görünecektir.",
+ "Loading activity": "Etkinlik yükleniyor",
+ "No transactions in last 30 days": "Son 30 günde işlem yok.",
+ "Recent": "Son",
+ "Explorer": "Gezgin",
+ "remaining": "kalan",
+ "Select": "Seç",
+ "Selected": "Seçildi"
+ },
+ "Bridge": {
+ "Bridge": "Köprü",
+ "Send your assets across chains": "Varlıklarınızı zincirler arasında gönderin.",
+ "Bridge paused": "Köprü duraklatıldı",
+ "Please select Origin Network": "Lütfen Kaynak Ağı seçin",
+ "Please select Destination network": "Lütfen Hedef ağı seçin",
+ "Please select an Origin token": "Lütfen bir Kaynak token seçin",
+ "Bridge {symbol}": "{symbol} Köprüsü",
+ "Connect Wallet to Bridge": "Köprü için Cüzdanı Bağla",
+ "Amount must be greater than fee": "Miktar ücretten büyük olmalıdır",
+ "Error in bridge quote": "Köprü teklifinde hata",
+ "Invalid bridge quote": "Geçersiz köprü teklifi",
+ "Insufficient balance": "Yetersiz bakiye",
+ "Invalid Destination address": "Geçersiz Hedef adresi",
+ "Confirm destination address": "Hedef adresini onayla",
+ "Switch to {chainName}": "{chainName}'e geç",
+ "Switching chains": "Zincirler değiştiriliyor",
+ "Approve {symbol}": "{symbol}'ı onayla",
+ "Approving": "Onaylanıyor",
+ "Bridging": "Köprüleniyor",
+ "Max": "Maks",
+ "available": "mevcut",
+ "Available": "Mevcut",
+ "calculating gas": "gaz hesaplanıyor",
+ "New": "Yeni",
+ "Gas token": "Gaz tokeni",
+ "Not bridgeable": "Köprülenemez",
+ "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}": "{originChainName}'deki {fromToken}'dan {destinationChainName}'deki {toToken}'a köprü başarıyla başlatıldı",
+ "Slippage": "Kayma",
+ "Router": "Yönlendirici",
+ "Powered by Synapse": "Synapse tarafından desteklenmektedir",
+ "Will also receive": "Ayrıca alacak",
+ "From": "Nereden",
+ "FromWithEllipsis": "Nereden…",
+ "ToWithEllipsis": "Nereye…",
+ "To": "Nereye",
+ "In": "Giriş",
+ "Out": "Çıkış",
+ "Network": "Ağ",
+ "Select origin token": "Kaynak token seç",
+ "All chains": "Tüm zincirler",
+ "SendWithEllipsis": "Gönder…",
+ "All sendable tokens": "Tüm gönderilebilir tokenler",
+ "All other tokens": "Diğer tüm tokenler",
+ "ReceiveWithEllipsis": "Al…",
+ "All receivable tokens": "Tüm alınabilir tokenler",
+ "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "{fromChainId}'deki {debouncedFromValue} {fromToken}'ı {toChainId}'deki {toToken}'a köprüleme için rota bulundu",
+ "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "{fromChainId}'deki {debouncedFromValue} {fromToken}'ı {toChainId}'deki {toToken}'a köprüleme için rota bulunamadı"
+ },
+ "Completed": {
+ "to": "nereye",
+ "Today": "Bugün",
+ "Completed": "Tamamlandı"
+ },
+ "Destination": {
+ "WarningMessage1": "Gerekli:",
+ "WarningMessage2": "Devam etmek için hedef adresinizi doğrulayın.",
+ "WarningMessage3": "Yapma",
+ "WarningMessage4": "varlıkları saklama veya borsa adresine göndermeyin. Fonlarınızı kurtarmak imkansız olabilir."
+ },
+ "FauxBridge": {
+ "▼": "▼",
+ "Supported wallets": "Desteklenen cüzdanlar",
+ "40,668 ETH": "40,668 ETH",
+ "Fantom": "Fantom",
+ "Ethereum": "Ethereum",
+ "Jan 29, 2022 - #1": "29 Ocak 2022 - #1",
+ "Max": "Maks",
+ "Enter Bridge": "Köprüye Gir",
+ "Bridge": "Köprü"
+ },
+ "Landing": {
+ "BridgeSection": {
+ "Powering": "En popüler köprüyü güçlendiriyor",
+ "Synapse Bridge": "Synapse Köprüsü",
+ "Built on top of": ", kullanıcıların varlıkları tüm blok zincirleri arasında sorunsuz bir şekilde transfer etmesini sağlayan çapraz zincir altyapısı üzerine inşa edilmiştir. Köprü, varlıkları çapraz zincirde taşımak için en yaygın kullanılan yöntem haline gelmiş, düşük maliyetli, hızlı ve güvenli köprüleme sunmaktadır.",
+ "Deep Liquidity": "Derin Likidite",
+ "Swap native assets": "Çapraz zincir AMM likidite havuzlarımızı kullanarak yerel varlıkları takas edin",
+ "Wide Support": "Geniş Destek",
+ "Access": "16'dan fazla farklı EVM ve EVM olmayan blok zincirine erişin, yakında daha fazla entegrasyon geliyor",
+ "Developer Friendly": "Geliştirici Dostu",
+ "Integrate": "Çapraz zincir token köprülemeyi merkezi olmayan uygulamanıza kolayca entegre edin"
+ },
+ "ExplorerSection": {
+ "Battle tested": "Savaşta test edilmiş altyapı",
+ "Synapse has processed": "Synapse, milyonlarca işlem ve on milyarlarca köprülenmiş varlık işledi.",
+ "Go to Explorer": "Gezgine Git",
+ "Total Value Locked": "Toplam Kilitli Değer",
+ "Total Bridge Volume": "Toplam Köprü Hacmi",
+ "Total TX Count": "Toplam İşlem Sayısı"
+ },
+ "HeroSection": {
+ "title": "Güvenli çapraz zincir iletişimi",
+ "description": "Synapse, en yaygın kullanılan, genişletilebilir, güvenli çapraz zincir iletişim ağıdır. Synapse Protokolü'nü kullanarak gerçek çapraz zincir uygulamaları oluşturun.",
+ "buildButton": "Synapse'te Oluştur",
+ "enterBridgeButton": "Köprüye Gir"
+ },
+ "HowItWorksSection": {
+ "How it all works": "Nasıl çalışır",
+ "description": "Bir zincirdeki akıllı sözleşmeler, mesajı hedef zincire göndermek için Synapse Mesajlaşma Yönlendiricisi'ni kullanır, burada karşılık gelen bir Mesajlaşma Yönlendiricisi mesajı hedef sözleşmeye gönderir. Mesajlar, güvenliği ve güvensizliği sağlamak için iyimser bir şekilde doğrulanır."
+ },
+ "IntegrationSection": {
+ "Widely integrated": "Geniş entegrasyon",
+ "Synapse is": "Synapse, sorunsuz bir çapraz zincir deneyimi için en çok kullanılan Katman 1 ve Katman 2 ağlarında geniş çapta entegre edilmiştir.",
+ "Layer": "Katman"
+ },
+ "ResourcesSection": {
+ "Get started now": "Şimdi başlayın",
+ "Find the resources": "Synapse ile entegrasyonlar oluşturmak için ihtiyacınız olan kaynakları bulun.",
+ "References": "Referanslar",
+ "See references": "Referansları gör",
+ "Documentation": "Dokümantasyon",
+ "Read detailed": "API'lerimizin ve akıllı sözleşmelerimizin ayrıntılı bir dökümünü okuyun",
+ "Read the docs": "Dokümanları oku",
+ "Tutorials": "Öğreticiler",
+ "Watch tutorials": "Synapse'in nasıl çalıştığını öğrenmek için interaktif öğreticileri izleyin",
+ "Go to tutorials": "Öğreticilere git"
+ },
+ "UseCasesSection": {
+ "title": "Kullanım durumları",
+ "subtitle": "İşte Synapse'i kullanarak yapabileceğiniz şeylerin bir önizlemesi.",
+ "useCases": [
+ {
+ "title": "Çapraz zincir borsası",
+ "description": "Synapse token takaslarını kullanarak herhangi bir blok zincirinde herhangi bir varlığı takas edin"
+ },
+ {
+ "title": "Evrensel para piyasaları",
+ "description": "Synapse havuzlarını kullanarak herhangi bir blok zincirinde varlık ödünç alın ve verin"
+ },
+ {
+ "title": "Çoklu zincir oyunları",
+ "description": "Birden fazla blok zincirine erişen benzersiz oyun deneyimleri oluşturun"
+ }
+ ]
+ },
+ "SecuritySection": {
+ "title": "Her blok zincirini güvenle bağlayın",
+ "description": {
+ "part1": "Synapse,",
+ "strong1": "çapraz zincir mesajlaşma çerçevesi",
+ "part2": "ve",
+ "strong2": "ekonomik olarak güvenli bir yöntem",
+ "part3": "ile çapraz zincir işlemlerinin geçerliliği konusunda fikir birliğine varmak için oluşur, geliştiricilerin gerçekten yerel çapraz zincir uygulamaları oluşturmasına olanak tanır."
+ },
+ "extensibleHeader": "Genişletilebilir",
+ "extensibleDescription": "Synapse'in çapraz zincir mesajlaşma sözleşmeleri herhangi bir blok zincirine dağıtılabilir",
+ "secureHeader": "Güvenli",
+ "secureDescription": "Synapse, çapraz zincir mesajlarının bütünlüğünü sağlamak için İyimser bir güvenlik modeli kullanır",
+ "generalizedHeader": "Genelleştirilmiş",
+ "generalizedDescription": "Sözleşme çağrıları, NFT'ler, anlık görüntüler ve daha fazlası dahil olmak üzere herhangi bir keyfi veri zincirler arasında gönderilebilir"
+ }
+ },
+ "LanguageSelector": {
+ "Language": "Dil"
+ },
+ "Pools": {
+ "Actions": "İşlemler",
+ "Approve": "Onayla",
+ "Back to Pool": "Havuza Geri Dön",
+ "Back to Pools": "Havuzlara Geri Dön",
+ "Switch to": "Geç",
+ "to interact with the": "ile etkileşim kurmak için",
+ "pool": "havuz",
+ "Invalid Pool ID": "Geçersiz Havuz Kimliği",
+ "Deposit": "Yatır",
+ "Withdraw": "Çek",
+ "Stake": "Stake Et",
+ "Staked": "Stake Edildi",
+ "Staking": "Stake Ediliyor",
+ "Unstake": "Stake'ten Çık",
+ "Unstaked": "Stake'ten Çıkıldı",
+ "Unstaking": "Stake'ten Çıkılıyor",
+ "Insufficient balance": "Yetersiz bakiye",
+ "Earned": "Kazanılan",
+ "Claim": "Talep Et",
+ "Claiming": "Talep Ediliyor",
+ "Approving": "Onaylanıyor",
+ "You will receive": "Alacağınız",
+ "Withdraw Percentage": "Çekme Yüzdesi",
+ "Add Liquidity": "Likidite Ekle",
+ "Remove Liquidity": "Likidite Kaldır",
+ "Rewards": "Ödüller",
+ "base": "temel",
+ "reward": "ödül",
+ "Daily APR": "Günlük APR",
+ "Weekly APR": "Haftalık APR",
+ "Yearly APR": "Yıllık APR",
+ "Yearly APY": "Yıllık APY",
+ "Stake your LP Tokens": "LP Tokenlerinizi Stake Edin",
+ "Incentivized Pools": "Teşvikli Havuzlar",
+ "Contributors are rewarded": "Katkıda bulunanlar, varlık havuzlarını dengelemek için ödüllendirilir.",
+ "Unincentivized Pools": "Teşviksiz Havuzlar",
+ "Pools without contributor rewards": "Katkıda bulunan ödülleri olmayan havuzlar.",
+ "Migrated Pools": "Taşınan Havuzlar",
+ "Pools migrated to new reward contracts": "Yeni ödül sözleşmelerine taşınan havuzlar.",
+ "Withdrawal completed": "Çekme tamamlandı",
+ "Claim completed": "Talep tamamlandı",
+ "Completed withdrawal": "Çekme tamamlandı",
+ "Successfully approved on": "Başarıyla onaylandı",
+ "Stake completed": "Stake tamamlandı",
+ "Liquidity added": "Likidite eklendi",
+ "Your balances": "Bakiyeleriniz",
+ "DepositButton": {
+ "insufficientBalance": "Yetersiz Bakiye",
+ "connectWallet": "Köprü için Cüzdanı Bağla",
+ "switchChain": "{chainName}'e geç",
+ "switchingChains": "Zincirler değiştiriliyor",
+ "approveTokens": "Token(ler)i Onayla",
+ "approving": "Onaylanıyor",
+ "deposit": "Yatır",
+ "depositing": "Yatırılıyor"
+ },
+ "WithdrawButton": {
+ "insufficientBalance": "Yetersiz Bakiye",
+ "connectWallet": "Köprü için Cüzdanı Bağla",
+ "switchChain": "{chainName}'e geç",
+ "switchingChains": "Zincirler değiştiriliyor",
+ "approveToken": "Token'ı Onayla",
+ "approving": "Onaylanıyor",
+ "withdraw": "Çek",
+ "withdrawing": "Çekiliyor..."
+ },
+ "Other": {
+ "Bonus": "Bonus",
+ "Price impact": "Fiyat etkisi",
+ "Currency Reserves": "Para Birimi Rezervleri",
+ "Pool Info": "Havuz Bilgisi ",
+ "Trading Fee": "İşlem Ücreti",
+ "Virtual Price": "Sanal Fiyat",
+ "Total Liquidity": "Toplam Likidite",
+ "Total Liquidity USD": "Toplam Likidite USD",
+ "Requesting approval": "Onay isteniyor",
+ "Starting your deposit": "Yatırmanız başlatılıyor...",
+ "Starting your claim": "Talebiniz başlatılıyor..."
+ }
+ },
+ "Portfolio": {
+ "Portfolio": "Portföy",
+ "Loading assets": "Varlıklar yükleniyor",
+ "Synapse is the most widely used, extensible, and secure cross-chain communications network": "Synapse, en yaygın kullanılan, genişletilebilir ve güvenli çapraz zincir iletişim ağıdır.",
+ "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction": "Köprü panelinde rota teklifleri alın ve bir işlem göndermeye hazır olduğunuzda cüzdanınızı bağlayın.",
+ "Gas token": "Gaz tokeni",
+ "Available": "Mevcut",
+ "This chain is not yet supported; New chain or token support can be discussed on": "Bu zincir henüz desteklenmiyor; Yeni zincir veya token desteği şurada tartışılabilir:",
+ "or": "veya",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Viewing": "Görüntüleniyor",
+ "Tokens, chains": "Tokenler, zincirler",
+ "Bridge txs": "Köprü işlemleri",
+ "Search": "Ara"
+ },
+ "Search": {
+ "No other results found for": "İçin başka sonuç bulunamadı",
+ "No results found for": "İçin sonuç bulunamadı",
+ "Want to see it supported on Synapse? Let us know!": "Synapse'te desteklenmesini ister misiniz? Bize bildirin!",
+ "Find": "Bul"
+ },
+ "Settings": {
+ "Settings": "Ayarlar",
+ "Close": "Kapat",
+ "Options": "Seçenekler",
+ "Show withdrawal address": "Çekme adresini göster",
+ "Allows bridging to another address": "Başka bir adrese köprülemeye izin verir."
+ },
+ "Swap": {
+ "Swap": "Takas",
+ "Exchange assets on chain": "Zincir üzerinde varlık takası.",
+ "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}": "{currentChainName} üzerinde {swapFromToken}'dan {swapToToken}'a başarıyla takas edildi",
+ "available": "mevcut",
+ "Expected price on": "Beklenen fiyat",
+ "Slippage": "Kayma",
+ "Swap paused": "Takas duraklatıldı",
+ "Please select Origin network": "Lütfen Kaynak ağı seçin",
+ "Swaps are not available on this network": "Bu ağda takaslar mevcut değil",
+ "Please select token": "Lütfen token seçin",
+ "Connect Wallet to Swap": "Takas için Cüzdanı Bağla",
+ "Insufficient balance": "Yetersiz bakiye",
+ "Switch to": "Geç",
+ "Switching chains": "Zincirler değiştiriliyor",
+ "Approve": "Onayla",
+ "Approving": "Onaylanıyor",
+ "Swapping": "Takas ediliyor",
+ "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}": "{chain} üzerinde {value} {fromSymbol}'ı {toSymbol}'a takas etmek için rota bulundu",
+ "Initiating swap from {fromSymbol} to {toSymbol} on {chain}": "{chain} üzerinde {fromSymbol}'dan {toSymbol}'a takas başlatılıyor",
+ "Swapping {fromSymbol} on {chain} to {toSymbol}": "{chain} üzerinde {fromSymbol}'ı {toSymbol}'a takas ediliyor"
+ },
+ "Time": {
+ "d": "g",
+ "min": "dk",
+ "Waiting": "Bekleniyor",
+ "Began": "Başladı",
+ "Complete": "Tamamlandı",
+ "Reverted": "Geri Alındı",
+ "Transaction reverted, funds returned": "İşlem geri alındı, fonlar iade edildi",
+ "What's taking so long?": "Neden bu kadar uzun sürüyor?",
+ "FAQ": "SSS",
+ "Support": "Destek",
+ "minutes": "dakika",
+ "seconds": "saniye",
+ "m remaining": "dk kaldı",
+ "s remaining": "sn kaldı",
+ "Clear notification": "Bildirimi temizle",
+ "Clear transaction": "İşlemleri temizle",
+ "Contact Support (Discord)": "Destek ile İletişime Geç (Discord)"
+ },
+ "Nav": {
+ "Open menu": "Menüyü aç",
+ "Close menu": "Menüyü kapat",
+ "Terms of Use": "Kullanım Koşulları",
+ "Privacy Policy": "Gizlilik Politikası",
+ "|": "|",
+ "About": "Hakkında",
+ "Bridge": "Köprü",
+ "Swap": "Takas",
+ "Pools": "Havuzlar",
+ "Stake": "Stake Et",
+ "Explorer": "Gezgin",
+ "Interchain Network": "Zincirler Arası Ağ",
+ "Solana Bridge": "Solana Köprüsü",
+ "Careers": "Kariyer",
+ "Documentation": "Dokümantasyon",
+ "GitHub": "GitHub",
+ "Blog": "Blog",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Forum": "Forum",
+ "Telegram": "Telegram",
+ "Functions": "Fonksiyonlar",
+ "Developers": "Geliştiriciler",
+ "Support": "Destek"
+ },
+ "ReturnToMonke": {
+ "Choose Synapse": "Synapse'i Seç",
+ "Generate Synaptic Profile Picture": "Sinaptik Profil Resmi Oluştur",
+ "Drag and drop image here": "Resmi buraya sürükleyip bırakın",
+ "Select different image?": "Farklı resim seç?",
+ "Download": "İndir",
+ "Click to Upload or": "Yüklemek için Tıkla veya"
+ },
+ "Wallet": {
+ "Connect": "Bağlan",
+ "Connected": "Bağlandı",
+ "Connected to": "Bağlandı",
+ "Connecting": "Bağlanıyor",
+ "Switch Network": "Ağı Değiştir",
+ "Connect Wallet": "Cüzdanı Bağla",
+ "Wrong Network": "Yanlış Ağ",
+ "No bridgeable assets found for {address} on {chainName}": "{chainName} üzerinde {address} için köprülenebilir varlık bulunamadı",
+ "Don't see a chain or token you want to bridge?": "Köprülemek istediğiniz bir zincir veya token görmüyor musunuz?",
+ "Let us know on": "Bize bildirin",
+ "or": "veya",
+ "Connected to an unsupported network; Please switch networks": "Desteklenmeyen bir ağa bağlandınız; Lütfen ağları değiştirin.",
+ "Discord": "Discord",
+ "Twitter": "Twitter"
+ },
+ "Warning": {
+ "Warning! The Harmony bridge has been exploited": "Uyarı! Harmony köprüsü sömürüldü.",
+ "Do not bridge via Harmony unless you understand the risks involved": "İlgili riskleri anlamadıkça Harmony üzerinden köprüleme yapmayın.",
+ "Warning! The Fantom bridge has been exploited": "Uyarı! Fantom köprüsü sömürüldü.",
+ "Do not bridge via Fantom unless you understand the risks involved": "İlgili riskleri anlamadıkça Fantom üzerinden köprüleme yapmayın.",
+ "Alert: Transactions to Dogechain are temporarily paused": "Uyarı: Dogechain'e işlemler geçici olarak duraklatıldı.",
+ "You may still bridge funds from Dogechain to any supported destination chain": "Hala Dogechain'den desteklenen herhangi bir hedef zincire fon köprüleyebilirsiniz."
+ }
+}
diff --git a/packages/synapse-interface/messages/zh-CN.json b/packages/synapse-interface/messages/zh-CN.json
new file mode 100644
index 0000000000..34a2b7500d
--- /dev/null
+++ b/packages/synapse-interface/messages/zh-CN.json
@@ -0,0 +1,378 @@
+{
+ "Activity": {
+ "Activity": "活动",
+ "Your pending and recent transactions will appear here": "您的待处理和最近交易将显示在此处。",
+ "Loading activity": "加载活动",
+ "No transactions in last 30 days": "过去30天内无交易。",
+ "Recent": "最近",
+ "Explorer": "浏览器",
+ "remaining": "剩余",
+ "Select": "选择",
+ "Selected": "已选择"
+ },
+ "Bridge": {
+ "Bridge": "桥接",
+ "Send your assets across chains": "跨链发送您的资产。",
+ "Bridge paused": "桥接已暂停",
+ "Please select Origin Network": "请选择来源网络",
+ "Please select Destination network": "请选择目标网络",
+ "Please select an Origin token": "请选择来源代币",
+ "Bridge {symbol}": "桥接 {symbol}",
+ "Connect Wallet to Bridge": "连接钱包以桥接",
+ "Amount must be greater than fee": "金额必须大于费用",
+ "Error in bridge quote": "桥接报价错误",
+ "Invalid bridge quote": "无效的桥接报价",
+ "Insufficient balance": "余额不足",
+ "Invalid Destination address": "无效的目标地址",
+ "Confirm destination address": "确认目标地址",
+ "Switch to {chainName}": "切换到 {chainName}",
+ "Switching chains": "切换链",
+ "Approve {symbol}": "批准 {symbol}",
+ "Approving": "批准中",
+ "Bridging": "桥接中",
+ "Max": "最大",
+ "available": "可用",
+ "Available": "可用",
+ "calculating gas": "计算Gas",
+ "New": "新",
+ "Gas token": "Gas代币",
+ "Not bridgeable": "不可桥接",
+ "Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}": "成功发起从 {originChainName} 的 {fromToken} 到 {destinationChainName} 的 {toToken} 的桥接",
+ "Slippage": "滑点",
+ "Router": "路由器",
+ "Powered by Synapse": "由Synapse提供支持",
+ "Will also receive": "将额外收到",
+ "From": "从",
+ "FromWithEllipsis": "从…",
+ "ToWithEllipsis": "到…",
+ "To": "到",
+ "In": "进",
+ "Out": "出",
+ "Network": "网络",
+ "Select origin token": "选择来源代币",
+ "All chains": "所有链",
+ "SendWithEllipsis": "发送…",
+ "All sendable tokens": "所有可发送代币",
+ "All other tokens": "所有其他代币",
+ "ReceiveWithEllipsis": "接收…",
+ "All receivable tokens": "所有可接收代币",
+ "Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "找到桥接路线:从 {fromChainId} 的 {fromToken} 到 {toChainId} 的 {toToken}",
+ "No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}": "未找到桥接路线:从 {fromChainId} 的 {fromToken} 到 {toChainId} 的 {toToken}"
+ },
+ "Completed": {
+ "to": "到",
+ "Today": "今天",
+ "Completed": "已完成"
+ },
+ "Destination": {
+ "WarningMessage1": "要求:",
+ "WarningMessage2": "验证您的目标地址以继续。",
+ "WarningMessage3": "不要",
+ "WarningMessage4": "将资产发送到托管或交易所地址。可能无法恢复您的资金。"
+ },
+ "FauxBridge": {
+ "▼": "▼",
+ "Supported wallets": "支持的钱包",
+ "40,668 ETH": "40,668 ETH",
+ "Fantom": "Fantom",
+ "Ethereum": "以太坊",
+ "Jan 29, 2022 - #1": "2022年1月29日 - #1",
+ "Max": "最大",
+ "Enter Bridge": "进入桥接",
+ "Bridge": "桥接"
+ },
+ "Landing": {
+ "BridgeSection": {
+ "Powering": "驱动最受欢迎的桥接",
+ "Synapse Bridge": "Synapse桥接",
+ "Built on top of": "建立在跨链基础设施之上,允许用户无缝转移资产。Synapse桥接已成为跨链移动资产的最广泛使用方法,提供低成本、快速和安全的桥接。",
+ "Deep Liquidity": "深度流动性",
+ "Swap native assets": "使用跨链AMM流动性池交换原生资产",
+ "Wide Support": "广泛支持",
+ "Access": "访问超过16个EVM和非EVM区块链,更多集成即将到来",
+ "Developer Friendly": "开发者友好",
+ "Integrate": "轻松将跨链代币桥接集成到您的去中心化应用程序中"
+ },
+ "ExplorerSection": {
+ "Battle tested": "经过战斗测试的基础设施",
+ "Synapse has processed": "Synapse已处理数百万笔交易和数十亿美元的桥接资产。",
+ "Go to Explorer": "转到浏览器",
+ "Total Value Locked": "总锁定价值",
+ "Total Bridge Volume": "总桥接量",
+ "Total TX Count": "总交易数量"
+ },
+ "HeroSection": {
+ "title": "安全的跨链通信",
+ "description": "Synapse是最广泛使用、可扩展且安全的跨链通信网络。使用Synapse协议构建真正的跨链应用程序。",
+ "buildButton": "在Synapse上构建",
+ "enterBridgeButton": "进入桥接"
+ },
+ "HowItWorksSection": {
+ "How it all works": "它是如何工作的",
+ "description": "来自一个链的智能合约使用Synapse消息路由器将消息发送到目标链,目标链上的对应消息路由器将其发送到目标合约。消息通过乐观验证以确保安全和信任。"
+ },
+ "IntegrationSection": {
+ "Widely integrated": "广泛集成",
+ "Synapse is": "Synapse已广泛集成到最常用的Layer 1和Layer 2网络中,提供无缝的跨链体验。",
+ "Layer": "层"
+ },
+ "ResourcesSection": {
+ "Get started now": "现在开始",
+ "Find the resources": "查找您需要的资源以与Synapse进行集成。",
+ "References": "参考文献",
+ "See references": "查看参考文献",
+ "Documentation": "文档",
+ "Read detailed": "阅读我们API和智能合约的详细介绍",
+ "Read the docs": "阅读文档",
+ "Tutorials": "教程",
+ "Watch tutorials": "观看互动教程,了解Synapse的工作原理",
+ "Go to tutorials": "前往教程"
+ },
+ "UseCasesSection": {
+ "title": "用例",
+ "subtitle": "这是您使用Synapse可以实现的一些预览。",
+ "useCases": [
+ {
+ "title": "跨链交换",
+ "description": "使用Synapse代币交换在任何区块链上交换任何资产"
+ },
+ {
+ "title": "通用货币市场",
+ "description": "使用Synapse池跨任何区块链借贷资产"
+ },
+ {
+ "title": "多链游戏",
+ "description": "创建可访问多个区块链的独特游戏体验"
+ }
+ ]
+ },
+ "SecuritySection": {
+ "title": "安全连接每个区块链",
+ "description": {
+ "part1": "Synapse由",
+ "strong1": "跨链消息框架",
+ "part2": "和",
+ "strong2": "经济安全的方法",
+ "part3": "组成,以达成跨链交易有效性的共识,使开发者能够构建真正的跨链原生应用程序。"
+ },
+ "extensibleHeader": "可扩展",
+ "extensibleDescription": "Synapse的跨链消息合约可以部署在任何区块链上",
+ "secureHeader": "安全",
+ "secureDescription": "Synapse采用乐观安全模型确保跨链消息的完整性",
+ "generalizedHeader": "通用",
+ "generalizedDescription": "可以跨链发送任何任意数据,包括合约调用、NFT、快照等"
+ }
+ },
+ "LanguageSelector": {
+ "Language": "语言"
+ },
+ "Pools": {
+ "Actions": "操作",
+ "Approve": "批准",
+ "Back to Pool": "返回池",
+ "Back to Pools": "返回池列表",
+ "Switch to": "切换到",
+ "to interact with the": "以与",
+ "pool": "池进行互动",
+ "Invalid Pool ID": "无效的池ID",
+ "Deposit": "存款",
+ "Withdraw": "提现",
+ "Stake": "质押",
+ "Staked": "已质押",
+ "Staking": "质押中",
+ "Unstake": "解除质押",
+ "Unstaked": "已解除质押",
+ "Unstaking": "解除质押中",
+ "Insufficient balance": "余额不足",
+ "Earned": "已赚取",
+ "Claim": "认领",
+ "Claiming": "认领中",
+ "Approving": "批准中",
+ "You will receive": "您将收到",
+ "Withdraw Percentage": "提现百分比",
+ "Add Liquidity": "添加流动性",
+ "Remove Liquidity": "移除流动性",
+ "Rewards": "奖励",
+ "base": "基础",
+ "reward": "奖励",
+ "Daily APR": "每日APR",
+ "Weekly APR": "每周APR",
+ "Yearly APR": "每年APR",
+ "Yearly APY": "每年APY",
+ "Stake your LP Tokens": "质押您的LP代币",
+ "Incentivized Pools": "激励池",
+ "Contributors are rewarded": "贡献者因平衡资产池而获得奖励。",
+ "Unincentivized Pools": "非激励池",
+ "Pools without contributor rewards": "没有贡献者奖励的池。",
+ "Migrated Pools": "迁移的池",
+ "Pools migrated to new reward contracts": "池已迁移到新的奖励合约。",
+ "Withdrawal completed": "提现完成",
+ "Claim completed": "认领完成",
+ "Completed withdrawal": "提现完成",
+ "Successfully approved on": "已成功批准于",
+ "Stake completed": "质押完成",
+ "Liquidity added": "流动性已添加",
+ "Your balances": "您的余额",
+ "DepositButton": {
+ "insufficientBalance": "余额不足",
+ "connectWallet": "连接钱包以桥接",
+ "switchChain": "切换到 {chainName}",
+ "switchingChains": "切换链中",
+ "approveTokens": "批准代币",
+ "approving": "批准中",
+ "deposit": "存款",
+ "depositing": "存款中"
+ },
+ "WithdrawButton": {
+ "insufficientBalance": "余额不足",
+ "connectWallet": "连接钱包以桥接",
+ "switchChain": "切换到 {chainName}",
+ "switchingChains": "切换链中",
+ "approveToken": "批准代币",
+ "approving": "批准中",
+ "withdraw": "提现",
+ "withdrawing": "提现中…"
+ },
+ "Other": {
+ "Bonus": "奖金",
+ "Price impact": "价格影响",
+ "Currency Reserves": "货币储备",
+ "Pool Info": "池信息",
+ "Trading Fee": "交易费用",
+ "Virtual Price": "虚拟价格",
+ "Total Liquidity": "总流动性",
+ "Total Liquidity USD": "总流动性(美元)",
+ "Requesting approval": "请求批准",
+ "Starting your deposit": "开始存款…",
+ "Starting your claim": "开始认领…"
+ }
+ },
+ "Portfolio": {
+ "Portfolio": "投资组合",
+ "Loading assets": "加载资产中",
+ "Synapse is the most widely used, extensible, and secure cross-chain communications network": "Synapse是最广泛使用、可扩展且安全的跨链通信网络。",
+ "Get route quotes in the Bridge panel, and connect your wallet when you are ready to submit a transaction": "在桥接面板中获取路线报价,准备好提交交易时连接您的钱包。",
+ "Gas token": "Gas代币",
+ "Available": "可用",
+ "This chain is not yet supported; New chain or token support can be discussed on": "此链尚未支持;可在",
+ "or": "或",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Viewing": "查看",
+ "Tokens, chains": "代币,链",
+ "Bridge txs": "桥接交易",
+ "Search": "搜索"
+ },
+ "Search": {
+ "No other results found for": "未找到其他结果",
+ "No results found for": "未找到结果",
+ "Want to see it supported on Synapse? Let us know!": "想在Synapse上看到它的支持?告诉我们!",
+ "Find": "查找"
+ },
+ "Settings": {
+ "Settings": "设置",
+ "Close": "关闭",
+ "Options": "选项",
+ "Show withdrawal address": "显示提现地址",
+ "Allows bridging to another address": "允许桥接到另一个地址。"
+ },
+ "Swap": {
+ "Swap": "交换",
+ "Exchange assets on chain": "在链上交换资产。",
+ "Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}": "成功从 {currentChainName} 的 {swapFromToken} 交换为 {swapToToken}",
+ "available": "可用",
+ "Expected price on": "预计价格在",
+ "Slippage": "滑点",
+ "Swap paused": "交换已暂停",
+ "Please select Origin network": "请选择来源网络",
+ "Swaps are not available on this network": "此网络不支持交换",
+ "Please select token": "请选择代币",
+ "Connect Wallet to Swap": "连接钱包以交换",
+ "Insufficient balance": "余额不足",
+ "Switch to": "切换到",
+ "Switching chains": "切换链中",
+ "Approve": "批准",
+ "Approving": "批准中",
+ "Swapping": "交换中",
+ "Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}": "找到从 {chain} 的 {fromSymbol} 交换为 {toSymbol} 的路线:{value}",
+ "Initiating swap from {fromSymbol} to {toSymbol} on {chain}": "发起从 {fromSymbol} 到 {toSymbol} 的交换:{chain}",
+ "Swapping {fromSymbol} on {chain} to {toSymbol}": "正在交换:从 {chain} 的 {fromSymbol} 到 {toSymbol}"
+ },
+ "Time": {
+ "d": "天",
+ "min": "分钟",
+ "Waiting": "等待中",
+ "Began": "已开始",
+ "Complete": "已完成",
+ "Reverted": "已回退",
+ "Transaction reverted, funds returned": "交易已回退,资金已退还",
+ "What's taking so long?": "为什么这么久?",
+ "FAQ": "常见问题",
+ "Support": "支持",
+ "minutes": "分钟",
+ "seconds": "秒",
+ "m remaining": "分钟剩余",
+ "s remaining": "秒剩余",
+ "Clear notification": "清除通知",
+ "Clear transaction": "清除交易",
+ "Contact Support (Discord)": "联系支持(Discord)"
+ },
+ "Nav": {
+ "Open menu": "打开菜单",
+ "Close menu": "关闭菜单",
+ "Terms of Use": "使用条款",
+ "Privacy Policy": "隐私政策",
+ "|": "|",
+ "About": "关于",
+ "Bridge": "桥接",
+ "Swap": "交换",
+ "Pools": "流动性池",
+ "Stake": "质押",
+ "Explorer": "浏览器",
+ "Interchain Network": "跨链网络",
+ "Solana Bridge": "Solana桥接",
+ "Careers": "招聘",
+ "Documentation": "文档",
+ "GitHub": "GitHub",
+ "Blog": "博客",
+ "Discord": "Discord",
+ "Twitter": "Twitter",
+ "Forum": "论坛",
+ "Telegram": "Telegram",
+ "Functions": "功能",
+ "Developers": "开发者",
+ "Support": "支持"
+ },
+ "ReturnToMonke": {
+ "Choose Synapse": "选择Synapse",
+ "Generate Synaptic Profile Picture": "生成Synapse个人资料图片",
+ "Drag and drop image here": "将图片拖放到此处",
+ "Select different image?": "选择不同的图片?",
+ "Download": "下载",
+ "Click to Upload or": "点击上传或"
+ },
+ "Wallet": {
+ "Connect": "连接",
+ "Connected": "已连接",
+ "Connected to": "连接到",
+ "Connecting": "连接中",
+ "Switch Network": "切换网络",
+ "Connect Wallet": "连接钱包",
+ "Wrong Network": "错误的网络",
+ "No bridgeable assets found for {address} on {chainName}": "在 {chainName} 上未找到适合 {address} 的可桥接资产",
+ "Don't see a chain or token you want to bridge?": "没有看到您想要桥接的链或代币?",
+ "Let us know on": "在此告知我们",
+ "or": "或",
+ "Connected to an unsupported network; Please switch networks": "已连接到不支持的网络;请切换网络。",
+ "Discord": "Discord",
+ "Twitter": "Twitter"
+ },
+ "Warning": {
+ "Warning! The Harmony bridge has been exploited": "警告!Harmony桥接已被利用。",
+ "Do not bridge via Harmony unless you understand the risks involved": "除非您了解相关风险,否则不要通过Harmony进行桥接。",
+ "Warning! The Fantom bridge has been exploited": "警告!Fantom桥接已被利用。",
+ "Do not bridge via Fantom unless you understand the risks involved": "除非您了解相关风险,否则不要通过Fantom进行桥接。",
+ "Alert: Transactions to Dogechain are temporarily paused": "警报:Dogechain的交易已暂时暂停。",
+ "You may still bridge funds from Dogechain to any supported destination chain": "您仍可以将资金从Dogechain桥接到任何支持的目标链。"
+ }
+}
diff --git a/packages/synapse-interface/next.config.js b/packages/synapse-interface/next.config.js
index 39e50bb2ab..5e59674626 100644
--- a/packages/synapse-interface/next.config.js
+++ b/packages/synapse-interface/next.config.js
@@ -43,6 +43,10 @@ const nextConfig = {
typescript: {
tsconfigPath: './tsconfig.json',
},
+ i18n: {
+ locales: ['en-US', 'fr', 'ar', 'tr', 'es'],
+ defaultLocale: 'en-US',
+ },
}
module.exports = {
diff --git a/packages/synapse-interface/package.json b/packages/synapse-interface/package.json
index 9446059315..a4ba38f606 100644
--- a/packages/synapse-interface/package.json
+++ b/packages/synapse-interface/package.json
@@ -15,6 +15,8 @@
"test:coverage": "echo 'No tests defined.'",
"lint:fix": "npm run lint -- --fix",
"lint:check": "eslint . --max-warnings=0",
+ "lint:find-string-literals": "npx eslint -c .eslintrc-i18n.js './**/*.{js,jsx,ts,tsx}'",
+ "check-translation-jsons": "node scripts/checkTranslationJsons.js",
"ci:lint": "npm run lint:check",
"build:go": " ",
"build:slither": " ",
@@ -46,8 +48,7 @@
"@wagmi/connectors": "^5.0.0",
"@wagmi/core": "^2.10.5",
"babel-plugin-transform-bigint": "^1.0.32",
- "eslint": "^8.37.0",
- "eslint-config-next": "^13.5.6",
+ "deepmerge": "^4.3.1",
"ethers": "5.7.2",
"fuse.js": "^6.6.2",
"graphql": "^16.7.1",
@@ -55,6 +56,7 @@
"logrocket": "^7.0.0",
"logrocket-react": "^6.0.3",
"next": "^14.1.3",
+ "next-intl": "^3.19.0",
"numeral": "^2.0.6",
"postcss": "^8.4.31",
"react": "^18.2.0",
@@ -107,6 +109,9 @@
"@types/react-dom": "^18.2.22",
"@types/redux-persist": "^4.3.1",
"dayjs": "^1.11.7",
+ "eslint": "^8.37.0",
+ "eslint-config-next": "^13.5.6",
+ "eslint-plugin-i18next": "^6.0.9",
"start-server-and-test": "^2.0.0",
"vercel": "^33.6.2"
}
diff --git a/packages/synapse-interface/pages/_app.tsx b/packages/synapse-interface/pages/_app.tsx
index fd4f1d8c57..9af9055183 100644
--- a/packages/synapse-interface/pages/_app.tsx
+++ b/packages/synapse-interface/pages/_app.tsx
@@ -5,11 +5,13 @@ import type { AppProps } from 'next/app'
import Head from 'next/head'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { PersistGate } from 'redux-persist/integration/react'
-import { RainbowKitProvider, darkTheme } from '@rainbow-me/rainbowkit'
+import { RainbowKitProvider, darkTheme, Locale } from '@rainbow-me/rainbowkit'
import { store, persistor } from '@/store/store'
import { WagmiProvider } from 'wagmi'
import LogRocket from 'logrocket'
import setupLogRocketReact from 'logrocket-react'
+import { NextIntlClientProvider } from 'next-intl'
+import { useRouter } from 'next/router'
import { SegmentAnalyticsProvider } from '@/contexts/SegmentAnalyticsProvider'
import { UserProvider } from '@/contexts/UserProvider'
@@ -38,31 +40,41 @@ if (
const queryClient = new QueryClient()
function App({ Component, pageProps }: AppProps) {
+ const router = useRouter()
return (
<>
Synapse Protocol
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
>
)
}
diff --git a/packages/synapse-interface/pages/index.tsx b/packages/synapse-interface/pages/index.tsx
index c7d9a5c6d8..8c0d8eb8f0 100644
--- a/packages/synapse-interface/pages/index.tsx
+++ b/packages/synapse-interface/pages/index.tsx
@@ -1,7 +1,9 @@
+import deepmerge from 'deepmerge'
+import ReactGA from 'react-ga'
+
import StateManagedBridge from './state-managed-bridge'
import { Portfolio } from '@/components/Portfolio/Portfolio'
import { LandingPageWrapper } from '@/components/layouts/LandingPageWrapper'
-import ReactGA from 'react-ga'
import useSyncQueryParamsWithBridgeState from '@/utils/hooks/useSyncQueryParamsWithBridgeState'
// TODO: someone should add this to the .env, disable if blank, etc.
@@ -10,6 +12,18 @@ import useSyncQueryParamsWithBridgeState from '@/utils/hooks/useSyncQueryParamsW
const TRACKING_ID = 'G-BBC13LQXBD'
ReactGA.initialize(TRACKING_ID)
+export async function getStaticProps({ locale }) {
+ const userMessages = (await import(`../messages/${locale}.json`)).default
+ const defaultMessages = (await import(`../messages/en-US.json`)).default
+ const messages = deepmerge(defaultMessages, userMessages)
+
+ return {
+ props: {
+ messages,
+ },
+ }
+}
+
const Home = () => {
useSyncQueryParamsWithBridgeState()
diff --git a/packages/synapse-interface/pages/landing/index.tsx b/packages/synapse-interface/pages/landing/index.tsx
index 4386ec61f5..5a9b197282 100644
--- a/packages/synapse-interface/pages/landing/index.tsx
+++ b/packages/synapse-interface/pages/landing/index.tsx
@@ -1,3 +1,7 @@
+import { useRouter } from 'next/router'
+import { useEffect } from 'react'
+import deepmerge from 'deepmerge'
+
import { LandingPageWrapper } from '@/components/layouts/LandingPageWrapper'
import { LandingPageContainer } from '../../components/landing/shared'
@@ -10,11 +14,20 @@ import HowItWorksSection from './sections/HowItWorksSection'
import UseCasesSection from './sections/UseCasesSection'
import ResourcesSection from './sections/ResourcesSection'
-import { useRouter } from 'next/router'
-import { useEffect } from 'react'
-
import { segmentAnalyticsEvent } from '@/contexts/SegmentAnalyticsProvider'
+export async function getStaticProps({ locale }) {
+ const userMessages = (await import(`../../messages/${locale}.json`)).default
+ const defaultMessages = (await import(`../../messages/en-US.json`)).default
+ const messages = deepmerge(defaultMessages, userMessages)
+
+ return {
+ props: {
+ messages,
+ },
+ }
+}
+
const LandingPage = () => {
const router = useRouter()
diff --git a/packages/synapse-interface/pages/landing/sections/BridgeSection.tsx b/packages/synapse-interface/pages/landing/sections/BridgeSection.tsx
index ba38119adb..0fa00df52c 100644
--- a/packages/synapse-interface/pages/landing/sections/BridgeSection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/BridgeSection.tsx
@@ -1,31 +1,31 @@
+import { useTranslations } from 'next-intl'
+
import Grid from '@/components/ui/tailwind/Grid'
-import {
- SectionContainer,
- SupportCard,
-} from '../../../components/landing/shared'
+import { SectionContainer, SupportCard } from '@/components/landing/shared'
import FauxBridge from '@/components/icons/LandingIcons/FauxBridge'
import { DeepLiquidityIcon } from '@/components/icons/LandingIcons/DeepLiquidityIcon'
import { WideSupportIcon } from '@/components/icons/LandingIcons/WideSupportIcon'
import { DeveloperIcon } from '@/components/icons/LandingIcons/DeveloperIcon'
export default function BridgeSection() {
+ const t = useTranslations('Landing.BridgeSection')
+
return (
-
+
- Powering the most popular bridge
+ {t('Powering')}
- Synapse Bridge {' '}
- is built on top of the cross-chain infrastructure enabling users
- to seamlessly transfer assets across all blockchains. The Bridge
- has become the most widely-used method to move assets cross-chain,
- offering low cost, fast, and secure bridging.
+
+ {t('Synapse Bridge')}
+ {' '}
+ {t('Built on top of')}
@@ -33,16 +33,14 @@ export default function BridgeSection() {
- }>
- Swap native assets using our cross-chain AMM liquidity pools
+ }>
+ {t('Swap native assets')}
- }>
- Access over 16 different EVM and non-EVM blockchains with more
- integrations coming soon
+ }>
+ {t('Access')}
- }>
- Easily integrate cross-chain token bridging natively into your
- decentralized application
+ }>
+ {t('Integrate')}
diff --git a/packages/synapse-interface/pages/landing/sections/ExplorerSection.tsx b/packages/synapse-interface/pages/landing/sections/ExplorerSection.tsx
index a00e6d4833..2a55a5b83c 100644
--- a/packages/synapse-interface/pages/landing/sections/ExplorerSection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/ExplorerSection.tsx
@@ -1,8 +1,10 @@
import Link from 'next/link'
+import { useTranslations } from 'next-intl'
+
import Grid from '@/components/ui/tailwind/Grid'
import Button from '@/components/ui/tailwind/Button'
import Card from '@/components/ui/tailwind/Card'
-import { SectionContainer } from '../../../components/landing/shared'
+import { SectionContainer } from '@/components/landing/shared'
import { EXPLORER_PATH } from '@/constants/urls'
import {
getTotalBridgeVolume,
@@ -16,20 +18,21 @@ export default function ExplorerSection() {
const totalTxCount = getTotalTxCount()
const totalValueLocked = getTotalValueLocked()
+ const t = useTranslations('Landing.ExplorerSection')
+
return (
-
- Battle-tested infrastructure
+
+ {t('Battle tested')}
-
- Synapse has processed millions of transactions and tens of billions
- in bridged assets.
+
+ {t('Synapse has processed')}
@@ -45,7 +48,7 @@ export default function ExplorerSection() {
borderRadius: '10px',
}}
>
- Go to Explorer
+ {t('Go to Explorer')}
@@ -54,11 +57,17 @@ export default function ExplorerSection() {
-
-
-
+
+
+
diff --git a/packages/synapse-interface/pages/landing/sections/HeroSection.tsx b/packages/synapse-interface/pages/landing/sections/HeroSection.tsx
index 108b98be52..ae26cf5eb3 100644
--- a/packages/synapse-interface/pages/landing/sections/HeroSection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/HeroSection.tsx
@@ -1,9 +1,12 @@
import Link from 'next/link'
+import { useTranslations } from 'next-intl'
import Button from '@/components/ui/tailwind/Button'
import { SYNAPSE_DOCS_URL, BRIDGE_PATH } from '@/constants/urls'
-import { SectionContainer } from '../../../components/landing/shared'
+import { SectionContainer } from '@/components/landing/shared'
export default function HeroSection() {
+ const t = useTranslations('Landing.HeroSection')
+
return (
- Secure cross-chain
-
- communication
+ {t('title')}
-
- Synapse is the most widely used, extensible, and secure cross-
-
- chain communications network. Build truly cross-chain
-
- applications using the Synapse Protocol.
-
-
- Synapse is the most widely used, extensible, secure cross-chain
- communications network. Build truly cross-chain applications using the
- Synapse Protocol.
+
+ {t('description')}
null}
>
- Build on Synapse
+ {t('buildButton')}
null}>
- Enter Bridge
+ {t('enterBridgeButton')}
diff --git a/packages/synapse-interface/pages/landing/sections/HowItWorksSection.tsx b/packages/synapse-interface/pages/landing/sections/HowItWorksSection.tsx
index 116eb5234e..4570763d0e 100644
--- a/packages/synapse-interface/pages/landing/sections/HowItWorksSection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/HowItWorksSection.tsx
@@ -1,7 +1,11 @@
-import { SectionContainer } from '../../../components/landing/shared'
+import { useTranslations } from 'next-intl'
+
+import { SectionContainer } from '@/components/landing/shared'
import { HowSynapseWorks } from '@/components/icons/LandingIcons/HowSynapseWorks'
export default function HowItWorksSection() {
+ const t = useTranslations('Landing.HowItWorksSection')
+
return (
- How it all works
+ {t('How it all works')}
- Smart contracts from one chain use the Synapse Messaging Router to
- send the message to the destination chain, where a corresponding
- Messaging Router sends it to the destination contract. Messages
- are optimistically verified to ensure security and trustlessness.
+ {t('description')}
diff --git a/packages/synapse-interface/pages/landing/sections/IntegrationSection.tsx b/packages/synapse-interface/pages/landing/sections/IntegrationSection.tsx
index a7aeb09219..93ad89e1f7 100644
--- a/packages/synapse-interface/pages/landing/sections/IntegrationSection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/IntegrationSection.tsx
@@ -1,7 +1,9 @@
import Link from 'next/link'
+import { useTranslations } from 'next-intl'
+
import Grid from '@/components/ui/tailwind/Grid'
import Card from '@/components/ui/tailwind/Card'
-import { SectionContainer } from '../../../components/landing/shared'
+import { SectionContainer } from '@/components/landing/shared'
import { ORDERED_CHAINS_BY_ID, ChainId, CHAINS_BY_ID } from '@/constants/chains'
import { Chain } from '@/utils/types'
import { getNetworkButtonBorderHover } from '@/styles/chains'
@@ -16,6 +18,8 @@ export default function IntegrationSection() {
return CHAINS_BY_ID[chainId]
})
+ const t = useTranslations('Landing.IntegrationSection')
+
return (
- Widely integrated
+ {t('Widely integrated')}
- Synapse is widely integrated across the most-used Layer 1 and{' '}
-
- Layer 2 networks for a seamless cross-chain experience.
+ {t('Synapse is')}
{OrderedSupportedNetworks.map((network: Chain, index: number) => (
{
dispatch(setFromChainId(chainId))
}
@@ -113,7 +117,7 @@ function NetworkCard({
{chainName}
- Layer {layer}
+ {t('Layer')} {layer}
diff --git a/packages/synapse-interface/pages/landing/sections/ResourcesSection.tsx b/packages/synapse-interface/pages/landing/sections/ResourcesSection.tsx
index f209947c48..0b67af6203 100644
--- a/packages/synapse-interface/pages/landing/sections/ResourcesSection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/ResourcesSection.tsx
@@ -1,41 +1,43 @@
import Link from 'next/link'
+import { useTranslations } from 'next-intl'
+
import Grid from '@/components/ui/tailwind/Grid'
import Card from '@/components/ui/tailwind/Card'
import Button from '@/components/ui/tailwind/Button'
-import { SectionContainer } from '../../../components/landing/shared'
+import { SectionContainer } from '@/components/landing/shared'
import { GITHUB_URL, SYNAPSE_DOCS_URL, MEDIUM_URL } from '@/constants/urls'
export default function ResourcesSection() {
+ const t = useTranslations('Landing.ResourcesSection')
return (
-
+
- Get started now
+ {t('Get started now')}
- Find the resources you need to create integrations with Synapse.
+ {t('Find the resources')}
-
+
diff --git a/packages/synapse-interface/pages/landing/sections/SecuritySection.tsx b/packages/synapse-interface/pages/landing/sections/SecuritySection.tsx
index baa9500dc1..23930fc4cf 100644
--- a/packages/synapse-interface/pages/landing/sections/SecuritySection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/SecuritySection.tsx
@@ -1,52 +1,48 @@
+import { useTranslations } from 'next-intl'
import Grid from '@/components/ui/tailwind/Grid'
-import {
- SectionContainer,
- SupportCard,
-} from '../../../components/landing/shared'
+import { SectionContainer, SupportCard } from '@/components/landing/shared'
import SynapseCircuit from '@/components/icons/LandingIcons/SynapseCircuit'
import { SecureIcon } from '@/components/icons/LandingIcons/SecureIcon'
import { ExtensibleIcon } from '@/components/icons/LandingIcons/ExtensibleIcon'
import { GeneralizedIcon } from '@/components/icons/LandingIcons/GeneralizedIcon'
export default function SecuritySection() {
+ const t = useTranslations('Landing.SecuritySection')
+
return (
-
+
-
-
- Securely connect every blockchain
-
+
+
{t('title')}
- Synapse is comprised of a{' '}
+ {t('description.part1')}{' '}
- cross-chain messaging framework
+ {t('description.strong1')}
{' '}
- and an{' '}
+ {t('description.part2')}{' '}
- economically secure method
+ {t('description.strong2')}
{' '}
- to reach consensus on the validity of cross-chain transactions,
- enabling developers to build truly native cross-chain apps.
-
{' '}
+ {t('description.part3')}
+
-
- }>
- Synapse’s cross-chain messaging contracts can be deployed across any
- blockchain
+ }>
+ {t('extensibleDescription')}
- }>
- Synapse employs an Optimistic security model to ensure integrity of
- cross-chain messages
+ }>
+ {t('secureDescription')}
- }>
- Any arbitrary data can be sent across chains including contract calls,
- NFTs, snapshots, and more
+ }
+ >
+ {t('generalizedDescription')}
diff --git a/packages/synapse-interface/pages/landing/sections/UseCasesSection.tsx b/packages/synapse-interface/pages/landing/sections/UseCasesSection.tsx
index d8fc2fe1e7..017ebe794d 100644
--- a/packages/synapse-interface/pages/landing/sections/UseCasesSection.tsx
+++ b/packages/synapse-interface/pages/landing/sections/UseCasesSection.tsx
@@ -1,52 +1,52 @@
-import { SectionContainer } from '../../../components/landing/shared'
+import { useTranslations } from 'next-intl'
+import { SectionContainer } from '@/components/landing/shared'
import Grid from '@/components/ui/tailwind/Grid'
import Card from '@/components/ui/tailwind/Card'
import { CrossChainExchangeIcon } from '@/components/icons/LandingIcons/CrossChainExchangeIcon'
import { UniversalMoneyMarketsIcon } from '@/components/icons/LandingIcons/UniversalMoneyMarketsIcon'
import { MultiChainGamingIcon } from '@/components/icons/LandingIcons/MultiChainGamingIcon'
-interface useCaseProp {
+interface UseCaseProp {
title: string
image: JSX.Element
description: string
}
-const useCases: useCaseProp[] = [
- {
- title: 'Cross-chain exchange',
- image:
,
- description: 'Swap any asset on any blockchain using Synapse’s token swaps',
- },
- {
- title: 'Universal money markets',
- image:
,
- description:
- 'Borrow and lend assets across any blockchain using Synapse’s pools',
- },
- {
- title: 'Multi-chain gaming',
- image:
,
- description:
- 'Create uniqe gaming experiences that access multiple blockchains',
- },
-]
-
export default function UseCasesSection() {
+ const t = useTranslations('Landing.UseCasesSection')
+
+ const useCases: UseCaseProp[] = [
+ {
+ title: t('useCases.0.title'),
+ image:
,
+ description: t('useCases.0.description'),
+ },
+ {
+ title: t('useCases.1.title'),
+ image:
,
+ description: t('useCases.1.description'),
+ },
+ {
+ title: t('useCases.2.title'),
+ image:
,
+ description: t('useCases.2.description'),
+ },
+ ]
+
return (
-
Use cases
+
{t('title')}
- Here’s a preview of what you can do using Synapse.
+ {t('subtitle')}
-
- {useCases.map((useCase: useCaseProp, index: number) => (
+ {useCases.map((useCase: UseCaseProp, index: number) => (
- {image}
-
- {title}
-
-
- {description}
-
+ {image}
+ {title}
+ {description}
)
}
diff --git a/packages/synapse-interface/pages/pool/NoPoolBody.tsx b/packages/synapse-interface/pages/pool/NoPoolBody.tsx
index 1727b61c57..ed11e88ecd 100644
--- a/packages/synapse-interface/pages/pool/NoPoolBody.tsx
+++ b/packages/synapse-interface/pages/pool/NoPoolBody.tsx
@@ -1,3 +1,5 @@
+import { useTranslations } from 'next-intl'
+
import Card from '@tw/Card'
import Grid from '@tw/Grid'
import { Token } from '@types'
@@ -11,6 +13,8 @@ const NoPoolBody = ({
pool: Token
poolChainId: number
}) => {
+ const t = useTranslations('Pools')
+
return pool && poolChainId ? (
- Switch to{' '}
+ {t('Switch to')}{' '}
{CHAINS_BY_ID[poolChainId].name}
{' '}
- to interact with the {pool.name} pool.
+ {t('to interact with the')} {pool.name} {t('pool')}.
) : (
- Invalid Pool ID
+ {t('Invalid Pool ID')}
)
diff --git a/packages/synapse-interface/pages/pool/PoolBody.tsx b/packages/synapse-interface/pages/pool/PoolBody.tsx
index d789d4ffc2..e988b84480 100644
--- a/packages/synapse-interface/pages/pool/PoolBody.tsx
+++ b/packages/synapse-interface/pages/pool/PoolBody.tsx
@@ -4,6 +4,8 @@ import { Address } from 'viem'
import { useEffect, useState } from 'react'
import { useAccount, useSwitchChain } from 'wagmi'
import { ChevronLeftIcon } from '@heroicons/react/outline'
+import { useTranslations } from 'next-intl'
+
import Card from '@tw/Card'
import Grid from '@tw/Grid'
import { zeroAddress } from 'viem'
@@ -33,6 +35,8 @@ const PoolBody = ({
const { poolUserData } = usePoolUserDataState()
const { pool, poolAPYData } = usePoolDataState()
+ const t = useTranslations('Pools')
+
useEffect(() => {
setIsClient(true)
}, [])
@@ -53,7 +57,7 @@ const PoolBody = ({
- Back to Pools
+ {t('Back to Pools')}
@@ -69,7 +73,7 @@ const PoolBody = ({
diff --git a/packages/synapse-interface/pages/pool/PoolInfoSection/CurrencyReservesCard.tsx b/packages/synapse-interface/pages/pool/PoolInfoSection/CurrencyReservesCard.tsx
index a0bb5cd827..a715d53651 100644
--- a/packages/synapse-interface/pages/pool/PoolInfoSection/CurrencyReservesCard.tsx
+++ b/packages/synapse-interface/pages/pool/PoolInfoSection/CurrencyReservesCard.tsx
@@ -1,5 +1,6 @@
import numeral from 'numeral'
import { useSelector } from 'react-redux'
+import { useTranslations } from 'next-intl'
import InfoSectionCard from './InfoSectionCard'
import { RootState } from '@/store/store'
@@ -47,8 +48,10 @@ const TokenLabels = ({ tokens }) => {
const CurrencyReservesCard = () => {
const { poolData } = useSelector((state: RootState) => state.poolData)
+ const t = useTranslations('Pools.Other')
+
return (
-
+
{poolData ? : null}
)
diff --git a/packages/synapse-interface/pages/pool/PoolInfoSection/index.tsx b/packages/synapse-interface/pages/pool/PoolInfoSection/index.tsx
index 5574aeb032..73cac94f66 100644
--- a/packages/synapse-interface/pages/pool/PoolInfoSection/index.tsx
+++ b/packages/synapse-interface/pages/pool/PoolInfoSection/index.tsx
@@ -1,4 +1,6 @@
import numeral from 'numeral'
+import { useTranslations } from 'next-intl'
+
import AugmentWithUnits from '../components/AugmentWithUnits'
import InfoSectionCard from './InfoSectionCard'
import CurrencyReservesCard from './CurrencyReservesCard'
@@ -12,14 +14,16 @@ import { usePoolDataState } from '@/slices/pools/hooks'
const PoolInfoSection = () => {
const { pool, poolData, isLoading } = usePoolDataState()
+ const t = useTranslations('Pools.Other')
+
const usdFormat = poolData.totalLockedUSD > 1000000 ? '$0,0.0' : '$0,0'
return (
-
+
{
}
/>
{
}
/>
{
}
/>
{
- const paths = Object.keys(POOL_BY_ROUTER_INDEX).map((key) => ({
- params: { poolId: key },
- }))
-
+export const getStaticPaths = async ({ locales }) => {
+ const paths = Object.keys(POOL_BY_ROUTER_INDEX).flatMap((key) =>
+ locales.map((locale) => ({
+ params: { poolId: key },
+ locale,
+ }))
+ )
return {
paths,
- fallback: false, // false or "blocking"
+ fallback: false,
}
}
-export const getStaticProps = async (context) => {
- return { props: {} }
-}
+export async function getStaticProps({ params, locale }) {
+ const userMessages = (await import(`../../messages/${locale}.json`)).default
+ const defaultMessages = (await import(`../../messages/en-US.json`)).default
+ const messages = deepmerge(defaultMessages, userMessages)
+ return {
+ props: {
+ messages,
+ poolId: params.poolId,
+ },
+ }
+}
const PoolPage = () => {
const dispatch = useAppDispatch()
const router = useRouter()
diff --git a/packages/synapse-interface/pages/pool/components/LiquidityManagementTabs.tsx b/packages/synapse-interface/pages/pool/components/LiquidityManagementTabs.tsx
index 3aef4556c7..74f7e7286e 100644
--- a/packages/synapse-interface/pages/pool/components/LiquidityManagementTabs.tsx
+++ b/packages/synapse-interface/pages/pool/components/LiquidityManagementTabs.tsx
@@ -1,7 +1,11 @@
+import { useTranslations } from 'next-intl'
+
import Tabs from '@tw/Tabs'
import TabItem from '@tw/TabItem'
const LiquidityManagementTabs = ({ cardNav, setCardNav }) => {
+ const t = useTranslations('Pools')
+
return (
{
}}
className="rounded-tl-sm"
>
- Add Liquidity
+ {t('Add Liquidity')}
{
}}
className="rounded-tr-sm"
>
- Remove Liquidity
+ {t('Remove Liquidity')}
)
diff --git a/packages/synapse-interface/pages/pool/components/PriceImpactDisplay.tsx b/packages/synapse-interface/pages/pool/components/PriceImpactDisplay.tsx
index 3da1036eb5..00695b9f7e 100644
--- a/packages/synapse-interface/pages/pool/components/PriceImpactDisplay.tsx
+++ b/packages/synapse-interface/pages/pool/components/PriceImpactDisplay.tsx
@@ -1,4 +1,6 @@
import { useMemo } from 'react'
+import { useTranslations } from 'next-intl'
+
import { formatBigIntToString } from '@/utils/bigint/format'
function removeLeadingZeros(inputValue: number): number {
@@ -16,6 +18,8 @@ const PriceImpactDisplay = ({ priceImpact }: { priceImpact: bigint }) => {
let labelText: string
let content: any
+ const t = useTranslations('Pools.Other')
+
const priceImpactValue: number = useMemo(() => {
if (!priceImpact) return 0
@@ -42,10 +46,10 @@ const PriceImpactDisplay = ({ priceImpact }: { priceImpact: bigint }) => {
if (priceImpactValue > 0) {
colorClassName = 'text-green-500'
- labelText = 'Bonus'
+ labelText = t('Bonus')
} else {
colorClassName = 'text-red-500'
- labelText = 'Price Impact'
+ labelText = t('Price impact')
}
if (priceImpactValue == 0) {
diff --git a/packages/synapse-interface/pages/pool/components/ReceivedTokenSection.tsx b/packages/synapse-interface/pages/pool/components/ReceivedTokenSection.tsx
index 42d4c11f47..f7e7b15fba 100644
--- a/packages/synapse-interface/pages/pool/components/ReceivedTokenSection.tsx
+++ b/packages/synapse-interface/pages/pool/components/ReceivedTokenSection.tsx
@@ -1,4 +1,5 @@
-import _ from 'lodash'
+import { useTranslations } from 'next-intl'
+
import { formatBigIntToString } from '@utils/bigint/format'
import { Token } from '@types'
@@ -11,25 +12,28 @@ const ReceivedTokenSection = ({
poolTokens: Token[]
chainId: number
}) => {
+ const t = useTranslations('Pools')
// If withdrawQuote or outputs in withdrawQuote is undefined, return null
- if (!withdrawQuote || !withdrawQuote.outputs) return null;
+ if (!withdrawQuote || !withdrawQuote.outputs) return null
// Cannot handle nativeTokens currently without state reworking to make accessible the pools object
// const tokensArray = poolTokens ? poolTokens : pool.nativeTokens; // Using the appropriate tokens array
const tokensArray = poolTokens
// If the "ALL" key exists, use its array. Otherwise, convert the outputs object into an array
- const outputsArray = withdrawQuote.outputs.ALL ? withdrawQuote.outputs.ALL : Object.values(withdrawQuote.outputs);
+ const outputsArray = withdrawQuote.outputs.ALL
+ ? withdrawQuote.outputs.ALL
+ : Object.values(withdrawQuote.outputs)
return (
- You will receive
+ {t('You will receive')}
{tokensArray &&
outputsArray
- .filter((output) => tokensArray[output.index]) // Using the output's index to filter the tokens
+ .filter((output) => tokensArray[output.index]) // Using the output's index to filter the tokens
.map((output) => {
- const token = tokensArray[output.index]; // Using the output's index to fetch the corresponding token
+ const token = tokensArray[output.index] // Using the output's index to fetch the corresponding token
return (
// Added a key for mapped elements
@@ -40,7 +44,7 @@ const ReceivedTokenSection = ({
>
{formatBigIntToString(
- output.value, // Adjusted to use output.value directly
+ output.value, // Adjusted to use output.value directly
token.decimals[chainId],
6
)}
diff --git a/packages/synapse-interface/pages/pool/poolManagement/DepositButton.tsx b/packages/synapse-interface/pages/pool/poolManagement/DepositButton.tsx
index 194af299e9..b97b5fbead 100644
--- a/packages/synapse-interface/pages/pool/poolManagement/DepositButton.tsx
+++ b/packages/synapse-interface/pages/pool/poolManagement/DepositButton.tsx
@@ -1,6 +1,8 @@
import { useEffect, useMemo, useState } from 'react'
import { useAccount, useAccountEffect, useSwitchChain } from 'wagmi'
import { useConnectModal } from '@rainbow-me/rainbowkit'
+import { useTranslations } from 'next-intl'
+
import {
usePoolDataState,
usePoolDepositState,
@@ -12,7 +14,8 @@ import { DEFAULT_DEPOSIT_QUOTE } from './Deposit'
import LoadingDots from '@/components/ui/tailwind/LoadingDots'
const DepositButton = ({ approveTxn, depositTxn }) => {
- const [isConnected, setIsConnected] = useState(false) // Initialize to false
+ const t = useTranslations('Pools.DepositButton')
+ const [isConnected, setIsConnected] = useState(false)
const { openConnectModal } = useConnectModal()
const { chain, isConnected: isConnectedInit } = useAccount()
@@ -57,7 +60,6 @@ const DepositButton = ({ approveTxn, depositTxn }) => {
)
}
)
-
const isEmptyPool = useMemo(() => {
return poolData.totalLocked === 0
}, [poolData])
@@ -74,7 +76,7 @@ const DepositButton = ({ approveTxn, depositTxn }) => {
if (!isBalanceEnough) {
buttonProperties = {
- label: 'Insufficient Balance',
+ label: t('insufficientBalance'),
onClick: null,
}
} else if (isLoading) {
@@ -88,29 +90,29 @@ const DepositButton = ({ approveTxn, depositTxn }) => {
}
} else if (!isConnected) {
buttonProperties = {
- label: `Connect Wallet to Bridge`,
+ label: t('connectWallet'),
onClick: openConnectModal,
}
} else if (chain?.id !== pool.chainId) {
+ const targetChain = chains.find((c) => c.id === pool.chainId)
buttonProperties = {
- label: `Switch to ${chains.find((c) => c.id === pool.chainId).name}`,
+ label: t('switchChain', { chainName: targetChain.name }),
onClick: () => switchChain({ chainId: pool.chainId }),
- pendingLabel: 'Switching chains',
+ pendingLabel: t('switchingChains'),
}
} else if (isApprovalNeeded) {
buttonProperties = {
onClick: approveTxn,
- label: `Approve Token(s)`,
- pendingLabel: 'Approving',
+ label: t('approveTokens'),
+ pendingLabel: t('approving'),
}
} else {
buttonProperties = {
onClick: depositTxn,
- label: `Deposit`,
- pendingLabel: 'Depositing',
+ label: t('deposit'),
+ pendingLabel: t('depositing'),
}
}
-
return (
pool &&
buttonProperties && (
diff --git a/packages/synapse-interface/pages/pool/poolManagement/Withdraw.tsx b/packages/synapse-interface/pages/pool/poolManagement/Withdraw.tsx
index b63cbded08..b91c9b7c7c 100644
--- a/packages/synapse-interface/pages/pool/poolManagement/Withdraw.tsx
+++ b/packages/synapse-interface/pages/pool/poolManagement/Withdraw.tsx
@@ -4,6 +4,8 @@ import Slider from 'react-input-slider'
import { useEffect, useMemo, useState } from 'react'
import { waitForTransactionReceipt } from '@wagmi/core'
import { type Address } from 'viem'
+import { useTranslations } from 'next-intl'
+
import { useAppDispatch } from '@/store/hooks'
import { getCoinTextColorCombined } from '@styles/tokens'
import { ALL } from '@constants/withdrawTypes'
@@ -44,6 +46,8 @@ const Withdraw = ({ address }: { address: string }) => {
const { synapseSDK } = useSynapseContext()
const [percentage, setPercentage] = useState(0)
+ const t = useTranslations('Pools')
+
const { pool, poolData } = usePoolDataState()
const { poolUserData } = usePoolUserDataState()
const { withdrawQuote, inputValue, withdrawType } = usePoolWithdrawState()
@@ -247,15 +251,15 @@ const Withdraw = ({ address }: { address: string }) => {
pool && (
-
Withdraw Percentage %
+
{t('Withdraw Percentage')} %
onPercentChange(Number(e.currentTarget.value))}
onFocus={(e) => e.target.select()}
diff --git a/packages/synapse-interface/pages/pool/poolManagement/WithdrawButton.tsx b/packages/synapse-interface/pages/pool/poolManagement/WithdrawButton.tsx
index d73df40bd7..f570d77add 100644
--- a/packages/synapse-interface/pages/pool/poolManagement/WithdrawButton.tsx
+++ b/packages/synapse-interface/pages/pool/poolManagement/WithdrawButton.tsx
@@ -1,6 +1,7 @@
import { useEffect, useState } from 'react'
import { useAccount, useAccountEffect, useSwitchChain } from 'wagmi'
import { useConnectModal } from '@rainbow-me/rainbowkit'
+import { useTranslations } from 'next-intl'
import { DEFAULT_WITHDRAW_QUOTE } from '@/slices/poolWithdrawSlice'
import {
usePoolDataState,
@@ -12,10 +13,11 @@ import { TransactionButton } from '@/components/buttons/TransactionButton'
import LoadingDots from '@/components/ui/tailwind/LoadingDots'
const WithdrawButton = ({ approveTxn, withdrawTxn, isApproved }) => {
+ const t = useTranslations('Pools.WithdrawButton')
const { chain, isConnected: isConnectedInit } = useAccount()
const { chains, switchChain } = useSwitchChain()
const { openConnectModal } = useConnectModal()
- const [isConnected, setIsConnected] = useState(false) // Initialize to false
+ const [isConnected, setIsConnected] = useState(false)
useAccountEffect({
onDisconnect() {
@@ -45,7 +47,7 @@ const WithdrawButton = ({ approveTxn, withdrawTxn, isApproved }) => {
if (!isBalanceEnough && isValidQuote && isValidInput) {
buttonProperties = {
- label: 'Insufficient Balance',
+ label: t('insufficientBalance'),
onClick: null,
}
} else if (isLoading) {
@@ -59,26 +61,28 @@ const WithdrawButton = ({ approveTxn, withdrawTxn, isApproved }) => {
}
} else if (!isConnected) {
buttonProperties = {
- label: `Connect Wallet to Bridge`,
+ label: t('connectWallet'),
onClick: openConnectModal,
}
} else if (chain?.id !== pool.chainId) {
buttonProperties = {
- label: `Switch to ${chains.find((c) => c.id === pool.chainId).name}`,
+ label: t('switchChain', {
+ chainName: chains.find((c) => c.id === pool.chainId).name,
+ }),
onClick: () => switchChain({ chainId: pool.chainId }),
- pendingLabel: 'Switching chains',
+ pendingLabel: t('switchingChains'),
}
} else if (!isApproved && isValidQuote && isValidInput) {
buttonProperties = {
onClick: approveTxn,
- label: `Approve Token`,
- pendingLabel: 'Approving',
+ label: t('approveToken'),
+ pendingLabel: t('approving'),
}
} else {
buttonProperties = {
onClick: withdrawTxn,
- label: `Withdraw`,
- pendingLabel: 'Withdrawing...',
+ label: t('withdraw'),
+ pendingLabel: t('withdrawing'),
}
}
diff --git a/packages/synapse-interface/pages/pools/PoolCard.tsx b/packages/synapse-interface/pages/pools/PoolCard.tsx
index 6a4059bf11..4530967a99 100644
--- a/packages/synapse-interface/pages/pools/PoolCard.tsx
+++ b/packages/synapse-interface/pages/pools/PoolCard.tsx
@@ -4,6 +4,8 @@ import { useEffect, useMemo, useState, memo } from 'react'
import { useAccount } from 'wagmi'
import { type Address } from 'viem'
import { LoaderIcon, toast } from 'react-hot-toast'
+import { useTranslations } from 'next-intl'
+
import { useAppSelector } from '@/store/hooks'
import { usePortfolioState } from '@/slices/portfolio/hooks'
import { getSinglePoolData } from '@utils/actions/getPoolData'
@@ -137,6 +139,8 @@ const ManageLp = ({ pool, stakedBalance, address }) => {
const { poolTokenBalances } = usePortfolioState()
const { amount, reward } = stakedBalance
+ const t = useTranslations('Pools')
+
const lpTokenBalance = useMemo(() => {
if (!address) {
return null
@@ -171,7 +175,13 @@ const ManageLp = ({ pool, stakedBalance, address }) => {
@@ -183,6 +193,8 @@ export const DisplayBalances = ({ pool, stakedBalance, showIcon, address }) => {
const { poolTokenBalances } = usePortfolioState()
const { amount, reward } = stakedBalance
+ const t = useTranslations('Pools')
+
const lpTokenBalance = useMemo(() => {
if (!address) {
return null
@@ -238,7 +250,7 @@ export const DisplayBalances = ({ pool, stakedBalance, showIcon, address }) => {
{reward > 0n && (
-
Earned:
+
{t('Earned')}:
{formatBigIntToString(reward, 18, 5)}{' '}
diff --git a/packages/synapse-interface/pages/pools/index.tsx b/packages/synapse-interface/pages/pools/index.tsx
index 4e522f22b0..44ad674c40 100644
--- a/packages/synapse-interface/pages/pools/index.tsx
+++ b/packages/synapse-interface/pages/pools/index.tsx
@@ -2,6 +2,9 @@ import _ from 'lodash'
import { useRouter } from 'next/router'
import { useEffect, useMemo, useState } from 'react'
import { useAccount } from 'wagmi'
+import { useTranslations } from 'next-intl'
+import deepmerge from 'deepmerge'
+
import { DISPLAY_POOLS_BY_CHAIN } from '@constants/tokens'
import { DEFAULT_FROM_CHAIN } from '@/constants/swap'
import {
@@ -16,6 +19,18 @@ import Grid from '@/components/ui/tailwind/Grid'
import PoolCards from './PoolCards'
import * as CHAINS from '@/constants/chains/master'
+export async function getStaticProps({ locale }) {
+ const userMessages = (await import(`../../messages/${locale}.json`)).default
+ const defaultMessages = (await import(`../../messages/en-US.json`)).default
+ const messages = deepmerge(defaultMessages, userMessages)
+
+ return {
+ props: {
+ messages,
+ },
+ }
+}
+
const PoolsPage = () => {
const { address: currentAddress } = useAccount()
const { chain } = useAccount()
@@ -24,6 +39,8 @@ const PoolsPage = () => {
const router = useRouter()
+ const t = useTranslations('Pools')
+
const migratedPools = {
1088: [METIS_POOL_SWAP_TOKEN_MIGRATED, METIS_WETH_SWAP_TOKEN_MIGRATED],
}
@@ -68,8 +85,8 @@ const PoolsPage = () => {
>
@@ -78,8 +95,8 @@ const PoolsPage = () => {
@@ -87,8 +104,8 @@ const PoolsPage = () => {
diff --git a/packages/synapse-interface/pages/returntomonke/ImageUploader.tsx b/packages/synapse-interface/pages/returntomonke/ImageUploader.tsx
index b43de67709..882c6fc86e 100644
--- a/packages/synapse-interface/pages/returntomonke/ImageUploader.tsx
+++ b/packages/synapse-interface/pages/returntomonke/ImageUploader.tsx
@@ -1,10 +1,14 @@
import { useState, useRef, useEffect } from 'react'
+import { useTranslations } from 'next-intl'
+
import Button from '@tw/Button'
export default function ImageUploader() {
const [uploadedImage, setUploadedImage] = useState(null)
const [processedImage, setProcessedImage] = useState(null)
+ const t = useTranslations('ReturnToMonke')
+
const fileInput = useRef(null)
const imgRef = useRef(null)
@@ -94,12 +98,12 @@ export default function ImageUploader() {
{!processedImage && (
<>
- Click to Upload or
+ {t('Click to Upload or')}
- Drag and drop image here...
+ {t('Drag and drop image here')}...
>
)}
- {processedImage && <>Select different image?>}
+ {processedImage && <>{t('Select different image?')}>}
- Download
+ {t('Download')}
)}
diff --git a/packages/synapse-interface/pages/returntomonke/PfpGeneratorCard.tsx b/packages/synapse-interface/pages/returntomonke/PfpGeneratorCard.tsx
index 2b0bc8177a..629a655537 100644
--- a/packages/synapse-interface/pages/returntomonke/PfpGeneratorCard.tsx
+++ b/packages/synapse-interface/pages/returntomonke/PfpGeneratorCard.tsx
@@ -1,15 +1,14 @@
-import Card from '@tw/Card'
+import { useTranslations } from 'next-intl'
+import Card from '@tw/Card'
import ImageUploader from './ImageUploader'
export default function PfpGeneratorCard() {
+ const t = useTranslations('ReturnToMonke')
+
return (
- Choose Synapse
- >
- }
+ title={t('Choose Synapse')}
divider={false}
className="rounded-xl min-w-[380px]"
titleClassName="text-center text-white text-opacity-50 font-normal py-2"
diff --git a/packages/synapse-interface/pages/returntomonke/index.tsx b/packages/synapse-interface/pages/returntomonke/index.tsx
index 9c94e236dc..9b0de8a32c 100644
--- a/packages/synapse-interface/pages/returntomonke/index.tsx
+++ b/packages/synapse-interface/pages/returntomonke/index.tsx
@@ -1,18 +1,34 @@
-import Grid from '@tw/Grid'
import { useEffect, useState } from 'react'
import { useAccount } from 'wagmi'
+import { useTranslations } from 'next-intl'
+import deepmerge from 'deepmerge'
+import Grid from '@tw/Grid'
import { DEFAULT_FROM_CHAIN } from '@/constants/swap'
import { LandingPageWrapper } from '@layouts/LandingPageWrapper'
import StandardPageContainer from '@layouts/StandardPageContainer'
import PfpGeneratorCard from './PfpGeneratorCard'
+export async function getStaticProps({ locale }) {
+ const userMessages = (await import(`../../messages/${locale}.json`)).default
+ const defaultMessages = (await import(`../../messages/en-US.json`)).default
+ const messages = deepmerge(defaultMessages, userMessages)
+
+ return {
+ props: {
+ messages,
+ },
+ }
+}
+
const ReturnToMonkePage = () => {
const { address: currentAddress, chain } = useAccount()
const [connectedChainId, setConnectedChainId] = useState(0)
const [address, setAddress] = useState(undefined)
+ const t = useTranslations('ReturnToMonke')
+
useEffect(() => {
setConnectedChainId(chain?.id ?? DEFAULT_FROM_CHAIN)
}, [chain])
@@ -29,7 +45,7 @@ const ReturnToMonkePage = () => {
- Generate Synaptic Profile Picture
+ {t('Generate Synaptic Profile Picture')}
diff --git a/packages/synapse-interface/pages/stake/StakeCard.tsx b/packages/synapse-interface/pages/stake/StakeCard.tsx
index aee76facc8..db3fcc821f 100644
--- a/packages/synapse-interface/pages/stake/StakeCard.tsx
+++ b/packages/synapse-interface/pages/stake/StakeCard.tsx
@@ -1,5 +1,7 @@
import { useState, useEffect } from 'react'
import { type Address } from 'viem'
+import { useTranslations } from 'next-intl'
+
import { useAppDispatch } from '@/store/hooks'
import {
fetchAndStoreSingleNetworkPortfolioBalances,
@@ -39,6 +41,8 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
const stakingPoolTokens: Token[] = tokenInfo?.poolTokens
const stakingPoolId: number = tokenInfo?.poolId
+ const t = useTranslations('Pools')
+
const { poolTokenBalances } = usePortfolioState()
const lpTokenBalance = poolTokenBalances[chainId]?.find(
@@ -132,9 +136,9 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
poolLabel={stakingPoolLabel}
lpTokenBalance={lpTokenBalance}
/>
-
+
-
Unstaked
+
{t('Unstaked')}
{!lpTokenBalance
? '\u2212'
@@ -147,7 +151,7 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
-
Staked
+
{t('Staked')}
{trimTrailingZeroesAfterDecimal(
formatBigIntToString(userStakeData.amount, tokenInfo.decimals, 6)
@@ -159,7 +163,7 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
- {pool?.customRewardToken ?? 'SYN'} Earned
+ {pool?.customRewardToken ?? 'SYN'} {t('Earned')}
{!userStakeData.reward
@@ -200,11 +204,11 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
{isPending ? (
- Claiming {' '}
+ {t('Claiming')} {' '}
) : (
- Claim {pool.customRewardToken ?? 'SYN'}
+ {t('Claim')} {pool.customRewardToken ?? 'SYN'}
)}
@@ -220,7 +224,7 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
}}
className="rounded-tl-sm"
>
- Stake
+ {t('Stake')}
{
}}
className="rounded-tr-sm"
>
- Unstake
+ {t('Unstake')}
@@ -310,12 +314,12 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
title={pool?.symbol}
buttonLabel={
!lpTokenBalance || lpTokenBalance < deposit.bi
- ? 'Insufficient Balance'
+ ? t('Insufficient balance')
: allowance < deposit.bi
- ? `Approve ${pool?.symbol}`
- : 'Stake'
+ ? `${t('Approve')} ${pool?.symbol}`
+ : t('Stake')
}
- loadingLabel={isPendingApprove ? 'Approving' : 'Staking'}
+ loadingLabel={isPendingApprove ? t('Approving') : t('Staking')}
disabled={
!lpTokenBalance ||
lpTokenBalance < deposit.bi ||
@@ -363,10 +367,10 @@ const StakeCard = ({ address, chainId, pool }: StakeCardProps) => {
title={pool?.symbol}
buttonLabel={
userStakeData.amount < stringToBigInt(withdraw, 18)
- ? 'Insufficient balance'
- : 'Unstake'
+ ? t('Insufficient balance')
+ : t('Unstake')
}
- loadingLabel="Unstaking"
+ loadingLabel={t('Unstaking')}
disabled={
!userStakeData.amount ||
userStakeData.amount < stringToBigInt(withdraw, 18) ||
diff --git a/packages/synapse-interface/pages/stake/[routerIndex].tsx b/packages/synapse-interface/pages/stake/[routerIndex].tsx
index 0d5da34a9e..e7d6ab7d16 100644
--- a/packages/synapse-interface/pages/stake/[routerIndex].tsx
+++ b/packages/synapse-interface/pages/stake/[routerIndex].tsx
@@ -1,23 +1,43 @@
import { useAccount } from 'wagmi'
import { useRouter } from 'next/router'
+import Link from 'next/link'
+import { useTranslations } from 'next-intl'
+import deepmerge from 'deepmerge'
+
import StandardPageContainer from '@layouts/StandardPageContainer'
import { LandingPageWrapper } from '@layouts/LandingPageWrapper'
import StakeCard from './StakeCard'
import { POOL_BY_ROUTER_INDEX } from '@/constants/tokens'
-import Link from 'next/link'
import { POOL_PATH } from '@/constants/urls'
import { ChevronLeftIcon } from '@heroicons/react/outline'
-export async function getStaticPaths() {
- const paths = Object.keys(POOL_BY_ROUTER_INDEX).map((routerIndex) => ({
- params: { routerIndex },
- }))
+export async function getStaticPaths({ locales }) {
+ const poolRouterIndices = Object.keys(POOL_BY_ROUTER_INDEX)
- return { paths, fallback: false }
+ const paths = poolRouterIndices.flatMap((routerIndex) =>
+ locales.map((locale) => ({
+ params: { routerIndex },
+ locale,
+ }))
+ )
+
+ return {
+ paths,
+ fallback: false,
+ }
}
-export const getStaticProps = async (context) => {
- return { props: {} }
+export async function getStaticProps({ params, locale }) {
+ const userMessages = (await import(`../../messages/${locale}.json`)).default
+ const defaultMessages = (await import(`../../messages/en-US.json`)).default
+ const messages = deepmerge(defaultMessages, userMessages)
+
+ return {
+ props: {
+ messages,
+ routerIndex: params.routerIndex,
+ },
+ }
}
const SingleStakePage = () => {
@@ -26,6 +46,8 @@ const SingleStakePage = () => {
const { address } = useAccount()
const { chain } = useAccount()
+ const t = useTranslations('Pools')
+
const pool = POOL_BY_ROUTER_INDEX[routerIndex as string]
if (!pool) return null
@@ -41,7 +63,7 @@ const SingleStakePage = () => {
- Back to Pool
+ {t('Back to Pool')}
diff --git a/packages/synapse-interface/pages/stake/index.tsx b/packages/synapse-interface/pages/stake/index.tsx
index 558c3e4c24..f0b13cc7ec 100644
--- a/packages/synapse-interface/pages/stake/index.tsx
+++ b/packages/synapse-interface/pages/stake/index.tsx
@@ -1,17 +1,32 @@
import { useEffect, useState } from 'react'
import { useAccount } from 'wagmi'
+import { useTranslations } from 'next-intl'
+import { useRouter } from 'next/router'
+import Link from 'next/link'
+import toast from 'react-hot-toast'
+import { ChevronLeftIcon } from '@heroicons/react/outline'
+import deepmerge from 'deepmerge'
+
import { Token } from '@/utils/types'
import { STAKABLE_TOKENS } from '@/constants/tokens'
import Grid from '@/components/ui/tailwind/Grid'
import { PageHeader } from '@/components/PageHeader'
import { LandingPageWrapper } from '@/components/layouts/LandingPageWrapper'
import StakeCard from './StakeCard'
-import { useRouter } from 'next/router'
import { segmentAnalyticsEvent } from '@/contexts/SegmentAnalyticsProvider'
-import Link from 'next/link'
import { POOLS_PATH } from '@/constants/urls'
-import { ChevronLeftIcon } from '@heroicons/react/outline'
-import toast from 'react-hot-toast'
+
+export async function getStaticProps({ locale }) {
+ const userMessages = (await import(`../../messages/${locale}.json`)).default
+ const defaultMessages = (await import(`../../messages/en-US.json`)).default
+ const messages = deepmerge(defaultMessages, userMessages)
+
+ return {
+ props: {
+ messages,
+ },
+ }
+}
const StakePage = () => {
const { chain: connectedChain } = useAccount()
@@ -20,6 +35,8 @@ const StakePage = () => {
const [isClient, setIsClient] = useState
(false)
const [columns, setColumns] = useState(1)
+ const t = useTranslations('Pools')
+
const router = useRouter()
const { query, pathname } = router
@@ -88,11 +105,11 @@ const StakePage = () => {
- Back to Pools
+ {t('Back to Pools')}
-
+
{isClient &&
diff --git a/packages/synapse-interface/pages/state-managed-bridge/index.tsx b/packages/synapse-interface/pages/state-managed-bridge/index.tsx
index df9e76925a..87f503de4f 100644
--- a/packages/synapse-interface/pages/state-managed-bridge/index.tsx
+++ b/packages/synapse-interface/pages/state-managed-bridge/index.tsx
@@ -10,6 +10,7 @@ import {
getPublicClient,
waitForTransactionReceipt,
} from '@wagmi/core'
+import { useTranslations } from 'next-intl'
import { InputContainer } from '@/components/StateManagedBridge/InputContainer'
import { OutputContainer } from '@/components/StateManagedBridge/OutputContainer'
@@ -54,13 +55,11 @@ import {
} from '@/slices/transactions/actions'
import { useAppDispatch } from '@/store/hooks'
import { RootState } from '@/store/store'
-import { calculateTimeBetween, getUnixTimeMinutesFromNow } from '@/utils/time'
+import { getUnixTimeMinutesFromNow } from '@/utils/time'
import { isTransactionReceiptError } from '@/utils/isTransactionReceiptError'
import { wagmiConfig } from '@/wagmiConfig'
import { useStaleQuoteUpdater } from '@/utils/hooks/useStaleQuoteUpdater'
-import { convertUuidToUnix } from '@/utils/convertUuidToUnix'
import { useMaintenance } from '@/components/Maintenance/Maintenance'
-import { getBridgeModuleNames } from '@/utils/getBridgeModuleNames'
import { screenAddress } from '@/utils/screenAddress'
import { useWalletState } from '@/slices/wallet/hooks'
import { useBridgeQuoteState } from '@/slices/bridgeQuote/hooks'
@@ -80,6 +79,8 @@ const StateManagedBridge = () => {
const quoteToastRef = useRef({ id: '' })
const quoteTimeout = 15000
+ const t = useTranslations('Bridge')
+
const [isTyping, setIsTyping] = useState(false)
const {
@@ -160,13 +161,31 @@ const StateManagedBridge = () => {
toast.dismiss(quoteToastRef.current.id)
if (fetchBridgeQuote.fulfilled.match(result)) {
- const message = `Route found for bridging ${debouncedFromValue} ${fromToken?.symbol} on ${CHAINS_BY_ID[fromChainId]?.name} to ${toToken.symbol} on ${CHAINS_BY_ID[toChainId]?.name}`
+ const message = t(
+ 'Route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}',
+ {
+ debouncedFromValue: debouncedFromValue,
+ fromToken: fromToken?.symbol,
+ fromChainId: CHAINS_BY_ID[fromChainId]?.name,
+ toToken: toToken?.symbol,
+ toChainId: CHAINS_BY_ID[toChainId]?.name,
+ }
+ )
quoteToastRef.current.id = toast(message, { duration: 3000 })
}
if (fetchBridgeQuote.rejected.match(result)) {
- const message = result.payload as string
+ const message = t(
+ 'No route found for bridging {debouncedFromValue} {fromToken} on {fromChainId} to {toToken} on {toChainId}',
+ {
+ debouncedFromValue: debouncedFromValue,
+ fromToken: fromToken?.symbol,
+ fromChainId: CHAINS_BY_ID[fromChainId]?.name,
+ toToken: toToken?.symbol,
+ toChainId: CHAINS_BY_ID[toChainId]?.name,
+ }
+ )
quoteToastRef.current.id = toast(message, { duration: 3000 })
}
@@ -348,8 +367,15 @@ const StateManagedBridge = () => {
const successToastContent = (
- Successfully initiated bridge from {fromToken?.symbol} on{' '}
- {originChainName} to {toToken.symbol} on {destinationChainName}
+ {t(
+ 'Succesfully initiated bridge from {fromToken} on {originChainName} to {toToken} on {destinationChainName}',
+ {
+ fromToken: fromToken?.symbol,
+ originChainName: originChainName,
+ toToken: toToken?.symbol,
+ destinationChainName: destinationChainName,
+ }
+ )}
{
{
const { address } = useAccount()
const { synapseSDK } = useSynapseContext()
@@ -54,6 +66,8 @@ const StateManagedSwap = () => {
const router = useRouter()
const { query, pathname } = router
+ const t = useTranslations('Swap')
+
const [isTyping, setIsTyping] = useState(false)
useSyncQueryParamsWithSwapState()
@@ -67,8 +81,6 @@ const StateManagedSwap = () => {
const {
isSwapPaused,
- pausedChainsList,
- pausedModulesList,
SwapMaintenanceProgressBar,
SwapMaintenanceWarningMessage,
} = useMaintenance()
@@ -190,7 +202,15 @@ const StateManagedSwap = () => {
toast.dismiss(quoteToastRef.current.id)
- const message = `Route found for swapping ${swapFromValue} ${swapFromToken.symbol} on ${CHAINS_BY_ID[swapChainId]?.name} to ${swapToToken.symbol}`
+ const message = `${t(
+ 'Route found for swapping {value} {fromSymbol} on {chain} to {toSymbol}',
+ {
+ value: swapFromValue,
+ fromSymbol: swapFromToken.symbol,
+ chain: CHAINS_BY_ID[swapChainId]?.name,
+ toSymbol: swapToToken.symbol,
+ }
+ )}`
console.log(message)
quoteToastRef.current.id = toast(message, { duration: 3000 })
@@ -258,11 +278,20 @@ const StateManagedSwap = () => {
dispatch(setIsWalletPending(true))
- let pendingPopup: any
- pendingPopup = toast(
- `Initiating swap from ${swapFromToken.symbol} to ${swapToToken.symbol} on ${currentChainName}`,
- { id: 'swap-in-progress-popup', duration: Infinity }
+ const msg = t(
+ 'Initiating swap from {fromSymbol} to {toSymbol} on {chain}',
+ {
+ fromSymbol: swapFromToken.symbol,
+ toSymbol: swapToToken.symbol,
+ chain: currentChainName,
+ }
)
+
+ let pendingPopup: any
+ pendingPopup = toast(msg, {
+ id: 'swap-in-progress-popup',
+ duration: Infinity,
+ })
segmentAnalyticsEvent(
`[Swap] initiates swap`,
{
@@ -291,10 +320,16 @@ const StateManagedSwap = () => {
const tx = await wallet.sendTransaction(payload)
const originChainName = CHAINS_BY_ID[swapChainId]?.name
- pendingPopup = toast(
- `Swapping ${swapFromToken.symbol} on ${originChainName} to ${swapToToken.symbol}`,
- { id: 'swap-in-progress-popup', duration: Infinity }
- )
+
+ const msg = t('Swapping {fromSymbol} on {chain} to {toSymbol}', {
+ fromSymbol: swapFromToken?.symbol,
+ chain: originChainName,
+ toSymbol: swapToToken?.symbol,
+ })
+ pendingPopup = toast(msg, {
+ id: 'swap-in-progress-popup',
+ duration: Infinity,
+ })
const transactionReceipt = await waitForTransactionReceipt(wagmiConfig, {
hash: tx as Address,
@@ -316,8 +351,14 @@ const StateManagedSwap = () => {
const successToastContent = (
- Successfully swapped from {swapFromToken.symbol} to{' '}
- {swapToToken.symbol} on {currentChainName}
+ {t(
+ 'Successfully swapped from {swapFromToken} to {swapToToken} on {currentChainName}',
+ {
+ swapFromToken: swapFromToken.symbol,
+ swapToToken: swapToToken.symbol,
+ currentChainName: currentChainName,
+ }
+ )}
{
diff --git a/packages/synapse-interface/scripts/checkTranslationJsons.js b/packages/synapse-interface/scripts/checkTranslationJsons.js
new file mode 100644
index 0000000000..b631dde54e
--- /dev/null
+++ b/packages/synapse-interface/scripts/checkTranslationJsons.js
@@ -0,0 +1,49 @@
+const fs = require('fs')
+const path = require('path')
+
+/***
+ This script compares /messages/{locale}.json files against en-US.json
+ and prints out key diffs.
+***/
+
+const enUSPath = path.join(__dirname, '../messages', 'en-US.json')
+const enUSContent = JSON.parse(fs.readFileSync(enUSPath, 'utf8'))
+
+const messagesDir = path.join(__dirname, '../messages')
+const files = fs
+ .readdirSync(messagesDir)
+ .filter((file) => file.endsWith('.json') && file !== 'en-US.json')
+
+const compareKeys = (obj1, obj2, path = '') => {
+ const differences = []
+
+ for (const key in obj1) {
+ if (!(key in obj2)) {
+ differences.push(`Missing key "${path}${key}" in compared file`)
+ } else if (typeof obj1[key] === 'object' && obj1[key] !== null) {
+ differences.push(...compareKeys(obj1[key], obj2[key], `${path}${key}.`))
+ }
+ }
+
+ for (const key in obj2) {
+ if (!(key in obj1)) {
+ differences.push(`Extra key "${path}${key}" in compared file`)
+ }
+ }
+
+ return differences
+}
+
+files.forEach((file) => {
+ const filePath = path.join(messagesDir, file)
+ const content = JSON.parse(fs.readFileSync(filePath, 'utf8'))
+
+ console.log(`\nChecking ${file}:`)
+ const differences = compareKeys(enUSContent, content)
+
+ if (differences.length === 0) {
+ console.log('All keys match en-US.json')
+ } else {
+ differences.forEach((diff) => console.log(diff))
+ }
+})
diff --git a/packages/synapse-interface/utils/actions/approveAndDeposit.tsx b/packages/synapse-interface/utils/actions/approveAndDeposit.tsx
index cf638fce4a..446c8ee1f0 100644
--- a/packages/synapse-interface/utils/actions/approveAndDeposit.tsx
+++ b/packages/synapse-interface/utils/actions/approveAndDeposit.tsx
@@ -1,22 +1,20 @@
import _ from 'lodash'
-
+import { zeroAddress } from 'viem'
import toast from 'react-hot-toast'
import { subtractSlippageBigInt } from '@utils/slippage'
import { getSwapDepositContractFields } from '@/utils/getSwapDepositContractFields'
-
import ExplorerToastLink from '@components/ExplorerToastLink'
-
import { CHAINS_BY_ID } from '@/constants/chains'
import { txErrorHandler } from '@utils/txErrorHandler'
import { WETHE, WETH } from '@constants/tokens/bridgeable'
import { AVWETH } from '@/constants/tokens/auxilliary'
import { approveToken } from '@utils/approveToken'
import { Token } from '@types'
-import { zeroAddress } from 'viem'
import { swapPoolCalculateTokenAmount } from '@/actions/swapPoolCalculateTokenAmount'
import { swapPoolAddLiquidity } from '@/actions/swapPoolAddLiquidity'
import { segmentAnalyticsEvent } from '@/contexts/SegmentAnalyticsProvider'
+import { TranslatedText } from '@/components/ui/TranslatedText'
export const approve = async (
pool: Token,
@@ -28,14 +26,15 @@ export const approve = async (
const { poolAddress, swapType } = getSwapDepositContractFields(pool, chainId)
- const requestingApprovalPopup = toast(
- `Requesting approval on ${currentChainName}`,
- {
- id: 'approve-in-progress-popup',
- duration: Infinity,
- }
+ const msg = (
+
)
+ const requestingApprovalPopup = toast(msg, {
+ id: 'approve-in-progress-popup',
+ duration: Infinity,
+ })
+
const handleApproval = async (token, tokenAddr) => {
if (
inputValue[tokenAddr] &&
@@ -68,7 +67,10 @@ export const approve = async (
toast.dismiss(requestingApprovalPopup)
const successToastContent = (
-
Successfully approved on {currentChainName}
+
+ {' '}
+ {currentChainName}
+
+ )
+
+ pendingPopup = toast(msg, {
id: 'deposit-in-progress-popup',
duration: Infinity,
})
@@ -171,7 +177,9 @@ export const deposit = async (
const successToastContent = (
-
Liquidity added!
+
+
+
+ )
+
+ pendingPopup = toast(msg, {
id: 'deposit-in-progress-popup',
duration: Infinity,
})
@@ -253,7 +265,9 @@ export const emptyPoolDeposit = async (
const successToastContent = (
-
Liquidity added!
+
+
+
+ )
+
+ pendingPopup = toast(msg, {
id: 'approve-in-progress-popup',
duration: Infinity,
})
@@ -42,7 +47,10 @@ export const approve = async (
const successToastContent = (
-
Successfully approved on {currentChainName}
+
+ {' '}
+ {currentChainName}
+
+ )
+
+ pendingPopup = toast(msg, {
id: 'deposit-in-progress-popup',
duration: Infinity,
})
@@ -105,7 +117,9 @@ export const stake = async (
const successToastContent = (
-
Stake Completed:
+
+ :
+
+ )
+
+ pendingPopup = toast(msg, {
id: 'withdraw-in-progress-popup',
duration: Infinity,
})
@@ -97,7 +102,9 @@ export const withdraw = async (
const successToastContent = (
-
Completed Withdrawal:
+
+ :
+
+ )
+
+ pendingPopup = toast(msg, {
id: 'claim-in-progress-popup',
duration: Infinity,
})
@@ -42,7 +47,9 @@ export const claimStake = async (
const successToastContent = (
-
Claim Completed:
+
+ :
+
- Withdraw completed:
+
+ :
+
+ )
+
+ pendingPopup = toast(msg, {
id: 'approve-in-progress-popup',
duration: Infinity,
})
@@ -48,7 +53,10 @@ export const approveToken = async (
})
const successToastContent = (
-
Successfully approved on {currentChainName}
+
+ {' '}
+ {currentChainName}
+
{
+ useEffect(() => {
+ const handleEscapeKey = (event) => {
+ if (event.key === 'Escape') {
+ onClose()
+ }
+ }
+
+ document.addEventListener('keydown', handleEscapeKey)
+
+ return () => {
+ document.removeEventListener('keydown', handleEscapeKey)
+ }
+ }, [onClose])
+}
diff --git a/yarn.lock b/yarn.lock
index f4f9efcc96..37f429bc81 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -422,16 +422,6 @@
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
-"@babel/generator@^7.25.6":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c"
- integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
- dependencies:
- "@babel/types" "^7.25.6"
- "@jridgewell/gen-mapping" "^0.3.5"
- "@jridgewell/trace-mapping" "^0.3.25"
- jsesc "^2.5.1"
-
"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
@@ -850,13 +840,6 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f"
integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==
-"@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
- integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
- dependencies:
- "@babel/types" "^7.25.6"
-
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895"
@@ -2015,15 +1998,6 @@
"@babel/parser" "^7.24.7"
"@babel/types" "^7.24.7"
-"@babel/template@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a"
- integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==
- dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/parser" "^7.25.0"
- "@babel/types" "^7.25.0"
-
"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.11.5", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.23.2", "@babel/traverse@^7.24.1", "@babel/traverse@^7.7.0":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
@@ -2072,19 +2046,6 @@
debug "^4.3.1"
globals "^11.1.0"
-"@babel/traverse@^7.7.2":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41"
- integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==
- dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.25.6"
- "@babel/parser" "^7.25.6"
- "@babel/template" "^7.25.0"
- "@babel/types" "^7.25.6"
- debug "^4.3.1"
- globals "^11.1.0"
-
"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
@@ -2112,15 +2073,6 @@
"@babel/helper-validator-identifier" "^7.24.7"
to-fast-properties "^2.0.0"
-"@babel/types@^7.25.0", "@babel/types@^7.25.6":
- version "7.25.6"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
- integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
- dependencies:
- "@babel/helper-string-parser" "^7.24.8"
- "@babel/helper-validator-identifier" "^7.24.7"
- to-fast-properties "^2.0.0"
-
"@base2/pretty-print-object@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4"
@@ -3938,6 +3890,45 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2"
integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
+"@formatjs/ecma402-abstract@2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz#39197ab90b1c78b7342b129a56a7acdb8f512e17"
+ integrity sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==
+ dependencies:
+ "@formatjs/intl-localematcher" "0.5.4"
+ tslib "^2.4.0"
+
+"@formatjs/fast-memoize@2.2.0", "@formatjs/fast-memoize@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b"
+ integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==
+ dependencies:
+ tslib "^2.4.0"
+
+"@formatjs/icu-messageformat-parser@2.7.8":
+ version "2.7.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz#f6d7643001e9bb5930d812f1f9a9856f30fa0343"
+ integrity sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.0.0"
+ "@formatjs/icu-skeleton-parser" "1.8.2"
+ tslib "^2.4.0"
+
+"@formatjs/icu-skeleton-parser@1.8.2":
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz#2252c949ae84ee66930e726130ea66731a123c9f"
+ integrity sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.0.0"
+ tslib "^2.4.0"
+
+"@formatjs/intl-localematcher@0.5.4", "@formatjs/intl-localematcher@^0.5.4":
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz#caa71f2e40d93e37d58be35cfffe57865f2b366f"
+ integrity sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==
+ dependencies:
+ tslib "^2.4.0"
+
"@gar/promisify@^1.0.1":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
@@ -4577,18 +4568,6 @@
jest-util "^25.5.0"
slash "^3.0.0"
-"@jest/console@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df"
- integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==
- dependencies:
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- chalk "^4.0.0"
- jest-message-util "^28.1.3"
- jest-util "^28.1.3"
- slash "^3.0.0"
-
"@jest/console@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc"
@@ -4635,41 +4614,6 @@
slash "^3.0.0"
strip-ansi "^6.0.0"
-"@jest/core@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7"
- integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==
- dependencies:
- "@jest/console" "^28.1.3"
- "@jest/reporters" "^28.1.3"
- "@jest/test-result" "^28.1.3"
- "@jest/transform" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- ansi-escapes "^4.2.1"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- exit "^0.1.2"
- graceful-fs "^4.2.9"
- jest-changed-files "^28.1.3"
- jest-config "^28.1.3"
- jest-haste-map "^28.1.3"
- jest-message-util "^28.1.3"
- jest-regex-util "^28.0.2"
- jest-resolve "^28.1.3"
- jest-resolve-dependencies "^28.1.3"
- jest-runner "^28.1.3"
- jest-runtime "^28.1.3"
- jest-snapshot "^28.1.3"
- jest-util "^28.1.3"
- jest-validate "^28.1.3"
- jest-watcher "^28.1.3"
- micromatch "^4.0.4"
- pretty-format "^28.1.3"
- rimraf "^3.0.0"
- slash "^3.0.0"
- strip-ansi "^6.0.0"
-
"@jest/core@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f"
@@ -4713,16 +4657,6 @@
"@jest/types" "^25.5.0"
jest-mock "^25.5.0"
-"@jest/environment@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e"
- integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==
- dependencies:
- "@jest/fake-timers" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- jest-mock "^28.1.3"
-
"@jest/environment@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7"
@@ -4733,13 +4667,6 @@
"@types/node" "*"
jest-mock "^29.7.0"
-"@jest/expect-utils@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525"
- integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==
- dependencies:
- jest-get-type "^28.0.2"
-
"@jest/expect-utils@^29.6.2", "@jest/expect-utils@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6"
@@ -4747,14 +4674,6 @@
dependencies:
jest-get-type "^29.6.3"
-"@jest/expect@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72"
- integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==
- dependencies:
- expect "^28.1.3"
- jest-snapshot "^28.1.3"
-
"@jest/expect@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2"
@@ -4774,18 +4693,6 @@
jest-util "^25.5.0"
lolex "^5.0.0"
-"@jest/fake-timers@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e"
- integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==
- dependencies:
- "@jest/types" "^28.1.3"
- "@sinonjs/fake-timers" "^9.1.2"
- "@types/node" "*"
- jest-message-util "^28.1.3"
- jest-mock "^28.1.3"
- jest-util "^28.1.3"
-
"@jest/fake-timers@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565"
@@ -4807,15 +4714,6 @@
"@jest/types" "^25.5.0"
expect "^25.5.0"
-"@jest/globals@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333"
- integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==
- dependencies:
- "@jest/environment" "^28.1.3"
- "@jest/expect" "^28.1.3"
- "@jest/types" "^28.1.3"
-
"@jest/globals@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d"
@@ -4858,37 +4756,6 @@
optionalDependencies:
node-notifier "^6.0.0"
-"@jest/reporters@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a"
- integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==
- dependencies:
- "@bcoe/v8-coverage" "^0.2.3"
- "@jest/console" "^28.1.3"
- "@jest/test-result" "^28.1.3"
- "@jest/transform" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@jridgewell/trace-mapping" "^0.3.13"
- "@types/node" "*"
- chalk "^4.0.0"
- collect-v8-coverage "^1.0.0"
- exit "^0.1.2"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- istanbul-lib-coverage "^3.0.0"
- istanbul-lib-instrument "^5.1.0"
- istanbul-lib-report "^3.0.0"
- istanbul-lib-source-maps "^4.0.0"
- istanbul-reports "^3.1.3"
- jest-message-util "^28.1.3"
- jest-util "^28.1.3"
- jest-worker "^28.1.3"
- slash "^3.0.0"
- string-length "^4.0.1"
- strip-ansi "^6.0.0"
- terminal-link "^2.0.0"
- v8-to-istanbul "^9.0.1"
-
"@jest/reporters@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7"
@@ -4919,13 +4786,6 @@
strip-ansi "^6.0.0"
v8-to-istanbul "^9.0.1"
-"@jest/schemas@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905"
- integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==
- dependencies:
- "@sinclair/typebox" "^0.24.1"
-
"@jest/schemas@^29.6.3":
version "29.6.3"
resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
@@ -4942,15 +4802,6 @@
graceful-fs "^4.2.4"
source-map "^0.6.0"
-"@jest/source-map@^28.1.2":
- version "28.1.2"
- resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24"
- integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.13"
- callsites "^3.0.0"
- graceful-fs "^4.2.9"
-
"@jest/source-map@^29.6.3":
version "29.6.3"
resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4"
@@ -4970,16 +4821,6 @@
"@types/istanbul-lib-coverage" "^2.0.0"
collect-v8-coverage "^1.0.0"
-"@jest/test-result@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5"
- integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==
- dependencies:
- "@jest/console" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/istanbul-lib-coverage" "^2.0.0"
- collect-v8-coverage "^1.0.0"
-
"@jest/test-result@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c"
@@ -5001,16 +4842,6 @@
jest-runner "^25.5.4"
jest-runtime "^25.5.4"
-"@jest/test-sequencer@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3"
- integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==
- dependencies:
- "@jest/test-result" "^28.1.3"
- graceful-fs "^4.2.9"
- jest-haste-map "^28.1.3"
- slash "^3.0.0"
-
"@jest/test-sequencer@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce"
@@ -5064,27 +4895,6 @@
source-map "^0.6.1"
write-file-atomic "^3.0.0"
-"@jest/transform@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0"
- integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==
- dependencies:
- "@babel/core" "^7.11.6"
- "@jest/types" "^28.1.3"
- "@jridgewell/trace-mapping" "^0.3.13"
- babel-plugin-istanbul "^6.1.1"
- chalk "^4.0.0"
- convert-source-map "^1.4.0"
- fast-json-stable-stringify "^2.0.0"
- graceful-fs "^4.2.9"
- jest-haste-map "^28.1.3"
- jest-regex-util "^28.0.2"
- jest-util "^28.1.3"
- micromatch "^4.0.4"
- pirates "^4.0.4"
- slash "^3.0.0"
- write-file-atomic "^4.0.1"
-
"@jest/transform@^29.7.0":
version "29.7.0"
resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c"
@@ -5147,18 +4957,6 @@
"@types/yargs" "^16.0.0"
chalk "^4.0.0"
-"@jest/types@^28.1.3":
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b"
- integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==
- dependencies:
- "@jest/schemas" "^28.1.3"
- "@types/istanbul-lib-coverage" "^2.0.0"
- "@types/istanbul-reports" "^3.0.0"
- "@types/node" "*"
- "@types/yargs" "^17.0.8"
- chalk "^4.0.0"
-
"@jest/types@^29.6.3":
version "29.6.3"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59"
@@ -5211,7 +5009,7 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
-"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
version "0.3.25"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
@@ -7556,11 +7354,6 @@
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718"
integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==
-"@sinclair/typebox@^0.24.1":
- version "0.24.51"
- resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f"
- integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==
-
"@sinclair/typebox@^0.27.8":
version "0.27.8"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
@@ -7607,13 +7400,6 @@
dependencies:
"@sinonjs/commons" "^3.0.0"
-"@sinonjs/fake-timers@^9.1.2":
- version "9.1.2"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c"
- integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==
- dependencies:
- "@sinonjs/commons" "^1.7.0"
-
"@slorber/remark-comment@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a"
@@ -9790,6 +9576,14 @@
dependencies:
tslib "^2.4.0"
+"@synapsecns/coverage-aggregator@file:./packages/coverage-aggregator":
+ version "1.0.6"
+ dependencies:
+ glob "^8.0.3"
+ path "^0.12.7"
+ ts-jest "^29.0.5"
+ yargs "^17.6.2"
+
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
@@ -10684,7 +10478,7 @@
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f"
integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==
-"@types/prettier@^2.1.1", "@types/prettier@^2.1.5":
+"@types/prettier@^2.1.1":
version "2.7.3"
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
@@ -13258,19 +13052,6 @@ babel-jest@^25.2.6, babel-jest@^25.5.1:
graceful-fs "^4.2.4"
slash "^3.0.0"
-babel-jest@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5"
- integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==
- dependencies:
- "@jest/transform" "^28.1.3"
- "@types/babel__core" "^7.1.14"
- babel-plugin-istanbul "^6.1.1"
- babel-preset-jest "^28.1.3"
- chalk "^4.0.0"
- graceful-fs "^4.2.9"
- slash "^3.0.0"
-
babel-jest@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5"
@@ -13375,16 +13156,6 @@ babel-plugin-jest-hoist@^25.5.0:
"@babel/types" "^7.3.3"
"@types/babel__traverse" "^7.0.6"
-babel-plugin-jest-hoist@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe"
- integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==
- dependencies:
- "@babel/template" "^7.3.3"
- "@babel/types" "^7.3.3"
- "@types/babel__core" "^7.1.14"
- "@types/babel__traverse" "^7.0.6"
-
babel-plugin-jest-hoist@^29.6.3:
version "29.6.3"
resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626"
@@ -13577,14 +13348,6 @@ babel-preset-jest@^25.5.0:
babel-plugin-jest-hoist "^25.5.0"
babel-preset-current-node-syntax "^0.1.2"
-babel-preset-jest@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d"
- integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==
- dependencies:
- babel-plugin-jest-hoist "^28.1.3"
- babel-preset-current-node-syntax "^1.0.0"
-
babel-preset-jest@^29.6.3:
version "29.6.3"
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c"
@@ -17046,11 +16809,6 @@ diff-sequences@^25.2.6:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd"
integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==
-diff-sequences@^28.1.1:
- version "28.1.1"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6"
- integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==
-
diff-sequences@^29.6.3:
version "29.6.3"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
@@ -17491,11 +17249,6 @@ elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4, elliptic@^6.
minimalistic-assert "^1.0.1"
minimalistic-crypto-utils "^1.0.1"
-emittery@^0.10.2:
- version "0.10.2"
- resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933"
- integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==
-
emittery@^0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
@@ -18278,6 +18031,14 @@ eslint-plugin-flowtype@^3.13.0:
dependencies:
lodash "^4.17.15"
+eslint-plugin-i18next@^6.0.9:
+ version "6.0.9"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-i18next/-/eslint-plugin-i18next-6.0.9.tgz#94edf918b6a686c9f352a5ed97043259d0fe90fb"
+ integrity sha512-tAof/p58sN4Az+P6kqu+RijqddalHhz0X6fe+exyBJAUvN9Yk1plOKl8XMySCIQS+vnRWbzzThgHXeDe++uEXQ==
+ dependencies:
+ lodash "^4.17.21"
+ requireindex "~1.1.0"
+
eslint-plugin-import@^2.18.2, eslint-plugin-import@^2.26.0, eslint-plugin-import@^2.28.1:
version "2.29.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643"
@@ -19276,17 +19037,6 @@ expect@^25.5.0:
jest-message-util "^25.5.0"
jest-regex-util "^25.2.6"
-expect@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec"
- integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==
- dependencies:
- "@jest/expect-utils" "^28.1.3"
- jest-get-type "^28.0.2"
- jest-matcher-utils "^28.1.3"
- jest-message-util "^28.1.3"
- jest-util "^28.1.3"
-
expect@^29.0.0:
version "29.6.2"
resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.2.tgz#7b08e83eba18ddc4a2cf62b5f2d1918f5cd84521"
@@ -22369,6 +22119,16 @@ interpret@^3.1.1:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4"
integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==
+intl-messageformat@^10.5.14:
+ version "10.5.14"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.14.tgz#e5bb373f8a37b88fbe647d7b941f3ab2a37ed00a"
+ integrity sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.0.0"
+ "@formatjs/fast-memoize" "2.2.0"
+ "@formatjs/icu-messageformat-parser" "2.7.8"
+ tslib "^2.4.0"
+
into-stream@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
@@ -23195,7 +22955,7 @@ istanbul-lib-instrument@^4.0.0:
istanbul-lib-coverage "^3.0.0"
semver "^6.3.0"
-istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
+istanbul-lib-instrument@^5.0.4:
version "5.2.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
@@ -23313,14 +23073,6 @@ jest-changed-files@^25.5.0:
execa "^3.2.0"
throat "^5.0.0"
-jest-changed-files@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831"
- integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==
- dependencies:
- execa "^5.0.0"
- p-limit "^3.1.0"
-
jest-changed-files@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a"
@@ -23330,31 +23082,6 @@ jest-changed-files@^29.7.0:
jest-util "^29.7.0"
p-limit "^3.1.0"
-jest-circus@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4"
- integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==
- dependencies:
- "@jest/environment" "^28.1.3"
- "@jest/expect" "^28.1.3"
- "@jest/test-result" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- chalk "^4.0.0"
- co "^4.6.0"
- dedent "^0.7.0"
- is-generator-fn "^2.0.0"
- jest-each "^28.1.3"
- jest-matcher-utils "^28.1.3"
- jest-message-util "^28.1.3"
- jest-runtime "^28.1.3"
- jest-snapshot "^28.1.3"
- jest-util "^28.1.3"
- p-limit "^3.1.0"
- pretty-format "^28.1.3"
- slash "^3.0.0"
- stack-utils "^2.0.3"
-
jest-circus@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a"
@@ -23401,24 +23128,6 @@ jest-cli@^25.5.4:
realpath-native "^2.0.0"
yargs "^15.3.1"
-jest-cli@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2"
- integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==
- dependencies:
- "@jest/core" "^28.1.3"
- "@jest/test-result" "^28.1.3"
- "@jest/types" "^28.1.3"
- chalk "^4.0.0"
- exit "^0.1.2"
- graceful-fs "^4.2.9"
- import-local "^3.0.2"
- jest-config "^28.1.3"
- jest-util "^28.1.3"
- jest-validate "^28.1.3"
- prompts "^2.0.1"
- yargs "^17.3.1"
-
jest-cli@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995"
@@ -23461,34 +23170,6 @@ jest-config@^25.5.4:
pretty-format "^25.5.0"
realpath-native "^2.0.0"
-jest-config@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60"
- integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==
- dependencies:
- "@babel/core" "^7.11.6"
- "@jest/test-sequencer" "^28.1.3"
- "@jest/types" "^28.1.3"
- babel-jest "^28.1.3"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- deepmerge "^4.2.2"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- jest-circus "^28.1.3"
- jest-environment-node "^28.1.3"
- jest-get-type "^28.0.2"
- jest-regex-util "^28.0.2"
- jest-resolve "^28.1.3"
- jest-runner "^28.1.3"
- jest-util "^28.1.3"
- jest-validate "^28.1.3"
- micromatch "^4.0.4"
- parse-json "^5.2.0"
- pretty-format "^28.1.3"
- slash "^3.0.0"
- strip-json-comments "^3.1.1"
-
jest-config@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f"
@@ -23537,16 +23218,6 @@ jest-diff@^25.2.1, jest-diff@^25.5.0:
jest-get-type "^25.2.6"
pretty-format "^25.5.0"
-jest-diff@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f"
- integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==
- dependencies:
- chalk "^4.0.0"
- diff-sequences "^28.1.1"
- jest-get-type "^28.0.2"
- pretty-format "^28.1.3"
-
jest-diff@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
@@ -23564,13 +23235,6 @@ jest-docblock@^25.3.0:
dependencies:
detect-newline "^3.0.0"
-jest-docblock@^28.1.1:
- version "28.1.1"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8"
- integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==
- dependencies:
- detect-newline "^3.0.0"
-
jest-docblock@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a"
@@ -23589,17 +23253,6 @@ jest-each@^25.5.0:
jest-util "^25.5.0"
pretty-format "^25.5.0"
-jest-each@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81"
- integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==
- dependencies:
- "@jest/types" "^28.1.3"
- chalk "^4.0.0"
- jest-get-type "^28.0.2"
- jest-util "^28.1.3"
- pretty-format "^28.1.3"
-
jest-each@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1"
@@ -23635,18 +23288,6 @@ jest-environment-node@^25.5.0:
jest-util "^25.5.0"
semver "^6.3.0"
-jest-environment-node@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5"
- integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==
- dependencies:
- "@jest/environment" "^28.1.3"
- "@jest/fake-timers" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- jest-mock "^28.1.3"
- jest-util "^28.1.3"
-
jest-environment-node@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376"
@@ -23677,11 +23318,6 @@ jest-get-type@^25.2.6:
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877"
integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==
-jest-get-type@^28.0.2:
- version "28.0.2"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203"
- integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==
-
jest-get-type@^29.4.3, jest-get-type@^29.6.3:
version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
@@ -23728,25 +23364,6 @@ jest-haste-map@^26.6.2:
optionalDependencies:
fsevents "^2.1.2"
-jest-haste-map@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b"
- integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==
- dependencies:
- "@jest/types" "^28.1.3"
- "@types/graceful-fs" "^4.1.3"
- "@types/node" "*"
- anymatch "^3.0.3"
- fb-watchman "^2.0.0"
- graceful-fs "^4.2.9"
- jest-regex-util "^28.0.2"
- jest-util "^28.1.3"
- jest-worker "^28.1.3"
- micromatch "^4.0.4"
- walker "^1.0.8"
- optionalDependencies:
- fsevents "^2.3.2"
-
jest-haste-map@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104"
@@ -23797,14 +23414,6 @@ jest-leak-detector@^25.5.0:
jest-get-type "^25.2.6"
pretty-format "^25.5.0"
-jest-leak-detector@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d"
- integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==
- dependencies:
- jest-get-type "^28.0.2"
- pretty-format "^28.1.3"
-
jest-leak-detector@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728"
@@ -23823,16 +23432,6 @@ jest-matcher-utils@^25.5.0:
jest-get-type "^25.2.6"
pretty-format "^25.5.0"
-jest-matcher-utils@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e"
- integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==
- dependencies:
- chalk "^4.0.0"
- jest-diff "^28.1.3"
- jest-get-type "^28.0.2"
- pretty-format "^28.1.3"
-
jest-matcher-utils@^29.6.2, jest-matcher-utils@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
@@ -23857,21 +23456,6 @@ jest-message-util@^25.5.0:
slash "^3.0.0"
stack-utils "^1.0.1"
-jest-message-util@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d"
- integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==
- dependencies:
- "@babel/code-frame" "^7.12.13"
- "@jest/types" "^28.1.3"
- "@types/stack-utils" "^2.0.0"
- chalk "^4.0.0"
- graceful-fs "^4.2.9"
- micromatch "^4.0.4"
- pretty-format "^28.1.3"
- slash "^3.0.0"
- stack-utils "^2.0.3"
-
jest-message-util@^29.6.2, jest-message-util@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3"
@@ -23909,14 +23493,6 @@ jest-mock@^27.0.6:
"@jest/types" "^27.5.1"
"@types/node" "*"
-jest-mock@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da"
- integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==
- dependencies:
- "@jest/types" "^28.1.3"
- "@types/node" "*"
-
jest-mock@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347"
@@ -23941,11 +23517,6 @@ jest-regex-util@^26.0.0:
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
-jest-regex-util@^28.0.2:
- version "28.0.2"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead"
- integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==
-
jest-regex-util@^29.6.3:
version "29.6.3"
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52"
@@ -23960,14 +23531,6 @@ jest-resolve-dependencies@^25.5.4:
jest-regex-util "^25.2.6"
jest-snapshot "^25.5.1"
-jest-resolve-dependencies@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66"
- integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==
- dependencies:
- jest-regex-util "^28.0.2"
- jest-snapshot "^28.1.3"
-
jest-resolve-dependencies@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428"
@@ -23991,21 +23554,6 @@ jest-resolve@^25.5.1:
resolve "^1.17.0"
slash "^3.0.0"
-jest-resolve@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8"
- integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==
- dependencies:
- chalk "^4.0.0"
- graceful-fs "^4.2.9"
- jest-haste-map "^28.1.3"
- jest-pnp-resolver "^1.2.2"
- jest-util "^28.1.3"
- jest-validate "^28.1.3"
- resolve "^1.20.0"
- resolve.exports "^1.1.0"
- slash "^3.0.0"
-
jest-resolve@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30"
@@ -24046,33 +23594,6 @@ jest-runner@^25.5.4:
source-map-support "^0.5.6"
throat "^5.0.0"
-jest-runner@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1"
- integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==
- dependencies:
- "@jest/console" "^28.1.3"
- "@jest/environment" "^28.1.3"
- "@jest/test-result" "^28.1.3"
- "@jest/transform" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- chalk "^4.0.0"
- emittery "^0.10.2"
- graceful-fs "^4.2.9"
- jest-docblock "^28.1.1"
- jest-environment-node "^28.1.3"
- jest-haste-map "^28.1.3"
- jest-leak-detector "^28.1.3"
- jest-message-util "^28.1.3"
- jest-resolve "^28.1.3"
- jest-runtime "^28.1.3"
- jest-util "^28.1.3"
- jest-watcher "^28.1.3"
- jest-worker "^28.1.3"
- p-limit "^3.1.0"
- source-map-support "0.5.13"
-
jest-runner@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e"
@@ -24132,34 +23653,6 @@ jest-runtime@^25.5.4:
strip-bom "^4.0.0"
yargs "^15.3.1"
-jest-runtime@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f"
- integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==
- dependencies:
- "@jest/environment" "^28.1.3"
- "@jest/fake-timers" "^28.1.3"
- "@jest/globals" "^28.1.3"
- "@jest/source-map" "^28.1.2"
- "@jest/test-result" "^28.1.3"
- "@jest/transform" "^28.1.3"
- "@jest/types" "^28.1.3"
- chalk "^4.0.0"
- cjs-module-lexer "^1.0.0"
- collect-v8-coverage "^1.0.0"
- execa "^5.0.0"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- jest-haste-map "^28.1.3"
- jest-message-util "^28.1.3"
- jest-mock "^28.1.3"
- jest-regex-util "^28.0.2"
- jest-resolve "^28.1.3"
- jest-snapshot "^28.1.3"
- jest-util "^28.1.3"
- slash "^3.0.0"
- strip-bom "^4.0.0"
-
jest-runtime@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817"
@@ -24224,35 +23717,6 @@ jest-snapshot@^25.5.1:
pretty-format "^25.5.0"
semver "^6.3.0"
-jest-snapshot@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668"
- integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==
- dependencies:
- "@babel/core" "^7.11.6"
- "@babel/generator" "^7.7.2"
- "@babel/plugin-syntax-typescript" "^7.7.2"
- "@babel/traverse" "^7.7.2"
- "@babel/types" "^7.3.3"
- "@jest/expect-utils" "^28.1.3"
- "@jest/transform" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/babel__traverse" "^7.0.6"
- "@types/prettier" "^2.1.5"
- babel-preset-current-node-syntax "^1.0.0"
- chalk "^4.0.0"
- expect "^28.1.3"
- graceful-fs "^4.2.9"
- jest-diff "^28.1.3"
- jest-get-type "^28.0.2"
- jest-haste-map "^28.1.3"
- jest-matcher-utils "^28.1.3"
- jest-message-util "^28.1.3"
- jest-util "^28.1.3"
- natural-compare "^1.4.0"
- pretty-format "^28.1.3"
- semver "^7.3.5"
-
jest-snapshot@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5"
@@ -24302,18 +23766,6 @@ jest-util@^26.6.2:
is-ci "^2.0.0"
micromatch "^4.0.2"
-jest-util@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0"
- integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==
- dependencies:
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- graceful-fs "^4.2.9"
- picomatch "^2.2.3"
-
jest-util@^29.0.0, jest-util@^29.6.2, jest-util@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc"
@@ -24338,18 +23790,6 @@ jest-validate@^25.5.0:
leven "^3.1.0"
pretty-format "^25.5.0"
-jest-validate@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df"
- integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==
- dependencies:
- "@jest/types" "^28.1.3"
- camelcase "^6.2.0"
- chalk "^4.0.0"
- jest-get-type "^28.0.2"
- leven "^3.1.0"
- pretty-format "^28.1.3"
-
jest-validate@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c"
@@ -24387,20 +23827,6 @@ jest-watcher@^25.2.4, jest-watcher@^25.5.0:
jest-util "^25.5.0"
string-length "^3.1.0"
-jest-watcher@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4"
- integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==
- dependencies:
- "@jest/test-result" "^28.1.3"
- "@jest/types" "^28.1.3"
- "@types/node" "*"
- ansi-escapes "^4.2.1"
- chalk "^4.0.0"
- emittery "^0.10.2"
- jest-util "^28.1.3"
- string-length "^4.0.1"
-
jest-watcher@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2"
@@ -24449,15 +23875,6 @@ jest-worker@^27.4.5:
merge-stream "^2.0.0"
supports-color "^8.0.0"
-jest-worker@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98"
- integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==
- dependencies:
- "@types/node" "*"
- merge-stream "^2.0.0"
- supports-color "^8.0.0"
-
jest-worker@^29.1.2, jest-worker@^29.4.3, jest-worker@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a"
@@ -24477,16 +23894,6 @@ jest@^25.3.0:
import-local "^3.0.2"
jest-cli "^25.5.4"
-jest@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b"
- integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==
- dependencies:
- "@jest/core" "^28.1.3"
- "@jest/types" "^28.1.3"
- import-local "^3.0.2"
- jest-cli "^28.1.3"
-
jest@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613"
@@ -27711,7 +27118,7 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-negotiator@0.6.3, negotiator@^0.6.2:
+negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
@@ -27733,6 +27140,15 @@ new-date@^1.0.3:
dependencies:
"@segment/isodate" "1.0.3"
+next-intl@^3.19.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/next-intl/-/next-intl-3.19.0.tgz#2c5f43f0f547f6ff19b0ec818b78fd92c67cabf8"
+ integrity sha512-ciiHYBwR3ztoMdJZgFmt0LII7GYTsLA/MFt3y681q4Lw4fI5EYNCZSYb9XA/BIt3ZX5S1TLUP1uOERy1dIQvMg==
+ dependencies:
+ "@formatjs/intl-localematcher" "^0.5.4"
+ negotiator "^0.6.3"
+ use-intl "^3.19.0"
+
next-tick@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
@@ -30473,16 +29889,6 @@ pretty-format@^27.0.2:
ansi-styles "^5.0.0"
react-is "^17.0.1"
-pretty-format@^28.1.3:
- version "28.1.3"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5"
- integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==
- dependencies:
- "@jest/schemas" "^28.1.3"
- ansi-regex "^5.0.1"
- ansi-styles "^5.0.0"
- react-is "^18.0.0"
-
pretty-format@^29.0.0, pretty-format@^29.7.0:
version "29.7.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
@@ -32202,6 +31608,11 @@ require-package-name@^2.0.1:
resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9"
integrity sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==
+requireindex@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162"
+ integrity sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==
+
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@@ -32267,11 +31678,6 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
-resolve.exports@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999"
- integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==
-
resolve.exports@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800"
@@ -36534,6 +35940,14 @@ use-editable@^2.3.3:
resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f"
integrity sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==
+use-intl@^3.19.0:
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/use-intl/-/use-intl-3.19.0.tgz#ea05d41617b1a5fe67066a556d31207cf37f4d6d"
+ integrity sha512-JOA73+YdtArxkvFKrneLAhH55m+x+sA9Wj8w8rYkHkHvcW/76w5T3szSmBG063vH3UqLoIKlsDVBBUfpkB7GMg==
+ dependencies:
+ "@formatjs/fast-memoize" "^2.2.0"
+ intl-messageformat "^10.5.14"
+
use-persisted-state@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/use-persisted-state/-/use-persisted-state-0.3.3.tgz#5e0f2236967cec7c34de33abc07ae6818e7c7451"
@@ -38318,7 +37732,7 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
-write-file-atomic@^4.0.1, write-file-atomic@^4.0.2:
+write-file-atomic@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==