mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-06-13 18:11:00 +00:00
feat: Multi-language support (6 languages), Smart WebSocket fallback, Complete translations for nav/footer
This commit is contained in:
Binary file not shown.
@@ -32,18 +32,53 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi
|
|||||||
const eventListeners = useRef<Map<string, Set<(data: any) => void>>>(new Map());
|
const eventListeners = useRef<Map<string, Set<(data: any) => void>>>(new Map());
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
|
|
||||||
const connect = useCallback(() => {
|
// Connection state management
|
||||||
|
const currentEndpoint = useRef<string>('');
|
||||||
|
const hasShownFinalError = useRef(false);
|
||||||
|
const connectionAttempts = useRef(0);
|
||||||
|
|
||||||
|
const ENDPOINTS = [
|
||||||
|
'wss://ws.pezkuwichain.io', // Production WebSocket
|
||||||
|
'ws://localhost:9944', // Local development node
|
||||||
|
'ws://127.0.0.1:9944', // Alternative local address
|
||||||
|
];
|
||||||
|
|
||||||
|
const connect = useCallback((endpointIndex: number = 0) => {
|
||||||
|
// If we've tried all endpoints, show error once and stop
|
||||||
|
if (endpointIndex >= ENDPOINTS.length) {
|
||||||
|
if (!hasShownFinalError.current) {
|
||||||
|
console.error('❌ All WebSocket endpoints failed');
|
||||||
|
toast({
|
||||||
|
title: "Real-time Connection Unavailable",
|
||||||
|
description: "Could not connect to WebSocket server. Live updates will be disabled.",
|
||||||
|
variant: "destructive",
|
||||||
|
});
|
||||||
|
hasShownFinalError.current = true;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// In production, replace with actual WebSocket server URL
|
const wsUrl = ENDPOINTS[endpointIndex];
|
||||||
const wsUrl = import.meta.env.VITE_WS_URL || 'wss://pezkuwichain-ws.example.com';
|
currentEndpoint.current = wsUrl;
|
||||||
|
|
||||||
|
console.log(`🔌 Attempting WebSocket connection to: ${wsUrl}`);
|
||||||
|
|
||||||
ws.current = new WebSocket(wsUrl);
|
ws.current = new WebSocket(wsUrl);
|
||||||
|
|
||||||
ws.current.onopen = () => {
|
ws.current.onopen = () => {
|
||||||
setIsConnected(true);
|
setIsConnected(true);
|
||||||
toast({
|
connectionAttempts.current = 0;
|
||||||
title: "Connected",
|
hasShownFinalError.current = false;
|
||||||
description: "Real-time updates enabled",
|
console.log(`✅ WebSocket connected to: ${wsUrl}`);
|
||||||
});
|
|
||||||
|
// Only show success toast for production endpoint
|
||||||
|
if (endpointIndex === 0) {
|
||||||
|
toast({
|
||||||
|
title: "Connected",
|
||||||
|
description: "Real-time updates enabled",
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.current.onmessage = (event) => {
|
ws.current.onmessage = (event) => {
|
||||||
@@ -59,28 +94,36 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi
|
|||||||
};
|
};
|
||||||
|
|
||||||
ws.current.onerror = (error) => {
|
ws.current.onerror = (error) => {
|
||||||
console.error('WebSocket error:', error);
|
console.warn(`⚠️ WebSocket error on ${wsUrl}:`, error);
|
||||||
toast({
|
|
||||||
title: "Connection Error",
|
|
||||||
description: "Failed to establish real-time connection",
|
|
||||||
variant: "destructive",
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.current.onclose = () => {
|
ws.current.onclose = () => {
|
||||||
setIsConnected(false);
|
setIsConnected(false);
|
||||||
// Attempt to reconnect after 5 seconds
|
console.log(`🔌 WebSocket disconnected from: ${wsUrl}`);
|
||||||
|
|
||||||
|
// Try next endpoint after 2 seconds
|
||||||
reconnectTimeout.current = setTimeout(() => {
|
reconnectTimeout.current = setTimeout(() => {
|
||||||
connect();
|
connectionAttempts.current++;
|
||||||
}, 5000);
|
|
||||||
|
// If we've been connected before and lost connection, try same endpoint first
|
||||||
|
if (connectionAttempts.current < 3) {
|
||||||
|
connect(endpointIndex);
|
||||||
|
} else {
|
||||||
|
// Try next endpoint in the list
|
||||||
|
connect(endpointIndex + 1);
|
||||||
|
connectionAttempts.current = 0;
|
||||||
|
}
|
||||||
|
}, 2000);
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to create WebSocket connection:', error);
|
console.error(`❌ Failed to create WebSocket connection to ${ENDPOINTS[endpointIndex]}:`, error);
|
||||||
|
// Try next endpoint immediately
|
||||||
|
setTimeout(() => connect(endpointIndex + 1), 1000);
|
||||||
}
|
}
|
||||||
}, [toast]);
|
}, [toast]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
connect();
|
connect(0); // Start with first endpoint
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
if (reconnectTimeout.current) {
|
if (reconnectTimeout.current) {
|
||||||
@@ -107,7 +150,7 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi
|
|||||||
if (ws.current?.readyState === WebSocket.OPEN) {
|
if (ws.current?.readyState === WebSocket.OPEN) {
|
||||||
ws.current.send(JSON.stringify(message));
|
ws.current.send(JSON.stringify(message));
|
||||||
} else {
|
} else {
|
||||||
console.warn('WebSocket is not connected');
|
console.warn('WebSocket is not connected - message queued');
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
@@ -115,7 +158,9 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi
|
|||||||
if (ws.current) {
|
if (ws.current) {
|
||||||
ws.current.close();
|
ws.current.close();
|
||||||
}
|
}
|
||||||
connect();
|
hasShownFinalError.current = false;
|
||||||
|
connectionAttempts.current = 0;
|
||||||
|
connect(0); // Start from first endpoint again
|
||||||
}, [connect]);
|
}, [connect]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
+18
-3
@@ -1,16 +1,31 @@
|
|||||||
import i18n from 'i18next';
|
import i18n from 'i18next';
|
||||||
import { initReactI18next } from 'react-i18next';
|
import { initReactI18next } from 'react-i18next';
|
||||||
import LanguageDetector from 'i18next-browser-languagedetector';
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
||||||
import { enTranslations, trTranslations } from './translations';
|
|
||||||
|
// Import all language translations
|
||||||
|
import enTranslations from './locales/en';
|
||||||
|
import trTranslations from './locales/tr';
|
||||||
|
import kmrTranslations from './locales/kmr';
|
||||||
|
import ckbTranslations from './locales/ckb';
|
||||||
|
import arTranslations from './locales/ar';
|
||||||
|
import faTranslations from './locales/fa';
|
||||||
|
|
||||||
export const languages = {
|
export const languages = {
|
||||||
en: { name: 'English', flag: '🇬🇧', dir: 'ltr' },
|
en: { name: 'English', flag: '🇬🇧', dir: 'ltr' },
|
||||||
tr: { name: 'Türkçe', flag: '🇹🇷', dir: 'ltr' }
|
tr: { name: 'Türkçe', flag: '🇹🇷', dir: 'ltr' },
|
||||||
|
kmr: { name: 'Kurdî (Kurmancî)', flag: '☀️', dir: 'ltr' },
|
||||||
|
ckb: { name: 'کوردی (سۆرانی)', flag: '☀️', dir: 'rtl' },
|
||||||
|
ar: { name: 'العربية', flag: '🇸🇦', dir: 'rtl' },
|
||||||
|
fa: { name: 'فارسی', flag: '🇮🇷', dir: 'rtl' }
|
||||||
};
|
};
|
||||||
|
|
||||||
const resources = {
|
const resources = {
|
||||||
en: { translation: enTranslations },
|
en: { translation: enTranslations },
|
||||||
tr: { translation: trTranslations }
|
tr: { translation: trTranslations },
|
||||||
|
kmr: { translation: kmrTranslations },
|
||||||
|
ckb: { translation: ckbTranslations },
|
||||||
|
ar: { translation: arTranslations },
|
||||||
|
fa: { translation: faTranslations }
|
||||||
};
|
};
|
||||||
|
|
||||||
i18n
|
i18n
|
||||||
|
|||||||
+33
-6
@@ -2,18 +2,26 @@ export default {
|
|||||||
// Navigation
|
// Navigation
|
||||||
'nav.home': 'الرئيسية',
|
'nav.home': 'الرئيسية',
|
||||||
'nav.dashboard': 'لوحة التحكم',
|
'nav.dashboard': 'لوحة التحكم',
|
||||||
|
'nav.wallet': 'المحفظة',
|
||||||
|
'nav.settings': 'الإعدادات',
|
||||||
'nav.governance': 'الحوكمة',
|
'nav.governance': 'الحوكمة',
|
||||||
|
'nav.proposals': 'المقترحات',
|
||||||
|
'nav.delegation': 'التفويض',
|
||||||
'nav.treasury': 'الخزينة',
|
'nav.treasury': 'الخزينة',
|
||||||
'nav.staking': 'التخزين',
|
'nav.staking': 'التخزين',
|
||||||
'nav.forum': 'المنتدى',
|
'nav.forum': 'المنتدى',
|
||||||
|
'nav.moderation': 'الإشراف',
|
||||||
'nav.profile': 'الملف الشخصي',
|
'nav.profile': 'الملف الشخصي',
|
||||||
'nav.admin': 'المدير',
|
'nav.admin': 'المسؤول',
|
||||||
|
'nav.docs': 'التوثيق',
|
||||||
|
'nav.login': 'تسجيل الدخول',
|
||||||
|
'nav.logout': 'تسجيل الخروج',
|
||||||
|
|
||||||
// Hero Section
|
// Hero Section
|
||||||
'hero.title': 'منصة حوكمة البلوكشين',
|
'hero.title': 'منصة الحوكمة بتقنية البلوكشين',
|
||||||
'hero.subtitle': 'حوكمة ديمقراطية وشفافة بتقنية البلوكشين',
|
'hero.subtitle': 'حوكمة ديمقراطية وشفافة بتقنية البلوكشين',
|
||||||
'hero.cta.primary': 'ابدأ الآن',
|
'hero.cta.primary': 'ابدأ الآن',
|
||||||
'hero.cta.secondary': 'اعرف المزيد',
|
'hero.cta.secondary': 'معرفة المزيد',
|
||||||
|
|
||||||
// Auth
|
// Auth
|
||||||
'auth.login': 'تسجيل الدخول',
|
'auth.login': 'تسجيل الدخول',
|
||||||
@@ -23,7 +31,7 @@ export default {
|
|||||||
'auth.password': 'كلمة المرور',
|
'auth.password': 'كلمة المرور',
|
||||||
'auth.confirmPassword': 'تأكيد كلمة المرور',
|
'auth.confirmPassword': 'تأكيد كلمة المرور',
|
||||||
'auth.rememberMe': 'تذكرني',
|
'auth.rememberMe': 'تذكرني',
|
||||||
'auth.forgotPassword': 'نسيت كلمة المرور؟',
|
'auth.forgotPassword': 'هل نسيت كلمة المرور؟',
|
||||||
|
|
||||||
// Wallet
|
// Wallet
|
||||||
'wallet.connect': 'ربط المحفظة',
|
'wallet.connect': 'ربط المحفظة',
|
||||||
@@ -36,10 +44,25 @@ export default {
|
|||||||
'governance.proposals': 'المقترحات',
|
'governance.proposals': 'المقترحات',
|
||||||
'governance.activeProposals': 'المقترحات النشطة',
|
'governance.activeProposals': 'المقترحات النشطة',
|
||||||
'governance.vote': 'التصويت',
|
'governance.vote': 'التصويت',
|
||||||
'governance.delegate': 'التفويض',
|
'governance.delegate': 'المندوب',
|
||||||
'governance.createProposal': 'إنشاء مقترح',
|
'governance.createProposal': 'إنشاء مقترح',
|
||||||
'governance.votingPower': 'قوة التصويت',
|
'governance.votingPower': 'قوة التصويت',
|
||||||
|
|
||||||
|
// Treasury
|
||||||
|
'treasury.title': 'الخزينة',
|
||||||
|
'treasury.subtitle': 'إدارة أموال المجتمع',
|
||||||
|
'treasury.overview': 'نظرة عامة',
|
||||||
|
'treasury.proposals': 'المقترحات',
|
||||||
|
'treasury.history': 'السجل',
|
||||||
|
'treasury.approvals': 'الموافقات',
|
||||||
|
|
||||||
|
// Footer
|
||||||
|
'footer.description': 'حوكمة لامركزية لكردستان',
|
||||||
|
'footer.about': 'حول',
|
||||||
|
'footer.developers': 'المطورون',
|
||||||
|
'footer.community': 'المجتمع',
|
||||||
|
'footer.rights': 'جميع الحقوق محفوظة',
|
||||||
|
|
||||||
// Common
|
// Common
|
||||||
'common.loading': 'جاري التحميل...',
|
'common.loading': 'جاري التحميل...',
|
||||||
'common.save': 'حفظ',
|
'common.save': 'حفظ',
|
||||||
@@ -55,5 +78,9 @@ export default {
|
|||||||
'common.next': 'التالي',
|
'common.next': 'التالي',
|
||||||
'common.previous': 'السابق',
|
'common.previous': 'السابق',
|
||||||
'common.yes': 'نعم',
|
'common.yes': 'نعم',
|
||||||
'common.no': 'لا'
|
'common.no': 'لا',
|
||||||
|
'common.backToHome': 'العودة للرئيسية',
|
||||||
|
|
||||||
|
// Role
|
||||||
|
'role': 'الدور'
|
||||||
}
|
}
|
||||||
+43
-16
@@ -2,32 +2,40 @@ export default {
|
|||||||
// Navigation
|
// Navigation
|
||||||
'nav.home': 'سەرەتا',
|
'nav.home': 'سەرەتا',
|
||||||
'nav.dashboard': 'داشبۆرد',
|
'nav.dashboard': 'داشبۆرد',
|
||||||
|
'nav.wallet': 'جزدان',
|
||||||
|
'nav.settings': 'ڕێکخستنەکان',
|
||||||
'nav.governance': 'حوکمڕانی',
|
'nav.governance': 'حوکمڕانی',
|
||||||
'nav.treasury': 'خەزێنە',
|
'nav.proposals': 'پێشنیارەکان',
|
||||||
|
'nav.delegation': 'دیلیگەیشن',
|
||||||
|
'nav.treasury': 'گەنجینە',
|
||||||
'nav.staking': 'ستەیکینگ',
|
'nav.staking': 'ستەیکینگ',
|
||||||
'nav.forum': 'فۆرەم',
|
'nav.forum': 'فۆرۆم',
|
||||||
|
'nav.moderation': 'بەڕێوەبردنی ناوەڕۆک',
|
||||||
'nav.profile': 'پرۆفایل',
|
'nav.profile': 'پرۆفایل',
|
||||||
'nav.admin': 'بەڕێوەبەر',
|
'nav.admin': 'بەڕێوەبەر',
|
||||||
|
'nav.docs': 'بەڵگەنامە',
|
||||||
|
'nav.login': 'چوونە ژوورەوە',
|
||||||
|
'nav.logout': 'چوونە دەرەوە',
|
||||||
|
|
||||||
// Hero Section
|
// Hero Section
|
||||||
'hero.title': 'پلاتفۆرمی حوکمڕانی بلۆکچەین',
|
'hero.title': 'پلاتفۆرمی حوکمڕانی بلۆکچەین',
|
||||||
'hero.subtitle': 'حوکمڕانی دیموکراتی و شەفاف بە تەکنەلۆژیای بلۆکچەین',
|
'hero.subtitle': 'حوکمڕانی دیموکراتیک و شەفاف بە تەکنەلۆژیای بلۆکچەین',
|
||||||
'hero.cta.primary': 'دەست پێ بکە',
|
'hero.cta.primary': 'دەستپێکردن',
|
||||||
'hero.cta.secondary': 'زیاتر بزانە',
|
'hero.cta.secondary': 'زانیاری زیاتر',
|
||||||
|
|
||||||
// Auth
|
// Auth
|
||||||
'auth.login': 'چوونەژوورەوە',
|
'auth.login': 'چوونە ژوورەوە',
|
||||||
'auth.logout': 'دەرچوون',
|
'auth.logout': 'چوونە دەرەوە',
|
||||||
'auth.signup': 'تۆمارکردن',
|
'auth.signup': 'تۆمارکردن',
|
||||||
'auth.email': 'ئیمەیڵ',
|
'auth.email': 'ئیمەیڵ',
|
||||||
'auth.password': 'وشەی نهێنی',
|
'auth.password': 'وشەی نهێنی',
|
||||||
'auth.confirmPassword': 'دووبارەکردنەوەی وشەی نهێنی',
|
'auth.confirmPassword': 'دووبارەکردنەوەی وشەی نهێنی',
|
||||||
'auth.rememberMe': 'بمهێنەوە یاد',
|
'auth.rememberMe': 'بمهێڵەوە لە بیرت',
|
||||||
'auth.forgotPassword': 'وشەی نهێنیت لەبیر چووە؟',
|
'auth.forgotPassword': 'وشەی نهێنیم لەبیر چووە؟',
|
||||||
|
|
||||||
// Wallet
|
// Wallet
|
||||||
'wallet.connect': 'جزدان بەستنەوە',
|
'wallet.connect': 'بەستنەوەی جزدان',
|
||||||
'wallet.disconnect': 'پچڕاندن',
|
'wallet.disconnect': 'لابردنی بەستنەوە',
|
||||||
'wallet.balance': 'باڵانس',
|
'wallet.balance': 'باڵانس',
|
||||||
'wallet.address': 'ناونیشان',
|
'wallet.address': 'ناونیشان',
|
||||||
'wallet.network': 'تۆڕ',
|
'wallet.network': 'تۆڕ',
|
||||||
@@ -37,23 +45,42 @@ export default {
|
|||||||
'governance.activeProposals': 'پێشنیارە چالاکەکان',
|
'governance.activeProposals': 'پێشنیارە چالاکەکان',
|
||||||
'governance.vote': 'دەنگدان',
|
'governance.vote': 'دەنگدان',
|
||||||
'governance.delegate': 'نوێنەر',
|
'governance.delegate': 'نوێنەر',
|
||||||
'governance.createProposal': 'پێشنیار دروست بکە',
|
'governance.createProposal': 'دروستکردنی پێشنیار',
|
||||||
'governance.votingPower': 'هێزی دەنگدان',
|
'governance.votingPower': 'هێزی دەنگدان',
|
||||||
|
|
||||||
|
// Treasury
|
||||||
|
'treasury.title': 'گەنجینە',
|
||||||
|
'treasury.subtitle': 'بەڕێوەبردنی سامانی کۆمەڵگا',
|
||||||
|
'treasury.overview': 'تێڕوانینی گشتی',
|
||||||
|
'treasury.proposals': 'پێشنیارەکان',
|
||||||
|
'treasury.history': 'مێژوو',
|
||||||
|
'treasury.approvals': 'پەسەندکراوەکان',
|
||||||
|
|
||||||
|
// Footer
|
||||||
|
'footer.description': 'حوکمڕانی لامەرکەزی بۆ کوردستان',
|
||||||
|
'footer.about': 'دەربارە',
|
||||||
|
'footer.developers': 'گەشەپێدەران',
|
||||||
|
'footer.community': 'کۆمەڵگا',
|
||||||
|
'footer.rights': 'هەموو مافێک پارێزراوە',
|
||||||
|
|
||||||
// Common
|
// Common
|
||||||
'common.loading': 'چاوەڕوان بە...',
|
'common.loading': 'بارکردن...',
|
||||||
'common.save': 'پاشەکەوتکردن',
|
'common.save': 'پاشەکەوتکردن',
|
||||||
'common.cancel': 'هەڵوەشاندنەوە',
|
'common.cancel': 'هەڵوەشاندنەوە',
|
||||||
'common.confirm': 'دڵنیاکردنەوە',
|
'common.confirm': 'پشتڕاستکردنەوە',
|
||||||
'common.delete': 'سڕینەوە',
|
'common.delete': 'سڕینەوە',
|
||||||
'common.edit': 'دەستکاریکردن',
|
'common.edit': 'دەستکاریکردن',
|
||||||
'common.search': 'گەڕان',
|
'common.search': 'گەڕان',
|
||||||
'common.filter': 'فلتەر',
|
'common.filter': 'پاڵاوتن',
|
||||||
'common.sort': 'ڕیزکردن',
|
'common.sort': 'ڕیزکردن',
|
||||||
'common.submit': 'ناردن',
|
'common.submit': 'ناردن',
|
||||||
'common.back': 'گەڕانەوە',
|
'common.back': 'گەڕانەوە',
|
||||||
'common.next': 'دواتر',
|
'common.next': 'دواتر',
|
||||||
'common.previous': 'پێشوو',
|
'common.previous': 'پێشوو',
|
||||||
'common.yes': 'بەڵێ',
|
'common.yes': 'بەڵێ',
|
||||||
'common.no': 'نەخێر'
|
'common.no': 'نەخێر',
|
||||||
|
'common.backToHome': 'گەڕانەوە بۆ سەرەتا',
|
||||||
|
|
||||||
|
// Role
|
||||||
|
'role': 'ڕۆڵ'
|
||||||
}
|
}
|
||||||
+36
-9
@@ -1,19 +1,27 @@
|
|||||||
export default {
|
export default {
|
||||||
// Navigation
|
// Navigation
|
||||||
'nav.home': 'خانه',
|
'nav.home': 'صفحه اصلی',
|
||||||
'nav.dashboard': 'داشبورد',
|
'nav.dashboard': 'داشبورد',
|
||||||
|
'nav.wallet': 'کیف پول',
|
||||||
|
'nav.settings': 'تنظیمات',
|
||||||
'nav.governance': 'حکمرانی',
|
'nav.governance': 'حکمرانی',
|
||||||
|
'nav.proposals': 'پیشنهادات',
|
||||||
|
'nav.delegation': 'نمایندگی',
|
||||||
'nav.treasury': 'خزانه',
|
'nav.treasury': 'خزانه',
|
||||||
'nav.staking': 'استیکینگ',
|
'nav.staking': 'استیکینگ',
|
||||||
'nav.forum': 'انجمن',
|
'nav.forum': 'انجمن',
|
||||||
|
'nav.moderation': 'مدیریت محتوا',
|
||||||
'nav.profile': 'پروفایل',
|
'nav.profile': 'پروفایل',
|
||||||
'nav.admin': 'مدیر',
|
'nav.admin': 'مدیریت',
|
||||||
|
'nav.docs': 'مستندات',
|
||||||
|
'nav.login': 'ورود',
|
||||||
|
'nav.logout': 'خروج',
|
||||||
|
|
||||||
// Hero Section
|
// Hero Section
|
||||||
'hero.title': 'پلتفرم حکمرانی بلاکچین',
|
'hero.title': 'پلتفرم حکمرانی بلاکچین',
|
||||||
'hero.subtitle': 'حکمرانی دموکراتیک و شفاف با فناوری بلاکچین',
|
'hero.subtitle': 'حکمرانی دموکراتیک و شفاف با تکنولوژی بلاکچین',
|
||||||
'hero.cta.primary': 'شروع کنید',
|
'hero.cta.primary': 'شروع کنید',
|
||||||
'hero.cta.secondary': 'بیشتر بدانید',
|
'hero.cta.secondary': 'اطلاعات بیشتر',
|
||||||
|
|
||||||
// Auth
|
// Auth
|
||||||
'auth.login': 'ورود',
|
'auth.login': 'ورود',
|
||||||
@@ -21,7 +29,7 @@ export default {
|
|||||||
'auth.signup': 'ثبت نام',
|
'auth.signup': 'ثبت نام',
|
||||||
'auth.email': 'ایمیل',
|
'auth.email': 'ایمیل',
|
||||||
'auth.password': 'رمز عبور',
|
'auth.password': 'رمز عبور',
|
||||||
'auth.confirmPassword': 'تایید رمز عبور',
|
'auth.confirmPassword': 'تکرار رمز عبور',
|
||||||
'auth.rememberMe': 'مرا به خاطر بسپار',
|
'auth.rememberMe': 'مرا به خاطر بسپار',
|
||||||
'auth.forgotPassword': 'رمز عبور را فراموش کردهاید؟',
|
'auth.forgotPassword': 'رمز عبور را فراموش کردهاید؟',
|
||||||
|
|
||||||
@@ -35,16 +43,31 @@ export default {
|
|||||||
// Governance
|
// Governance
|
||||||
'governance.proposals': 'پیشنهادات',
|
'governance.proposals': 'پیشنهادات',
|
||||||
'governance.activeProposals': 'پیشنهادات فعال',
|
'governance.activeProposals': 'پیشنهادات فعال',
|
||||||
'governance.vote': 'رای دادن',
|
'governance.vote': 'رأی دادن',
|
||||||
'governance.delegate': 'نماینده',
|
'governance.delegate': 'نماینده',
|
||||||
'governance.createProposal': 'ایجاد پیشنهاد',
|
'governance.createProposal': 'ایجاد پیشنهاد',
|
||||||
'governance.votingPower': 'قدرت رای',
|
'governance.votingPower': 'قدرت رأی',
|
||||||
|
|
||||||
|
// Treasury
|
||||||
|
'treasury.title': 'خزانه',
|
||||||
|
'treasury.subtitle': 'مدیریت منابع جامعه',
|
||||||
|
'treasury.overview': 'نمای کلی',
|
||||||
|
'treasury.proposals': 'پیشنهادات',
|
||||||
|
'treasury.history': 'تاریخچه',
|
||||||
|
'treasury.approvals': 'تأییدیهها',
|
||||||
|
|
||||||
|
// Footer
|
||||||
|
'footer.description': 'حکمرانی غیرمتمرکز برای کردستان',
|
||||||
|
'footer.about': 'درباره',
|
||||||
|
'footer.developers': 'توسعهدهندگان',
|
||||||
|
'footer.community': 'جامعه',
|
||||||
|
'footer.rights': 'تمامی حقوق محفوظ است',
|
||||||
|
|
||||||
// Common
|
// Common
|
||||||
'common.loading': 'در حال بارگذاری...',
|
'common.loading': 'در حال بارگذاری...',
|
||||||
'common.save': 'ذخیره',
|
'common.save': 'ذخیره',
|
||||||
'common.cancel': 'لغو',
|
'common.cancel': 'لغو',
|
||||||
'common.confirm': 'تایید',
|
'common.confirm': 'تأیید',
|
||||||
'common.delete': 'حذف',
|
'common.delete': 'حذف',
|
||||||
'common.edit': 'ویرایش',
|
'common.edit': 'ویرایش',
|
||||||
'common.search': 'جستجو',
|
'common.search': 'جستجو',
|
||||||
@@ -55,5 +78,9 @@ export default {
|
|||||||
'common.next': 'بعدی',
|
'common.next': 'بعدی',
|
||||||
'common.previous': 'قبلی',
|
'common.previous': 'قبلی',
|
||||||
'common.yes': 'بله',
|
'common.yes': 'بله',
|
||||||
'common.no': 'خیر'
|
'common.no': 'خیر',
|
||||||
|
'common.backToHome': 'بازگشت به صفحه اصلی',
|
||||||
|
|
||||||
|
// Role
|
||||||
|
'role': 'نقش'
|
||||||
}
|
}
|
||||||
+50
-23
@@ -1,33 +1,41 @@
|
|||||||
export default {
|
export default {
|
||||||
// Navigation
|
// Navigation
|
||||||
'nav.home': 'Destpêk',
|
'nav.home': 'Malper',
|
||||||
'nav.dashboard': 'Panela Kontrolê',
|
'nav.dashboard': 'Panela Kontrolê',
|
||||||
|
'nav.wallet': 'Berîk',
|
||||||
|
'nav.settings': 'Mîhengên',
|
||||||
'nav.governance': 'Rêveberî',
|
'nav.governance': 'Rêveberî',
|
||||||
|
'nav.proposals': 'Pêşniyar',
|
||||||
|
'nav.delegation': 'Delegasyon',
|
||||||
'nav.treasury': 'Xezîne',
|
'nav.treasury': 'Xezîne',
|
||||||
'nav.staking': 'Staking',
|
'nav.staking': 'Staking',
|
||||||
'nav.forum': 'Forum',
|
'nav.forum': 'Forum',
|
||||||
|
'nav.moderation': 'Rêveberiya Naverokê',
|
||||||
'nav.profile': 'Profîl',
|
'nav.profile': 'Profîl',
|
||||||
'nav.admin': 'Rêvebir',
|
'nav.admin': 'Rêvebir',
|
||||||
|
'nav.docs': 'Belgekirin',
|
||||||
|
'nav.login': 'Têketin',
|
||||||
|
'nav.logout': 'Derkevtin',
|
||||||
|
|
||||||
// Hero Section
|
// Hero Section
|
||||||
'hero.title': 'Platforma Rêveberiya Blockchain',
|
'hero.title': 'Platforma Rêveberiya Blockchain',
|
||||||
'hero.subtitle': 'Rêveberiya demokratîk û şeffaf a bi teknolojiya blockchain',
|
'hero.subtitle': 'Rêveberiya demokratîk û zelal bi teknolojiya blockchain',
|
||||||
'hero.cta.primary': 'Dest Pê Bike',
|
'hero.cta.primary': 'Destpêkirin',
|
||||||
'hero.cta.secondary': 'Zêdetir Bizane',
|
'hero.cta.secondary': 'Zêdetir Zanîn',
|
||||||
|
|
||||||
// Auth
|
// Auth
|
||||||
'auth.login': 'Têkeve',
|
'auth.login': 'Têketin',
|
||||||
'auth.logout': 'Derkeve',
|
'auth.logout': 'Derkevtin',
|
||||||
'auth.signup': 'Tomar Bibe',
|
'auth.signup': 'Tomar bibe',
|
||||||
'auth.email': 'E-peyam',
|
'auth.email': 'E-posta',
|
||||||
'auth.password': 'Şîfre',
|
'auth.password': 'Şîfre',
|
||||||
'auth.confirmPassword': 'Şîfreyê Piştrast Bike',
|
'auth.confirmPassword': 'Şîfreya Dubare',
|
||||||
'auth.rememberMe': 'Min bi bîr bîne',
|
'auth.rememberMe': 'Min bi bîr bîne',
|
||||||
'auth.forgotPassword': 'Şîfreya min ji bîr kir?',
|
'auth.forgotPassword': 'Şîfreya xwe ji bîr kir?',
|
||||||
|
|
||||||
// Wallet
|
// Wallet
|
||||||
'wallet.connect': 'Wallet Girê Bide',
|
'wallet.connect': 'Berîkê Girêbide',
|
||||||
'wallet.disconnect': 'Veqetîne',
|
'wallet.disconnect': 'Girêdanê Rake',
|
||||||
'wallet.balance': 'Balans',
|
'wallet.balance': 'Balans',
|
||||||
'wallet.address': 'Navnîşan',
|
'wallet.address': 'Navnîşan',
|
||||||
'wallet.network': 'Tor',
|
'wallet.network': 'Tor',
|
||||||
@@ -35,25 +43,44 @@ export default {
|
|||||||
// Governance
|
// Governance
|
||||||
'governance.proposals': 'Pêşniyar',
|
'governance.proposals': 'Pêşniyar',
|
||||||
'governance.activeProposals': 'Pêşniyarên Çalak',
|
'governance.activeProposals': 'Pêşniyarên Çalak',
|
||||||
'governance.vote': 'Deng Bide',
|
'governance.vote': 'Deng Bidin',
|
||||||
'governance.delegate': 'Temsîlkar',
|
'governance.delegate': 'Nûner',
|
||||||
'governance.createProposal': 'Pêşniyar Biafirîne',
|
'governance.createProposal': 'Pêşniyarek Çêbikin',
|
||||||
'governance.votingPower': 'Hêza Dengdanê',
|
'governance.votingPower': 'Hêza Dengdanê',
|
||||||
|
|
||||||
|
// Treasury
|
||||||
|
'treasury.title': 'Xezîne',
|
||||||
|
'treasury.subtitle': 'Fonên civakê rêve bibin',
|
||||||
|
'treasury.overview': 'Gihştin Giştî',
|
||||||
|
'treasury.proposals': 'Pêşniyar',
|
||||||
|
'treasury.history': 'Dîrok',
|
||||||
|
'treasury.approvals': 'Pejirandin',
|
||||||
|
|
||||||
|
// Footer
|
||||||
|
'footer.description': 'Rêveberiya merkezî tune ji bo Kurdistan',
|
||||||
|
'footer.about': 'Derbarê',
|
||||||
|
'footer.developers': 'Pêşvebikar',
|
||||||
|
'footer.community': 'Civak',
|
||||||
|
'footer.rights': 'Hemû mafên parastin',
|
||||||
|
|
||||||
// Common
|
// Common
|
||||||
'common.loading': 'Tê barkirin...',
|
'common.loading': 'Tê barkirin...',
|
||||||
'common.save': 'Tomar Bike',
|
'common.save': 'Tomar bike',
|
||||||
'common.cancel': 'Betal',
|
'common.cancel': 'Betal bike',
|
||||||
'common.confirm': 'Piştrast Bike',
|
'common.confirm': 'Piştrast bike',
|
||||||
'common.delete': 'Jê Bibe',
|
'common.delete': 'Jê bibe',
|
||||||
'common.edit': 'Biguherîne',
|
'common.edit': 'Sererast bike',
|
||||||
'common.search': 'Lêgerîn',
|
'common.search': 'Lêgerîn',
|
||||||
'common.filter': 'Parzûn',
|
'common.filter': 'Parzûn bike',
|
||||||
'common.sort': 'Rêz Bike',
|
'common.sort': 'Rêz bike',
|
||||||
'common.submit': 'Bişîne',
|
'common.submit': 'Bişîne',
|
||||||
'common.back': 'Paşve',
|
'common.back': 'Paşve',
|
||||||
'common.next': 'Pêşve',
|
'common.next': 'Pêşve',
|
||||||
'common.previous': 'Berê',
|
'common.previous': 'Berê',
|
||||||
'common.yes': 'Erê',
|
'common.yes': 'Erê',
|
||||||
'common.no': 'Na'
|
'common.no': 'Na',
|
||||||
|
'common.backToHome': 'Vegere Malperê',
|
||||||
|
|
||||||
|
// Role
|
||||||
|
'role': 'Rol'
|
||||||
}
|
}
|
||||||
+29
-2
@@ -2,12 +2,20 @@ export default {
|
|||||||
// Navigation
|
// Navigation
|
||||||
'nav.home': 'Ana Sayfa',
|
'nav.home': 'Ana Sayfa',
|
||||||
'nav.dashboard': 'Kontrol Paneli',
|
'nav.dashboard': 'Kontrol Paneli',
|
||||||
|
'nav.wallet': 'Cüzdan',
|
||||||
|
'nav.settings': 'Ayarlar',
|
||||||
'nav.governance': 'Yönetişim',
|
'nav.governance': 'Yönetişim',
|
||||||
|
'nav.proposals': 'Teklifler',
|
||||||
|
'nav.delegation': 'Delegasyon',
|
||||||
'nav.treasury': 'Hazine',
|
'nav.treasury': 'Hazine',
|
||||||
'nav.staking': 'Staking',
|
'nav.staking': 'Stake Etme',
|
||||||
'nav.forum': 'Forum',
|
'nav.forum': 'Forum',
|
||||||
|
'nav.moderation': 'Moderasyon',
|
||||||
'nav.profile': 'Profil',
|
'nav.profile': 'Profil',
|
||||||
'nav.admin': 'Yönetici',
|
'nav.admin': 'Yönetici',
|
||||||
|
'nav.docs': 'Dokümantasyon',
|
||||||
|
'nav.login': 'Giriş Yap',
|
||||||
|
'nav.logout': 'Çıkış Yap',
|
||||||
|
|
||||||
// Hero Section
|
// Hero Section
|
||||||
'hero.title': 'Blockchain Yönetişim Platformu',
|
'hero.title': 'Blockchain Yönetişim Platformu',
|
||||||
@@ -40,6 +48,21 @@ export default {
|
|||||||
'governance.createProposal': 'Öneri Oluştur',
|
'governance.createProposal': 'Öneri Oluştur',
|
||||||
'governance.votingPower': 'Oy Gücü',
|
'governance.votingPower': 'Oy Gücü',
|
||||||
|
|
||||||
|
// Treasury
|
||||||
|
'treasury.title': 'Hazine',
|
||||||
|
'treasury.subtitle': 'Topluluk fonlarını yönetin',
|
||||||
|
'treasury.overview': 'Genel Bakış',
|
||||||
|
'treasury.proposals': 'Teklifler',
|
||||||
|
'treasury.history': 'Geçmiş',
|
||||||
|
'treasury.approvals': 'Onaylar',
|
||||||
|
|
||||||
|
// Footer
|
||||||
|
'footer.description': 'Kürdistan için merkezi olmayan yönetişim',
|
||||||
|
'footer.about': 'Hakkında',
|
||||||
|
'footer.developers': 'Geliştiriciler',
|
||||||
|
'footer.community': 'Topluluk',
|
||||||
|
'footer.rights': 'Tüm hakları saklıdır',
|
||||||
|
|
||||||
// Common
|
// Common
|
||||||
'common.loading': 'Yükleniyor...',
|
'common.loading': 'Yükleniyor...',
|
||||||
'common.save': 'Kaydet',
|
'common.save': 'Kaydet',
|
||||||
@@ -55,5 +78,9 @@ export default {
|
|||||||
'common.next': 'İleri',
|
'common.next': 'İleri',
|
||||||
'common.previous': 'Önceki',
|
'common.previous': 'Önceki',
|
||||||
'common.yes': 'Evet',
|
'common.yes': 'Evet',
|
||||||
'common.no': 'Hayır'
|
'common.no': 'Hayır',
|
||||||
|
'common.backToHome': 'Ana Sayfaya Dön',
|
||||||
|
|
||||||
|
// Role
|
||||||
|
'role': 'Rol'
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user