diff --git a/public/locales/ba/translation.json b/public/locales/ba/translation.json index f2e6899..3cef3ec 100644 --- a/public/locales/ba/translation.json +++ b/public/locales/ba/translation.json @@ -171,5 +171,100 @@ "common.chat": "Razgovori", "common.languages": "Jezici", "common.pasteTranslations" : "Zalijepi prijevod", - "common.translationJsonHint" : "Dodajte tekst u JSON formatu" + + "common.translationJsonHint" : "Dodajte tekst u JSON formatu" , + "common.totalAds": "Ukupno oglasa", + "analytics.storePerformance": "Učinkovitost prodavnice", + "analytics.revenueAndProfitAnalysis": "Analiza prihoda i profita", + "analytics.totalRevenue": "Ukupan prihod", + "analytics.fromAllAdvertisingSources": "Iz svih oglasnih izvora", + "analytics.clickRevenue": "Prihod od klikova", + "analytics.fromClicks": "Od {{count}} klikova", + "analytics.viewRevenue": "Prihod od pregleda", + "analytics.fromViews": "Od {{count}} pregleda", + "analytics.fromConversions": "Od {{count}} konverzija", + "analytics.revenueBySourceOverTime": "Prihod po izvoru kroz vrijeme", + "analytics.revenueDistribution": "Distribucija prihoda", + "analytics.totalEarnedProfitFromAds": "Ukupan zarađeni profit od oglasa", + "common.unknownProduct": "Nepoznat proizvod", + "analytics.detailedAnalyticsFor": "Detaljna analitika za {{storeName}}", + "analytics.unknownStore": "Nepoznata prodavnica", + "analytics.storeEarningsPastMonth": "Zarada prodavnice (prošli mjesec)", + "analytics.noProductsToDisplay": "Nema proizvoda za prikaz ili se još učitavaju...", + "analytics.noStoresToDisplay": "Nema prodavnica za prikaz ili se još učitavaju...", + "analytics.conversionsRevenue": "Prihod od konverzija", + "analytics.dashboardAnalytics": "Analitika kontrolne table", + "analytics.paretoChart": "Pareto dijagram", + "analytics.dealsAmount": "Iznos ponuda", + "analytics.deals": "Ponude", + "analytics.storeRevenue": "Prihod prodavnice", + "analytics.adminProfit": "Profit administratora", + "analytics.taxRate": "Poreska stopa (%)", + "analytics.topRated": "Najbolje ocijenjeno", + "analytics.lowestRated": "Najniže ocijenjeno", + "analytics.topStores": "Najbolje prodavnice", + "analytics.topProducts": "Najbolji proizvodi", + "analytics.topCategories": "Najbolje kategorije", + "analytics.topUsers": "Najbolji korisnici", + "analytics.topProductsByAdRevenue": "Najbolji proizvodi po prihodu od oglasa", + "common.noPendingUsersFound": "Nema korisnika na čekanju.", + "analytics.picture": "Slika", + "analytics.pendingUsers": "Korisnici na čekanju", + "analytics.pendingRequests": "Zahtjevi na čekanju", + "analytics.pendingRequestsTitle": "Zahtjevi na čekanju", + "analytics.pendingRequestsDescription": "Zahtjevi na čekanju su zahtjevi koji čekaju obradu od strane administratora.", + "analytics.pendingUsersTitle": "Korisnici na čekanju", + "analytics.pendingUsersDescription": "Korisnici na čekanju su korisnici koji čekaju odobrenje administratora.", + "analytics.latestAdUpdate": "Zadnje ažuriranje oglasa", + "analytics.latestView": "Zadnji pregled", + "analytics.latestClick": "Zadnji klik", + "analytics.latestConversion": "Zadnja konverzija", + "analytics.history": "Historija", + "analytics.views": "Pregledi", + "common.clicks": "Klikovi", + "analytics.active": "Aktivan", + "analytics.status": "Status", + "analytics.conversionPrice": "Cijena konverzije", + "analytics.storeName": "Naziv prodavnice", + "analytics.comparedToLastMonth": "U poređenju s prošlim mjesecom", + "analytics.comparedToLastYear": "U poređenju s prošlom godinom", + "analytics.comparedToPreviousMonth": "U poređenju s prethodnim mjesecom", + "analytics.comparedToPreviousYear": "U poređenju s prethodnom godinom", + "analytics.comparedToNextMonth": "U poređenju sa sljedećim mjesecom", + "analytics.comparedToNextYear": "U poređenju sa sljedećom godinom", + "common.picture": "Slika", + "common.details": "Detalji", + "common.addItem": "Dodaj stavku", + "common.adText": "Tekst oglasa", + "common.product": "Proizvod", + "common.username": "Korisničko ime", + "common.store": "Prodavnica", + "common.deliveryAddress": "Adresa dostave", + "common.deliveryStatus": "Status dostave", + "common.deliveryDate": "Datum dostave", + "common.deliveryTime": "Vrijeme dostave", + "common.deliveryPrice": "Cijena dostave", + "common.active": "Aktivan", + "common.inactive": "Neaktivan", + "common.saveAd": "Spasi oglas", + "common.viewPrice": "Cijena pregleda", + "common.clickPrice": "Cijena klika", + "common.conversionPrice": "Cijena konverzije", + "common.storeName": "Naziv prodavnice", + "common.storeId": "ID prodavnice", + "common.displayingPage": "Prikaz stranice", + "common.tax": "Porez", + "common.totalMonthlyIncome": "Ukupan mjesečni prihod", + "common.taxedMonthlyIncome": "Oporezovani mjesečni prihod", + "common.addProduct": "Dodaj proizvod", + "common.products": "Proizvodi", + "common.tickets": "Tiketi", + "common.searchTickets": "Pretraži tikete...", + "common.noTicketsFound": "Nijedan tiket nije pronađen.", + "common.ticket": "Tiket", + "common.views": "Pregledi", + "common.productCategory": "Kategorija proizvoda", + "common.storeCategory": "Kategorija prodavnice", + "common.orderNumber": "Broj narudžbe", + "common.created": "Kreirano" } diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 0e83bf6..5602b58 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -209,5 +209,82 @@ "analytics.unknownStore": "Unknown Store", "analytics.storeEarningsPastMonth": "Store Earnings (Past Month)", "analytics.noProductsToDisplay": "No products to display or still loading...", - "analytics.noStoresToDisplay": "No stores to display or still loading..." + + "analytics.noStoresToDisplay": "No stores to display or still loading...", + "analytics.conversionsRevenue": "Conversions Revenue", + "analytics.dashboardAnalytics": "Dashboard Analytics", + "analytics.paretoChart": "Pareto Chart", + "analytics.dealsAmount": "Deals amount", + "analytics.deals": "Deals", + "analytics.storeRevenue": "Store Revenue", + "analytics.adminProfit": "Admin Profit", + "analytics.taxRate": "Tax Rate (%)", + "analytics.topRated": "Top Rated", + "analytics.lowestRated": "Lowest Rated", + "analytics.topStores": "Top Stores", + "analytics.topProducts": "Top Products", + "analytics.topCategories": "Top Categories", + "analytics.topUsers": "Top Users", + "analytics.topProductsByAdRevenue": "Top Products by Ad Revenue", + "common.noPendingUsersFound": "No pending users found.", + "analytics.picture": "Picture", + "analytics.pendingUsers": "Pending Users", + "analytics.pendingRequests": "Pending Requests", + "analytics.pendingRequestsTitle": "Pending Requests", + "analytics.pendingRequestsDescription": "Pending requests are requests that are waiting to be processed by the administrator.", + "analytics.pendingUsersTitle": "Pending Users", + "analytics.pendingUsersDescription": "Pending users are users that are waiting to be approved by the administrator.", + "analytics.latestAdUpdate": "Latest Ad Update", + "analytics.latestView": "Latest View", + "analytics.latestClick": "Latest Click", + "analytics.latestConversion": "Latest Conversion", + "analytics.history": "History", + "analytics.views": "Views", + "common.clicks": "Clicks", + "analytics.active": "Active", + "analytics.status": "Status", + "analytics.conversionPrice": "Conversion Price", + "analytics.storeName": "Store Name", + "analytics.comparedToLastMonth": "Compared to last month", + "analytics.comparedToLastYear": "Compared to last year", + "analytics.comparedToPreviousMonth": "Compared to previous month", + "analytics.comparedToPreviousYear": "Compared to previous year", + "analytics.comparedToNextMonth": "Compared to next month", + "analytics.comparedToNextYear": "Compared to next year", + "common.picture": "Picture", + "common.details": "Details", + "common.addItem": "Add Item", + "common.adText": "Ad Text", + "common.product": "Product", + "common.username": "Username", + "common.store": "Store", + "common.deliveryAddress": "Delivery Address", + "common.deliveryStatus": "Delivery Status", + "common.deliveryDate": "Delivery Date", + "common.deliveryTime": "Delivery Time", + "common.deliveryPrice": "Delivery Price", + "common.active": "Active", + "common.inactive": "Inactive", + "common.saveAd": "Save Ad", + "common.viewPrice": "View Price", + "common.clickPrice": "Click Price", + "common.conversionPrice": "Conversion Price", + "common.storeName": "Store Name", + "common.storeId": "Store ID", + "common.displayingPage": "Displaying Page", + "common.tax": "Tax", + "common.totalMonthlyIncome": "Total Monthly Income", + "common.taxedMonthlyIncome": "Taxed Monthly Income", + "common.addProduct": "Add Product", + "common.products": "Products", + "common.tickets": "Tickets", + "common.searchTickets": "Search tickets...", + "common.noTicketsFound": "No tickets found.", + "common.ticket": "Ticket", + "common.views": "Views", + "common.productCategory": "Product Category", + "common.storeCategory": "Store Category", + "common.orderNumber": "Order Number", + "common.created": "Created" + } \ No newline at end of file diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 263dd5a..ea4951c 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -1,150 +1,289 @@ { - "ads.adsManagement": "Gestión de anuncios", - "ads.adminPanel": "Panel de administración", - "ads.advertisements": "Anuncios", - "ads.createAd": "Crear anuncio", - "ads.searchAds": "Buscar anuncios", - "categories.categories": "Categorías", - "categories.addCategory": "Agregar categoría", - "categories.searchCategory": "Buscar categoría", - "common.searchPlaceholder": "Buscar...", - "common.welcome": "Bienvenido", - "common.orders": "Pedidos", - "common.status": "Estado", - "common.all": "Todos", - "common.searchOrders": "Buscar pedidos", - "common.loginToContinue": "Inicia sesión para continuar", - "common.login": "Iniciar sesión", - "common.requests": "Solicitudes", - "common.searchUser": "Buscar usuario", - "common.addToCart": "Añadir al carrito", - "common.viewDetails": "Ver detalles", - "common.price": "Precio", - "common.quantity": "Cantidad", - "common.subtotal": "Subtotal", - "common.total": "Total", - "common.checkout": "Pagar", - "common.continueShopping": "Seguir comprando", - "common.save": "Guardar", - "common.cancel": "Cancelar", - "common.oops": "¡Ups! Algo salió mal.", - "common.loading": "Cargando...", - "common.adminPanel": "Panel de administración", - "common.first": "Primera", - "common.last": "Última", - "common.confirm": "Confirmar", - "common.delete": "Eliminar", - "common.edit": "Editar", - "common.view": "Ver", - "common.close": "Cerrar", - "common.done": "Hecho", - "common.browseFiles": "Explorar archivos", - "common.dragFilesToUpload": "Arrastra archivos para subir", - "common.or": "o", - "common.maxFileSize": "Tamaño máximo de archivo: 50MB — Formatos soportados: JPG, PNG, GIF, SVG, WEBP", - "common.languageManagement": "Gestión de idiomas", - "common.currentLanguage": "Idioma actual", - "common.languageCode": "Código del idioma", - "common.languageName": "Nombre del idioma", - "common.actions": "Acciones", - "common.addLanguage": "Agregar idioma", - "common.editLanguage": "Editar idioma", - "common.deleteLanguage": "Eliminar idioma", - "common.availableLanguages": "Idiomas disponibles", - "common.addNewLanguage": "Agregar nuevo idioma", - "common.saveLanguage": "Guardar idioma", - "common.translations": "Traducciones", - "common.allRoutes": "Todas las rutas", - "common.routes": "Rutas", - "common.createRoute": "Crear ruta", - "chat.openTicketToViewChat": "Abre este ticket para ver el chat.", - "roles.Buyer": "Comprador", - "roles.Seller": "Vendedor", - "roles.Admin": "Administrador", - "roles.Unknown": "Rol desconocido", - "nav.analytics": "Analítica", - "nav.users": "Usuarios", - "nav.requests": "Solicitudes", - "nav.stores": "Tiendas", - "nav.categories": "Categorías", - "nav.orders": "Pedidos", - "nav.advertisements": "Anuncios", - "nav.chat": "Chat", - "nav.routes": "Rutas", - "nav.languages": "Idiomas", - "usersPage.username": "Nombre de usuario", - "usersPage.email": "Correo electrónico", - "usersPage.role": "Rol", - "usersPage.active": "Activo", - "usersPage.actions": "Acciones", - "usersPage.addUser": "Agregar usuario", - "usersPage.searchUser": "Buscar usuario", - "usersPage.title": "Gestión de usuarios", - "usersPage.phoneNumber": "Número de teléfono", - "usersPage.saveChanges": "Guardar cambios", - "usersPage.deleteUser": "Eliminar usuario", - "usersPage.confirmDeleteUser": "¿Estás seguro de que deseas eliminar este usuario?", - "usersPage.noUsers": "No hay usuarios disponibles", - "usersPage.loadingUsers": "Cargando usuarios...", - "analytics.dashboardTitle": "Panel de analítica", - "analytics.totalAds": "Total de anuncios", - "analytics.totalViews": "Total de vistas", - "analytics.totalClicks": "Total de clics", - "analytics.totalConversions": "Total de conversiones", - "analytics.conversionRevenue": "Ingresos por conversiones", - "analytics.clicksRevenue": "Ingresos por clics", - "analytics.viewsRevenue": "Ingresos por vistas", - "analytics.totalProducts": "Total de productos", - "analytics.productPerformance": "Rendimiento de productos", - "analytics.noProducts": "No hay productos para mostrar o aún se están cargando...", - "analytics.storeEarnings": "Ganancias de la tienda (último mes)", - "analytics.realtimeEvents": "Eventos en tiempo real", - "analytics.noEvents": "Aún no se han recibido eventos", - "analytics.lastError": "Último error", - "sellerAnalytics.totalEarnings": "Ganancias totales", - "sellerAnalytics.sellerProfit": "Ganancias del vendedor", - "sellerAnalytics.clickRevenue": "Ingresos por clics", - "sellerAnalytics.viewRevenue": "Ingresos por vistas", - "sellerAnalytics.conversionRevenue": "Ingresos por conversiones", - "sellerAnalytics.clickRevenueOverTime": "Ingresos por clics a lo largo del tiempo", - "sellerAnalytics.viewRevenueOverTime": "Ingresos por vistas a lo largo del tiempo", - "sellerAnalytics.conversionRevenueOverTime": "Ingresos por conversiones a lo largo del tiempo", - "routes.availableRoutes": "Rutas disponibles", - "routes.noRoutes": "No hay rutas disponibles", - "routes.loadingMap": "Cargando mapa para la ruta ID: {{id}}...", - "routes.selectRoute": "Selecciona una ruta de la lista para verla en el mapa", - "routes.routeDetails": "Detalles de la ruta", - "routes.directions": "Direcciones", - "routes.routeId": "ID de ruta: {{id}}", - "ads.adType": "Tipo de anuncio", - "ads.triggers": "Disparadores", - "ads.startTime": "Hora de inicio", - "ads.endTime": "Hora de finalización", - "ads.isActive": "Activo", - "ads.advertisementItems": "Elementos del anuncio", - "ads.conversionPrice": "Precio por conversión", - "ads.storeName": "Nombre de la tienda", - "ads.address": "Dirección", - "ads.description": "Descripción", - "ads.place": "Lugar", - "ads.category": "Categoría", - "auth.login": "Iniciar sesión", - "auth.logout": "Cerrar sesión", - "auth.email": "Correo electrónico", - "auth.password": "Contraseña", - "auth.forgotPassword": "¿Olvidaste tu contraseña?", - "auth.signIn": "Iniciar sesión", - "auth.signUp": "Registrarse", - "auth.rememberMe": "Recuérdame", - "common.administrator": "Administrador", - "common.logout": "Cerrar sesión", - "common.analytics": "Analíticas", - "common.users": "Usuarios", - "common.stores": "Tiendas", - "common.categories": "Categorías", - "common.advertisements": "Anuncios", - "common.chat": "Chat", - "common.languages": "Idiomas" - - } - \ No newline at end of file + + "ads.adsManagement": "Ads Management", + "ads.adminPanel": "Admin Panel", + "ads.advertisements": "Advertisements", + "ads.createAd": "Create Ad", + "ads.searchAds": "Search Ads", + "categories.categories": "Categories", + "categories.addCategory": "Add Category", + "categories.searchCategory": "Search Category", + "common.searchPlaceholder": "Search...", + "common.welcome": "Welcome", + "common.orders": "Orders", + "common.status": "Status", + "common.all": "All", + "common.searchOrders": "Search Orders", + "common.loginToContinue": "Login to continue", + "common.login": "Login", + "common.requests": "Requests", + "common.searchUser": "Search User", + "common.addToCart": "Add to Cart", + "common.viewDetails": "View Details", + "common.price": "Price", + "common.quantity": "Quantity", + "common.subtotal": "Subtotal", + "common.total": "Total", + "common.checkout": "Checkout", + "common.continueShopping": "Continue Shopping", + "common.save": "Save", + "common.cancel": "Cancel", + "common.oops": "Oops! Something went wrong.", + "common.loading": "Loading...", + "common.adminPanel": "Admin Panel", + "common.first": "First", + "common.last": "Last", + "common.confirm": "Confirm", + "common.delete": "Delete", + "common.edit": "Edit", + "common.view": "View", + "common.close": "Close", + "common.done": "Done", + "common.browseFiles": "Browse Files", + "common.dragFilesToUpload": "Drag files to upload", + "common.or": "or", + "common.maxFileSize": "Max file size: 50MB — Supported types: JPG, PNG, GIF, SVG, WEBP", + "common.languageManagement": "Language Management", + "common.currentLanguage": "Current Language", + "common.languageCode": "Language Code", + "common.languageName": "Language Name", + "common.actions": "Actions", + "common.addLanguage": "Add Language", + "common.editLanguage": "Edit Language", + "common.deleteLanguage": "Delete Language", + "common.availableLanguages": "Available Languages", + "common.addNewLanguage": "Add New Language", + "common.saveLanguage": "Save Language", + "common.translations": "Translations", + "common.allRoutes": "All Routes", + "common.routes": "Routes", + "common.createRoute": "Create Route", + "chat.openTicketToViewChat": "Open this ticket to view the chat.", + "roles.Buyer": "Buyer", + "roles.Seller": "Seller", + "roles.Admin": "Administrator", + "roles.Unknown": "Unknown Role", + "nav.analytics": "Analytics", + "nav.users": "Users", + "nav.requests": "Requests", + "nav.stores": "Stores", + "nav.categories": "Categories", + "nav.orders": "Orders", + "nav.advertisements": "Advertisements", + "nav.chat": "Chat", + "nav.routes": "Routes", + "nav.languages": "Languages", + "usersPage.username": "Username", + "usersPage.email": "Email", + "usersPage.role": "Role", + "usersPage.active": "Active", + "usersPage.actions": "Actions", + "usersPage.addUser": "Add User", + "usersPage.searchUser": "Search User", + "usersPage.title": "User Management", + "usersPage.phoneNumber": "Phone Number", + "usersPage.saveChanges": "Save Changes", + "usersPage.deleteUser": "Delete User", + "usersPage.confirmDeleteUser": "Are you sure you want to delete this user?", + "usersPage.noUsers": "No users available", + "usersPage.loadingUsers": "Loading users...", + "analytics.dashboardTitle": "Dashboard Analytics", + "analytics.totalAds": "Total Ads", + "analytics.totalViews": "Total Views", + "analytics.totalClicks": "Total Clicks", + "analytics.totalConversions": "Total Conversions", + "analytics.conversionRevenue": "Conversion Revenue", + "analytics.clicksRevenue": "Clicks Revenue", + "analytics.viewsRevenue": "Views Revenue", + "analytics.totalProducts": "Total Products", + "analytics.productPerformance": "Product Performance", + "analytics.noProducts": "No products to display or still loading...", + "analytics.storeEarnings": "Store Earnings (Past Month)", + "analytics.realtimeEvents": "Realtime Events", + "analytics.noEvents": "No events received yet", + "analytics.lastError": "Last Error", + "analytics.ordersRevenueByRegions": "Orders Revenue by Regions", + "analytics.ordersByRegions": "Orders by Regions", + "analytics.revenue": "Revenue", + "analytics.orders": "Orders", + "analytics.adTriggersBreakdown": "Ad Triggers Breakdown", + "analytics.search": "Search", + "analytics.order": "Order", + "analytics.view": "View", + "analytics.conversionRate": "Conversion Rate (All Ads)", + "analytics.conversions": "conversions", + "analytics.clicks": "clicks", + "analytics.topStoresByAdRevenue": "Top Stores by Ad Revenue", + "analytics.salesFunnelAnalysis": "Sales Funnel Analysis", + "analytics.viewed": "Viewed", + "analytics.clicked": "Clicked", + "analytics.converted": "Converted", + "analytics.combinationChart": "Combination Chart: Fixed vs PopUp Ads", + "analytics.fixed": "Fixed", + "analytics.popup": "PopUp", + "sellerAnalytics.totalEarnings": "Total Earnings", + "sellerAnalytics.sellerProfit": "Seller Profit", + "sellerAnalytics.clickRevenue": "Click Revenue", + "sellerAnalytics.viewRevenue": "View Revenue", + "sellerAnalytics.conversionRevenue": "Conversion Revenue", + "sellerAnalytics.clickRevenueOverTime": "Click Revenue Over Time", + "sellerAnalytics.viewRevenueOverTime": "View Revenue Over Time", + "sellerAnalytics.conversionRevenueOverTime": "Conversion Revenue Over Time", + "routes.availableRoutes": "Available Routes", + "routes.noRoutes": "No routes available", + "routes.loadingMap": "Loading map for Route ID: {{id}}...", + "routes.selectRoute": "Select a route from the list to view it on the map", + "routes.routeDetails": "Route Details", + "routes.directions": "Directions", + "routes.routeId": "Route ID: {{id}}", + "ads.adType": "Ad Type", + "ads.triggers": "Triggers", + "ads.startTime": "Start Time", + "ads.endTime": "End Time", + "ads.isActive": "Is Active", + "ads.advertisementItems": "Advertisement Items", + "ads.conversionPrice": "Conversion Price", + "ads.storeName": "Store Name", + "ads.address": "Address", + "ads.description": "Description", + "ads.place": "Place", + "ads.category": "Category", + "auth.login": "Login", + "auth.logout": "Logout", + "auth.email": "Email", + "auth.password": "Password", + "auth.forgotPassword": "Forgot Password?", + "auth.signIn": "Sign In", + "auth.signUp": "Sign Up", + "auth.rememberMe": "Remember Me", + "errors.connectionError": "Connection Error", + "errors.failedToConnect": "Failed to connect", + "errors.authTokenMissing": "Auth Token Missing", + "errors.loadingError": "Failed to load data", + "errors.deleteError": "Failed to delete item", + "errors.updateError": "Failed to update item", + "errors.createError": "Failed to create item", + "stores.stores": "Stores", + "stores.searchStore": "Search Store", + "stores.addStore": "Add Store", + "common.userCreatedSuccessfully": "User created successfully!", + "common.createNewUser": "Create New User", + "common.role": "Role", + "common.createUser": "Create User", + "common.loadingUserData": "Loading user data...", + "common.userDetails": "User Details", + "common.name": "Name", + "common.email": "Email", + "common.phoneNumber": "Phone Number", + "common.saveChanges": "Save Changes", + "common.deleteUser": "Delete User", + "common.confirmDeleteUser": "Are you sure you want to delete this user?", + "common.noUsers": "No users available", + "common.userManagement": "User Management", + "common.addUser": "Add User", + "common.administrator": "Administrator", + "common.logout": "Logout", + "common.analytics": "Analytics", + "common.users": "Users", + "common.stores": "Stores", + "common.categories": "Categories", + "common.advertisements": "Advertisements", + "common.chat": "Chat", + "common.languages": "Languages", + "common.pasteTranslations" : "Paste Translations", + "common.translationJsonHint" : "Add a text in JSON format", + "common.totalAds": "Total Ads", + "analytics.storePerformance": "Store Performance", + "analytics.revenueAndProfitAnalysis": "Revenue & Profit Analysis", + "analytics.totalRevenue": "Total Revenue", + "analytics.fromAllAdvertisingSources": "From all advertising sources", + "analytics.clickRevenue": "Click Revenue", + "analytics.fromClicks": "From {{count}} clicks", + "analytics.viewRevenue": "View Revenue", + "analytics.fromViews": "From {{count}} views", + "analytics.fromConversions": "From {{count}} conversions", + "analytics.revenueBySourceOverTime": "Revenue by Source Over Time", + "analytics.revenueDistribution": "Revenue Distribution", + "analytics.totalEarnedProfitFromAds": "Total Earned Profit from Ads", + "common.unknownProduct": "Unknown Product", + "analytics.detailedAnalyticsFor": "Detailed Analytics for {{storeName}}", + "analytics.unknownStore": "Unknown Store", + "analytics.storeEarningsPastMonth": "Store Earnings (Past Month)", + "analytics.noProductsToDisplay": "No products to display or still loading...", + "analytics.noStoresToDisplay": "No stores to display or still loading...", + "analytics.conversionsRevenue": "Conversions Revenue", + "analytics.dashboardAnalytics": "Dashboard Analytics", + "analytics.paretoChart": "Pareto Chart", + "analytics.dealsAmount": "Deals amount", + "analytics.deals": "Deals", + "analytics.storeRevenue": "Store Revenue", + "analytics.adminProfit": "Admin Profit", + "analytics.taxRate": "Tax Rate (%)", + "analytics.topRated": "Top Rated", + "analytics.lowestRated": "Lowest Rated", + "analytics.topStores": "Top Stores", + "analytics.topProducts": "Top Products", + "analytics.topCategories": "Top Categories", + "analytics.topUsers": "Top Users", + "analytics.topProductsByAdRevenue": "Top Products by Ad Revenue", + "common.noPendingUsersFound": "No pending users found.", + "analytics.picture": "Picture", + "analytics.pendingUsers": "Pending Users", + "analytics.pendingRequests": "Pending Requests", + "analytics.pendingRequestsTitle": "Pending Requests", + "analytics.pendingRequestsDescription": "Pending requests are requests that are waiting to be processed by the administrator.", + "analytics.pendingUsersTitle": "Pending Users", + "analytics.pendingUsersDescription": "Pending users are users that are waiting to be approved by the administrator.", + "analytics.latestAdUpdate": "Latest Ad Update", + "analytics.latestView": "Latest View", + "analytics.latestClick": "Latest Click", + "analytics.latestConversion": "Latest Conversion", + "analytics.history": "History", + "analytics.views": "Views", + "common.clicks": "Clicks", + "analytics.active": "Active", + "analytics.status": "Status", + "analytics.conversionPrice": "Conversion Price", + "analytics.storeName": "Store Name", + "analytics.comparedToLastMonth": "Compared to last month", + "analytics.comparedToLastYear": "Compared to last year", + "analytics.comparedToPreviousMonth": "Compared to previous month", + "analytics.comparedToPreviousYear": "Compared to previous year", + "analytics.comparedToNextMonth": "Compared to next month", + "analytics.comparedToNextYear": "Compared to next year", + "common.picture": "Picture", + "common.details": "Details", + "common.addItem": "Add Item", + "common.adText": "Ad Text", + "common.product": "Product", + "common.username": "Username", + "common.store": "Store", + "common.deliveryAddress": "Delivery Address", + "common.deliveryStatus": "Delivery Status", + "common.deliveryDate": "Delivery Date", + "common.deliveryTime": "Delivery Time", + "common.deliveryPrice": "Delivery Price", + "common.active": "Active", + "common.inactive": "Inactive", + "common.saveAd": "Save Ad", + "common.viewPrice": "View Price", + "common.clickPrice": "Click Price", + "common.conversionPrice": "Conversion Price", + "common.storeName": "Store Name", + "common.storeId": "Store ID", + "common.displayingPage": "Displaying Page", + "common.tax": "Tax", + "common.totalMonthlyIncome": "Total Monthly Income", + "common.taxedMonthlyIncome": "Taxed Monthly Income", + "common.addProduct": "Add Product", + "common.products": "Products", + "common.tickets": "Tickets", + "common.searchTickets": "Search tickets...", + "common.noTicketsFound": "No tickets found.", + "common.ticket": "Ticket", + "common.views": "Views", + "common.productCategory": "Product Category", + "common.storeCategory": "Store Category", + "common.orderNumber": "Order Number", + "common.created": "Created" +} diff --git a/src/components/AdCard.jsx b/src/components/AdCard.jsx index 60caba4..bef9601 100644 --- a/src/components/AdCard.jsx +++ b/src/components/AdCard.jsx @@ -25,7 +25,7 @@ import EditAdModal from './EditAdModal'; import { apiFetchApprovedUsersAsync } from '../api/api'; const baseApiUrl = import.meta.env.VITE_API_BASE_URL; import defaultAdImage from '@images/bazaarAd.jpg'; - +import { useTranslation } from 'react-i18next'; const IconStat = ({ icon, value, label, bg }) => ( { const [isDeleteOpen, setIsDeleteOpen] = useState(false); const [isEditOpen, setIsEditOpen] = useState(false); const [sellers, setSellers] = useState([]); + const { t } = useTranslation(); useEffect(() => { const fetchUsers = async () => { @@ -219,7 +220,7 @@ const AdCard = ({ ad, stores, onDelete, onEdit, onViewDetails }) => { } value={ad.views} - label='Views' + label={t('common.views')} bg='#0284c7' /> @@ -227,7 +228,7 @@ const AdCard = ({ ad, stores, onDelete, onEdit, onViewDetails }) => { } value={ad.clicks} - label='Clicks' + label={t('common.clicks')} bg='#0d9488' /> @@ -235,7 +236,7 @@ const AdCard = ({ ad, stores, onDelete, onEdit, onViewDetails }) => { } value={dateRange} - label='Active' + label={t('common.active')} bg='#8b5cf6' /> @@ -262,7 +263,7 @@ const AdCard = ({ ad, stores, onDelete, onEdit, onViewDetails }) => { color='text.secondary' sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }} > - Click Price:{' '} + {t('common.clickPrice')}:{' '} {ad.clickPrice ?? 'Mock'} { color='text.secondary' sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }} > - View Price:{' '} + {t('common.viewPrice')}:{' '} {ad.viewPrice ?? 'Mock'} { color='text.secondary' sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }} > - Conversion Price:{' '} + {t('common.conversionPrice')}:{' '} {ad.conversionPrice ?? 'Mock'} @@ -292,8 +293,8 @@ const AdCard = ({ ad, stores, onDelete, onEdit, onViewDetails }) => { ) } - value={ad.isActive ? 'Active' : 'Inactive'} - label='Status' + value={ad.isActive ? t('common.active') : t('common.inactive')} + label={t('common.status')} bg={ad.isActive ? '#22c55e' : '#f87171'} /> diff --git a/src/components/AdRealtimeMonitor.jsx b/src/components/AdRealtimeMonitor.jsx index 957d036..dfe7e29 100644 --- a/src/components/AdRealtimeMonitor.jsx +++ b/src/components/AdRealtimeMonitor.jsx @@ -1,7 +1,7 @@ // AdRealtimeMonitor.jsx import React from 'react'; import { useAdSignalR } from '../hooks/useAdSignalR'; // putanja do custom hooka - +import { useTranslation } from 'react-i18next'; export default function AdRealtimeMonitor() { const { connectionStatus, @@ -12,24 +12,26 @@ export default function AdRealtimeMonitor() { adUpdatesHistory, } = useAdSignalR(); + const { t } = useTranslation(); + return (
Status: {connectionStatus}
- Latest Ad Update:{' '} + {t('common.latestAdUpdate')}:{' '} {latestAdUpdate ? JSON.stringify(latestAdUpdate) : 'None'}
- Latest Click: {latestClickTime} + {t('common.latestClick')}: {latestClickTime}
- Latest View: {latestViewTime} + {t('common.latestView')}: {latestViewTime}
- Latest Conversion: {latestConversionTime} + {t('common.latestConversion')}: {latestConversionTime}
- History: + {t('common.history')}:
    {adUpdatesHistory.map((item, idx) => (
  • diff --git a/src/components/AddAdModal.jsx b/src/components/AddAdModal.jsx index df9f445..0158760 100644 --- a/src/components/AddAdModal.jsx +++ b/src/components/AddAdModal.jsx @@ -16,6 +16,7 @@ import { apiFetchApprovedUsersAsync, apiCreateAdAsync, } from '@api/api'; +import { useTranslation } from 'react-i18next'; const triggerArrayToBitmask = (arr) => { const triggerMap = { @@ -27,6 +28,7 @@ const triggerArrayToBitmask = (arr) => { }; const AddAdModal = ({ open, onClose, onAddAd }) => { + const { t } = useTranslation(); const [formData, setFormData] = useState({ sellerId: '', Views: 0, @@ -168,7 +170,7 @@ const AddAdModal = ({ open, onClose, onAddAd }) => { - Create Ad + {t('common.createAd')} @@ -178,7 +180,7 @@ const AddAdModal = ({ open, onClose, onAddAd }) => { select size="small" name="sellerId" - label="Seller" + label={t('common.seller')} value={formData.sellerId} onChange={handleChange} error={!!formErrors.sellerId} @@ -213,7 +215,7 @@ const AddAdModal = ({ open, onClose, onAddAd }) => { { { { { { renderValue: (selected) => selected.join(', '), }} name="Triggers" - label="Triggers" + label={t('common.triggers')} value={Array.isArray(formData.Triggers) ? formData.Triggers : []} onChange={(e) => { const { value } = e.target; @@ -342,7 +344,7 @@ const AddAdModal = ({ open, onClose, onAddAd }) => { borderRadius: 2, }} > - Add Item + {t('common.addItem')} {formData.AdData.map((item, index) => ( { sx={{ p: 1, border: '1px solid #ddd', borderRadius: 2, mb: 1 }} > - Ad Text: {item.Description} + {t('common.adText')}: {item.Description} - Store: {item.StoreLink} + {t('common.store')}: {item.StoreLink} - Product: {item.ProductLink} + {t('common.product')}: {item.ProductLink} ))} @@ -373,7 +375,7 @@ const AddAdModal = ({ open, onClose, onAddAd }) => { px: 3, }} > - Cancel + {t('common.cancel')} diff --git a/src/components/AddStoreModal.jsx b/src/components/AddStoreModal.jsx index 3b34323..593fbba 100644 --- a/src/components/AddStoreModal.jsx +++ b/src/components/AddStoreModal.jsx @@ -9,8 +9,11 @@ import { } from '@mui/material'; import StoreMallDirectoryIcon from '@mui/icons-material/StoreMallDirectory'; import { apiGetStoreCategoriesAsync, apiFetchGeographyAsync } from '@api/api'; +import { useTranslation } from 'react-i18next'; + const AddStoreModal = ({ open, onClose, onAddStore }) => { + const { t } = useTranslation(); const [formData, setFormData] = useState({ name: '', address: '', @@ -63,13 +66,13 @@ const AddStoreModal = ({ open, onClose, onAddStore }) => { - Add New Store + {t('common.addNewStore')} { { { { { px: 3, }} > - Cancel + {t('common.cancel')} diff --git a/src/components/AdvertisementDetailsModal.jsx b/src/components/AdvertisementDetailsModal.jsx index 3002afb..7f619df 100644 --- a/src/components/AdvertisementDetailsModal.jsx +++ b/src/components/AdvertisementDetailsModal.jsx @@ -9,8 +9,10 @@ import AdContentCard from '@components/AdContentCard'; import HorizontalScroll from './HorizontalScroll'; import { apiGetAllStoresAsync, apiGetStoreProductsAsync } from '@api/api'; import { useAdSignalR } from '@hooks/useAdSignalR'; +import { useTranslation } from 'react-i18next'; const AdvertisementDetailsModal = ({ open, onClose, ad, onSave, onDelete }) => { + const { t } = useTranslation(); const [isEditing, setIsEditing] = useState(false); const [editedData, setEditedData] = useState({ adData: ad?.adData || [], @@ -181,20 +183,20 @@ const AdvertisementDetailsModal = ({ open, onClose, ad, onSave, onDelete }) => { }} > - Click Price: {adToShow.clickPrice ?? '1000'} + {t('common.clickPrice')}: {adToShow.clickPrice ?? '1000'} - View Price: {adToShow.viewPrice ?? '1000'} + {t('common.viewPrice')}: {adToShow.viewPrice ?? '1000'} - Conversion Price: {adToShow.conversionPrice ?? '1000'} + {t('common.conversionPrice')}: {adToShow.conversionPrice ?? '1000'} {/* Content Section */} - Advertisement Content + {t('common.advertisementContent')} {adToShow.adData.map((item, index) => ( diff --git a/src/components/CategoryCard.jsx b/src/components/CategoryCard.jsx index 75e1dbd..2ed9185 100644 --- a/src/components/CategoryCard.jsx +++ b/src/components/CategoryCard.jsx @@ -10,11 +10,13 @@ import { import CategoryIcon from "@mui/icons-material/Category"; import { FiEdit2, FiTrash } from "react-icons/fi"; import ConfirmDeleteModal from "@components/ConfirmDeleteModal"; +import { useTranslation } from 'react-i18next'; const CategoryCard = ({ category, onUpdateCategory, onDeleteCategory }) => { const [openDeleteModal, setOpenDeleteModal] = useState(false); const [isEditing, setIsEditing] = useState(false); const [editedName, setEditedName] = useState(category.name); + const { t } = useTranslation(); const handleEditToggle = () => setIsEditing(true); @@ -123,7 +125,7 @@ const CategoryCard = ({ category, onUpdateCategory, onDeleteCategory }) => { {/* Label */} { + const { t } = useTranslation(); return ( { }} > - Product Categories + {t('common.productCategories')} { }} > - Store Categories + {t('common.storeCategories')} diff --git a/src/components/DealsChart.jsx b/src/components/DealsChart.jsx index 6b03d7b..78895c2 100644 --- a/src/components/DealsChart.jsx +++ b/src/components/DealsChart.jsx @@ -21,6 +21,8 @@ import { Legend, } from 'chart.js'; import { apiGetAllStoresAsync, apiGetAllAdsAsync } from '../api/api.js'; // From develop +import { useTranslation } from 'react-i18next'; + ChartJS.register( CategoryScale, @@ -32,6 +34,7 @@ ChartJS.register( ); function DealsChart() { + const { t } = useTranslation(); const [filterType, setFilterType] = useState('topRated'); // 'topRated' or 'lowestRated' const [anchorEl, setAnchorEl] = useState(null); const [storesData, setStoresData] = useState({ @@ -328,7 +331,7 @@ function DealsChart() { {/* Text at the bottom - "by store" from develop */} - Deals amount + {t('analytics.dealsAmount')} { const isPositive = percentageChange >= 0; - + const { t } = useTranslation(); return ( { > {isPositive ? : } - {Math.abs(Number(percentageChange)).toFixed(2)}% Compared to last - month{' '} + {Math.abs(Number(percentageChange)).toFixed(2)}% {t('analytics.comparedToLastMonth')} diff --git a/src/components/OrdersTable.jsx b/src/components/OrdersTable.jsx index 0945b00..e4eea7e 100644 --- a/src/components/OrdersTable.jsx +++ b/src/components/OrdersTable.jsx @@ -16,6 +16,7 @@ import { FaTrash } from 'react-icons/fa6'; import CircleIcon from '@mui/icons-material/FiberManualRecord'; import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp'; import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; +import { useTranslation } from 'react-i18next'; const getStatusColor = (status) => { switch (status) { @@ -52,16 +53,16 @@ const OrdersTable = ({ }; const formatOrderId = (id) => `#${String(id).padStart(5, '0')}`; - + const { t } = useTranslation(); const columns = [ - { label: 'Order #', field: 'id' }, - { label: 'Buyer', field: 'buyerName' }, - { label: 'Store', field: 'storeName' }, - { label: 'Delivery Address', field: 'deliveryAddress' }, // NOVA KOLONA - { label: 'Store Address', field: 'storeAddress' }, // NOVA KOLONA - { label: 'Status', field: 'status' }, - { label: 'Total', field: 'totalPrice' }, - { label: 'Created', field: 'createdAt' }, + { label: t('common.orderNumber'), field: 'id' }, + { label: t('common.buyer'), field: 'buyerName' }, + { label: t('common.store'), field: 'storeName' }, + { label: t('common.deliveryAddress'), field: 'deliveryAddress' }, // NOVA KOLONA + { label: t('common.storeAddress'), field: 'storeAddress' }, // NOVA KOLONA + { label: t('common.status'), field: 'status' }, + { label: t('common.total'), field: 'totalPrice' }, + { label: t('common.created'), field: 'createdAt' }, { label: '', field: 'actions' }, ]; diff --git a/src/components/ParetoChart.jsx b/src/components/ParetoChart.jsx index 9b1d0ec..623ac26 100644 --- a/src/components/ParetoChart.jsx +++ b/src/components/ParetoChart.jsx @@ -15,6 +15,7 @@ import { Box, Typography } from '@mui/material'; import { apiGetAllAdsAsync } from '../api/api.js'; import { format, parseISO } from 'date-fns'; import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr'; +import { useTranslation } from 'react-i18next'; const baseUrl = import.meta.env.VITE_API_BASE_URL || ''; const HUB_ENDPOINT_PATH = '/Hubs/AdvertisementHub'; @@ -38,7 +39,8 @@ function groupByMonth(ads) { const ParetoChart = () => { const [data, setData] = useState([]); const [ads, setAds] = useState([]); - const connectionRef = useRef(null); + const connectionRef = useRef(null); + const { t } = useTranslation(); useEffect(() => { const fetchData = async () => { @@ -137,7 +139,7 @@ const ParetoChart = () => { marginBottom: '20px', }} > - Pareto Chart + {t('analytics.paretoChart')} { + const { t } = useTranslation(); const [orderBy, setOrderBy] = useState("submitDate"); const [order, setOrder] = useState("desc"); @@ -91,14 +92,14 @@ const PendingUsersTable = ({ # - Picture + {t('common.picture')} handleRequestSort("name")} > - Name + {t('common.name')} @@ -107,7 +108,7 @@ const PendingUsersTable = ({ direction={order} onClick={() => handleRequestSort("email")} > - Email + {t('common.email')} @@ -116,10 +117,10 @@ const PendingUsersTable = ({ direction={order} onClick={() => handleRequestSort("role")} > - Role + {t('common.role')} - Actions + {t('common.actions')} @@ -209,7 +210,7 @@ const PendingUsersTable = ({ {users.length === 0 && ( - No pending users found. + {t('common.noPendingUsersFound')} )} diff --git a/src/components/RevenueMetrics.jsx b/src/components/RevenueMetrics.jsx index e5418a3..ce92eb5 100644 --- a/src/components/RevenueMetrics.jsx +++ b/src/components/RevenueMetrics.jsx @@ -7,6 +7,7 @@ import { useTranslation } from 'react-i18next'; import MetricCard from './MetricCard'; import { apiFetchAdsWithProfitAsync } from '@api/api'; + const formatCurrency = (value, currency = 'USD') => new Intl.NumberFormat('en-US', { style: 'currency', @@ -35,7 +36,7 @@ const groupByDay = (ads, eventType) => { const RevenueMetrics = () => { const { t } = useTranslation(); const [ads, setAds] = useState([]); - + const { t } = useTranslation(); useEffect(() => { const fetchData = async () => { const adsData = await apiFetchAdsWithProfitAsync(); @@ -150,19 +151,19 @@ const RevenueMetrics = () => { series={[ { data: clickRevenueByDay, - label: 'Click Revenue', + label: t('analytics.clickRevenue'), color: '#3B82F6', showMark: false, }, { data: viewRevenueByDay, - label: 'View Revenue', + label: t('analytics.viewRevenue'), color: '#0D9488', showMark: false, }, { data: conversionRevenueByDay, - label: 'Conversion Revenue', + label: t('analytics.conversionRevenue'), color: '#10B981', showMark: false, }, diff --git a/src/components/RouteCard.jsx b/src/components/RouteCard.jsx index da103fb..09818df 100644 --- a/src/components/RouteCard.jsx +++ b/src/components/RouteCard.jsx @@ -3,8 +3,9 @@ import { Box, Typography, Button } from '@mui/material'; import mapa from '@images/routing-pointa-ppointb.png'; import DeleteConfirmationModal from './DeleteRouteConfirmation'; import RouteDetailsModal from './RouteDetailsModal'; +import { useTranslation } from 'react-i18next'; const RouteCard = ({route, onViewDetails, onDelete, googleMapsApiKey}) => { - + const { t } = useTranslation(); const [deleteOpen, setDeleteOpen] = useState(false); const [detailsOpen, setDetailsOpen] = useState(false); @@ -71,7 +72,7 @@ const RouteCard = ({route, onViewDetails, onDelete, googleMapsApiKey}) => { onClick={() => setDetailsOpen(true)} sx={{ flex: 1 }} > - Details + {t('common.details')} { + const { t } = useTranslation(); const [anchorEl, setAnchorEl] = useState(null); const [menuAnchor, setMenuAnchor] = useState(null); const [storeData, setStoreData] = useState(store); @@ -290,7 +293,7 @@ const StoreCard = ({ store }) => { fontSize: '0.85rem', }} > - Tax: {(storeData.tax*100).toFixed(2)} + {t('common.tax')}: {(storeData.tax*100).toFixed(2)} { fontSize: '0.85rem', }} > - Total monthly income: {revenue.totalIncome} + {t('common.totalMonthlyIncome')}: {revenue.totalIncome} { fontSize: '0.85rem', }} > - Taxed monthly income: {revenue.taxedIncome} + {t('common.taxedMonthlyIncome')}: {revenue.taxedIncome} {/* Buttons */} @@ -343,7 +346,7 @@ const StoreCard = ({ store }) => { }, }} > - Add Product + {t('common.addProduct')} { + const { t } = useTranslation(); const [page, setPage] = useState(0); const rowsPerPage = 5; const [orderBy, setOrderBy] = useState('storeRevenue'); @@ -30,14 +32,16 @@ const StoreEarningsTable = ({ data }) => { - Store Name + + {t('common.storeName')} + handleSort('storeRevenue')} > - Store Revenue + {t('analytics.storeRevenue')} @@ -46,7 +50,7 @@ const StoreEarningsTable = ({ data }) => { direction={order} onClick={() => handleSort('adminProfit')} > - Admin Profit + {t('analytics.adminProfit')} @@ -55,7 +59,7 @@ const StoreEarningsTable = ({ data }) => { direction={order} onClick={() => handleSort('taxRate')} > - Tax Rate (%) + {t('analytics.taxRate')} diff --git a/src/components/StoreProductsList.jsx b/src/components/StoreProductsList.jsx index ccd88e3..5a967fa 100644 --- a/src/components/StoreProductsList.jsx +++ b/src/components/StoreProductsList.jsx @@ -9,12 +9,14 @@ import { } from '@api/api'; import EditProductModal from './EditProductModal'; import ProductDetailsModal from './ProductDetailsModal'; +import { useTranslation } from 'react-i18next'; const StoreProductsList = ({ storeId }) => { const [products, setProducts] = useState([]); const [openEditModal, setOpenEditModal] = useState(false); const [openDetailsModal, setOpenDetailsModal] = useState(false); const [selectedProduct, setSelectedProduct] = useState(null); + const { t } = useTranslation(); useEffect(() => { const fetchProducts = async () => { @@ -95,7 +97,7 @@ const StoreProductsList = ({ storeId }) => { return ( - Products + {t('common.products')} { const ticket = tickets.find((t) => t.id === ticketId); if (ticket.status === 'Requested') { @@ -77,10 +78,10 @@ export default function TicketListSection({ }} > - Tickets + {t('common.tickets')} {filteredTickets.length === 0 ? ( - No tickets found. + {t('common.noTicketsFound')} ) : ( filteredTickets.map((ticket) => ( diff --git a/src/components/UserList.jsx b/src/components/UserList.jsx index 96c1da1..4f50278 100644 --- a/src/components/UserList.jsx +++ b/src/components/UserList.jsx @@ -22,6 +22,7 @@ import DeleteUserButton from './DeleteUserButton'; import { FiEdit2 } from 'react-icons/fi'; import { FaUser, FaUserSlash } from 'react-icons/fa'; import { MdDone } from 'react-icons/md'; +import { useTranslation } from 'react-i18next'; const getStatus = (user) => { if (user.isApproved === true) return 'Approved'; @@ -82,7 +83,7 @@ export default function UserList({ const [order, setOrder] = useState('asc'); const [editingUserId, setEditingUserId] = useState(null); const [editedUser, setEditedUser] = useState({}); - + const { t } = useTranslation(); const handleSort = (field) => { const isAsc = orderBy === field && order === 'asc'; setOrder(isAsc ? 'desc' : 'asc'); @@ -134,14 +135,14 @@ export default function UserList({ # - Pic + {t('common.picture')} handleSort('userName')} > - Username + {t('common.username')} @@ -150,7 +151,7 @@ export default function UserList({ direction={order} onClick={() => handleSort('email')} > - Email + {t('common.email')} @@ -159,7 +160,7 @@ export default function UserList({ direction={order} onClick={() => handleSort('role')} > - Role + {t('common.role')} @@ -168,7 +169,7 @@ export default function UserList({ direction={order} onClick={() => handleSort('isActive')} > - Active + {t('common.active')} {/* @@ -189,7 +190,7 @@ export default function UserList({ Status */} - Actions + {t('common.actions')} @@ -246,8 +247,8 @@ export default function UserList({ onChange={handleFieldChange} variant='standard' > - Buyer - Seller + {t('common.buyer')} + {t('common.seller')} ) : ( user.roles[0] @@ -267,8 +268,8 @@ export default function UserList({ } variant='standard' > - Online - Offline + {t('common.online')} + {t('common.offline')} ) : ( diff --git a/src/components/UserManagementPagination.jsx b/src/components/UserManagementPagination.jsx index 61bbdeb..2f68827 100644 --- a/src/components/UserManagementPagination.jsx +++ b/src/components/UserManagementPagination.jsx @@ -2,6 +2,7 @@ import React from "react"; import { Box, Typography, IconButton, Button } from "@mui/material"; import NavigateBeforeIcon from "@mui/icons-material/NavigateBefore"; import NavigateNextIcon from "@mui/icons-material/NavigateNext"; +import { useTranslation } from 'react-i18next'; const UserManagementPagination = ({ currentPage, @@ -21,6 +22,8 @@ const UserManagementPagination = ({ return pages; }; + const { t } = useTranslation(); + return ( - displaying page + {t('common.displayingPage')} @@ -45,7 +48,7 @@ const UserManagementPagination = ({ onClick={() => onPageChange(1)} disabled={currentPage === 1} > - First + {t('common.first')} onPageChange(totalPages)} disabled={currentPage === totalPages} > - Last + {t('common.last')} diff --git a/src/pages/AnalyticsPage.jsx b/src/pages/AnalyticsPage.jsx index 4c33dd1..e71ec91 100644 --- a/src/pages/AnalyticsPage.jsx +++ b/src/pages/AnalyticsPage.jsx @@ -548,7 +548,7 @@ const AnalyticsPage = () => { lineHeight: 1.2, }} > - Dashboard Analytics{' '} + {t('analytics.dashboardAnalytics')}