mirror of
https://github.com/hcengineering/platform.git
synced 2026-08-17 18:05:42 +02:00
* feat: API token management in workspace settings Add UI and backend support for creating, listing, and revoking API tokens scoped to workspaces. Includes owner-level workspace token visibility, OpenAPI documentation, Mongo/Postgres persistence, and i18n translations. Signed-off-by: Don Kendall <kendall@donkendall.com> * feat: enforce API token revocation at transactor level Embed apiTokenId in JWT extra field and add a per-token revocation cache (60s TTL) in the transactor REST handler. Revoked tokens are now rejected within ~60 seconds instead of remaining valid until JWT expiry. Adds checkApiTokenRevoked account service method for the transactor to query individual token revocation status. Signed-off-by: Don Kendall <kendall@donkendall.com> * feat: implement Phase 1 API token scopes (read/write/delete) Add coarse-grained scope enforcement for API tokens. Tokens can now be created with scopes ['read:*'], ['read:*','write:*'], or ['read:*','write:*','delete:*']. Existing tokens without scopes retain full access (backward compatible). - DB: v26 migration adds scopes TEXT[] column to api_tokens - Types: add scopes field to ApiToken and ApiTokenInfo - Operations: createApiToken accepts/validates/persists scopes, embeds in JWT via extra.scopes - Enforcement: withSession checks scopes against method; tx handler additionally requires delete:* for TxRemoveDoc - Client: createApiToken signature accepts optional scopes param - UI: scope preset dropdown in create popup (default: Read Only), permissions column in token list with i18n labels - Also fixes 3 pre-existing TS2322/TS2345 errors in operations.ts Signed-off-by: Don Kendall <kendall@donkendall.com> * test: add unit tests for API token scope enforcement - scopes.test.ts: 8 tests for hasScope() and getRequiredScope() logic - apiTokenScopes.test.ts: 7 tests for createApiToken scope validation (valid scopes, multiple scopes, no scopes backward compat, invalid format rejection, empty array rejection, domain-scope rejection) and listApiTokens scopes inclusion - Export hasScope/getRequiredScope from rpc.ts for testability Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: address review feedback — role restriction, locale parity, formatting - Restrict API token creation/revocation to AccountRole.User or higher (guests cannot use API tokens), per reviewer suggestion - Add 5 missing translation keys (ApiTokenPermissions, ApiTokenScopePreset, ApiTokenScopeReadOnly, ApiTokenScopeReadWrite, ApiTokenScopeFullAccess) to all non-en locale files to fix locale parity CI test - Fix prettier formatting in apiTokenScopes.test.ts - Rename local `extra` to `tokenExtra` in createApiToken to avoid shadowing the decoded token's `extra` field Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: address aonnikov architectural review feedback - rpc.ts: use system service token for checkApiTokenRevoked so the revocation check is not coupled to the user's potentially-revoked bearer token; systemAccountUuid + service:'server' ensures account service always accepts the call - ApiDocsSection.svelte: derive transactor base URL from login.metadata.LoginEndpoint (set on auth) instead of window.location.origin, which is not necessarily the transactor host - ApiTokenCreatePopup.svelte: replace manual translate() calls and themeStore language watch with DropdownLabelsIntl + DropdownIntlItem[], which handle i18n automatically; error state is now IntlString - General.svelte: remove legacy GenerateApiToken button, handler, and ApiTokenPopup import in favour of the new ApiTokens settings panel Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: formatting in ApiTokenPopup, apiTokenScopes test, and operations Signed-off-by: Don Kendall <kendall@donkendall.com> * fix: apply rushx fmt to pass CI formatting check Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix: restore (s as any) cast in server_http.ts removed by ESLint autofix Signed-off-by: Don Kendall <dkendall@ledoweb.com> * refactor(token): centralize API token revocation/expiry in verifyToken Address @aonnikov's review: the bespoke checkApiTokenRevoked RPC and the ad-hoc revocation cache in the transactor are replaced by a reusable verifyToken in server-token that checks signature, expiry, and (for revokable API tokens) revocation via a pluggable checker. - server-token: add verifyToken + isTokenExpired + setApiTokenRevocationChecker (the 'method to verify' metadata the plugin needs, without depending on the account client). Revocation cache (60s TTL) now lives here, reusable by any service (transactor, blob access, etc.). - account: the account is now authoritative — wrap() rejects revoked/expired API tokens, so any account method (selectWorkspace/getWorkspaceInfo/...) naturally 401s. Removed the redundant checkApiTokenRevoked method. - account-client: drop checkApiTokenRevoked. - transactor: withSession uses verifyToken; the registered checker reuses the existing getLoginInfoByToken instead of a dedicated boolean RPC. Scopes are parsed once and threaded through (no re-decode in the tx handler). - tests: verifyToken/isTokenExpired unit coverage. Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix(setting): derive REST API base from account-provided transactor endpoint Address @aonnikov: the REST API host must come from the transactor endpoint returned by the account service (the login endpoint, a ws(s):// URL), not be constructed from window.location. Convert ws->http and append /api/v1, matching the existing ServerManagerGeneral pattern. Signed-off-by: Don Kendall <dkendall@ledoweb.com> * i18n(setting): translate API token strings across all locales Address @ArtyomSavchenko: the new API token UI strings were left in English in non-en locales. Provide translations for ru/de/es/fr/it/pt/pt-br/zh/ja/cs/tr. The en/ru locale-parity test passes (the prior failure was an en/ru key mismatch, resolved by the develop merge). Signed-off-by: Don Kendall <dkendall@ledoweb.com> * style: wrap long lines to satisfy prettier (account utils import, ApiDocsSection) Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix(api-token): drop unenforceable scopes, harden the token lifecycle The scopes were only ever consulted in the transactor's REST handler, so they promised a boundary the platform did not keep: - the WebSocket transport decodes the token and never looks at scopes, so a read-only token could open a socket and issue any transaction; - even on the REST path, delete:* only matched a top-level TxRemoveDoc and was bypassed by nesting the removal in a TxApplyIf; - nothing stopped a scoped token from calling createApiToken and minting an unscoped one. Narrowing a token's rights has to happen in the pipeline, where it covers every transport, and that is a larger design than this feature. Until then a token carries its account's rights and says so, rather than displaying a restriction that does not hold. Scopes are removed end to end. What is kept is made to work: - API tokens can no longer create, list or revoke API tokens. Otherwise a leaked token renews itself and revokes the tokens meant to stop it. - Revocation fails closed. The account is the only authority on it, so an unreachable account now rejects the token instead of admitting a revoked one to whoever can keep the account busy. Verdicts stay trusted for the cache TTL so brief outages do not cut off healthy tokens. - The revocation cache is bounded and re-checks negative verdicts. - Revoking your own token no longer requires a role in its workspace, so leaving a workspace cannot strand a credential you can never revoke. - The per-account limit counts only usable tokens; revoked and expired ones are kept for the audit trail and used to lock out anyone rotating. - Rejected REST tokens are logged with a reason, since expired, revoked and unverifiable are one opaque 401 from outside. The unused listWorkspaceApiTokens/revokeWorkspaceApiToken pair is removed; it had no caller and no test. Tests cover the role restriction, the API-token guard, ownership on revoke, the limit accounting and fail-closed revocation. Removing any of those checks fails them. Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7 Signed-off-by: Don Kendall <dkendall@ledoweb.com> * fix(setting): correct the API token settings page - Moves the page from workspace settings to account settings. Tokens belong to the account: the page already lists them across every workspace, and creating one only needs the User role the account service checks, not Owner as the category required. - Surfaces failures. A failed revoke was logged to the console and the row re-rendered unchanged; loading workspaces could reject unhandled and leave an empty dropdown with no explanation. - Outside a secure context there is no clipboard API, so the OK button did nothing and the dialog had no way out but Cancel. It now closes, leaving the token selectable. - Replaces hardcoded English labels, adds aria-expanded on the docs disclosure and labels on the copy targets. - Fills in the Korean and Polish translations, which were the only two locales missing these keys, and drops the API access strings orphaned when this PR replaced the old Generate API token button. Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7 Signed-off-by: Don Kendall <dkendall@ledoweb.com> * chore: drop docs/openapi.yaml from the API token PR Unrelated to this feature and wrong for this repo: it documents a /_tokens minting service and a tools/mint-token CLI that do not exist here, uses reverse-proxy prefixes from a self-hosted deployment rather than the transactor's /api/v1 routes, and states that revocation is a future enhancement, which is what this PR implements. Nothing references it. REST API docs belong in their own change, generated against the routes that exist. Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7 Signed-off-by: Don Kendall <dkendall@ledoweb.com> --------- Signed-off-by: Don Kendall <kendall@donkendall.com> Signed-off-by: Don Kendall <dkendall@ledoweb.com>
287 lines
16 KiB
JSON
287 lines
16 KiB
JSON
{
|
||
"string": {
|
||
"Setting": "Ayar",
|
||
"Spaces": "Alanlar",
|
||
"Integrations": "Entegrasyonlar",
|
||
"Support": "Destek",
|
||
"Privacy": "Gizlilik",
|
||
"Terms": "Koşullar",
|
||
"AccountSettings": "Hesap ayarları",
|
||
"Categories": "Kategoriler",
|
||
"Delete": "Sil",
|
||
"ChangePassword": "Şifreyi değiştir",
|
||
"Disconnect": "Bağlantıyı kes",
|
||
"DisconnectAll": "Tümünün bağlantısını kes",
|
||
"Saving": "Kaydediliyor...",
|
||
"Saved": "Kaydedildi",
|
||
"Add": "Ekle",
|
||
"AddNew": "{type} Ekle",
|
||
"Proceed": "Devam et",
|
||
"NewEmail": "Yeni e-posta",
|
||
"SendConfirmation": "Onay kodu gönder",
|
||
"CodeSent": "Kod gönderildi. Lütfen aşağıdaki alana girin.",
|
||
"SendAgain": "Tekrar gönder",
|
||
"SendAgainIn": "Tekrar gönderilebilir:",
|
||
"Value": "Değer",
|
||
"Signout": "Çıkış yap",
|
||
"Settings": "Ayarlar",
|
||
"SelectWorkspace": "Çalışma alanı seç",
|
||
"InviteWorkspace": "Çalışma alanına davet et",
|
||
"DeleteStatus": "Durumu sil",
|
||
"DeleteStatusConfirm": "Bu durumu silmek istiyor musunuz?",
|
||
"Reconnect": "Yeniden bağlan",
|
||
"IntegrationDisabled": " devre dışı bırakıldı",
|
||
"IntegrationDisabledSetting": "Entegrasyon devre dışı bırakıldı",
|
||
"IntegrationDisabledDescr": "Entegrasyon devre dışı",
|
||
"IntegrationWith": "Entegrasyon: ",
|
||
"ClassSetting": "Sınıf ayarı",
|
||
"ClassSettingHint": "Ortak bir özellik veya niteliğe sahip, tür, tip veya kalite bakımından diğerlerinden farklı bir öğe kümesi veya kategorisi.",
|
||
"ClassProperties": "Sınıf özellikleri",
|
||
"Classes": "Sınıflar",
|
||
"Attributes": "Öznitelikler",
|
||
"DeleteAttribute": "Özniteliği sil",
|
||
"DeleteAttributeConfirm": "Bu özniteliği silmek istiyor musunuz?",
|
||
"DeleteAttributeExistConfirm": "Bu özniteliği silmek istiyor musunuz? Veriler kaybolacak",
|
||
"DeleteMixin": "Mixin'i Sil",
|
||
"DeleteMixinConfirm": "Bu mixin'i silmek istiyor musunuz?",
|
||
"DeleteMixinExistConfirm": "Bu mixin'i silmek istiyor musunuz? Veriler kullanılamaz olacak",
|
||
"Attribute": "Öznitelik",
|
||
"Custom": "Özel",
|
||
"Type": "Tip",
|
||
"WithTime": "Zamanla",
|
||
"DateMode": "Tarih modu",
|
||
"CreatingAttribute": "Öznitelik oluşturuluyor",
|
||
"EditAttribute": "Özniteliği düzenle",
|
||
"CreateEnum": "Enum oluştur",
|
||
"EditEnum": "Enum'u düzenle",
|
||
"Enums": "Enum'lar",
|
||
"EnumsSettingHint": "Ortak bir özellik veya niteliğe sahip, tür, tip veya kalite bakımından diğerlerinden farklı bir öğe kümesi veya kategorisi.",
|
||
"EnumTitle": "Enum başlığı",
|
||
"EnumsCount": "{count, plural, =1 {# seçenek} other {# seçenek}}",
|
||
"ProjectTypesCount": "{count, plural, =0 {Proje tipi yok} =1 {# proje tipi} other {# proje tipi}}",
|
||
"Options": "Seçenekler",
|
||
"EnterOptionTitle": "Seçenek başlığı girin",
|
||
"NewEnumDialogClose": "Bu diyalogu kapatmak istiyor musunuz?",
|
||
"NewEnumDialogCloseNote": "Tüm değişiklikler kaybolacak",
|
||
"NewValue": "Yeni değer",
|
||
"Leave": "Çalışma alanından ayrıl",
|
||
"LeaveDescr": "Çalışma alanından ayrılmak istediğinizden emin misiniz? Bu işlem geri alınamaz.",
|
||
"Members": "Üyeler",
|
||
"WorkspaceSettings": "Çalışma alanı ayarları",
|
||
"Select": "Seç",
|
||
"AddOwner": "Sahip ekle",
|
||
"ReadonlyGuest": "Salt okunur",
|
||
"Guest": "Misafir",
|
||
"User": "Kullanıcı",
|
||
"Maintainer": "Bakımcı",
|
||
"Owner": "Sahip",
|
||
"OwnerFirstName": "Sahibin Adı",
|
||
"OwnerLastName": "Sahibin Soyadı",
|
||
"Role": "Rol",
|
||
"FailedToSave": "Şifre güncellenemedi",
|
||
"ImportEnum": "Enum değerlerini içe aktar",
|
||
"ImportEnumCopy": "Enum değerlerini panodan kopyala",
|
||
"CreateMixin": "Mixin Oluştur",
|
||
"OldNames": "Eski değerler",
|
||
"NewClassName": "Yeni sınıf adı yazın veya önceki değerlerden seçin...",
|
||
"ShowAttribute": "Özniteliği göster",
|
||
"HideAttribute": "Özniteliği gizle",
|
||
"Visibility": "Görünürlük",
|
||
"Hidden": "Gizli",
|
||
"Configure": "Yapılandır",
|
||
"InviteSettings": "Davet ayarları",
|
||
"RoleCapabilitySettings": "Rol izinleri",
|
||
"DefaultInviteRoleForJoin": "Davet bağlantısı ile katıldıktan sonra atanacak varsayılan rol:",
|
||
"InviteLinkGeneratorRoles": "Davet bağlantısı oluşturabilecek kullanıcı rollarını seçin:",
|
||
"DefaultValue": "Varsayılan değer",
|
||
"SelectAValue": "Bir değer seç",
|
||
"DateOnly": "Sadece tarih",
|
||
"OnlyTime": "Sadece saat",
|
||
"DateAndTime": "Tarih ve saat",
|
||
"Configuration": "Yapılandırma",
|
||
"ConfigurationEnabled": "Etkin",
|
||
"ConfigurationDisabled": "Devre dışı",
|
||
"ConfigDisable": "Devre dışı bırak",
|
||
"ConfigEnable": "Etkinleştir",
|
||
"ConfigBeta": "Beta sürümü",
|
||
"Properties": "Özellikler",
|
||
"TaskTypes": "Görev tipleri",
|
||
"Automations": "Otomasyonlar",
|
||
"Collections": "Koleksiyonlar",
|
||
"ClassColon": "Sınıf:",
|
||
"SpaceTypes": "Alan tipleri",
|
||
"NewSpaceType": "Yeni alan tipi",
|
||
"SpaceTypeTitle": "Alan tipi başlığı",
|
||
"General": "Genel",
|
||
"Description": "Açıklama",
|
||
"CountSpaces": "{count, plural, =0 {Alan yok} =1 {# alan} other {# alan}}",
|
||
"Roles": "Roller",
|
||
"RoleName": "Rol adı",
|
||
"Permissions": "İzinler",
|
||
"Assignees": "Atananlar",
|
||
"DeleteRole": "Rolü sil",
|
||
"DeleteRoleConfirmation": "Bu rolü silmek istediğinizden emin misiniz? Bu role sahip tüm kullanıcılar izinlerini kaybedecek.",
|
||
"DeleteWorkspace": "Çalışma alanını sil",
|
||
"DeleteWorkspaceConfirm": "Bu çalışma alanını silmek istediğinizden emin misiniz? Siz ve diğer tüm üyeler bu çalışma alanına erişimi kaybedecek. Çalışma alanındaki tüm bilgiler kaybolacak. Bu işlem geri alınamaz. Devam etmek istiyor musunuz?",
|
||
"DeleteSpaceType": "Alan tipini sil",
|
||
"DeleteSpaceTypeConfirm": "Bu alan tipini silmek istediğinizden emin misiniz?",
|
||
"WorkspaceName": "Çalışma alanı adı",
|
||
"Workspace": "Çalışma alanı",
|
||
"OwnerOrMaintainerRequired": "Çalışma alanı Sahibi veya Bakımcısı olmanız gerekiyor",
|
||
"LastOwnerLeaveTitle": "Çalışma alanından ayrılamazsınız",
|
||
"LastOwnerLeaveMessage": "Bu çalışma alanının tek sahibisiniz. Ayrılmak için önce başka bir üyeye sahiplik yetkisi verin. Bu çalışma alanına artık kimsenin ihtiyacı yoksa, silmeyi de düşünebilirsiniz.",
|
||
"Backup": "Yedek",
|
||
"BackupLast": "Son yedekleme",
|
||
"BackupTotalSnapshots": "Toplam Anlık Görüntü",
|
||
"BackupTotalFiles": "Dosyalar",
|
||
"BackupSize": "Yedek boyutu",
|
||
"BackupLinkInfo": "wget veya curl gibi araçlarla özyinelemeli olarak indirilebilen bir yedekleme dizininin URL'si.",
|
||
"BackupBearerTokenInfo": "Yedeklemeye erişmek için bir bearer token gereklidir.",
|
||
"BackupSnapshots": "Yedek Anlık Görüntüleri",
|
||
"BackupFileDownload": "Dosya İndir",
|
||
"BackupFiles": "Yedek Dosyaları",
|
||
"BackupNoBackup": "Şu anda kullanılabilir yedek yok.",
|
||
"BackupDownloadAll": "Tam yedeği indir",
|
||
"BackupPreparingDownload": "Yedek hazırlanıyor…",
|
||
"BackupDownloadAllInfo": "Tüm yedek dosyalarını bilgisayarınızda saklayabileceğiniz tek bir .zip arşivi olarak indirin.",
|
||
"BackupCopyScript": "İndirme betiğini kopyala",
|
||
"BackupCopyToken": "Jetonu kopyala",
|
||
"BackupScriptInfo": "Tüm yedek dosyalarını curl ile indiren bir kabuk betiği. Kaydedip bir terminalde çalıştırın; yedek jetonunuzu ister, bu nedenle betikte hiçbir gizli bilgi saklanmaz.",
|
||
"BackupRestoreGuide": "Yedekleme ve geri yükleme kılavuzu",
|
||
"BackupRestoreGuideInfo": "Bu yedeği indirmek ve başka bir Huly örneğine geri yüklemek için adım adım talimatlar.",
|
||
"NonBackupedBlobs": "Yedeklenmemiş blob'lar",
|
||
"Calendar": "Takvim",
|
||
"StartOfTheWeek": "Haftanın başlangıcı",
|
||
"SystemSetupString": "Sistem Kurulumu ({day})",
|
||
"DefaultString": "Varsayılan ({day})",
|
||
"AddAttribute": "Öznitelik ekle",
|
||
"WorkspaceNamePattern": "İsim 40 karakter veya daha kısa, boş olmamalı ve özel karakterler (<, >, /) içermemelidir",
|
||
"Mailboxes": "Posta Kutuları",
|
||
"CreateMailbox": "Posta kutusu oluştur",
|
||
"CreateMailboxPlaceholder": "guzel-isim",
|
||
"MailboxNoDomains": "E-posta alan adları yapılandırılmamış",
|
||
"MailboxLimitReached": "Posta kutusu limitine ulaşıldı",
|
||
"MailboxErrorInvalidName": "Posta kutusu adı geçersiz",
|
||
"MailboxErrorDomainNotFound": "Alan adı bulunamadı",
|
||
"MailboxErrorNameRulesViolated": "Posta kutusu adı {minLen} ile {maxLen} karakter uzunluğunda olmalı",
|
||
"MailboxErrorMailboxExists": "Bu posta kutusu adı zaten kullanılıyor",
|
||
"MailboxErrorMailboxCountLimit": "Hesabınız için posta kutusu sayı limitine ulaşıldı",
|
||
"DeleteMailbox": "Posta kutusunu sil",
|
||
"MailboxDeleteConfirmation": "Bu posta kutusunu silmek istediğinizden emin misiniz?",
|
||
"DisablePermissions": "Rol tabanlı erişim kontrolünü devre dışı bırak",
|
||
"EnablePermissions": "Rol tabanlı erişim kontrolünü etkinleştir",
|
||
"DisablePermissionsConfirmation": "Rol tabanlı erişim kontrolünü devre dışı bırakmak istediğinizden emin misiniz? Tüm roller ve izinler devre dışı kalacak.",
|
||
"EnablePermissionsConfirmation": "Rol tabanlı erişim kontrolünü etkinleştirmek istediğinizden emin misiniz? Tüm roller ve izinler etkinleştirilecek.",
|
||
"BetaWarning": "Beta olarak etiketlenmiş modüller deneysel amaçlarla mevcuttur ve tamamen işlevsel olmayabilir. Şu anda kritik işler için beta özelliklere güvenmenizi önermiyoruz.",
|
||
"IntegrationFailed": "Entegrasyon oluşturulamadı",
|
||
"IntegrationError": "Lütfen tekrar deneyin veya sorun devam ederse destekle iletişime geçin",
|
||
"EmailIsUsed": "E-posta adresi başka bir hesap tarafından zaten kullanılıyor",
|
||
"Customize": "Özelleştir",
|
||
"GuestAccess": "Anonim misafirler",
|
||
"GuestAccessDescription": "Anonim kullanıcıların çalışma alanınızı salt okunur modda ziyaret etmesine izin verir",
|
||
"GuestSignUpDescription": "Anonim kullanıcıların çalışma alanınıza sınırlı düzenleme haklarıyla misafir olarak katılmasına izin verir",
|
||
"GuestChannelsDescription": "Misafirlerin katıldıktan sonra mesaj yazabileceği kanallar",
|
||
"GuestChannelsArrayLabel": "Kanalları seç",
|
||
"GuestSelectSpaces": "Alanları seç",
|
||
"GuestAutoJoinAvailableSpaces": "Otomatik katılım alanları",
|
||
"GuestAutoJoinAvailableSpacesHint": "Her uygulama kartının kendi « Otomatik katılım alanları » satırı vardır: misafirler etkinleştirildiğinde nereye ekleneceğini seçin. Değişiklikler hemen uygulanır.",
|
||
"GuestAnonymousVisibleSpaces": "Anonim için görünür alanlar",
|
||
"GuestAnonymousVisibleSpacesHint": "Her uygulama kartının kendi satırı vardır: Hesabı olmayan ziyaretçilerin açabilmesi için salt okunur anonim hesabın üye olarak eklendiği alanları seçin. Değişiklikler hemen uygulanır.",
|
||
"ManageIdentities": "Kimlikleri yönet",
|
||
"Release": "Serbest bırak",
|
||
"ReleaseSocialId": "Sosyal ID'yi serbest bırak",
|
||
"ReleaseSocialIdConfirm": "Bu sosyal ID'yi serbest bırakmak istediğinizden emin misiniz: {socialId}? Bu, hesabınızdan kaldırılacak ve artık giriş yapmak için kullanamazsınız. Ayrıca, ilgili tüm entegrasyonlar kaldırılacak.",
|
||
"ReleasePrimarySocialId": "Birincil sosyal ID'yi serbest bırak",
|
||
"ReleasePrimarySocialIdConfirm": "Mevcut birincil sosyal id'nizi serbest bırakmak sayfanın yeniden yüklenmesini gerektirecek. Devam etmek istediğinizden emin misiniz?",
|
||
"Login": "Giriş",
|
||
"Primary": "Birincil",
|
||
"MyIntegrations": "Entegrasyonlarım",
|
||
"AllIntegrations": "Tümü",
|
||
"ConnectedIntegrations": "Entegre",
|
||
"AvailableIntegrations": "Kullanılabilir",
|
||
"Connect": "Bağlan",
|
||
"Integrate": "Entegre et",
|
||
"FailedToLoadIntegrations": "Entegrasyonlar yüklenemedi",
|
||
"FailedToDisconnect": "Entegrasyon bağlantısı kesilemedi",
|
||
"ServiceIsUnavailable": "Servis kullanılamıyor",
|
||
"Integrated": "Entegre",
|
||
"Connected": "Bağlandı",
|
||
"Disconnected": "Bağlantı Kesildi",
|
||
"Available": "Kullanılabilir",
|
||
"NotConnectedIntegration": "{account} hesabı çalışma alanıyla entegre değil",
|
||
"IntegrationIsUnstable": "Entegrasyon servisi sorunlar yaşıyor. Bazı özellikler düzgün çalışmayabilir.",
|
||
"MinValue": "Minimum değer",
|
||
"Restricted": "Kısıtlı",
|
||
"RestrictedAttributeWarning": "Bu özniteliğin değiştirilmesini kısıtlamak istediğinizden emin misiniz? Bu işlem bu öznitelik için izinler oluşturacak ve geri alınamaz.",
|
||
"MaxValue": "Maksimum değer",
|
||
"IntegerOnly": "Sadece tam sayılar",
|
||
"AccessControl": "Erişim kontrolü",
|
||
"DangerZone": "Tehlike bölgesi",
|
||
"IdentifierExists": "Tanımlayıcı zaten mevcut",
|
||
"PasswordAgingRule": "Parola yaşlandırma kuralı",
|
||
"PasswordAgingRuleDescription": "Kullanıcıların parolalarını değiştirmeleri gerekecek gün sayısı",
|
||
"OfficeSettings": "Ofis ayarları",
|
||
"OfficeDefaultSettings": "Toplantı odaları için varsayılan ayarlar",
|
||
"DefaultStartWithTranscription": "Yeni ofis odalarında transkripsiyonu etkinleştir",
|
||
"DefaultStartWithRecording": "Yeni ofis odalarında kaydı etkinleştir",
|
||
"GuestPermissionsSettings": "Misafirler",
|
||
"GuestPermissionsApplicationPermissions": "Uygulama izinleri",
|
||
"GuestPermissionsApplicationPermissionsHint": "Misafirlerin hangi uygulamaları kullanabileceğini seçin, ardından her uygulama için izinleri aşağıdan ayarlayın.",
|
||
"GuestPermissionsTabGuest": "Misafir",
|
||
"GuestPermissionsTabAnonymousGuest": "Anonim misafir",
|
||
"GuestPermissionsAnonymousApplicationHint": "Anonim (salt okunur) misafirler için uygulama erişimi. Gördükleri uygulamalar da dağıtım yapılandırmasına bağlı olabilir.",
|
||
"ImportDocumentPermission": "Belgeleri içe aktar",
|
||
"ImportDocumentDescription": "Kullanıcılara çalışma alanına belge içe aktarma yeteneği verir",
|
||
"SelectUsers": "Kullanıcıları seç",
|
||
"ShowInTitle": "Başlıkta göster",
|
||
"SpaceMembersOnly": "Yalnızca alan üyeleri",
|
||
"Reset": "Sıfırla",
|
||
"Security": "Güvenlik",
|
||
"TwoFactorAuth": "İki faktörlü kimlik doğrulama",
|
||
"TwoFactorAuthDescription": "İki faktörlü kimlik doğrulama hesabınıza ek bir güvenlik katmanı ekler",
|
||
"EnableTwoFactorAuth": "İki faktörlü kimlik doğrulamayı etkinleştir",
|
||
"DisableTwoFactorAuth": "İki faktörlü kimlik doğrulamayı devre dışı bırak",
|
||
"TwoFactorAuthEnabled": "İki faktörlü kimlik doğrulama etkin",
|
||
"TwoFactorAuthDisabled": "İki faktörlü kimlik doğrulama devre dışı",
|
||
"ShowQRCode": "QR kodu göster",
|
||
"EnterVerificationCode": "Doğrulama kodunu gir",
|
||
"OverrideAttribute": "Özniteliği geçersiz kıl",
|
||
"Required": "Zorunlu",
|
||
"ApiBaseUrl": "Temel URL",
|
||
"ApiEndpointAccount": "Hesap bilgilerini al",
|
||
"ApiEndpointFindAll": "Belgeleri sınıfa göre sorgula",
|
||
"ApiEndpointFindAllPost": "Filtrelerle sorgu (JSON gövdesi)",
|
||
"ApiEndpointLoadModel": "Veri modelini yükle",
|
||
"ApiEndpointPing": "Sağlık kontrolü",
|
||
"ApiEndpointTx": "Belge oluştur veya güncelle",
|
||
"ApiTokenCopyWarning": "Bu belirteci şimdi kopyalayın. Daha sonra tekrar göremezsiniz.",
|
||
"ApiTokenCreated": "Belirteç oluşturuldu",
|
||
"ApiTokenExpiry": "Son kullanma",
|
||
"ApiTokenName": "Belirteç adı",
|
||
"ApiTokenNoTokens": "Henüz API belirteci yok",
|
||
"ApiTokenRevoke": "Belirteci iptal et",
|
||
"ApiTokenRevokeConfirm": "Bu belirteci iptal etmek istediğinize emin misiniz? Artık API erişimi için kullanılamayacak.",
|
||
"ApiTokenWorkspace": "Çalışma alanı",
|
||
"ApiTokens": "API Belirteçleri",
|
||
"ApiUsageDescription": "Çalışma alanı verilerini sorgulamak ve değiştirmek için API belirtecinizi yerleşik REST API ile kullanın. Belirteci Authorization başlığında Bearer belirteci olarak iletin.",
|
||
"ApiUsageTitle": "REST API kullanımı",
|
||
"ApiWorkspaceId": "Çalışma alanı kimliğiniz (UUID) belirtece dahildir. URL'de :workspaceId olarak iletin.",
|
||
"CreateApiToken": "Belirteç oluştur",
|
||
"Created": "Oluşturuldu",
|
||
"Expires": "Sona eriyor",
|
||
"TokenStatus": "Durum",
|
||
"ApiTokenStatusActive": "Etkin",
|
||
"ApiTokenStatusExpiring": "Süresi doluyor",
|
||
"ApiTokenStatusRevoked": "İptal edildi",
|
||
"ApiTokenStatusExpired": "Süresi doldu",
|
||
"ApiTokenExpiry7Days": "7 gün",
|
||
"ApiTokenExpiry30Days": "30 gün",
|
||
"ApiTokenExpiry90Days": "90 gün",
|
||
"ApiTokenExpiry180Days": "180 gün",
|
||
"ApiTokenExpiry365Days": "365 gün",
|
||
"ApiTokenLoadError": "API belirteçleri yüklenemedi",
|
||
"ApiTokenCreateError": "Belirteç oluşturulamadı. Lütfen tekrar deneyin.",
|
||
"ApiTokenRevokeError": "Belirteç iptal edilemedi. Lütfen tekrar deneyin."
|
||
}
|
||
}
|