Crudendpoint ve DynamicService translate

This commit is contained in:
Sedat ÖZTÜRK 2026-03-03 09:39:00 +03:00
parent 963dfb56f0
commit 490a73dde8
4 changed files with 562 additions and 81 deletions

View file

@ -648,12 +648,6 @@
"en": "Dynamic Services", "en": "Dynamic Services",
"tr": "Dinamik Servisler" "tr": "Dinamik Servisler"
}, },
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Description",
"en": "Create and publish dynamic AppServices by writing C# code",
"tr": "C# kod yazarak dinamik AppService'ler oluşturun ve yayınlayın"
},
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.Forum", "key": "App.Forum",
@ -16837,6 +16831,493 @@
"key": "App.SqlQueryManager.TableDeployFailed", "key": "App.SqlQueryManager.TableDeployFailed",
"en": "Table could not be deployed.", "en": "Table could not be deployed.",
"tr": "Tablo deploy edilemedi." "tr": "Tablo deploy edilemedi."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.TotalTables",
"en": "Total Tables",
"tr": "Toplam Tablo"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.EndpointInstalled",
"en": "Endpoint Installed",
"tr": "Endpoint Kurulu"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.ActiveEndpoint",
"en": "Active Endpoint",
"tr": "Aktif Endpoint"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.DataSource",
"en": "Data Source",
"tr": "Veri Kaynağı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Loading",
"en": "Loading...",
"tr": "Yükleniyor..."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.SearchTable",
"en": "Search table...",
"tr": "Tablo ara..."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.FilterAll",
"en": "All",
"tr": "Tümü"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.FilterWith",
"en": "WITH",
"tr": "VAR"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.FilterWithout",
"en": "WITHOUT",
"tr": "YOK"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.NoTablesFound",
"en": "No tables found",
"tr": "Tablo bulunamadı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.SelectDataSource",
"en": "Select a data source",
"tr": "Veri kaynağı seçin"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.SelectTablePrompt",
"en": "Select a table from the left",
"tr": "Soldan bir tablo seçin"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.SelectTableDescription",
"en": "You can manage CRUD endpoints for the selected table",
"tr": "Seçilen tablo için CRUD endpointlerini yönetebilirsiniz"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.DeleteAll",
"en": "Delete All",
"tr": "Tümünü Sil"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Regenerate",
"en": "Regenerate",
"tr": "Yeniden Oluştur"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.CreateCrudEndpoint",
"en": "Create CRUD Endpoint",
"tr": "CRUD Endpoint Oluştur"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.NoEndpointsYet",
"en": "No endpoints yet",
"tr": "Henüz endpoint yok"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.ClickToCreate",
"en": "Click the \"Create CRUD Endpoint\" button",
"tr": "\"CRUD Endpoint Oluştur\" butonuna tıklayın"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Disable",
"en": "Disable",
"tr": "Devre Dışı Bırak"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Enable",
"en": "Enable",
"tr": "Etkinleştir"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.TestDetails",
"en": "Test / Details",
"tr": "Test et / Detaylar"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Parameters",
"en": "Parameters",
"tr": "Parametreler"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.RequestBody",
"en": "Request Body (JSON)",
"tr": "Request Body (JSON)"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Sending",
"en": "Sending...",
"tr": "Gönderiliyor..."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Test",
"en": "Test",
"tr": "Test Et"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Clear",
"en": "Clear",
"tr": "Temizle"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.CsharpCode",
"en": "C# Code",
"tr": "C# Kodu"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.Copy",
"en": "Copy",
"tr": "Kopyala"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.ActiveCount",
"en": "active",
"tr": "aktif"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.InactiveCount",
"en": "inactive",
"tr": "devre dışı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.CrudEndpoints.EndpointSummary",
"en": "5 endpoints: GetList, GetById, Create, Update, Delete",
"tr": "5 endpoint: GetList, GetById, Create, Update, Delete"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Total",
"en": "Total",
"tr": "Toplam"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Successful",
"en": "Successful",
"tr": "Başarılı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Failed",
"en": "Failed",
"tr": "Başarısız"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Active",
"en": "Active",
"tr": "Aktif"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Passive",
"en": "Passive",
"tr": "Pasif"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.SearchPlaceholder",
"en": "Search service...",
"tr": "Servis ara..."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.FilterAll",
"en": "All",
"tr": "Tümü"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.FilterPending",
"en": "Pending",
"tr": "Bekliyor"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.NewService",
"en": "New Service",
"tr": "Yeni Servis"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.NoResults",
"en": "No results found",
"tr": "Sonuç bulunamadı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.NoServicesYet",
"en": "No services yet",
"tr": "Henüz servis yok"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.TryChangingFilter",
"en": "Try changing filter or search criteria.",
"tr": "Filtre veya arama kriterlerini değiştirmeyi deneyin."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.GetStarted",
"en": "Start by creating your first dynamic service.",
"tr": "İlk dinamik servisinizi oluşturmak için başlayın."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.CreateNewService",
"en": "Create New Service",
"tr": "Yeni Servis Oluştur"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.DeleteConfirm",
"en": "Are you sure you want to delete this service?",
"tr": "Bu servisi silmek istediğinizden emin misiniz?"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.DeleteError",
"en": "An error occurred while deleting the service",
"tr": "Servis silinirken hata oluştu"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.EditTooltip",
"en": "Edit",
"tr": "Düzenle"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.DeleteTooltip",
"en": "Delete",
"tr": "Sil"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.EditTitle",
"en": "Edit Service",
"tr": "Servis Düzenle"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.NewTitle",
"en": "New Service",
"tr": "Yeni Servis"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.EditSubtitle",
"en": "Edit the existing service",
"tr": "Mevcut servisi düzenleyin"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.NewSubtitle",
"en": "Create a new dynamic service",
"tr": "Yeni bir dynamic servis oluşturun"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.BackToServices",
"en": "Back to Services",
"tr": "Servislere Dön"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.CopyCode",
"en": "Copy Code",
"tr": "Kodu Kopyala"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.CodeCopied",
"en": "Code copied to clipboard",
"tr": "Kod panoya kopyalandı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.PleaseEnterCode",
"en": "Please enter code",
"tr": "Lütfen kod girin"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.Compiling",
"en": "Compiling...",
"tr": "Derleniyor..."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.TestCompile",
"en": "Test Compile",
"tr": "Derlemeyi Test Et"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.Publishing",
"en": "Publishing...",
"tr": "Yayınlanıyor..."
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.Publish",
"en": "Publish",
"tr": "Yayınla"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.CompileSuccess",
"en": "Compilation Successful",
"tr": "Derleme Başarılı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.CompileFailed",
"en": "Compilation Failed",
"tr": "Derleme Başarısız"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.Line",
"en": "Line",
"tr": "Satır"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.PublishFailed",
"en": "Publish Failed",
"tr": "Yayınlama Başarısız"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.ServiceSettings",
"en": "Service Settings",
"tr": "Servis Ayarları"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.ServiceName",
"en": "Service Name",
"tr": "Servis Adı"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.ServiceNamePlaceholder",
"en": "e.g. DynamicCustomerAppService",
"tr": "ör: DynamicCustomerAppService"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.ServiceNameRequired",
"en": "Service name is required",
"tr": "Servis adı zorunludur"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.DisplayName",
"en": "Display Name",
"tr": "Görünen Ad"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.DisplayNamePlaceholder",
"en": "e.g. Customer Management",
"tr": "ör: Müşteri Yönetimi"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.Description",
"en": "Description",
"tr": "Açıklama"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.DescriptionPlaceholder",
"en": "Short description of this service",
"tr": "Bu servisin kısa açıklaması"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.PrimaryEntityType",
"en": "Primary Entity Type",
"tr": "Ana Entity Türü"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.PrimaryEntityTypePlaceholder",
"en": "e.g. Customer",
"tr": "ör: Customer"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.IsActive",
"en": "Active",
"tr": "Aktif"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.CodeEditor",
"en": "C# Code Editor",
"tr": "C# Kod Editörü"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.LineCount",
"en": "Line:",
"tr": "Satır:"
},
{
"resourceName": "Platform",
"key": "App.DeveloperKit.DynamicServices.Editor.CharCount",
"en": "Char:",
"tr": "Karakter:"
} }
] ]
} }

View file

@ -328,7 +328,7 @@ const CrudEndpointManager: React.FC = () => {
<div className="bg-white rounded-lg border border-slate-200 p-6"> <div className="bg-white rounded-lg border border-slate-200 p-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div> <div>
<p className="text-sm font-medium text-slate-600 mb-1">Toplam Tablo</p> <p className="text-sm font-medium text-slate-600 mb-1">{translate('::App.DeveloperKit.CrudEndpoints.TotalTables')}</p>
<p className="text-3xl font-bold text-slate-900">{dbTables.length}</p> <p className="text-3xl font-bold text-slate-900">{dbTables.length}</p>
</div> </div>
<div className="p-3 rounded-lg bg-blue-100"> <div className="p-3 rounded-lg bg-blue-100">
@ -339,7 +339,7 @@ const CrudEndpointManager: React.FC = () => {
<div className="bg-white rounded-lg border border-slate-200 p-6"> <div className="bg-white rounded-lg border border-slate-200 p-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div> <div>
<p className="text-sm font-medium text-slate-600 mb-1">Endpoint Kurulu</p> <p className="text-sm font-medium text-slate-600 mb-1">{translate('::App.DeveloperKit.CrudEndpoints.EndpointInstalled')}</p>
<p className="text-3xl font-bold text-slate-900">{tablesWithEndpoints}</p> <p className="text-3xl font-bold text-slate-900">{tablesWithEndpoints}</p>
</div> </div>
<div className="p-3 rounded-lg bg-green-100"> <div className="p-3 rounded-lg bg-green-100">
@ -350,7 +350,7 @@ const CrudEndpointManager: React.FC = () => {
<div className="bg-white rounded-lg border border-slate-200 p-6"> <div className="bg-white rounded-lg border border-slate-200 p-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div> <div>
<p className="text-sm font-medium text-slate-600 mb-1">Aktif Endpoint</p> <p className="text-sm font-medium text-slate-600 mb-1">{translate('::App.DeveloperKit.CrudEndpoints.ActiveEndpoint')}</p>
<p className="text-3xl font-bold text-slate-900">{totalActiveEndpoints}</p> <p className="text-3xl font-bold text-slate-900">{totalActiveEndpoints}</p>
</div> </div>
<div className="p-3 rounded-lg bg-emerald-100"> <div className="p-3 rounded-lg bg-emerald-100">
@ -361,7 +361,7 @@ const CrudEndpointManager: React.FC = () => {
<div className="bg-white rounded-lg border border-slate-200 p-6"> <div className="bg-white rounded-lg border border-slate-200 p-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div> <div>
<p className="text-sm font-medium text-slate-600 mb-1">Veri Kaynagi</p> <p className="text-sm font-medium text-slate-600 mb-1">{translate('::App.DeveloperKit.CrudEndpoints.DataSource')}</p>
<p className="text-3xl font-bold text-slate-900">{dataSources.length}</p> <p className="text-3xl font-bold text-slate-900">{dataSources.length}</p>
</div> </div>
<div className="p-3 rounded-lg bg-purple-100"> <div className="p-3 rounded-lg bg-purple-100">
@ -387,7 +387,7 @@ const CrudEndpointManager: React.FC = () => {
{ds.code} {ds.code}
</option> </option>
))} ))}
{dataSources.length === 0 && <option value="">Yukleniyor...</option>} {dataSources.length === 0 && <option value="">{translate('::App.DeveloperKit.CrudEndpoints.Loading')}</option>}
</select> </select>
</div> </div>
@ -397,7 +397,7 @@ const CrudEndpointManager: React.FC = () => {
<FaSearch className="absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400 text-xs" /> <FaSearch className="absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400 text-xs" />
<input <input
type="text" type="text"
placeholder="Tablo ara..." placeholder={translate('::App.DeveloperKit.CrudEndpoints.SearchTable')}
value={tableSearch} value={tableSearch}
onChange={(e) => setTableSearch(e.target.value)} onChange={(e) => setTableSearch(e.target.value)}
className="w-full pl-7 pr-3 py-1.5 text-sm border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" className="w-full pl-7 pr-3 py-1.5 text-sm border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
@ -406,9 +406,9 @@ const CrudEndpointManager: React.FC = () => {
<div className="flex rounded-lg border border-slate-200 overflow-hidden text-xs font-medium"> <div className="flex rounded-lg border border-slate-200 overflow-hidden text-xs font-medium">
{(['all', 'with', 'without'] as const).map((f) => { {(['all', 'with', 'without'] as const).map((f) => {
const labels = { const labels = {
all: `Tümü (${dbTables.length})`, all: `${translate('::App.DeveloperKit.CrudEndpoints.FilterAll')} (${dbTables.length})`,
with: `VAR (${dbTables.filter((t) => allEndpointCount(t.tableName) > 0).length})`, with: `${translate('::App.DeveloperKit.CrudEndpoints.FilterWith')} (${dbTables.filter((t) => allEndpointCount(t.tableName) > 0).length})`,
without: `YOK (${dbTables.filter((t) => allEndpointCount(t.tableName) === 0).length})`, without: `${translate('::App.DeveloperKit.CrudEndpoints.FilterWithout')} (${dbTables.filter((t) => allEndpointCount(t.tableName) === 0).length})`,
} }
const active = crudFilter === f const active = crudFilter === f
return ( return (
@ -437,11 +437,11 @@ const CrudEndpointManager: React.FC = () => {
{loadingTables ? ( {loadingTables ? (
<div className="flex items-center justify-center p-8 text-slate-400"> <div className="flex items-center justify-center p-8 text-slate-400">
<FaSyncAlt className="animate-spin mr-2" /> <FaSyncAlt className="animate-spin mr-2" />
<span className="text-sm">Yukleniyor...</span> <span className="text-sm">{translate('::App.DeveloperKit.CrudEndpoints.Loading')}</span>
</div> </div>
) : filteredTables.length === 0 ? ( ) : filteredTables.length === 0 ? (
<div className="p-6 text-center text-slate-400 text-sm"> <div className="p-6 text-center text-slate-400 text-sm">
{selectedDataSource ? 'Tablo bulunamadi' : 'Veri kaynagi secin'} {selectedDataSource ? translate('::App.DeveloperKit.CrudEndpoints.NoTablesFound') : translate('::App.DeveloperKit.CrudEndpoints.SelectDataSource')}
</div> </div>
) : ( ) : (
Object.entries(tablesBySchema).map(([schema, tables]) => ( Object.entries(tablesBySchema).map(([schema, tables]) => (
@ -498,9 +498,9 @@ const CrudEndpointManager: React.FC = () => {
{!selectedTable ? ( {!selectedTable ? (
<div className="flex-1 flex flex-col items-center justify-center text-slate-400 p-8"> <div className="flex-1 flex flex-col items-center justify-center text-slate-400 p-8">
<FaDatabase className="text-4xl mb-3 text-slate-200" /> <FaDatabase className="text-4xl mb-3 text-slate-200" />
<p className="text-base font-medium">Soldan bir tablo secin</p> <p className="text-base font-medium">{translate('::App.DeveloperKit.CrudEndpoints.SelectTablePrompt')}</p>
<p className="text-sm mt-1"> <p className="text-sm mt-1">
Secilen tablo icin CRUD endpointlerini yonetebilirsiniz {translate('::App.DeveloperKit.CrudEndpoints.SelectTableDescription')}
</p> </p>
</div> </div>
) : ( ) : (
@ -527,7 +527,7 @@ const CrudEndpointManager: React.FC = () => {
) : ( ) : (
<FaTrash /> <FaTrash />
)} )}
Tumunu Sil {translate('::App.DeveloperKit.CrudEndpoints.DeleteAll')}
</button> </button>
)} )}
<button <button
@ -541,8 +541,8 @@ const CrudEndpointManager: React.FC = () => {
<FaBolt /> <FaBolt />
)} )}
{selectedTableEndpoints.length > 0 {selectedTableEndpoints.length > 0
? 'Yeniden Olustur' ? translate('::App.DeveloperKit.CrudEndpoints.Regenerate')
: 'CRUD Endpoint Olustur'} : translate('::App.DeveloperKit.CrudEndpoints.CreateCrudEndpoint')}
</button> </button>
</div> </div>
</div> </div>
@ -552,9 +552,9 @@ const CrudEndpointManager: React.FC = () => {
{selectedTableEndpoints.length === 0 ? ( {selectedTableEndpoints.length === 0 ? (
<div className="flex flex-col items-center justify-center py-16 text-slate-400"> <div className="flex flex-col items-center justify-center py-16 text-slate-400">
<FaBolt className="text-3xl mb-3 text-slate-200" /> <FaBolt className="text-3xl mb-3 text-slate-200" />
<p className="font-medium">Henuz endpoint yok</p> <p className="font-medium">{translate('::App.DeveloperKit.CrudEndpoints.NoEndpointsYet')}</p>
<p className="text-sm mt-1"> <p className="text-sm mt-1">
"CRUD Endpoint Olustur" butonuna tiklayin {translate('::App.DeveloperKit.CrudEndpoints.ClickToCreate')}
</p> </p>
</div> </div>
) : ( ) : (
@ -573,7 +573,7 @@ const CrudEndpointManager: React.FC = () => {
<button <button
onClick={() => handleToggle(ep.id)} onClick={() => handleToggle(ep.id)}
disabled={togglingId === ep.id} disabled={togglingId === ep.id}
title={ep.isActive ? 'Devre disi birak' : 'Etkinlestir'} title={ep.isActive ? translate('::App.DeveloperKit.CrudEndpoints.Disable') : translate('::App.DeveloperKit.CrudEndpoints.Enable')}
className={`flex-shrink-0 text-xl transition-colors ${ className={`flex-shrink-0 text-xl transition-colors ${
ep.isActive ep.isActive
? 'text-green-500 hover:text-green-700' ? 'text-green-500 hover:text-green-700'
@ -613,7 +613,7 @@ const CrudEndpointManager: React.FC = () => {
<button <button
onClick={() => setExpandedEndpoint(isExpanded ? null : ep.id)} onClick={() => setExpandedEndpoint(isExpanded ? null : ep.id)}
className="p-1.5 text-slate-400 hover:text-slate-700 transition-colors" className="p-1.5 text-slate-400 hover:text-slate-700 transition-colors"
title="Test et / detaylar" title={translate('::App.DeveloperKit.CrudEndpoints.TestDetails')}
> >
{isExpanded ? ( {isExpanded ? (
<FaChevronDown className="text-xs" /> <FaChevronDown className="text-xs" />
@ -630,7 +630,7 @@ const CrudEndpointManager: React.FC = () => {
{getEndpointParameters(ep).length > 0 && ( {getEndpointParameters(ep).length > 0 && (
<div> <div>
<p className="text-xs font-semibold text-slate-600 mb-2"> <p className="text-xs font-semibold text-slate-600 mb-2">
Parametreler {translate('::App.DeveloperKit.CrudEndpoints.Parameters')}
</p> </p>
<div className="space-y-2"> <div className="space-y-2">
{getEndpointParameters(ep).map((param) => ( {getEndpointParameters(ep).map((param) => (
@ -670,7 +670,7 @@ const CrudEndpointManager: React.FC = () => {
{needsBody(ep) && ( {needsBody(ep) && (
<div> <div>
<p className="text-xs font-semibold text-slate-600 mb-2"> <p className="text-xs font-semibold text-slate-600 mb-2">
Request Body (JSON) {translate('::App.DeveloperKit.CrudEndpoints.RequestBody')}
</p> </p>
<textarea <textarea
value={getRequestBody(ep)} value={getRequestBody(ep)}
@ -698,7 +698,7 @@ const CrudEndpointManager: React.FC = () => {
) : ( ) : (
<FaPaperPlane /> <FaPaperPlane />
)} )}
{loadingEndpoints.has(ep.id) ? 'Gonderiliyor...' : 'Test Et'} {loadingEndpoints.has(ep.id) ? translate('::App.DeveloperKit.CrudEndpoints.Sending') : translate('::App.DeveloperKit.CrudEndpoints.Test')}
</button> </button>
{testResult && ( {testResult && (
<button <button
@ -711,7 +711,7 @@ const CrudEndpointManager: React.FC = () => {
} }
className="text-xs text-slate-500 hover:text-slate-700 px-2 py-1.5" className="text-xs text-slate-500 hover:text-slate-700 px-2 py-1.5"
> >
Temizle {translate('::App.DeveloperKit.CrudEndpoints.Clear')}
</button> </button>
)} )}
</div> </div>
@ -768,12 +768,12 @@ const CrudEndpointManager: React.FC = () => {
{ep.csharpCode && ( {ep.csharpCode && (
<div> <div>
<div className="flex items-center justify-between mb-1"> <div className="flex items-center justify-between mb-1">
<p className="text-xs font-semibold text-slate-600">C# Kodu</p> <p className="text-xs font-semibold text-slate-600">{translate('::App.DeveloperKit.CrudEndpoints.CsharpCode')}</p>
<button <button
onClick={() => navigator.clipboard.writeText(ep.csharpCode)} onClick={() => navigator.clipboard.writeText(ep.csharpCode)}
className="text-xs text-slate-400 hover:text-slate-700 flex items-center gap-1" className="text-xs text-slate-400 hover:text-slate-700 flex items-center gap-1"
> >
<FaCopy /> Kopyala <FaCopy /> {translate('::App.DeveloperKit.CrudEndpoints.Copy')}
</button> </button>
</div> </div>
<pre className="text-xs bg-slate-800 text-green-300 rounded-lg p-3 overflow-x-auto max-h-48 font-mono"> <pre className="text-xs bg-slate-800 text-green-300 rounded-lg p-3 overflow-x-auto max-h-48 font-mono">
@ -795,11 +795,11 @@ const CrudEndpointManager: React.FC = () => {
<div className="border-t border-slate-200 px-2 py-1 bg-slate-50 flex items-center gap-4 text-xs text-slate-500"> <div className="border-t border-slate-200 px-2 py-1 bg-slate-50 flex items-center gap-4 text-xs text-slate-500">
<span className="flex items-center gap-1"> <span className="flex items-center gap-1">
<FaCheckCircle className="text-green-400" /> <FaCheckCircle className="text-green-400" />
{selectedTableEndpoints.filter((e) => e.isActive).length} aktif {selectedTableEndpoints.filter((e) => e.isActive).length} {translate('::App.DeveloperKit.CrudEndpoints.ActiveCount')}
</span> </span>
<span>{selectedTableEndpoints.filter((e) => !e.isActive).length} devre disi</span> <span>{selectedTableEndpoints.filter((e) => !e.isActive).length} {translate('::App.DeveloperKit.CrudEndpoints.InactiveCount')}</span>
<span className="ml-auto"> <span className="ml-auto">
5 endpoint: GetList, GetById, Create, Update, Delete {translate('::App.DeveloperKit.CrudEndpoints.EndpointSummary')}
</span> </span>
</div> </div>
)} )}

View file

@ -110,7 +110,7 @@ const DynamicServiceEditor: React.FC = () => {
const handleTestCompile = async () => { const handleTestCompile = async () => {
if (!code.trim()) { if (!code.trim()) {
alert('Lütfen kod girin') alert(translate('::App.DeveloperKit.DynamicServices.Editor.PleaseEnterCode'))
return return
} }
try { try {
@ -121,7 +121,7 @@ const DynamicServiceEditor: React.FC = () => {
} catch (error: any) { } catch (error: any) {
setCompileResult({ setCompileResult({
success: false, success: false,
errorMessage: error.response?.data?.message || 'Derleme sırasında hata oluştu', errorMessage: error.response?.data?.message || translate('::App.DeveloperKit.DynamicServices.Editor.CompileError'),
compilationTimeMs: 0, compilationTimeMs: 0,
hasWarnings: false, hasWarnings: false,
errors: [], errors: [],
@ -163,7 +163,7 @@ const DynamicServiceEditor: React.FC = () => {
} catch (error: any) { } catch (error: any) {
setPublishResult({ setPublishResult({
success: false, success: false,
errorMessage: error.response?.data?.message || 'Yayınlama sırasında hata oluştu', errorMessage: error.response?.data?.message || translate('::App.DeveloperKit.DynamicServices.Editor.PublishError'),
}) })
} finally { } finally {
setIsPublishing(false) setIsPublishing(false)
@ -172,10 +172,10 @@ const DynamicServiceEditor: React.FC = () => {
const copyCode = () => { const copyCode = () => {
navigator.clipboard.writeText(code) navigator.clipboard.writeText(code)
alert('Kod panoya kopyalandı') alert(translate('::App.DeveloperKit.DynamicServices.Editor.CodeCopied'))
} }
const pageTitle = id ? `Servis Düzenle` : `Yeni Servis` const pageTitle = id ? translate('::App.DeveloperKit.DynamicServices.Editor.EditTitle') : translate('::App.DeveloperKit.DynamicServices.Editor.NewTitle')
if (isLoading) { if (isLoading) {
return ( return (
@ -201,7 +201,7 @@ const DynamicServiceEditor: React.FC = () => {
className="flex items-center gap-2 text-slate-600 text-black px-4 py-2 rounded-lg hover:text-slate-700 transition-colors" className="flex items-center gap-2 text-slate-600 text-black px-4 py-2 rounded-lg hover:text-slate-700 transition-colors"
> >
<FaArrowLeft className="w-3.5 h-3.5" /> <FaArrowLeft className="w-3.5 h-3.5" />
Servislere Dön {translate('::App.DeveloperKit.DynamicServices.Editor.BackToServices')}
</Link> </Link>
<div className="h-6 w-px bg-slate-300"></div> <div className="h-6 w-px bg-slate-300"></div>
<div className="flex items-center justify-center w-9 h-9 rounded-lg bg-gradient-to-r from-blue-500 to-purple-600 text-white shrink-0"> <div className="flex items-center justify-center w-9 h-9 rounded-lg bg-gradient-to-r from-blue-500 to-purple-600 text-white shrink-0">
@ -210,7 +210,7 @@ const DynamicServiceEditor: React.FC = () => {
<div> <div>
<h1 className="font-semibold text-slate-800 text-sm leading-tight">{pageTitle}</h1> <h1 className="font-semibold text-slate-800 text-sm leading-tight">{pageTitle}</h1>
<p className="text-xs text-slate-500 leading-tight"> <p className="text-xs text-slate-500 leading-tight">
{id ? 'Mevcut servisi düzenleyin' : 'Yeni bir dynamic servis oluşturun'} {id ? translate('::App.DeveloperKit.DynamicServices.Editor.EditSubtitle') : translate('::App.DeveloperKit.DynamicServices.Editor.NewSubtitle')}
</p> </p>
</div> </div>
</div> </div>
@ -222,7 +222,7 @@ const DynamicServiceEditor: React.FC = () => {
className="flex items-center gap-2 px-4 py-2 border border-slate-300 rounded-lg text-slate-600 hover:bg-slate-50 transition-colors" className="flex items-center gap-2 px-4 py-2 border border-slate-300 rounded-lg text-slate-600 hover:bg-slate-50 transition-colors"
> >
<FaCopy className="w-3.5 h-3.5" /> <FaCopy className="w-3.5 h-3.5" />
Kodu Kopyala {translate('::App.DeveloperKit.DynamicServices.Editor.CopyCode')}
</button> </button>
<button <button
@ -235,7 +235,7 @@ const DynamicServiceEditor: React.FC = () => {
) : ( ) : (
<FaPlay className="w-3.5 h-3.5" /> <FaPlay className="w-3.5 h-3.5" />
)} )}
{isCompiling ? 'Derleniyor...' : 'Test Compile'} {isCompiling ? translate('::App.DeveloperKit.DynamicServices.Editor.Compiling') : translate('::App.DeveloperKit.DynamicServices.Editor.TestCompile')}
</button> </button>
<button <button
@ -248,7 +248,7 @@ const DynamicServiceEditor: React.FC = () => {
) : ( ) : (
<FaSave className="w-3.5 h-3.5" /> <FaSave className="w-3.5 h-3.5" />
)} )}
{isPublishing ? 'Yayınlanıyor...' : 'Yayınla'} {isPublishing ? translate('::App.DeveloperKit.DynamicServices.Editor.Publishing') : translate('::App.DeveloperKit.DynamicServices.Editor.Publish')}
</button> </button>
</div> </div>
</div> </div>
@ -270,13 +270,13 @@ const DynamicServiceEditor: React.FC = () => {
)} )}
<div className="flex-1"> <div className="flex-1">
<span className="font-medium"> <span className="font-medium">
Derleme {compileResult.success ? 'Başarılı' : 'Başarısız'} {compileResult.success ? translate('::App.DeveloperKit.DynamicServices.Editor.CompileSuccess') : translate('::App.DeveloperKit.DynamicServices.Editor.CompileFailed')}
</span> </span>
{!compileResult.success && compileResult.errors && compileResult.errors.length > 0 && ( {!compileResult.success && compileResult.errors && compileResult.errors.length > 0 && (
<ul className="mt-1 space-y-0.5"> <ul className="mt-1 space-y-0.5">
{compileResult.errors.map((e, i) => ( {compileResult.errors.map((e, i) => (
<li key={i} className="text-xs font-mono"> <li key={i} className="text-xs font-mono">
[{e.code}] Satır {e.line}: {e.message} [{e.code}] {translate('::App.DeveloperKit.DynamicServices.Editor.Line')} {e.line}: {e.message}
</li> </li>
))} ))}
</ul> </ul>
@ -292,7 +292,7 @@ const DynamicServiceEditor: React.FC = () => {
<div className="flex items-start gap-3 rounded-lg border bg-red-50 border-red-200 text-red-800 px-4 py-3 text-sm"> <div className="flex items-start gap-3 rounded-lg border bg-red-50 border-red-200 text-red-800 px-4 py-3 text-sm">
<FaExclamationCircle className="w-4 h-4 mt-0.5 shrink-0 text-red-600" /> <FaExclamationCircle className="w-4 h-4 mt-0.5 shrink-0 text-red-600" />
<div> <div>
<span className="font-medium">Yayınlama Başarısız</span> <span className="font-medium">{translate('::App.DeveloperKit.DynamicServices.Editor.PublishFailed')}</span>
{publishResult.errorMessage && ( {publishResult.errorMessage && (
<p className="text-xs mt-0.5">{publishResult.errorMessage}</p> <p className="text-xs mt-0.5">{publishResult.errorMessage}</p>
)} )}
@ -307,12 +307,12 @@ const DynamicServiceEditor: React.FC = () => {
{/* Panel header */} {/* Panel header */}
<div className="flex items-center gap-2 pb-3 border-b border-slate-100"> <div className="flex items-center gap-2 pb-3 border-b border-slate-100">
<FaCog className="w-4 h-4 text-blue-500" /> <FaCog className="w-4 h-4 text-blue-500" />
<h2 className="font-semibold text-slate-700 text-sm">Servis Ayarları</h2> <h2 className="font-semibold text-slate-700 text-sm">{translate('::App.DeveloperKit.DynamicServices.Editor.ServiceSettings')}</h2>
</div> </div>
{/* Servis Adı */} {/* Servis Adı */}
<div> <div>
<label className="block text-sm font-medium text-slate-700 mb-1">Servis Adı</label> <label className="block text-sm font-medium text-slate-700 mb-1">{translate('::App.DeveloperKit.DynamicServices.Editor.ServiceName')}</label>
<input <input
type="text" type="text"
value={serviceName} value={serviceName}
@ -320,53 +320,53 @@ const DynamicServiceEditor: React.FC = () => {
setServiceName(e.target.value) setServiceName(e.target.value)
setSubmitted(false) setSubmitted(false)
}} }}
placeholder="ör: DynamicCustomerAppService" placeholder={translate('::App.DeveloperKit.DynamicServices.Editor.ServiceNamePlaceholder')}
className={`w-full px-3 py-2 border rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors ${ className={`w-full px-3 py-2 border rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors ${
serviceNameError ? 'border-red-500 bg-red-50' : 'border-slate-300' serviceNameError ? 'border-red-500 bg-red-50' : 'border-slate-300'
}`} }`}
/> />
{serviceNameError && <p className="text-red-500 text-xs mt-1">Servis adı zorunludur</p>} {serviceNameError && <p className="text-red-500 text-xs mt-1">{translate('::App.DeveloperKit.DynamicServices.Editor.ServiceNameRequired')}</p>}
</div> </div>
{/* Görünen Ad */} {/* Görünen Ad */}
<div> <div>
<label className="block text-sm font-medium text-slate-700 mb-1">Görünen Ad</label> <label className="block text-sm font-medium text-slate-700 mb-1">{translate('::App.DeveloperKit.DynamicServices.Editor.DisplayName')}</label>
<input <input
type="text" type="text"
value={displayName} value={displayName}
onChange={(e) => setDisplayName(e.target.value)} onChange={(e) => setDisplayName(e.target.value)}
placeholder="ör: Müşteri Yönetimi" placeholder={translate('::App.DeveloperKit.DynamicServices.Editor.DisplayNamePlaceholder')}
className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/> />
</div> </div>
{/* Açıklama */} {/* Açıklama */}
<div> <div>
<label className="block text-sm font-medium text-slate-700 mb-1">ıklama</label> <label className="block text-sm font-medium text-slate-700 mb-1">{translate('::App.DeveloperKit.DynamicServices.Editor.Description')}</label>
<input <input
type="text" type="text"
value={description} value={description}
onChange={(e) => setDescription(e.target.value)} onChange={(e) => setDescription(e.target.value)}
placeholder="Bu servisin kısa açıklaması" placeholder={translate('::App.DeveloperKit.DynamicServices.Editor.DescriptionPlaceholder')}
className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/> />
</div> </div>
{/* Ana Entity Türü */} {/* Ana Entity Türü */}
<div> <div>
<label className="block text-sm font-medium text-slate-700 mb-1">Ana Entity Türü</label> <label className="block text-sm font-medium text-slate-700 mb-1">{translate('::App.DeveloperKit.DynamicServices.Editor.PrimaryEntityType')}</label>
<input <input
type="text" type="text"
value={primaryEntityType} value={primaryEntityType}
onChange={(e) => setPrimaryEntityType(e.target.value)} onChange={(e) => setPrimaryEntityType(e.target.value)}
placeholder="ör: Customer" placeholder={translate('::App.DeveloperKit.DynamicServices.Editor.PrimaryEntityTypePlaceholder')}
className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
/> />
</div> </div>
{/* Aktif */} {/* Aktif */}
<div> <div>
<label className="block text-sm font-medium text-slate-700 mb-1">Aktif</label> <label className="block text-sm font-medium text-slate-700 mb-1">{translate('::App.DeveloperKit.DynamicServices.Editor.IsActive')}</label>
<input <input
type="checkbox" type="checkbox"
checked={isActive} checked={isActive}
@ -383,12 +383,12 @@ const DynamicServiceEditor: React.FC = () => {
<div className="px-5 py-3 bg-slate-50 border-b border-slate-200 flex items-center justify-between"> <div className="px-5 py-3 bg-slate-50 border-b border-slate-200 flex items-center justify-between">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<FaCode className="w-4 h-4 text-slate-500" /> <FaCode className="w-4 h-4 text-slate-500" />
<h3 className="font-medium text-slate-700 text-sm">C# Kod Editörü</h3> <h3 className="font-medium text-slate-700 text-sm">{translate('::App.DeveloperKit.DynamicServices.Editor.CodeEditor')}</h3>
</div> </div>
<div className="flex items-center gap-2 text-xs text-slate-500"> <div className="flex items-center gap-2 text-xs text-slate-500">
<span>Satır: {code.split('\n').length}</span> <span>{translate('::App.DeveloperKit.DynamicServices.Editor.LineCount')} {code.split('\n').length}</span>
<span className="text-slate-300">|</span> <span className="text-slate-300">|</span>
<span>Karakter: {code.length}</span> <span>{translate('::App.DeveloperKit.DynamicServices.Editor.CharCount')} {code.length}</span>
</div> </div>
</div> </div>
<div style={{ height: '560px' }}> <div style={{ height: '560px' }}>

View file

@ -45,13 +45,13 @@ const DynamicServiceManager: React.FC = () => {
} }
const deleteService = async (serviceId: string) => { const deleteService = async (serviceId: string) => {
if (!confirm('Bu servisi silmek istediğinizden emin misiniz?')) return if (!confirm(translate('::App.DeveloperKit.DynamicServices.DeleteConfirm'))) return
try { try {
await dynamicServiceService.delete(serviceId) await dynamicServiceService.delete(serviceId)
await loadServices() await loadServices()
} catch (error) { } catch (error) {
console.error('Servis silinirken hata:', error) console.error('Servis silinirken hata:', error)
alert('Servis silinirken hata oluştu') alert(translate('::App.DeveloperKit.DynamicServices.DeleteError'))
} }
} }
@ -63,35 +63,35 @@ const DynamicServiceManager: React.FC = () => {
const stats = [ const stats = [
{ {
name: 'Toplam', name: translate('::App.DeveloperKit.DynamicServices.Total'),
value: totalServices, value: totalServices,
icon: FaCode, icon: FaCode,
color: 'text-purple-600', color: 'text-purple-600',
bgColor: 'bg-purple-100', bgColor: 'bg-purple-100',
}, },
{ {
name: 'Başarılı', name: translate('::App.DeveloperKit.DynamicServices.Successful'),
value: successServices, value: successServices,
icon: FaCheckCircle, icon: FaCheckCircle,
color: 'text-emerald-600', color: 'text-emerald-600',
bgColor: 'bg-emerald-100', bgColor: 'bg-emerald-100',
}, },
{ {
name: 'Başarısız', name: translate('::App.DeveloperKit.DynamicServices.Failed'),
value: failedServices, value: failedServices,
icon: FaTimesCircle, icon: FaTimesCircle,
color: 'text-red-600', color: 'text-red-600',
bgColor: 'bg-red-100', bgColor: 'bg-red-100',
}, },
{ {
name: 'Aktif', name: translate('::App.DeveloperKit.DynamicServices.Active'),
value: activeServices, value: activeServices,
icon: FaArrowUp, icon: FaArrowUp,
color: 'text-emerald-600', color: 'text-emerald-600',
bgColor: 'bg-blue-300', bgColor: 'bg-blue-300',
}, },
{ {
name: 'Pasif', name: translate('::App.DeveloperKit.DynamicServices.Passive'),
value: inactiveServices, value: inactiveServices,
icon: FaArrowDown, icon: FaArrowDown,
color: 'text-emerald-600', color: 'text-emerald-600',
@ -148,7 +148,7 @@ const DynamicServiceManager: React.FC = () => {
<FaSearch className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400" /> <FaSearch className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-400" />
<input <input
type="text" type="text"
placeholder="Servis ara..." placeholder={translate('::App.DeveloperKit.DynamicServices.SearchPlaceholder')}
value={searchTerm} value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)} onChange={(e) => setSearchTerm(e.target.value)}
className="w-full pl-10 pr-4 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" className="w-full pl-10 pr-4 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
@ -163,10 +163,10 @@ const DynamicServiceManager: React.FC = () => {
} }
className="px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" className="px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
> >
<option value="all">Tümü</option> <option value="all">{translate('::App.DeveloperKit.DynamicServices.FilterAll')}</option>
<option value="Success">Başarılı</option> <option value="Success">{translate('::App.DeveloperKit.DynamicServices.Successful')}</option>
<option value="Failed">Başarısız</option> <option value="Failed">{translate('::App.DeveloperKit.DynamicServices.Failed')}</option>
<option value="Pending">Bekliyor</option> <option value="Pending">{translate('::App.DeveloperKit.DynamicServices.FilterPending')}</option>
</select> </select>
</div> </div>
<div> <div>
@ -175,7 +175,7 @@ const DynamicServiceManager: React.FC = () => {
className="flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors" className="flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors"
> >
<FaPlus className="w-4 h-4" /> <FaPlus className="w-4 h-4" />
Yeni Servis {translate('::App.DeveloperKit.DynamicServices.NewService')}
</Link> </Link>
</div> </div>
<div> <div>
@ -244,14 +244,14 @@ const DynamicServiceManager: React.FC = () => {
service.id, service.id,
)} )}
className="p-2 text-slate-500 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors" className="p-2 text-slate-500 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors"
title="Düzenle" title={translate('::App.DeveloperKit.DynamicServices.EditTooltip')}
> >
<FaRegEdit className="w-4 h-4" /> <FaRegEdit className="w-4 h-4" />
</Link> </Link>
<button <button
onClick={() => deleteService(service.id)} onClick={() => deleteService(service.id)}
className="p-2 text-slate-500 hover:text-red-600 hover:bg-red-50 rounded transition-colors" className="p-2 text-slate-500 hover:text-red-600 hover:bg-red-50 rounded transition-colors"
title="Sil" title={translate('::App.DeveloperKit.DynamicServices.DeleteTooltip')}
> >
<FaTrashAlt className="w-4 h-4" /> <FaTrashAlt className="w-4 h-4" />
</button> </button>
@ -266,12 +266,12 @@ const DynamicServiceManager: React.FC = () => {
<FaCode className="w-8 h-8 text-slate-400" /> <FaCode className="w-8 h-8 text-slate-400" />
</div> </div>
<h3 className="text-lg font-medium text-slate-900 mb-2"> <h3 className="text-lg font-medium text-slate-900 mb-2">
{searchTerm || filterStatus !== 'all' ? 'Sonuç bulunamadı' : 'Henüz servis yok'} {searchTerm || filterStatus !== 'all' ? translate('::App.DeveloperKit.DynamicServices.NoResults') : translate('::App.DeveloperKit.DynamicServices.NoServicesYet')}
</h3> </h3>
<p className="text-slate-500 mb-6"> <p className="text-slate-500 mb-6">
{searchTerm || filterStatus !== 'all' {searchTerm || filterStatus !== 'all'
? 'Filtre veya arama kriterlerini değiştirmeyi deneyin.' ? translate('::App.DeveloperKit.DynamicServices.TryChangingFilter')
: 'İlk dinamik servisinizi oluşturmak için başlayın.'} : translate('::App.DeveloperKit.DynamicServices.GetStarted')}
</p> </p>
{!searchTerm && filterStatus === 'all' && ( {!searchTerm && filterStatus === 'all' && (
<Link <Link
@ -279,7 +279,7 @@ const DynamicServiceManager: React.FC = () => {
className="inline-flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors" className="inline-flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors"
> >
<FaPlus className="w-4 h-4" /> <FaPlus className="w-4 h-4" />
Yeni Servis Oluştur {translate('::App.DeveloperKit.DynamicServices.CreateNewService')}
</Link> </Link>
)} )}
</div> </div>