Tahinli/forge
public0 watching
★ 0
| 1 | //! Strings for the admin pages: users, replication, backups, mail, CI runners and the audit log. |
| 2 | //! See `docs` in `super` for the pattern. |
| 3 | |
| 4 | use forge_core::mail::OutboxStatus; |
| 5 | use forge_core::store::backup_runs::{RunKind, RunTrigger}; |
| 6 | |
| 7 | use super::Lang; |
| 8 | |
| 9 | #[derive(Clone, Copy, Debug, PartialEq, Eq)] |
| 10 | pub enum K { |
| 11 | ActionLabel, |
| 12 | ActorUsername, |
| 13 | AddARunner, |
| 14 | Administrator, |
| 15 | AllActions, |
| 16 | Anonymous, |
| 17 | AtLeast12Chars, |
| 18 | AuditIntro, |
| 19 | AuditLog, |
| 20 | BackToRunners, |
| 21 | BackToUsers, |
| 22 | BackupInterval, |
| 23 | Backups, |
| 24 | BackupsIntro, |
| 25 | CiRunners, |
| 26 | CopyTokenNow, |
| 27 | CreateAUser, |
| 28 | CreateRegistrationToken, |
| 29 | CreateUser, |
| 30 | Database, |
| 31 | DatabaseErrorPrefix, |
| 32 | DeleteAccountRest, |
| 33 | DeletesAccount, |
| 34 | DeleteUser, |
| 35 | Directory, |
| 36 | Disable, |
| 37 | Disabled, |
| 38 | Enable, |
| 39 | Enabled, |
| 40 | ErrAccountCannotBeDeleted, |
| 41 | ErrBackupsNotConfigured, |
| 42 | ErrChooseSecurity, |
| 43 | ErrInvalidUsername, |
| 44 | ErrNoAddressForTest, |
| 45 | ErrPasswordTooLong, |
| 46 | ErrPortRange, |
| 47 | ErrReplicationNotConfigured, |
| 48 | ErrTestNeedsMailOn, |
| 49 | ErrTypeUsernameExactly, |
| 50 | Filter, |
| 51 | FromAddress, |
| 52 | FromName, |
| 53 | Fsck, |
| 54 | Healthcheck, |
| 55 | HealthcheckNotSet, |
| 56 | HealthcheckSet, |
| 57 | HealthcheckUrlInvalid, |
| 58 | HealthError, |
| 59 | HealthLagging, |
| 60 | HealthNever, |
| 61 | HealthOk, |
| 62 | Interval, |
| 63 | Invites, |
| 64 | LastDbAttempt, |
| 65 | LastDbSnapshotShipped, |
| 66 | LastSeen, |
| 67 | LastSuccess, |
| 68 | Mail, |
| 69 | MailHost, |
| 70 | MailIntro, |
| 71 | MailPort, |
| 72 | MailSettingsSaved, |
| 73 | MovedToGhost, |
| 74 | NoEntries, |
| 75 | NoPasswordStored, |
| 76 | NoReposYet, |
| 77 | NoRunnersYet, |
| 78 | NoRunnerWithId, |
| 79 | NoRunsYet, |
| 80 | NothingQueued, |
| 81 | Older, |
| 82 | OwnLogIntro, |
| 83 | PasswordStoredHint, |
| 84 | RecentMessages, |
| 85 | RecentRuns, |
| 86 | ReconcileNow, |
| 87 | ReconcileStarted, |
| 88 | RegisterARunner, |
| 89 | RegistrationToken, |
| 90 | RemovedWithAccount, |
| 91 | ReplacePrefix, |
| 92 | ReplaceSuffix, |
| 93 | Replication, |
| 94 | ReplicationIntro, |
| 95 | ReplicationOff, |
| 96 | ReplicationTarget, |
| 97 | Repos, |
| 98 | Retention, |
| 99 | Role, |
| 100 | RoleAdmin, |
| 101 | RoleOrganization, |
| 102 | RoleUser, |
| 103 | RunBackupNow, |
| 104 | RunFsckNow, |
| 105 | RunnerDeletedNotice, |
| 106 | RunnerDisabledNotice, |
| 107 | RunnerEnabledNotice, |
| 108 | Runners, |
| 109 | ScheduledBackupsOff, |
| 110 | SecurityLogTitle, |
| 111 | SecurityNone, |
| 112 | SendMailCheckbox, |
| 113 | SendTestMailToMe, |
| 114 | Settings, |
| 115 | SmtpServer, |
| 116 | Standby, |
| 117 | StatusFailed, |
| 118 | StatusInProgress, |
| 119 | StatusOk, |
| 120 | TableActor, |
| 121 | TableDetails, |
| 122 | TableDuration, |
| 123 | TableError, |
| 124 | TableKind, |
| 125 | TableLabels, |
| 126 | TableLastError, |
| 127 | TableName, |
| 128 | TableQueued, |
| 129 | TableRepo, |
| 130 | TableResult, |
| 131 | TableSize, |
| 132 | TableStarted, |
| 133 | TableState, |
| 134 | TableStatus, |
| 135 | TableSubject, |
| 136 | TableTarget, |
| 137 | TableTo, |
| 138 | TableTries, |
| 139 | TableTrigger, |
| 140 | TableWhen, |
| 141 | TestQueued, |
| 142 | Token, |
| 143 | TokenCreateFailed, |
| 144 | TransferOrDeleteFirst, |
| 145 | UnknownHost, |
| 146 | Users, |
| 147 | WhatHappens, |
| 148 | } |
| 149 | |
| 150 | pub fn t(lang: Lang, key: K) -> &'static str { |
| 151 | use K::*; |
| 152 | use Lang::*; |
| 153 | match (key, lang) { |
| 154 | (ActionLabel, En) => "Action", |
| 155 | (ActionLabel, Tr) => "İşlem", |
| 156 | (ActorUsername, En) => "Actor username", |
| 157 | (ActorUsername, Tr) => "Yapan kullanıcı adı", |
| 158 | (AddARunner, En) => "Add a runner", |
| 159 | (AddARunner, Tr) => "Çalıştırıcı ekle", |
| 160 | (Administrator, En) => "Administrator", |
| 161 | (Administrator, Tr) => "Yönetici", |
| 162 | (AllActions, En) => "All actions", |
| 163 | (AllActions, Tr) => "Tüm işlemler", |
| 164 | (Anonymous, En) => "anonymous", |
| 165 | (Anonymous, Tr) => "anonim", |
| 166 | (AtLeast12Chars, En) => "At least 12 characters.", |
| 167 | (AtLeast12Chars, Tr) => "En az 12 karakter.", |
| 168 | (AuditIntro, En) => { |
| 169 | "Security events across the instance, newest first. Times are in your timezone." |
| 170 | } |
| 171 | (AuditIntro, Tr) => { |
| 172 | "Sunucudaki güvenlik olayları, en yeniden en eskiye sıralı. Saatler sizin saat diliminizde gösterilir." |
| 173 | } |
| 174 | (AuditLog, En) => "Audit log", |
| 175 | (AuditLog, Tr) => "Denetim günlüğü", |
| 176 | (BackToRunners, En) => "Back to runners", |
| 177 | (BackToRunners, Tr) => "Çalıştırıcılara dön", |
| 178 | (BackToUsers, En) => "Back to users", |
| 179 | (BackToUsers, Tr) => "Kullanıcılara dön", |
| 180 | (BackupInterval, En) => "Backup interval", |
| 181 | (BackupInterval, Tr) => "Yedekleme aralığı", |
| 182 | (Backups, En) => "Backups", |
| 183 | (Backups, Tr) => "Yedeklemeler", |
| 184 | (BackupsIntro, En) => { |
| 185 | "Backup sets and integrity checks. Times are in your timezone. Settings come from the [backup] section of the config file." |
| 186 | } |
| 187 | (BackupsIntro, Tr) => { |
| 188 | "Yedek kümeleri ve bütünlük denetimleri. Saatler sizin saat diliminizde gösterilir. Ayarlar, yapılandırma dosyasındaki [backup] bölümünden gelir." |
| 189 | } |
| 190 | (CiRunners, En) => "CI runners", |
| 191 | (CiRunners, Tr) => "CI çalıştırıcıları", |
| 192 | (CopyTokenNow, En) => { |
| 193 | "Copy this token now. It is shown once and cannot be looked up again." |
| 194 | } |
| 195 | (CopyTokenNow, Tr) => { |
| 196 | "Bu belirteci şimdi kopyalayın. Yalnızca bir kez gösterilir ve sonradan yeniden görüntülenemez." |
| 197 | } |
| 198 | (CreateAUser, En) => "Create a user", |
| 199 | (CreateAUser, Tr) => "Kullanıcı oluştur", |
| 200 | (CreateRegistrationToken, En) => "Create registration token", |
| 201 | (CreateRegistrationToken, Tr) => "Kayıt belirteci oluştur", |
| 202 | (CreateUser, En) => "Create user", |
| 203 | (CreateUser, Tr) => "Kullanıcı oluştur", |
| 204 | (Database, En) => "Database", |
| 205 | (Database, Tr) => "Veritabanı", |
| 206 | (DatabaseErrorPrefix, En) => "Database: ", |
| 207 | (DatabaseErrorPrefix, Tr) => "Veritabanı: ", |
| 208 | (DeleteAccountRest, En) => { |
| 209 | ". Its sessions, SSH keys, access tokens and stars are removed. Its issues, comments and reviews stay and are shown as written by the deleted user. This cannot be undone." |
| 210 | } |
| 211 | (DeleteAccountRest, Tr) => { |
| 212 | " hesabını siler. Oturumları, SSH anahtarları, erişim belirteçleri ve yıldızları kaldırılır. Sorunları, yorumları ve incelemeleri kalır; silinmiş kullanıcının adıyla gösterilir. Bu işlem geri alınamaz." |
| 213 | } |
| 214 | (DeletesAccount, En) => "This deletes the account ", |
| 215 | (DeletesAccount, Tr) => "Bu işlem ", |
| 216 | (DeleteUser, En) => "Delete user", |
| 217 | (DeleteUser, Tr) => "Kullanıcıyı sil", |
| 218 | (Directory, En) => "Directory", |
| 219 | (Directory, Tr) => "Dizin", |
| 220 | (Disable, En) => "Disable", |
| 221 | (Disable, Tr) => "Devre dışı bırak", |
| 222 | (Disabled, En) => "disabled", |
| 223 | (Disabled, Tr) => "devre dışı", |
| 224 | (Enable, En) => "Enable", |
| 225 | (Enable, Tr) => "Etkinleştir", |
| 226 | (Enabled, En) => "enabled", |
| 227 | (Enabled, Tr) => "etkin", |
| 228 | (ErrAccountCannotBeDeleted, En) => "this account cannot be deleted", |
| 229 | (ErrAccountCannotBeDeleted, Tr) => "bu hesap silinemez", |
| 230 | (ErrBackupsNotConfigured, En) => { |
| 231 | "backups are not configured: set [backup] dir in the config file" |
| 232 | } |
| 233 | (ErrBackupsNotConfigured, Tr) => { |
| 234 | "yedeklemeler yapılandırılmamış: yapılandırma dosyasında [backup] dir ayarını yapın" |
| 235 | } |
| 236 | (ErrChooseSecurity, En) => "choose a security option", |
| 237 | (ErrChooseSecurity, Tr) => "bir güvenlik seçeneği seçin", |
| 238 | (ErrInvalidUsername, En) => "invalid username", |
| 239 | (ErrInvalidUsername, Tr) => "geçersiz kullanıcı adı", |
| 240 | (ErrNoAddressForTest, En) => "your account has no email address to send the test to", |
| 241 | (ErrNoAddressForTest, Tr) => { |
| 242 | "hesabınızda test iletisinin gönderileceği bir e-posta adresi yok" |
| 243 | } |
| 244 | (ErrPasswordTooLong, En) => "password is too long", |
| 245 | (ErrPasswordTooLong, Tr) => "parola çok uzun", |
| 246 | (ErrPortRange, En) => "the port must be a number from 1 to 65535", |
| 247 | (ErrPortRange, Tr) => "bağlantı noktası 1 ile 65535 arasında bir sayı olmalı", |
| 248 | (ErrReplicationNotConfigured, En) => { |
| 249 | "replication is not configured: set [replication] target in the config file" |
| 250 | } |
| 251 | (ErrReplicationNotConfigured, Tr) => { |
| 252 | "çoğaltma yapılandırılmamış: yapılandırma dosyasında [replication] target ayarını yapın" |
| 253 | } |
| 254 | (ErrTestNeedsMailOn, En) => "turn mail on and save the settings before sending a test", |
| 255 | (ErrTestNeedsMailOn, Tr) => "test göndermeden önce e-postayı açın ve ayarları kaydedin", |
| 256 | (ErrTypeUsernameExactly, En) => "Type the username exactly to confirm.", |
| 257 | (ErrTypeUsernameExactly, Tr) => "Onaylamak için kullanıcı adını tam olarak yazın.", |
| 258 | (Filter, En) => "Filter", |
| 259 | (Filter, Tr) => "Filtrele", |
| 260 | (FromAddress, En) => "From address", |
| 261 | (FromAddress, Tr) => "Gönderen adresi", |
| 262 | (FromName, En) => "From name", |
| 263 | (FromName, Tr) => "Gönderen adı", |
| 264 | (Fsck, En) => "Fsck", |
| 265 | (Fsck, Tr) => "Fsck", |
| 266 | (Healthcheck, En) => "Healthcheck", |
| 267 | (Healthcheck, Tr) => "Sağlık denetimi", |
| 268 | (HealthcheckNotSet, En) => "not set", |
| 269 | (HealthcheckNotSet, Tr) => "ayarlanmamış", |
| 270 | (HealthcheckSet, En) => "set", |
| 271 | (HealthcheckSet, Tr) => "ayarlı", |
| 272 | (HealthcheckUrlInvalid, En) => "set (the URL is not valid)", |
| 273 | (HealthcheckUrlInvalid, Tr) => "ayarlı (URL geçersiz)", |
| 274 | (HealthError, En) => "error", |
| 275 | (HealthError, Tr) => "hata", |
| 276 | (HealthLagging, En) => "lagging", |
| 277 | (HealthLagging, Tr) => "gecikmeli", |
| 278 | (HealthNever, En) => "never replicated", |
| 279 | (HealthNever, Tr) => "hiç çoğaltılmadı", |
| 280 | (HealthOk, En) => "ok", |
| 281 | (HealthOk, Tr) => "tamam", |
| 282 | (Interval, En) => "Interval", |
| 283 | (Interval, Tr) => "Aralık", |
| 284 | (Invites, En) => "Invites", |
| 285 | (Invites, Tr) => "Davetler", |
| 286 | (LastDbAttempt, En) => "Last database attempt", |
| 287 | (LastDbAttempt, Tr) => "Son veritabanı denemesi", |
| 288 | (LastDbSnapshotShipped, En) => "Last database snapshot shipped", |
| 289 | (LastDbSnapshotShipped, Tr) => "Son gönderilen veritabanı anlık görüntüsü", |
| 290 | (LastSeen, En) => "Last seen", |
| 291 | (LastSeen, Tr) => "Son görülme", |
| 292 | (LastSuccess, En) => "Last success", |
| 293 | (LastSuccess, Tr) => "Son başarı", |
| 294 | (Mail, En) => "Mail", |
| 295 | (Mail, Tr) => "E-posta", |
| 296 | (MailHost, En) => "Host", |
| 297 | (MailHost, Tr) => "Sunucu", |
| 298 | (MailIntro, En) => { |
| 299 | "Outgoing mail for password resets, verification and notifications. Mail is sent from a queue with retries; a message that keeps failing is marked as gave up." |
| 300 | } |
| 301 | (MailIntro, Tr) => { |
| 302 | "Parola sıfırlama, doğrulama ve bildirimler için giden e-posta. E-postalar yeniden denemelerle bir kuyruktan gönderilir; sürekli başarısız olan bir ileti vazgeçildi olarak işaretlenir." |
| 303 | } |
| 304 | (MailPort, En) => "Port", |
| 305 | (MailPort, Tr) => "Bağlantı noktası", |
| 306 | (MailSettingsSaved, En) => "Mail settings saved.", |
| 307 | (MailSettingsSaved, Tr) => "E-posta ayarları kaydedildi.", |
| 308 | (MovedToGhost, En) => "Moved to the ghost user:", |
| 309 | (MovedToGhost, Tr) => "Hayalet kullanıcıya taşınanlar:", |
| 310 | (NoEntries, En) => "No entries.", |
| 311 | (NoEntries, Tr) => "Kayıt yok.", |
| 312 | (NoPasswordStored, En) => "No password is stored.", |
| 313 | (NoPasswordStored, Tr) => "Kayıtlı parola yok.", |
| 314 | (NoReposYet, En) => "No repos yet.", |
| 315 | (NoReposYet, Tr) => "Henüz depo yok.", |
| 316 | (NoRunnersYet, En) => "No runners registered yet.", |
| 317 | (NoRunnersYet, Tr) => "Henüz kayıtlı çalıştırıcı yok.", |
| 318 | (NoRunnerWithId, En) => "No runner has that id. Nothing was changed.", |
| 319 | (NoRunnerWithId, Tr) => "Bu kimlikte bir çalıştırıcı yok. Hiçbir şey değiştirilmedi.", |
| 320 | (NoRunsYet, En) => "No runs yet.", |
| 321 | (NoRunsYet, Tr) => "Henüz çalıştırma yok.", |
| 322 | (NothingQueued, En) => "Nothing has been queued yet.", |
| 323 | (NothingQueued, Tr) => "Henüz kuyruğa alınmış bir şey yok.", |
| 324 | (Older, En) => "Older", |
| 325 | (Older, Tr) => "Daha eski", |
| 326 | (OwnLogIntro, En) => { |
| 327 | "Sign-ins, changes to your account and keys, and sessions you revoked. Times are in your timezone." |
| 328 | } |
| 329 | (OwnLogIntro, Tr) => { |
| 330 | "Oturum açmalar, hesabınızdaki ve anahtarlarınızdaki değişiklikler ile iptal ettiğiniz oturumlar. Saatler sizin saat diliminizde gösterilir." |
| 331 | } |
| 332 | (PasswordStoredHint, En) => "A password is stored. Leave this blank to keep it.", |
| 333 | (PasswordStoredHint, Tr) => { |
| 334 | "Bir parola kayıtlı. Mevcut parolayı korumak için bu alanı boş bırakın." |
| 335 | } |
| 336 | (RecentMessages, En) => "Recent messages", |
| 337 | (RecentMessages, Tr) => "Son iletiler", |
| 338 | (RecentRuns, En) => "Recent runs", |
| 339 | (RecentRuns, Tr) => "Son çalıştırmalar", |
| 340 | (ReconcileNow, En) => "Reconcile now", |
| 341 | (ReconcileNow, Tr) => "Şimdi uzlaştır", |
| 342 | (ReconcileStarted, En) => "Reconcile started.", |
| 343 | (ReconcileStarted, Tr) => "Uzlaştırma başlatıldı.", |
| 344 | (RegisterARunner, En) => "Register a runner", |
| 345 | (RegisterARunner, Tr) => "Bir çalıştırıcı kaydet", |
| 346 | (RegistrationToken, En) => "Registration token", |
| 347 | (RegistrationToken, Tr) => "Kayıt belirteci", |
| 348 | (RemovedWithAccount, En) => "Removed with the account:", |
| 349 | (RemovedWithAccount, Tr) => "Hesapla birlikte silinenler:", |
| 350 | (ReplacePrefix, En) => "Replace ", |
| 351 | (ReplacePrefix, Tr) => "Çalıştırıcının adını ", |
| 352 | (ReplaceSuffix, En) => " with the runner's name.", |
| 353 | (ReplaceSuffix, Tr) => " yerine yazın.", |
| 354 | (Replication, En) => "Replication", |
| 355 | (Replication, Tr) => "Çoğaltma", |
| 356 | (ReplicationIntro, En) => { |
| 357 | "Standby copies of every repo and of the database. Times are in your timezone. Settings come from the [replication] section of the config file." |
| 358 | } |
| 359 | (ReplicationIntro, Tr) => { |
| 360 | "Her deponun ve veritabanının bekleme kopyaları. Saatler sizin saat diliminizde gösterilir. Ayarlar, yapılandırma dosyasındaki [replication] bölümünden gelir." |
| 361 | } |
| 362 | (ReplicationOff, En) => { |
| 363 | "Replication is off. Set target, identity_file and known_hosts_file in the [replication] section to turn it on." |
| 364 | } |
| 365 | (ReplicationOff, Tr) => { |
| 366 | "Çoğaltma kapalı. Açmak için [replication] bölümünde target, identity_file ve known_hosts_file ayarlarını yapın." |
| 367 | } |
| 368 | (ReplicationTarget, En) => "Target", |
| 369 | (ReplicationTarget, Tr) => "Hedef", |
| 370 | (Repos, En) => "Repos", |
| 371 | (Repos, Tr) => "Depolar", |
| 372 | (Retention, En) => "Retention", |
| 373 | (Retention, Tr) => "Saklama", |
| 374 | (Role, En) => "Role", |
| 375 | (Role, Tr) => "Rol", |
| 376 | (RoleAdmin, En) => "admin", |
| 377 | (RoleAdmin, Tr) => "yönetici", |
| 378 | (RoleOrganization, En) => "organization", |
| 379 | (RoleOrganization, Tr) => "kuruluş", |
| 380 | (RoleUser, En) => "user", |
| 381 | (RoleUser, Tr) => "kullanıcı", |
| 382 | (RunBackupNow, En) => "Run backup now", |
| 383 | (RunBackupNow, Tr) => "Şimdi yedekle", |
| 384 | (RunFsckNow, En) => "Run fsck now", |
| 385 | (RunFsckNow, Tr) => "Şimdi fsck çalıştır", |
| 386 | (RunnerDeletedNotice, En) => "Runner deleted.", |
| 387 | (RunnerDeletedNotice, Tr) => "Çalıştırıcı silindi.", |
| 388 | (RunnerDisabledNotice, En) => "Runner disabled. It will not take new jobs.", |
| 389 | (RunnerDisabledNotice, Tr) => "Çalıştırıcı devre dışı bırakıldı. Yeni iş almayacak.", |
| 390 | (RunnerEnabledNotice, En) => "Runner enabled.", |
| 391 | (RunnerEnabledNotice, Tr) => "Çalıştırıcı etkinleştirildi.", |
| 392 | (Runners, En) => "Runners", |
| 393 | (Runners, Tr) => "Çalıştırıcılar", |
| 394 | (ScheduledBackupsOff, En) => { |
| 395 | "Scheduled backups are off. Set dir in the [backup] section to turn them on." |
| 396 | } |
| 397 | (ScheduledBackupsOff, Tr) => { |
| 398 | "Zamanlanmış yedeklemeler kapalı. Açmak için [backup] bölümünde dir ayarını yapın." |
| 399 | } |
| 400 | (SecurityLogTitle, En) => "Security log", |
| 401 | (SecurityLogTitle, Tr) => "Güvenlik günlüğü", |
| 402 | (SecurityNone, En) => "None (plain text)", |
| 403 | (SecurityNone, Tr) => "Yok (düz metin)", |
| 404 | (SendMailCheckbox, En) => " Send mail", |
| 405 | (SendMailCheckbox, Tr) => " E-posta gönder", |
| 406 | (SendTestMailToMe, En) => "Send test mail to me", |
| 407 | (SendTestMailToMe, Tr) => "Bana test e-postası gönder", |
| 408 | (Settings, En) => "Settings", |
| 409 | (Settings, Tr) => "Ayarlar", |
| 410 | (SmtpServer, En) => "SMTP server", |
| 411 | (SmtpServer, Tr) => "SMTP sunucusu", |
| 412 | (Standby, En) => "Standby", |
| 413 | (Standby, Tr) => "Bekleme kopyası", |
| 414 | (StatusFailed, En) => "failed", |
| 415 | (StatusFailed, Tr) => "başarısız", |
| 416 | (StatusInProgress, En) => "in progress", |
| 417 | (StatusInProgress, Tr) => "sürüyor", |
| 418 | (StatusOk, En) => "ok", |
| 419 | (StatusOk, Tr) => "tamam", |
| 420 | (TableActor, En) => "Actor", |
| 421 | (TableActor, Tr) => "Yapan", |
| 422 | (TableDetails, En) => "Details", |
| 423 | (TableDetails, Tr) => "Ayrıntılar", |
| 424 | (TableDuration, En) => "Duration", |
| 425 | (TableDuration, Tr) => "Süre", |
| 426 | (TableError, En) => "Error", |
| 427 | (TableError, Tr) => "Hata", |
| 428 | (TableKind, En) => "Kind", |
| 429 | (TableKind, Tr) => "Tür", |
| 430 | (TableLabels, En) => "Labels", |
| 431 | (TableLabels, Tr) => "Etiketler", |
| 432 | (TableLastError, En) => "Last error", |
| 433 | (TableLastError, Tr) => "Son hata", |
| 434 | (TableName, En) => "Name", |
| 435 | (TableName, Tr) => "Ad", |
| 436 | (TableQueued, En) => "Queued", |
| 437 | (TableQueued, Tr) => "Kuyruğa alındı", |
| 438 | (TableRepo, En) => "Repo", |
| 439 | (TableRepo, Tr) => "Depo", |
| 440 | (TableResult, En) => "Result", |
| 441 | (TableResult, Tr) => "Sonuç", |
| 442 | (TableSize, En) => "Size", |
| 443 | (TableSize, Tr) => "Boyut", |
| 444 | (TableStarted, En) => "Started", |
| 445 | (TableStarted, Tr) => "Başlangıç", |
| 446 | (TableState, En) => "State", |
| 447 | (TableState, Tr) => "Durum", |
| 448 | (TableStatus, En) => "Status", |
| 449 | (TableStatus, Tr) => "Durum", |
| 450 | (TableSubject, En) => "Subject", |
| 451 | (TableSubject, Tr) => "Konu", |
| 452 | (TableTarget, En) => "Target", |
| 453 | (TableTarget, Tr) => "Hedef", |
| 454 | (TableTo, En) => "To", |
| 455 | (TableTo, Tr) => "Alıcı", |
| 456 | (TableTries, En) => "Tries", |
| 457 | (TableTries, Tr) => "Deneme", |
| 458 | (TableTrigger, En) => "Trigger", |
| 459 | (TableTrigger, Tr) => "Tetikleyen", |
| 460 | (TableWhen, En) => "When", |
| 461 | (TableWhen, Tr) => "Ne zaman", |
| 462 | (TestQueued, En) => "Test message queued. It appears in the list when it is sent.", |
| 463 | (TestQueued, Tr) => "Test iletisi kuyruğa alındı. Gönderildiğinde listede görünür.", |
| 464 | (Token, En) => "Token", |
| 465 | (Token, Tr) => "Belirteç", |
| 466 | (TokenCreateFailed, En) => { |
| 467 | "The registration token could not be created. Nothing was changed." |
| 468 | } |
| 469 | (TokenCreateFailed, Tr) => "Kayıt belirteci oluşturulamadı. Hiçbir şey değiştirilmedi.", |
| 470 | (TransferOrDeleteFirst, En) => "Transfer or delete these repositories first:", |
| 471 | (TransferOrDeleteFirst, Tr) => "Önce bu depoları devredin veya silin:", |
| 472 | (UnknownHost, En) => "unknown", |
| 473 | (UnknownHost, Tr) => "bilinmiyor", |
| 474 | (Users, En) => "Users", |
| 475 | (Users, Tr) => "Kullanıcılar", |
| 476 | (WhatHappens, En) => "What happens", |
| 477 | (WhatHappens, Tr) => "Ne olacak", |
| 478 | } |
| 479 | } |
| 480 | |
| 481 | /// "Type alice to confirm", with the username in the middle. |
| 482 | pub fn type_to_confirm(lang: Lang, name: &str) -> String { |
| 483 | match lang { |
| 484 | Lang::En => format!("Type {name} to confirm"), |
| 485 | Lang::Tr => format!("Onaylamak için {name} yazın"), |
| 486 | } |
| 487 | } |
| 488 | |
| 489 | /// "password must be at least 12 characters" (the message for a short password). |
| 490 | pub fn password_min_error(lang: Lang, min: usize) -> String { |
| 491 | match lang { |
| 492 | Lang::En => format!("password must be at least {min} characters"), |
| 493 | Lang::Tr => format!("parola en az {min} karakter olmalı"), |
| 494 | } |
| 495 | } |
| 496 | |
| 497 | /// The name of a repo deleted since its last push, pending cleanup on the standby. |
| 498 | pub fn deleted_repo_name(lang: Lang, subject: &str) -> String { |
| 499 | match lang { |
| 500 | Lang::En => format!("{subject} (deleted, pending cleanup)"), |
| 501 | Lang::Tr => format!("{subject} (silindi, temizlik bekliyor)"), |
| 502 | } |
| 503 | } |
| 504 | |
| 505 | /// "database every 60 min, reconcile every 30 min". |
| 506 | pub fn interval_line(lang: Lang, db_minutes: u64, reconcile_minutes: u64) -> String { |
| 507 | match lang { |
| 508 | Lang::En => { |
| 509 | format!("database every {db_minutes} min, reconcile every {reconcile_minutes} min") |
| 510 | } |
| 511 | Lang::Tr => format!( |
| 512 | "veritabanı her {db_minutes} dakikada, uzlaştırma her {reconcile_minutes} dakikada" |
| 513 | ), |
| 514 | } |
| 515 | } |
| 516 | |
| 517 | /// "1 hour" or "24 hours" for the registration token lifetime. |
| 518 | pub fn hours_text(lang: Lang, hours: u32) -> String { |
| 519 | match (lang, hours) { |
| 520 | (Lang::En, 1) => "1 hour".to_owned(), |
| 521 | (Lang::En, _) => format!("{hours} hours"), |
| 522 | (Lang::Tr, 1) => "1 saat".to_owned(), |
| 523 | (Lang::Tr, _) => format!("{hours} saat"), |
| 524 | } |
| 525 | } |
| 526 | |
| 527 | /// "A registration token works once and expires after 24 hours. Creating one shows it on the next |
| 528 | /// page only." |
| 529 | pub fn token_ttl_note(lang: Lang, ttl: &str) -> String { |
| 530 | match lang { |
| 531 | Lang::En => format!( |
| 532 | "A registration token works once and expires after {ttl}. Creating one shows it on the next page only." |
| 533 | ), |
| 534 | Lang::Tr => format!( |
| 535 | "Kayıt belirteci yalnızca bir kez çalışır ve {ttl} sonra geçerliliğini yitirir. Oluşturulduğunda yalnızca bir sonraki sayfada gösterilir." |
| 536 | ), |
| 537 | } |
| 538 | } |
| 539 | |
| 540 | /// "It works once and expires in 24 hours." |
| 541 | pub fn token_expiry_line(lang: Lang, ttl: &str) -> String { |
| 542 | match lang { |
| 543 | Lang::En => format!("It works once and expires in {ttl}."), |
| 544 | Lang::Tr => format!("Yalnızca bir kez çalışır ve {ttl} içinde sona erer."), |
| 545 | } |
| 546 | } |
| 547 | |
| 548 | /// "set (host hc.example.test)" for a healthcheck URL, with the host unknown when it has none. |
| 549 | pub fn healthcheck_host(lang: Lang, host: Option<&str>) -> String { |
| 550 | let host = host.unwrap_or_else(|| t(lang, K::UnknownHost)); |
| 551 | match lang { |
| 552 | Lang::En => format!("set (host {host})"), |
| 553 | Lang::Tr => format!("ayarlı (sunucu: {host})"), |
| 554 | } |
| 555 | } |
| 556 | |
| 557 | /// "every 6 hours". |
| 558 | pub fn every_hours(lang: Lang, hours: u64) -> String { |
| 559 | match lang { |
| 560 | Lang::En => format!("every {hours} hours"), |
| 561 | Lang::Tr => format!("her {hours} saatte bir"), |
| 562 | } |
| 563 | } |
| 564 | |
| 565 | /// "every 7 days". |
| 566 | pub fn every_days(lang: Lang, days: u64) -> String { |
| 567 | match lang { |
| 568 | Lang::En => format!("every {days} days"), |
| 569 | Lang::Tr => format!("her {days} günde bir"), |
| 570 | } |
| 571 | } |
| 572 | |
| 573 | /// "2 newest complete sets". |
| 574 | pub fn newest_sets(lang: Lang, keep: usize) -> String { |
| 575 | match lang { |
| 576 | Lang::En => format!("{keep} newest complete sets"), |
| 577 | Lang::Tr => format!("en yeni {keep} tam küme"), |
| 578 | } |
| 579 | } |
| 580 | |
| 581 | /// The run kind as a table cell: "backup" or "fsck". |
| 582 | pub fn kind_name(lang: Lang, kind: RunKind) -> &'static str { |
| 583 | match (kind, lang) { |
| 584 | (RunKind::Backup, Lang::En) => "backup", |
| 585 | (RunKind::Backup, Lang::Tr) => "yedekleme", |
| 586 | (RunKind::Fsck, _) => "fsck", |
| 587 | } |
| 588 | } |
| 589 | |
| 590 | /// The run trigger as a table cell. |
| 591 | pub fn trigger_name(lang: Lang, trigger: RunTrigger) -> &'static str { |
| 592 | match (trigger, lang) { |
| 593 | (RunTrigger::Schedule, Lang::En) => "schedule", |
| 594 | (RunTrigger::Schedule, Lang::Tr) => "zamanlanmış", |
| 595 | (RunTrigger::Manual, Lang::En) => "manual", |
| 596 | (RunTrigger::Manual, Lang::Tr) => "elle", |
| 597 | (RunTrigger::Cli, Lang::En) => "cli", |
| 598 | (RunTrigger::Cli, Lang::Tr) => "komut satırı", |
| 599 | } |
| 600 | } |
| 601 | |
| 602 | /// "Backup started." or "Fsck started." after a manual run is queued. |
| 603 | pub fn started_notice(lang: Lang, kind: RunKind) -> String { |
| 604 | match (kind, lang) { |
| 605 | (RunKind::Backup, Lang::En) => "Backup started.".to_owned(), |
| 606 | (RunKind::Backup, Lang::Tr) => "Yedekleme başlatıldı.".to_owned(), |
| 607 | (RunKind::Fsck, Lang::En) => "Fsck started.".to_owned(), |
| 608 | (RunKind::Fsck, Lang::Tr) => "Fsck başlatıldı.".to_owned(), |
| 609 | } |
| 610 | } |
| 611 | |
| 612 | /// "A backup run is in progress." shown while a run holds the slot. |
| 613 | pub fn running_line(lang: Lang, kind: RunKind) -> String { |
| 614 | match lang { |
| 615 | Lang::En => format!("A {} run is in progress.", kind_name(lang, kind)), |
| 616 | Lang::Tr => format!("Bir {} işlemi sürüyor.", kind_name(lang, kind)), |
| 617 | } |
| 618 | } |
| 619 | |
| 620 | /// The outbox status of a message: "sent", "queued" or "gave up". |
| 621 | pub fn outbox_status(lang: Lang, status: OutboxStatus) -> &'static str { |
| 622 | match (status, lang) { |
| 623 | (OutboxStatus::Sent, Lang::En) => "sent", |
| 624 | (OutboxStatus::Sent, Lang::Tr) => "gönderildi", |
| 625 | (OutboxStatus::Queued, Lang::En) => "queued", |
| 626 | (OutboxStatus::Queued, Lang::Tr) => "kuyrukta", |
| 627 | (OutboxStatus::GaveUp, Lang::En) => "gave up", |
| 628 | (OutboxStatus::GaveUp, Lang::Tr) => "vazgeçildi", |
| 629 | } |
| 630 | } |
| 631 | |
| 632 | /// "There is no action named nonsense." for an unknown action filter. |
| 633 | pub fn no_action_named(lang: Lang, action: &str) -> String { |
| 634 | match lang { |
| 635 | Lang::En => format!("There is no action named {action}."), |
| 636 | Lang::Tr => format!("{action} adında bir işlem yok."), |
| 637 | } |
| 638 | } |
| 639 | |
| 640 | /// "There is no user named mallory." for an unknown actor filter. |
| 641 | pub fn no_user_named(lang: Lang, actor: &str) -> String { |
| 642 | match lang { |
| 643 | Lang::En => format!("There is no user named {actor}."), |
| 644 | Lang::Tr => format!("{actor} adında bir kullanıcı yok."), |
| 645 | } |
| 646 | } |
| 647 | |
| 648 | #[cfg(test)] |
| 649 | mod tests { |
| 650 | use super::*; |
| 651 | |
| 652 | const ALL: &[K] = &[ |
| 653 | K::ActionLabel, |
| 654 | K::ActorUsername, |
| 655 | K::AddARunner, |
| 656 | K::Administrator, |
| 657 | K::AllActions, |
| 658 | K::Anonymous, |
| 659 | K::AtLeast12Chars, |
| 660 | K::AuditIntro, |
| 661 | K::AuditLog, |
| 662 | K::BackToRunners, |
| 663 | K::BackToUsers, |
| 664 | K::BackupInterval, |
| 665 | K::Backups, |
| 666 | K::BackupsIntro, |
| 667 | K::CiRunners, |
| 668 | K::CopyTokenNow, |
| 669 | K::CreateAUser, |
| 670 | K::CreateRegistrationToken, |
| 671 | K::CreateUser, |
| 672 | K::Database, |
| 673 | K::DatabaseErrorPrefix, |
| 674 | K::DeleteAccountRest, |
| 675 | K::DeletesAccount, |
| 676 | K::DeleteUser, |
| 677 | K::Directory, |
| 678 | K::Disable, |
| 679 | K::Disabled, |
| 680 | K::Enable, |
| 681 | K::Enabled, |
| 682 | K::ErrAccountCannotBeDeleted, |
| 683 | K::ErrBackupsNotConfigured, |
| 684 | K::ErrChooseSecurity, |
| 685 | K::ErrInvalidUsername, |
| 686 | K::ErrNoAddressForTest, |
| 687 | K::ErrPasswordTooLong, |
| 688 | K::ErrPortRange, |
| 689 | K::ErrReplicationNotConfigured, |
| 690 | K::ErrTestNeedsMailOn, |
| 691 | K::ErrTypeUsernameExactly, |
| 692 | K::Filter, |
| 693 | K::FromAddress, |
| 694 | K::FromName, |
| 695 | K::Fsck, |
| 696 | K::Healthcheck, |
| 697 | K::HealthcheckNotSet, |
| 698 | K::HealthcheckSet, |
| 699 | K::HealthcheckUrlInvalid, |
| 700 | K::HealthError, |
| 701 | K::HealthLagging, |
| 702 | K::HealthNever, |
| 703 | K::HealthOk, |
| 704 | K::Interval, |
| 705 | K::Invites, |
| 706 | K::LastDbAttempt, |
| 707 | K::LastDbSnapshotShipped, |
| 708 | K::LastSeen, |
| 709 | K::LastSuccess, |
| 710 | K::Mail, |
| 711 | K::MailHost, |
| 712 | K::MailIntro, |
| 713 | K::MailPort, |
| 714 | K::MailSettingsSaved, |
| 715 | K::MovedToGhost, |
| 716 | K::NoEntries, |
| 717 | K::NoPasswordStored, |
| 718 | K::NoReposYet, |
| 719 | K::NoRunnersYet, |
| 720 | K::NoRunnerWithId, |
| 721 | K::NoRunsYet, |
| 722 | K::NothingQueued, |
| 723 | K::Older, |
| 724 | K::OwnLogIntro, |
| 725 | K::PasswordStoredHint, |
| 726 | K::RecentMessages, |
| 727 | K::RecentRuns, |
| 728 | K::ReconcileNow, |
| 729 | K::ReconcileStarted, |
| 730 | K::RegisterARunner, |
| 731 | K::RegistrationToken, |
| 732 | K::RemovedWithAccount, |
| 733 | K::ReplacePrefix, |
| 734 | K::ReplaceSuffix, |
| 735 | K::Replication, |
| 736 | K::ReplicationIntro, |
| 737 | K::ReplicationOff, |
| 738 | K::ReplicationTarget, |
| 739 | K::Repos, |
| 740 | K::Retention, |
| 741 | K::Role, |
| 742 | K::RoleAdmin, |
| 743 | K::RoleOrganization, |
| 744 | K::RoleUser, |
| 745 | K::RunBackupNow, |
| 746 | K::RunFsckNow, |
| 747 | K::RunnerDeletedNotice, |
| 748 | K::RunnerDisabledNotice, |
| 749 | K::RunnerEnabledNotice, |
| 750 | K::Runners, |
| 751 | K::ScheduledBackupsOff, |
| 752 | K::SecurityLogTitle, |
| 753 | K::SecurityNone, |
| 754 | K::SendMailCheckbox, |
| 755 | K::SendTestMailToMe, |
| 756 | K::Settings, |
| 757 | K::SmtpServer, |
| 758 | K::Standby, |
| 759 | K::StatusFailed, |
| 760 | K::StatusInProgress, |
| 761 | K::StatusOk, |
| 762 | K::TableActor, |
| 763 | K::TableDetails, |
| 764 | K::TableDuration, |
| 765 | K::TableError, |
| 766 | K::TableKind, |
| 767 | K::TableLabels, |
| 768 | K::TableLastError, |
| 769 | K::TableName, |
| 770 | K::TableQueued, |
| 771 | K::TableRepo, |
| 772 | K::TableResult, |
| 773 | K::TableSize, |
| 774 | K::TableStarted, |
| 775 | K::TableState, |
| 776 | K::TableStatus, |
| 777 | K::TableSubject, |
| 778 | K::TableTarget, |
| 779 | K::TableTo, |
| 780 | K::TableTries, |
| 781 | K::TableTrigger, |
| 782 | K::TableWhen, |
| 783 | K::TestQueued, |
| 784 | K::Token, |
| 785 | K::TokenCreateFailed, |
| 786 | K::TransferOrDeleteFirst, |
| 787 | K::UnknownHost, |
| 788 | K::Users, |
| 789 | K::WhatHappens, |
| 790 | ]; |
| 791 | |
| 792 | #[test] |
| 793 | fn every_variant_has_text_in_both_languages() { |
| 794 | for key in ALL { |
| 795 | assert!(!t(Lang::En, *key).is_empty(), "{key:?} has no English text"); |
| 796 | assert!(!t(Lang::Tr, *key).is_empty(), "{key:?} has no Turkish text"); |
| 797 | } |
| 798 | } |
| 799 | |
| 800 | #[test] |
| 801 | fn turkish_differs_from_english_for_translated_variants() { |
| 802 | let differing = ALL |
| 803 | .iter() |
| 804 | .filter(|key| t(Lang::En, **key) != t(Lang::Tr, **key)) |
| 805 | .count(); |
| 806 | assert!(differing >= 3, "only {differing} variants are translated"); |
| 807 | } |
| 808 | |
| 809 | #[test] |
| 810 | fn english_text_matches_the_original_phrases() { |
| 811 | assert_eq!(t(Lang::En, K::DeleteUser), "Delete user"); |
| 812 | assert!(t(Lang::En, K::ReplicationOff).starts_with("Replication is off.")); |
| 813 | assert_eq!(type_to_confirm(Lang::En, "alice"), "Type alice to confirm"); |
| 814 | assert_eq!( |
| 815 | running_line(Lang::En, RunKind::Backup), |
| 816 | "A backup run is in progress." |
| 817 | ); |
| 818 | } |
| 819 | } |