<1>kimlik doğrulayıcı uygulamanızla1>0> tarayın",
+ "mgmt.openid.newMfa.tokenRequiredValidation": "Belirteç gereklidir",
+ "mgmt.openid.newMfa.tokenmax6charValidation": "Belirteç en fazla 6 karakter olmalıdır",
+ "mgmt.openid.newMfa.tokenmin6charValidation": "Belirteç en az 6 karakter olmalıdır",
+ "mgmt.openid.newMfa.wrongOtpValidation": "Yanlış OTP. Tekrar deneyin",
+ "mgmt.scheduler.customJobsTitle": "Özel İşler",
+ "mgmt.scheduler.lastLogs": "Son günlükler",
+ "mgmt.scheduler.list.action.logs": "Günlükler",
+ "mgmt.scheduler.list.action.run": "Çalıştır",
+ "mgmt.scheduler.list.scheduleTitle": "Program",
+ "mgmt.scheduler.list.status.lastRunExitedOn": "Son çalışma aşağıdaki hata ile sonlandı",
+ "mgmt.scheduler.list.status.lastRunFinishedOn": "Son çalışma sona erdi",
+ "mgmt.scheduler.list.status.lastRunFinishedOn.duration": "Süre",
+ "mgmt.scheduler.list.status.neverRan": "Hiç çalışmadı",
+ "mgmt.scheduler.list.status.runningSince": "Şu tarihten beri çalışıyor",
+ "mgmt.scheduler.oneTimeJobsTitle": "Tek Seferlik İşler",
+ "mgmt.scheduler.parityDiskJobsTitle": "Parite Disk İşleri",
+ "mgmt.servApp.container.urls.exposeText": "URL Sihirbazına hoş geldiniz. Bu arayüz, ServApp'inizi güvenli bir şekilde internete açmanıza yardımcı olacak yeni bir URL oluşturacaktır.",
+ "mgmt.servApp.container.urls.exposeTitle": "ServApp'i Aç",
+ "mgmt.servApp.exposeDesc": "containerName'i internete aç",
+ "mgmt.servApp.newContainer.reviewStartButton": "Gözden Geçir ve Başlat",
+ "mgmt.servApp.newServAppButton": "Yeni ServApp Başlat",
+ "mgmt.servApp.url": "Bu ServApp'e erişmek için bir URL oluşturun",
+ "mgmt.servApps.autoUpdateCheckbox": "Konteyneri Otomatik Güncelle",
+ "mgmt.servApps.container.delete.cronjob": "Cron İşlemi",
+ "mgmt.servApps.container.delete.done": "Tamamlandı",
+ "mgmt.servApps.container.delete.route": "Yol",
+ "mgmt.servApps.container.deleteService": "Hizmeti Sil",
+ "mgmt.servApps.container.deleteServiceStatus": "Silme durumu:",
+ "mgmt.servApps.container.network.linkContainerButton": "Konteyneri Bağla",
+ "mgmt.servApps.container.network.linkContainerTitle": "Konteyner ile Bağla",
+ "mgmt.servApps.container.overview.healthTitle": "Sağlık",
+ "mgmt.servApps.container.overview.imageTitle": "Görüntü",
+ "mgmt.servApps.container.overview.ipAddressTitle": "IP Adresi",
+ "mgmt.servApps.container.overview.settingsTitle": "Ayarlar",
+ "mgmt.servApps.container.protocols.errorOnlyCheckbox": "Sadece Hata",
+ "mgmt.servApps.container.selectWhatToDelete": "Silmek istediğinizi seçin:",
+ "mgmt.servApps.createNetwork.parentReqForMacvlan": "MACVLAN için üst arayüz gereklidir",
+ "mgmt.servApps.createdChip.createdLabel": "\"Oluşturuldu\"",
+ "mgmt.servApps.deadChip.deadLabel": "Ölü",
+ "mgmt.servApps.driver.none": "Hiçbiri",
+ "mgmt.servApps.exitedChip.exitedLabel": "Çıkıldı",
+ "mgmt.servApps.exportDockerBackupButton.exportDockerBackupLabel": "Docker Yedeğini Dışa Aktar",
+ "mgmt.servApps.networks.containerPortInput.containerPortLabel": "Konteyner Portu",
+ "mgmt.servApps.networks.containerotRunningWarning": "Bu konteyner çalışmıyor. Herhangi bir ayarları düzenlemek konteynerin yeniden başlamasına neden olacaktır.",
+ "mgmt.servApps.networks.exposePortsTitle": "Portları Aç",
+ "mgmt.servApps.networks.forcedSecurityWarning": "Bu konteynerin güvenliği zorunlu kılınmıştır. İnternete doğrudan herhangi bir port açamazsınız, lütfen bunun yerine Cosmos'ta bir URL oluşturun. Ayrıca onu köprü ağına bağlayamazsınız.",
+ "mgmt.servApps.networks.modeInput.modeLabel": "Ağ Modu",
+ "mgmt.servApps.networks.removedNetConnectedDisconnect": "Bağlantıyı Kes",
+ "mgmt.servApps.networks.removedNetConnectedEitherRecreate": "Yeniden oluşturabilir veya",
+ "mgmt.servApps.networks.removedNetConnectedError": "Kaldırılmış bir ağa bağlısınız:",
+ "mgmt.servApps.networks.updatePortsButton": "Portları Güncelle",
+ "mgmt.servApps.newChip.newLabel": "Yeni",
+ "mgmt.servApps.newContainer.chooseUrl": "URL Seç",
+ "mgmt.servApps.newContainer.cosmosOutdatedError": "Bu hizmet daha yeni bir Cosmos sürümü gerektirir. Bu hizmeti yüklemek için lütfen Cosmos'u güncelleyin.",
+ "mgmt.servApps.newContainer.customize": "{{container_name}} Özelleştir",
+ "mgmt.servApps.newContainer.networkSettingsTitle": "Ağ Ayarları",
+ "mgmt.servApps.newContainer.serviceNameInput": "Hizmet adınızı seçin",
+ "mgmt.servApps.notRunningWarning": "Bu konteyner çalışmıyor. Herhangi bir ayarları düzenlemek konteynerin yeniden başlamasına neden olacaktır.",
+ "mgmt.servApps.pausedChip.pausedLabel": "Duraklatıldı",
+ "mgmt.servApps.removingChip.removingLabel": "Kaldırılıyor",
+ "mgmt.servApps.restartingChip.restartingLabel": "Yeniden Başlatılıyor",
+ "mgmt.servApps.runningChip.runningLabel": "Çalışıyor",
+ "mgmt.servApps.startToEditInfo": "Düzenlemek için konteyneri başlatın",
+ "mgmt.servApps.volumes.containerNotRunningWarning": "Bu konteyner çalışmıyor. Herhangi bir ayarları düzenlemek konteynerin yeniden başlamasına neden olacaktır.",
+ "mgmt.servApps.volumes.newVolume.driverSelection.localChoice": "Yerel",
+ "mgmt.servApps.volumes.newVolumeTitle": "Yeni Hacim",
+ "mgmt.servapps.actionBar.kill": "Öldür",
+ "mgmt.servapps.actionBar.noUpdate": "Güncelleme Mevcut Değil. Zorla Çekmek için Tıklayın",
+ "mgmt.servapps.actionBar.pause": "Duraklat",
+ "mgmt.servapps.actionBar.recreate": "Yeniden Oluştur",
+ "mgmt.servapps.actionBar.restart": "Yeniden Başlat",
+ "mgmt.servapps.actionBar.start": "Başlat",
+ "mgmt.servapps.actionBar.stop": "Durdur",
+ "mgmt.servapps.actionBar.unpause": "Duraklatmayı Kaldır",
+ "mgmt.servapps.actionBar.update": "Güncelleme Mevcut",
+ "mgmt.servapps.actionBar.updating": "ServApp Güncelleniyor...",
+ "mgmt.servapps.compose": "Compose",
+ "mgmt.servapps.compose.installButton": "Yükle",
+ "mgmt.servapps.compose.installTitle": "Kurulum",
+ "mgmt.servapps.container.compose.createServiceButton": "Hizmet Oluştur - Önizleme",
+ "mgmt.servapps.container.compose.createServiceSuccess": "Hizmet Oluşturuldu!",
+ "mgmt.servapps.container.compose.editServiceTitle": "Hizmeti Düzenle",
+ "mgmt.servapps.containers.terminal.connectButton": "Bağlan",
+ "mgmt.servapps.containers.terminal.connectedToText": "Bağlandı ",
+ "mgmt.servapps.containers.terminal.disconnectButton": "Bağlantıyı Kes",
+ "mgmt.servapps.containers.terminal.disconnectedFromText": "Bağlantısı Kesildi ",
+ "mgmt.servapps.containers.terminal.mainprocessTty": "ana işlem TTY",
+ "mgmt.servapps.containers.terminal.newShellButton": "Yeni Kabuk",
+ "mgmt.servapps.containers.terminal.terminalNotInteractiveWarning": "Bu konteyner etkileşimli değil. Ana işleme bağlanmak istiyorsanız, ",
+ "mgmt.servapps.containers.terminal.ttyEnableButton": "TTY'yi Etkinleştir",
+ "mgmt.servapps.importComposeFileButton": "Compose Dosyasını İçe Aktar",
+ "mgmt.servapps.networks.attackNetwork": "Cosmos'a Bağlan",
+ "mgmt.servapps.networks.containers": "Konteynerler",
+ "mgmt.servapps.networks.list.bridge": "Köprü",
+ "mgmt.servapps.networks.list.host": "Ana Bilgisayar",
+ "mgmt.servapps.networks.list.macvlan": "MACVLAN",
+ "mgmt.servapps.networks.list.networkIpam": "IPAM ağ geçidi / maske",
+ "mgmt.servapps.networks.list.networkName": "Ağ Adı",
+ "mgmt.servapps.networks.list.networkNoIp": "IP Yok",
+ "mgmt.servapps.networks.list.networkproperties": "Özellikler",
+ "mgmt.servapps.networks.list.newNetwork": "Yeni Ağ",
+ "mgmt.servapps.networks.list.overlay": "Örtüşme",
+ "mgmt.servapps.networks.list.parentIf": "Ana Arabirim",
+ "mgmt.servapps.networks.list.subnet": "Alt Ağ (isteğe bağlı)",
+ "mgmt.servapps.networks.volumes": "Hacimler",
+ "mgmt.servapps.newContainer.devices.containerPathInput.containerPathLabel": "Konteyner Yolu",
+ "mgmt.servapps.newContainer.devices.hostPathInput.hostPathLabel": "Ana Bilgisayar Yolu",
+ "mgmt.servapps.newContainer.devicesTitle": "Cihazlar",
+ "mgmt.servapps.newContainer.env.envKeyInput.envKeyLabel": "Anahtar",
+ "mgmt.servapps.newContainer.env.envValueInput.envValueLabel": "Değer",
+ "mgmt.servapps.newContainer.env.keyNotUniqueError": "Çevre Değişkenleri benzersiz olmalıdır",
+ "mgmt.servapps.newContainer.envTitle": "Çevre Değişkenleri",
+ "mgmt.servapps.newContainer.forceSecureCheckbox.forceSecureLabel": "Güvenli konteyner zorla",
+ "mgmt.servapps.newContainer.imageUpdateWarning": "Görseli güncellediniz. Aşağıdaki düğmeye tıklamak, yeni görseli çekecek ve ancak o zaman konteyneri güncelleyebilirsiniz.",
+ "mgmt.servapps.newContainer.interactiveCheckbox.interactiveLabel": "Etkileşimli Mod",
+ "mgmt.servapps.newContainer.label.labelNotUniqueError": "Etiketler benzersiz olmalıdır",
+ "mgmt.servapps.newContainer.labelsTitle": "Etiketler",
+ "mgmt.servapps.newContainer.pullImageButton": "Yeni Görsel Çek",
+ "mgmt.servapps.newContainer.pullingImageStatus": "Yeni Görsel Çekiliyor...",
+ "mgmt.servapps.newContainer.restartPolicyInput.restartPolicyLabel": "Yeniden Başlatma Politikası",
+ "mgmt.servapps.newContainer.restartPolicyInput.restartPolicyPlaceholder": "Yeniden Başlatma Politikası",
+ "mgmt.servapps.newContainer.updateContainerButton": "Konteyneri Güncelle",
+ "mgmt.servapps.newContainer.volumes.bindInput": "Bağla",
+ "mgmt.servapps.newContainer.volumes.mountNotUniqueError": "Bağlantı noktaları benzersiz hedeflere sahip olmalıdır",
+ "mgmt.servapps.newContainer.volumes.newMountButton": "Yeni Bağlantı Noktası",
+ "mgmt.servapps.newContainer.volumes.updateVolumesButton": "Hacimleri Güncelle",
+ "mgmt.servapps.newContainer.volumesTitle": "Hacim Bağlantıları",
+ "mgmt.servapps.newContainerTitle": "Docker Konteyner Kurulumu",
+ "mgmt.servapps.overview": "Genel Bakış",
+ "mgmt.servapps.pasteComposeButton.pasteComposePlaceholder": "docker-compose.yml / cosmos-compose.json dosyanızı buraya yapıştırın veya dosya yükleme düğmesini kullanın.",
+ "mgmt.servapps.routeConfig.routeNotFound": "Rota bulunamadı",
+ "mgmt.servapps.routeConfig.setup": "Kurulum",
+ "mgmt.servapps.terminal": "Terminal",
+ "mgmt.servapps.updatesAvailableFor": "Güncelleştirmeler mevcut",
+ "mgmt.servapps.viewDetailsButton": "Detayları Görüntüle",
+ "mgmt.servapps.viewStackButton": "Yığını Görüntüle",
+ "mgmt.servapps.volumes.list.ScopeTitle": "Kapsam",
+ "mgmt.servapps.volumes.volumeName": "Hacim Adı",
+ "mgmt.storage.available": "mevcut",
+ "mgmt.storage.chown": "Bağlama klasörünün sahibini değiştir (isteğe bağlı, örn. 1000:1000)",
+ "mgmt.storage.configName.configNameLabel": "Yapılandırma Adı",
+ "mgmt.storage.confirmParityDeletion": "Bu pariteyi silmek istediğinizden emin misiniz?",
+ "mgmt.storage.confirmPwd.confirmPwdLabel": "Şifrenizi Onaylayın",
+ "mgmt.storage.dataDisksTitle": "Veri Diskleri",
+ "mgmt.storage.deviceTitle": "Cihaz",
+ "mgmt.storage.diskformatTitle": "Disk Formatı",
+ "mgmt.storage.disks": "Diskler",
+ "mgmt.storage.externalStorage": "Harici Depolama",
+ "mgmt.storage.externalStorageText": "Çok yakında. Bu özellik, dış bulut (Dropbox, Onedrive, ...) servisini sunucunuza bağlamanızı sağlayacak.",
+ "mgmt.storage.formatButton": "Formatla",
+ "mgmt.storage.formatDiskTitle": "Diski Formatla",
+ "mgmt.storage.formattingLog": "Formatlanıyor",
+ "mgmt.storage.list.fixText": "Düzelt",
+ "mgmt.storage.list.scrubText": "Ova",
+ "mgmt.storage.list.syncText": "Senkronize Et",
+ "mgmt.storage.merge.fsOptions.fsOptionsLabel": "Ek mergerFS seçenekleri (isteğe bağlı, virgülle ayrılmış)",
+ "mgmt.storage.mergeButton": "Birleştir",
+ "mgmt.storage.mergeText": "Diskleri birleştirmek üzeresiniz. Bu işlem güvenli ve geri alınabilir. Disklerdeki veriler kaybedilmeyecek, ancak içeriği dosya gezgininde tek bir disk olarak görüntülenebilir hale getirecektir.",
+ "mgmt.storage.mergeTitle": "Diskleri Birleştir",
+ "mgmt.storage.mount.permanent": "Kalıcı",
+ "mgmt.storage.mount.whatToMountLabel": "Bağlanacak olan",
+ "mgmt.storage.mountPath": "Bağlanma Yolu",
+ "mgmt.storage.mountPicker": "Hedefleri Seç",
+ "mgmt.storage.mountedAtText": "Bağlandı",
+ "mgmt.storage.mounts": "Bağlantılar",
+ "mgmt.storage.newMerge.newMergeButton": "Yeni Birleştirme Oluştur",
+ "mgmt.storage.newMount.newMountButton": "Yeni Bağlantı",
+ "mgmt.storage.optionsTitle": "Seçenekler",
+ "mgmt.storage.parityDisksTitle": "Parite Diskleri",
+ "mgmt.storage.parityTitle": "Parite",
+ "mgmt.storage.pathPrefixMntValidation": "Yol /mnt/ veya /var/mnt ile başlamalıdır",
+ "mgmt.storage.pathTitle": "Yol",
+ "mgmt.storage.raidText": "Çok yakında. Bu özellik, disklerinizle RAID grupları oluşturmanıza olanak tanıyacak.",
+ "mgmt.storage.raidTitle": "RAID",
+ "mgmt.storage.runningInsideContainerWarning": "### Cosmos'u bir Docker konteyneri içinde çalıştırıyorsunuz. Bu nedenle, disklerinize ve onların bilgilerine sınırlı erişimi olacak.",
+ "mgmt.storage.selectMin2": "En az 2 disk seçin",
+ "mgmt.storage.sharesText": "Çok yakında. Bu özellik, klasörleri farklı protokollerle (SMB, FTP, ...) paylaşmanıza olanak tanıyacak.",
+ "mgmt.storage.sharesTitle": "Paylaşımlar",
+ "mgmt.storage.smart.for": "S.M.A.R.T. için",
+ "mgmt.storage.smart.health": "Sağlık",
+ "mgmt.storage.smart.noSmartError": "Bu disk için S.M.A.R.T. verisi mevcut değil. Cosmos'u bir tür sanallaştırma veya konteynerizasyon arkasında çalıştırıyorsanız, verinin mevcut olmamasının nedeni muhtemelen budur.",
+ "mgmt.storage.smart.threshholdTooltip": "Bu değer sağlık yüzdesidir (%100 en iyisidir). Yanında, sabit diskinizi değiştirmenin acil olduğu eşiğin altındaki bir değer bulunur.",
+ "mgmt.storage.snapraid.addDatadisk": "Veri Diski Ekle",
+ "mgmt.storage.snapraid.createParity.Step1Text": "İlk olarak, parite disk(ler)ini seçin. Bir parite diski bir disk arızasına karşı koruma sağlar, iki parite diski iki disk arızasına karşı koruma sağlar, bu şekilde devam eder. Bu disklerin yalnızca parite için kullanılacağını ve veri depolama için kullanılamayacağını unutmayın. Parite diskleri, en büyük veri diski kadar büyük olmalı ve boş olmalıdır.",
+ "mgmt.storage.snapraid.createParity.Step2Text": "Parite disk(ler)i ile korumak istediğiniz veri disklerini seçin.",
+ "mgmt.storage.snapraid.createParity.Step3Text": "Senkronizasyon ve ovma aralıklarını ayarlayın. Senkronizasyon aralığı, paritenin güncellendiği zamandır. Ovma aralığı, paritenin hatalara karşı kontrol edildiği zamandır. Bu, CRONTAB sözdizimi ile saniyeler kullanılarak yapılan bir ayardır.",
+ "mgmt.storage.snapraid.createParity.newDisks": "Yeni Parite Diskleri",
+ "mgmt.storage.snapraid.createParity.step": "Adım",
+ "mgmt.storage.snapraid.createParityDisksButton": "Parite Diskleri Oluştur",
+ "mgmt.storage.snapraid.createParityInfo": "Parite diskleri oluşturmaya hazırlanıyorsunuz. Bu işlem güvenlidir ve geri alınabilir. Parite diskleri, verilerinizi disk arızalarından korumak için kullanılır. Bir parite diski oluştururken, korumak istediğiniz veri disklerini ekleyin. Sistem veya başka bir parite diski içeren bir disk eklemeyin.",
+ "mgmt.storage.snapraid.min1parity": "En az 1 parite diski seçin",
+ "mgmt.storage.snapraid.min2datadisks": "En az 2 veri diski seçin",
+ "mgmt.storage.snapraid.min3chars": "Ad en az 3 karakter olmalı",
+ "mgmt.storage.snapraid.notAlphanumeric": "Ad alfanümerik olmalı",
+ "mgmt.storage.snapraid.removeDatadisk": "Veri Diskini Kaldır",
+ "mgmt.storage.snapraid.scrubInterval.scrubIntervalLabel": "Tarama Aralığı",
+ "mgmt.storage.snapraid.storageParity": "Depolama Paritesi",
+ "mgmt.storage.snapraid.syncInterval.syncIntervalLabel": "Senkronizasyon Aralığı",
+ "mgmt.storage.startFormatLog": "{{disk}} diskini formatlama başlatılıyor...",
+ "mgmt.storage.syncScrubIntervalTitle": "Senkronizasyon/Tarama Aralıkları",
+ "mgmt.storage.typeTitle": "Tür",
+ "mgmt.storage.unMountDiskButton": "{{unMount}} diski",
+ "mgmt.storage.unMountDiskText": "{{disk}}{{mountpoint}} diskini {{unMount}} etmek üzeresiniz. Bu işlem, içerikleri dosya gezgininde görüntülenemeyecek hale getirecektir. Kalıcı {{unMount}} yeniden başlatmadan sonra devam edecektir.",
+ "mgmt.storage.unMountText": "{{mountpoint}} klasörünü {{unMount}} etmek üzeresiniz. Bu işlem, içerikleri dosya gezgininde görüntülenemeyecek hale getirecektir. Kalıcı {{unMount}} yeniden başlatmadan sonra devam edecektir.",
+ "mgmt.storage.unavailable": "kullanılamıyor",
+ "mgmt.storage.formatModalText": "{{disk}} diskini formatlamayı onaylamak için şifrenizi girin",
+ "mgmt.storage.vmWarning": "Cosmos'u bir Docker konteynerinde veya VM içinde çalıştırıyorsunuz. Bu nedenle, disklerinize ve onların bilgilerine yalnızca sınırlı erişim sağlanabilir. Güvenliğiniz için, disk yapılandırma, formatlama, RAID gibi potansiyel olarak yıkıcı işlemler devre dışı bırakılmıştır çünkü VM/Docker kurulumunuz değişken olabilir ve sizi yanlış yönlendirerek geri dönüşü olmayan hasarlara neden olabilir.",
+ "mgmt.urls.edit.advancedSettings.advancedSettingsInfo": "Bu ayarlar yalnızca ileri düzey kullanıcılar içindir. Ne yaptığınızı bilmiyorsanız lütfen değiştirmeyin.",
+ "mgmt.urls.edit.advancedSettings.filterIpWarning": "Bu ayar, belirtilen IP'lerden gelmeyen tüm istekleri filtreleyecektir. Bu, kurulumunuzun istemcinin gerçek IP'sini rapor etmesini gerektirir. Varsayılan olarak, yapacaktır, ancak bazı alışılmadık kurulumlar (örneğin, Windows üzerinde Docker/Cosmos kurulumu veya Cloudflare arkasında çalıştırma) Cosmos'un istemcinin gerçek IP'sini öğrenmesini engelleyecektir. Yukarıda 'Constellation ile Sınırla' seçimini yaptıysanız, Constellation IP'leri bu ayardan bağımsız olarak her zaman izin verilecektir.",
+ "mgmt.urls.edit.advancedSettings.hideFromDashboardCheckbox.hideFromDashboardLabel": "Gösterge Panelinden Gizle",
+ "mgmt.urls.edit.advancedSettings.overwriteHostHeaderInput.overwriteHostHeaderLabel": "Host Başlığını Geçersiz Kıl (başka bir sunucu/ip'den gelen istekleri zincir çözmek için kullanın)",
+ "mgmt.urls.edit.advancedSettings.overwriteHostHeaderInput.overwriteHostHeaderPlaceholder": "Host Başlığını Geçersiz Kıl",
+ "mgmt.urls.edit.advancedSettings.whitelistInboundIpInput.whitelistInboundIpLabel": "Gelen IP'leri ve/veya IP aralıklarını beyaz listeye ekle (virgülle ayrılmış)",
+ "mgmt.urls.edit.advancedSettings.whitelistInboundIpInput.whitelistInboundIpPlaceholder": "Gelen IP'leri ve/veya IP aralıklarını beyaz listeye ekle (virgülle ayrılmış)",
+ "mgmt.urls.edit.advancedSettingsTitle": "Gelişmiş Ayarlar",
+ "mgmt.urls.edit.basicSecurity.authEnabledCheckbox.authEnabledLabel": "Kimlik Doğrulama Gerekiyor",
+ "mgmt.urls.edit.basicSecurity.restrictToConstellationCheckbox.restrictToConstellationLabel": "Constellation VPN'e erişimi sınırla",
+ "mgmt.urls.edit.basicSecurity.smartShieldEnabledCheckbox.smartShieldEnabledLabel": "Akıllı Kalkan Koruması",
+ "mgmt.urls.edit.basicSecurityTitle": "Temel Güvenlik",
+ "mgmt.urls.edit.insecureHttpsCheckbox.insecureHttpsLabel": "Güvensiz HTTPS Hedefini Kabul Et (önerilmez)",
+ "mgmt.urls.edit.newUrlTitle": "yeni URL",
+ "mgmt.urls.edit.pathPrefixInputx.pathPrefixLabel": "Yol Ön Eki",
+ "mgmt.urls.edit.pathPrefixInputx.pathPrefixPlaceholder": "Yol Ön Eki",
+ "mgmt.urls.edit.sourceInfo": "Hedefinize erişmek için hangi URL'yi kullanmak istiyorsunuz?",
+ "mgmt.urls.edit.stripPathCheckbox.stripPathLabel": "Yol Ön Ekini Kaldır",
+ "mgmt.urls.edit.targetFolderPathInput.targetFolderPathLabel": "Hedef Klasör Yolu",
+ "mgmt.urls.edit.targetSettings.targetUrlInput.targetUrlLabel": "Hedef URL",
+ "mgmt.urls.edit.targetSettingsTitle": "Hedef Ayarları",
+ "mgmt.urls.edit.targetType.modeSelection.modeLabel": "Mod",
+ "mgmt.urls.edit.targetType.modeSelection.proxyChoice": "Vekil",
+ "mgmt.urls.edit.targetType.modeSelection.redirectChoice": "Yönlendirme",
+ "mgmt.urls.edit.targetType.modeSelection.servAppChoice": "ServApp - Docker Konteyneri",
+ "mgmt.urls.edit.targetType.modeSelection.spaChoice": "Tek Sayfa Uygulaması",
+ "mgmt.urls.edit.targetType.modeSelection.staticChoice": "Statik Klasör",
+ "mgmt.urls.edit.targetTypeInfo": "Bu rotayla neye erişmeye çalışıyorsunuz?",
+ "mgmt.urls.edit.targetTypeTitle": "Hedef Türü",
+ "mgmt.urls.edit.useHostCheckbox.useHostLabel": "Host'u Kullan",
+ "mgmt.urls.edit.usePathPrefixCheckbox.usePathPrefixLabel": "Yol Ön Ekini Kullan",
+ "mgmt.usermgmt.adminLabel": "Yönetici",
+ "mgmt.usermgmt.createUser.emailOptInput.emailOptLabel": "E-posta Adresi (İsteğe Bağlı)",
+ "mgmt.usermgmt.createUserTitle": "Kullanıcı Oluştur",
+ "mgmt.usermgmt.deleteUserConfirm": "Kullanıcıyı silmek istediğinize emin misiniz",
+ "mgmt.usermgmt.deleteUserTitle": "Kullanıcı Sil",
+ "mgmt.usermgmt.editEmail.emailInput.emailLabel": "E-posta Adresi",
+ "mgmt.usermgmt.editEmailText": "Bu formu {{user}}'ın E-postasını düzenlemek için kullanın.",
+ "mgmt.usermgmt.editEmailTitle": "E-posta Düzenle",
+ "mgmt.usermgmt.inviteExpiredLabel": "Davet Süresi Doldu",
+ "mgmt.usermgmt.invitePendingLabel": "Davet Beklemede",
+ "mgmt.usermgmt.inviteUser.emailSentAltShare": "Bu bağlantıyı gönder",
+ "mgmt.usermgmt.inviteUser.emailSentAltShareLink": "Alternatif olarak aşağıdaki bağlantıyı da paylaşabilirsiniz:",
+ "mgmt.usermgmt.inviteUser.emailSentAltShareTo": "için",
+ "mgmt.usermgmt.inviteUser.emailSentConfirmation": "Bir e-posta gönderildi",
+ "mgmt.usermgmt.inviteUser.emailSentwithLink": "bağlantı ile",
+ "mgmt.usermgmt.inviteUserText": "Bu formu yeni bir kullanıcıyı sisteme davet etmek için kullanın.",
+ "mgmt.usermgmt.inviteUserTitle": "Kullanıcı Davet Et",
+ "mgmt.usermgmt.lastLogin": "Son Giriş",
+ "mgmt.usermgmt.reset2faButton": "2FA'yı Sıfırla",
+ "mgmt.usermgmt.sendPasswordResetButton": "Şifre sıfırlama gönder",
+ "navigation.home.Avx": "AVX Destekleniyor",
+ "navigation.home.LetsEncryptEmailError": "Otomatik HTTPS Sertifikası için Let's Encrypt'i etkinleştirdiniz. Let's Encrypt için yapılandırmada kullanmak üzere bir e-posta adresi sağlamanız gerekmektedir.",
+ "navigation.home.LetsEncryptError": "Let's Encrypt yapılandırmanızda veya rotalarınızdan birinde hatalar var, lütfen onları en kısa sürede düzeltin:",
+ "navigation.home.availRam": "müs.",
+ "navigation.home.configChangeRequiresRestartError": "Yapılandırmada etkili olması için yeniden başlatma gerektiren değişiklikler yaptınız. Değişiklikleri uygulamak için lütfen Cosmos'u yeniden başlatın.",
+ "navigation.home.cosmosNotDockerHostError": "Cosmos sunucunuz docker ana bilgisayar ağ modunda çalışmıyor. Kurulumunuzu taşınmanız önerilir.",
+ "navigation.home.dbCantConnectError": "Veritabanına bağlanılamıyor, bu Cosmos'un birçok özelliğini etkileyecektir. Lütfen acilen düzeltin!",
+ "navigation.home.localhostnotRecommendedError": "Yapılandırmada ana bilgisayar adı olarak localhost veya 0.0.0.0 kullanıyorsunuz. Bir etki alanı adı veya IP kullanmanız önerilir.",
+ "navigation.home.network": "AĞ",
+ "navigation.home.newCosmosVersionError": "Cosmos'un yeni bir sürümü mevcut! En son özellikleri ve hata düzeltmelerini almak için lütfen en son sürüme güncelleyin.",
+ "navigation.home.noApps": "Yapılandırılmış uygulamanız yok. Yapılandırma paneline bazı uygulamalar ekleyin lütfen.",
+ "navigation.home.noAppsTitle": "Uygulama Yok",
+ "navigation.home.noAvx": "AVX Desteği Yok",
+ "navigation.home.rcvNet": "alıntı",
+ "navigation.home.trsNet": "gönd",
+ "navigation.home.usedRam": "kullanılan",
+ "navigation.market.applicationsTitle": "Uygulamalar",
+ "navigation.market.compose": "compose",
+ "navigation.market.filterDuplicateCheckbox": "Çiftleri Filtrele",
+ "navigation.market.image": "resim",
+ "navigation.market.newSources.additionalMarketsInfo": "Bu, App-Store'a ek 3. parti depolar eklemenize olanak tanır.",
+ "navigation.market.newSources.additionalMarketsInfo.href": "buradan başlayın",
+ "navigation.market.newSources.additionalMarketsInfo.moreInfo": "Yeni kaynaklar bulmak için,",
+ "navigation.market.repository": "depo",
+ "navigation.market.search": "{{count}} Uygulama Ara...",
+ "navigation.market.sources.addSourceButton": "Kaynak Ekle",
+ "navigation.market.sources.editSourcesButton": "Kaynaklar",
+ "navigation.market.sources.nameNotUniqueValidation": "Ad benzersiz olmalı",
+ "navigation.market.sources.urlRequiredValidation": "URL gereklidir",
+ "navigation.market.sourcesTitle": "Kaynakları Düzenle",
+ "navigation.market.startServAppButton": "ServApp Başlat",
+ "navigation.market.unofficialMarketTooltip": "Bu uygulama Cosmos Cloud App Store'da barındırılmıyor. Resmi olarak doğrulanmamış ve test edilmemiştir.",
+ "navigation.market.viewButton": "Görüntüle",
+ "navigation.monitoring.alerts.action.edit": "Alarmı Düzenle",
+ "navigation.monitoring.alerts.action.edit.actionTypeInput.actionTypeLabel": "Eylem Türü",
+ "navigation.monitoring.alerts.action.edit.conditionOperator.validation": "Koşul operatörü gereklidir",
+ "navigation.monitoring.alerts.action.edit.conditionValue.validation": "Koşul değeri gereklidir",
+ "navigation.monitoring.alerts.action.edit.period.validation": "Periyot gereklidir",
+ "navigation.monitoring.alerts.action.edit.severitySelection.severityLabel": "Ciddiyet",
+ "navigation.monitoring.alerts.action.edit.trackingMetric.validation": "İzleme metriği gereklidir",
+ "navigation.monitoring.alerts.actions.restart": "Uyarıya neden olan konteynerı yeniden başlat",
+ "navigation.monitoring.alerts.actions.restartActionInfo": "Yeniden başlatma eylemi, metriğe bağlı tüm Konteynerları yeniden başlatmayı deneyecektir. Bu, yalnızca bir kaynağa özgü metriklerde (örn. belirli bir konteynerin CPU'su) etkili olacaktır. Genel kullanılan CPU gibi genel metriklerde ise hiçbir şey yapmaz",
+ "navigation.monitoring.alerts.actions.sendEmail": "Bir E-posta Gönder",
+ "navigation.monitoring.alerts.actions.sendNotification": "Bir bildirim gönder",
+ "navigation.monitoring.alerts.actions.stop": "Uyarıya neden olan kaynakları durdur/ devre dışı bırak",
+ "navigation.monitoring.alerts.actions.stopActionInfo": "Durdurma eylemi, metriğe bağlı tüm kaynakları (örn. Konteynerlar, yollar, vb...) durdurmayı/devre dışı bırakmayı deneyecektir. Bu, yalnızca bir kaynağa özgü metriklerde (örn. belirli bir konteynerin CPU'su) etkili olacaktır. Genel kullanılan CPU gibi genel metriklerde ise hiçbir şey yapmaz",
+ "navigation.monitoring.alerts.actionsTitle": "Eylemler",
+ "navigation.monitoring.alerts.alertNameLabel": "Alarmın adı",
+ "navigation.monitoring.alerts.astTriggeredTitle": "Son Tetikleme",
+ "navigation.monitoring.alerts.conditionLabel": "Koşul, maksimum değerin bir yüzdesidir",
+ "navigation.monitoring.alerts.conditionOperatorLabel": "Tetikleme Koşul Operatörü",
+ "navigation.monitoring.alerts.conditionTitle": "Koşul",
+ "navigation.monitoring.alerts.conditionValueLabel": "Tetikleme Koşul Değeri",
+ "navigation.monitoring.alerts.newAlertButton": "Yeni Alarm",
+ "navigation.monitoring.alerts.periodLabel": "Periyot (metriğin ne sıklıkla kontrol edileceği)",
+ "navigation.monitoring.alerts.periodTitle": "Periyot",
+ "navigation.monitoring.alerts.resetToDefaultButton": "Varsayılana sıfırla",
+ "navigation.monitoring.alerts.throttleCheckbox.throttleLabel": "Kısıtlama (günde en fazla bir kez tetiklenir)",
+ "navigation.monitoring.alerts.trackingMetricLabel": "İzlenecek metrik",
+ "navigation.monitoring.alerts.trackingMetricTitle": "İzleme Metrik",
+ "navigation.monitoring.alertsTitle": "Uyarılar",
+ "navigation.monitoring.daily": "Günlük",
+ "navigation.monitoring.events.datePicker.fromLabel": "Başlangıç",
+ "navigation.monitoring.events.datePicker.toLabel": "Bitiş",
+ "navigation.monitoring.events.eventsFound": "{{count}} olay {{from}} ile {{to}} arasında bulundu",
+ "navigation.monitoring.events.eventsFound_other": "{{count}} olay {{from}} ile {{to}} arasında bulundu",
+ "navigation.monitoring.events.eventsFound_zero": "{{from}} ile {{to}} arasında olay bulunamadı",
+ "navigation.monitoring.events.loadMoreButton": "Daha fazla yükle",
+ "navigation.monitoring.events.searchInput.searchPlaceholder": "Ara (metin veya bson)",
+ "navigation.monitoring.eventsTitle": "Olaylar",
+ "navigation.monitoring.hourly": "Saatlik",
+ "navigation.monitoring.latest": "En Güncel",
+ "navigation.monitoring.proxyTitle": "Proxy",
+ "navigation.monitoring.resourceDashboard.averageNetworkTitle": "Konteynerler - Ortalama Ağ",
+ "navigation.monitoring.resourceDashboard.averageResourcesTitle": "Konteynerler - Ortalama Kaynaklar",
+ "navigation.monitoring.resourceDashboard.blockReasonTitle": "Engellenen İsteklerin Nedenleri",
+ "navigation.monitoring.resourceDashboard.blockedRequestsTitle": "Engellenen İstekler",
+ "navigation.monitoring.resourceDashboard.diskUsageTitle": "Disk Kullanımı",
+ "navigation.monitoring.resourceDashboard.reasonByBots": "Botlar",
+ "navigation.monitoring.resourceDashboard.reasonByGeo": "Coğrafi Konuma Göre (engellenen ülkeler)",
+ "navigation.monitoring.resourceDashboard.reasonByHostname": "Ana makineye göre (genellikle IP tarama tehdidi)",
+ "navigation.monitoring.resourceDashboard.reasonByRef": "Referansa göre",
+ "navigation.monitoring.resourceDashboard.reasonBySmartShield": "Akıllı Kalkan (zaman, boyut, kaba kuvvet, eşzamanlı istekler vb. çeşitli kötüye kullanım metrikleri). Potansiyel saldırılar durumunda kaynakları korumak için yasaklanmış IP'ler için engellemeyi içermez",
+ "navigation.monitoring.resourceDashboard.reasonByWhitelist": "IP Beyaz Listelerine göre (Constellation'a sınırlı olanlar dahil)",
+ "navigation.monitoring.resourceDashboard.requestsPerUrlTitle": "URL Başına İstekler",
+ "navigation.monitoring.resourceDashboard.requestsTitle": "İstek Kaynakları",
+ "navigation.monitoring.resourceDashboard.responsesTitle": "İstek Yanıtları",
+ "navigation.monitoring.resourcesTitle": "Kaynaklar",
+ "navigation.monitoringTitle": "Sunucu İzleme",
+ "newInstall.LetsEncrypt.cloudflareWarning": "Cloudflare kullanıyorsanız, DNS kaydının Proxied olarak ayarlanmadığından emin olun (turuncu bulut değil, gri bir bulut görmelisiniz). Aksi takdirde Cloudflare, Let's Encrypt'in alan adınızı doğrulamasına izin vermez.
Alternatif olarak, DNS challenge'ı da kullanabilirsiniz.",
+ "newInstall.LetsEncrypt.dnsChallengeInfo": "DNS challenge'ını etkinleştirdiniz. DNS sağlayıcınız için ortam değişkenlerini ayarladığınızdan emin olun. Şimdi etkinleştirebilirsiniz, ancak bu yükleyiciden sonra Cosmos'a erişmeyi denemeden önce API token'larınızı uygun şekilde ayarladığınızdan emin olun. Belgeleri burada görün: <1>https://go-acme.github.io/lego/dns/1>",
+ "newInstall.adminAccountText": "Sunucunuzu yönetmek için yerel bir yönetici hesabı oluşturun. E-posta isteğe bağlıdır ve bildirimler ve parola kurtarma için kullanılır.",
+ "newInstall.adminAccountTitle": "Yönetici Hesabı 🔑 (adım 4/4)",
+ "newInstall.applyRestartAction": "Uygula ve Yeniden Başlat",
+ "newInstall.checkInputValidation": "Tüm girdilere düzgün şekilde doldurduğunuzu kontrol edin",
+ "newInstall.cleanInstallCheckbox": "Temiz yükleme (mevcut yapılandırma dosyalarını kaldır)",
+ "newInstall.dbConnected": "Veritabanı bağlı.",
+ "newInstall.dbInstalling": "Veritabanı Yükleniyor...",
+ "newInstall.dbNotConnected": "Veritabanı bağlı değil!",
+ "newInstall.dbSelection.createChoice": "Otomatik olarak güvenli bir veritabanı oluştur (önerilir)",
+ "newInstall.dbSelection.dbLabel": "Seçiminizi yapın",
+ "newInstall.dbSelection.disabledChoice": "Kullanıcı Yönetimi ve Arayüzünü Devre Dışı Bırak",
+ "newInstall.dbSelection.providedChoice": "Kendi veritabanı kimlik bilgilerini sağla",
+ "newInstall.dbText": "Cosmos, tüm verileri saklamak için bir MongoDB veritabanı kullanıyor. Bu isteğe bağlıdır, ancak Kimlik Doğrulama ve arayüz veritabanı olmadan çalışmaz.",
+ "newInstall.dbTitle": "Veritabanı 🗄️ (adım 2/4)",
+ "newInstall.dbUrlInput.dbUrlLabel": "Veritabanı URL'si",
+ "newInstall.dockerAvail": "Docker yüklü ve çalışıyor.",
+ "newInstall.dockerChecking": "Docker Durumu Yeniden Kontrol Ediliyor...",
+ "newInstall.dockerNotConnected": "Docker bağlı değil! Docker bağlantınızı kontrol edin.
Docker çalıştırma komutunuza -v /var/run/docker.sock:/var/run/docker.sock
eklemeyi mi unuttunuz?
docker daemon başka bir yerde çalışıyorsa, lütfen docker çalıştırma komutunuza -e DOCKER_HOST=...
ekleyin.",
+ "newInstall.dockerTitle": "Docker 🐋 (adım 1/4)",
+ "newInstall.finishText": "Tebrikler! Cosmos'u başarıyla yüklediniz. Yönetici hesabı ile sunucunuza şimdi giriş yapabilirsiniz. Ana bilgisayar adını değiştirdiyseniz, yeniden başlattıktan sonra sunucunuza erişmek için bu URL'yi kullanmayı unutmayın. Sorun yaşıyorsanız, hata mesajları için günlükleri kontrol edin ve /config klasöründeki dosyayı düzenleyin. Hala başaramazsanız, lütfen <0>Discord sunucumuza0> katılın ve size yardımcı olmaktan memnuniyet duyarız!",
+ "newInstall.finishTitle": "Tamamla 🎉",
+ "newInstall.fqdnAutoLetsEncryptInfo": "Bir alan adı kullanıyormuşsunuz gibi görünüyor.
Let's Encrypt sizin için otomatik olarak bir sertifika oluşturabilir.",
+ "newInstall.hostnameInput.hostnameLabel": "Ana Bilgisayar Adı (Cosmos'a nasıl erişmek istersiniz?)",
+ "newInstall.hostnameInput.hostnamePlaceholder": "yourdomain.com, ip adresiniz veya localhost",
+ "newInstall.hostnamePointsToInfo": "Bu ana bilgisayar adı {{hostIp}} adresine işaret ediyor, bunun sunucu IP'niz olduğundan emin olun!",
+ "newInstall.httpsText": "HTTPS Sertifikalarını otomatik olarak sağlamak için Let's Encrypt kullanmanız önerilir. Bu, bu sunucuya işaret eden geçerli bir alan adı gerektirir. Bir tane yoksa, açılır menüde \"Kendi imzaladığı sertifika oluştur\" seçeneğini belirleyebilirsiniz. HTTPS'yi etkinleştirirseniz, bir sonraki yeniden başlatmadan sonra etkin olacaktır.",
+ "newInstall.httpsText.info": "Bilmiyorsanız, varsayılan değer olan \"cosmos.local\" bırakın. Tarayıcınızda \"http://cosmos.local\" yazarak Cosmos'a erişebileceksiniz!",
+ "newInstall.httpsText.warning": "*.local alan adları, cosmos.local gibi, yalnızca ev sunucuları için çalışır. Sunucunuz uzaktaysa (örneğin kiralık sunucu), sunucunun IP adresini veya alan adını kullanmanız gerekir.",
+ "newInstall.httpsTitle": "HTTPS 🌐 (adım 3/4)",
+ "newInstall.letsEncryptChoiceOnlyfqdnValidation": "Let's Encrypt yalnızca alan adlarını kabul eder",
+ "newInstall.linkToDocs": "Belgelere bağlantı",
+ "newInstall.loading": "Yükleniyor",
+ "newInstall.localAutoSelfSignedInfo": "Bir IP adresi veya yerel alan adı kullanıyor gibi görünüyorsunuz.
Yalnızca düz HTTP veya kendi imzaladığı sertifikaları kullanabilirsiniz (kendi imzaladığınız sertifikaları kullanmak ne yaptığınızı biliyorsanız kullanın, çünkü bazı uygulamalarla, özellikle IOS üzerinde sorunlara yol açar).",
+ "newInstall.previousButton": "Önceki",
+ "newInstall.privCertInput.privCertLabel": "Özel Sertifika",
+ "newInstall.pubCertInput.pubCertLabel": "Genel Sertifika",
+ "newInstall.setupUser.nicknameRootAdminNotAllowedValidation": "Kullanıcı adı 'admin' veya 'root' olamaz",
+ "newInstall.setupUser.passwordMustMatchValidation": "Şifreler eşleşmeli",
+ "newInstall.skipAction": "Atla",
+ "newInstall.sslEmailInput.sslEmailLabel": "Let's Encrypt E-posta",
+ "newInstall.usermgmt.disableButton": "Devre Dışı Bırak",
+ "newInstall.usermgmt.inviteUser.resendInviteButton": "Davetiyeyi Tekrar Gönder",
+ "newInstall.welcomeText": "Öncelikle, Cosmos'u denediğiniz için çok teşekkürler! Ve kurulum sihirbazına hoş geldiniz. Bu sihirbaz, Cosmos'un kurulumunda size rehberlik edecektir. Yaklaşık 2-3 dakika sürecek ve hazır olacaksınız.",
+ "newInstall.welcomeTitle": "Hoş Geldiniz! 💖",
+ "newInstall.whatIsCosmos": "Cosmos, uygulamaları çalıştırmak için Docker kullanıyor. Bu isteğe bağlıdır, ancak Docker'a bağlanamazsa Cosmos yalnızca ters proxy modunda çalışacaktır.",
+ "newInstall.wildcardLetsEncryptCheckbox.wildcardLetsEncryptLabel": "Wildcard Sertifikasını * için kullan.",
+ "newInstall.wildcardLetsEncryptError": "Let's Encrypt ile wildcard sertifikalarını etkinleştirdiniz. Bu yalnızca DNS meydan okumasını kullanırsanız çalışır! Lütfen DNS Sağlayıcısı metin girişini düzenleyin.",
+ "tooltip.route.SmartShield.enabled": "Akıllı Kalkan Etkin",
+ "tooltip.route.SmartShield.disabled": "Akıllı Kalkan Devre Dışı",
+ "tooltip.route.authentication.enabled": "Kimlik Doğrulama Etkin",
+ "tooltip.route.authentication.disabled": "Kimlik Doğrulama Devre Dışı",
+ "tooltip.route.throttling.enabled": "Sınırlama Etkin",
+ "tooltip.route.throttling.disabled": "Sınırlama Devre Dışı",
+ "tooltip.route.timeout.enabled": "zaman aşımı Etkin",
+ "tooltip.route.timeout.disabled": "zaman aşımı Devre Dışı",
+ "tooltip.route.move": "Öncelikli olan rotalar önce eşleştirilir",
+ "tooltip.route.tunnelWarn": "Bu rota ana Cosmos sunucunuza tünellenmiştir, buradan düzenlemeniz gerekiyor.",
+ "mgmt.urls.edit.tunnelViaSelection.tunnelViaLabel": "Başka bir Constellation Cosmos düğümü aracılığıyla tünel",
+ "mgmt.urls.edit.tunneledHostInput.tunneledHostLabel": "Tünel için ana bilgisayar adı (kullanıcının karşılaştığı tünel ana bilgisayar adı nedir)",
+ "mgmt.config.general.licenceInput.licenceLabel": "Lisans Anahtarı",
+ "mgmt.config.general.licenceInput.manageLicenceButton": "Lisansı Yönet",
+ "language.selectLanguage": "Dili Seç"
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 5628098..e9d1096 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "cosmos-server",
- "version": "0.16.0-unstable25",
+ "version": "0.16.0-unstable26",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "cosmos-server",
- "version": "0.16.0-unstable25",
+ "version": "0.16.0-unstable26",
"dependencies": {
"@ant-design/colors": "^6.0.0",
"@ant-design/icons": "^4.7.0",
@@ -27,10 +27,12 @@
"apexcharts": "^3.35.5",
"bcryptjs": "^2.4.3",
"browserslist": "^4.21.7",
+ "claude-ai": "^1.2.2",
"date-fns": "^2.30.0",
"dayjs": "^1.11.10",
"dot": "^1.1.3",
"express": "^4.18.2",
+ "flag-icons": "^7.2.3",
"formik": "^2.2.9",
"framer-motion": "^7.3.6",
"history": "^5.3.0",
@@ -5013,6 +5015,14 @@
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
"integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
},
+ "node_modules/claude-ai": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/claude-ai/-/claude-ai-1.2.2.tgz",
+ "integrity": "sha512-/4NWVJvlT5+jiFxuXq6HUxFW2bN3fyaXbL2cJNF1u5vpNE/C4WkFO2O50KqwFYeeuo4PsamUbFPx6bAdLbk9RA==",
+ "dependencies": {
+ "isomorphic-fetch": "^3.0.0"
+ }
+ },
"node_modules/cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
@@ -6592,6 +6602,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/flag-icons": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/flag-icons/-/flag-icons-7.2.3.tgz",
+ "integrity": "sha512-X2gUdteNuqdNqob2KKTJTS+ZCvyWeLCtDz9Ty8uJP17Y4o82Y+U/Vd4JNrdwTAjagYsRznOn9DZ+E/Q52qbmqg=="
+ },
"node_modules/flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
@@ -7689,6 +7704,15 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
+ "node_modules/isomorphic-fetch": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz",
+ "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==",
+ "dependencies": {
+ "node-fetch": "^2.6.1",
+ "whatwg-fetch": "^3.4.1"
+ }
+ },
"node_modules/jest-diff": {
"version": "29.5.0",
"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
@@ -10876,6 +10900,11 @@
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="
+ },
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
diff --git a/package.json b/package.json
index 89d9959..5c53fc0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "cosmos-server",
- "version": "0.16.0-unstable26",
+ "version": "0.16.0-unstable27",
"description": "",
"main": "test-server.js",
"bugs": {
@@ -31,6 +31,7 @@
"dayjs": "^1.11.10",
"dot": "^1.1.3",
"express": "^4.18.2",
+ "flag-icons": "^7.2.3",
"formik": "^2.2.9",
"framer-motion": "^7.3.6",
"history": "^5.3.0",
@@ -53,9 +54,9 @@
"react-dom": "^18.2.0",
"react-draggable": "^4.4.5",
"react-element-to-jsx-string": "^15.0.0",
+ "react-i18next": "^14.1.2",
"react-intersection-observer": "^9.5.2",
"react-lazyload": "^3.2.0",
- "react-i18next": "^14.1.2",
"react-material-ui-carousel": "^3.4.2",
"react-number-format": "^4.9.4",
"react-perfect-scrollbar": "^1.5.8",
diff --git a/readme.md b/readme.md
index 4b2854e..b4cebbf 100644
--- a/readme.md
+++ b/readme.md
@@ -4,7 +4,8 @@
Thanks to the sponsors:
-
+
+
diff --git a/src/metrics/index.go b/src/metrics/index.go
index df13473..06097fd 100644
--- a/src/metrics/index.go
+++ b/src/metrics/index.go
@@ -181,8 +181,6 @@ func PushSetMetric(key string, value int, def DataDef) {
if def.DecumulatePos && value < 0 {
value = 0
}
- } else {
- value = 0
}
}
diff --git a/src/status.go b/src/status.go
index a5d2b77..a803bd4 100644
--- a/src/status.go
+++ b/src/status.go
@@ -46,6 +46,11 @@ func StatusRoute(w http.ResponseWriter, req *http.Request) {
}
}
+ licenceValid := false
+ if utils.FBL != nil && utils.FBL.LValid {
+ licenceValid = true
+ }
+
json.NewEncoder(w).Encode(map[string]interface{}{
"status": "OK",
"data": map[string]interface{}{
@@ -74,7 +79,7 @@ func StatusRoute(w http.ResponseWriter, req *http.Request) {
"AVX": cpu.X86.HasAVX,
"LetsEncryptErrors": utils.LetsEncryptErrors,
"MonitoringDisabled": utils.GetMainConfig().MonitoringDisabled,
- "Licence": utils.FBL.LValid,
+ "Licence": licenceValid,
},
})
} else {
diff --git a/translate-all.sh b/translate-all.sh
new file mode 100644
index 0000000..0c0ad77
--- /dev/null
+++ b/translate-all.sh
@@ -0,0 +1,14 @@
+node translate.js cn
+node translate.js de
+node translate.js es
+node translate.js fr
+node translate.js hi
+node translate.js it
+node translate.js nl
+node translate.js pl
+node translate.js pt
+node translate.js ru
+node translate.js tr
+node translate.js kr
+node translate.js ar
+node translate.js en-FUNNYSHAKESPEARE
\ No newline at end of file
diff --git a/translate.js b/translate.js
new file mode 100644
index 0000000..a0ffb10
--- /dev/null
+++ b/translate.js
@@ -0,0 +1,146 @@
+const fs = require('fs').promises;
+const path = require('path');
+const { execSync } = require('child_process');
+const axios = require('axios');
+
+const API_KEY = process.env.API_KEY;
+const BATCH_SIZE = 50;
+
+async function readJsonFile(filePath) {
+ const data = await fs.readFile(filePath, 'utf8');
+ return JSON.parse(data);
+}
+
+async function writeJsonFile(filePath, data) {
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2));
+}
+
+async function translateBatch(batch, targetLang) {
+ const prompt = `Translate the following JSON key-value pairs from English to ${targetLang}. Maintain the JSON structure and only translate the values. Always return valid JSON:
+
+${JSON.stringify(batch, null, 2)}`;
+
+ try {
+ const res = await fetch('https://api.openai.com/v1/chat/completions', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${API_KEY}`,
+ },
+ body: JSON.stringify({
+ model: "gpt-4o",
+ max_tokens: 3000,
+ messages: [
+ {
+ role: "system",
+ content: "You are a translator for technical products.",
+ },
+ {
+ role: "user",
+ content: prompt,
+ },
+ ],
+ })
+ });
+
+ let rawText = await res.json();
+ // console.log(rawText);
+ rawText = rawText.choices[0].message.content;
+ let json = rawText.split('{').slice(1).join('{');
+ json = json.split('}').slice(0, -1).join('}');
+ console.log(json);
+ json = JSON.parse(`{${json}}`);
+
+ return json;
+ } catch (error) {
+ console.error('Error calling API:', error.message);
+ return null;
+ }
+}
+
+async function getModifiedKeys(filePath, since) {
+ try {
+ const output = execSync(`git diff ${since} -- ${filePath}`, { encoding: 'utf-8' });
+ const addedLines = output.split('\n').filter(line => line.startsWith('+') && line.includes(':'));
+ return addedLines.map(line => line.split(':')[0].replace(/["+]/g, '').trim());
+ } catch (error) {
+ console.error('Error getting modified keys:', error.message);
+ return [];
+ }
+}
+
+async function translateFile(sourcePath, targetPath, targetLang, all, since) {
+ const sourceData = await readJsonFile(sourcePath);
+ let targetData = {};
+
+ if (!all) {
+ try {
+ targetData = await readJsonFile(targetPath);
+ } catch (error) {
+ console.log('Target file not found. Creating a new one.');
+
+ // Create the target directory if it doesn't exist
+ const targetDir = path.dirname(targetPath);
+ await fs.mkdir(targetDir, { recursive: true });
+ }
+ }
+
+ let keysToTranslate;
+ if (all) {
+ keysToTranslate = Object.keys(sourceData);
+ } else if (since) {
+ keysToTranslate = await getModifiedKeys(sourcePath, since);
+ } else {
+ keysToTranslate = Object.keys(sourceData).filter(key => !(key in targetData));
+ }
+
+ for (let i = 0; i < keysToTranslate.length; i += BATCH_SIZE) {
+ const batch = Object.fromEntries(
+ keysToTranslate.slice(i, i + BATCH_SIZE).map(key => [key, sourceData[key]])
+ );
+
+ console.log(`Translating keys ${i + 1} to ${i + BATCH_SIZE} out of ${keysToTranslate.length}`);
+
+ const translatedBatch = await translateBatch(batch, targetLang);
+ if (translatedBatch) {
+ Object.assign(targetData, translatedBatch);
+ }
+ }
+
+ if (!all) {
+ // Remove keys that are not in the source file
+ Object.keys(targetData).forEach(key => {
+ if (!(key in sourceData)) {
+ delete targetData[key];
+ }
+ });
+ }
+
+ await writeJsonFile(targetPath, targetData);
+ console.log(`Translation completed. Output saved to ${targetPath}`);
+}
+
+async function main() {
+ const args = process.argv.slice(2);
+ const targetLang = args[0];
+ const all = args.includes('--all');
+ const sinceIndex = args.indexOf('--since');
+ const since = sinceIndex !== -1 ? args[sinceIndex + 1] : null;
+
+ if (!targetLang) {
+ console.error('Please provide a target language.');
+ process.exit(1);
+ }
+
+ if (all && since) {
+ console.error('--all and --since options are incompatible.');
+ process.exit(1);
+ }
+
+ const sourcePath = path.join('client/src/utils/locales', 'en', 'translation.json');
+ const targetPath = path.join('client/src/utils/locales', targetLang, 'translation.json');
+
+ await translateFile(sourcePath, targetPath, targetLang, all, since);
+}
+
+main().catch(console.error);
\ No newline at end of file