From 144f21ec9d56cdda55eb6156e0ae8873776503da Mon Sep 17 00:00:00 2001 From: Meshmulla Date: Wed, 27 May 2026 11:04:45 +0100 Subject: [PATCH 1/2] feat: Implement Offline Status Indicator Component --- src/components/Header.tsx | 3 +- src/components/OfflineStatusIndicator.tsx | 35 +++++++++++++++++++++++ src/hooks/useOnlineStatus.ts | 19 ++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/components/OfflineStatusIndicator.tsx create mode 100644 src/hooks/useOnlineStatus.ts diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 8271979d..1c8affc4 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,6 +1,6 @@ -//import Header from '@/components/Header'; import { useAuth } from '@/contexts/AuthContext'; import { ThemeToggle } from '@/components/ThemeToggle'; +import OfflineStatusIndicator from '@/components/OfflineStatusIndicator'; import Link from 'next/link'; export default function HeaderComponent() { @@ -57,6 +57,7 @@ export default function HeaderComponent() { )}
  • +
  • diff --git a/src/components/OfflineStatusIndicator.tsx b/src/components/OfflineStatusIndicator.tsx new file mode 100644 index 00000000..4a83646d --- /dev/null +++ b/src/components/OfflineStatusIndicator.tsx @@ -0,0 +1,35 @@ +import { useOnlineStatus } from '@/hooks/useOnlineStatus'; + +export default function OfflineStatusIndicator() { + const isOnline = useOnlineStatus(); + + const label = isOnline ? 'Connected to internet' : 'No internet connection — some features may be unavailable'; + const tooltip = isOnline ? 'Online' : 'Offline'; + + return ( +
    + + +
    + ); +} diff --git a/src/hooks/useOnlineStatus.ts b/src/hooks/useOnlineStatus.ts new file mode 100644 index 00000000..11372785 --- /dev/null +++ b/src/hooks/useOnlineStatus.ts @@ -0,0 +1,19 @@ +import { useState, useEffect } from 'react'; + +export function useOnlineStatus() { + const [isOnline, setIsOnline] = useState(true); + + useEffect(() => { + setIsOnline(navigator.onLine); + const handleOnline = () => setIsOnline(true); + const handleOffline = () => setIsOnline(false); + window.addEventListener('online', handleOnline); + window.addEventListener('offline', handleOffline); + return () => { + window.removeEventListener('online', handleOnline); + window.removeEventListener('offline', handleOffline); + }; + }, []); + + return isOnline; +} From b4d01fd982c269239b95a1dbc03e0b7edf8580f9 Mon Sep 17 00:00:00 2001 From: Meshmulla Date: Wed, 27 May 2026 11:23:34 +0100 Subject: [PATCH 2/2] feat: Implement Internationalization Setup --- src/hooks/useRTL.ts | 53 ++++++++ src/i18n/index.ts | 202 ++++++++++++++++++++++++++++++ src/i18n/locales/ar.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/de.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/en.json | 260 +++++++++++++++++++++++++++++++++++++++ src/i18n/locales/es.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/fr.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/hi.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/ja.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/pt.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/ru.json | 257 ++++++++++++++++++++++++++++++++++++++ src/i18n/locales/zh.json | 257 ++++++++++++++++++++++++++++++++++++++ src/pages/_app.tsx | 3 + 13 files changed, 2831 insertions(+) create mode 100644 src/hooks/useRTL.ts create mode 100644 src/i18n/index.ts create mode 100644 src/i18n/locales/ar.json create mode 100644 src/i18n/locales/de.json create mode 100644 src/i18n/locales/en.json create mode 100644 src/i18n/locales/es.json create mode 100644 src/i18n/locales/fr.json create mode 100644 src/i18n/locales/hi.json create mode 100644 src/i18n/locales/ja.json create mode 100644 src/i18n/locales/pt.json create mode 100644 src/i18n/locales/ru.json create mode 100644 src/i18n/locales/zh.json diff --git a/src/hooks/useRTL.ts b/src/hooks/useRTL.ts new file mode 100644 index 00000000..1c5d7dca --- /dev/null +++ b/src/hooks/useRTL.ts @@ -0,0 +1,53 @@ +import { useEffect, useState } from 'react'; +import { useTranslation } from '@/i18n'; +import { isRTL, getTextDirection } from '@/i18n'; + +export function useRTL() { + const { language } = useTranslation(); + const [isRTLDirection, setIsRTLDirection] = useState(isRTL(language)); + const [textDirection, setTextDirection] = useState(getTextDirection(language)); + + useEffect(() => { + const dir = getTextDirection(language); + setIsRTLDirection(dir === 'rtl'); + setTextDirection(dir); + document.documentElement.dir = dir; + document.documentElement.lang = language; + }, [language]); + + const getDirectionalClass = (left: string, right: string) => + isRTLDirection ? right : left; + + const getTextAlignClass = () => + isRTLDirection ? 'text-right' : 'text-left'; + + const getFlexDirection = () => + isRTLDirection ? 'flex-row-reverse' : 'flex-row'; + + const getFloatClass = (left: string, right: string) => + isRTLDirection ? right : left; + + const getBorderRadiusClass = (left: string, right: string) => + isRTLDirection ? right : left; + + const getTransformClass = (transform: string) => { + if (isRTLDirection && transform.includes('translateX')) { + return transform.replace(/translateX\(([^)]+)\)/, (_, p1: string) => { + const value = p1.replace('-', ''); + return `translateX(-${value})`; + }); + } + return transform; + }; + + return { + isRTL: isRTLDirection, + textDirection, + getDirectionalClass, + getTextAlignClass, + getFlexDirection, + getFloatClass, + getBorderRadiusClass, + getTransformClass, + }; +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 00000000..3ef2021e --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,202 @@ +import { + createContext, + useContext, + useState, + useEffect, + useCallback, + type ReactNode, +} from 'react'; + +// ─── Locale imports ─────────────────────────────────────────────────────────── +import en from './locales/en.json'; +import es from './locales/es.json'; +import fr from './locales/fr.json'; +import de from './locales/de.json'; +import zh from './locales/zh.json'; +import ar from './locales/ar.json'; +import hi from './locales/hi.json'; +import pt from './locales/pt.json'; +import ru from './locales/ru.json'; +import ja from './locales/ja.json'; + +// ─── Types ──────────────────────────────────────────────────────────────────── +type TranslationValue = string | Record; +type TranslationDict = Record; + +export type LanguageCode = 'en' | 'es' | 'fr' | 'de' | 'zh' | 'ar' | 'hi' | 'pt' | 'ru' | 'ja'; + +export interface LanguageConfig { + code: LanguageCode; + name: string; + nativeName: string; + dir: 'ltr' | 'rtl'; + flag: string; +} + +// ─── Supported languages ────────────────────────────────────────────────────── +export const supportedLanguages: readonly LanguageConfig[] = [ + { code: 'en', name: 'English', nativeName: 'English', dir: 'ltr', flag: '🇺🇸' }, + { code: 'es', name: 'Spanish', nativeName: 'Español', dir: 'ltr', flag: '🇪🇸' }, + { code: 'fr', name: 'French', nativeName: 'Français', dir: 'ltr', flag: '🇫🇷' }, + { code: 'de', name: 'German', nativeName: 'Deutsch', dir: 'ltr', flag: '🇩🇪' }, + { code: 'zh', name: 'Chinese', nativeName: '中文', dir: 'ltr', flag: '🇨🇳' }, + { code: 'ar', name: 'Arabic', nativeName: 'العربية', dir: 'rtl', flag: '🇸🇦' }, + { code: 'hi', name: 'Hindi', nativeName: 'हिन्दी', dir: 'ltr', flag: '🇮🇳' }, + { code: 'pt', name: 'Portuguese', nativeName: 'Português', dir: 'ltr', flag: '🇧🇷' }, + { code: 'ru', name: 'Russian', nativeName: 'Русский', dir: 'ltr', flag: '🇷🇺' }, + { code: 'ja', name: 'Japanese', nativeName: '日本語', dir: 'ltr', flag: '🇯🇵' }, +] as const; + +const STORAGE_KEY = 'petchain-language'; +const FALLBACK: LanguageCode = 'en'; + +// ─── Translation resources ──────────────────────────────────────────────────── +const resources: Record = { en, es, fr, de, zh, ar, hi, pt, ru, ja }; + +// ─── Interpolation helper ───────────────────────────────────────────────────── +function interpolate(template: string, params?: Record): string { + if (!params) return template; + return Object.entries(params).reduce( + (str, [k, v]) => str.replace(new RegExp(`\\{\\{${k}\\}\\}`, 'g'), String(v)), + template, + ); +} + +// ─── Deep-get a dot-path key from a nested object ──────────────────────────── +function deepGet(obj: TranslationDict, path: string): string | undefined { + const parts = path.split('.'); + let cur: unknown = obj; + for (const part of parts) { + if (cur == null || typeof cur !== 'object') return undefined; + cur = (cur as Record)[part]; + } + return typeof cur === 'string' ? cur : undefined; +} + +// ─── Detect initial language ────────────────────────────────────────────────── +function detectLanguage(): LanguageCode { + if (typeof window === 'undefined') return FALLBACK; + + const stored = localStorage.getItem(STORAGE_KEY) as LanguageCode | null; + if (stored && resources[stored]) return stored; + + const browser = navigator.language.split('-')[0] as LanguageCode; + if (resources[browser]) return browser; + + return FALLBACK; +} + +// ─── Context ────────────────────────────────────────────────────────────────── +interface I18nContextValue { + language: LanguageCode; + setLanguage: (code: LanguageCode) => Promise; + t: (key: string, params?: Record) => string; +} + +const I18nContext = createContext(null); + +// ─── Provider ───────────────────────────────────────────────────────────────── +export function I18nProvider({ children }: { children: ReactNode }) { + const [language, setLang] = useState(FALLBACK); + + // Hydrate from storage / browser on mount (client-only) + useEffect(() => { + const detected = detectLanguage(); + setLang(detected); + applyDocumentAttributes(detected); + }, []); + + const setLanguage = useCallback(async (code: LanguageCode): Promise => { + if (!resources[code]) return false; + setLang(code); + applyDocumentAttributes(code); + localStorage.setItem(STORAGE_KEY, code); + return true; + }, []); + + const t = useCallback( + (key: string, params?: Record): string => { + const value = + deepGet(resources[language] as TranslationDict, key) ?? + deepGet(resources[FALLBACK] as TranslationDict, key) ?? + key; + return interpolate(value, params); + }, + [language], + ); + + return ( + + {children} + + ); +} + +// ─── Typed hook ─────────────────────────────────────────────────────────────── +export function useTranslation() { + const ctx = useContext(I18nContext); + if (!ctx) throw new Error('useTranslation must be used inside '); + return ctx; +} + +// ─── Module-level state (mirrors i18next's singleton API) ───────────────────── +// Kept so helper functions below work without a React context. +let _currentLanguage: LanguageCode = FALLBACK; + +function applyDocumentAttributes(code: LanguageCode) { + _currentLanguage = code; + if (typeof document === 'undefined') return; + const lang = supportedLanguages.find((l) => l.code === code); + document.documentElement.lang = code; + document.documentElement.dir = lang?.dir ?? 'ltr'; +} + +// ─── Public utility helpers (same API as original index.ts) ────────────────── +export function getCurrentLanguage(): LanguageConfig { + return supportedLanguages.find((l) => l.code === _currentLanguage) ?? supportedLanguages[0]; +} + +export async function changeLanguage(code: string): Promise { + const lang = supportedLanguages.find((l) => l.code === code); + if (!lang) return false; + _currentLanguage = code as LanguageCode; + applyDocumentAttributes(code as LanguageCode); + try { + localStorage.setItem(STORAGE_KEY, code); + } catch { + // SSR / private browsing + } + return true; +} + +export function getTextDirection(code: string): 'ltr' | 'rtl' { + return supportedLanguages.find((l) => l.code === code)?.dir ?? 'ltr'; +} + +export function isRTL(code?: string): boolean { + return getTextDirection(code ?? _currentLanguage) === 'rtl'; +} + +export function formatNumber(value: number, options?: Intl.NumberFormatOptions): string { + const locale = _currentLanguage === 'zh' ? 'zh-CN' : _currentLanguage; + return new Intl.NumberFormat(locale, options).format(value); +} + +export function formatCurrency(amount: number, currency = 'XLM'): string { + const locale = _currentLanguage === 'zh' ? 'zh-CN' : _currentLanguage; + // XLM is not an ISO 4217 code — format as decimal and append symbol + const formatted = new Intl.NumberFormat(locale, { + minimumFractionDigits: 7, + maximumFractionDigits: 7, + }).format(amount); + return `${formatted} ${currency}`; +} + +export function formatDate(date: Date, options?: Intl.DateTimeFormatOptions): string { + const locale = _currentLanguage === 'zh' ? 'zh-CN' : _currentLanguage; + return new Intl.DateTimeFormat(locale, options).format(date); +} + +export function getPluralForm(count: number): Intl.LDMLPluralRule { + return new Intl.PluralRules(_currentLanguage).select(count); +} diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json new file mode 100644 index 00000000..98398c1b --- /dev/null +++ b/src/i18n/locales/ar.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "واتا-بورد", + "tagline": "مدفوعات الخدمات العامة اللامركزية على بلوكشين ستيلار", + "description": "ادفع فواتير الخدمات العامة باستخدام العملة المشفرة على شبكة ستيلار" + }, + "navigation": { + "home": "دفع الفاتورة", + "about": "من نحن", + "contact": "اتصل بنا", + "rate": "قيّمنا", + "language": "اللغة" + }, + "payment": { + "form": { + "title": "معلومات الدفع", + "meterNumber": "رقم العداد", + "meterPlaceholder": "مثال: METER-123", + "meterDescription": "أدخل رقم عداد الخدمات كما هو موضح في فاتورتك", + "amount": "المبلغ", + "amountPlaceholder": "رقم صحيح", + "amountDescription": "أدخل مبلغ الدفع بالعملة XLM الصحيحة", + "payButton": "دفع الفاتورة", + "processing": "جاري المعالجة...", + "rateLimited": "تم الوصول للحد", + "requiresExtension": "يتطلب إضافة فرايتر. حد 5 معاملات في الدقيقة." + }, + "status": { + "title": "الحالة", + "ready": "جاهز.", + "installWallet": "يرجى تثبيت إضافة محفظة فرايتر!", + "enterMeter": "يرجى إدخال رقم العداد.", + "enterValidAmount": "يرجى إدخال مبلغ صحيح أكبر من 0.", + "wholeNumber": "يجب أن يكون المبلغ رقماً صحيحاً.", + "amountTooLarge": "المبلغ كبير جداً.", + "insufficientBalance": "الرصيد غير كافٍ. يرجى إضافة المزيد من XLM إلى محفظتك.", + "estimatingFees": "جاري تقدير رسوم المعاملة... يرجى الانتظار.", + "paymentSuccess": "تم الدفع بنجاح! معرف المعاملة: {{id}}...", + "paymentFailed": "فشل الدفع: {{error}}" + }, + "feeEstimation": { + "title": "تقدير رسوم المعاملة", + "calculating": "(جاري الحساب...)", + "calculatingFees": "جاري حساب الرسوم المقدرة...", + "paymentAmount": "مبلغ الدفع", + "estimatedNetworkFee": "رسوم الشبكة المقدرة", + "totalCost": "إجمالي التكلفة", + "unableToEstimate": "لا يمكن تقدير الرسوم في الوقت الحالي" + }, + "rateLimit": { + "title": "حالة حد المعدل", + "requestsAvailable": "{{count}}/5 طلبات متاحة", + "rateLimited": "تم الوصول للحد. إعادة تعيين في {{time}}", + "queue": "الطابور: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "رصيد المحفظة", + "available": "الرصيد المتاح", + "total": "إجمالي الرصيد", + "loading": "جاري تحميل الرصيد...", + "error": "فشل تحميل الرصيد", + "reconnect": "يرجى إعادة الاتصال بمحفظتك", + "insufficient": "الرصيد غير كافٍ لهذه المعاملة", + "lowBalance": "تحذير انخفاض الرصيد" + }, + "connection": { + "connected": "متصل", + "disconnected": "غير متصل", + "connecting": "جاري الاتصال...", + "connectWallet": "اتصل بالمحفظة", + "switchWallet": "تبديل المحفظة" + } + }, + "network": { + "mainnet": "الشبكة الرئيسية", + "testnet": "شبكة الاختبار", + "switchNetwork": "تبديل الشبكة", + "currentNetwork": "الشبكة الحالية" + }, + "offline": { + "banner": { + "title": "أنت غير متصل", + "description": "بعض الميزات قد لا تكون متاحة. سيتم وضع الإجراءات في الطابور ومعالجتها عند عودتك إلى الاتصال.", + "retry": "إعادة محاولة الاتصال", + "details": "تفاصيل الاتصال" + }, + "status": { + "online": "متصل", + "offline": "غير متصل", + "connecting": "جاري الاتصال...", + "queueStatus": "{{count}} إجراء في الطابور", + "queueStatus_plural": "{{count}} إجراءات في الطابور" + }, + "queue": { + "title": "طابور عدم الاتصال", + "description": "سيتم معالجة {{count}} إجراء عند عودتك إلى الاتصال", + "description_plural": "سيتم معالجة {{count}} إجراءات عند عودتك إلى الاتصال" + }, + "error": { + "paymentOffline": "الدفع في الطابور للمعالجة عند عودتك إلى الاتصال", + "generalOffline": "الإجراء في الطابور للمعالجة عند عودتك إلى الاتصال" + } + }, + "about": { + "title": "حول واتا-بورد", + "description": "واتا-بورد هي منصة دفع خدمات عامة لامركزية مبنية على بلوكشين ستيلار. نتمكن من دفع فواتير الخدمات الآمنة والشفافة والفعالة باستخدام العملة المشفرة.", + "features": { + "title": "الميزات الرئيسية", + "secure": "معاملات آمنة", + "secureDescription": "مبنية على بلوكشين ستيلار مع أمان على مستوى المؤسسات", + "fast": "دفعات سريعة", + "fastDescription": "تسوية شبه فورية مع رسوم معاملات منخفضة", + "transparent": "سجلات شفافة", + "transparentDescription": "جميع المعاملات مسجلة على البلوكشين العام", + "decentralized": "لامركزي", + "decentralizedDescription": "لا يوجد نقطة واحدة للفشل أو التحكم" + }, + "howItWorks": { + "title": "كيف تعمل", + "step1": "اتصل بمحفظتك", + "step2": "أدخل تفاصيل العداد", + "step3": "أكد الدفع", + "step4": "تمت معالجة الدفع" + } + }, + "contact": { + "title": "اتصل بنا", + "description": "تواصل مع فريقنا للحصول على الدعم أو الأسئلة أو الملاحظات.", + "form": { + "name": "الاسم", + "namePlaceholder": "أدخل اسمك", + "email": "البريد الإلكتروني", + "emailPlaceholder": "أدخل بريدك الإلكتروني", + "subject": "الموضوع", + "subjectPlaceholder": "أدخل الموضوع", + "message": "الرسالة", + "messagePlaceholder": "أدخل رسالتك", + "sendButton": "إرسال الرسالة", + "sending": "جاري الإرسال..." + }, + "info": { + "email": "البريد الإلكتروني", + "support": "الدعم", + "website": "الموقع الإلكتروني" + } + }, + "rate": { + "title": "قيم تجربتك", + "description": "ساعدنا في التحسين من خلال تقييم تجربتك مع واتا-بورد.", + "rating": { + "excellent": "ممتاز", + "good": "جيد", + "average": "متوسط", + "poor": "ضعيف", + "terrible": "سيء جداً" + }, + "review": { + "title": "اكتب مراجعة", + "placeholder": "شارك تجربتك مع واتا-بورد...", + "submit": "إرسال المراجعة", + "thankYou": "شكراً على ملاحظاتك!" + } + }, + "errors": { + "general": { + "title": "خطأ", + "unknown": "حدث خطأ غير معروف", + "tryAgain": "يرجى المحاولة مرة أخرى", + "contactSupport": "اتصل بالدعم إذا استمرت المشكلة" + }, + "network": { + "title": "خطأ في الشبكة", + "description": "لا يمكن الاتصال بالشبكة", + "checkConnection": "يرجى فحص اتصالك بالإنترنت" + }, + "wallet": { + "title": "خطأ في المحفظة", + "notConnected": "المحفظة غير متصلة", + "notInstalled": "محفظة فرايتر غير مثبتة", + "installFreighter": "يرجى تثبيت إضافة محفظة فرايتر" + } + }, + "accessibility": { + "skipToMain": "تخطي إلى المحتوى الرئيسي", + "skipToNavigation": "تخطي إلى التنقل", + "menuToggle": "تبديل قائمة التنقل", + "closeMenu": "إغلاق القائمة", + "openMenu": "فتح القائمة", + "loading": "جاري التحميل...", + "error": "خطأ", + "success": "نجح", + "warning": "تحذير", + "info": "معلومات" + }, + "common": { + "cancel": "إلغاء", + "confirm": "تأكيد", + "save": "حفظ", + "delete": "حذف", + "edit": "تحرير", + "close": "إغلاق", + "back": "رجوع", + "next": "التالي", + "previous": "السابق", + "submit": "إرسال", + "reset": "إعادة تعيين", + "clear": "مسح", + "search": "بحث", + "filter": "تصفية", + "sort": "ترتيب", + "loading": "جاري التحميل...", + "error": "خطأ", + "success": "نجح", + "retry": "إعادة المحاولة", + "refresh": "تحديث", + "copy": "نسخ", + "copied": "تم النسخ!", + "learnMore": "تعلم المزيد", + "viewDetails": "عرض التفاصيل", + "hideDetails": "إخفاء التفاصيل" + }, + "time": { + "seconds": "ثانية", + "seconds_plural": "ثواني", + "minutes": "دقيقة", + "minutes_plural": "دقائق", + "hours": "ساعة", + "hours_plural": "ساعات", + "days": "يوم", + "days_plural": "أيام", + "weeks": "أسبوع", + "weeks_plural": "أسابيع", + "months": "شهر", + "months_plural": "أشهر", + "years": "سنة", + "years_plural": "سنوات", + "ago": "منذ {{time}}", + "in": "في {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "هذا الحقل مطلوب", + "invalid": "تنسيق غير صالح", + "tooShort": "يجب أن يحتوي على الأقل {{min}} حرف", + "tooLong": "لا يجب أن يحتوي على أكثر من {{max}} حرف", + "invalidEmail": "يرجى إدخال عنوان بريد إلكتروني صالح", + "invalidNumber": "يرجى إدخال رقم صالح", + "minValue": "يجب أن يكون على الأقل {{min}}", + "maxValue": "لا يجب أن يتجاوز {{max}}" + } +} diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json new file mode 100644 index 00000000..abaaa594 --- /dev/null +++ b/src/i18n/locales/de.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Dezentralisierte Versorgungsunternehmenzahlungen auf der Stellar-Blockchain", + "description": "Bezahlen Sie Ihre Versorgerrechnungen mit Kryptowährung auf dem Stellar-Netzwerk" + }, + "navigation": { + "home": "Rechnung Bezahlen", + "about": "Über Uns", + "contact": "Kontakt", + "rate": "Bewerten Sie Uns", + "language": "Sprache" + }, + "payment": { + "form": { + "title": "Zahlungsinformationen", + "meterNumber": "Zählernummer", + "meterPlaceholder": "z.B. ZÄHLER-123", + "meterDescription": "Geben Sie Ihre Versorgerzählernummer wie auf Ihrer Rechnung angegeben ein", + "amount": "Betrag", + "amountPlaceholder": "Ganzzahl", + "amountDescription": "Geben Sie den Zahlungsbetrag in ganzer XLM ein", + "payButton": "Rechnung bezahlen", + "processing": "Verarbeitung...", + "rateLimited": "Limit Erreicht", + "requiresExtension": "Benötigt Freighter-Erweiterung. Limit von 5 Transaktionen pro Minute." + }, + "status": { + "title": "Status", + "ready": "Bereit.", + "installWallet": "Bitte installieren Sie die Freighter Wallet-Erweiterung!", + "enterMeter": "Bitte geben Sie eine Zählernummer ein.", + "enterValidAmount": "Bitte geben Sie einen gültigen Betrag größer als 0 ein.", + "wholeNumber": "Der Betrag muss eine Ganzzahl sein.", + "amountTooLarge": "Der Betrag ist zu groß.", + "insufficientBalance": "Unzureichendes Guthaben. Bitte fügen Sie mehr XLM zu Ihrer Wallet hinzu.", + "estimatingFees": "Schätzung der Transaktionsgebühren... Bitte warten.", + "paymentSuccess": "Zahlung erfolgreich! Transaktions-ID: {{id}}...", + "paymentFailed": "Zahlung fehlgeschlagen: {{error}}" + }, + "feeEstimation": { + "title": "Transaktionsgebühren-Schätzung", + "calculating": "(Berechnen...)", + "calculatingFees": "Berechnung der geschätzten Gebühren...", + "paymentAmount": "Zahlungsbetrag", + "estimatedNetworkFee": "Geschätzte Netzwerkgebühr", + "totalCost": "Gesamtkosten", + "unableToEstimate": "Gebühren können derzeit nicht geschätzt werden" + }, + "rateLimit": { + "title": "Ratenlimit-Status", + "requestsAvailable": "{{count}}/5 Anfragen verfügbar", + "rateLimited": "Limit erreicht. Zurücksetzung in {{time}}", + "queue": "Warteschlange: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Wallet-Guthaben", + "available": "Verfügbares Guthaben", + "total": "Gesamtguthaben", + "loading": "Guthaben wird geladen...", + "error": "Fehler beim Laden des Guthabens", + "reconnect": "Bitte verbinden Sie Ihre Wallet erneut", + "insufficient": "Unzureichendes Guthaben für diese Transaktion", + "lowBalance": "Niedriges Guthaben Warnung" + }, + "connection": { + "connected": "Verbunden", + "disconnected": "Getrennt", + "connecting": "Verbinden...", + "connectWallet": "Wallet Verbinden", + "switchWallet": "Wallet Wechseln" + } + }, + "network": { + "mainnet": "HAUPTNETZ", + "testnet": "TESTNETZ", + "switchNetwork": "Netzwerk Wechseln", + "currentNetwork": "Aktuelles Netzwerk" + }, + "offline": { + "banner": { + "title": "Sie sind offline", + "description": "Einige Funktionen sind möglicherweise nicht verfügbar. Aktionen werden in die Warteschlange gestellt und verarbeitet, wenn Sie wieder online sind.", + "retry": "Verbindung Wiederherstellen", + "details": "Verbindungsdetails" + }, + "status": { + "online": "Online", + "offline": "Offline", + "connecting": "Verbinden...", + "queueStatus": "{{count}} Aktion in Warteschlange", + "queueStatus_plural": "{{count}} Aktionen in Warteschlange" + }, + "queue": { + "title": "Offline-Warteschlange", + "description": "{{count}} Aktion wird verarbeitet, wenn Sie wieder online sind", + "description_plural": "{{count}} Aktionen werden verarbeitet, wenn Sie wieder online sind" + }, + "error": { + "paymentOffline": "Zahlung in Warteschlange für wenn Sie wieder online sind", + "generalOffline": "Aktion in Warteschlange für wenn Sie wieder online sind" + } + }, + "about": { + "title": "Über Wata-Board", + "description": "Wata-Board ist eine dezentralisierte Versorgerzahlungsplattform, die auf der Stellar-Blockchain aufgebaut ist. Wir ermöglichen sichere, transparente und effiziente Versorgerrechnungszahlungen mit Kryptowährung.", + "features": { + "title": "Hauptfunktionen", + "secure": "Sichere Transaktionen", + "secureDescription": "Aufgebaut auf der Stellar-Blockchain mit unternehmenssicherer Sicherheit", + "fast": "Schnelle Zahlungen", + "fastDescription": "Nahezu sofortige Abwicklung mit niedrigen Transaktionsgebühren", + "transparent": "Transparente Aufzeichnungen", + "transparentDescription": "Alle Transaktionen werden auf der öffentlichen Blockchain aufgezeichnet", + "decentralized": "Dezentralisiert", + "decentralizedDescription": "Kein einzelner Ausfallpunkt oder Kontrollpunkt" + }, + "howItWorks": { + "title": "Wie Es Funktioniert", + "step1": "Verbinden Sie Ihre Wallet", + "step2": "Zählerdetails eingeben", + "step3": "Zahlung bestätigen", + "step4": "Zahlung verarbeitet" + } + }, + "contact": { + "title": "Kontaktieren Sie Uns", + "description": "Kontaktieren Sie unser Team für Support, Fragen oder Feedback.", + "form": { + "name": "Name", + "namePlaceholder": "Geben Sie Ihren Namen ein", + "email": "E-Mail", + "emailPlaceholder": "Geben Sie Ihre E-Mail ein", + "subject": "Betreff", + "subjectPlaceholder": "Betreff eingeben", + "message": "Nachricht", + "messagePlaceholder": "Geben Sie Ihre Nachricht ein", + "sendButton": "Nachricht Senden", + "sending": "Senden..." + }, + "info": { + "email": "E-Mail", + "support": "Support", + "website": "Website" + } + }, + "rate": { + "title": "Bewerten Sie Ihre Erfahrung", + "description": "Helfen Sie uns uns zu verbessern, indem Sie Ihre Erfahrung mit Wata-Board bewerten.", + "rating": { + "excellent": "Ausgezeichnet", + "good": "Gut", + "average": "Durchschnittlich", + "poor": "Schlecht", + "terrible": "Schrecklich" + }, + "review": { + "title": "Bewertung Schreiben", + "placeholder": "Teilen Sie Ihre Erfahrung mit Wata-Board...", + "submit": "Bewertung Einreichen", + "thankYou": "Vielen Dank für Ihr Feedback!" + } + }, + "errors": { + "general": { + "title": "Fehler", + "unknown": "Ein unbekannter Fehler ist aufgetreten", + "tryAgain": "Bitte versuchen Sie es erneut", + "contactSupport": "Kontaktieren Sie den Support, wenn das Problem weiterhin besteht" + }, + "network": { + "title": "Netzwerkfehler", + "description": "Keine Verbindung zum Netzwerk möglich", + "checkConnection": "Bitte überprüfen Sie Ihre Internetverbindung" + }, + "wallet": { + "title": "Wallet-Fehler", + "notConnected": "Wallet nicht verbunden", + "notInstalled": "Freighter Wallet nicht installiert", + "installFreighter": "Bitte installieren Sie die Freighter Wallet-Erweiterung" + } + }, + "accessibility": { + "skipToMain": "Zum Hauptinhalt springen", + "skipToNavigation": "Zur Navigation springen", + "menuToggle": "Navigationsmenü umschalten", + "closeMenu": "Menü schließen", + "openMenu": "Menü öffnen", + "loading": "Laden...", + "error": "Fehler", + "success": "Erfolg", + "warning": "Warnung", + "info": "Information" + }, + "common": { + "cancel": "Abbrechen", + "confirm": "Bestätigen", + "save": "Speichern", + "delete": "Löschen", + "edit": "Bearbeiten", + "close": "Schließen", + "back": "Zurück", + "next": "Weiter", + "previous": "Vorherige", + "submit": "Einreichen", + "reset": "Zurücksetzen", + "clear": "Löschen", + "search": "Suchen", + "filter": "Filtern", + "sort": "Sortieren", + "loading": "Laden...", + "error": "Fehler", + "success": "Erfolg", + "retry": "Wiederholen", + "refresh": "Aktualisieren", + "copy": "Kopieren", + "copied": "Kopiert!", + "learnMore": "Mehr Erfahren", + "viewDetails": "Details Anzeigen", + "hideDetails": "Details Ausblenden" + }, + "time": { + "seconds": "Sekunde", + "seconds_plural": "Sekunden", + "minutes": "Minute", + "minutes_plural": "Minuten", + "hours": "Stunde", + "hours_plural": "Stunden", + "days": "Tag", + "days_plural": "Tage", + "weeks": "Woche", + "weeks_plural": "Wochen", + "months": "Monat", + "months_plural": "Monate", + "years": "Jahr", + "years_plural": "Jahre", + "ago": "vor {{time}}", + "in": "in {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "Dieses Feld ist erforderlich", + "invalid": "Ungültiges Format", + "tooShort": "Muss mindestens {{min}} Zeichen enthalten", + "tooLong": "Darf nicht mehr als {{max}} Zeichen enthalten", + "invalidEmail": "Bitte geben Sie eine gültige E-Mail-Adresse ein", + "invalidNumber": "Bitte geben Sie eine gültige Zahl ein", + "minValue": "Muss mindestens {{min}} sein", + "maxValue": "Darf nicht mehr als {{max}} sein" + } +} diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json new file mode 100644 index 00000000..781820ae --- /dev/null +++ b/src/i18n/locales/en.json @@ -0,0 +1,260 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Decentralized utility payments on Stellar blockchain", + "description": "Pay your utility bills using cryptocurrency on the Stellar network", + "footer": { + "tagline": "Modern payment solutions for the decentralized web" + } + }, + "navigation": { + "home": "Pay Bill", + "about": "About", + "contact": "Contact", + "rate": "Rate Us", + "language": "Language" + }, + "payment": { + "form": { + "title": "Payment Information", + "meterNumber": "Meter number", + "meterPlaceholder": "e.g. METER-123", + "meterDescription": "Enter your utility meter number as shown on your bill", + "amount": "Amount", + "amountPlaceholder": "Whole number", + "amountDescription": "Enter the payment amount in whole XLM", + "payButton": "Pay bill", + "processing": "Processing...", + "rateLimited": "Rate Limited", + "requiresExtension": "Requires Freighter extension. 5 transactions per minute limit." + }, + "status": { + "title": "Status", + "ready": "Ready.", + "installWallet": "Please install Freighter Wallet extension!", + "enterMeter": "Please enter a meter number.", + "enterValidAmount": "Please enter a valid amount greater than 0.", + "wholeNumber": "Amount must be a whole number.", + "amountTooLarge": "Amount is too large.", + "insufficientBalance": "Insufficient balance. Please add more XLM to your wallet.", + "estimatingFees": "Estimating transaction fees... Please wait.", + "paymentSuccess": "Payment successful! Transaction ID: {{id}}...", + "paymentFailed": "Payment failed: {{error}}" + }, + "feeEstimation": { + "title": "Transaction Fee Estimation", + "calculating": "(Calculating...)", + "calculatingFees": "Calculating estimated fees...", + "paymentAmount": "Payment Amount", + "estimatedNetworkFee": "Estimated Network Fee", + "totalCost": "Total Cost", + "unableToEstimate": "Unable to estimate fees at this time" + }, + "rateLimit": { + "title": "Rate Limit Status", + "requestsAvailable": "{{count}}/5 requests available", + "rateLimited": "Rate limited. Reset in {{time}}", + "queue": "Queue: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Wallet Balance", + "available": "Available Balance", + "total": "Total Balance", + "loading": "Loading balance...", + "error": "Failed to load balance", + "reconnect": "Please reconnect your wallet", + "insufficient": "Insufficient balance for this transaction", + "lowBalance": "Low balance warning" + }, + "connection": { + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "connectWallet": "Connect Wallet", + "switchWallet": "Switch Wallet" + } + }, + "network": { + "mainnet": "MAINNET", + "testnet": "TESTNET", + "switchNetwork": "Switch Network", + "currentNetwork": "Current Network" + }, + "offline": { + "banner": { + "title": "You're offline", + "description": "Some features may be unavailable. Actions will be queued and processed when you're back online.", + "retry": "Retry Connection", + "details": "Connection Details" + }, + "status": { + "online": "Online", + "offline": "Offline", + "connecting": "Connecting...", + "queueStatus": "{{count}} queued action", + "queueStatus_plural": "{{count}} queued actions" + }, + "queue": { + "title": "Offline Queue", + "description": "{{count}} action will be processed when you're back online", + "description_plural": "{{count}} actions will be processed when you're back online" + }, + "error": { + "paymentOffline": "Payment queued for when you're back online", + "generalOffline": "Action queued for when you're back online" + } + }, + "about": { + "title": "About Wata-Board", + "description": "Wata-Board is a decentralized utility payment platform built on the Stellar blockchain. We enable secure, transparent, and efficient utility bill payments using cryptocurrency.", + "features": { + "title": "Key Features", + "secure": "Secure Transactions", + "secureDescription": "Built on Stellar blockchain with enterprise-grade security", + "fast": "Fast Payments", + "fastDescription": "Near-instant settlement with low transaction fees", + "transparent": "Transparent Records", + "transparentDescription": "All transactions are recorded on the public blockchain", + "decentralized": "Decentralized", + "decentralizedDescription": "No single point of failure or control" + }, + "howItWorks": { + "title": "How It Works", + "step1": "Connect your wallet", + "step2": "Enter meter details", + "step3": "Confirm payment", + "step4": "Payment processed" + } + }, + "contact": { + "title": "Contact Us", + "description": "Get in touch with our team for support, questions, or feedback.", + "form": { + "name": "Name", + "namePlaceholder": "Enter your name", + "email": "Email", + "emailPlaceholder": "Enter your email", + "subject": "Subject", + "subjectPlaceholder": "Enter subject", + "message": "Message", + "messagePlaceholder": "Enter your message", + "sendButton": "Send Message", + "sending": "Sending..." + }, + "info": { + "email": "Email", + "support": "Support", + "website": "Website" + } + }, + "rate": { + "title": "Rate Your Experience", + "description": "Help us improve by rating your experience with Wata-Board.", + "rating": { + "excellent": "Excellent", + "good": "Good", + "average": "Average", + "poor": "Poor", + "terrible": "Terrible" + }, + "review": { + "title": "Write a Review", + "placeholder": "Share your experience with Wata-Board...", + "submit": "Submit Review", + "thankYou": "Thank you for your feedback!" + } + }, + "errors": { + "general": { + "title": "Error", + "unknown": "An unknown error occurred", + "tryAgain": "Please try again", + "contactSupport": "Contact support if the problem persists" + }, + "network": { + "title": "Network Error", + "description": "Unable to connect to the network", + "checkConnection": "Please check your internet connection" + }, + "wallet": { + "title": "Wallet Error", + "notConnected": "Wallet not connected", + "notInstalled": "Freighter wallet not installed", + "installFreighter": "Please install Freighter wallet extension" + } + }, + "accessibility": { + "skipToMain": "Skip to main content", + "skipToNavigation": "Skip to navigation", + "menuToggle": "Toggle navigation menu", + "closeMenu": "Close menu", + "openMenu": "Open menu", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "warning": "Warning", + "info": "Information" + }, + "common": { + "cancel": "Cancel", + "confirm": "Confirm", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "back": "Back", + "next": "Next", + "previous": "Previous", + "submit": "Submit", + "reset": "Reset", + "clear": "Clear", + "search": "Search", + "filter": "Filter", + "sort": "Sort", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "retry": "Retry", + "refresh": "Refresh", + "copy": "Copy", + "copied": "Copied!", + "learnMore": "Learn More", + "viewDetails": "View Details", + "hideDetails": "Hide Details" + }, + "time": { + "seconds": "second", + "seconds_plural": "seconds", + "minutes": "minute", + "minutes_plural": "minutes", + "hours": "hour", + "hours_plural": "hours", + "days": "day", + "days_plural": "days", + "weeks": "week", + "weeks_plural": "weeks", + "months": "month", + "months_plural": "months", + "years": "year", + "years_plural": "years", + "ago": "{{time}} ago", + "in": "in {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "This field is required", + "invalid": "Invalid format", + "tooShort": "Must be at least {{min}} characters", + "tooLong": "Must be no more than {{max}} characters", + "invalidEmail": "Please enter a valid email address", + "invalidNumber": "Please enter a valid number", + "minValue": "Must be at least {{min}}", + "maxValue": "Must be no more than {{max}}" + } +} diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json new file mode 100644 index 00000000..85016115 --- /dev/null +++ b/src/i18n/locales/es.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Pagos de servicios públicos descentralizados en la blockchain Stellar", + "description": "Paga tus facturas de servicios públicos usando criptomoneda en la red Stellar" + }, + "navigation": { + "home": "Pagar Factura", + "about": "Acerca de", + "contact": "Contacto", + "rate": "Califícanos", + "language": "Idioma" + }, + "payment": { + "form": { + "title": "Información de Pago", + "meterNumber": "Número de medidor", + "meterPlaceholder": "ej. MEDIDOR-123", + "meterDescription": "Ingresa tu número de medidor de servicios como aparece en tu factura", + "amount": "Cantidad", + "amountPlaceholder": "Número entero", + "amountDescription": "Ingresa el monto del pago en XLM entero", + "payButton": "Pagar factura", + "processing": "Procesando...", + "rateLimited": "Límite Alcanzado", + "requiresExtension": "Requiere la extensión Freighter. Límite de 5 transacciones por minuto." + }, + "status": { + "title": "Estado", + "ready": "Listo.", + "installWallet": "¡Por favor instala la extensión Freighter Wallet!", + "enterMeter": "Por favor ingresa un número de medidor.", + "enterValidAmount": "Por favor ingresa una cantidad válida mayor a 0.", + "wholeNumber": "La cantidad debe ser un número entero.", + "amountTooLarge": "La cantidad es demasiado grande.", + "insufficientBalance": "Saldo insuficiente. Por favor agrega más XLM a tu billetera.", + "estimatingFees": "Estimando tarifas de transacción... Por favor espera.", + "paymentSuccess": "¡Pago exitoso! ID de transacción: {{id}}...", + "paymentFailed": "Pago fallido: {{error}}" + }, + "feeEstimation": { + "title": "Estimación de Tarifa de Transacción", + "calculating": "(Calculando...)", + "calculatingFees": "Calculando tarifas estimadas...", + "paymentAmount": "Monto del Pago", + "estimatedNetworkFee": "Tarifa de Red Estimada", + "totalCost": "Costo Total", + "unableToEstimate": "No se pueden estimar las tarifas en este momento" + }, + "rateLimit": { + "title": "Estado del Límite de Tasa", + "requestsAvailable": "{{count}}/5 solicitudes disponibles", + "rateLimited": "Límite alcanzado. Reinicio en {{time}}", + "queue": "Cola: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Saldo de Billetera", + "available": "Saldo Disponible", + "total": "Saldo Total", + "loading": "Cargando saldo...", + "error": "Error al cargar saldo", + "reconnect": "Por favor reconecta tu billetera", + "insufficient": "Saldo insuficiente para esta transacción", + "lowBalance": "Advertencia de saldo bajo" + }, + "connection": { + "connected": "Conectado", + "disconnected": "Desconectado", + "connecting": "Conectando...", + "connectWallet": "Conectar Billetera", + "switchWallet": "Cambiar Billetera" + } + }, + "network": { + "mainnet": "RED PRINCIPAL", + "testnet": "RED DE PRUEBA", + "switchNetwork": "Cambiar Red", + "currentNetwork": "Red Actual" + }, + "offline": { + "banner": { + "title": "Estás desconectado", + "description": "Algunas funciones pueden no estar disponibles. Las acciones se pondrán en cola y se procesarán cuando vuelvas a estar en línea.", + "retry": "Reintentar Conexión", + "details": "Detalles de Conexión" + }, + "status": { + "online": "En línea", + "offline": "Desconectado", + "connecting": "Conectando...", + "queueStatus": "{{count}} acción en cola", + "queueStatus_plural": "{{count}} acciones en cola" + }, + "queue": { + "title": "Cola Desconectada", + "description": "{{count}} acción se procesará cuando vuelvas a estar en línea", + "description_plural": "{{count}} acciones se procesarán cuando vuelvas a estar en línea" + }, + "error": { + "paymentOffline": "Pago en cola para cuando vuelvas a estar en línea", + "generalOffline": "Acción en cola para cuando vuelvas a estar en línea" + } + }, + "about": { + "title": "Acerca de Wata-Board", + "description": "Wata-Board es una plataforma de pago de servicios públicos descentralizada construida en la blockchain Stellar. Permitimos pagos de facturas de servicios seguros, transparentes y eficientes usando criptomoneda.", + "features": { + "title": "Características Clave", + "secure": "Transacciones Seguras", + "secureDescription": "Construido en la blockchain Stellar con seguridad de nivel empresarial", + "fast": "Pagos Rápidos", + "fastDescription": "Liquidación casi instantánea con tarifas de transacción bajas", + "transparent": "Registros Transparentes", + "transparentDescription": "Todas las transacciones se registran en la blockchain pública", + "decentralized": "Descentralizado", + "decentralizedDescription": "Sin punto único de falla o control" + }, + "howItWorks": { + "title": "Cómo Funciona", + "step1": "Conecta tu billetera", + "step2": "Ingresa detalles del medidor", + "step3": "Confirma el pago", + "step4": "Pago procesado" + } + }, + "contact": { + "title": "Contáctanos", + "description": "Comunícate con nuestro equipo para soporte, preguntas o retroalimentación.", + "form": { + "name": "Nombre", + "namePlaceholder": "Ingresa tu nombre", + "email": "Correo electrónico", + "emailPlaceholder": "Ingresa tu correo", + "subject": "Asunto", + "subjectPlaceholder": "Ingresa el asunto", + "message": "Mensaje", + "messagePlaceholder": "Ingresa tu mensaje", + "sendButton": "Enviar Mensaje", + "sending": "Enviando..." + }, + "info": { + "email": "Correo electrónico", + "support": "Soporte", + "website": "Sitio web" + } + }, + "rate": { + "title": "Califica Tu Experiencia", + "description": "Ayúdanos a mejorar calificando tu experiencia con Wata-Board.", + "rating": { + "excellent": "Excelente", + "good": "Bueno", + "average": "Promedio", + "poor": "Pobre", + "terrible": "Terrible" + }, + "review": { + "title": "Escribe una Reseña", + "placeholder": "Comparte tu experiencia con Wata-Board...", + "submit": "Enviar Reseña", + "thankYou": "¡Gracias por tu retroalimentación!" + } + }, + "errors": { + "general": { + "title": "Error", + "unknown": "Ocurrió un error desconocido", + "tryAgain": "Por favor intenta de nuevo", + "contactSupport": "Contacta soporte si el problema persiste" + }, + "network": { + "title": "Error de Red", + "description": "No se puede conectar a la red", + "checkConnection": "Por favor verifica tu conexión a internet" + }, + "wallet": { + "title": "Error de Billetera", + "notConnected": "Billetera no conectada", + "notInstalled": "Billetera Freighter no instalada", + "installFreighter": "Por favor instala la extensión de billetera Freighter" + } + }, + "accessibility": { + "skipToMain": "Saltar al contenido principal", + "skipToNavigation": "Saltar a la navegación", + "menuToggle": "Alternar menú de navegación", + "closeMenu": "Cerrar menú", + "openMenu": "Abrir menú", + "loading": "Cargando...", + "error": "Error", + "success": "Éxito", + "warning": "Advertencia", + "info": "Información" + }, + "common": { + "cancel": "Cancelar", + "confirm": "Confirmar", + "save": "Guardar", + "delete": "Eliminar", + "edit": "Editar", + "close": "Cerrar", + "back": "Atrás", + "next": "Siguiente", + "previous": "Anterior", + "submit": "Enviar", + "reset": "Restablecer", + "clear": "Limpiar", + "search": "Buscar", + "filter": "Filtrar", + "sort": "Ordenar", + "loading": "Cargando...", + "error": "Error", + "success": "Éxito", + "retry": "Reintentar", + "refresh": "Actualizar", + "copy": "Copiar", + "copied": "¡Copiado!", + "learnMore": "Aprende Más", + "viewDetails": "Ver Detalles", + "hideDetails": "Ocultar Detalles" + }, + "time": { + "seconds": "segundo", + "seconds_plural": "segundos", + "minutes": "minuto", + "minutes_plural": "minutos", + "hours": "hora", + "hours_plural": "horas", + "days": "día", + "days_plural": "días", + "weeks": "semana", + "weeks_plural": "semanas", + "months": "mes", + "months_plural": "meses", + "years": "año", + "years_plural": "años", + "ago": "hace {{time}}", + "in": "en {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "Este campo es requerido", + "invalid": "Formato inválido", + "tooShort": "Debe tener al menos {{min}} caracteres", + "tooLong": "No debe tener más de {{max}} caracteres", + "invalidEmail": "Por favor ingresa una dirección de correo válida", + "invalidNumber": "Por favor ingresa un número válido", + "minValue": "Debe ser al menos {{min}}", + "maxValue": "No debe ser más de {{max}}" + } +} diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json new file mode 100644 index 00000000..96dc8919 --- /dev/null +++ b/src/i18n/locales/fr.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Paiements de services publics décentralisés sur la blockchain Stellar", + "description": "Payez vos factures de services publics en utilisant la cryptomonnaie sur le réseau Stellar" + }, + "navigation": { + "home": "Payer Facture", + "about": "À Propos", + "contact": "Contact", + "rate": "Nous Noter", + "language": "Langue" + }, + "payment": { + "form": { + "title": "Informations de Paiement", + "meterNumber": "Numéro de compteur", + "meterPlaceholder": "ex. COMPTEUR-123", + "meterDescription": "Entrez votre numéro de compteur de services comme indiqué sur votre facture", + "amount": "Montant", + "amountPlaceholder": "Nombre entier", + "amountDescription": "Entrez le montant du paiement en XLM entier", + "payButton": "Payer facture", + "processing": "Traitement...", + "rateLimited": "Limite Atteinte", + "requiresExtension": "Nécessite l'extension Freighter. Limite de 5 transactions par minute." + }, + "status": { + "title": "Statut", + "ready": "Prêt.", + "installWallet": "Veuillez installer l'extension Freighter Wallet !", + "enterMeter": "Veuillez entrer un numéro de compteur.", + "enterValidAmount": "Veuillez entrer un montant valide supérieur à 0.", + "wholeNumber": "Le montant doit être un nombre entier.", + "amountTooLarge": "Le montant est trop élevé.", + "insufficientBalance": "Solde insuffisant. Veuillez ajouter plus de XLM à votre portefeuille.", + "estimatingFees": "Estimation des frais de transaction... Veuillez patienter.", + "paymentSuccess": "Paiement réussi ! ID de transaction : {{id}}...", + "paymentFailed": "Paiement échoué : {{error}}" + }, + "feeEstimation": { + "title": "Estimation des Frais de Transaction", + "calculating": "(Calcul...)", + "calculatingFees": "Calcul des frais estimés...", + "paymentAmount": "Montant du Paiement", + "estimatedNetworkFee": "Frais de Réseau Estimés", + "totalCost": "Coût Total", + "unableToEstimate": "Impossible d'estimer les frais pour le moment" + }, + "rateLimit": { + "title": "Statut de Limite de Taux", + "requestsAvailable": "{{count}}/5 requêtes disponibles", + "rateLimited": "Limite atteinte. Réinitialisation dans {{time}}", + "queue": "File d'attente : {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Solde du Portefeuille", + "available": "Solde Disponible", + "total": "Solde Total", + "loading": "Chargement du solde...", + "error": "Échec du chargement du solde", + "reconnect": "Veuillez reconnecter votre portefeuille", + "insufficient": "Solde insuffisant pour cette transaction", + "lowBalance": "Avertissement de solde faible" + }, + "connection": { + "connected": "Connecté", + "disconnected": "Déconnecté", + "connecting": "Connexion...", + "connectWallet": "Connecter Portefeuille", + "switchWallet": "Changer Portefeuille" + } + }, + "network": { + "mainnet": "RÉSEAU PRINCIPAL", + "testnet": "RÉSEAU DE TEST", + "switchNetwork": "Changer Réseau", + "currentNetwork": "Réseau Actuel" + }, + "offline": { + "banner": { + "title": "Vous êtes hors ligne", + "description": "Certaines fonctionnalités peuvent ne pas être disponibles. Les actions seront mises en file d'attente et traitées lorsque vous serez de nouveau en ligne.", + "retry": "Réessayer la Connexion", + "details": "Détails de Connexion" + }, + "status": { + "online": "En ligne", + "offline": "Hors ligne", + "connecting": "Connexion...", + "queueStatus": "{{count}} action en file d'attente", + "queueStatus_plural": "{{count}} actions en file d'attente" + }, + "queue": { + "title": "File d'Attente Hors Ligne", + "description": "{{count}} action sera traitée lorsque vous serez de nouveau en ligne", + "description_plural": "{{count}} actions seront traitées lorsque vous serez de nouveau en ligne" + }, + "error": { + "paymentOffline": "Paiement en file d'attente pour lorsque vous serez de nouveau en ligne", + "generalOffline": "Action en file d'attente pour lorsque vous serez de nouveau en ligne" + } + }, + "about": { + "title": "À Propos de Wata-Board", + "description": "Wata-Board est une plateforme de paiement de services publics décentralisée construite sur la blockchain Stellar. Nous permettons des paiements de factures de services sécurisés, transparents et efficaces en utilisant la cryptomonnaie.", + "features": { + "title": "Caractéristiques Clés", + "secure": "Transactions Sécurisées", + "secureDescription": "Construit sur la blockchain Stellar avec une sécurité de niveau entreprise", + "fast": "Paiements Rapides", + "fastDescription": "Règlement quasi instantané avec des frais de transaction bas", + "transparent": "Registres Transparents", + "transparentDescription": "Toutes les transactions sont enregistrées sur la blockchain publique", + "decentralized": "Décentralisé", + "decentralizedDescription": "Aucun point unique de défaillance ou de contrôle" + }, + "howItWorks": { + "title": "Comment Ça Marche", + "step1": "Connectez votre portefeuille", + "step2": "Entrez les détails du compteur", + "step3": "Confirmez le paiement", + "step4": "Paiement traité" + } + }, + "contact": { + "title": "Contactez-nous", + "description": "Contactez notre équipe pour du support, des questions ou des commentaires.", + "form": { + "name": "Nom", + "namePlaceholder": "Entrez votre nom", + "email": "Email", + "emailPlaceholder": "Entrez votre email", + "subject": "Sujet", + "subjectPlaceholder": "Entrez le sujet", + "message": "Message", + "messagePlaceholder": "Entrez votre message", + "sendButton": "Envoyer Message", + "sending": "Envoi..." + }, + "info": { + "email": "Email", + "support": "Support", + "website": "Site web" + } + }, + "rate": { + "title": "Notez Votre Expérience", + "description": "Aidez-nous à nous améliorer en notant votre expérience avec Wata-Board.", + "rating": { + "excellent": "Excellent", + "good": "Bon", + "average": "Moyen", + "poor": "Mauvais", + "terrible": "Terrible" + }, + "review": { + "title": "Écrire un Avis", + "placeholder": "Partagez votre expérience avec Wata-Board...", + "submit": "Soumettre Avis", + "thankYou": "Merci pour vos commentaires !" + } + }, + "errors": { + "general": { + "title": "Erreur", + "unknown": "Une erreur inconnue s'est produite", + "tryAgain": "Veuillez réessayer", + "contactSupport": "Contactez le support si le problème persiste" + }, + "network": { + "title": "Erreur Réseau", + "description": "Impossible de se connecter au réseau", + "checkConnection": "Veuillez vérifier votre connexion internet" + }, + "wallet": { + "title": "Erreur de Portefeuille", + "notConnected": "Portefeuille non connecté", + "notInstalled": "Portefeuille Freighter non installé", + "installFreighter": "Veuillez installer l'extension de portefeuille Freighter" + } + }, + "accessibility": { + "skipToMain": "Aller au contenu principal", + "skipToNavigation": "Aller à la navigation", + "menuToggle": "Basculer le menu de navigation", + "closeMenu": "Fermer le menu", + "openMenu": "Ouvrir le menu", + "loading": "Chargement...", + "error": "Erreur", + "success": "Succès", + "warning": "Avertissement", + "info": "Information" + }, + "common": { + "cancel": "Annuler", + "confirm": "Confirmer", + "save": "Sauvegarder", + "delete": "Supprimer", + "edit": "Modifier", + "close": "Fermer", + "back": "Retour", + "next": "Suivant", + "previous": "Précédent", + "submit": "Soumettre", + "reset": "Réinitialiser", + "clear": "Effacer", + "search": "Rechercher", + "filter": "Filtrer", + "sort": "Trier", + "loading": "Chargement...", + "error": "Erreur", + "success": "Succès", + "retry": "Réessayer", + "refresh": "Actualiser", + "copy": "Copier", + "copied": "Copié !", + "learnMore": "En Savoir Plus", + "viewDetails": "Voir Détails", + "hideDetails": "Masquer Détails" + }, + "time": { + "seconds": "seconde", + "seconds_plural": "secondes", + "minutes": "minute", + "minutes_plural": "minutes", + "hours": "heure", + "hours_plural": "heures", + "days": "jour", + "days_plural": "jours", + "weeks": "semaine", + "weeks_plural": "semaines", + "months": "mois", + "months_plural": "mois", + "years": "an", + "years_plural": "ans", + "ago": "il y a {{time}}", + "in": "dans {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "Ce champ est requis", + "invalid": "Format invalide", + "tooShort": "Doit contenir au moins {{min}} caractères", + "tooLong": "Ne doit pas dépasser {{max}} caractères", + "invalidEmail": "Veuillez entrer une adresse email valide", + "invalidNumber": "Veuillez entrer un nombre valide", + "minValue": "Doit être au moins {{min}}", + "maxValue": "Ne doit pas dépasser {{max}}" + } +} diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json new file mode 100644 index 00000000..4649c7e2 --- /dev/null +++ b/src/i18n/locales/hi.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Decentralized utility payments on Stellar blockchain", + "description": "Pay your utility bills using cryptocurrency on the Stellar network" + }, + "navigation": { + "home": "Pay Bill", + "about": "About", + "contact": "Contact", + "rate": "Rate Us", + "language": "Language" + }, + "payment": { + "form": { + "title": "Payment Information", + "meterNumber": "Meter number", + "meterPlaceholder": "e.g. METER-123", + "meterDescription": "Enter your utility meter number as shown on your bill", + "amount": "Amount", + "amountPlaceholder": "Whole number", + "amountDescription": "Enter the payment amount in whole XLM", + "payButton": "Pay bill", + "processing": "Processing...", + "rateLimited": "Rate Limited", + "requiresExtension": "Requires Freighter extension. 5 transactions per minute limit." + }, + "status": { + "title": "Status", + "ready": "Ready.", + "installWallet": "Please install Freighter Wallet extension!", + "enterMeter": "Please enter a meter number.", + "enterValidAmount": "Please enter a valid amount greater than 0.", + "wholeNumber": "Amount must be a whole number.", + "amountTooLarge": "Amount is too large.", + "insufficientBalance": "Insufficient balance. Please add more XLM to your wallet.", + "estimatingFees": "Estimating transaction fees... Please wait.", + "paymentSuccess": "Payment successful! Transaction ID: {{id}}...", + "paymentFailed": "Payment failed: {{error}}" + }, + "feeEstimation": { + "title": "Transaction Fee Estimation", + "calculating": "(Calculating...)", + "calculatingFees": "Calculating estimated fees...", + "paymentAmount": "Payment Amount", + "estimatedNetworkFee": "Estimated Network Fee", + "totalCost": "Total Cost", + "unableToEstimate": "Unable to estimate fees at this time" + }, + "rateLimit": { + "title": "Rate Limit Status", + "requestsAvailable": "{{count}}/5 requests available", + "rateLimited": "Rate limited. Reset in {{time}}", + "queue": "Queue: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Wallet Balance", + "available": "Available Balance", + "total": "Total Balance", + "loading": "Loading balance...", + "error": "Failed to load balance", + "reconnect": "Please reconnect your wallet", + "insufficient": "Insufficient balance for this transaction", + "lowBalance": "Low balance warning" + }, + "connection": { + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "connectWallet": "Connect Wallet", + "switchWallet": "Switch Wallet" + } + }, + "network": { + "mainnet": "MAINNET", + "testnet": "TESTNET", + "switchNetwork": "Switch Network", + "currentNetwork": "Current Network" + }, + "offline": { + "banner": { + "title": "You're offline", + "description": "Some features may be unavailable. Actions will be queued and processed when you're back online.", + "retry": "Retry Connection", + "details": "Connection Details" + }, + "status": { + "online": "Online", + "offline": "Offline", + "connecting": "Connecting...", + "queueStatus": "{{count}} queued action", + "queueStatus_plural": "{{count}} queued actions" + }, + "queue": { + "title": "Offline Queue", + "description": "{{count}} action will be processed when you're back online", + "description_plural": "{{count}} actions will be processed when you're back online" + }, + "error": { + "paymentOffline": "Payment queued for when you're back online", + "generalOffline": "Action queued for when you're back online" + } + }, + "about": { + "title": "About Wata-Board", + "description": "Wata-Board is a decentralized utility payment platform built on the Stellar blockchain. We enable secure, transparent, and efficient utility bill payments using cryptocurrency.", + "features": { + "title": "Key Features", + "secure": "Secure Transactions", + "secureDescription": "Built on Stellar blockchain with enterprise-grade security", + "fast": "Fast Payments", + "fastDescription": "Near-instant settlement with low transaction fees", + "transparent": "Transparent Records", + "transparentDescription": "All transactions are recorded on the public blockchain", + "decentralized": "Decentralized", + "decentralizedDescription": "No single point of failure or control" + }, + "howItWorks": { + "title": "How It Works", + "step1": "Connect your wallet", + "step2": "Enter meter details", + "step3": "Confirm payment", + "step4": "Payment processed" + } + }, + "contact": { + "title": "Contact Us", + "description": "Get in touch with our team for support, questions, or feedback.", + "form": { + "name": "Name", + "namePlaceholder": "Enter your name", + "email": "Email", + "emailPlaceholder": "Enter your email", + "subject": "Subject", + "subjectPlaceholder": "Enter subject", + "message": "Message", + "messagePlaceholder": "Enter your message", + "sendButton": "Send Message", + "sending": "Sending..." + }, + "info": { + "email": "Email", + "support": "Support", + "website": "Website" + } + }, + "rate": { + "title": "Rate Your Experience", + "description": "Help us improve by rating your experience with Wata-Board.", + "rating": { + "excellent": "Excellent", + "good": "Good", + "average": "Average", + "poor": "Poor", + "terrible": "Terrible" + }, + "review": { + "title": "Write a Review", + "placeholder": "Share your experience with Wata-Board...", + "submit": "Submit Review", + "thankYou": "Thank you for your feedback!" + } + }, + "errors": { + "general": { + "title": "Error", + "unknown": "An unknown error occurred", + "tryAgain": "Please try again", + "contactSupport": "Contact support if the problem persists" + }, + "network": { + "title": "Network Error", + "description": "Unable to connect to the network", + "checkConnection": "Please check your internet connection" + }, + "wallet": { + "title": "Wallet Error", + "notConnected": "Wallet not connected", + "notInstalled": "Freighter wallet not installed", + "installFreighter": "Please install Freighter wallet extension" + } + }, + "accessibility": { + "skipToMain": "Skip to main content", + "skipToNavigation": "Skip to navigation", + "menuToggle": "Toggle navigation menu", + "closeMenu": "Close menu", + "openMenu": "Open menu", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "warning": "Warning", + "info": "Information" + }, + "common": { + "cancel": "Cancel", + "confirm": "Confirm", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "back": "Back", + "next": "Next", + "previous": "Previous", + "submit": "Submit", + "reset": "Reset", + "clear": "Clear", + "search": "Search", + "filter": "Filter", + "sort": "Sort", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "retry": "Retry", + "refresh": "Refresh", + "copy": "Copy", + "copied": "Copied!", + "learnMore": "Learn More", + "viewDetails": "View Details", + "hideDetails": "Hide Details" + }, + "time": { + "seconds": "second", + "seconds_plural": "seconds", + "minutes": "minute", + "minutes_plural": "minutes", + "hours": "hour", + "hours_plural": "hours", + "days": "day", + "days_plural": "days", + "weeks": "week", + "weeks_plural": "weeks", + "months": "month", + "months_plural": "months", + "years": "year", + "years_plural": "years", + "ago": "{{time}} ago", + "in": "in {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "This field is required", + "invalid": "Invalid format", + "tooShort": "Must be at least {{min}} characters", + "tooLong": "Must be no more than {{max}} characters", + "invalidEmail": "Please enter a valid email address", + "invalidNumber": "Please enter a valid number", + "minValue": "Must be at least {{min}}", + "maxValue": "Must be no more than {{max}}" + } +} diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json new file mode 100644 index 00000000..4649c7e2 --- /dev/null +++ b/src/i18n/locales/ja.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Decentralized utility payments on Stellar blockchain", + "description": "Pay your utility bills using cryptocurrency on the Stellar network" + }, + "navigation": { + "home": "Pay Bill", + "about": "About", + "contact": "Contact", + "rate": "Rate Us", + "language": "Language" + }, + "payment": { + "form": { + "title": "Payment Information", + "meterNumber": "Meter number", + "meterPlaceholder": "e.g. METER-123", + "meterDescription": "Enter your utility meter number as shown on your bill", + "amount": "Amount", + "amountPlaceholder": "Whole number", + "amountDescription": "Enter the payment amount in whole XLM", + "payButton": "Pay bill", + "processing": "Processing...", + "rateLimited": "Rate Limited", + "requiresExtension": "Requires Freighter extension. 5 transactions per minute limit." + }, + "status": { + "title": "Status", + "ready": "Ready.", + "installWallet": "Please install Freighter Wallet extension!", + "enterMeter": "Please enter a meter number.", + "enterValidAmount": "Please enter a valid amount greater than 0.", + "wholeNumber": "Amount must be a whole number.", + "amountTooLarge": "Amount is too large.", + "insufficientBalance": "Insufficient balance. Please add more XLM to your wallet.", + "estimatingFees": "Estimating transaction fees... Please wait.", + "paymentSuccess": "Payment successful! Transaction ID: {{id}}...", + "paymentFailed": "Payment failed: {{error}}" + }, + "feeEstimation": { + "title": "Transaction Fee Estimation", + "calculating": "(Calculating...)", + "calculatingFees": "Calculating estimated fees...", + "paymentAmount": "Payment Amount", + "estimatedNetworkFee": "Estimated Network Fee", + "totalCost": "Total Cost", + "unableToEstimate": "Unable to estimate fees at this time" + }, + "rateLimit": { + "title": "Rate Limit Status", + "requestsAvailable": "{{count}}/5 requests available", + "rateLimited": "Rate limited. Reset in {{time}}", + "queue": "Queue: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Wallet Balance", + "available": "Available Balance", + "total": "Total Balance", + "loading": "Loading balance...", + "error": "Failed to load balance", + "reconnect": "Please reconnect your wallet", + "insufficient": "Insufficient balance for this transaction", + "lowBalance": "Low balance warning" + }, + "connection": { + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "connectWallet": "Connect Wallet", + "switchWallet": "Switch Wallet" + } + }, + "network": { + "mainnet": "MAINNET", + "testnet": "TESTNET", + "switchNetwork": "Switch Network", + "currentNetwork": "Current Network" + }, + "offline": { + "banner": { + "title": "You're offline", + "description": "Some features may be unavailable. Actions will be queued and processed when you're back online.", + "retry": "Retry Connection", + "details": "Connection Details" + }, + "status": { + "online": "Online", + "offline": "Offline", + "connecting": "Connecting...", + "queueStatus": "{{count}} queued action", + "queueStatus_plural": "{{count}} queued actions" + }, + "queue": { + "title": "Offline Queue", + "description": "{{count}} action will be processed when you're back online", + "description_plural": "{{count}} actions will be processed when you're back online" + }, + "error": { + "paymentOffline": "Payment queued for when you're back online", + "generalOffline": "Action queued for when you're back online" + } + }, + "about": { + "title": "About Wata-Board", + "description": "Wata-Board is a decentralized utility payment platform built on the Stellar blockchain. We enable secure, transparent, and efficient utility bill payments using cryptocurrency.", + "features": { + "title": "Key Features", + "secure": "Secure Transactions", + "secureDescription": "Built on Stellar blockchain with enterprise-grade security", + "fast": "Fast Payments", + "fastDescription": "Near-instant settlement with low transaction fees", + "transparent": "Transparent Records", + "transparentDescription": "All transactions are recorded on the public blockchain", + "decentralized": "Decentralized", + "decentralizedDescription": "No single point of failure or control" + }, + "howItWorks": { + "title": "How It Works", + "step1": "Connect your wallet", + "step2": "Enter meter details", + "step3": "Confirm payment", + "step4": "Payment processed" + } + }, + "contact": { + "title": "Contact Us", + "description": "Get in touch with our team for support, questions, or feedback.", + "form": { + "name": "Name", + "namePlaceholder": "Enter your name", + "email": "Email", + "emailPlaceholder": "Enter your email", + "subject": "Subject", + "subjectPlaceholder": "Enter subject", + "message": "Message", + "messagePlaceholder": "Enter your message", + "sendButton": "Send Message", + "sending": "Sending..." + }, + "info": { + "email": "Email", + "support": "Support", + "website": "Website" + } + }, + "rate": { + "title": "Rate Your Experience", + "description": "Help us improve by rating your experience with Wata-Board.", + "rating": { + "excellent": "Excellent", + "good": "Good", + "average": "Average", + "poor": "Poor", + "terrible": "Terrible" + }, + "review": { + "title": "Write a Review", + "placeholder": "Share your experience with Wata-Board...", + "submit": "Submit Review", + "thankYou": "Thank you for your feedback!" + } + }, + "errors": { + "general": { + "title": "Error", + "unknown": "An unknown error occurred", + "tryAgain": "Please try again", + "contactSupport": "Contact support if the problem persists" + }, + "network": { + "title": "Network Error", + "description": "Unable to connect to the network", + "checkConnection": "Please check your internet connection" + }, + "wallet": { + "title": "Wallet Error", + "notConnected": "Wallet not connected", + "notInstalled": "Freighter wallet not installed", + "installFreighter": "Please install Freighter wallet extension" + } + }, + "accessibility": { + "skipToMain": "Skip to main content", + "skipToNavigation": "Skip to navigation", + "menuToggle": "Toggle navigation menu", + "closeMenu": "Close menu", + "openMenu": "Open menu", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "warning": "Warning", + "info": "Information" + }, + "common": { + "cancel": "Cancel", + "confirm": "Confirm", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "back": "Back", + "next": "Next", + "previous": "Previous", + "submit": "Submit", + "reset": "Reset", + "clear": "Clear", + "search": "Search", + "filter": "Filter", + "sort": "Sort", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "retry": "Retry", + "refresh": "Refresh", + "copy": "Copy", + "copied": "Copied!", + "learnMore": "Learn More", + "viewDetails": "View Details", + "hideDetails": "Hide Details" + }, + "time": { + "seconds": "second", + "seconds_plural": "seconds", + "minutes": "minute", + "minutes_plural": "minutes", + "hours": "hour", + "hours_plural": "hours", + "days": "day", + "days_plural": "days", + "weeks": "week", + "weeks_plural": "weeks", + "months": "month", + "months_plural": "months", + "years": "year", + "years_plural": "years", + "ago": "{{time}} ago", + "in": "in {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "This field is required", + "invalid": "Invalid format", + "tooShort": "Must be at least {{min}} characters", + "tooLong": "Must be no more than {{max}} characters", + "invalidEmail": "Please enter a valid email address", + "invalidNumber": "Please enter a valid number", + "minValue": "Must be at least {{min}}", + "maxValue": "Must be no more than {{max}}" + } +} diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json new file mode 100644 index 00000000..4649c7e2 --- /dev/null +++ b/src/i18n/locales/pt.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Decentralized utility payments on Stellar blockchain", + "description": "Pay your utility bills using cryptocurrency on the Stellar network" + }, + "navigation": { + "home": "Pay Bill", + "about": "About", + "contact": "Contact", + "rate": "Rate Us", + "language": "Language" + }, + "payment": { + "form": { + "title": "Payment Information", + "meterNumber": "Meter number", + "meterPlaceholder": "e.g. METER-123", + "meterDescription": "Enter your utility meter number as shown on your bill", + "amount": "Amount", + "amountPlaceholder": "Whole number", + "amountDescription": "Enter the payment amount in whole XLM", + "payButton": "Pay bill", + "processing": "Processing...", + "rateLimited": "Rate Limited", + "requiresExtension": "Requires Freighter extension. 5 transactions per minute limit." + }, + "status": { + "title": "Status", + "ready": "Ready.", + "installWallet": "Please install Freighter Wallet extension!", + "enterMeter": "Please enter a meter number.", + "enterValidAmount": "Please enter a valid amount greater than 0.", + "wholeNumber": "Amount must be a whole number.", + "amountTooLarge": "Amount is too large.", + "insufficientBalance": "Insufficient balance. Please add more XLM to your wallet.", + "estimatingFees": "Estimating transaction fees... Please wait.", + "paymentSuccess": "Payment successful! Transaction ID: {{id}}...", + "paymentFailed": "Payment failed: {{error}}" + }, + "feeEstimation": { + "title": "Transaction Fee Estimation", + "calculating": "(Calculating...)", + "calculatingFees": "Calculating estimated fees...", + "paymentAmount": "Payment Amount", + "estimatedNetworkFee": "Estimated Network Fee", + "totalCost": "Total Cost", + "unableToEstimate": "Unable to estimate fees at this time" + }, + "rateLimit": { + "title": "Rate Limit Status", + "requestsAvailable": "{{count}}/5 requests available", + "rateLimited": "Rate limited. Reset in {{time}}", + "queue": "Queue: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Wallet Balance", + "available": "Available Balance", + "total": "Total Balance", + "loading": "Loading balance...", + "error": "Failed to load balance", + "reconnect": "Please reconnect your wallet", + "insufficient": "Insufficient balance for this transaction", + "lowBalance": "Low balance warning" + }, + "connection": { + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "connectWallet": "Connect Wallet", + "switchWallet": "Switch Wallet" + } + }, + "network": { + "mainnet": "MAINNET", + "testnet": "TESTNET", + "switchNetwork": "Switch Network", + "currentNetwork": "Current Network" + }, + "offline": { + "banner": { + "title": "You're offline", + "description": "Some features may be unavailable. Actions will be queued and processed when you're back online.", + "retry": "Retry Connection", + "details": "Connection Details" + }, + "status": { + "online": "Online", + "offline": "Offline", + "connecting": "Connecting...", + "queueStatus": "{{count}} queued action", + "queueStatus_plural": "{{count}} queued actions" + }, + "queue": { + "title": "Offline Queue", + "description": "{{count}} action will be processed when you're back online", + "description_plural": "{{count}} actions will be processed when you're back online" + }, + "error": { + "paymentOffline": "Payment queued for when you're back online", + "generalOffline": "Action queued for when you're back online" + } + }, + "about": { + "title": "About Wata-Board", + "description": "Wata-Board is a decentralized utility payment platform built on the Stellar blockchain. We enable secure, transparent, and efficient utility bill payments using cryptocurrency.", + "features": { + "title": "Key Features", + "secure": "Secure Transactions", + "secureDescription": "Built on Stellar blockchain with enterprise-grade security", + "fast": "Fast Payments", + "fastDescription": "Near-instant settlement with low transaction fees", + "transparent": "Transparent Records", + "transparentDescription": "All transactions are recorded on the public blockchain", + "decentralized": "Decentralized", + "decentralizedDescription": "No single point of failure or control" + }, + "howItWorks": { + "title": "How It Works", + "step1": "Connect your wallet", + "step2": "Enter meter details", + "step3": "Confirm payment", + "step4": "Payment processed" + } + }, + "contact": { + "title": "Contact Us", + "description": "Get in touch with our team for support, questions, or feedback.", + "form": { + "name": "Name", + "namePlaceholder": "Enter your name", + "email": "Email", + "emailPlaceholder": "Enter your email", + "subject": "Subject", + "subjectPlaceholder": "Enter subject", + "message": "Message", + "messagePlaceholder": "Enter your message", + "sendButton": "Send Message", + "sending": "Sending..." + }, + "info": { + "email": "Email", + "support": "Support", + "website": "Website" + } + }, + "rate": { + "title": "Rate Your Experience", + "description": "Help us improve by rating your experience with Wata-Board.", + "rating": { + "excellent": "Excellent", + "good": "Good", + "average": "Average", + "poor": "Poor", + "terrible": "Terrible" + }, + "review": { + "title": "Write a Review", + "placeholder": "Share your experience with Wata-Board...", + "submit": "Submit Review", + "thankYou": "Thank you for your feedback!" + } + }, + "errors": { + "general": { + "title": "Error", + "unknown": "An unknown error occurred", + "tryAgain": "Please try again", + "contactSupport": "Contact support if the problem persists" + }, + "network": { + "title": "Network Error", + "description": "Unable to connect to the network", + "checkConnection": "Please check your internet connection" + }, + "wallet": { + "title": "Wallet Error", + "notConnected": "Wallet not connected", + "notInstalled": "Freighter wallet not installed", + "installFreighter": "Please install Freighter wallet extension" + } + }, + "accessibility": { + "skipToMain": "Skip to main content", + "skipToNavigation": "Skip to navigation", + "menuToggle": "Toggle navigation menu", + "closeMenu": "Close menu", + "openMenu": "Open menu", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "warning": "Warning", + "info": "Information" + }, + "common": { + "cancel": "Cancel", + "confirm": "Confirm", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "back": "Back", + "next": "Next", + "previous": "Previous", + "submit": "Submit", + "reset": "Reset", + "clear": "Clear", + "search": "Search", + "filter": "Filter", + "sort": "Sort", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "retry": "Retry", + "refresh": "Refresh", + "copy": "Copy", + "copied": "Copied!", + "learnMore": "Learn More", + "viewDetails": "View Details", + "hideDetails": "Hide Details" + }, + "time": { + "seconds": "second", + "seconds_plural": "seconds", + "minutes": "minute", + "minutes_plural": "minutes", + "hours": "hour", + "hours_plural": "hours", + "days": "day", + "days_plural": "days", + "weeks": "week", + "weeks_plural": "weeks", + "months": "month", + "months_plural": "months", + "years": "year", + "years_plural": "years", + "ago": "{{time}} ago", + "in": "in {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "This field is required", + "invalid": "Invalid format", + "tooShort": "Must be at least {{min}} characters", + "tooLong": "Must be no more than {{max}} characters", + "invalidEmail": "Please enter a valid email address", + "invalidNumber": "Please enter a valid number", + "minValue": "Must be at least {{min}}", + "maxValue": "Must be no more than {{max}}" + } +} diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json new file mode 100644 index 00000000..4649c7e2 --- /dev/null +++ b/src/i18n/locales/ru.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "Decentralized utility payments on Stellar blockchain", + "description": "Pay your utility bills using cryptocurrency on the Stellar network" + }, + "navigation": { + "home": "Pay Bill", + "about": "About", + "contact": "Contact", + "rate": "Rate Us", + "language": "Language" + }, + "payment": { + "form": { + "title": "Payment Information", + "meterNumber": "Meter number", + "meterPlaceholder": "e.g. METER-123", + "meterDescription": "Enter your utility meter number as shown on your bill", + "amount": "Amount", + "amountPlaceholder": "Whole number", + "amountDescription": "Enter the payment amount in whole XLM", + "payButton": "Pay bill", + "processing": "Processing...", + "rateLimited": "Rate Limited", + "requiresExtension": "Requires Freighter extension. 5 transactions per minute limit." + }, + "status": { + "title": "Status", + "ready": "Ready.", + "installWallet": "Please install Freighter Wallet extension!", + "enterMeter": "Please enter a meter number.", + "enterValidAmount": "Please enter a valid amount greater than 0.", + "wholeNumber": "Amount must be a whole number.", + "amountTooLarge": "Amount is too large.", + "insufficientBalance": "Insufficient balance. Please add more XLM to your wallet.", + "estimatingFees": "Estimating transaction fees... Please wait.", + "paymentSuccess": "Payment successful! Transaction ID: {{id}}...", + "paymentFailed": "Payment failed: {{error}}" + }, + "feeEstimation": { + "title": "Transaction Fee Estimation", + "calculating": "(Calculating...)", + "calculatingFees": "Calculating estimated fees...", + "paymentAmount": "Payment Amount", + "estimatedNetworkFee": "Estimated Network Fee", + "totalCost": "Total Cost", + "unableToEstimate": "Unable to estimate fees at this time" + }, + "rateLimit": { + "title": "Rate Limit Status", + "requestsAvailable": "{{count}}/5 requests available", + "rateLimited": "Rate limited. Reset in {{time}}", + "queue": "Queue: {{count}}" + } + }, + "wallet": { + "balance": { + "title": "Wallet Balance", + "available": "Available Balance", + "total": "Total Balance", + "loading": "Loading balance...", + "error": "Failed to load balance", + "reconnect": "Please reconnect your wallet", + "insufficient": "Insufficient balance for this transaction", + "lowBalance": "Low balance warning" + }, + "connection": { + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "connectWallet": "Connect Wallet", + "switchWallet": "Switch Wallet" + } + }, + "network": { + "mainnet": "MAINNET", + "testnet": "TESTNET", + "switchNetwork": "Switch Network", + "currentNetwork": "Current Network" + }, + "offline": { + "banner": { + "title": "You're offline", + "description": "Some features may be unavailable. Actions will be queued and processed when you're back online.", + "retry": "Retry Connection", + "details": "Connection Details" + }, + "status": { + "online": "Online", + "offline": "Offline", + "connecting": "Connecting...", + "queueStatus": "{{count}} queued action", + "queueStatus_plural": "{{count}} queued actions" + }, + "queue": { + "title": "Offline Queue", + "description": "{{count}} action will be processed when you're back online", + "description_plural": "{{count}} actions will be processed when you're back online" + }, + "error": { + "paymentOffline": "Payment queued for when you're back online", + "generalOffline": "Action queued for when you're back online" + } + }, + "about": { + "title": "About Wata-Board", + "description": "Wata-Board is a decentralized utility payment platform built on the Stellar blockchain. We enable secure, transparent, and efficient utility bill payments using cryptocurrency.", + "features": { + "title": "Key Features", + "secure": "Secure Transactions", + "secureDescription": "Built on Stellar blockchain with enterprise-grade security", + "fast": "Fast Payments", + "fastDescription": "Near-instant settlement with low transaction fees", + "transparent": "Transparent Records", + "transparentDescription": "All transactions are recorded on the public blockchain", + "decentralized": "Decentralized", + "decentralizedDescription": "No single point of failure or control" + }, + "howItWorks": { + "title": "How It Works", + "step1": "Connect your wallet", + "step2": "Enter meter details", + "step3": "Confirm payment", + "step4": "Payment processed" + } + }, + "contact": { + "title": "Contact Us", + "description": "Get in touch with our team for support, questions, or feedback.", + "form": { + "name": "Name", + "namePlaceholder": "Enter your name", + "email": "Email", + "emailPlaceholder": "Enter your email", + "subject": "Subject", + "subjectPlaceholder": "Enter subject", + "message": "Message", + "messagePlaceholder": "Enter your message", + "sendButton": "Send Message", + "sending": "Sending..." + }, + "info": { + "email": "Email", + "support": "Support", + "website": "Website" + } + }, + "rate": { + "title": "Rate Your Experience", + "description": "Help us improve by rating your experience with Wata-Board.", + "rating": { + "excellent": "Excellent", + "good": "Good", + "average": "Average", + "poor": "Poor", + "terrible": "Terrible" + }, + "review": { + "title": "Write a Review", + "placeholder": "Share your experience with Wata-Board...", + "submit": "Submit Review", + "thankYou": "Thank you for your feedback!" + } + }, + "errors": { + "general": { + "title": "Error", + "unknown": "An unknown error occurred", + "tryAgain": "Please try again", + "contactSupport": "Contact support if the problem persists" + }, + "network": { + "title": "Network Error", + "description": "Unable to connect to the network", + "checkConnection": "Please check your internet connection" + }, + "wallet": { + "title": "Wallet Error", + "notConnected": "Wallet not connected", + "notInstalled": "Freighter wallet not installed", + "installFreighter": "Please install Freighter wallet extension" + } + }, + "accessibility": { + "skipToMain": "Skip to main content", + "skipToNavigation": "Skip to navigation", + "menuToggle": "Toggle navigation menu", + "closeMenu": "Close menu", + "openMenu": "Open menu", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "warning": "Warning", + "info": "Information" + }, + "common": { + "cancel": "Cancel", + "confirm": "Confirm", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "back": "Back", + "next": "Next", + "previous": "Previous", + "submit": "Submit", + "reset": "Reset", + "clear": "Clear", + "search": "Search", + "filter": "Filter", + "sort": "Sort", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "retry": "Retry", + "refresh": "Refresh", + "copy": "Copy", + "copied": "Copied!", + "learnMore": "Learn More", + "viewDetails": "View Details", + "hideDetails": "Hide Details" + }, + "time": { + "seconds": "second", + "seconds_plural": "seconds", + "minutes": "minute", + "minutes_plural": "minutes", + "hours": "hour", + "hours_plural": "hours", + "days": "day", + "days_plural": "days", + "weeks": "week", + "weeks_plural": "weeks", + "months": "month", + "months_plural": "months", + "years": "year", + "years_plural": "years", + "ago": "{{time}} ago", + "in": "in {{time}}" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "This field is required", + "invalid": "Invalid format", + "tooShort": "Must be at least {{min}} characters", + "tooLong": "Must be no more than {{max}} characters", + "invalidEmail": "Please enter a valid email address", + "invalidNumber": "Please enter a valid number", + "minValue": "Must be at least {{min}}", + "maxValue": "Must be no more than {{max}}" + } +} diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json new file mode 100644 index 00000000..f79f8b5b --- /dev/null +++ b/src/i18n/locales/zh.json @@ -0,0 +1,257 @@ +{ + "app": { + "title": "Wata-Board", + "tagline": "基于Stellar区块链的去中心化公用事业支付", + "description": "在Stellar网络上使用加密货币支付您的公用事业账单" + }, + "navigation": { + "home": "支付账单", + "about": "关于我们", + "contact": "联系我们", + "rate": "评价我们", + "language": "语言" + }, + "payment": { + "form": { + "title": "支付信息", + "meterNumber": "电表编号", + "meterPlaceholder": "例如:METER-123", + "meterDescription": "请输入您账单上显示的电表编号", + "amount": "金额", + "amountPlaceholder": "整数", + "amountDescription": "请输入整数XLM的支付金额", + "payButton": "支付账单", + "processing": "处理中...", + "rateLimited": "达到限制", + "requiresExtension": "需要Freighter扩展。每分钟5笔交易限制。" + }, + "status": { + "title": "状态", + "ready": "准备就绪。", + "installWallet": "请安装Freighter钱包扩展!", + "enterMeter": "请输入电表编号。", + "enterValidAmount": "请输入大于0的有效金额。", + "wholeNumber": "金额必须是整数。", + "amountTooLarge": "金额太大。", + "insufficientBalance": "余额不足。请向您的钱包添加更多XLM。", + "estimatingFees": "估算交易费用中...请稍候。", + "paymentSuccess": "支付成功!交易ID:{{id}}...", + "paymentFailed": "支付失败:{{error}}" + }, + "feeEstimation": { + "title": "交易费用估算", + "calculating": "(计算中...)", + "calculatingFees": "计算估算费用中...", + "paymentAmount": "支付金额", + "estimatedNetworkFee": "估算网络费用", + "totalCost": "总成本", + "unableToEstimate": "目前无法估算费用" + }, + "rateLimit": { + "title": "速率限制状态", + "requestsAvailable": "{{count}}/5个可用请求", + "rateLimited": "达到限制。{{time}}后重置", + "queue": "队列:{{count}}" + } + }, + "wallet": { + "balance": { + "title": "钱包余额", + "available": "可用余额", + "total": "总余额", + "loading": "加载余额中...", + "error": "加载余额失败", + "reconnect": "请重新连接您的钱包", + "insufficient": "此交易余额不足", + "lowBalance": "低余额警告" + }, + "connection": { + "connected": "已连接", + "disconnected": "已断开", + "connecting": "连接中...", + "connectWallet": "连接钱包", + "switchWallet": "切换钱包" + } + }, + "network": { + "mainnet": "主网", + "testnet": "测试网", + "switchNetwork": "切换网络", + "currentNetwork": "当前网络" + }, + "offline": { + "banner": { + "title": "您处于离线状态", + "description": "某些功能可能不可用。操作将被排队并在您重新上线时处理。", + "retry": "重试连接", + "details": "连接详情" + }, + "status": { + "online": "在线", + "offline": "离线", + "connecting": "连接中...", + "queueStatus": "{{count}}个排队操作", + "queueStatus_plural": "{{count}}个排队操作" + }, + "queue": { + "title": "离线队列", + "description": "{{count}}个操作将在您重新上线时处理", + "description_plural": "{{count}}个操作将在您重新上线时处理" + }, + "error": { + "paymentOffline": "支付已排队,将在您重新上线时处理", + "generalOffline": "操作已排队,将在您重新上线时处理" + } + }, + "about": { + "title": "关于Wata-Board", + "description": "Wata-Board是一个基于Stellar区块链构建的去中心化公用事业支付平台。我们使用加密货币实现安全、透明和高效的公用事业账单支付。", + "features": { + "title": "主要功能", + "secure": "安全交易", + "secureDescription": "基于Stellar区块链构建,具有企业级安全性", + "fast": "快速支付", + "fastDescription": "近乎即时的结算,交易费用低", + "transparent": "透明记录", + "transparentDescription": "所有交易都记录在公共区块链上", + "decentralized": "去中心化", + "decentralizedDescription": "没有单点故障或控制" + }, + "howItWorks": { + "title": "工作原理", + "step1": "连接您的钱包", + "step2": "输入电表详情", + "step3": "确认支付", + "step4": "支付处理完成" + } + }, + "contact": { + "title": "联系我们", + "description": "联系我们的团队获取支持、问题或反馈。", + "form": { + "name": "姓名", + "namePlaceholder": "输入您的姓名", + "email": "电子邮件", + "emailPlaceholder": "输入您的电子邮件", + "subject": "主题", + "subjectPlaceholder": "输入主题", + "message": "消息", + "messagePlaceholder": "输入您的消息", + "sendButton": "发送消息", + "sending": "发送中..." + }, + "info": { + "email": "电子邮件", + "support": "支持", + "website": "网站" + } + }, + "rate": { + "title": "评价您的体验", + "description": "通过评价您使用Wata-Board的体验来帮助我们改进。", + "rating": { + "excellent": "优秀", + "good": "良好", + "average": "一般", + "poor": "较差", + "terrible": "很差" + }, + "review": { + "title": "写评论", + "placeholder": "分享您使用Wata-Board的体验...", + "submit": "提交评论", + "thankYou": "感谢您的反馈!" + } + }, + "errors": { + "general": { + "title": "错误", + "unknown": "发生未知错误", + "tryAgain": "请重试", + "contactSupport": "如果问题持续存在,请联系支持" + }, + "network": { + "title": "网络错误", + "description": "无法连接到网络", + "checkConnection": "请检查您的互联网连接" + }, + "wallet": { + "title": "钱包错误", + "notConnected": "钱包未连接", + "notInstalled": "未安装Freighter钱包", + "installFreighter": "请安装Freighter钱包扩展" + } + }, + "accessibility": { + "skipToMain": "跳转到主要内容", + "skipToNavigation": "跳转到导航", + "menuToggle": "切换导航菜单", + "closeMenu": "关闭菜单", + "openMenu": "打开菜单", + "loading": "加载中...", + "error": "错误", + "success": "成功", + "warning": "警告", + "info": "信息" + }, + "common": { + "cancel": "取消", + "confirm": "确认", + "save": "保存", + "delete": "删除", + "edit": "编辑", + "close": "关闭", + "back": "返回", + "next": "下一步", + "previous": "上一步", + "submit": "提交", + "reset": "重置", + "clear": "清除", + "search": "搜索", + "filter": "筛选", + "sort": "排序", + "loading": "加载中...", + "error": "错误", + "success": "成功", + "retry": "重试", + "refresh": "刷新", + "copy": "复制", + "copied": "已复制!", + "learnMore": "了解更多", + "viewDetails": "查看详情", + "hideDetails": "隐藏详情" + }, + "time": { + "seconds": "秒", + "seconds_plural": "秒", + "minutes": "分钟", + "minutes_plural": "分钟", + "hours": "小时", + "hours_plural": "小时", + "days": "天", + "days_plural": "天", + "weeks": "周", + "weeks_plural": "周", + "months": "月", + "months_plural": "月", + "years": "年", + "years_plural": "年", + "ago": "{{time}}前", + "in": "{{time}}后" + }, + "currency": { + "xlm": "XLM", + "usd": "USD", + "eur": "EUR" + }, + "validation": { + "required": "此字段为必填项", + "invalid": "格式无效", + "tooShort": "必须至少包含{{min}}个字符", + "tooLong": "不能超过{{max}}个字符", + "invalidEmail": "请输入有效的电子邮件地址", + "invalidNumber": "请输入有效数字", + "minValue": "必须至少为{{min}}", + "maxValue": "不能超过{{max}}" + } +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index d57b81a3..acf94fc3 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -5,6 +5,7 @@ import { useEffect, useState } from "react"; import { AuthProvider } from "@/contexts/AuthContext"; import { ThemeProvider } from "@/contexts/ThemeContext"; import { NotificationProvider } from "@/contexts/NotificationContext"; +import { I18nProvider } from "@/i18n"; import { usePWA } from "@/hooks/usePWA"; import { PWAInstallPrompt, @@ -59,6 +60,7 @@ export default function App({ Component, pageProps }: AppProps) { }, []); return ( + @@ -71,6 +73,7 @@ export default function App({ Component, pageProps }: AppProps) { + ); }