diff --git a/.oxlintrc.json b/.oxlintrc.json index 3c04d76c7..b924f0238 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,7 +1,16 @@ { "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json", - "plugins": ["react", "typescript", "jsx-a11y", "unicorn"], - "jsPlugins": ["eslint-plugin-i18next", "eslint-plugin-file-component-constraints", "eslint-plugin-unused-imports"], + "plugins": [ + "react", + "typescript", + "jsx-a11y", + "unicorn" + ], + "jsPlugins": [ + "eslint-plugin-i18next", + "eslint-plugin-file-component-constraints", + "eslint-plugin-unused-imports" + ], "categories": { "correctness": "warn", "suspicious": "warn", @@ -19,7 +28,6 @@ "eqeqeq": "error", "no-var": "error", "prefer-const": "warn", - "react/react-in-jsx-scope": "off", "react/jsx-key": "error", "react/no-direct-mutation-state": "error", @@ -28,40 +36,43 @@ "react/jsx-no-useless-fragment": "warn", "react/jsx-curly-brace-presence": "warn", "react/no-array-index-key": "warn", - "typescript/no-explicit-any": "error", "typescript/prefer-ts-expect-error": "warn", "typescript/no-non-null-assertion": "warn", "typescript/consistent-type-imports": "error", - "jsx-a11y/alt-text": "warn", "jsx-a11y/anchor-is-valid": "warn", - "unicorn/no-null": "off", "unicorn/prefer-query-selector": "off", "unicorn/require-module-specifiers": "off", - "file-component-constraints/enforce": [ "error", { "rules": [ { "fileMatch": "**/sheets/Miniapp*.tsx", - "mustUse": ["MiniappSheetHeader"], + "mustUse": [ + "MiniappSheetHeader" + ], "mustImportFrom": { - "MiniappSheetHeader": ["@/components/ecosystem"] + "MiniappSheetHeader": [ + "@/components/ecosystem" + ] } } ] } ], - "i18next/no-literal-string": [ - "warn", + "error", { "mode": "jsx-only", "jsx-components": { - "exclude": ["Trans", "Icon", "TablerIcon"] + "exclude": [ + "Trans", + "Icon", + "TablerIcon" + ] }, "jsx-attributes": { "exclude": [ @@ -275,7 +286,18 @@ "^:$", "^:$", "^daysAgo$", - "^yesterday$" + "^yesterday$", + "^°$", + "^9\\+$", + "two-step-error", + "two-step-secret-error", + "Chain not supported", + "^Chain:", + "^Address:", + "^loading$", + "loading...", + "^--$", + "^≈ --$" ] } } @@ -314,4 +336,4 @@ "version": "19" } } -} +} \ No newline at end of file diff --git a/packages/key-ui/src/qr-code/QRCode.tsx b/packages/key-ui/src/qr-code/QRCode.tsx index ec469dd03..3241f670b 100644 --- a/packages/key-ui/src/qr-code/QRCode.tsx +++ b/packages/key-ui/src/qr-code/QRCode.tsx @@ -34,11 +34,11 @@ export function QRCode({ {renderFn ? ( renderFn({ value, size, level }) ) : ( -
- QR: {value.slice(0, 20)}... + {value.slice(0, 20)}...
)} {logoUrl && ( diff --git a/scripts/i18n-check.ts b/scripts/i18n-check.ts index df9ed63a5..e44cc135e 100644 --- a/scripts/i18n-check.ts +++ b/scripts/i18n-check.ts @@ -68,6 +68,7 @@ interface CheckResult { locale: string missing: string[] extra: string[] + untranslated: string[] // Keys with [MISSING:xx] placeholder } // ==================== Utilities ==================== @@ -92,6 +93,25 @@ function extractKeys(obj: TranslationFile, prefix = ''): string[] { return keys } +/** + * Find keys with [MISSING:xx] placeholder values + */ +function findUntranslatedKeys(obj: TranslationFile, prefix = ''): string[] { + const untranslated: string[] = [] + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}.${key}` : key + + if (typeof value === 'object' && value !== null) { + untranslated.push(...findUntranslatedKeys(value as TranslationFile, fullKey)) + } else if (typeof value === 'string' && value.startsWith('[MISSING:')) { + untranslated.push(fullKey) + } + } + + return untranslated +} + /** * Get value at a nested path */ @@ -206,6 +226,7 @@ function checkNamespace(namespace: string, fix: boolean, verbose: boolean): Chec locale, missing: [...refKeys], extra: [], + untranslated: [], }) continue } @@ -214,21 +235,23 @@ function checkNamespace(namespace: string, fix: boolean, verbose: boolean): Chec const localeKeys = new Set(extractKeys(localeData)) const diff = compareKeys(refKeys, localeKeys) + const untranslated = findUntranslatedKeys(localeData) - if (diff.missing.length > 0 || diff.extra.length > 0) { + if (diff.missing.length > 0 || diff.extra.length > 0 || untranslated.length > 0) { results.push({ namespace, locale, missing: diff.missing, extra: diff.extra, + untranslated, }) // Fix missing keys if requested if (fix && diff.missing.length > 0) { for (const key of diff.missing) { const refValue = getNestedValue(refData, key) - const placeholder = typeof refValue === 'string' - ? `[MISSING:${locale}] ${refValue}` + const placeholder = typeof refValue === 'string' + ? `[MISSING:${locale}] ${refValue}` : refValue setNestedValue(localeData, key, placeholder as TranslationValue) } @@ -277,8 +300,9 @@ ${colors.cyan}╔═════════════════════ const hasMissingKeys = allResults.some((r) => r.missing.length > 0) const hasExtraKeys = allResults.some((r) => r.extra.length > 0) + const hasUntranslated = allResults.some((r) => r.untranslated.length > 0) - if (!hasMissingKeys && !hasExtraKeys) { + if (!hasMissingKeys && !hasExtraKeys && !hasUntranslated) { log.success('All translations are complete!') console.log(` ${colors.green}✓ All ${namespaces.length} namespaces checked across ${LOCALES.length} locales${colors.reset} @@ -297,15 +321,18 @@ ${colors.green}✓ All ${namespaces.length} namespaces checked across ${LOCALES. let totalMissing = 0 let totalExtra = 0 + let totalUntranslated = 0 for (const [locale, results] of byLocale) { const missingCount = results.reduce((sum, r) => sum + r.missing.length, 0) const extraCount = results.reduce((sum, r) => sum + r.extra.length, 0) + const untranslatedCount = results.reduce((sum, r) => sum + r.untranslated.length, 0) - if (missingCount === 0 && extraCount === 0) continue + if (missingCount === 0 && extraCount === 0 && untranslatedCount === 0) continue totalMissing += missingCount totalExtra += extraCount + totalUntranslated += untranslatedCount console.log(`\n${colors.bold}${locale}${colors.reset}`) @@ -329,26 +356,40 @@ ${colors.green}✓ All ${namespaces.length} namespaces checked across ${LOCALES. log.dim(` ... and ${result.extra.length - 3} more`) } } + + if (result.untranslated.length > 0) { + log.error(`${result.namespace}.json: ${result.untranslated.length} untranslated keys ([MISSING:] placeholders)`) + for (const key of result.untranslated.slice(0, 5)) { + log.dim(`! ${key}`) + } + if (result.untranslated.length > 5) { + log.dim(` ... and ${result.untranslated.length - 5} more`) + } + } } } - if (totalMissing > 0) { + if (totalMissing > 0 || totalUntranslated > 0) { console.log(` ${colors.red}✗ Found issues:${colors.reset} - ${colors.red}Missing: ${totalMissing} keys${colors.reset} + ${totalMissing > 0 ? `${colors.red}Missing: ${totalMissing} keys${colors.reset}` : ''} + ${totalUntranslated > 0 ? `${colors.red}Untranslated: ${totalUntranslated} keys (have [MISSING:] placeholder)${colors.reset}` : ''} ${colors.yellow}Extra: ${totalExtra} keys${colors.reset} `) - if (!fix) { + if (!fix && totalMissing > 0) { log.info(`Run with ${colors.cyan}--fix${colors.reset} to add missing keys with placeholder values`) } + if (totalUntranslated > 0) { + log.info(`Fix [MISSING:xx] placeholders by providing actual translations`) + } process.exit(1) } // Only extra keys - warn but don't fail console.log(` -${colors.green}✓ No missing translations${colors.reset} +${colors.green}✓ No missing or untranslated keys${colors.reset} ${colors.yellow}Extra: ${totalExtra} keys (not in reference, can be cleaned up)${colors.reset} `) } diff --git a/src/components/contact/contact-card.tsx b/src/components/contact/contact-card.tsx index 10a5034f9..a4f78bfe4 100644 --- a/src/components/contact/contact-card.tsx +++ b/src/components/contact/contact-card.tsx @@ -4,12 +4,12 @@ */ import { QRCodeSVG } from 'qrcode.react'; -import { useTranslation } from 'react-i18next'; import { ContactAvatar } from '@/components/common/contact-avatar'; import { generateAvatarFromAddress } from '@/lib/avatar-codec'; import { detectAddressFormat } from '@/lib/address-format'; import type { ContactAddressInfo } from '@/lib/qr-parser'; import { isBioforestChain } from '@/lib/crypto'; +import { useTranslation } from 'react-i18next'; /** Address format standard colors */ const ADDRESS_FORMAT_COLORS = { diff --git a/src/components/ecosystem/app-stack-page.tsx b/src/components/ecosystem/app-stack-page.tsx index 4d0f01c79..a936bd6f0 100644 --- a/src/components/ecosystem/app-stack-page.tsx +++ b/src/components/ecosystem/app-stack-page.tsx @@ -1,13 +1,7 @@ -/** - * AppStackPage - 应用堆栈页面 - * - * Swiper 的第三页,作为小程序窗口的背景板 - * 当没有激活应用时,此页禁用滑动 - */ - import { useCallback } from 'react' import { useStore } from '@tanstack/react-store' import { cn } from '@/lib/utils' +import { useTranslation } from 'react-i18next' import { miniappRuntimeStore, miniappRuntimeSelectors, @@ -20,6 +14,7 @@ export interface AppStackPageProps { } export function AppStackPage({ className }: AppStackPageProps) { + const { t } = useTranslation('ecosystem') const hasRunningApps = useStore( miniappRuntimeStore, miniappRuntimeSelectors.hasRunningApps @@ -48,7 +43,7 @@ export function AppStackPage({ className }: AppStackPageProps) { {/* 空状态提示(调试用,生产环境可移除) */} {!hasRunningApps && (
-

应用堆栈

+

{t('stack.title')}

)} diff --git a/src/components/ecosystem/discover-page.tsx b/src/components/ecosystem/discover-page.tsx index e6eeb80ac..23c2d4f2c 100644 --- a/src/components/ecosystem/discover-page.tsx +++ b/src/components/ecosystem/discover-page.tsx @@ -1,4 +1,5 @@ import { useRef, forwardRef, useImperativeHandle } from 'react'; +import { useTranslation } from 'react-i18next'; import { IconSearch, IconSparkles, IconChevronRight, IconApps } from '@tabler/icons-react'; import { cn } from '@/lib/utils'; import styles from './discover-page.module.css'; @@ -9,10 +10,19 @@ import type { MiniappManifest } from '@/services/ecosystem'; // ============================================ // 工具函数 // ============================================ -function getTodayDate() { +// ============================================ +// 工具函数 +// ============================================ +// ============================================ +// 工具函数 +// ============================================ +function getTodayDate(t: (key: string, options?: Record) => string) { const now = new Date(); - const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; - return `${now.getMonth() + 1}月${now.getDate()}日 ${weekdays[now.getDay()]}`; + return t('common:date.format', { + month: now.getMonth() + 1, + day: now.getDate(), + weekday: t(`common:weekdays.${now.getDay()}`), + }); } // 默认渐变色 @@ -32,6 +42,7 @@ function getAppGradient(app: MiniappManifest, fallbackIndex: number = 0): string // 大型精选卡片 // ============================================ function FeaturedStoryCard({ app, onTap }: { app: MiniappManifest; onTap: () => void }) { + const { t } = useTranslation('ecosystem'); const gradient = app.themeColor || 'from-violet-600 via-purple-600 to-indigo-700'; return ( @@ -51,7 +62,7 @@ function FeaturedStoryCard({ app, onTap }: { app: MiniappManifest; onTap: () =>
- 精选应用 + {t('ecosystem:discover.featured')}
@@ -123,6 +134,7 @@ function AppListItem({ rank?: number; showRank?: boolean; }) { + const { t } = useTranslation('ecosystem'); return (
{showRank && rank !== undefined && ( @@ -138,7 +150,7 @@ function AppListItem({

{app.name}

{app.beta && ( - Beta + {t('common:beta')} )}
@@ -154,7 +166,7 @@ function AppListItem({ onOpen(); }} > - 获取 + {t('ecosystem:discover.get')}
); @@ -195,6 +207,7 @@ export const DiscoverPage = forwardRef(funct { apps, featuredApp, featuredApps, recommendedApps, hotApps, onAppDetail, onAppOpen }, ref, ) { + const { t } = useTranslation(['ecosystem', 'common']); const searchInputRef = useRef(null); useImperativeHandle(ref, () => ({ @@ -208,7 +221,7 @@ export const DiscoverPage = forwardRef(funct {/* BigHeader - sticky,scroll-driven background */}
-

{getTodayDate()}

+

{getTodayDate(t)}

{/* 搜索框 */} @@ -217,7 +230,7 @@ export const DiscoverPage = forwardRef(funct (funct {/* 内容区 */}
{apps.length === 0 ? ( - + ) : ( <> {featuredApp && ( @@ -243,9 +256,9 @@ export const DiscoverPage = forwardRef(funct {recommendedApps.length > 0 && (
-

推荐

+

{t('ecosystem:discover.recommended')}

@@ -264,7 +277,7 @@ export const DiscoverPage = forwardRef(funct )}
-

热门应用

+

{t('ecosystem:discover.hotApps')}

{hotApps.map((app, i) => (
diff --git a/src/components/ecosystem/ios-search-capsule.tsx b/src/components/ecosystem/ios-search-capsule.tsx index a5f01a240..b4ca5cf7d 100644 --- a/src/components/ecosystem/ios-search-capsule.tsx +++ b/src/components/ecosystem/ios-search-capsule.tsx @@ -1,4 +1,5 @@ import { IconSearch } from '@tabler/icons-react'; +import { useTranslation } from 'react-i18next'; import { cn } from '@/lib/utils'; export interface IOSSearchCapsuleProps { @@ -7,6 +8,7 @@ export interface IOSSearchCapsuleProps { } export function IOSSearchCapsule({ onClick, className }: IOSSearchCapsuleProps) { + const { t } = useTranslation('common'); return ( ); } diff --git a/src/components/ecosystem/miniapp-capsule.tsx b/src/components/ecosystem/miniapp-capsule.tsx index 355e0fe10..e7a0cf0f0 100644 --- a/src/components/ecosystem/miniapp-capsule.tsx +++ b/src/components/ecosystem/miniapp-capsule.tsx @@ -8,6 +8,7 @@ import { forwardRef } from 'react'; import { IconDots, IconPointFilled } from '@tabler/icons-react'; import { cn } from '@/lib/utils'; +import { useTranslation } from 'react-i18next'; import type { CapsuleTheme } from '@/services/miniapp-runtime'; import styles from './miniapp-capsule.module.css'; @@ -30,6 +31,7 @@ export const MiniappCapsule = forwardRef(fu { theme = 'auto', actionIcon, onAction, onClose, visible = true, className }, ref, ) { + const { t } = useTranslation('ecosystem'); if (!visible) return null; const themeClassName = theme === 'dark' ? styles.themeDark : theme === 'light' ? styles.themeLight : styles.themeAuto; @@ -39,7 +41,7 @@ export const MiniappCapsule = forwardRef(fu {/*
*/}
{/* 多功能按钮 */} - @@ -47,7 +49,7 @@ export const MiniappCapsule = forwardRef(fu
{/* 关闭按钮 - 使用 IconPointFilled 模拟国内小程序的关闭图标 */} -
) diff --git a/src/components/ecosystem/my-apps-page.tsx b/src/components/ecosystem/my-apps-page.tsx index f2d597aff..171cdabdc 100644 --- a/src/components/ecosystem/my-apps-page.tsx +++ b/src/components/ecosystem/my-apps-page.tsx @@ -1,6 +1,7 @@ import { useEffect, useRef, useState } from 'react'; import { useStore } from '@tanstack/react-store'; import { IconDownload, IconPlayerPlay, IconInfoCircle, IconTrash } from '@tabler/icons-react'; +import { useTranslation } from 'react-i18next'; import { cn } from '@/lib/utils'; import { motion, LayoutGroup } from 'motion/react'; import { MiniappIcon } from './miniapp-icon'; @@ -33,6 +34,7 @@ interface IOSDesktopIconProps { } function IOSDesktopIcon({ app, onTap, onOpen, onDetail, onRemove }: IOSDesktopIconProps) { + const { t } = useTranslation('common') const popoverRef = useRef(null); const iconRef = useRef(null); const menuRef = useRef(null); @@ -59,10 +61,10 @@ function IOSDesktopIcon({ app, onTap, onOpen, onDetail, onRemove }: IOSDesktopIc presentationState === null || presentationState === 'presenting' || presentationState === 'dismissing'; const sharedLayoutIds = enableSharedLayout ? { - container: `miniapp:${app.id}:container`, - logo: `miniapp:${app.id}:logo`, - inner: `miniapp:${app.id}:inner`, - } + container: `miniapp:${app.id}:container`, + logo: `miniapp:${app.id}:logo`, + inner: `miniapp:${app.id}:inner`, + } : null; const ICON_STACKING_VARIANTS = { @@ -268,9 +270,9 @@ function IOSDesktopIcon({ app, onTap, onOpen, onDetail, onRemove }: IOSDesktopIc }; const menuItems = [ - { icon: IconPlayerPlay, label: '打开', action: onOpen }, - { icon: IconInfoCircle, label: '详情', action: onDetail }, - { icon: IconTrash, label: '移除', action: onRemove, destructive: true }, + { icon: IconPlayerPlay, label: t('ecosystem.menu.open'), action: onOpen }, + { icon: IconInfoCircle, label: t('ecosystem.menu.detail'), action: onDetail }, + { icon: IconTrash, label: t('ecosystem.menu.remove'), action: onRemove, destructive: true }, ]; return ( @@ -302,9 +304,9 @@ function IOSDesktopIcon({ app, onTap, onOpen, onDetail, onRemove }: IOSDesktopIc + />
-

还没有使用过的应用

-

去「发现」页面探索吧

+

{t('ecosystem.noAppsUsed')}

+

{t('ecosystem.goToDiscover')}

); } diff --git a/src/components/ecosystem/swiper-sync-demo.tsx b/src/components/ecosystem/swiper-sync-demo.tsx index 57f5766cd..a6d753cff 100644 --- a/src/components/ecosystem/swiper-sync-demo.tsx +++ b/src/components/ecosystem/swiper-sync-demo.tsx @@ -6,6 +6,7 @@ */ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { Swiper, SwiperSlide } from 'swiper/react'; import { Controller } from 'swiper/modules'; import type { Swiper as SwiperType } from 'swiper'; @@ -19,26 +20,27 @@ const PAGES = ['Page 1', 'Page 2', 'Page 3']; * 方案一:Swiper Controller 模块(官方推荐) */ export function SwiperSyncDemo() { + const { t } = useTranslation('ecosystem'); // Controller 需要 state 来触发重渲染建立连接 const [mainSwiper, setMainSwiper] = useState(null); const [indicatorSwiper, setIndicatorSwiper] = useState(null); - + // 用于 UI 显示的进度(不参与同步逻辑) const [displayProgress, setDisplayProgress] = useState(0); return (
-

方案一:Controller 模块(官方推荐)

- +

{t('demo.swiper.method1')}

+ {/* 调试信息 */}
-
Progress: {displayProgress.toFixed(3)}
-
Active Index: {Math.round(displayProgress * (PAGES.length - 1))}
+
{t('demo.swiper.debugProgress', { value: displayProgress.toFixed(3) })}
+
{t('demo.swiper.debugActiveIndex', { value: Math.round(displayProgress * (PAGES.length - 1)) })}
{/* 主 Swiper */}
-
主 Swiper
+
{t('demo.swiper.main')}
setDisplayProgress(p)} > {PAGES.map((page) => ( - @@ -59,7 +61,7 @@ export function SwiperSyncDemo() { {/* 指示器 Swiper */}
-
指示器 Swiper
+
{t('demo.swiper.indicator')}
mainSwiper?.slideTo(index)} className="px-4 py-2 rounded-lg bg-muted hover:bg-muted/80" > - Go to {index + 1} + {t('demo.swiper.goTo', { index: index + 1 })} ))}
@@ -100,13 +102,14 @@ export function SwiperSyncDemo() { /** * 方案三:Context 封装模式(使用 Controller 模块) */ -import { - SwiperSyncProvider, +import { + SwiperSyncProvider, useSwiperMember, } from '@/components/common/swiper-sync-context'; /** 主 Swiper 组件 */ function MainSwiperWithContext() { + const { t } = useTranslation('ecosystem'); // 自己是 'main',要控制 'indicator' const { onSwiper, controlledSwiper } = useSwiperMember('main', 'indicator'); const [progress, setProgress] = useState(0); @@ -114,7 +117,7 @@ function MainSwiperWithContext() { return (
- 主 Swiper(独立组件) + {t('demo.swiper.mainIndependent')}
setProgress(p)} > {PAGES.map((page) => ( - @@ -132,10 +135,13 @@ function MainSwiperWithContext() { ))} - + {/* 调试信息 */}
- Progress: {progress.toFixed(3)} | Index: {Math.round(progress * (PAGES.length - 1))} + {t('demo.swiper.debugCombined', { + progress: progress.toFixed(3), + index: Math.round(progress * (PAGES.length - 1)) + })}
); @@ -143,6 +149,7 @@ function MainSwiperWithContext() { /** 指示器 Swiper 组件 */ function IndicatorSwiperWithContext() { + const { t } = useTranslation('ecosystem'); // 自己是 'indicator',要控制 'main' const { onSwiper, controlledSwiper } = useSwiperMember('indicator', 'main'); const [progress, setProgress] = useState(0); @@ -158,7 +165,7 @@ function IndicatorSwiperWithContext() { return (
- 指示器 Swiper(独立组件) + {t('demo.swiper.indicatorIndependent')}
{PAGES.map((page, index) => ( -
@@ -205,14 +212,15 @@ function IndicatorSwiperWithContext() { /** 方案三:Context 封装 Demo */ export function SwiperSyncDemoContext() { + const { t } = useTranslation('ecosystem'); return (
-

方案三:Context 封装模式

+

{t('demo.swiper.method3')}

- 使用 SwiperSyncProvider + useSwiperMember + Controller 模块实现跨组件同步 + {t('demo.swiper.method3Desc')}

- +
diff --git a/src/components/wallet/wallet-address-portfolio-view.tsx b/src/components/wallet/wallet-address-portfolio-view.tsx index 036924f89..e5a9c75cc 100644 --- a/src/components/wallet/wallet-address-portfolio-view.tsx +++ b/src/components/wallet/wallet-address-portfolio-view.tsx @@ -78,7 +78,7 @@ export function WalletAddressPortfolioView({
{!tokensSupported && !tokensLoading && ( @@ -101,7 +101,7 @@ export function WalletAddressPortfolioView({
{!transactionsSupported && !transactionsLoading && ( @@ -109,13 +109,13 @@ export function WalletAddressPortfolioView({ (
-

交易历史加载失败

+

{t('transaction:history.loadFailed')}

{error.message}

)} diff --git a/src/components/wallet/wallet-card-carousel.tsx b/src/components/wallet/wallet-card-carousel.tsx index 40b95161c..500cc6823 100644 --- a/src/components/wallet/wallet-card-carousel.tsx +++ b/src/components/wallet/wallet-card-carousel.tsx @@ -1,4 +1,5 @@ import { useCallback, useRef, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import type { Priority } from './refraction'; import { Swiper, SwiperSlide } from 'swiper/react'; import { EffectCards } from 'swiper/modules'; @@ -25,7 +26,6 @@ interface WalletCardCarouselProps { selectedChain: ChainType; /** 每个钱包的链偏好 (walletId -> chainId) */ chainPreferences?: Record; - chainNames: Record; onWalletChange?: (walletId: string) => void; onCopyAddress?: (address: string) => void; onOpenChainSelector?: (walletId: string) => void; @@ -46,7 +46,6 @@ export function WalletCardCarousel({ currentWalletId, selectedChain, chainPreferences = {}, - chainNames, onWalletChange, onCopyAddress, onOpenChainSelector, @@ -57,9 +56,11 @@ export function WalletCardCarousel({ onOpenAddressTransactions, className, }: WalletCardCarouselProps) { + const { t } = useTranslation(['home', 'wallet', 'common']); const swiperRef = useRef(null); const { getWalletTheme } = useWalletTheme(); const chainIconUrls = useChainIconUrls(); + // ... rest of the component // 找到当前钱包的索引 const currentIndex = wallets.findIndex((w) => w.id === currentWalletId); @@ -117,7 +118,7 @@ export function WalletCardCarousel({ className="bg-primary text-primary-foreground hover:bg-primary/90 absolute top-0 left-4 z-10 flex items-center gap-1.5 rounded-full px-3 py-1.5 text-xs font-medium backdrop-blur-sm transition-colors" > - {wallets.length} 个钱包 + {t('wallet:carousel.walletCount', { count: wallets.length })} )} @@ -142,13 +143,13 @@ export function WalletCardCarousel({ {onOpenAddressBalance && ( - 地址余额查询 + {t('wallet:menu.addressBalanceQuery')} )} {onOpenAddressTransactions && ( - 地址交易查询 + {t('wallet:menu.addressTransactionsQuery')} )} @@ -182,7 +183,7 @@ export function WalletCardCarousel({ -
+
); } diff --git a/src/components/wallet/wallet-config.tsx b/src/components/wallet/wallet-config.tsx index 301723245..b9e8135e7 100644 --- a/src/components/wallet/wallet-config.tsx +++ b/src/components/wallet/wallet-config.tsx @@ -6,7 +6,7 @@ import { useChainIconUrls } from '@/hooks/useChainIconUrls'; import { WalletCard } from '@/components/wallet/wallet-card'; import { Button } from '@/components/ui/button'; import { useWallets, useSelectedChain, walletActions, type ChainType, useLanguage } from '@/stores'; -import { generateWalletName } from '@/lib/wallet-utils'; +import { getRandomWalletWord } from '@/lib/wallet-utils'; import { InputGroup, InputGroupInput, InputGroupAddon, InputGroupButton } from '@/components/ui/input-group'; import { useFlow } from '@/stackflow'; import { @@ -258,7 +258,10 @@ export function WalletConfig({ mode, walletId, onEditOnlyComplete, className }: setEditName(generateWalletName(currentLanguage, t('onboarding:create.walletSuffix')))} + onClick={() => setEditName(t('onboarding:create.generatedNamePattern', { + word: getRandomWalletWord(currentLanguage), + suffix: t('onboarding:create.walletSuffix'), + }))} title={t('wallet:randomName')} > diff --git a/src/i18n/i18next.d.ts b/src/i18n/i18next.d.ts index 9af7ffd9e..876c060fd 100644 --- a/src/i18n/i18next.d.ts +++ b/src/i18n/i18next.d.ts @@ -4,6 +4,7 @@ import type authorize from './locales/zh-CN/authorize.json' import type common from './locales/zh-CN/common.json' import type currency from './locales/zh-CN/currency.json' import type dweb from './locales/zh-CN/dweb.json' +import type ecosystem from './locales/zh-CN/ecosystem.json' import type empty from './locales/zh-CN/empty.json' import type error from './locales/zh-CN/error.json' import type guide from './locales/zh-CN/guide.json' @@ -28,6 +29,7 @@ declare module 'i18next' { common: typeof common currency: typeof currency dweb: typeof dweb + ecosystem: typeof ecosystem empty: typeof empty error: typeof error guide: typeof guide diff --git a/src/i18n/locales/ar/common.json b/src/i18n/locales/ar/common.json index 6e95e95fc..990817b44 100644 --- a/src/i18n/locales/ar/common.json +++ b/src/i18n/locales/ar/common.json @@ -28,6 +28,7 @@ "selectWallet": "اختر المحفظة", "showPassword": "إظهار كلمة المرور", "skipToMain": "انتقل إلى المحتوى الرئيسي", + "tabEcosystem": "النظام البيئي", "tabHistory": "سجل المعاملات", "tabHome": "الرئيسية", "tabSettings": "الإعدادات", @@ -38,9 +39,9 @@ "unknownApp": "تطبيق غير معروف" }, "acceptExchange": "Accept exchange", - "account": "[MISSING:ar] 用户", - "accountFromMime": "[MISSING:ar] account from mime", - "accountWorks": "[MISSING:ar] account works!", + "account": "المستخدم", + "accountFromMime": "account from mime", + "accountWorks": "account works!", "acquisitionTime": "Acquisition time", "add": "Add", "addressBook": { @@ -88,7 +89,7 @@ "all": "All", "allNetwork": "All network", "alreadySet": "Already set", - "appIsAboutToReload": "[MISSING:ar] 应用程序即将重新加载", + "appIsAboutToReload": "سيتم إعادة تحميل التطبيق", "appRestartPleaseWait": "App restart, please wait.", "appShortName": "BFM Pay", "appVersion": "V", @@ -98,24 +99,38 @@ "bandwidth": "Bandwidth", "beSureToKeepThePrivateKeyInASafePlaceIfThePrivateKeyIsLostItCannotBeRetrieved": "Be sure to keep the private key in a safe place. If the private key is lost,it cannot be retrieved", "belongingAlbum": "Belonging album", - "bgPrimary": "[MISSING:ar] bg-primary", + "bgPrimary": "bg-primary", "bip39Index": "Index", "byContinuingToUseItYouAgreeToTheUserAgreement": "By continuing to use it, you agree to the 《User Agreement》", "cancel": "Cancel", - "cardWorks": "[MISSING:ar] card works!", + "cardWorks": "card works!", "certificate": "Certificate", - "clickToCopy": "[MISSING:ar] 点击复制", - "clickToShowTheQr": "[MISSING:ar] 点开显示二维码", + "chains": { + "bfchainv2": "BFChain V2", + "bfmeta": "BFMeta", + "binance": "BSC", + "bitcoin": "Bitcoin", + "biwmeta": "BIWMeta", + "btgmeta": "BTGMeta", + "ccchain": "CCChain", + "ethereum": "Ethereum", + "ethmeta": "ETHMeta", + "malibu": "Malibu", + "pmchain": "PMChain", + "tron": "Tron" + }, + "clickToCopy": "انقر للنسخ", + "clickToShowTheQr": "انقر لعرض رمز QR", "clickToShowTheQrCodeOfThePrivateKey": "Click to show the QR code of the private key", "close": "Close", - "codeOfThePrivateKey": "[MISSING:ar] 私钥的十六进制码", - "comingSoonStayTuned": "[MISSING:ar] 即将上线,敬请期待", + "codeOfThePrivateKey": "الشفرة السداسية للمفتاح الخاص", + "comingSoonStayTuned": "قريبًا", "comprehensiveEncryption": "Comprehensive <br /> encryption", "confirm": "Confirm", "confirmBackedUp": "Confirm Backed Up", "confirmToDelete": "Confirm to delete ?", "confirmToTurnOffTouchId": "Confirm to turn off Touch ID?", - "confirmToTurnOffVerification": "[MISSING:ar] 确认要关闭验证吗?", + "confirmToTurnOffVerification": "هل تريد إيقاف التحقق؟", "contact": { "add": "إضافة", "addAddress": "إضافة عنوان", @@ -138,6 +153,10 @@ "selectContact": "اختر جهة اتصال", "viewAll": "عرض جميع جهات الاتصال" }, + "contactCard": { + "scanToAdd": "امسح لإضافة جهة اتصال", + "transferToMe": "امسح للتحويل إليّ" + }, "continue": "Continue", "contractMethods": "Contract methods", "contractRiskWarning": "The contract carries a certain level of risk. Users are requested to confirm the security of the contract code themselves. If authorized, the risk will be confirmed", @@ -150,14 +169,30 @@ "copyToClipboard": "Copied to clipboard", "couldBeWithin_30Seconds": "Could be within 30 seconds", "creator": "Creator", + "date": { + "format": "{{weekday}}، {{day}} {{month}}" + }, "delete": "Delete", "destroy": "Destroy", "done": "Done", "download": "تحميل", - "dpInTab": "[MISSING:ar] dp", + "dpInTab": "dp", "dpName": "DP Name", "dpType": "Type", "dueToTheUpgradeOfTheNewVersionOf_{appName}Tips": "Due to the upgrade of the new version of , which optimizes the wallet structure and interaction logic, the old data will be modified as follows.", + "ecosystem": { + "appStack": "مجموعة التطبيقات", + "chainNotSupported": "السلسلة غير مدعومة", + "goToDiscover": "استكشف صفحة الاكتشاف", + "menu": { + "detail": "التفاصيل", + "open": "فتح", + "remove": "إزالة" + }, + "noAppsUsed": "لم تستخدم أي تطبيقات بعد", + "runningApps": "التطبيقات قيد التشغيل", + "stackViewHints": "اسحب للتبديل · اضغط للفتح · اسحب للأعلى للإغلاق" + }, "edit": "Edit", "energy": "Energy", "english": "English", @@ -167,7 +202,7 @@ "enterPlaintextPrivateKey": "Enter plaintext private Key", "enterPrivateKey": "Enter private key", "enterTheCorrectFormat": "Enter the correct format", - "env": "[MISSING:ar] env", + "env": "env", "estimated_1Minute": "Estimated 1 minute", "event": "Event", "eventContent": "Event Content", @@ -177,14 +212,14 @@ "fastest": "Fastest", "favorite": "إضافة للمفضلة", "fillableMemo": "Fillable Memo", - "finish": "[MISSING:ar] 完成", + "finish": "تم", "firstTimeToUse": "First time to use", "freeze": "Freeze", "from": "From", "frozen": "Frozen", "get_(estimate)": "Get(estimate)", - "goHome": "[MISSING:ar] 主页", - "goToCosmicdp": "[MISSING:ar] 前往 CosmicDP 交易", + "goHome": "الرئيسية", + "goToCosmicdp": "اذهب إلى CosmicDP", "goToCosmicdpForTrading": "Go to CosmicDP for trading", "hint": "Hint", "history": "History", @@ -193,12 +228,12 @@ "howItWork": "How it work", "iGotIt": "I got it !", "iHaveReadAndAgreedToTheUserAgreement": "I have read and agreed to 《User Agreement》", - "identityName": "[MISSING:ar] 钱包名称", + "identityName": "اسم المحفظة", "identityNotBackedUp": "Identity Not Backed Up", "in": "In", "initateGifts": "Initate gifts", "initiateExchange": "Initiate exchange", - "inputIsAnIllegalMenemonic": "[MISSING:ar] 不是合法助记词,请重新输入", + "inputIsAnIllegalMenemonic": "عبارة الاسترداد غير صالحة", "loading": "Loading", "makeSureNoOneElseIsAroundWhenBackingUp": "Make sure no one else is around when backing up", "manage": "Manage", @@ -206,12 +241,26 @@ "memo": "Memo", "message": "Message", "methodsParams": "Methods params", - "mimeInTab": "[MISSING:ar] 我的", - "mine": "[MISSING:ar] 我的", + "mimeInTab": "لي", + "mine": "لي", "modifyIdentityName": "Modify Identity Name", "modifyName": "Modify name", "modityIdentityName": "Modify identity Name", "more": "More", + "myCard": { + "addWallet": "إضافة محفظة", + "changeAvatar": "انقر لتغيير الصورة", + "currentChain": "السلسلة الحالية", + "defaultName": "بطاقتي", + "editUsername": "انقر لتعديل اسم المستخدم", + "maxWallets": "حدد {{max}} محفظة كحد أقصى", + "noWalletsSelected": "الرجاء تحديد محفظة واحدة على الأقل", + "scanToAdd": "امسح لإضافتي كجهة اتصال", + "selectWallets": "اختر المحفظة", + "title": "بطاقتي", + "usernamePlaceholder": "أدخل اسم المستخدم", + "walletAddress": "{{wallet}} ({{chain}})" + }, "name": "Name", "navOverview": "Overview", "network": "Network", @@ -225,7 +274,7 @@ "nonLimitedEditionDp": "Non Limited edition DP", "notBackedUp": "Not Backed Up", "numeric": "numeric", - "offline": "[MISSING:ar] 离线", + "offline": "غير متصل", "ok": "OK", "openNewVersion": "Open new version", "out": "Out", @@ -238,8 +287,8 @@ "pleaseEnterDpNameOrId": "Please enter DP name or ID", "pleaseEnterHere": "Please enter here", "pleaseEnterIdentityName": "Please enter Identity name", - "pleaseEnterPlaintext": "[MISSING:ar] 请输入明文私钥", - "pleaseEnterPlaintextPrivatekey": "[MISSING:ar] 请输入明文私钥", + "pleaseEnterPlaintext": "أدخل المفتاح الخاص", + "pleaseEnterPlaintextPrivatekey": "أدخل المفتاح الخاص", "pleaseGoToCosmicdpTrading": "Please go to CosmicDP trading", "pleaseInputTheName": "Please input the name", "pleaseTryAgainIn_{waiting}Seconds": "Please try again in seconds", @@ -247,15 +296,16 @@ "privateKey": "Private Key", "privateMustBeBytesLong": "Private must be bytes long", "probablyWithin_15Seconds": "Probably within 15 seconds", - "probablyWithin_30Seconds": "[MISSING:ar] 预计30秒", + "probablyWithin_30Seconds": "حوالي 30 ثانية", "project": "Project", + "providerFallback": { + "desc": "فشلت جميع الأطراف الموفرة المكونة. يتم عرض القيمة الافتراضية.", + "queryFailed": "فشل استعلام {{feature}}", + "technicalDetails": "تفاصيل تقنية" + }, "publishDate": "Publish Date", - "quantity": "[MISSING:ar] 数量", + "quantity": "الكمية", "receive": "استلام", - "contactCard": { - "scanToAdd": "امسح لإضافة جهة اتصال", - "transferToMe": "امسح للتحويل إليّ" - }, "receivingGifts": "Receiving gifts", "refuse": "Refuse", "reject": "Reject", @@ -273,6 +323,7 @@ "reset": "Reset", "resubmit": "Resubmit", "retry": "Retry", + "retrying": "جارٍ إعادة المحاولة...", "save": "Save", "saveQrCode": "Save QR code", "saveSuccessful": "Saved Successfully", @@ -285,7 +336,7 @@ "selectNetwork": "Select Network", "selectionNetwork": "Selection network", "share": "Share", - "shareCancel": "[MISSING:ar] 分享取消", + "shareCancel": "تم إلغاء المشاركة", "shareCanceled": "Share canceled", "shareSuccessful": "Shared Successfully", "showLess": "Show less", @@ -300,7 +351,7 @@ "success": "success", "successful": "Successful", "tapAgainToExit": "Tap again to exit", - "test": "[MISSING:ar] test", + "test": "test", "theMaximumLengthOfTheHintIs": "The maximum length of the hint is", "theMaximumLengthOfTheMemoIsMax_{length}": "The maximum length of the memo is", "theMaximumLengthOfTheNameIs": "The maximum length of the name is", @@ -339,12 +390,21 @@ "userAgreement": "User agreement", "userAvatorAndNikename": "User avatar and nickname", "validationSucceeded": "Validation succeeded", - "verifying": "[MISSING:ar] 验证中...", + "verifying": "جارٍ التحقق...", "version": "Version", "versionUpgrade": "version upgrade", "viewInBrowser": "View in browser", "viewPrivateKey": "View private key", "website": "Website", + "weekdays": { + "0": "الأحد", + "1": "الاثنين", + "2": "الثلاثاء", + "3": "الأربعاء", + "4": "الخميس", + "5": "الجمعة", + "6": "السبت" + }, "welcomeToCot": "Welcome To BFM Pay", "wellDone": "Well done!", "words": "words", @@ -353,4 +413,4 @@ "{{length}}Words": "words", "中文(简体)": "中文(简体)", "中文(繁體)": "中文(繁體)" -} \ No newline at end of file +} diff --git a/src/i18n/locales/ar/ecosystem.json b/src/i18n/locales/ar/ecosystem.json index d479ee776..8eec083dd 100644 --- a/src/i18n/locales/ar/ecosystem.json +++ b/src/i18n/locales/ar/ecosystem.json @@ -1,24 +1,59 @@ { - "title": "[MISSING:ar] 生态", - "empty": "[MISSING:ar] 暂无小程序", - "loading": "[MISSING:ar] 加载中...", - "notFound": "[MISSING:ar] 小程序不存在", - "refresh": "[MISSING:ar] 刷新", + "title": "النظام البيئي", + "empty": "لم يتم العثور على تطبيقات مصغرة", + "loading": "جاري التحميل...", + "notFound": "التطبيق المصغر غير موجود", + "refresh": "تحديث", "sources": { - "title": "[MISSING:ar] 可信源管理", - "add": "[MISSING:ar] 添加订阅", - "remove": "[MISSING:ar] 移除", - "empty": "[MISSING:ar] 暂无订阅源" + "title": "إدارة المصادر الموثوقة", + "add": "إضافة اشتراك", + "remove": "إزالة", + "empty": "لا توجد مصادر اشتراك" }, "permissions": { - "title": "[MISSING:ar] 权限请求", - "grant": "[MISSING:ar] 授权", - "deny": "[MISSING:ar] 拒绝", - "bio_requestAccounts": "[MISSING:ar] 访问钱包地址", - "bio_selectAccount": "[MISSING:ar] 选择账户", - "bio_pickWallet": "[MISSING:ar] 选择其他钱包", - "bio_signMessage": "[MISSING:ar] 签名消息", - "bio_signTypedData": "[MISSING:ar] 签名数据", - "bio_sendTransaction": "[MISSING:ar] 发起交易" + "title": "طلب إذن", + "grant": "منح", + "deny": "رفض", + "bio_requestAccounts": "الوصول إلى عناوين المحفظة", + "bio_selectAccount": "حدد الحساب", + "bio_pickWallet": "اختر محفظة أخرى", + "bio_signMessage": "توقيع الرسالة", + "bio_signTypedData": "توقيع البيانات المكتوبة", + "bio_sendTransaction": "بدء المعاملة" + }, + "discover": { + "featured": "التطبيقات المميزة", + "get": "الحصول", + "searchPlaceholder": "البحث عن التطبيقات", + "empty": "لا توجد تطبيقات", + "recommended": "الموصى بها", + "viewAll": "عرض الكل", + "hotApps": "التطبيقات الشائعة" + }, + "demo": { + "swiper": { + "method1": "الطريقة 1: وحدة التحكم (موصى بها)", + "method3": "الطريقة 3: وضع غلاف السياق", + "method3Desc": "المزامنة عبر المكونات باستخدام SwiperSyncProvider + useSwiperMember + Controller", + "main": "Swiper الرئيسي", + "indicator": "Swiper المؤشر", + "mainIndependent": "Swiper الرئيسي (مكون مستقل)", + "indicatorIndependent": "Swiper المؤشر (مكون مستقل)", + "goTo": "اذهب إلى {{index}}", + "progress": "التقدم", + "activeIndex": "الفهرس النشط", + "debugCombined": "التقدم: {{progress}} | الفهرس النشط: {{index}}", + "debugProgress": "التقدم: {{value}}", + "debugActiveIndex": "الفهرس النشط: {{value}}" + } + }, + "stack": { + "title": "مكدس التطبيقات", + "runningApps": "تطبيقات التشغيل", + "hints": "اسحب لأعلى للإغلاق" + }, + "capsule": { + "more": "المزيد من الخيارات", + "close": "إغلاق التطبيق" } -} +} \ No newline at end of file diff --git a/src/i18n/locales/ar/home.json b/src/i18n/locales/ar/home.json index f6cdc38b3..3dd108155 100644 --- a/src/i18n/locales/ar/home.json +++ b/src/i18n/locales/ar/home.json @@ -2,14 +2,16 @@ "wallet": { "addressCopied": "تم نسخ العنوان", "assets": "الأصول", - "destroy": "[MISSING:ar] 销毁", + "destroy": "حرق", "noAssets": "لا توجد أصول", "noAssetsOnChain": "لا توجد رموز على {{chain}}", "receive": "استلام", "selectNetwork": "اختر الشبكة", "send": "إرسال", - "tokenActions": "[MISSING:ar] 资产操作", - "transfer": "[MISSING:ar] 转账" + "tokenActions": "عمليات الأصول", + "tokenBalance": "رصيد التوكن", + "transactionHistory": "سجل المعاملات", + "transfer": "تحويل" }, "welcome": { "createWallet": "إنشاء محفظة جديدة", diff --git a/src/i18n/locales/ar/notification.json b/src/i18n/locales/ar/notification.json index 7276e270b..3e978321e 100644 --- a/src/i18n/locales/ar/notification.json +++ b/src/i18n/locales/ar/notification.json @@ -1,41 +1,58 @@ { + "clear": "مسح", + "delete": "حذف", + "empty": { + "desc": "ستظهر جميع إشعاراتك هنا", + "title": "لا توجد إشعارات" + }, + "markAllRead": "تحديد الكل كمقروء", + "noUnread": "لا توجد إشعارات غير مقروءة", + "pendingTx": { + "broadcasted": { + "message": "{{type}} {{amount}} {{symbol}} تم البث، في انتظار التأكيد", + "messageSimple": "تم بث المعاملة، في انتظار تأكيد الكتلة", + "title": "تم بث المعاملة" + }, + "confirmed": { + "message": "{{type}} {{amount}} {{symbol}} تم التأكيد بنجاح", + "messageSimple": "تم تأكيد المعاملة بنجاح", + "title": "تم تأكيد المعاملة" + }, + "failed": { + "message": "فشل البث,请重试", + "title": "فشلت المعاملة" + } + }, "permission": { - "title": "تفعيل الإشعارات", - "description": "استلام تحديثات حالة المعاملات وتنبيهات الأمان المهمة", - "enable": "تفعيل الإشعارات", - "skip": "ليس الآن", "benefits": { - "transaction": { - "title": "حالة المعاملات", - "description": "احصل على إشعارات فورية للتحويلات وتأكيدات المعاملات" - }, "instant": { - "title": "تنبيهات فورية", - "description": "كن أول من يعرف عند وصول المدفوعات واكتمال المعاملات" + "description": "كن أول من يعرف عند وصول المدفوعات واكتمال المعاملات", + "title": "تنبيهات فورية" }, "security": { - "title": "تنبيهات الأمان", - "description": "لا تفوت إشعارات أمان الحساب المهمة" + "description": "لا تفوت إشعارات أمان الحساب المهمة", + "title": "تنبيهات الأمان" + }, + "transaction": { + "description": "احصل على إشعارات فورية للتحويلات وتأكيدات المعاملات", + "title": "حالة المعاملات" } - } - }, - "title": "مركز الإشعارات", - "markAllRead": "تحديد الكل كمقروء", - "unreadCount": "{{count}} غير مقروء", - "noUnread": "لا توجد إشعارات غير مقروءة", - "clear": "مسح", - "delete": "حذف", - "unread": "غير مقروء", - "empty": { - "title": "لا توجد إشعارات", - "desc": "ستظهر جميع إشعاراتك هنا" + }, + "description": "استلام تحديثات حالة المعاملات وتنبيهات الأمان المهمة", + "enable": "تفعيل الإشعارات", + "skip": "ليس الآن", + "title": "تفعيل الإشعارات" }, "time": { + "daysAgo": "منذ {{count}} يوم", + "hoursAgo": "منذ {{count}} ساعة", "justNow": "الآن", "minutesAgo": "منذ {{count}} دقيقة", - "hoursAgo": "منذ {{count}} ساعة", - "daysAgo": "منذ {{count}} يوم", "today": "اليوم", "yesterday": "أمس" - } + }, + "title": "مركز الإشعارات", + "unread": "غير مقروء", + "unreadCount": "{{count}} غير مقروء", + "viewDetails": "عرض التفاصيل" } diff --git a/src/i18n/locales/ar/onboarding.json b/src/i18n/locales/ar/onboarding.json index c6cf688ac..a7489d3fe 100644 --- a/src/i18n/locales/ar/onboarding.json +++ b/src/i18n/locales/ar/onboarding.json @@ -40,6 +40,7 @@ "createFailed": "فشل في إنشاء المحفظة", "defaultWalletName": "المحفظة الرئيسية", "walletSuffix": "محفظة", + "generatedNamePattern": "{{word}} {{suffix}}", "enterWallet": "دخول المحفظة", "form": { "agreementPrefix": "لقد قرأت ووافقت على", @@ -122,9 +123,9 @@ "invalidMnemonic": "العبارة السرية غير صالحة، يرجى التحقق من الإملاء", "nextStep": "التالي", "success": { - "description": "[MISSING:ar] 钱包 {{name}} 已成功导入", - "enterWallet": "[MISSING:ar] 进入钱包", - "title": "[MISSING:ar] 导入成功" + "description": "تم استيراد المحفظة {{name}} بنجاح", + "enterWallet": "الدخول للمحفظة", + "title": "تم الاستيراد بنجاح" }, "title": "استيراد المحفظة", "words12": "12 كلمة", diff --git a/src/i18n/locales/ar/security.json b/src/i18n/locales/ar/security.json index 448ae2d44..b3af930bc 100644 --- a/src/i18n/locales/ar/security.json +++ b/src/i18n/locales/ar/security.json @@ -64,9 +64,9 @@ "entered": "تم إدخال {{filled}}/{{total}} كلمات" }, "noBackup": "لا نسخة احتياطية", - "password": "[MISSING:ar] 密码", + "password": "كلمة المرور", "passwordConfirm": { - "verifying": "[MISSING:ar] 验证中..." + "verifying": "جارٍ التحقق..." }, "patternLock": { "clear": "مسح النمط", @@ -114,7 +114,7 @@ "broadcastSuccess": "تم البث بنجاح", "confirmDesc": "أدخل كلمة مرور الأمان مرة أخرى للتأكيد", "confirmPlaceholder": "تأكيد كلمة مرور الأمان", - "confirmTitle": "[MISSING:ar] 确认安全密码", + "confirmTitle": "تأكيد كلمة مرور الأمان", "feeInfo": "تعيين كلمة مرور الأمان يتطلب رسوم الشبكة", "inputDesc": "قم بتعيين كلمة مرور أمان لحماية تحويلاتك", "inputPlaceholder": "أدخل كلمة مرور الأمان", @@ -139,7 +139,7 @@ "error": "النمط غير صحيح، حاول مرة أخرى", "unlockDesc": "ارسم نمط قفل المحفظة", "unlockTitle": "فتح المحفظة", - "verifyTitle": "[MISSING:ar] 验证钱包", + "verifyTitle": "التحقق من المحفظة", "verifying": "جاري التحقق..." }, "whenTurnesOnYouCanUseYourFingerprintInsteadOfPassword": "عند التشغيل، سيتم تفعيل قفل البصمة", diff --git a/src/i18n/locales/ar/settings.json b/src/i18n/locales/ar/settings.json index 22f683d74..44e676282 100644 --- a/src/i18n/locales/ar/settings.json +++ b/src/i18n/locales/ar/settings.json @@ -94,6 +94,7 @@ "clearData": "مسح بيانات التطبيق", "currency": "العملة", "language": "اللغة", + "myCard": "بطاقتي", "storage": "التخزين", "viewMnemonic": "عرض العبارة السرية", "walletChains": "شبكات المحفظة", @@ -117,9 +118,9 @@ "basedOn": "بناءً على حصة تخزين المتصفح", "clearDesc": "مسح جميع البيانات المخزنة محليًا، بما في ذلك المحافظ والإعدادات والذاكرة المؤقتة.", "clearTitle": "مسح البيانات", - "goToClear": "[MISSING:ar] 前往清理数据", - "migrationDesc": "[MISSING:ar] 检测到旧版本数据格式,需要清空本地数据库后才能继续使用。您的助记词和私钥不会受到影响,但需要重新导入钱包。", - "migrationRequired": "[MISSING:ar] 数据需要迁移", + "goToClear": "الذهاب لمسح البيانات", + "migrationDesc": "تم اكتشاف تنسيق بيانات قديم، يجب مسح قاعدة البيانات المحلية للمتابعة", + "migrationRequired": "يلزم ترحيل البيانات", "title": "التخزين", "total": "المساحة الإجمالية", "unavailable": "تعذر الحصول على معلومات التخزين", diff --git a/src/i18n/locales/ar/staking.json b/src/i18n/locales/ar/staking.json index 9295365ee..6cde5f26e 100644 --- a/src/i18n/locales/ar/staking.json +++ b/src/i18n/locales/ar/staking.json @@ -19,7 +19,7 @@ "noStakedAssets": "لا توجد أصول مخزنة", "noTransactions": "لا يوجد سجل معاملات", "overview": "نظرة عامة", - "refresh": "[MISSING:ar] 刷新", + "refresh": "تحديث", "searchPlaceholder": "اسم الرمز أو العقد", "selectChain": "اختر السلسلة", "selectNetwork": "اختر الشبكة", diff --git a/src/i18n/locales/ar/transaction.json b/src/i18n/locales/ar/transaction.json index 6c7cf4ee7..f82b447cf 100644 --- a/src/i18n/locales/ar/transaction.json +++ b/src/i18n/locales/ar/transaction.json @@ -49,6 +49,19 @@ "bioforestChainTransactionTypeSetUsername": "Set Username", "bioforestChainTransactionTypeSignForAssetEntrustment": "Sign For Asset Entrustment", "bioforestChainTransactionTypeToExchangeAnyMultiAll": "To Exchange Any Multi All", + "broadcast": { + "accountFrozen": "الحساب مجمد", + "alreadyExists": "المعاملة موجودة مسبقًا", + "assetNotEnough": "Insufficient asset balance", + "assetNotExist": "الأصل غير موجود", + "failed": "فشل البث", + "feeNotEnough": "Insufficient fee", + "forbidden": "العملية محظورة", + "invalidParams": "معلمات غير صالحة", + "rejected": "Transaction rejected", + "timeout": "انتهت مهلة البث، يرجى المحاولة مرة أخرى", + "unknown": "Broadcast failed, please try again" + }, "certificateTransfer": "Certificate Transfer", "chainTransfer": "Transfer", "confirmSheet": { @@ -66,19 +79,21 @@ "destoryAmount": "Destory amount", "destoryQuantityCannotBeGreaterThanBalance": "Destory quantity cannot be greater than balance", "destroyPage": { - "amountLabel": "[MISSING:ar] 销毁数量", - "assetLabel": "[MISSING:ar] 销毁资产", - "confirm": "[MISSING:ar] 确认销毁", - "noDestroyableAssets": "[MISSING:ar] 暂无可销毁的资产", - "notSupported": "[MISSING:ar] 当前链不支持资产销毁", - "resultTitle": "[MISSING:ar] 销毁结果", - "title": "[MISSING:ar] 销毁", - "warning": "[MISSING:ar] 销毁操作不可撤销,请仔细核对销毁数量。" + "amountLabel": "كمية الحرق", + "assetLabel": "أصل الحرق", + "confirm": "تأكيد الحرق", + "noDestroyableAssets": "لا توجد أصول قابلة للحرق", + "notSupported": "السلسلة الحالية不支持资产销毁", + "resultTitle": "نتيجة الحرق", + "title": "حرق", + "warning": "عملية الحرق لا رجعة فيها" }, "detail": { "allowance": "Allowance", "blockHeight": "ارتفاع الكتلة", "confirmations": "التأكيدات", + "confirmedAt": "وقت التأكيد", + "confirmedBlockHeight": "كتلة التأكيد", "contractAddress": "Contract Address", "copied": "تم النسخ", "copyHash": "نسخ الهاش", @@ -90,7 +105,7 @@ "method": "Method", "network": "الشبكة", "notFound": "المعاملة غير موجودة أو منتهية الصلاحية", - "openInExplorer": "[MISSING:ar] 在浏览器中打开", + "openInExplorer": "فتح في المتصفح", "share": "Share", "spender": "Spender", "swapFrom": "From", @@ -136,6 +151,7 @@ "days90": "90 يومًا", "periodLabel": "الفترة" }, + "loadFailed": "فشل تحميل سجل المعاملات", "noWallet": "يرجى إنشاء أو استيراد محفظة أولاً", "title": "سجل المعاملات", "totalRecords": "{{count}} سجل", @@ -170,6 +186,18 @@ "paymentDetails": "Payment Details", "paymentInfo": "Payment Info", "pending": "Pending", + "pendingTx": { + "broadcasted": "Awaiting confirmation", + "broadcasting": "Broadcasting", + "clearAllFailed": "فشل المسح", + "delete": "Delete", + "failed": "Broadcast failed", + "retry": "Retry", + "retryCount": "Retry count", + "title": "Pending Transactions", + "viewAll": "عرض جميع المعاملات المعلقة {{count}}", + "waitingFor": "انتظرت {{seconds}} ثانية" + }, "promptForDuplicateTransfer": "There is an identical transfer that has not arrived, can you wait for the confirmation of the transfer, or continue with a new transfer?", "receive": "Receive", "receiveAddress": "Receive address", @@ -178,27 +206,29 @@ "addressCopied": "تم نسخ العنوان", "copied": "تم النسخ", "copyAddress": "نسخ العنوان", + "imageSaved": "تم حفظ الصورة", "networkWarning": "يمكن تحويل أصول شبكة {{chain}} فقط، لا يمكن استرداد الأصول من الشبكات الأخرى", "receiveAddress": "عنوان الاستلام", + "saveImage": "حفظ الصورة", "scanQrCode": "امسح رمز QR للتحويل إلى هذا العنوان", "share": "مشاركة", "shareTitle": "عنوان استلام BFM Pay", "title": "استلام" }, "receiver": "Receiver", - "scanAndTransferTheAsset": "[MISSING:ar] 扫一扫,转账 /", - "scanAndTransferToMe": "[MISSING:ar] 扫一扫转入 /", + "scanAndTransferTheAsset": "امسح للتحويل /", + "scanAndTransferToMe": "امسح للاستلام /", "scanToAssetTypeTransfer": "Scan to transfer ()", "scanToTransfer": "Scan to transfer", "selectTransferChain": "Select transfer chain", "send": "Send", "sendPage": { "amountLabel": "المبلغ", - "assetLabel": "[MISSING:ar] 转账资产", + "assetLabel": "تحويل资产", "cameraPermissionRequired": "مطلوب إذن الكاميرا للمسح", "continue": "متابعة", "explorerNotImplemented": "ميزة مستكشف البلوك قادمة قريبًا", - "fee": "[MISSING:ar] 手续费", + "fee": "رسوم المعاملة", "from": "من", "networkWarning": "يرجى التأكد من أن عنوان المستلم هو عنوان شبكة {{chain}}. لا يمكن استرداد المرسل إلى الشبكة الخاطئة", "resultTitle": "نتيجة الإرسال", @@ -207,10 +237,10 @@ "title": "إرسال", "toAddressLabel": "عنوان المستلم", "toAddressPlaceholder": "أدخل عنوان {{chain}}", - "twoStepSecretDescription": "[MISSING:ar] 该地址已设置支付密码,请输入支付密码确认转账。", - "twoStepSecretError": "[MISSING:ar] 支付密码错误", - "twoStepSecretPlaceholder": "[MISSING:ar] 输入支付密码", - "twoStepSecretTitle": "[MISSING:ar] 需要支付密码" + "twoStepSecretDescription": "تم تعيين كلمة مرور الدفع لهذا العنوان", + "twoStepSecretError": "كلمة مرور الدفع غير صحيحة", + "twoStepSecretPlaceholder": "أدخل كلمة مرور الدفع", + "twoStepSecretTitle": "مطلوب كلمة مرور الدفع" }, "sendResult": { "back": "رجوع", @@ -233,10 +263,10 @@ "swap": "Swap", "theCurrentAddressDoesNotHave_{assettype}AssetsAndCannotBeTransferred": "The current address does not have assets and cannot be transferred.", "theFrozenAddressCannotBeTransferred": "The frozen address cannot be transferred", - "theMinimumMinerFeeIs_{fee}": "[MISSING:ar] 本次交易最低矿工费为:", + "theMinimumMinerFeeIs_{fee}": "الحد الأدنى لرسوم التعدين لهذه المعاملة:", "theRecommendedMinerFee_{fee}": "The recommended miner fee is:", "thisAddressOnlySupportsAssetsPleaseDoNotTransferToOtherPublicChainAssets": "This address only supports assets, please do not transfer to other public chain assets.", - "thisAddressOnlySupportsEthereumAssetsPleaseDoNotTransferToOtherPublicChainAssets": "[MISSING:ar] 该地址只支持 Ethereum 资产, 请不要转账给其它非兼容的区块链资产。", + "thisAddressOnlySupportsEthereumAssetsPleaseDoNotTransferToOtherPublicChainAssets": "هذا العنوان يدعم أصول Ethereum فقط", "to": "To", "toAddress": "إلى", "to_(receive_{asset})": "To(Receive )", @@ -263,16 +293,18 @@ "tronNetworkFeeLongTips_1": "The network fee will vary according to networksituation, once the transaction is confirmed, the fee cannot be refunded regardless of whether the transaction is successful or not.", "tronNetworkFeeLongTips_2": "The network fee is charged by the TRON network, and BFM Pay does not charge any fees !", "txStatus": { - "created": "Pending Broadcast", - "createdDesc": "Transaction created, waiting to broadcast...", + "autoCloseIn": "الإغلاق التلقائي بعد {{seconds}} ثانية", "broadcasted": "Broadcast Successful", "broadcastedDesc": "Transaction broadcasted, awaiting block confirmation...", "broadcasting": "Broadcasting", "broadcastingDesc": "Broadcasting transaction to the network...", + "closeIn": "إغلاق ({{seconds}}s)", "confirmed": "Transaction Confirmed", "confirmedDesc": "Transaction has been confirmed on chain", "confirming": "Awaiting Confirmation", "confirmingDesc": "Waiting for block confirmation...", + "created": "Pending Broadcast", + "createdDesc": "Transaction created, waiting to broadcast...", "failed": "Transaction Failed", "failedDesc": "Transaction failed, please try again later", "viewDetails": "View Details" @@ -305,23 +337,8 @@ "trust": "Trust", "unstake": "إلغاء التخزين" }, - "pendingTx": { - "title": "Pending Transactions", - "broadcasting": "Broadcasting", - "broadcasted": "Awaiting confirmation", - "failed": "Broadcast failed", - "retry": "Retry", - "delete": "Delete", - "retryCount": "Retry count" - }, - "broadcast": { - "assetNotEnough": "Insufficient asset balance", - "feeNotEnough": "Insufficient fee", - "rejected": "Transaction rejected", - "unknown": "Broadcast failed, please try again" - }, "unstake": "Unstake", - "viewTransactionDetails": "[MISSING:ar] 查看交易详情", + "viewTransactionDetails": "عرض تفاصيل المعاملة", "youFinallyReceive": "You finally receive", "youMustReceive_{asset}QuantityGreaterThan_0": "You must receive quantity greater than 0", "{chainsymbol}IsNotEnoughToCoverFees": "is not enough to cover fees" diff --git a/src/i18n/locales/ar/wallet.json b/src/i18n/locales/ar/wallet.json index 0cf5b595b..144e6033e 100644 --- a/src/i18n/locales/ar/wallet.json +++ b/src/i18n/locales/ar/wallet.json @@ -4,6 +4,13 @@ "add": "إضافة محفظة", "defaultName": "محفظتي", "randomName": "اسم عشوائي", + "carousel": { + "walletCount": "{{count}} محافظ" + }, + "menu": { + "addressBalanceQuery": "استعلام عن رصيد العنوان", + "addressTransactionsQuery": "استعلام عن معاملات العنوان" + }, "chains": { "title": "إدارة شبكات المحفظة", "verifyTitle": "التحقق من قفل المحفظة", @@ -28,7 +35,7 @@ "allowsGettingTheAddressesOfAllWalletsInTheApplication": "Allows getting the addresses of all wallets in the application", "allowsToGetTheAddressOfEachNetworkOfTheCurrentWallet": "Allows to get the address of each network of the current wallet", "alreadyHaveAWallet": "Already have a wallet", - "alreadyHaveAWalletGoToRestore": "[MISSING:ar] 恢复钱包", + "alreadyHaveAWalletGoToRestore": "استعادة المحفظة", "anytimeAnywhereManageYourDigitalAssets": "Anytime, anywhere <br /> Manage your digital assets", "applyAddress": "Apply Address", "areYouSureYouWantToDeleteThisAddress": "Are you sure you want to delete this address?", @@ -56,7 +63,7 @@ "createDesc": "Generate a new mnemonic to create wallet", "createEntity": "Create entity", "createEntityFactory": "Create entity factory", - "createImport": "[MISSING:ar] 创建 / 导入", + "createImport": "إنشاء / استيراد", "createWallet": "Create Wallet", "createWallet_{symbol}": "Create Wallet ()", "created": "Created", @@ -86,7 +93,7 @@ "edit address": "Edit Address", "editSheet": { "cancel": "إلغاء", - "confirmDelete": "[MISSING:ar] 确认删除", + "confirmDelete": "تأكيد الحذف", "delete": "حذف المحفظة", "deleteDesc": "لا يمكن التراجع عن هذا الإجراء", "deleteTitle": "حذف المحفظة", @@ -98,23 +105,23 @@ "save": "حفظ", "title": "إعدادات المحفظة", "verifyFailed": "فشل التحقق", - "verifying": "[MISSING:ar] 验证中...", + "verifying": "جارٍ التحقق...", "walletName": "اسم المحفظة", "walletNamePlaceholder": "أدخل اسم المحفظة" }, "empty": "لا توجد محافظ بعد", "emptyHint": "انقر على الزر أعلاه لإنشاء أو استيراد محفظة", - "enterOrPasteTheWalletAddress": "[MISSING:ar] 输入或者粘贴钱包地址", + "enterOrPasteTheWalletAddress": "أدخل أو الصق عنوان المحفظة", "enterTheAddressOf_{chain}": "Enter the address of", "enterWallet": "Enter wallet", "exitAllWalletIn_{appName}": "Exit all wallet In", "exit_{mainwallet}": "Exit """, "exportPrivateKey": "Export Private Key", - "exportPrivateKeyTips": "[MISSING:ar] export-private-key-tips", + "exportPrivateKeyTips": "export-private-key-tips", "frozeMainAssetPrealnum": "Frozen Main Asset Prealnum", "frozenAddressesCannotBeSet": "Frozen addresses cannot be set", "genesisaddress": "Genesis Address", - "ifItIsNotBackedUpTheWalletCannotBeRestoredAndAssetLossMayResult": "[MISSING:ar] 若未完成助记词备份,将无法恢复钱包,同时可能造成资产损失。", + "ifItIsNotBackedUpTheWalletCannotBeRestoredAndAssetLossMayResult": "إذا لم يتم النسخ الاحتياطي، فقد تفقد أصولك", "importDesc": "Import existing wallet with mnemonic or key", "importTheAccountWithThePrivateKey": "Import the account with the private key", "importTheWalletOfTheAddressAndThePerformTheSigningOperation": "Import the wallet of the address and then perform the signing operation", @@ -134,8 +141,8 @@ "manageIdentityWallet": "Manage Identity Wallet", "manageIdentityWallets": "Manage Identity Wallets", "manageWallet": "Manage Wallet", - "manageWallets": "[MISSING:ar] 管理钱包", - "mnageIdentityWallet": "[MISSING:ar] manage-identity-wallet", + "manageWallets": "إدارة المحافظ", + "mnageIdentityWallet": "manage-identity-wallet", "modifyAddress": "Modify Address", "modifyWalletName": "Modify Wallet Name", "multiChainSupport": "Multi chain <br /> support", @@ -143,7 +150,7 @@ "newCreateWallet": "Create Wallet", "nonIdentityAssociateAllChainTips": "The original non-identity wallet will associate all corresponding chains according to the mnemonic phrase;", "notBackedUp": "Not backed up", - "notFindCurrentlyActiveWallet": "[MISSING:ar] 未找到当前激活的钱包", + "notFindCurrentlyActiveWallet": "لم يتم العثور على المحفظة النشطة", "notImported": "(Not imported)", "obtainingThePrivateKeyIsEquivalentToOwningTheWalletAsset": "Obtaining the private key is equivalent to owning the wallet asset", "pleaseEnterAddress": "Please enter address", @@ -154,16 +161,16 @@ "receive": "Receive", "remainAssetPrealnum": "Remain Asset Prealnum", "restoreIdentity": "Restore Identity", - "restoreWallet": "[MISSING:ar] 恢复钱包", + "restoreWallet": "استعادة المحفظة", "scanResulitsDoNotMatchAddressRules": "Scan results do not match address rules", "scan_{chain}AddressQrCode": "Scan address QR code", "searchForTokenName": "Token Name", "searchForTokenNameOrContractAddress": "Token Name/Contract Address", "selectAddressType": "Select Address Type", "selectAsset": "Select Asset", - "selectThisAddress": "[MISSING:ar] 选择此地址", + "selectThisAddress": "اختر هذا العنوان", "selectWallet": "Select Wallet", - "selectWalletTransation": "[MISSING:ar] 选择转账钱包", + "selectWalletTransation": "اختر محفظة التحويل", "selectionChain": "Selection Chain", "selectionWallet": "Selection Wallet", "switchingWallets": "Switching wallets", @@ -175,7 +182,7 @@ "theWalletIsNotBackUpTips": "The wallet is not backed up. If you continue to exit, you may lose the wallet permanently. Are you sure you want to continue?", "thereIsAnUnbackedUpWalletIn_{appName}Tips": "There is an unbacked up wallet in . If you continue to exit, you may lose the wallet permanently. Are you sure you want to continue?", "thisRequestDoesNotHaveAMatchingWalletInCotPleaseAddTheCorrespondingWalletFirstAndTryAgain": "This request does not have a matching wallet in BFM Pay. Please add the corresponding wallet first and try again.", - "toRestoreTheWalletInOrderToEnsureTheSecurityOfThe": "[MISSING:ar] to restore the wallet. In order to ensure the security of the", + "toRestoreTheWalletInOrderToEnsureTheSecurityOfThe": "لاستعادة المحفظة، من أجل الأمان", "to_({chain})": "To()", "tokenDetail": "Token Detail", "transfer": "Transfer", @@ -187,9 +194,9 @@ "walletName": "Wallet Name", "walletNameMustBe_1_12CharactersLong": "wallet name must be 1~12 characters long", "walletSettings": "Wallet settings", - "wallets": "[MISSING:ar] 钱包", + "wallets": "المحافظ", "walletsOriginallyImportedWillBeMergedTips": "Wallets originally imported from different chains with the same mnemonic phrase will be merged;", - "walletsUnderIdentity": "[MISSING:ar] 身份钱包", + "walletsUnderIdentity": "محافظ الهوية", "willSynchronizeImportIntoThe_{chainname}ChainWithTheSamePrivateKey": "Will synchronize import into the chain with the same private key", "{assetType}Details": "Details", "{asset}TotalCirculation": "total circulation" diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index a88ef5ae0..fa7ebe7f0 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -33,27 +33,36 @@ "tabSettings": "Settings", "tabTransfer": "Transfer", "tabWallet": "Wallet", + "tabEcosystem": "Ecosystem", "tokenDetails": "View {{token}} details", "transactionDetails": "Transaction details", "unknownApp": "Unknown app" }, "acceptExchange": "Accept exchange", - "account": "[MISSING:en] 用户", - "accountFromMime": "[MISSING:en] account from mime", - "accountWorks": "[MISSING:en] account works!", + "account": "User", + "accountFromMime": "account from mime", + "accountWorks": "account works!", "acquisitionTime": "Acquisition time", "add": "Add", "addressBook": { - "delete": "Delete", - "deleteConfirm": "Are you sure you want to delete contact \"{{name}}\"?", - "deleteTitle": "Delete Contact", - "edit": "Edit", + "title": "Address Book", + "searchPlaceholder": "Search contacts", "noContacts": "No contacts yet", "noResults": "No contacts found", + "edit": "Edit", + "delete": "Delete", + "deleteTitle": "Delete Contact", + "deleteConfirm": "Are you sure you want to delete contact \"{{name}}\"?", "passwordError": "Incorrect password", - "searchPlaceholder": "Search contacts", - "title": "Address Book", - "verifyFailed": "Verification failed" + "verifyFailed": "Verification failed", + "addContact": "Add Contact", + "namePlaceholder": "Enter contact name", + "addresses": "Addresses", + "memo": "Memo", + "memoPlaceholder": "Add memo (optional)", + "shareContact": "Share Contact", + "scanToAdd": "Scan to add contact", + "changeAvatar": "Click to change avatar" }, "addressPlaceholder": "Enter or paste address", "advancedEncryptionTechnologyDigitalWealthIsMoreSecure": "Advanced encryption technology <br /> Digital wealth is more secure", @@ -62,7 +71,7 @@ "all": "All", "allNetwork": "All network", "alreadySet": "Already set", - "appIsAboutToReload": "[MISSING:en] 应用程序即将重新加载", + "appIsAboutToReload": "App is about to reload", "appRestartPleaseWait": "App restart, please wait.", "appShortName": "BFM Pay", "appVersion": "V", @@ -72,23 +81,23 @@ "bandwidth": "Bandwidth", "beSureToKeepThePrivateKeyInASafePlaceIfThePrivateKeyIsLostItCannotBeRetrieved": "Be sure to keep the private key in a safe place. If the private key is lost,it cannot be retrieved", "belongingAlbum": "Belonging album", - "bgPrimary": "[MISSING:en] bg-primary", + "bgPrimary": "bg-primary", "bip39Index": "Index", "byContinuingToUseItYouAgreeToTheUserAgreement": "By continuing to use it, you agree to the 《User Agreement》", "cancel": "Cancel", - "cardWorks": "[MISSING:en] card works!", + "cardWorks": "card works!", "certificate": "Certificate", - "clickToShowTheQr": "[MISSING:en] 点开显示二维码", + "clickToShowTheQr": "Tap to show QR code", "clickToShowTheQrCodeOfThePrivateKey": "Click to show the QR code of the private key", "close": "Close", - "codeOfThePrivateKey": "[MISSING:en] 私钥的十六进制码", - "comingSoonStayTuned": "[MISSING:en] 即将上线,敬请期待", + "codeOfThePrivateKey": "Hex code of private key", + "comingSoonStayTuned": "Coming soon", "comprehensiveEncryption": "Comprehensive <br /> encryption", "confirm": "Confirm", "confirmBackedUp": "Confirm Backed Up", "confirmToDelete": "Confirm to delete ?", "confirmToTurnOffTouchId": "Confirm to turn off Touch ID?", - "confirmToTurnOffVerification": "[MISSING:en] 确认要关闭验证吗?", + "confirmToTurnOffVerification": "Confirm to turn off verification?", "contact": { "add": "Add", "addTitle": "Add Contact", @@ -127,7 +136,7 @@ "delete": "Delete", "destroy": "Destroy", "done": "Done", - "dpInTab": "[MISSING:en] dp", + "dpInTab": "dp", "dpName": "DP Name", "dpType": "Type", "dueToTheUpgradeOfTheNewVersionOf_{appName}Tips": "Due to the upgrade of the new version of , which optimizes the wallet structure and interaction logic, the old data will be modified as follows.", @@ -140,7 +149,7 @@ "enterPlaintextPrivateKey": "Enter plaintext private Key", "enterPrivateKey": "Enter private key", "enterTheCorrectFormat": "Enter the correct format", - "env": "[MISSING:en] env", + "env": "env", "estimated_1Minute": "Estimated 1 minute", "event": "Event", "eventContent": "Event Content", @@ -150,14 +159,14 @@ "fastest": "Fastest", "favorite": "Favorite", "fillableMemo": "Fillable Memo", - "finish": "[MISSING:en] 完成", + "finish": "Done", "firstTimeToUse": "First time to use", "freeze": "Freeze", "from": "From", "frozen": "Frozen", "get_(estimate)": "Get(estimate)", - "goHome": "[MISSING:en] 主页", - "goToCosmicdp": "[MISSING:en] 前往 CosmicDP 交易", + "goHome": "Home", + "goToCosmicdp": "Go to CosmicDP", "goToCosmicdpForTrading": "Go to CosmicDP for trading", "hint": "Hint", "history": "History", @@ -166,12 +175,12 @@ "howItWork": "How it work", "iGotIt": "I got it !", "iHaveReadAndAgreedToTheUserAgreement": "I have read and agreed to 《User Agreement》", - "identityName": "[MISSING:en] 钱包名称", + "identityName": "Wallet name", "identityNotBackedUp": "Identity Not Backed Up", "in": "In", "initateGifts": "Initate gifts", "initiateExchange": "Initiate exchange", - "inputIsAnIllegalMenemonic": "[MISSING:en] 不是合法助记词,请重新输入", + "inputIsAnIllegalMenemonic": "Invalid mnemonic, please re-enter", "loading": "Loading", "makeSureNoOneElseIsAroundWhenBackingUp": "Make sure no one else is around when backing up", "manage": "Manage", @@ -179,8 +188,8 @@ "memo": "Memo", "message": "Message", "methodsParams": "Methods params", - "mimeInTab": "[MISSING:en] 我的", - "mine": "[MISSING:en] 我的", + "mimeInTab": "Mine", + "mine": "Mine", "modifyIdentityName": "Modify Identity Name", "modifyName": "Modify name", "modityIdentityName": "Modify identity Name", @@ -198,7 +207,7 @@ "nonLimitedEditionDp": "Non Limited edition DP", "notBackedUp": "Not Backed Up", "numeric": "numeric", - "offline": "[MISSING:en] 离线", + "offline": "Offline", "ok": "OK", "openNewVersion": "Open new version", "out": "Out", @@ -211,8 +220,8 @@ "pleaseEnterDpNameOrId": "Please enter DP name or ID", "pleaseEnterHere": "Please enter here", "pleaseEnterIdentityName": "Please enter Identity name", - "pleaseEnterPlaintext": "[MISSING:en] 请输入明文私钥", - "pleaseEnterPlaintextPrivatekey": "[MISSING:en] 请输入明文私钥", + "pleaseEnterPlaintext": "Please enter plain text private key", + "pleaseEnterPlaintextPrivatekey": "Please enter plain text private key", "pleaseGoToCosmicdpTrading": "Please go to CosmicDP trading", "pleaseInputTheName": "Please input the name", "pleaseTryAgainIn_{waiting}Seconds": "Please try again in seconds", @@ -220,15 +229,60 @@ "privateKey": "Private Key", "privateMustBeBytesLong": "Private must be bytes long", "probablyWithin_15Seconds": "Probably within 15 seconds", - "probablyWithin_30Seconds": "[MISSING:en] 预计30秒", + "probablyWithin_30Seconds": "Estimated 30 seconds", "project": "Project", "publishDate": "Publish Date", - "quantity": "[MISSING:en] 数量", + "quantity": "Quantity", "receive": "Receive", "contactCard": { "scanToAdd": "Scan to add contact", "transferToMe": "Scan to transfer to me" }, + "ecosystem": { + "runningApps": "Running Apps", + "stackViewHints": "Swipe to switch · Tap to open · Swipe up to close", + "noAppsUsed": "No apps used yet", + "goToDiscover": "Explore the Discover page", + "appStack": "App Stack", + "chainNotSupported": "Chain not supported", + "menu": { + "open": "Open", + "detail": "Details", + "remove": "Remove" + } + }, + "chains": { + "ethereum": "Ethereum", + "bitcoin": "Bitcoin", + "tron": "Tron", + "binance": "BSC", + "bfmeta": "BFMeta", + "ccchain": "CCChain", + "pmchain": "PMChain", + "bfchainv2": "BFChain V2", + "btgmeta": "BTGMeta", + "biwmeta": "BIWMeta", + "ethmeta": "ETHMeta", + "malibu": "Malibu" + }, + "weekdays": { + "0": "Sunday", + "1": "Monday", + "2": "Tuesday", + "3": "Wednesday", + "4": "Thursday", + "5": "Friday", + "6": "Saturday" + }, + "date": { + "format": "{{weekday}}, {{month}} {{day}}" + }, + "providerFallback": { + "queryFailed": "{{feature}} query failed", + "desc": "All configured providers failed. Showing default value.", + "technicalDetails": "Technical details" + }, + "retry": "Retry", "receivingGifts": "Receiving gifts", "refuse": "Refuse", "reject": "Reject", @@ -245,7 +299,6 @@ "requsetTwo": "Request two", "reset": "Reset", "resubmit": "Resubmit", - "retry": "Retry", "save": "Save", "saving": "Saving...", "saved": "Saved", @@ -259,7 +312,7 @@ "selectionNetwork": "Selection network", "share": "Share", "download": "Download", - "shareCancel": "[MISSING:en] 分享取消", + "shareCancel": "Share cancelled", "shareCanceled": "Share canceled", "shareSuccessful": "Shared Successfully", "showLess": "Show less", @@ -274,7 +327,7 @@ "success": "success", "successful": "Successful", "tapAgainToExit": "Tap again to exit", - "test": "[MISSING:en] test", + "test": "test", "theMaximumLengthOfTheHintIs": "The maximum length of the hint is", "theMaximumLengthOfTheMemoIsMax_{length}": "The maximum length of the memo is", "theMaximumLengthOfTheNameIs": "The maximum length of the name is", @@ -285,13 +338,13 @@ "thereAreCurrentlyNoSearchResultsAvailable": "There are currently no search results available", "thisIsTheLatestVersion": "This is the latest version", "time": { - "daysAgo": "{{count}} days ago", - "daysLater": "In {{count}} days", - "hoursAgo": "{{count}} hr ago", - "hoursLater": "In {{count}} hr", "justNow": "Just now", "minutesAgo": "{{count}} min ago", + "hoursAgo": "{{count}} hr ago", + "daysAgo": "{{count}} days ago", "minutesLater": "In {{count}} min", + "hoursLater": "In {{count}} hr", + "daysLater": "In {{count}} days", "today": "Today", "yesterday": "Yesterday" }, @@ -328,26 +381,6 @@ "{{length}}Words": "words", "中文(简体)": "中文(简体)", "中文(繁體)": "中文(繁體)", - "addressBook": { - "title": "Address Book", - "searchPlaceholder": "Search contacts", - "noContacts": "No contacts yet", - "noResults": "No contacts found", - "edit": "Edit", - "delete": "Delete", - "deleteTitle": "Delete Contact", - "deleteConfirm": "Are you sure you want to delete contact \"{{name}}\"?", - "passwordError": "Incorrect password", - "verifyFailed": "Verification failed", - "addContact": "Add Contact", - "namePlaceholder": "Enter contact name", - "addresses": "Addresses", - "memo": "Memo", - "memoPlaceholder": "Add memo (optional)", - "shareContact": "Share Contact", - "scanToAdd": "Scan to add contact", - "changeAvatar": "Click to change avatar" - }, "myCard": { "title": "My Business Card", "defaultName": "My Card", @@ -362,17 +395,6 @@ "walletAddress": "{{wallet}} ({{chain}})", "currentChain": "Current chain" }, - "time": { - "justNow": "Just now", - "minutesAgo": "{{count}} min ago", - "hoursAgo": "{{count}} hr ago", - "daysAgo": "{{count}} days ago", - "minutesLater": "In {{count}} min", - "hoursLater": "In {{count}} hr", - "daysLater": "In {{count}} days", - "today": "Today", - "yesterday": "Yesterday" - }, "addressLookup": { "balanceTitle": "Address Balance", "transactionsTitle": "Address Transactions", diff --git a/src/i18n/locales/en/ecosystem.json b/src/i18n/locales/en/ecosystem.json index 8d8d20237..58447403f 100644 --- a/src/i18n/locales/en/ecosystem.json +++ b/src/i18n/locales/en/ecosystem.json @@ -1,24 +1,59 @@ { - "title": "[MISSING:en] 生态", - "empty": "[MISSING:en] 暂无小程序", - "loading": "[MISSING:en] 加载中...", - "notFound": "[MISSING:en] 小程序不存在", - "refresh": "[MISSING:en] 刷新", + "title": "Ecosystem", + "empty": "No miniapps found", + "loading": "Loading...", + "notFound": "Miniapp not found", + "refresh": "Refresh", "sources": { - "title": "[MISSING:en] 可信源管理", - "add": "[MISSING:en] 添加订阅", - "remove": "[MISSING:en] 移除", - "empty": "[MISSING:en] 暂无订阅源" + "title": "Trusted Sources", + "add": "Add Subscription", + "remove": "Remove", + "empty": "No subscription sources" }, "permissions": { - "title": "[MISSING:en] 权限请求", - "grant": "[MISSING:en] 授权", - "deny": "[MISSING:en] 拒绝", - "bio_requestAccounts": "[MISSING:en] 访问钱包地址", - "bio_selectAccount": "[MISSING:en] 选择账户", - "bio_pickWallet": "[MISSING:en] 选择其他钱包", - "bio_signMessage": "[MISSING:en] 签名消息", - "bio_signTypedData": "[MISSING:en] 签名数据", - "bio_sendTransaction": "[MISSING:en] 发起交易" + "title": "Permission Request", + "grant": "Grant", + "deny": "Deny", + "bio_requestAccounts": "Access wallet addresses", + "bio_selectAccount": "Select account", + "bio_pickWallet": "Select another wallet", + "bio_signMessage": "Sign message", + "bio_signTypedData": "Sign typed data", + "bio_sendTransaction": "Send Transaction" + }, + "discover": { + "featured": "Featured", + "get": "Get", + "searchPlaceholder": "Search apps", + "empty": "No apps found", + "recommended": "Recommended", + "viewAll": "View All", + "hotApps": "Hot Apps" + }, + "demo": { + "swiper": { + "method1": "Method 1: Controller Module (Recommended)", + "method3": "Method 3: Context Wrapper Mode", + "method3Desc": "Synchronize across components using SwiperSyncProvider + useSwiperMember + Controller", + "main": "Main Swiper", + "indicator": "Indicator Swiper", + "mainIndependent": "Main Swiper (Independent Component)", + "indicatorIndependent": "Indicator Swiper (Independent Component)", + "goTo": "Go to {{index}}", + "progress": "Progress", + "activeIndex": "Active Index", + "debugCombined": "Progress: {{progress}} | Active Index: {{index}}", + "debugProgress": "Progress: {{value}}", + "debugActiveIndex": "Active Index: {{value}}" + } + }, + "stack": { + "title": "App Stack", + "runningApps": "Running Apps", + "hints": "Swipe up to close" + }, + "capsule": { + "more": "More Options", + "close": "Close App" } -} +} \ No newline at end of file diff --git a/src/i18n/locales/en/home.json b/src/i18n/locales/en/home.json index 760d06a12..dea6470b5 100644 --- a/src/i18n/locales/en/home.json +++ b/src/i18n/locales/en/home.json @@ -1,20 +1,22 @@ { - "welcome": { - "title": "Welcome to BFM Pay", - "subtitle": "Create or import a wallet to get started", - "createWallet": "Create New Wallet", - "importWallet": "Import Existing Wallet" - }, "wallet": { - "send": "Send", - "receive": "Receive", + "addressCopied": "Address copied", "assets": "Assets", + "destroy": "Destroy", "noAssets": "No Assets", "noAssetsOnChain": "No tokens on {{chain}}", + "receive": "Receive", "selectNetwork": "Select Network", - "addressCopied": "Address copied", + "send": "Send", "tokenActions": "Token Actions", - "transfer": "Transfer", - "destroy": "Destroy" + "tokenBalance": "Token Balance", + "transactionHistory": "Transaction History", + "transfer": "Transfer" + }, + "welcome": { + "createWallet": "Create New Wallet", + "importWallet": "Import Existing Wallet", + "subtitle": "Create or import a wallet to get started", + "title": "Welcome to BFM Pay" } } diff --git a/src/i18n/locales/en/onboarding.json b/src/i18n/locales/en/onboarding.json index baac4b4d3..b712be7ed 100644 --- a/src/i18n/locales/en/onboarding.json +++ b/src/i18n/locales/en/onboarding.json @@ -42,6 +42,7 @@ "createFailed": "Failed to create wallet", "defaultWalletName": "Main Wallet", "walletSuffix": "Wallet", + "generatedNamePattern": "{{word}} {{suffix}}", "enterWallet": "Enter Wallet", "themeTitle": "Choose Card Theme", "themeSubtitle": "Select a theme color for your wallet card", diff --git a/src/i18n/locales/en/security.json b/src/i18n/locales/en/security.json index 466db8c45..cddf822a8 100644 --- a/src/i18n/locales/en/security.json +++ b/src/i18n/locales/en/security.json @@ -64,9 +64,9 @@ "entered": "Entered {{filled}}/{{total}} words" }, "noBackup": "No Backup", - "password": "[MISSING:en] 密码", + "password": "Password", "passwordConfirm": { - "verifying": "[MISSING:en] 验证中..." + "verifying": "Verifying..." }, "patternLock": { "clear": "Clear pattern", @@ -114,7 +114,7 @@ "broadcastSuccess": "Broadcast Successful", "confirmDesc": "Enter security password again to confirm", "confirmPlaceholder": "Confirm security password", - "confirmTitle": "[MISSING:en] 确认安全密码", + "confirmTitle": "Confirm Security Password", "feeInfo": "Setting security password requires a network fee", "inputDesc": "Set a security password to protect your transfers", "inputPlaceholder": "Enter security password", @@ -139,7 +139,7 @@ "error": "Incorrect pattern, please try again", "unlockDesc": "Draw your wallet lock pattern", "unlockTitle": "Unlock Wallet", - "verifyTitle": "[MISSING:en] 验证钱包", + "verifyTitle": "Verify Wallet", "verifying": "Verifying..." }, "whenTurnesOnYouCanUseYourFingerprintInsteadOfPassword": "When turned on, the fingerprint lock will be enabled", diff --git a/src/i18n/locales/en/transaction.json b/src/i18n/locales/en/transaction.json index 06366f256..f3baaaed2 100644 --- a/src/i18n/locales/en/transaction.json +++ b/src/i18n/locales/en/transaction.json @@ -1,79 +1,4 @@ { - "transfer": { - "quickTransfer": "Quick Transfer", - "quickTransferDesc": "Select recent contact or enter new address", - "recentContacts": "Recent Contacts", - "newTransfer": "New Transfer", - "transferHistory": "Transfer History", - "transferTo": "Transfer to {{name}}", - "today": "Today", - "yesterday": "Yesterday", - "daysAgo": "{{days}} days ago" - }, - "receivePage": { - "title": "Receive", - "scanQrCode": "Scan QR code to transfer to this address", - "receiveAddress": "Receive Address", - "copied": "Copied", - "copyAddress": "Copy Address", - "share": "Share", - "shareTitle": "BFM Pay Receive Address", - "addressCopied": "Address copied", - "networkWarning": "Only {{chain}} network assets can be transferred in, assets from other networks cannot be recovered", - "saveImage": "Save Image", - "imageSaved": "Image saved" - }, - "sendResult": { - "success": "Transfer Successful", - "failed": "Transfer Failed", - "pending": "Processing...", - "sentTo": "Sent to {{address}}", - "txHash": "Transaction Hash:", - "viewInBrowser": "View in Browser", - "retry": "Retry", - "done": "Done", - "back": "Back" - }, - "confirmSheet": { - "title": "Confirm Transfer", - "toAddress": "Recipient Address", - "copied": "Copied", - "copyAddress": "Copy Address", - "networkFee": "Network Fee", - "cancel": "Cancel", - "confirming": "Confirming...", - "confirm": "Confirm Transfer" - }, - "sendPage": { - "title": "Send", - "resultTitle": "Send Result", - "from": "From", - "toAddressLabel": "Recipient Address", - "toAddressPlaceholder": "Enter {{chain}} address", - "amountLabel": "Amount", - "assetLabel": "Transfer Asset", - "networkWarning": "Please ensure the recipient address is a {{chain}} network address. Sending to the wrong network cannot be recovered", - "continue": "Continue", - "cameraPermissionRequired": "Camera permission required for scanning", - "scanSuccess": "Scan successful", - "scanFailed": "Scan failed, please enter manually", - "explorerNotImplemented": "Block explorer feature coming soon", - "twoStepSecretTitle": "Security Password Required", - "twoStepSecretDescription": "This address has a security password set. Please enter your security password to confirm the transfer.", - "twoStepSecretPlaceholder": "Enter security password", - "twoStepSecretError": "Incorrect security password", - "fee": "Fee" - }, - "destroyPage": { - "title": "Destroy", - "resultTitle": "Destroy Result", - "assetLabel": "Asset to Destroy", - "amountLabel": "Destroy Amount", - "warning": "This action cannot be undone. Please verify the amount before confirming.", - "confirm": "Confirm Destroy", - "notSupported": "Asset destruction not supported on this chain", - "noDestroyableAssets": "No assets available for destruction" - }, "aboutFee": "About Fee", "amount": "Amount", "amountShouldBe_{min}-{max}-{assettype}": "Amount should be -", @@ -124,55 +49,71 @@ "bioforestChainTransactionTypeSetUsername": "Set Username", "bioforestChainTransactionTypeSignForAssetEntrustment": "Sign For Asset Entrustment", "bioforestChainTransactionTypeToExchangeAnyMultiAll": "To Exchange Any Multi All", + "broadcast": { + "accountFrozen": "Account is frozen", + "alreadyExists": "Transaction already exists", + "assetNotEnough": "Insufficient asset balance", + "assetNotExist": "Asset does not exist", + "failed": "Broadcast failed", + "feeNotEnough": "Insufficient fee", + "forbidden": "Operation forbidden", + "invalidParams": "Invalid parameters", + "rejected": "Transaction rejected", + "timeout": "Broadcast timeout, please retry", + "unknown": "Broadcast failed, please try again" + }, "certificateTransfer": "Certificate Transfer", "chainTransfer": "Transfer", + "confirmSheet": { + "cancel": "Cancel", + "confirm": "Confirm Transfer", + "confirming": "Confirming...", + "copied": "Copied", + "copyAddress": "Copy Address", + "networkFee": "Network Fee", + "title": "Confirm Transfer", + "toAddress": "Recipient Address" + }, "confirmed": "Confirmed", "contractTransactionData": "Contract transaction data", "destoryAmount": "Destory amount", "destoryQuantityCannotBeGreaterThanBalance": "Destory quantity cannot be greater than balance", + "destroyPage": { + "amountLabel": "Destroy Amount", + "assetLabel": "Asset to Destroy", + "confirm": "Confirm Destroy", + "noDestroyableAssets": "No assets available for destruction", + "notSupported": "Asset destruction not supported on this chain", + "resultTitle": "Destroy Result", + "title": "Destroy", + "warning": "This action cannot be undone. Please verify the amount before confirming." + }, "detail": { + "allowance": "Allowance", "blockHeight": "Block Height", "confirmations": "Confirmations", + "confirmedAt": "Confirmed At", + "confirmedBlockHeight": "Confirmed Block", + "contractAddress": "Contract Address", "copied": "Copied", "copyHash": "Copy Hash", - "contractAddress": "Contract Address", - "spender": "Spender", - "allowance": "Allowance", "fee": "Fee", "fromAddress": "From Address", "hash": "Transaction Hash", "info": "Transaction Info", + "invalidData": "Failed to parse transaction data", "method": "Method", "network": "Network", - "invalidData": "Failed to parse transaction data", "notFound": "Transaction not found or expired", + "openInExplorer": "Open in Explorer", + "share": "Share", + "spender": "Spender", "swapFrom": "From", "swapTo": "To", "time": "Time", "title": "Transaction Details", "toAddress": "To Address", - "viewExplorer": "View in Explorer", - "openInExplorer": "Open in Explorer", - "share": "Share", - "confirmedBlockHeight": "Confirmed Block", - "confirmedAt": "Confirmed At" - }, - "method": { - "approve": "Approve", - "transfer": "Transfer", - "swap": "Swap", - "swapExactTokensForETH": "Swap Tokens for ETH", - "swapExactTokensForTokens": "Swap Tokens", - "swapExactETHForTokens": "Swap ETH for Tokens", - "multicall": "Multi-call", - "execute": "Execute", - "deposit": "Deposit", - "withdraw": "Withdraw", - "stake": "Stake", - "unstake": "Unstake", - "claim": "Claim", - "mint": "Mint", - "burn": "Burn" + "viewExplorer": "View in Explorer" }, "dpTransactionDetails": "DP Details", "easyTransfer": "Easy Transfer", @@ -182,22 +123,35 @@ "estimatedFee": "Estimated Fee", "failed": "Failed", "fee": "Fee", + "feeEdit": { + "belowMinFee": "Fee cannot be lower than minimum fee {{minFee}} {{symbol}}", + "currentFee": "Current Fee", + "customFee": "Custom Fee", + "invalidFee": "Please enter a valid fee", + "minFee": "Minimum Fee", + "presetFast": "Fast", + "presetMin": "Minimum", + "presetRecommend": "Recommended", + "title": "Edit Network Fee" + }, "finallyReceive": "Finally receive:", "forOvertimeTransactionTips": "For overtime transactions, you can check whether the transaction is successful through the blockchain explorer.", "from": "From", + "fromAddress": "From", "getAssetTypeBalance": "Get asset type balance", "history": { "emptyDesc": "No transactions found with current filters", "emptyTitle": "No transactions", "filter": { - "chainLabel": "Chain", - "periodLabel": "Period", "allChains": "All Chains", "allTime": "All", + "chainLabel": "Chain", "days30": "30 Days", "days7": "7 Days", - "days90": "90 Days" + "days90": "90 Days", + "periodLabel": "Period" }, + "loadFailed": "Transaction History加载失败", "noWallet": "Please create or import a wallet first", "title": "Transaction History", "totalRecords": "{{count}} records", @@ -208,6 +162,23 @@ "initiateTransfer": "Initiate Transfer", "insufficientBalanceIn_{symbol}": "Insufficient balance in", "insufficientBalanceUnableToConductTransactions": "Insufficient balance, unable to conduct transactions", + "method": { + "approve": "Approve", + "burn": "Burn", + "claim": "Claim", + "deposit": "Deposit", + "execute": "Execute", + "mint": "Mint", + "multicall": "Multi-call", + "stake": "Stake", + "swap": "Swap", + "swapExactETHForTokens": "Swap ETH for Tokens", + "swapExactTokensForETH": "Swap Tokens for ETH", + "swapExactTokensForTokens": "Swap Tokens", + "transfer": "Transfer", + "unstake": "Unstake", + "withdraw": "Withdraw" + }, "minerFee": "Miner fee", "minnerFee": "Miner fee", "newTransfer": "New Transfer", @@ -215,17 +186,73 @@ "paymentDetails": "Payment Details", "paymentInfo": "Payment Info", "pending": "Pending", + "pendingTx": { + "broadcasted": "Awaiting confirmation", + "broadcasting": "Broadcasting", + "clearAllFailed": "Clear failed", + "delete": "Delete", + "failed": "Broadcast failed", + "retry": "Retry", + "retryCount": "Retry count", + "title": "Pending Transactions", + "viewAll": "View all {{count}} pending transactions", + "waitingFor": "Waiting for {{seconds}}s" + }, "promptForDuplicateTransfer": "There is an identical transfer that has not arrived, can you wait for the confirmation of the transfer, or continue with a new transfer?", "receive": "Receive", "receiveAddress": "Receive address", "receiveCannotBeTheSame": "Receive cannot be the same", + "receivePage": { + "addressCopied": "Address copied", + "copied": "Copied", + "copyAddress": "Copy Address", + "imageSaved": "Image saved", + "networkWarning": "Only {{chain}} network assets can be transferred in, assets from other networks cannot be recovered", + "receiveAddress": "Receive Address", + "saveImage": "Save Image", + "scanQrCode": "Scan QR code to transfer to this address", + "share": "Share", + "shareTitle": "BFM Pay Receive Address", + "title": "Receive" + }, "receiver": "Receiver", - "scanAndTransferTheAsset": "[MISSING:en] 扫一扫,转账 /", - "scanAndTransferToMe": "[MISSING:en] 扫一扫转入 /", + "scanAndTransferTheAsset": "Scan to transfer /", + "scanAndTransferToMe": "Scan to receive /", "scanToAssetTypeTransfer": "Scan to transfer ()", "scanToTransfer": "Scan to transfer", "selectTransferChain": "Select transfer chain", "send": "Send", + "sendPage": { + "amountLabel": "Amount", + "assetLabel": "Transfer Asset", + "cameraPermissionRequired": "Camera permission required for scanning", + "continue": "Continue", + "explorerNotImplemented": "Block explorer feature coming soon", + "fee": "Fee", + "from": "From", + "networkWarning": "Please ensure the recipient address is a {{chain}} network address. Sending to the wrong network cannot be recovered", + "resultTitle": "Send Result", + "scanFailed": "Scan failed, please enter manually", + "scanSuccess": "Scan successful", + "title": "Send", + "toAddressLabel": "Recipient Address", + "toAddressPlaceholder": "Enter {{chain}} address", + "twoStepSecretDescription": "This address has a security password set. Please enter your security password to confirm the transfer.", + "twoStepSecretError": "Incorrect security password", + "twoStepSecretPlaceholder": "Enter security password", + "twoStepSecretTitle": "Security Password Required" + }, + "sendResult": { + "back": "Back", + "done": "Done", + "failed": "Transfer Failed", + "pending": "Processing...", + "retry": "Retry", + "sentTo": "Sent to {{address}}", + "success": "Transfer Successful", + "txHash": "Transaction Hash:", + "viewInBrowser": "View in Browser" + }, "sendingAddress": "Sending address", "stake": "Stake", "status": { @@ -233,21 +260,31 @@ "failed": "Failed", "pending": "Pending" }, - "toAddress": "To", - "fromAddress": "From", "swap": "Swap", "theCurrentAddressDoesNotHave_{assettype}AssetsAndCannotBeTransferred": "The current address does not have assets and cannot be transferred.", "theFrozenAddressCannotBeTransferred": "The frozen address cannot be transferred", - "theMinimumMinerFeeIs_{fee}": "[MISSING:en] 本次交易最低矿工费为:", + "theMinimumMinerFeeIs_{fee}": "Minimum miner fee for this transaction:", "theRecommendedMinerFee_{fee}": "The recommended miner fee is:", "thisAddressOnlySupportsAssetsPleaseDoNotTransferToOtherPublicChainAssets": "This address only supports assets, please do not transfer to other public chain assets.", - "thisAddressOnlySupportsEthereumAssetsPleaseDoNotTransferToOtherPublicChainAssets": "[MISSING:en] 该地址只支持 Ethereum 资产, 请不要转账给其它非兼容的区块链资产。", + "thisAddressOnlySupportsEthereumAssetsPleaseDoNotTransferToOtherPublicChainAssets": "This address only supports Ethereum assets", "to": "To", + "toAddress": "To", "to_(receive_{asset})": "To(Receive )", "transactionDetails": "Transaction Details", "transactionHash": "Transaction Hash", "transactionHistory": "Transaction history", "transactionSentSuccessfully": "Transaction sent successfully", + "transfer": { + "daysAgo": "{{days}} days ago", + "newTransfer": "New Transfer", + "quickTransfer": "Quick Transfer", + "quickTransferDesc": "Select recent contact or enter new address", + "recentContacts": "Recent Contacts", + "today": "Today", + "transferHistory": "Transfer History", + "transferTo": "Transfer to {{name}}", + "yesterday": "Yesterday" + }, "transferAction": "Transfer", "transferAmount": "Transfer amount", "transferQuantityCannotBeGreaterThanBalance": "Transfer quantity cannot be greater than balance", @@ -255,90 +292,54 @@ "tronLessFeeTips": "At present, there is less TRX, and continued transfers may fail due to insufficient handling fees.", "tronNetworkFeeLongTips_1": "The network fee will vary according to networksituation, once the transaction is confirmed, the fee cannot be refunded regardless of whether the transaction is successful or not.", "tronNetworkFeeLongTips_2": "The network fee is charged by the TRON network, and BFM Pay does not charge any fees !", + "txStatus": { + "autoCloseIn": "Auto-closing in {{seconds}}s", + "broadcasted": "Broadcast Successful", + "broadcastedDesc": "Transaction broadcasted, awaiting block confirmation...", + "broadcasting": "Broadcasting", + "broadcastingDesc": "Broadcasting transaction to the network...", + "closeIn": "Close ({{seconds}}s)", + "confirmed": "Transaction Confirmed", + "confirmedDesc": "Transaction has been confirmed on chain", + "confirming": "Awaiting Confirmation", + "confirmingDesc": "Waiting for block confirmation...", + "created": "Pending Broadcast", + "createdDesc": "Transaction created, waiting to broadcast...", + "failed": "Transaction Failed", + "failedDesc": "Transaction failed, please try again later", + "viewDetails": "View Details" + }, "type": { - "send": "Send", - "receive": "Receive", - "signature": "Set Security Password", - "stake": "Stake", - "unstake": "Unstake", + "approve": "Approve", + "certificate": "Certificate", + "dapp": "DApp", "destroy": "Destroy", + "destroyEntity": "Destroy Entity", + "emigrate": "Emigrate", + "exchange": "Exchange", "gift": "Gift", "grab": "Accept Gift", - "trust": "Trust", - "signFor": "Sign For", - "emigrate": "Emigrate", "immigrate": "Immigrate", - "exchange": "Exchange", - "swap": "Swap", - "issueAsset": "Issue Asset", "increaseAsset": "Increase Asset", - "mint": "Mint", + "interaction": "Contract Interaction", + "issueAsset": "Issue Asset", "issueEntity": "Issue Entity", - "destroyEntity": "Destroy Entity", "locationName": "Location Name", - "dapp": "DApp", - "certificate": "Certificate", "mark": "Mark", - "approve": "Approve", - "interaction": "Contract Interaction", - "other": "Other" + "mint": "Mint", + "other": "Other", + "receive": "Receive", + "send": "Send", + "signFor": "Sign For", + "signature": "Set Security Password", + "stake": "Stake", + "swap": "Swap", + "trust": "Trust", + "unstake": "Unstake" }, "unstake": "Unstake", - "viewTransactionDetails": "[MISSING:en] 查看交易详情", + "viewTransactionDetails": "View transaction details", "youFinallyReceive": "You finally receive", "youMustReceive_{asset}QuantityGreaterThan_0": "You must receive quantity greater than 0", - "{chainsymbol}IsNotEnoughToCoverFees": "is not enough to cover fees", - "feeEdit": { - "title": "Edit Network Fee", - "currentFee": "Current Fee", - "minFee": "Minimum Fee", - "customFee": "Custom Fee", - "presetMin": "Minimum", - "presetRecommend": "Recommended", - "presetFast": "Fast", - "invalidFee": "Please enter a valid fee", - "belowMinFee": "Fee cannot be lower than minimum fee {{minFee}} {{symbol}}" - }, - "txStatus": { - "created": "Pending Broadcast", - "broadcasting": "Broadcasting", - "broadcasted": "Broadcast Successful", - "confirming": "Awaiting Confirmation", - "confirmed": "Transaction Confirmed", - "failed": "Transaction Failed", - "createdDesc": "Transaction created, waiting to broadcast...", - "broadcastingDesc": "Broadcasting transaction to the network...", - "broadcastedDesc": "Transaction broadcasted, awaiting block confirmation...", - "confirmingDesc": "Waiting for block confirmation...", - "confirmedDesc": "Transaction has been confirmed on chain", - "failedDesc": "Transaction failed, please try again later", - "viewDetails": "View Details", - "autoCloseIn": "Auto-closing in {{seconds}}s", - "closeIn": "Close ({{seconds}}s)" - }, - "broadcast": { - "assetNotEnough": "Insufficient asset balance", - "feeNotEnough": "Insufficient fee", - "rejected": "Transaction rejected", - "unknown": "Broadcast failed, please try again", - "alreadyExists": "Transaction already exists", - "forbidden": "Operation forbidden", - "assetNotExist": "Asset does not exist", - "invalidParams": "Invalid parameters", - "accountFrozen": "Account is frozen", - "timeout": "Broadcast timeout, please retry", - "failed": "Broadcast failed" - }, - "pendingTx": { - "title": "Pending Transactions", - "broadcasting": "Broadcasting", - "broadcasted": "Awaiting confirmation", - "failed": "Broadcast failed", - "retry": "Retry", - "delete": "Delete", - "retryCount": "Retry count", - "waitingFor": "Waiting for {{seconds}}s", - "viewAll": "View all {{count}} pending transactions", - "clearAllFailed": "Clear failed" - } -} \ No newline at end of file + "{chainsymbol}IsNotEnoughToCoverFees": "is not enough to cover fees" +} diff --git a/src/i18n/locales/en/wallet.json b/src/i18n/locales/en/wallet.json index d5f8d8f1b..1b6378f3b 100644 --- a/src/i18n/locales/en/wallet.json +++ b/src/i18n/locales/en/wallet.json @@ -2,6 +2,14 @@ "add": "Add Wallet", "defaultName": "My Wallet", "randomName": "Random Name", + "carousel": { + "walletCount": "{{count}} Wallets", + "walletCount_one": "1 Wallet" + }, + "menu": { + "addressBalanceQuery": "Address Balance Query", + "addressTransactionsQuery": "Address Transactions Query" + }, "chains": { "title": "Manage Wallet Networks", "verifyTitle": "Verify Wallet Lock", @@ -33,7 +41,7 @@ "allowsGettingTheAddressesOfAllWalletsInTheApplication": "Allows getting the addresses of all wallets in the application", "allowsToGetTheAddressOfEachNetworkOfTheCurrentWallet": "Allows to get the address of each network of the current wallet", "alreadyHaveAWallet": "Already have a wallet", - "alreadyHaveAWalletGoToRestore": "[MISSING:en] 恢复钱包", + "alreadyHaveAWalletGoToRestore": "Restore Wallet", "anytimeAnywhereManageYourDigitalAssets": "Anytime, anywhere <br /> Manage your digital assets", "applyAddress": "Apply Address", "areYouSureYouWantToDeleteThisAddress": "Are you sure you want to delete this address?", @@ -53,7 +61,7 @@ "create/importWallet": "Create/Import Wallet", "createEntity": "Create entity", "createEntityFactory": "Create entity factory", - "createImport": "[MISSING:en] 创建 / 导入", + "createImport": "Create / Import", "createWallet": "Create Wallet", "createWallet_{symbol}": "Create Wallet ()", "created": "Created", @@ -64,17 +72,17 @@ "destoryAsset": "Destory asset", "doesNotMatchAddressRule": "Does not match address rule", "edit address": "Edit Address", - "enterOrPasteTheWalletAddress": "[MISSING:en] 输入或者粘贴钱包地址", + "enterOrPasteTheWalletAddress": "Enter or paste wallet address", "enterTheAddressOf_{chain}": "Enter the address of", "enterWallet": "Enter wallet", "exitAllWalletIn_{appName}": "Exit all wallet In", "exit_{mainwallet}": "Exit """, "exportPrivateKey": "Export Private Key", - "exportPrivateKeyTips": "[MISSING:en] export-private-key-tips", + "exportPrivateKeyTips": "export-private-key-tips", "frozeMainAssetPrealnum": "Frozen Main Asset Prealnum", "frozenAddressesCannotBeSet": "Frozen addresses cannot be set", "genesisaddress": "Genesis Address", - "ifItIsNotBackedUpTheWalletCannotBeRestoredAndAssetLossMayResult": "[MISSING:en] 若未完成助记词备份,将无法恢复钱包,同时可能造成资产损失。", + "ifItIsNotBackedUpTheWalletCannotBeRestoredAndAssetLossMayResult": "If backup is not completed, wallet cannot be restored and assets may be lost", "importTheAccountWithThePrivateKey": "Import the account with the private key", "importTheWalletOfTheAddressAndThePerformTheSigningOperation": "Import the wallet of the address and then perform the signing operation", "importWallet": "Import Wallet", @@ -135,8 +143,8 @@ "manageIdentityWallet": "Manage Identity Wallet", "manageIdentityWallets": "Manage Identity Wallets", "manageWallet": "Manage Wallet", - "manageWallets": "[MISSING:en] 管理钱包", - "mnageIdentityWallet": "[MISSING:en] manage-identity-wallet", + "manageWallets": "Manage Wallets", + "mnageIdentityWallet": "manage-identity-wallet", "modifyAddress": "Modify Address", "modifyWalletName": "Modify Wallet Name", "multiChainSupport": "Multi chain <br /> support", @@ -144,7 +152,7 @@ "newCreateWallet": "Create Wallet", "nonIdentityAssociateAllChainTips": "The original non-identity wallet will associate all corresponding chains according to the mnemonic phrase;", "notBackedUp": "Not backed up", - "notFindCurrentlyActiveWallet": "[MISSING:en] 未找到当前激活的钱包", + "notFindCurrentlyActiveWallet": "Active wallet not found", "notImported": "(Not imported)", "obtainingThePrivateKeyIsEquivalentToOwningTheWalletAsset": "Obtaining the private key is equivalent to owning the wallet asset", "pleaseEnterAddress": "Please enter address", @@ -155,16 +163,16 @@ "receive": "Receive", "remainAssetPrealnum": "Remain Asset Prealnum", "restoreIdentity": "Restore Identity", - "restoreWallet": "[MISSING:en] 恢复钱包", + "restoreWallet": "Restore Wallet", "scanResulitsDoNotMatchAddressRules": "Scan results do not match address rules", "scan_{chain}AddressQrCode": "Scan address QR code", "searchForTokenName": "Token Name", "searchForTokenNameOrContractAddress": "Token Name/Contract Address", "selectAddressType": "Select Address Type", "selectAsset": "Select Asset", - "selectThisAddress": "[MISSING:en] 选择此地址", + "selectThisAddress": "Select this address", "selectWallet": "Select Wallet", - "selectWalletTransation": "[MISSING:en] 选择转账钱包", + "selectWalletTransation": "Select transfer wallet", "selectionChain": "Selection Chain", "selectionWallet": "Selection Wallet", "switchingWallets": "Switching wallets", @@ -176,7 +184,7 @@ "theWalletIsNotBackUpTips": "The wallet is not backed up. If you continue to exit, you may lose the wallet permanently. Are you sure you want to continue?", "thereIsAnUnbackedUpWalletIn_{appName}Tips": "There is an unbacked up wallet in . If you continue to exit, you may lose the wallet permanently. Are you sure you want to continue?", "thisRequestDoesNotHaveAMatchingWalletInCotPleaseAddTheCorrespondingWalletFirstAndTryAgain": "This request does not have a matching wallet in BFM Pay. Please add the corresponding wallet first and try again.", - "toRestoreTheWalletInOrderToEnsureTheSecurityOfThe": "[MISSING:en] to restore the wallet. In order to ensure the security of the", + "toRestoreTheWalletInOrderToEnsureTheSecurityOfThe": "To restore the wallet securely", "to_({chain})": "To()", "tokenDetail": "Token Detail", "transfer": "Transfer", @@ -188,9 +196,9 @@ "walletName": "Wallet Name", "walletNameMustBe_1_12CharactersLong": "wallet name must be 1~12 characters long", "walletSettings": "Wallet settings", - "wallets": "[MISSING:en] 钱包", + "wallets": "Wallets", "walletsOriginallyImportedWillBeMergedTips": "Wallets originally imported from different chains with the same mnemonic phrase will be merged;", - "walletsUnderIdentity": "[MISSING:en] 身份钱包", + "walletsUnderIdentity": "Identity Wallets", "willSynchronizeImportIntoThe_{chainname}ChainWithTheSamePrivateKey": "Will synchronize import into the chain with the same private key", "{assetType}Details": "Details", "{asset}TotalCirculation": "total circulation" diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index bc854287e..6424b41c4 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -8,6 +8,45 @@ "scanToAdd": "扫码添加联系人", "transferToMe": "扫码向我转账" }, + "ecosystem": { + "runningApps": "正在运行的应用", + "stackViewHints": "左右滑动切换 · 点击打开 · 上滑关闭", + "noAppsUsed": "还没有使用过的应用", + "goToDiscover": "去「发现」页面探索吧", + "appStack": "应用堆栈", + "chainNotSupported": "暂不支持此链", + "menu": { + "open": "打开", + "detail": "详情", + "remove": "移除" + } + }, + "chains": { + "ethereum": "Ethereum", + "bitcoin": "Bitcoin", + "tron": "Tron", + "binance": "BSC", + "bfmeta": "BFMeta", + "ccchain": "CCChain", + "pmchain": "PMChain", + "bfchainv2": "BFChain V2", + "btgmeta": "BTGMeta", + "biwmeta": "BIWMeta", + "ethmeta": "ETHMeta", + "malibu": "Malibu" + }, + "weekdays": { + "0": "周日", + "1": "周一", + "2": "周二", + "3": "周三", + "4": "周四", + "5": "周五", + "6": "周六" + }, + "date": { + "format": "{{month}}月{{day}}日 {{weekday}}" + }, "paste": "粘贴", "addressPlaceholder": "输入或粘贴地址", "noAssets": "暂无资产", @@ -21,6 +60,7 @@ "tabHome": "首页", "tabTransfer": "转账", "tabWallet": "钱包", + "tabEcosystem": "生态", "tabSettings": "设置", "tabHistory": "交易记录", "scan": "扫描二维码", @@ -109,7 +149,6 @@ "codeOfThePrivateKey": "私钥的十六进制码", "comingSoonStayTuned": "即将上线,敬请期待", "comprehensiveEncryption": "全面加密", - "confirm": "确认", "confirmBackedUp": "确认已备份", "confirmToDelete": "确定删除?", "confirmToTurnOffTouchId": "确定要关闭指纹锁吗?", @@ -239,6 +278,11 @@ "reset": "重置", "resubmit": "重新提交", "retry": "重试", + "providerFallback": { + "queryFailed": "{{feature}} 查询失败", + "desc": "所有配置的提供商都失败了,显示默认值。", + "technicalDetails": "技术详情" + }, "save": "保存", "saving": "保存中...", "saved": "已保存", diff --git a/src/i18n/locales/zh-CN/ecosystem.json b/src/i18n/locales/zh-CN/ecosystem.json index 00c6d9c1a..579cfc368 100644 --- a/src/i18n/locales/zh-CN/ecosystem.json +++ b/src/i18n/locales/zh-CN/ecosystem.json @@ -20,5 +20,40 @@ "bio_signMessage": "签名消息", "bio_signTypedData": "签名数据", "bio_sendTransaction": "发起交易" + }, + "discover": { + "featured": "精选应用", + "get": "获取", + "searchPlaceholder": "搜索应用", + "empty": "暂无应用", + "recommended": "推荐", + "viewAll": "查看全部", + "hotApps": "热门应用" + }, + "demo": { + "swiper": { + "method1": "方案一:Controller 模块(官方推荐)", + "method3": "方案三:Context 封装模式", + "method3Desc": "使用 SwiperSyncProvider + useSwiperMember + Controller 模块实现跨组件同步", + "main": "主 Swiper", + "indicator": "指示器 Swiper", + "mainIndependent": "主 Swiper(独立组件)", + "indicatorIndependent": "指示器 Swiper(独立组件)", + "goTo": "跳转到第 {{index}} 页", + "progress": "进度", + "activeIndex": "当前索引", + "debugCombined": "进度: {{progress}} | 当前索引: {{index}}", + "debugProgress": "进度: {{value}}", + "debugActiveIndex": "当前索引: {{value}}" + } + }, + "stack": { + "title": "应用堆栈", + "runningApps": "运行中的应用", + "hints": "向上滑动关闭" + }, + "capsule": { + "more": "更多操作", + "close": "关闭应用" } -} +} \ No newline at end of file diff --git a/src/i18n/locales/zh-CN/home.json b/src/i18n/locales/zh-CN/home.json index 014a9504d..49117e693 100644 --- a/src/i18n/locales/zh-CN/home.json +++ b/src/i18n/locales/zh-CN/home.json @@ -7,14 +7,16 @@ }, "wallet": { "send": "转账", - "receive": "收款", + "receive": "接收", "assets": "资产", "noAssets": "暂无资产", "noAssetsOnChain": "{{chain}} 链上暂无代币", + "tokenBalance": "代币余额", + "transactionHistory": "交易历史", "selectNetwork": "选择网络", - "addressCopied": "地址已复制", + "addressCopied": "地址已复制到剪切板", "tokenActions": "资产操作", "transfer": "转账", "destroy": "销毁" } -} +} \ No newline at end of file diff --git a/src/i18n/locales/zh-CN/onboarding.json b/src/i18n/locales/zh-CN/onboarding.json index 3654aa090..037e64acc 100644 --- a/src/i18n/locales/zh-CN/onboarding.json +++ b/src/i18n/locales/zh-CN/onboarding.json @@ -31,6 +31,7 @@ "complete": "完成创建", "defaultWalletName": "主钱包", "walletSuffix": "钱包", + "generatedNamePattern": "{{word}}{{suffix}}", "createFailed": "创建钱包失败", "themeTitle": "选择卡片主题", "themeSubtitle": "为您的钱包卡片选择一个主题色", diff --git a/src/i18n/locales/zh-CN/transaction.json b/src/i18n/locales/zh-CN/transaction.json index 9c1f9d1bd..640216379 100644 --- a/src/i18n/locales/zh-CN/transaction.json +++ b/src/i18n/locales/zh-CN/transaction.json @@ -75,6 +75,7 @@ "noDestroyableAssets": "暂无可销毁的资产" }, "history": { + "loadFailed": "交易历史加载失败", "title": "交易记录", "noWallet": "请先创建或导入钱包", "totalRecords": "共 {{count}} 条记录", diff --git a/src/i18n/locales/zh-CN/wallet.json b/src/i18n/locales/zh-CN/wallet.json index b58125164..770139a3a 100644 --- a/src/i18n/locales/zh-CN/wallet.json +++ b/src/i18n/locales/zh-CN/wallet.json @@ -2,6 +2,13 @@ "add": "添加钱包", "defaultName": "我的钱包", "randomName": "随机名称", + "carousel": { + "walletCount": "{{count}} 个钱包" + }, + "menu": { + "addressBalanceQuery": "地址余额查询", + "addressTransactionsQuery": "地址交易查询" + }, "chains": { "title": "管理钱包网络", "verifyTitle": "验证钱包锁", diff --git a/src/i18n/locales/zh-TW/authorize.json b/src/i18n/locales/zh-TW/authorize.json index add7eda65..a2fec4938 100644 --- a/src/i18n/locales/zh-TW/authorize.json +++ b/src/i18n/locales/zh-TW/authorize.json @@ -13,7 +13,7 @@ "main": "僅目前錢包", "network": "所有 {{chainName}} 地址" }, - "selectNetwork": "[MISSING:zh-TW] 选择网络", + "selectNetwork": "選擇網路", "shareWith": "是否與該應用分享地址?" }, "app": { diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index 251c93d1f..7ca5bdfcd 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -28,6 +28,7 @@ "selectWallet": "選擇錢包", "showPassword": "顯示密碼", "skipToMain": "跳轉到主要內容", + "tabEcosystem": "生態", "tabHistory": "交易記錄", "tabHome": "首頁", "tabSettings": "設定", @@ -40,7 +41,7 @@ "acceptExchange": "接受交換", "account": "賬戶", "accountFromMime": "account from mime", - "accountWorks": "[MISSING:zh-TW] account works!", + "accountWorks": "account works!", "acquisitionTime": "入手時間", "add": "新增", "addressBook": { @@ -64,22 +65,22 @@ "verifyFailed": "驗證失敗" }, "addressLookup": { - "address": "[MISSING:zh-TW] 地址", - "addressOrHash": "[MISSING:zh-TW] 地址或交易哈希", - "addressOrHashPlaceholder": "[MISSING:zh-TW] 输入地址或交易哈希", - "addressPlaceholder": "[MISSING:zh-TW] 输入钱包地址", - "balanceTitle": "[MISSING:zh-TW] 地址余额查询", - "chain": "[MISSING:zh-TW] 链", - "error": "[MISSING:zh-TW] 查询失败", - "explorerHint": "[MISSING:zh-TW] 交易记录需要通过区块浏览器查询", - "noTransactions": "[MISSING:zh-TW] 暂无交易记录", - "onChain": "[MISSING:zh-TW] 在 {{chain}} 上", - "openExplorer": "[MISSING:zh-TW] 打开 {{name}} 浏览器", - "otherChains": "[MISSING:zh-TW] 其他链", - "queryError": "[MISSING:zh-TW] 查询交易失败,请稍后重试", - "transactionsTitle": "[MISSING:zh-TW] 地址交易查询", - "useExplorerHint": "[MISSING:zh-TW] 该链不支持直接查询交易历史,请使用浏览器查看", - "viewOnExplorer": "[MISSING:zh-TW] 在 {{name}} 浏览器中查看" + "address": "地址", + "addressOrHash": "地址或交易哈希", + "addressOrHashPlaceholder": "輸入地址或交易雜湊", + "addressPlaceholder": "輸入錢包地址", + "balanceTitle": "地址余额查询", + "chain": "鏈", + "error": "查詢失敗", + "explorerHint": "交易記錄需要透過區塊瀏覽器查詢", + "noTransactions": "暫無交易記錄", + "onChain": "在 {{chain}} 上", + "openExplorer": "開啟 {{name}} 瀏覽器", + "otherChains": "其他鏈", + "queryError": "查詢交易失敗,請稍後重試", + "transactionsTitle": "地址交易查询", + "useExplorerHint": "此鏈不支援直接查詢交易歷史,請使用瀏覽器查看", + "viewOnExplorer": "在 {{name}} 瀏覽器中查看" }, "addressPlaceholder": "輸入或貼上地址", "advancedEncryptionTechnologyDigitalWealthIsMoreSecure": "先進的加密技術 <br /> 數字財富更安全", @@ -98,13 +99,27 @@ "bandwidth": "帶寬", "beSureToKeepThePrivateKeyInASafePlaceIfThePrivateKeyIsLostItCannotBeRetrieved": "請務必將私鑰保存至安全的地方 私鑰丟失將無法找回", "belongingAlbum": "所屬專輯", - "bgPrimary": "[MISSING:zh-TW] bg-primary", + "bgPrimary": "bg-primary", "bip39Index": "序號", "byContinuingToUseItYouAgreeToTheUserAgreement": "繼續使用,即代表您已同意 《用戶協議》", "cancel": "取消", - "cardWorks": "[MISSING:zh-TW] card works!", + "cardWorks": "card works!", "certificate": "認證", - "clickToCopy": "[MISSING:zh-TW] 点击复制", + "chains": { + "bfchainv2": "BFChain V2", + "bfmeta": "BFMeta", + "binance": "BSC", + "bitcoin": "Bitcoin", + "biwmeta": "BIWMeta", + "btgmeta": "BTGMeta", + "ccchain": "CCChain", + "ethereum": "Ethereum", + "ethmeta": "ETHMeta", + "malibu": "Malibu", + "pmchain": "PMChain", + "tron": "Tron" + }, + "clickToCopy": "點擊複製", "clickToShowTheQr": "Click to show the QR", "clickToShowTheQrCodeOfThePrivateKey": "點擊展示私鑰二維碼", "close": "退出", @@ -138,26 +153,46 @@ "selectContact": "選擇聯絡人", "viewAll": "查看全部聯絡人" }, + "contactCard": { + "scanToAdd": "掃碼添加聯絡人", + "transferToMe": "掃碼向我轉帳" + }, "continue": "繼續", "contractMethods": "合約方法", "contractRiskWarning": "合約具有一定的風險性。用戶須確認合約代碼的安全性。授權即接受該合約", - "copied": "[MISSING:zh-TW] 已复制", + "copied": "已複製", "copiedToClipboard": "已複製到剪貼簿", - "copy": "[MISSING:zh-TW] 复制", + "copy": "複製", "copyPrivateKey": "複製私鑰", "copySuccess": "複製成功", "copyThePrivateKey": "複製私鑰", - "copyToClipboard": "[MISSING:zh-TW] 已复制到剪贴板", + "copyToClipboard": "已複製到剪贴板", "couldBeWithin_30Seconds": "預計30秒", "creator": "創作者", + "date": { + "format": "{{month}}月{{day}}日 {{weekday}}" + }, "delete": "刪除", "destroy": "銷毀", - "done": "[MISSING:zh-TW] 完成", + "done": "完成", "download": "下載", "dpInTab": "dp-in-tab", "dpName": "DP名稱", "dpType": "類型", "dueToTheUpgradeOfTheNewVersionOf_{appName}Tips": "由於 新版本的升級,優化了錢包數據結構與互動邏輯,舊資料將做以下修改。", + "ecosystem": { + "appStack": "應用堆疊", + "chainNotSupported": "暫不支援此鏈", + "goToDiscover": "去「發現」頁面探索吧", + "menu": { + "detail": "詳情", + "open": "開啟", + "remove": "移除" + }, + "noAppsUsed": "還沒有使用過的應用", + "runningApps": "正在執行的應用", + "stackViewHints": "左右滑動切換 · 點擊開啟 · 上滑關閉" + }, "edit": "編輯", "energy": "能量", "english": "English", @@ -183,7 +218,7 @@ "from": "來自", "frozen": "凍結", "get_(estimate)": "獲得(估計)", - "goHome": "[MISSING:zh-TW] 主页", + "goHome": "主頁", "goToCosmicdp": "前往 CosmicDP 交易", "goToCosmicdpForTrading": "前往 CosmicDP 交易", "hint": "提示", @@ -212,6 +247,20 @@ "modifyName": "修改名稱", "modityIdentityName": "修改錢包名稱", "more": "更多", + "myCard": { + "addWallet": "新增錢包", + "changeAvatar": "點擊換頭像", + "currentChain": "目前鏈", + "defaultName": "我的名片", + "editUsername": "點擊編輯使用者名稱", + "maxWallets": "最多選擇 {{max}} 個錢包", + "noWalletsSelected": "請選擇至少一個錢包", + "scanToAdd": "掃碼新增我為聯絡人", + "selectWallets": "選擇錢包", + "title": "我的名片", + "usernamePlaceholder": "輸入使用者名稱", + "walletAddress": "{{wallet}} ({{chain}})" + }, "name": "名稱", "navOverview": "概覽", "network": "網絡", @@ -249,13 +298,14 @@ "probablyWithin_15Seconds": "預計15秒", "probablyWithin_30Seconds": "Probably within 30 seconds", "project": "項目", + "providerFallback": { + "desc": "所有配置的節點均失敗,正在顯示默認值。", + "queryFailed": "{{feature}} 查詢失敗", + "technicalDetails": "技術詳情" + }, "publishDate": "發行時間", "quantity": "數量", "receive": "收款", - "contactCard": { - "scanToAdd": "掃碼添加聯絡人", - "transferToMe": "掃碼向我轉帳" - }, "receivingGifts": "資產接收", "refuse": "拒絕", "reject": "拒絕", @@ -272,7 +322,8 @@ "requsetTwo": "請求二", "reset": "重置", "resubmit": "重新提交", - "retry": "[MISSING:zh-TW] 重试", + "retry": "重試", + "retrying": "重試中...", "save": "保存", "saveQrCode": "保存二維碼", "saveSuccessful": "保存成功", @@ -288,8 +339,8 @@ "shareCancel": "分享取消", "shareCanceled": "分享取消", "shareSuccessful": "分享成功", - "showLess": "[MISSING:zh-TW] 收起", - "showMore": "[MISSING:zh-TW] 显示更多", + "showLess": "收起", + "showMore": "顯示更多", "signIn": "登錄", "similarConract": "智能合约", "skip": "跳過", @@ -339,12 +390,21 @@ "userAgreement": "用戶協議", "userAvatorAndNikename": "用戶頭像和昵稱", "validationSucceeded": "驗證成功", - "verifying": "[MISSING:zh-TW] 验证中...", + "verifying": "驗證中...", "version": "版本", "versionUpgrade": "版本更新", "viewInBrowser": "在瀏覽器中查看", "viewPrivateKey": "查看助記詞", "website": "官網", + "weekdays": { + "0": "週日", + "1": "週一", + "2": "週二", + "3": "週三", + "4": "週四", + "5": "週五", + "6": "週六" + }, "welcomeToCot": "Welcome To BFM Pay", "wellDone": "幹得漂亮!", "words": "個字", @@ -353,4 +413,4 @@ "{{length}}Words": "個字", "中文(简体)": "中文(简体)", "中文(繁體)": "中文(繁體)" -} \ No newline at end of file +} diff --git a/src/i18n/locales/zh-TW/ecosystem.json b/src/i18n/locales/zh-TW/ecosystem.json index ca961c705..ddda46cdb 100644 --- a/src/i18n/locales/zh-TW/ecosystem.json +++ b/src/i18n/locales/zh-TW/ecosystem.json @@ -1,24 +1,59 @@ { - "title": "[MISSING:zh-TW] 生态", - "empty": "[MISSING:zh-TW] 暂无小程序", - "loading": "[MISSING:zh-TW] 加载中...", - "notFound": "[MISSING:zh-TW] 小程序不存在", - "refresh": "[MISSING:zh-TW] 刷新", + "title": "生態", + "empty": "暫無小程式", + "loading": "載入中...", + "notFound": "小程式不存在", + "refresh": "重新整理", "sources": { - "title": "[MISSING:zh-TW] 可信源管理", - "add": "[MISSING:zh-TW] 添加订阅", - "remove": "[MISSING:zh-TW] 移除", - "empty": "[MISSING:zh-TW] 暂无订阅源" + "title": "可信源管理", + "add": "添加訂閱", + "remove": "移除", + "empty": "暫無訂閱源" }, "permissions": { - "title": "[MISSING:zh-TW] 权限请求", - "grant": "[MISSING:zh-TW] 授权", - "deny": "[MISSING:zh-TW] 拒绝", - "bio_requestAccounts": "[MISSING:zh-TW] 访问钱包地址", - "bio_selectAccount": "[MISSING:zh-TW] 选择账户", - "bio_pickWallet": "[MISSING:zh-TW] 选择其他钱包", - "bio_signMessage": "[MISSING:zh-TW] 签名消息", - "bio_signTypedData": "[MISSING:zh-TW] 签名数据", - "bio_sendTransaction": "[MISSING:zh-TW] 发起交易" + "title": "權限請求", + "grant": "授權", + "deny": "拒絕", + "bio_requestAccounts": "存取錢包地址", + "bio_selectAccount": "選擇帳戶", + "bio_pickWallet": "選擇其他錢包", + "bio_signMessage": "簽名消息", + "bio_signTypedData": "簽名數據", + "bio_sendTransaction": "發起交易" + }, + "discover": { + "featured": "精選應用", + "get": "獲取", + "searchPlaceholder": "搜尋應用", + "empty": "暫無應用", + "recommended": "推薦", + "viewAll": "查看全部", + "hotApps": "熱門應用" + }, + "demo": { + "swiper": { + "method1": "方案一:Controller 模塊(官方推薦)", + "method3": "方案三:Context 封裝模式", + "method3Desc": "使用 SwiperSyncProvider + useSwiperMember + Controller 模塊實現跨組件同步", + "main": "主 Swiper", + "indicator": "指示器 Swiper", + "mainIndependent": "主 Swiper(獨立組件)", + "indicatorIndependent": "指示器 Swiper(獨立組件)", + "goTo": "跳轉到第 {{index}} 頁", + "progress": "進度", + "activeIndex": "當前索引", + "debugCombined": "進度: {{progress}} | 當前索引: {{index}}", + "debugProgress": "進度: {{value}}", + "debugActiveIndex": "當前索引: {{value}}" + } + }, + "stack": { + "title": "應用堆棧", + "runningApps": "運行中的應用", + "hints": "向上滑動關閉" + }, + "capsule": { + "more": "更多操作", + "close": "關閉應用" } -} +} \ No newline at end of file diff --git a/src/i18n/locales/zh-TW/empty.json b/src/i18n/locales/zh-TW/empty.json index 3d8d442fb..5389a17d1 100644 --- a/src/i18n/locales/zh-TW/empty.json +++ b/src/i18n/locales/zh-TW/empty.json @@ -1,4 +1,4 @@ { - "description": "[MISSING:zh-TW] 这里空空如也", - "title": "[MISSING:zh-TW] 暂无内容" + "description": "這裡空空如也", + "title": "暫無內容" } diff --git a/src/i18n/locales/zh-TW/home.json b/src/i18n/locales/zh-TW/home.json index 7391661ee..8ed034ec3 100644 --- a/src/i18n/locales/zh-TW/home.json +++ b/src/i18n/locales/zh-TW/home.json @@ -2,14 +2,16 @@ "wallet": { "addressCopied": "地址已複製", "assets": "資產", - "destroy": "[MISSING:zh-TW] 销毁", + "destroy": "銷毀", "noAssets": "暫無資產", "noAssetsOnChain": "{{chain}} 鏈上暫無代幣", "receive": "收款", "selectNetwork": "選擇網絡", "send": "轉賬", - "tokenActions": "[MISSING:zh-TW] 资产操作", - "transfer": "[MISSING:zh-TW] 转账" + "tokenActions": "資產操作", + "tokenBalance": "代幣餘額", + "transactionHistory": "交易歷史", + "transfer": "轉帳" }, "welcome": { "createWallet": "創建新錢包", diff --git a/src/i18n/locales/zh-TW/notification.json b/src/i18n/locales/zh-TW/notification.json index 9834b5dff..1142d22a1 100644 --- a/src/i18n/locales/zh-TW/notification.json +++ b/src/i18n/locales/zh-TW/notification.json @@ -1,41 +1,58 @@ { + "clear": "清空", + "delete": "刪除", + "empty": { + "desc": "您的所有通知都會顯示在這裡", + "title": "暫無通知" + }, + "markAllRead": "全部已讀", + "noUnread": "沒有未讀通知", + "pendingTx": { + "broadcasted": { + "message": "{{type}} {{amount}} {{symbol}} 已廣播,等待確認", + "messageSimple": "交易已廣播到網路,等待區塊確認", + "title": "交易已廣播" + }, + "confirmed": { + "message": "{{type}} {{amount}} {{symbol}} 已成功上鏈", + "messageSimple": "交易已成功確認上鏈", + "title": "交易已確認" + }, + "failed": { + "message": "廣播失敗,請重試", + "title": "交易失敗" + } + }, "permission": { - "title": "開啟通知", - "description": "接收交易狀態更新和重要安全提醒", - "enable": "開啟通知", - "skip": "暫不開啟", "benefits": { - "transaction": { - "title": "交易狀態", - "description": "即時收到轉帳和交易確認的通知" - }, "instant": { - "title": "即時提醒", - "description": "收款到帳、交易完成時第一時間知曉" + "description": "收款到帳、交易完成時第一時間知曉", + "title": "即時提醒" }, "security": { - "title": "安全提醒", - "description": "帳戶安全相關的重要通知不會錯過" + "description": "帳戶安全相關的重要通知不會錯過", + "title": "安全提醒" + }, + "transaction": { + "description": "即時收到轉帳和交易確認的通知", + "title": "交易狀態" } - } - }, - "title": "通知中心", - "markAllRead": "全部已讀", - "unreadCount": "{{count}} 條未讀", - "noUnread": "沒有未讀通知", - "clear": "清空", - "delete": "刪除", - "unread": "未讀", - "empty": { - "title": "暫無通知", - "desc": "您的所有通知都會顯示在這裡" + }, + "description": "接收交易狀態更新和重要安全提醒", + "enable": "開啟通知", + "skip": "暫不開啟", + "title": "開啟通知" }, "time": { + "daysAgo": "{{count}}天前", + "hoursAgo": "{{count}}小時前", "justNow": "剛剛", "minutesAgo": "{{count}}分鐘前", - "hoursAgo": "{{count}}小時前", - "daysAgo": "{{count}}天前", "today": "今天", "yesterday": "昨天" - } + }, + "title": "通知中心", + "unread": "未讀", + "unreadCount": "{{count}} 條未讀", + "viewDetails": "查看詳情" } diff --git a/src/i18n/locales/zh-TW/onboarding.json b/src/i18n/locales/zh-TW/onboarding.json index 5397ae565..11a031816 100644 --- a/src/i18n/locales/zh-TW/onboarding.json +++ b/src/i18n/locales/zh-TW/onboarding.json @@ -40,6 +40,7 @@ "createFailed": "建立錢包失敗", "defaultWalletName": "主錢包", "walletSuffix": "錢包", + "generatedNamePattern": "{{word}}{{suffix}}", "enterWallet": "進入錢包", "form": { "agreementPrefix": "我已閱讀並同意", @@ -122,9 +123,9 @@ "invalidMnemonic": "助記詞無效,請檢查拼寫", "nextStep": "下一步", "success": { - "description": "[MISSING:zh-TW] 钱包 {{name}} 已成功导入", - "enterWallet": "[MISSING:zh-TW] 进入钱包", - "title": "[MISSING:zh-TW] 导入成功" + "description": "錢包 {{name}} 已成功導入", + "enterWallet": "進入錢包", + "title": "導入成功" }, "title": "匯入錢包", "words12": "12 個單詞", diff --git a/src/i18n/locales/zh-TW/security.json b/src/i18n/locales/zh-TW/security.json index 4ce109771..2634e2095 100644 --- a/src/i18n/locales/zh-TW/security.json +++ b/src/i18n/locales/zh-TW/security.json @@ -64,9 +64,9 @@ "entered": "已輸入 {{filled}}/{{total}} 個單詞" }, "noBackup": "未備份", - "password": "[MISSING:zh-TW] 密码", + "password": "密碼", "passwordConfirm": { - "verifying": "[MISSING:zh-TW] 验证中..." + "verifying": "驗證中..." }, "patternLock": { "clear": "清除圖案", @@ -114,7 +114,7 @@ "broadcastSuccess": "廣播成功", "confirmDesc": "請再次輸入安全密碼以確認", "confirmPlaceholder": "請再次輸入安全密碼", - "confirmTitle": "[MISSING:zh-TW] 确认安全密码", + "confirmTitle": "確認安全密碼", "feeInfo": "設置安全密碼需要支付網路手續費", "inputDesc": "請設置一個安全密碼,用於保護您的轉賬安全", "inputPlaceholder": "請輸入安全密碼", @@ -139,7 +139,7 @@ "error": "圖案錯誤,請重試", "unlockDesc": "請繪製錢包鎖圖案", "unlockTitle": "解鎖錢包", - "verifyTitle": "[MISSING:zh-TW] 验证钱包", + "verifyTitle": "驗證錢包", "verifying": "驗證中..." }, "whenTurnesOnYouCanUseYourFingerprintInsteadOfPassword": "開啟後,將启用指紋鎖", diff --git a/src/i18n/locales/zh-TW/settings.json b/src/i18n/locales/zh-TW/settings.json index 56fbae8f6..fbb010382 100644 --- a/src/i18n/locales/zh-TW/settings.json +++ b/src/i18n/locales/zh-TW/settings.json @@ -94,6 +94,7 @@ "clearData": "清空應用程式資料", "currency": "貨幣單位", "language": "語言", + "myCard": "我的名片", "storage": "儲存空間", "viewMnemonic": "查看助記詞", "walletChains": "錢包網路", @@ -117,9 +118,9 @@ "basedOn": "基於瀏覽器儲存配額", "clearDesc": "清空所有本機儲存的資料,包括錢包、設定和快取。", "clearTitle": "清理資料", - "goToClear": "[MISSING:zh-TW] 前往清理数据", - "migrationDesc": "[MISSING:zh-TW] 检测到旧版本数据格式,需要清空本地数据库后才能继续使用。您的助记词和私钥不会受到影响,但需要重新导入钱包。", - "migrationRequired": "[MISSING:zh-TW] 数据需要迁移", + "goToClear": "前往清除資料", + "migrationDesc": "偵測到舊版本資料格式,需要清空本地資料庫後才能繼續使用。您的助記詞和私鑰不會受到影響,但需要重新導入錢包。您的助记词和私钥不会受到影响,但需要重新导入钱包。", + "migrationRequired": "資料需要遷移", "title": "儲存空間", "total": "總空間", "unavailable": "無法取得儲存資訊", diff --git a/src/i18n/locales/zh-TW/transaction.json b/src/i18n/locales/zh-TW/transaction.json index 88e0f767d..4edcdd4cd 100644 --- a/src/i18n/locales/zh-TW/transaction.json +++ b/src/i18n/locales/zh-TW/transaction.json @@ -2,7 +2,7 @@ "aboutFee": "關於網絡費用", "amount": "數量", "amountShouldBe_{min}-{max}-{assettype}": "數量應在 - 之間", - "approve": "[MISSING:zh-TW] 授权", + "approve": "授權", "balance_:": "餘額:", "bioforestChainFeeToLow": "如果礦工費過低,將影響交易上鏈。", "bioforestChainTransactionTypeAcceptAnyAssetExchange": "接受任意資產交換", @@ -49,6 +49,19 @@ "bioforestChainTransactionTypeSetUsername": "設置用戶名", "bioforestChainTransactionTypeSignForAssetEntrustment": "簽收權益委託", "bioforestChainTransactionTypeToExchangeAnyMultiAll": "發起批量任意資產全量交換", + "broadcast": { + "accountFrozen": "帳戶已凍結", + "alreadyExists": "交易已存在", + "assetNotEnough": "資產餘額不足", + "assetNotExist": "資產不存在", + "failed": "廣播失敗", + "feeNotEnough": "手續費不足", + "forbidden": "操作被禁止", + "invalidParams": "參數無效", + "rejected": "交易被拒絕", + "timeout": "廣播超時,請重試", + "unknown": "廣播失敗,請稍後重試" + }, "certificateTransfer": "證書轉移", "chainTransfer": "轉賬", "confirmSheet": { @@ -61,24 +74,26 @@ "title": "確認轉賬", "toAddress": "收款地址" }, - "confirmed": "[MISSING:zh-TW] 已确认", + "confirmed": "已確認", "contractTransactionData": "合约交易数据", "destoryAmount": "銷毀數量", "destoryQuantityCannotBeGreaterThanBalance": "銷毀數量不能大於餘額", "destroyPage": { - "amountLabel": "[MISSING:zh-TW] 销毁数量", - "assetLabel": "[MISSING:zh-TW] 销毁资产", - "confirm": "[MISSING:zh-TW] 确认销毁", - "noDestroyableAssets": "[MISSING:zh-TW] 暂无可销毁的资产", - "notSupported": "[MISSING:zh-TW] 当前链不支持资产销毁", - "resultTitle": "[MISSING:zh-TW] 销毁结果", - "title": "[MISSING:zh-TW] 销毁", - "warning": "[MISSING:zh-TW] 销毁操作不可撤销,请仔细核对销毁数量。" + "amountLabel": "銷毀數量", + "assetLabel": "銷毀資產", + "confirm": "確認銷毀", + "noDestroyableAssets": "暫無可銷毀的資產", + "notSupported": "目前鏈不支援資產銷毀", + "resultTitle": "銷毀結果", + "title": "銷毀", + "warning": "銷毀操作不可撤銷,請仔細核對銷毀數量。" }, "detail": { "allowance": "授權額度", "blockHeight": "區塊高度", "confirmations": "確認數", + "confirmedAt": "確認時間", + "confirmedBlockHeight": "確認區塊", "contractAddress": "合約地址", "copied": "已複製", "copyHash": "複製哈希", @@ -90,7 +105,7 @@ "method": "方法", "network": "網路", "notFound": "交易不存在或已過期", - "openInExplorer": "[MISSING:zh-TW] 在浏览器中打开", + "openInExplorer": "在瀏覽器中開啟", "share": "分享", "spender": "授權對象", "swapFrom": "換出", @@ -106,7 +121,7 @@ "entityLimit_({amount})": "限量集 ()", "entityTransfer": "同質化轉移", "estimatedFee": "預計網絡費", - "failed": "[MISSING:zh-TW] 失败", + "failed": "失敗", "fee": "礦工費", "feeEdit": { "belowMinFee": "手續費不能低於最低手續費 {{minFee}} {{symbol}}", @@ -121,7 +136,7 @@ }, "finallyReceive": "實際收到:", "forOvertimeTransactionTips": "對於超時交易,您可以通過區塊鏈瀏覽器查看交易是否成功。", - "from": "[MISSING:zh-TW] 从", + "from": "從", "fromAddress": "從", "getAssetTypeBalance": "獲取資產餘額", "history": { @@ -136,6 +151,7 @@ "days90": "90天", "periodLabel": "時間" }, + "loadFailed": "交易歷史載入失敗", "noWallet": "請先建立或匯入錢包", "title": "交易記錄", "totalRecords": "共 {{count}} 筆記錄", @@ -166,10 +182,22 @@ "minerFee": "礦工費", "minnerFee": "礦工費", "newTransfer": "繼續轉賬", - "noTransactions": "[MISSING:zh-TW] 暂无交易记录", + "noTransactions": "暫無交易記錄", "paymentDetails": "支付詳情", "paymentInfo": "支付信息", - "pending": "[MISSING:zh-TW] 处理中", + "pending": "處理中", + "pendingTx": { + "broadcasted": "等待上鏈", + "broadcasting": "廣播中", + "clearAllFailed": "清除失敗", + "delete": "刪除", + "failed": "廣播失敗", + "retry": "重試", + "retryCount": "重試次數", + "title": "待處理交易", + "viewAll": "查看全部 {{count}} 條待處理交易", + "waitingFor": "已等待 {{seconds}} 秒" + }, "promptForDuplicateTransfer": "與此地址有一筆相同金額的轉賬未上鏈,您可等鏈上確認,或繼續新的轉賬?", "receive": "收款", "receiveAddress": "接收地址", @@ -178,27 +206,29 @@ "addressCopied": "地址已複製", "copied": "已複製", "copyAddress": "複製地址", + "imageSaved": "圖片已儲存", "networkWarning": "僅支援 {{chain}} 網絡資產轉入,其他網絡資產轉入將無法找回", "receiveAddress": "收款地址", + "saveImage": "儲存圖片", "scanQrCode": "掃描二維碼向此地址轉賬", "share": "分享", "shareTitle": "BFM Pay 收款地址", "title": "收款" }, "receiver": "收款地址", - "scanAndTransferTheAsset": "[MISSING:zh-TW] 扫一扫,转账 /", - "scanAndTransferToMe": "[MISSING:zh-TW] 扫一扫转入 /", + "scanAndTransferTheAsset": "掃一掃,轉帳 /", + "scanAndTransferToMe": "掃一掃轉入 /", "scanToAssetTypeTransfer": "掃描二維碼,轉載 ()", "scanToTransfer": "掃描二維碼", "selectTransferChain": "選擇轉賬鏈", - "send": "[MISSING:zh-TW] 发送", + "send": "發送", "sendPage": { "amountLabel": "金額", - "assetLabel": "[MISSING:zh-TW] 转账资产", + "assetLabel": "轉帳資產", "cameraPermissionRequired": "需要相機權限才能掃描", "continue": "繼續", "explorerNotImplemented": "區塊瀏覽器功能待實現", - "fee": "[MISSING:zh-TW] 手续费", + "fee": "手續費", "from": "發送地址", "networkWarning": "請確保收款地址為 {{chain}} 網絡地址,發送到錯誤網絡將無法找回", "resultTitle": "發送結果", @@ -207,10 +237,10 @@ "title": "發送", "toAddressLabel": "收款地址", "toAddressPlaceholder": "輸入 {{chain}} 地址", - "twoStepSecretDescription": "[MISSING:zh-TW] 该地址已设置支付密码,请输入支付密码确认转账。", - "twoStepSecretError": "[MISSING:zh-TW] 支付密码错误", - "twoStepSecretPlaceholder": "[MISSING:zh-TW] 输入支付密码", - "twoStepSecretTitle": "[MISSING:zh-TW] 需要支付密码" + "twoStepSecretDescription": "此地址已設定支付密碼,請輸入支付密碼確認轉帳。", + "twoStepSecretError": "支付密碼錯誤", + "twoStepSecretPlaceholder": "輸入支付密碼", + "twoStepSecretTitle": "需要支付密碼" }, "sendResult": { "back": "返回", @@ -224,7 +254,7 @@ "viewInBrowser": "在瀏覽器中查看" }, "sendingAddress": "發送地址", - "stake": "[MISSING:zh-TW] 质押", + "stake": "質押", "status": { "confirmed": "已確認", "failed": "失敗", @@ -237,7 +267,7 @@ "theRecommendedMinerFee_{fee}": "本次交易建議礦工費為:", "thisAddressOnlySupportsAssetsPleaseDoNotTransferToOtherPublicChainAssets": "該地址僅支持 資產,請勿轉入其他公鏈資產", "thisAddressOnlySupportsEthereumAssetsPleaseDoNotTransferToOtherPublicChainAssets": "This address only supports Ethereum assets, please do not transfer to other public chain assets.", - "to": "[MISSING:zh-TW] 至", + "to": "至", "toAddress": "至", "to_(receive_{asset})": "接收地址(接收 )", "transactionDetails": "交易詳情", @@ -263,16 +293,18 @@ "tronNetworkFeeLongTips_1": "網絡費用會根據網絡情況有所不同,一旦交易確認,無論交易成功與否,費用均不退還。", "tronNetworkFeeLongTips_2": "網絡費用是由TRON網絡收取, BFM Pay不會收取任何費用!", "txStatus": { - "created": "待廣播", - "createdDesc": "交易已創建,等待廣播...", + "autoCloseIn": "{{seconds}}秒後自動關閉", "broadcasted": "广播成功", "broadcastedDesc": "交易已广播,等待区块确认...", "broadcasting": "广播中", "broadcastingDesc": "正在将交易广播到网络...", + "closeIn": "關閉 ({{seconds}}s)", "confirmed": "交易已上链", "confirmedDesc": "交易已成功上链", "confirming": "等待上链", "confirmingDesc": "正在等待区块确认...", + "created": "待廣播", + "createdDesc": "交易已創建,等待廣播...", "failed": "交易失败", "failedDesc": "交易处理失败,请稍后重试", "viewDetails": "查看详情" @@ -305,22 +337,7 @@ "trust": "发起委托", "unstake": "解押" }, - "pendingTx": { - "title": "待處理交易", - "broadcasting": "廣播中", - "broadcasted": "等待上鏈", - "failed": "廣播失敗", - "retry": "重試", - "delete": "刪除", - "retryCount": "重試次數" - }, - "broadcast": { - "assetNotEnough": "資產餘額不足", - "feeNotEnough": "手續費不足", - "rejected": "交易被拒絕", - "unknown": "廣播失敗,請稍後重試" - }, - "unstake": "[MISSING:zh-TW] 解押", + "unstake": "解押", "viewTransactionDetails": "查看交易詳情", "youFinallyReceive": "本次贖回你实际得到", "youMustReceive_{asset}QuantityGreaterThan_0": "您得到 的数量必须大于0", diff --git a/src/i18n/locales/zh-TW/wallet.json b/src/i18n/locales/zh-TW/wallet.json index e488f45e1..5a3ddd57f 100644 --- a/src/i18n/locales/zh-TW/wallet.json +++ b/src/i18n/locales/zh-TW/wallet.json @@ -4,6 +4,13 @@ "add": "添加錢包", "defaultName": "我的錢包", "randomName": "隨機名稱", + "carousel": { + "walletCount": "{{count}} 個錢包" + }, + "menu": { + "addressBalanceQuery": "地址餘額查詢", + "addressTransactionsQuery": "地址交易查詢" + }, "chains": { "title": "管理錢包網路", "verifyTitle": "驗證錢包鎖", @@ -15,7 +22,7 @@ "addBitcoinAddress": "添加 Bitcoin 地址", "addToken": "添加幣種", "addWallet": "添加錢包", - "address": "[MISSING:zh-TW] 地址", + "address": "地址", "address book": "地址簿", "addressBook": "地址簿", "addressInformation": "地址信息", @@ -36,7 +43,7 @@ "assetId": "資產ID", "assetType": "資產類型", "assets": "資產", - "balance": "[MISSING:zh-TW] 余额", + "balance": "餘額", "belongingChain": "所屬鏈", "bitcoinAddressSettings": "Bitcoin 地址設置", "chainSelector": { @@ -86,7 +93,7 @@ "edit address": "編輯地址", "editSheet": { "cancel": "取消", - "confirmDelete": "[MISSING:zh-TW] 确认删除", + "confirmDelete": "確認刪除", "delete": "刪除錢包", "deleteDesc": "此操作無法撤銷", "deleteTitle": "刪除錢包", @@ -98,7 +105,7 @@ "save": "儲存", "title": "錢包設定", "verifyFailed": "驗證失敗", - "verifying": "[MISSING:zh-TW] 验证中...", + "verifying": "驗證中...", "walletName": "錢包名稱", "walletNamePlaceholder": "請輸入錢包名稱" }, @@ -139,10 +146,10 @@ "modifyAddress": "編輯地址", "modifyWalletName": "修改錢包名稱", "multiChainSupport": "多鏈支持", - "myWallet": "[MISSING:zh-TW] 我的钱包", + "myWallet": "我的錢包", "newCreateWallet": "創建錢包", "nonIdentityAssociateAllChainTips": "原非身份錢包將根據助記詞關聯對應的所有鏈;", - "notBackedUp": "[MISSING:zh-TW] 未备份", + "notBackedUp": "未備份", "notFindCurrentlyActiveWallet": "無法找到當前激活的錢包", "notImported": "(未導入)", "obtainingThePrivateKeyIsEquivalentToOwningTheWalletAsset": "獲得私鑰等同於擁有錢包資產所有權", @@ -151,7 +158,7 @@ "pleaseSwitchTheCurrentlyLoggedInWalletToAPackageContainingBitcoinEthereumBinanceAndTronNetworkAddressesBeforeUsingThosFeatureTheCurrentlyLoggedInWalletDoesNotSupportAnyOfTheAboveNetworks": "請將當前登錄錢包切換到包含 Bitcoin、Ethereum、Binance和Tron 網絡地址的錢包后再使用該功能。當前登錄的錢包不支持上述網絡。", "privateKeyImport": "私鑰導入", "privateKey_({chainname})": "私鑰()", - "receive": "[MISSING:zh-TW] 收款", + "receive": "收款", "remainAssetPrealnum": "當前總量", "restoreIdentity": "恢復身份", "restoreWallet": "恢復錢包", @@ -175,10 +182,10 @@ "theWalletIsNotBackUpTips": "此錢包未備份,繼續退出您可能永遠失去該錢包,確定繼續?", "thereIsAnUnbackedUpWalletIn_{appName}Tips": "中存在未備份的錢包,繼續退出您可能永遠失去該錢包,確定繼續?", "thisRequestDoesNotHaveAMatchingWalletInCotPleaseAddTheCorrespondingWalletFirstAndTryAgain": "此請求在BFM Pay中無匹配的錢包,請先添加對應錢包后重試。", - "toRestoreTheWalletInOrderToEnsureTheSecurityOfThe": "[MISSING:zh-TW] to restore the wallet. In order to ensure the security of the", + "toRestoreTheWalletInOrderToEnsureTheSecurityOfThe": "為恢復錢包,請確保安全性", "to_({chain})": "至()", "tokenDetail": "幣種詳情", - "transfer": "[MISSING:zh-TW] 转账", + "transfer": "轉帳", "tronAddressNotActiveNeed_1.1trxActive": "該地址未激活,需要消耗1.1TRX激活該地址", "unsupportedWallets": "不支持的錢包", "wallet": "錢包", diff --git a/src/lib/wallet-utils.ts b/src/lib/wallet-utils.ts index 557e8c91a..b715e6deb 100644 --- a/src/lib/wallet-utils.ts +++ b/src/lib/wallet-utils.ts @@ -21,12 +21,11 @@ const LOCALE_WORDLIST_MAP: Record = { const NO_SPACE_LOCALES = ['zh-CN', 'zh-TW', 'ja', 'ko']; /** - * Generate a random wallet name using BIP39 wordlist + * Get a random word for wallet naming from BIP39 wordlist * @param locale Current locale (e.g. 'zh-CN', 'en') - * @param suffix Localized suffix (e.g. '钱包', 'Wallet') - * @returns Generated wallet name (e.g. '爱钱包', 'Garden Wallet') + * @returns Formatted random word (e.g. 'Garden', '爱') */ -export function generateWalletName(locale: string, suffix: string): string { +export function getRandomWalletWord(locale: string): string { // Get wordlist for locale, fallback to English const wordlist = LOCALE_WORDLIST_MAP[locale] ?? wordlists.english!; @@ -34,12 +33,8 @@ export function generateWalletName(locale: string, suffix: string): string { const randomWord = wordlist[Math.floor(Math.random() * wordlist.length)]; // Capitalize first letter for non-CJK languages - const formattedWord = NO_SPACE_LOCALES.includes(locale) + return NO_SPACE_LOCALES.includes(locale) ? randomWord : randomWord.charAt(0).toUpperCase() + randomWord.slice(1); - - // CJK languages don't use spaces - const useSpace = !NO_SPACE_LOCALES.includes(locale); - - return useSpace ? `${formattedWord} ${suffix}` : `${formattedWord}${suffix}`; } + diff --git a/src/pages/onboarding/recover.tsx b/src/pages/onboarding/recover.tsx index 02d8f0959..ce3ab1901 100644 --- a/src/pages/onboarding/recover.tsx +++ b/src/pages/onboarding/recover.tsx @@ -18,7 +18,7 @@ import { useDuplicateDetection } from '@/hooks/use-duplicate-detection'; import { deriveWalletChainAddresses } from '@/services/chain-adapter'; import { deriveThemeHue } from '@/hooks/useWalletTheme'; import { useChainConfigs, useChainConfigState, useEnabledBioforestChainConfigs, walletActions, useLanguage } from '@/stores'; -import { generateWalletName } from '@/lib/wallet-utils'; +import { getRandomWalletWord } from '@/lib/wallet-utils'; import type { IWalletQuery } from '@/services/wallet/types'; import { IconAlertCircle as AlertCircle, IconLoader2 as Loader2, IconCircleCheck as CheckCircle } from '@tabler/icons-react'; import { ProgressSteps } from '@/components/common'; @@ -209,7 +209,10 @@ export function OnboardingRecoverPage() { const wallet = await walletActions.createWallet( { - name: generateWalletName(currentLanguage, t('onboarding:create.walletSuffix')), + name: t('onboarding:create.generatedNamePattern', { + word: getRandomWalletWord(currentLanguage), + suffix: t('onboarding:create.walletSuffix'), + }), keyType: 'mnemonic', address: primaryChain.address, chain: primaryChain.chain, @@ -253,7 +256,10 @@ export function OnboardingRecoverPage() { const wallet = await walletActions.createWallet( { - name: generateWalletName(currentLanguage, t('onboarding:create.walletSuffix')), + name: t('onboarding:create.generatedNamePattern', { + word: getRandomWalletWord(currentLanguage), + suffix: t('onboarding:create.walletSuffix'), + }), keyType: 'arbitrary', address: primary.address, chain: primary.chainId, diff --git a/src/pages/wallet/create.tsx b/src/pages/wallet/create.tsx index 7779b0108..365cca7ff 100644 --- a/src/pages/wallet/create.tsx +++ b/src/pages/wallet/create.tsx @@ -19,7 +19,7 @@ import { } from '@tabler/icons-react'; import { useChainConfigs, walletActions, useLanguage } from '@/stores'; import { generateMnemonic } from '@/lib/crypto'; -import { generateWalletName } from '@/lib/wallet-utils'; +import { getRandomWalletWord } from '@/lib/wallet-utils'; import { deriveWalletChainAddresses } from '@/services/chain-adapter'; import { deriveThemeHue } from '@/hooks/useWalletTheme'; import type { ChainConfig } from '@/services/chain-config'; @@ -124,7 +124,10 @@ export function WalletCreatePage() { const wallet = await walletActions.createWallet( { - name: generateWalletName(currentLanguage, t('create.walletSuffix')), + name: t('create.generatedNamePattern', { + word: getRandomWalletWord(currentLanguage), + suffix: t('create.walletSuffix'), + }), keyType: 'mnemonic', address: primaryChain.address, chain: primaryChain.chain, diff --git a/src/stackflow/activities/tabs/WalletTab.tsx b/src/stackflow/activities/tabs/WalletTab.tsx index cc9d8f904..bb1e7f22f 100644 --- a/src/stackflow/activities/tabs/WalletTab.tsx +++ b/src/stackflow/activities/tabs/WalletTab.tsx @@ -37,20 +37,8 @@ import { import type { TransactionInfo } from "@/components/transaction/transaction-item"; import { toTransactionInfoList } from "@/components/transaction/adapters"; -const CHAIN_NAMES: Record = { - ethereum: "Ethereum", - bitcoin: "Bitcoin", - tron: "Tron", - binance: "BSC", - bfmeta: "BFMeta", - ccchain: "CCChain", - pmchain: "PMChain", - bfchainv2: "BFChain V2", - btgmeta: "BTGMeta", - biwmeta: "BIWMeta", - ethmeta: "ETHMeta", - malibu: "Malibu", -}; +// Chain names are localized via t('common:chains.' + chainId) + // ==================== 内部内容组件:使用 useChainProvider 获取确保非空的 provider ==================== @@ -171,7 +159,6 @@ function WalletTabContent({ currentWalletId={currentWalletId} selectedChain={selectedChain} chainPreferences={chainPreferences} - chainNames={CHAIN_NAMES} onWalletChange={onWalletChange} onCopyAddress={onCopyAddress} onOpenChainSelector={onOpenChainSelector} @@ -311,7 +298,7 @@ export function WalletTab() { const currentWalletId = currentWallet?.id ?? null; const selectedChain = useSelectedChain(); const chainPreferences = useChainPreferences(); - const selectedChainName = CHAIN_NAMES[selectedChain] ?? selectedChain; + const selectedChainName = t(`common:chains.${selectedChain}`, { defaultValue: selectedChain }); const chainConfigState = useChainConfigState(); const chainConfig = chainConfigState.snapshot ? chainConfigSelectors.getChainById(chainConfigState, selectedChain) @@ -404,7 +391,7 @@ export function WalletTab() { chainId={selectedChain} fallback={
-

Chain not supported

+

{t("common:ecosystem.chainNotSupported")}

} > diff --git a/src/stackflow/components/TabBar.tsx b/src/stackflow/components/TabBar.tsx index 7a2a20b4d..8c65a6379 100644 --- a/src/stackflow/components/TabBar.tsx +++ b/src/stackflow/components/TabBar.tsx @@ -132,15 +132,15 @@ export function TabBar({ activeTab, onTabChange, className }: TabBarProps) { const storeAvailablePages = useStore(ecosystemStore, (s) => s.availableSubPages); const hasRunningApps = useStore(miniappRuntimeStore, (s) => miniappRuntimeSelectors.getApps(s).length > 0); const hasRunningStackApps = useStore(miniappRuntimeStore, miniappRuntimeSelectors.hasRunningStackApps); - + // Pending transactions count for wallet tab badge const currentWallet = useCurrentWallet(); const { transactions: pendingTxs } = usePendingTransactions(currentWallet?.id); const pendingTxCount = pendingTxs.filter((tx) => tx.status !== 'confirmed').length; - + // 生态 Tab 是否激活 const isEcosystemActive = activeTab === 'ecosystem'; - + // 生态指示器(图标slider + 分页点) const availablePages = useMemo(() => { if (storeAvailablePages?.length) return storeAvailablePages; @@ -165,7 +165,7 @@ export function TabBar({ activeTab, onTabChange, className }: TabBarProps) { const tabConfigs: Tab[] = useMemo(() => [ { id: "wallet", label: t('a11y.tabWallet'), icon: IconWallet }, - { id: "ecosystem", label: t('a11y.tabEcosystem', '生态'), icon: ecosystemIcon }, + { id: "ecosystem", label: t('a11y.tabEcosystem'), icon: ecosystemIcon }, { id: "settings", label: t('a11y.tabSettings'), icon: IconSettings }, ], [t, ecosystemIcon]);