feat: complete i18n support for all components (6 languages)

Add full internationalization across 127+ components and pages.
790+ translation keys in en, tr, kmr, ckb, ar, fa locales.
Remove duplicate keys and delete unused .json locale files.
This commit is contained in:
2026-02-22 04:48:20 +03:00
parent 5b26cc8907
commit 4f683538d3
129 changed files with 22442 additions and 4186 deletions
+26 -24
View File
@@ -1,7 +1,9 @@
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Gift, Calendar, Users, Timer, DollarSign } from 'lucide-react';
const RewardDistribution: React.FC = () => {
const { t } = useTranslation();
const [currentEpoch, setCurrentEpoch] = useState(1);
const [trustScoreInput, setTrustScoreInput] = useState(500);
const [totalParticipants, setTotalParticipants] = useState(1000);
@@ -15,9 +17,9 @@ const RewardDistribution: React.FC = () => {
const nftRewardPerHolder = parliamentaryAllocation / 201;
const epochPhases = [
{ name: 'Active', duration: '30 days', blocks: 432000, status: 'current' },
{ name: 'Claim Period', duration: '7 days', blocks: 100800, status: 'upcoming' },
{ name: 'Closed', duration: 'Permanent', blocks: 0, status: 'final' }
{ name: t('rewardDist.active'), duration: '30 days', blocks: 432000, status: 'current' },
{ name: t('rewardDist.claimPeriod'), duration: '7 days', blocks: 100800, status: 'upcoming' },
{ name: t('rewardDist.closed'), duration: t('rewardDist.permanent'), blocks: 0, status: 'final' }
];
return (
@@ -25,10 +27,10 @@ const RewardDistribution: React.FC = () => {
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-12">
<h2 className="text-4xl font-bold mb-4 bg-gradient-to-r from-purple-400 to-cyan-400 bg-clip-text text-transparent">
Reward Distribution System
{t('rewardDist.title')}
</h2>
<p className="text-gray-400 text-lg max-w-2xl mx-auto">
Monthly epoch-based rewards distributed by trust score and NFT holdings
{t('rewardDist.subtitle')}
</p>
</div>
@@ -45,12 +47,12 @@ const RewardDistribution: React.FC = () => {
<div className="lg:col-span-2 bg-gray-900/50 backdrop-blur-sm rounded-xl border border-gray-800 p-6">
<div className="flex items-center mb-6">
<Calendar className="w-6 h-6 text-purple-400 mr-3" />
<h3 className="text-xl font-semibold text-white">Epoch Timeline</h3>
<h3 className="text-xl font-semibold text-white">{t('rewardDist.epochTimeline')}</h3>
</div>
<div className="mb-6">
<div className="flex items-center justify-between mb-2">
<span className="text-gray-400">Current Epoch</span>
<span className="text-gray-400">{t('rewardDist.currentEpoch')}</span>
<span className="text-2xl font-bold text-white">#{currentEpoch}</span>
</div>
<input
@@ -97,13 +99,13 @@ const RewardDistribution: React.FC = () => {
<div className="mt-6 grid grid-cols-2 gap-4">
<div className="p-4 bg-gray-900/50 rounded-lg">
<div className="text-gray-400 text-sm mb-1">Epoch Start Block</div>
<div className="text-gray-400 text-sm mb-1">{t('rewardDist.epochStartBlock')}</div>
<div className="text-white font-semibold">
#{((currentEpoch - 1) * 432000).toLocaleString()}
</div>
</div>
<div className="p-4 bg-gray-900/50 rounded-lg">
<div className="text-gray-400 text-sm mb-1">Claim Deadline Block</div>
<div className="text-gray-400 text-sm mb-1">{t('rewardDist.claimDeadline')}</div>
<div className="text-cyan-400 font-semibold">
#{((currentEpoch * 432000) + 100800).toLocaleString()}
</div>
@@ -116,7 +118,7 @@ const RewardDistribution: React.FC = () => {
<div className="bg-gray-900/50 backdrop-blur-sm rounded-xl border border-gray-800 p-6">
<div className="flex items-center mb-4">
<Gift className="w-6 h-6 text-cyan-400 mr-3" />
<h3 className="text-lg font-semibold text-white">Epoch Pool</h3>
<h3 className="text-lg font-semibold text-white">{t('rewardDist.epochPool')}</h3>
</div>
<div className="text-3xl font-bold text-white mb-4">
@@ -125,11 +127,11 @@ const RewardDistribution: React.FC = () => {
<div className="space-y-3">
<div className="flex justify-between p-3 bg-gray-800/50 rounded-lg">
<span className="text-gray-400">Trust Score Pool</span>
<span className="text-gray-400">{t('rewardDist.trustScorePool')}</span>
<span className="text-cyan-400 font-semibold">90%</span>
</div>
<div className="flex justify-between p-3 bg-gray-800/50 rounded-lg">
<span className="text-gray-400">Parliamentary NFTs</span>
<span className="text-gray-400">{t('rewardDist.parliamentaryNfts')}</span>
<span className="text-purple-400 font-semibold">10%</span>
</div>
</div>
@@ -138,23 +140,23 @@ const RewardDistribution: React.FC = () => {
<div className="bg-gray-900/50 backdrop-blur-sm rounded-xl border border-gray-800 p-6">
<div className="flex items-center mb-4">
<Users className="w-6 h-6 text-purple-400 mr-3" />
<h3 className="text-lg font-semibold text-white">NFT Rewards</h3>
<h3 className="text-lg font-semibold text-white">{t('rewardDist.nftRewards')}</h3>
</div>
<div className="space-y-3">
<div className="flex justify-between">
<span className="text-gray-400">Total NFTs</span>
<span className="text-gray-400">{t('rewardDist.totalNfts')}</span>
<span className="text-white">201</span>
</div>
<div className="flex justify-between">
<span className="text-gray-400">Per NFT Reward</span>
<span className="text-gray-400">{t('rewardDist.perNftReward')}</span>
<span className="text-purple-400 font-semibold">
{Math.floor(nftRewardPerHolder).toLocaleString()} PEZ
</span>
</div>
<div className="p-3 bg-kurdish-red/20 rounded-lg border border-kurdish-red/30">
<div className="text-xs text-purple-400 mb-1">Auto-distributed</div>
<div className="text-sm text-gray-300">No claim required</div>
<div className="text-xs text-purple-400 mb-1">{t('rewardDist.autoDistributed')}</div>
<div className="text-sm text-gray-300">{t('rewardDist.noClaimRequired')}</div>
</div>
</div>
</div>
@@ -165,12 +167,12 @@ const RewardDistribution: React.FC = () => {
<div className="mt-8 bg-gradient-to-br from-purple-900/20 to-cyan-900/20 backdrop-blur-sm rounded-xl border border-purple-500/30 p-6">
<h3 className="text-xl font-semibold text-white mb-6 flex items-center">
<DollarSign className="w-6 h-6 text-cyan-400 mr-3" />
Reward Calculator
{t('rewardDist.rewardCalculator')}
</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div>
<label className="text-gray-400 text-sm block mb-2">Your Trust Score</label>
<label className="text-gray-400 text-sm block mb-2">{t('rewardDist.yourTrustScore')}</label>
<input
type="number"
value={trustScoreInput}
@@ -180,7 +182,7 @@ const RewardDistribution: React.FC = () => {
</div>
<div>
<label className="text-gray-400 text-sm block mb-2">Total Participants</label>
<label className="text-gray-400 text-sm block mb-2">{t('rewardDist.totalParticipants')}</label>
<input
type="number"
value={totalParticipants}
@@ -190,7 +192,7 @@ const RewardDistribution: React.FC = () => {
</div>
<div>
<label className="text-gray-400 text-sm block mb-2">Total Trust Score</label>
<label className="text-gray-400 text-sm block mb-2">{t('rewardDist.totalTrustScore')}</label>
<input
type="number"
value={totalTrustScore}
@@ -203,19 +205,19 @@ const RewardDistribution: React.FC = () => {
<div className="mt-6 p-4 bg-gray-900/50 rounded-lg">
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<div className="text-center">
<div className="text-gray-400 text-sm mb-1">Reward per Trust Point</div>
<div className="text-gray-400 text-sm mb-1">{t('rewardDist.rewardPerPoint')}</div>
<div className="text-xl font-semibold text-cyan-400">
{rewardPerTrustPoint.toFixed(4)} PEZ
</div>
</div>
<div className="text-center">
<div className="text-gray-400 text-sm mb-1">Your Share</div>
<div className="text-gray-400 text-sm mb-1">{t('rewardDist.yourShare')}</div>
<div className="text-xl font-semibold text-purple-400">
{((trustScoreInput / totalTrustScore) * 100).toFixed(3)}%
</div>
</div>
<div className="text-center">
<div className="text-gray-400 text-sm mb-1">Estimated Reward</div>
<div className="text-gray-400 text-sm mb-1">{t('rewardDist.estimatedReward')}</div>
<div className="text-2xl font-bold bg-gradient-to-r from-purple-400 to-cyan-400 bg-clip-text text-transparent">
{Math.floor(userReward).toLocaleString()} PEZ
</div>