forge
ExploreLog in

Tahinli/forge

public
0 watching
★ 0
29.5 KiB
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
4use forge_core::mail::OutboxStatus;
5use forge_core::store::backup_runs::{RunKind, RunTrigger};
6
7use super::Lang;
8
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub 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
150pub 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.
482pub 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).
490pub 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.
498pub 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".
506pub 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.
518pub 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."
529pub 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."
541pub 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.
549pub 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".
558pub 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".
566pub 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".
574pub 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".
582pub 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.
591pub 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.
603pub 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.
613pub 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".
621pub 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.
633pub 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.
641pub 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)]
649mod 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}