diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json index 033105ec..49331700 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/SeederData.json @@ -582,6 +582,12 @@ "en": "Delete", "tr": "Sil" }, + { + "resourceName": "Platform", + "key": "DeleteConfirmation", + "en": "Silmek istediğinize emin misiniz?", + "tr": "Silmek istediğinize emin misiniz?" + }, { "resourceName": "Platform", "key": "Get", @@ -600,6 +606,18 @@ "en": "Administration", "tr": "Yönetim" }, + { + "resourceName": "Platform", + "key": "AccessDenied", + "en": "Access denied!", + "tr": "Erişim reddedildi!" + }, + { + "resourceName": "Platform", + "key": "AccessDeniedMessage", + "en": "You have no permission to visit this page", + "tr": "Bu sayfayı ziyaret etme izniniz yok" + }, { "resourceName": "Platform", "key": "AbpTenantManagement", @@ -609,8 +627,8 @@ { "resourceName": "Platform", "key": "AbpTenantManagement.Tenants", - "en": "Tenants", - "tr": "Tenantlar" + "en": "Companies", + "tr": "Şirketler" }, { "resourceName": "Platform", @@ -748,7 +766,13 @@ "resourceName": "Platform", "key": "Abp.Identity.OrganizationUnit.NewUnit", "en": "New Unit", - "tr": "Üye Birim" + "tr": "Yeni Birim" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.AddUnit", + "en": "Add Unit", + "tr": "Birim Ekle" }, { "resourceName": "Platform", @@ -780,6 +804,12 @@ "en": "Delete", "tr": "Sil" }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.Rename", + "en": "Rename", + "tr": "Değiştir" + }, { "resourceName": "Platform", "key": "Abp.Identity.OrganizationUnit.AddRootUnit", @@ -792,6 +822,42 @@ "en": "Add Sub Unit", "tr": "Alt Birim Ekle" }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.Users.Description", + "en": "Select an organization unit to see members", + "tr": "Üyeleri görmek için bir organizasyon birimi seçin" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.Roles.Description", + "en": "Select an organization unit to see roles", + "tr": "Rolleri görmek için bir organizasyon birimi seçin" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.Parent", + "en": "Parent", + "tr": "Ebeveyn" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.DisplayName", + "en": "DisplayName", + "tr": "Görünür Adı" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.SelectMembers", + "en": "Select Members", + "tr": "Üyeleri Seçin" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.OrganizationUnit.SelectRoles", + "en": "Select Roles", + "tr": "Rolleri Seçin" + }, { "resourceName": "Platform", "key": "App.Languages", @@ -1704,6 +1770,18 @@ "en": "Password Change Time", "tr": "Parola Değiştirme Zamanı" }, + { + "resourceName": "Platform", + "key": "Abp.Identity.User.UserInformation.CreateTime", + "en": "Create Time", + "tr": "Tanımlama Tarihi" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.User.UserInformation.UpdateTime", + "en": "Update Time", + "tr": "Güncelleme Tarihi" + }, { "resourceName": "Platform", "key": "Abp.Identity.User.LockoutManagement", @@ -1712,9 +1790,9 @@ }, { "resourceName": "Platform", - "key": "Abp.Identity.User.LockoutManagement.Active", - "en": "IsActive", - "tr": "Aktif/Pasif" + "key": "Abp.Identity.User.LockoutManagement.Status", + "en": "Status", + "tr": "Durum" }, { "resourceName": "Platform", @@ -1722,12 +1800,30 @@ "en": "Admin Verification", "tr": "Yönetici Doğrulaması" }, + { + "resourceName": "Platform", + "key": "Abp.Identity.User.LockoutManagement.EmailConfirmed", + "en": "Email Confirmed", + "tr": "Email Adresi Onayı" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.User.LockoutManagement.PhoneNumberConfirmed", + "en": "Phone Number Confirmed", + "tr": "Telefon Numarası Onayı" + }, { "resourceName": "Platform", "key": "Abp.Identity.User.LockoutManagement.TwoFactorEnabled", "en": "Two Factor Enabled", "tr": "İki Faktör Ektinleştirme" }, + { + "resourceName": "Platform", + "key": "Abp.Identity.User.LockoutManagement.LoginEndDate", + "en": "Login End Date", + "tr": "Login Bitiş Tarihi" + }, { "resourceName": "Platform", "key": "Abp.Identity.User.LockoutManagement.AccountEndDate", @@ -1752,6 +1848,18 @@ "en": "Account Lock Date", "tr": "Hesap Kilitlenme Tarihi" }, + { + "resourceName": "Platform", + "key": "Abp.Identity.User.LockoutManagement.ShouldChangePwOnNextLogin", + "en": "Should Change Password On Next Login?", + "tr": "Bir Sonraki Girişte Şifre Değiştirilsin mi?" + }, + { + "resourceName": "Platform", + "key": "Abp.Identity.User.LockoutManagement.AccessFailedCount", + "en": "Access Failed Count", + "tr": "Başarısız Erişim Sayısı" + }, { "resourceName": "Platform", "key": "Abp.Identity.Profile", @@ -1889,6 +1997,18 @@ "key": "Error:0005", "en": "Internal Error", "tr": "Dahili Hata" + }, + { + "resourceName": "Platform", + "key": "Error:0006", + "en": "No records!", + "tr": "Kayıt Yok!" + }, + { + "resourceName": "Platform", + "key": "App.BackgroundWorkers.Message", + "en": "Background Workers are being renewed.", + "tr": "Arka Plan Çalışanları yenileniyor." }, { "resourceName": "Platform", @@ -4050,6 +4170,138 @@ "key": "ListForms.ListFormFieldEdit.PivotSettingWordWrapEnabled", "en": "WordWrap Enabled", "tr": "WordWrap Enabled" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Title", + "en": "Configuration", + "tr": "Yapılandırma" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Mode", + "en": "Mode", + "tr": "Mod" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Mode.Description", + "en": "Switch theme to dark mode", + "tr": "Switch theme to dark mode" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Direction", + "en": "Direction", + "tr": "Yön" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Direction.Description", + "en": "Select a direction", + "tr": "Bir yön seçin" + }, + { + "resourceName": "Platform", + "key": "SidePanel.NavMode", + "en": "Nav Mode", + "tr": "Nav Mod" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Themed", + "en": "Theme", + "tr": "Tema" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Layout", + "en": "Layout", + "tr": "Düzen" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Layout.Classic", + "en": "Classic", + "tr": "Klasik" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Layout.Modern", + "en": "Modern", + "tr": "Modern" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Layout.Stacked Side", + "en": "Stacked Side", + "tr": "Yığılmış Yan" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Layout.Simple", + "en": "Simple", + "tr": "Basit" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Layout.Decked", + "en": "Decked", + "tr": "Döşeli" + }, + { + "resourceName": "Platform", + "key": "SidePanel.Layout.Blank", + "en": "Blank", + "tr": "Boş" + }, + { + "resourceName": "Platform", + "key": "AI.Welcome", + "en": "Welcome!", + "tr": "Hoş Geldiniz!" + }, + { + "resourceName": "Platform", + "key": "AI.Name", + "en": "Course AI", + "tr": "Kurs AI" + }, + { + "resourceName": "Platform", + "key": "AI.WaitAnswer", + "en": "Waiting for response...", + "tr": "Yanıt bekleniyor..." + }, + { + "resourceName": "Platform", + "key": "AI.Asking", + "en": "Ask anything", + "tr": "Herhangi bir şey sor" + }, + { + "resourceName": "Platform", + "key": "AI.SelectModel", + "en": "Select Model", + "tr": "Model Seç" + }, + { + "resourceName": "Platform", + "key": "AI.SohbetAnswer", + "en": "Chat", + "tr": "Sohbet" + }, + { + "resourceName": "Platform", + "key": "AI.DatabaseAnswer", + "en": "Database Query", + "tr": "Veritabanı Sorgusu" + }, + { + "resourceName": "Platform", + "key": "AI.AnalizAnswer", + "en": "Analysis and Evaluation", + "tr": "Analiz & Değerlendirme" } ], "DataSources": [ diff --git a/company/src/components/home/CaseStudies.tsx b/company/src/components/home/CaseStudies.tsx deleted file mode 100644 index 73666d52..00000000 --- a/company/src/components/home/CaseStudies.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React from 'react'; - -const CaseStudies: React.FC = () => { - return ( -
-
-
-

- Case Studies -

-

- See how we've helped businesses achieve their goals -

-
-
- {/* Placeholder for case study cards */} -
-

Case Study 1

-

Coming soon...

-
-
-

Case Study 2

-

Coming soon...

-
-
-

Case Study 3

-

Coming soon...

-
-
-
-
- ); -}; - -export default CaseStudies; diff --git a/company/src/components/home/Testimonials.tsx b/company/src/components/home/Testimonials.tsx deleted file mode 100644 index ea540297..00000000 --- a/company/src/components/home/Testimonials.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import Slider from 'react-slick'; -import 'slick-carousel/slick/slick.css'; -import 'slick-carousel/slick/slick-theme.css'; -import { useLanguage } from '../../context/LanguageContext'; -import { testimonials } from '../../locales/testimonials'; - -const Testimonials: React.FC = () => { - const { t, language } = useLanguage(); - - const testimonialsData = testimonials[language]; - - const settings = { - dots: true, - infinite: true, - speed: 500, - slidesToShow: 3, - slidesToScroll: 1, - autoplay: true, - autoplaySpeed: 5000, - cssEase: "linear" - }; - - return ( -
-
-

{t('testimonials.title')}

- - {testimonialsData.map((testimonial, index) => ( -
-
-

"{testimonial.quote}"

-
{testimonial.author}
-
{testimonial.title}
-
-
- ))} -
-
-
- ); -}; - -export default Testimonials; diff --git a/company/src/context/LanguageContext.tsx b/company/src/context/LanguageContext.tsx index 6fb85a38..57c8ae4a 100644 --- a/company/src/context/LanguageContext.tsx +++ b/company/src/context/LanguageContext.tsx @@ -356,6 +356,10 @@ const translations = { // Testimonials Section "testimonials.title": "Müşteri Yorumları", + // NotFound + "notFound.message": "Üzgünüz, aradığınız sayfa bulunamadı. Lütfen URL'yi kontrol edin veya ana sayfaya dönün.", + "notFound.button": "Ana Sayfaya Dön", + // Common "common.learnMore": "Detaylı Bilgi", "common.contact": @@ -742,6 +746,10 @@ const translations = { // Testimonials Section "testimonials.title": "Testimonials", + // NotFound + "notFound.message": "Sorry, the page you are looking for was not found. Please check the URL or return to the homepage.", + "notFound.button": "Return to Homepage", + // Common "common.learnMore": "Learn More", "common.contact": diff --git a/company/src/pages/NotFound.tsx b/company/src/pages/NotFound.tsx index 48885bcc..10f55c17 100644 --- a/company/src/pages/NotFound.tsx +++ b/company/src/pages/NotFound.tsx @@ -1,16 +1,20 @@ import React from 'react'; import { Frown } from 'lucide-react'; // Lucide-react kütüphanesinden Frown ikonunu import et +import { useLanguage } from '../context/LanguageContext'; const NotFound: React.FC = () => { + const { t, language } = useLanguage(); + + return (
{/* Arka plan ve metin rengi güncellendi, padding eklendi */} {/* İkon boyutu ve rengi güncellendi */}

404

{/* Başlık boyutu ve rengi güncellendi */}

{/* Metin rengi, margin ve max-width güncellendi */} - Üzgünüz, aradığınız sayfa bulunamadı. Lütfen URL'yi kontrol edin veya ana sayfaya dönün. + {t('notFound.message')}

{/* Buton stili güncellendi */} - Ana Sayfaya Dön + {t('notFound.button')}
); diff --git a/ui/dev-dist/sw.js b/ui/dev-dist/sw.js index 5ca6b034..f3c52b2b 100644 --- a/ui/dev-dist/sw.js +++ b/ui/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "index.html", - "revision": "0.ndk83qv1fe" + "revision": "0.i5lc19up29o" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/ui/src/components/template/SidePanel/SidePanel.tsx b/ui/src/components/template/SidePanel/SidePanel.tsx index 074c071f..2e5ddbc1 100644 --- a/ui/src/components/template/SidePanel/SidePanel.tsx +++ b/ui/src/components/template/SidePanel/SidePanel.tsx @@ -5,12 +5,15 @@ import SidePanelContent, { SidePanelContentProps } from './SidePanelContent' import withHeaderItem from '@/utils/hoc/withHeaderItem' import { useStoreState, useStoreActions } from '@/store' import type { CommonProps } from '@/@types/common' +import { useLocalization } from '@/utils/hooks/useLocalization' type SidePanelProps = SidePanelContentProps & CommonProps const _SidePanel = (props: SidePanelProps) => { const { setPanelExpand } = useStoreActions((actions) => actions.theme) + const {translate } = useLocalization() + const { className, ...rest } = props const panelExpand = useStoreState((state) => state.theme.panelExpand) @@ -35,7 +38,7 @@ const _SidePanel = (props: SidePanelProps) => { { const { textTheme } = useThemeClass() + const { translate } = useLocalization() + return (
{ />
- {layout.label} + {translate('::SidePanel.Layout.' + layout.label)}
) diff --git a/ui/src/components/template/ThemeConfigurator/ThemeConfigurator.tsx b/ui/src/components/template/ThemeConfigurator/ThemeConfigurator.tsx index f8a68496..9ebf9a44 100644 --- a/ui/src/components/template/ThemeConfigurator/ThemeConfigurator.tsx +++ b/ui/src/components/template/ThemeConfigurator/ThemeConfigurator.tsx @@ -4,39 +4,42 @@ import ThemeSwitcher from './ThemeSwitcher' import DirectionSwitcher from './DirectionSwitcher' import NavModeSwitcher from './NavModeSwitcher' import CopyButton from './CopyButton' +import { useLocalization } from '@/utils/hooks/useLocalization' export type ThemeConfiguratorProps = { callBackClose?: () => void } const ThemeConfigurator = ({ callBackClose }: ThemeConfiguratorProps) => { + const { translate } = useLocalization() + return (
-
Dark Mode
- Switch theme to dark mode +
{translate('::SidePanel.Mode')}
+ {translate('::SidePanel.Mode.Description')}
-
Direction
- Select a direction +
{translate('::SidePanel.Direction')}
+ {translate('::SidePanel.Direction.Description')}
-
Nav Mode
+
{translate('::SidePanel.NavMode')}
-
Theme
+
{translate('::SidePanel.Themed')}
-
Layout
+
{translate('::SidePanel.Layout')}
diff --git a/ui/src/services/UiEvalService.tsx b/ui/src/services/UiEvalService.tsx index ed4e5045..3822b4e7 100644 --- a/ui/src/services/UiEvalService.tsx +++ b/ui/src/services/UiEvalService.tsx @@ -1,5 +1,6 @@ import { Notification, toast } from '@/components/ui' import { generateBackgroundWorkers } from '@/proxy/background-worker/background-worker.service' +import { useLocalization } from '@/utils/hooks/useLocalization' export abstract class UiEvalService { static Init = () => { @@ -7,6 +8,8 @@ export abstract class UiEvalService { } static ApiGenerateBackgroundWorkers = () => { + const { translate } = useLocalization() + const asyncCall = async () => { await generateBackgroundWorkers() } @@ -15,7 +18,7 @@ export abstract class UiEvalService { toast.push( - {'Background Workers are being renewed.'} + {translate('::App.BackgroundWorkers.Message')} , { placement: 'top-center', diff --git a/ui/src/views/AccessDenied.tsx b/ui/src/views/AccessDenied.tsx index ac6d793f..d170244f 100644 --- a/ui/src/views/AccessDenied.tsx +++ b/ui/src/views/AccessDenied.tsx @@ -1,11 +1,13 @@ import Container from '@/components/shared/Container' import DoubleSidedImage from '@/components/shared/DoubleSidedImage' import { Button } from '@/components/ui' +import { useLocalization } from '@/utils/hooks/useLocalization' import { MdArrowBack } from 'react-icons/md' import { useNavigate } from 'react-router-dom' const AccessDenied = () => { const navigate = useNavigate() + const { translate } = useLocalization() return ( @@ -13,11 +15,11 @@ const AccessDenied = () => {
-

Access Denied!

-

You have no permission to visit this page

+

{ translate('::AccessDenied')}

+

{ translate('::AccessDeniedMessage')}

- @@ -461,7 +461,7 @@ const OrganizationUnits = () => {
@@ -944,7 +944,7 @@ const OrganizationUnits = () => { onClose={() => setIsMoveAllUsersOpen(false)} onRequestClose={() => setIsMoveAllUsersOpen(false)} > -
Move All Users
+
{translate('::Abp.Identity.OrganizationUnit.MoveAllUsers')}
{ const bottomRef = useRef(null) const { VITE_AI_URL } = import.meta.env + const { translate } = useLocalization() const aiPosts = useStoreState((state) => state.base.messages.aiPosts) @@ -152,9 +154,9 @@ const Assistant = () => { } const typeLabels: Record = { - chat: '🗨️ Sohbet', - query: '📊 Veritabanı Sorgusu', - analyze: '📈 Analiz & Değerlendirme', + chat: '🗨️ ' + translate('::AI.SohbetAnswer'), + query: '📊 ' + translate('::AI.DatabaseAnswer'), + analyze: '📈 ' + translate('::AI.AnalizAnswer'), } const cleanedSql = (() => { @@ -263,8 +265,8 @@ const Assistant = () => { {messages.length === 0 && (
-

Hoş Geldiniz!

-

Kurs AI

+

{translate('::AI.Welcome')}

+

{translate('::AI.Name')}

)} @@ -293,7 +295,7 @@ const Assistant = () => { {loading && (
- Yanıt bekleniyor... + {translate('::AI.WaitAnswer')}
)} @@ -312,7 +314,7 @@ const Assistant = () => { handleSubmit(e) } }} - placeholder="Ask anything" + placeholder={translate('::AI.Asking')} rows={2} className="w-full resize-none bg-transparent border-none outline-none text-base placeholder-gray-400" /> @@ -320,7 +322,7 @@ const Assistant = () => {
item.key === selectedBot)?.name || 'Bot Seç'} + title={bot.find((item) => item.key === selectedBot)?.name || translate('::AI.SelectModel') } > {bot.map((item) => ( diff --git a/ui/src/views/shared/TableNoRecords.tsx b/ui/src/views/shared/TableNoRecords.tsx index 0682be69..c53f5b65 100644 --- a/ui/src/views/shared/TableNoRecords.tsx +++ b/ui/src/views/shared/TableNoRecords.tsx @@ -1,6 +1,7 @@ import type { CommonProps } from '@/@types/common' import Td from '@/components/ui/Table/Td' import Tr from '@/components/ui/Table/Tr' +import { useLocalization } from '@/utils/hooks/useLocalization' import useThemeClass from '@/utils/hooks/useThemeClass' import classNames from 'classnames' @@ -12,7 +13,8 @@ const TableNoRecords = (props: TableNoRecordsProps): JSX.Element => { const { show, children, className, ...rest } = props const { textTheme } = useThemeClass() - + const { translate } = useLocalization() + const classNameProps = { className: classNames(textTheme, 'hover:underline', className), } @@ -20,7 +22,7 @@ const TableNoRecords = (props: TableNoRecordsProps): JSX.Element => { return show ? ( - No records! + { translate('::Error:0006')} {children}