Ignore:
Timestamp:
01/30/26 01:40:27 (8 months ago)
Author:
Stefan-Saveski <stefansaveski19@…>
Branches:
master
Children:
ba52069
Parents:
298f9b3
Message:

Added dual language feature.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/components/exams.tsx

    r298f9b3 r50f2fb4  
    11"use client"
    22import { useEffect, useMemo, useState } from 'react';
     3import { useTranslation } from 'react-i18next';
    34import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
    45import { faSort, faSortUp, faSortDown } from '@fortawesome/free-solid-svg-icons';
     
    3334
    3435const Exams = () => {
     36  const { t } = useTranslation();
    3537  const [sortField, setSortField] = useState<'grade' | 'date' | null>(null);
    3638  const [sortOrder, setSortOrder] = useState<'asc' | 'desc' | null>(null);
     
    185187    return (
    186188      <div className="bg-white rounded-lg shadow-sm p-6">
    187         Loading...
     189        {t('loading', 'Loading...')}
    188190      </div>
    189191    );
     
    194196      <div className="bg-white rounded-lg shadow-sm p-6">
    195197        <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700">
    196           {errorMessage}
     198          {t('failed_to_load_exams', errorMessage)}
    197199        </div>
    198200      </div>
     
    208210          <div className="text-center">
    209211            <div className="text-3xl font-bold text-gray-900">{stats.average}</div>
    210             <div className="text-sm text-gray-500 mt-1">Просек</div>
     212            <div className="text-sm text-gray-500 mt-1">{t('average', 'Просек')}</div>
    211213          </div>
    212214
     
    217219              <span className="text-lg text-gray-400">/{stats.credits.total}</span>
    218220            </div>
    219             <div className="text-sm text-gray-500 mt-1">Кредити</div>
     221            <div className="text-sm text-gray-500 mt-1">{t('credits', 'Кредити')}</div>
    220222          </div>
    221223
     
    223225          <div className="text-center">
    224226            <div className="text-3xl font-bold text-gray-900">{stats.passed}</div>
    225             <div className="text-sm text-gray-500 mt-1">Положени</div>
     227            <div className="text-sm text-gray-500 mt-1">{t('passed', 'Положени')}</div>
    226228          </div>
    227229
     
    229231          <div className="text-center">
    230232            <div className="text-3xl font-bold text-gray-900">{stats.remaining}</div>
    231             <div className="text-sm text-gray-500 mt-1">Останато</div>
     233            <div className="text-sm text-gray-500 mt-1">{t('remaining', 'Останато')}</div>
    232234          </div>
    233235        </div>
    234        
     236
    235237        {/* Progress Bar spanning entire statistics section */}
    236238        <div className="w-full bg-gray-200 rounded-full h-2">
    237           <div 
     239          <div
    238240            className="bg-blue-500 h-2 rounded-full transition-all duration-300"
    239241            style={{ width: `${creditsPercentage}%` }}
     
    244246      {/* Exams Table */}
    245247      <div>
    246         <h3 className="text-xl font-semibold text-gray-900 mb-4">Испити</h3>
    247        
     248        <h3 className="text-xl font-semibold text-gray-900 mb-4">{t('exams', 'Испити')}</h3>
     249
    248250        <div className="overflow-x-auto">
    249251          <table className="min-w-full">
     
    251253              <tr className="border-b border-gray-200">
    252254                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">#</th>
    253                 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">Предмет</th>
    254                 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">Семестар</th>
    255                 <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">Кредити</th>
     255                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">{t('subject', 'Предмет')}</th>
     256                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">{t('semester', 'Семестар')}</th>
     257                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">{t('credits', 'Кредити')}</th>
    256258                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">
    257                   <button 
     259                  <button
    258260                    onClick={handleSortByDate}
    259261                    className="flex items-center gap-2 px-2 py-1 rounded-md hover:bg-gray-100 hover:text-gray-900 transition-all duration-200 transform hover:scale-105"
    260262                  >
    261                     Датум
    262                     <FontAwesomeIcon 
    263                       icon={getSortIcon('date')} 
     263                    {t('date', 'Датум')}
     264                    <FontAwesomeIcon
     265                      icon={getSortIcon('date')}
    264266                      className={`text-xs transition-colors duration-200 ${
    265267                        sortField === 'date' ? 'text-blue-600' : 'text-gray-400 group-hover:text-gray-600'
     
    269271                </th>
    270272                <th className="text-left py-3 px-4 text-sm font-medium text-gray-500">
    271                   <button 
     273                  <button
    272274                    onClick={handleSortByGrade}
    273275                    className="flex items-center gap-2 px-2 py-1 rounded-md hover:bg-gray-100 hover:text-gray-900 transition-all duration-200 transform hover:scale-105"
    274276                  >
    275                     Оценка
    276                     <FontAwesomeIcon 
    277                       icon={getSortIcon('grade')} 
     277                    {t('grade', 'Оценка')}
     278                    <FontAwesomeIcon
     279                      icon={getSortIcon('grade')}
    278280                      className={`text-xs transition-colors duration-200 ${
    279281                        sortField === 'grade' ? 'text-blue-600' : 'text-gray-400 group-hover:text-gray-600'
Note: See TracChangeset for help on using the changeset viewer.