//! Strings for this page group. See `docs` in `super` for the pattern. use super::Lang; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum K { ActiveField, ArchivedHookNote, AddPullIntro, AddPullMirror, AddPushIntro, AddPushMirror, AddWebhook, AddWebhookIntro, ArchivedNotice, BackToWebhooks, ClearSecret, ColActive, ColDirection, ColEnabled, ColEvents, ColInterval, ColLastDelivery, ColLastSync, ColResult, CreateWebhook, CurrentUrl, DeleteConfirm, DeleteIntro, DeleteMirror, DeleteTextPull, DeleteTextPush, DeleteWebhook, DirectionPull, DirectionPush, EditWebhook, EnabledField, ErrIntervalMax, ErrIntervalNotWhole, ErrNoEvent, ErrUrlMissing, ErrUrlRequired, ErrorLabel, EvCreate, EvDelete, EvIssueComment, EvIssues, EvPullRequest, EvPullRequestReview, EvPush, EvRelease, Events, HookArchivedNotice, HookNoticeConfirm, HookNoticeCreated, HookNoticeDeleted, HookNoticeRedelivered, HookNoticeSaved, HookNoticeTested, IntervalField, LastSync, ManualOnly, Mirrors, MirrorsIntro, Never, No, NoDeliveries, NoMirrors, NoWebhooks, NoneYet, NoResponse, NoticeConfirm, NoticeCreated, NoticeDeleted, NoticePullCreated, NoticePullNotEmpty, NoticeSaved, NoticeSynced, PayloadUrl, PullMirror, PushMirror, RecentDeliveries, Redeliver, RemoteUrl, RepositoryUrl, RequestBody, RequestHeaders, Response, ResponseBody, ResponseHeaders, SaveMirror, SaveWebhook, Secret, SecretHintNew, SecretHintSet, SecretHintUnset, SecretOptional, SecretSet, SecretUnset, SendTestPing, SignedWith, StateFailed, StateGaveUp, StateOk, StatePending, Status, StatusFailed, StatusLower, StatusNotRun, StatusOk, SyncHeading, SyncIntro, SyncNow, Test, TestIntro, UrlHintKeep, UrlHintNew, UsernameOptional, Webhooks, WebhooksIntro, Yes, } /// Every key, so the tests can walk them. #[cfg(test)] pub const ALL: &[K] = &[ K::ActiveField, K::ArchivedHookNote, K::AddPullIntro, K::AddPullMirror, K::AddPushIntro, K::AddPushMirror, K::AddWebhook, K::AddWebhookIntro, K::ArchivedNotice, K::BackToWebhooks, K::ClearSecret, K::ColActive, K::ColDirection, K::ColEnabled, K::ColEvents, K::ColInterval, K::ColLastDelivery, K::ColLastSync, K::ColResult, K::CreateWebhook, K::CurrentUrl, K::DeleteConfirm, K::DeleteIntro, K::DeleteMirror, K::DeleteTextPull, K::DeleteTextPush, K::DeleteWebhook, K::DirectionPull, K::DirectionPush, K::EditWebhook, K::EnabledField, K::ErrIntervalMax, K::ErrIntervalNotWhole, K::ErrNoEvent, K::ErrUrlMissing, K::ErrUrlRequired, K::ErrorLabel, K::EvCreate, K::EvDelete, K::EvIssueComment, K::EvIssues, K::EvPullRequest, K::EvPullRequestReview, K::EvPush, K::EvRelease, K::Events, K::HookArchivedNotice, K::HookNoticeConfirm, K::HookNoticeCreated, K::HookNoticeDeleted, K::HookNoticeRedelivered, K::HookNoticeSaved, K::HookNoticeTested, K::IntervalField, K::LastSync, K::ManualOnly, K::Mirrors, K::MirrorsIntro, K::Never, K::No, K::NoDeliveries, K::NoMirrors, K::NoWebhooks, K::NoneYet, K::NoResponse, K::NoticeConfirm, K::NoticeCreated, K::NoticeDeleted, K::NoticePullCreated, K::NoticePullNotEmpty, K::NoticeSaved, K::NoticeSynced, K::PayloadUrl, K::PullMirror, K::PushMirror, K::RecentDeliveries, K::Redeliver, K::RemoteUrl, K::RepositoryUrl, K::RequestBody, K::RequestHeaders, K::Response, K::ResponseBody, K::ResponseHeaders, K::SaveMirror, K::SaveWebhook, K::Secret, K::SecretHintNew, K::SecretHintSet, K::SecretHintUnset, K::SecretOptional, K::SecretSet, K::SecretUnset, K::SendTestPing, K::SignedWith, K::StateFailed, K::StateGaveUp, K::StateOk, K::StatePending, K::Status, K::StatusFailed, K::StatusLower, K::StatusNotRun, K::StatusOk, K::SyncHeading, K::SyncIntro, K::SyncNow, K::Test, K::TestIntro, K::UrlHintKeep, K::UrlHintNew, K::UsernameOptional, K::Webhooks, K::WebhooksIntro, K::Yes, ]; /// The phrase a key names, in a user's language. pub fn t(lang: Lang, key: K) -> &'static str { use K::*; use Lang::*; match (key, lang) { (ActiveField, En) => "Active: deliver events to this URL", (ActiveField, Tr) => "Etkin: olaylar bu URL'ye teslim edilir", (ArchivedHookNote, En) => "The webhook cannot be changed while the repository is archived.", (ArchivedHookNote, Tr) => "Depo arşivlenmiş olduğu için web kancası değiştirilemez.", (AddPullIntro, En) => { "This repository is empty. A pull mirror fills it from a remote: branches and tags are fetched now, on the interval and on demand, and pushes are refused. It can only be added while the repository has no refs." } (AddPullIntro, Tr) => { "Bu depo boş. Çekme yansısı depoyu uzak bir depodan doldurur: dallar ve etiketler şimdi, aralıkla ve istendiğinde çekilir; göndermeler reddedilir. Yalnızca depoda hiç referans yokken eklenebilir." } (AddPullMirror, En) => "Add pull mirror", (AddPullMirror, Tr) => "Çekme yansısı ekle", (AddPushIntro, En) => { "Our branches and tags are pushed to this remote after each push, and on the interval. The remote's own refs that we do not have are removed." } (AddPushIntro, Tr) => { "Dallarımız ve etiketlerimiz her göndermeden sonra ve aralıkla bu uzak depoya gönderilir. Uzak depoda bizde olmayan kendi referansları silinir." } (AddPushMirror, En) => "Add push mirror", (AddPushMirror, Tr) => "Gönderme yansısı ekle", (AddWebhook, En) => "Add webhook", (AddWebhook, Tr) => "Web kancası ekle", (AddWebhookIntro, En) => { "A ping event is sent to the URL as soon as the webhook is created." } (AddWebhookIntro, Tr) => { "Web kancası oluşturulur oluşturulmaz URL'ye bir ping olayı gönderilir." } (ArchivedNotice, En) => { "This repository is archived. Mirrors are read-only: they cannot be changed, synced or deleted." } (ArchivedNotice, Tr) => { "Bu depo arşivlenmiş. Yansılar salt okunurdur: değiştirilemez, eşitlenemez ya da silinemez." } (BackToWebhooks, En) => "Back to webhooks", (BackToWebhooks, Tr) => "Web kancalarına dön", (ClearSecret, En) => "Clear the stored password or token", (ClearSecret, Tr) => "Kayıtlı parola veya belirteci temizle", (ColActive, En) => "Active", (ColActive, Tr) => "Etkin", (ColDirection, En) => "Direction", (ColDirection, Tr) => "Yön", (ColEnabled, En) => "Enabled", (ColEnabled, Tr) => "Etkin", (ColEvents, En) => "Events", (ColEvents, Tr) => "Olaylar", (ColInterval, En) => "Interval", (ColInterval, Tr) => "Aralık", (ColLastDelivery, En) => "Last delivery", (ColLastDelivery, Tr) => "Son teslimat", (ColLastSync, En) => "Last sync", (ColLastSync, Tr) => "Son eşitleme", (ColResult, En) => "Result", (ColResult, Tr) => "Sonuç", (CreateWebhook, En) => "Create webhook", (CreateWebhook, Tr) => "Web kancası oluştur", (CurrentUrl, En) => "Current URL:", (CurrentUrl, Tr) => "Mevcut URL:", (DeleteConfirm, En) => "I understand this cannot be undone", (DeleteConfirm, Tr) => "Bunun geri alınamayacağını anlıyorum", (DeleteIntro, En) => { "Deleting removes the webhook and its delivery history. Events stop being sent to its URL at once." } (DeleteIntro, Tr) => { "Silmek, web kancasını ve teslimat geçmişini kaldırır. Olaylar bu URL'ye hemen gönderilmez." } (DeleteMirror, En) => "Delete mirror", (DeleteMirror, Tr) => "Yansıyı sil", (DeleteTextPull, En) => { "Stop mirroring; the repository becomes a normal repository. Its refs stay as they are." } (DeleteTextPull, Tr) => { "Yansılamayı durdurun; depo normal bir depoya dönüşür. Referansları olduğu gibi kalır." } (DeleteTextPush, En) => "Stop pushing to this remote. The remote keeps the refs it has.", (DeleteTextPush, Tr) => { "Bu uzak depoya göndermeyi durdurun. Uzak depo sahip olduğu referansları korur." } (DeleteWebhook, En) => "Delete webhook", (DeleteWebhook, Tr) => "Web kancasını sil", (DirectionPull, En) => "Pull", (DirectionPull, Tr) => "Çekme", (DirectionPush, En) => "Push", (DirectionPush, Tr) => "Gönderme", (EditWebhook, En) => "Edit webhook", (EditWebhook, Tr) => "Web kancasını düzenle", (EnabledField, En) => "Enabled: sync on the interval and after pushes", (EnabledField, Tr) => "Etkin: aralıkla ve göndermelerden sonra eşitlenir", (ErrIntervalMax, En) => "The sync interval can be at most one year.", (ErrIntervalMax, Tr) => "Eşitleme aralığı en fazla bir yıl olabilir.", (ErrIntervalNotWhole, En) => "The sync interval must be a whole number of minutes.", (ErrIntervalNotWhole, Tr) => "Eşitleme aralığı dakika cinsinden tam sayı olmalıdır.", (ErrNoEvent, En) => "Choose at least one event.", (ErrNoEvent, Tr) => "En az bir olay seçin.", (ErrUrlMissing, En) => "Enter the URL the events are sent to.", (ErrUrlMissing, Tr) => "Olayların gönderileceği URL'yi girin.", (ErrUrlRequired, En) => "Enter the URL of the repository to mirror.", (ErrUrlRequired, Tr) => "Yansılanacak deponun URL'sini girin.", (ErrorLabel, En) => "Error", (ErrorLabel, Tr) => "Hata", (EvCreate, En) => "Branch and tag creation", (EvCreate, Tr) => "Dal ve etiket oluşturma", (EvDelete, En) => "Branch and tag deletion", (EvDelete, Tr) => "Dal ve etiket silme", (EvIssueComment, En) => "Comments on issues and pull requests", (EvIssueComment, Tr) => "Sorun ve çekme isteklerindeki yorumlar", (EvIssues, En) => "Issues: opened, closed, reopened, edited, labels, assignees", (EvIssues, Tr) => { "Sorunlar: açıldı, kapatıldı, yeniden açıldı, düzenlendi, etiketler, atananlar" } (EvPullRequest, En) => "Pull requests: opened, closed, reopened, merged, updated", (EvPullRequest, Tr) => { "Çekme istekleri: açıldı, kapatıldı, yeniden açıldı, birleştirildi, güncellendi" } (EvPullRequestReview, En) => "Pull request reviews", (EvPullRequestReview, Tr) => "Çekme isteği incelemeleri", (EvPush, En) => "Pushes to a branch or tag", (EvPush, Tr) => "Bir dala veya etikete gönderimler", (EvRelease, En) => "Releases: published, updated, deleted", (EvRelease, Tr) => "Sürümler: yayımlandı, güncellendi, silindi", (Events, En) => "Events", (Events, Tr) => "Olaylar", (HookArchivedNotice, En) => { "This repository is archived. Webhooks are read-only: hooks cannot be changed, tested or redelivered." } (HookArchivedNotice, Tr) => { "Bu depo arşivlenmiş. Web kancaları salt okunurdur: değiştirilemez, test edilemez ya da yeniden teslim edilemez." } (HookNoticeConfirm, En) => { "Tick the confirmation box to delete the webhook. Nothing was deleted." } (HookNoticeConfirm, Tr) => { "Web kancasını silmek için onay kutusunu işaretleyin. Hiçbir şey silinmedi." } (HookNoticeCreated, En) => "Webhook created. A ping was queued.", (HookNoticeCreated, Tr) => "Web kancası oluşturuldu. Bir ping sıraya alındı.", (HookNoticeDeleted, En) => "Webhook deleted.", (HookNoticeDeleted, Tr) => "Web kancası silindi.", (HookNoticeRedelivered, En) => "The delivery was queued again.", (HookNoticeRedelivered, Tr) => "Teslimat yeniden sıraya alındı.", (HookNoticeSaved, En) => "Webhook saved.", (HookNoticeSaved, Tr) => "Web kancası kaydedildi.", (HookNoticeTested, En) => "A test ping was queued.", (HookNoticeTested, Tr) => "Bir test pingi sıraya alındı.", (IntervalField, En) => "Sync interval in minutes (0 = manual only, at least 10)", (IntervalField, Tr) => "Dakika cinsinden eşitleme aralığı (0 = yalnızca elle, en az 10)", (LastSync, En) => "Last sync:", (LastSync, Tr) => "Son eşitleme:", (ManualOnly, En) => "manual only", (ManualOnly, Tr) => "yalnızca elle", (Mirrors, En) => "Mirrors", (Mirrors, Tr) => "Yansılar", (MirrorsIntro, En) => { "A pull mirror keeps this repository in step with a remote: branches and tags are fetched on the interval and on demand, and pushes are refused. A push mirror sends branches and tags to a remote after every push. Pull requests and issues stay local." } (MirrorsIntro, Tr) => { "Çekme yansısı bu depoyu uzak bir depoyla eşit tutar: dallar ve etiketler aralıkla ya da istendiğinde çekilir, göndermeler reddedilir. Gönderme yansısı her göndermeden sonra dalları ve etiketleri uzak depoya gönderir. Çekme istekleri ve sorunlar yerel kalır." } (Never, En) => "never", (Never, Tr) => "hiç", (No, En) => "no", (No, Tr) => "hayır", (NoDeliveries, En) => "No deliveries yet.", (NoDeliveries, Tr) => "Henüz teslimat yok.", (NoMirrors, En) => "No mirrors yet.", (NoMirrors, Tr) => "Henüz yansı yok.", (NoWebhooks, En) => "No webhooks yet.", (NoWebhooks, Tr) => "Henüz web kancası yok.", (NoneYet, En) => "none yet", (NoneYet, Tr) => "henüz yok", (NoResponse, En) => "no response", (NoResponse, Tr) => "yanıt yok", (NoticeConfirm, En) => { "Tick the confirmation box to delete the mirror. Nothing was deleted." } (NoticeConfirm, Tr) => { "Yansıyı silmek için onay kutusunu işaretleyin. Hiçbir şey silinmedi." } (NoticeCreated, En) => { "Push mirror created. It will be pushed after the next push or on its interval." } (NoticeCreated, Tr) => { "Gönderme yansısı oluşturuldu. Bir sonraki göndermeden sonra ya da aralığı dolduğunda gönderilecek." } (NoticeDeleted, En) => "Mirror deleted.", (NoticeDeleted, Tr) => "Yansı silindi.", (NoticePullCreated, En) => "Pull mirror created. The first sync is queued.", (NoticePullCreated, Tr) => "Çekme yansısı oluşturuldu. İlk eşitleme sıraya alındı.", (NoticePullNotEmpty, En) => { "A pull mirror can only be added to an empty repository. Nothing was changed." } (NoticePullNotEmpty, Tr) => { "Çekme yansısı yalnızca boş bir depoya eklenebilir. Hiçbir şey değiştirilmedi." } (NoticeSaved, En) => "Mirror saved.", (NoticeSaved, Tr) => "Yansı kaydedildi.", (NoticeSynced, En) => "A sync was queued.", (NoticeSynced, Tr) => "Bir eşitleme sıraya alındı.", (PayloadUrl, En) => "Payload URL", (PayloadUrl, Tr) => "Yük URL'si", (PullMirror, En) => "Pull mirror", (PullMirror, Tr) => "Çekme yansısı", (PushMirror, En) => "Push mirror", (PushMirror, Tr) => "Gönderme yansısı", (RecentDeliveries, En) => "Recent deliveries", (RecentDeliveries, Tr) => "Son teslimatlar", (Redeliver, En) => "Redeliver", (Redeliver, Tr) => "Yeniden teslim et", (RemoteUrl, En) => "Remote URL", (RemoteUrl, Tr) => "Uzak URL", (RepositoryUrl, En) => "Repository URL", (RepositoryUrl, Tr) => "Depo URL'si", (RequestBody, En) => "Request body", (RequestBody, Tr) => "İstek gövdesi", (RequestHeaders, En) => "Request headers", (RequestHeaders, Tr) => "İstek üst bilgileri", (Response, En) => "Response", (Response, Tr) => "Yanıt", (ResponseBody, En) => "Response body", (ResponseBody, Tr) => "Yanıt gövdesi", (ResponseHeaders, En) => "Response headers", (ResponseHeaders, Tr) => "Yanıt üst bilgileri", (SaveMirror, En) => "Save mirror", (SaveMirror, Tr) => "Yansıyı kaydet", (SaveWebhook, En) => "Save webhook", (SaveWebhook, Tr) => "Web kancasını kaydet", (Secret, En) => "Secret", (Secret, Tr) => "Gizli anahtar", (SecretHintNew, En) => { "Used to sign each request with HMAC-SHA256. It is stored sealed and is never shown again." } (SecretHintNew, Tr) => { "Her isteği HMAC-SHA256 ile imzalamak için kullanılır. Mühürlü olarak saklanır ve bir daha gösterilmez." } (SecretHintSet, En) => { "A secret is set. Leave the field blank to keep it, or type a new one to replace it." } (SecretHintSet, Tr) => { "Bir gizli anahtar ayarlı. Olduğu gibi bırakmak için alanı boş bırakın ya da yenisini yazarak değiştirin." } (SecretHintUnset, En) => "No secret is set. Type one to add it.", (SecretHintUnset, Tr) => "Gizli anahtar ayarlı değil. Eklemek için bir tane yazın.", (SecretOptional, En) => "Password or token (optional)", (SecretOptional, Tr) => "Parola veya belirteç (isteğe bağlı)", (SecretSet, En) => { "A password or token is set. Leave the field blank to keep it, or type a new one to replace it." } (SecretSet, Tr) => { "Bir parola veya belirteç ayarlı. Olduğu gibi bırakmak için alanı boş bırakın ya da yenisini yazarak değiştirin." } (SecretUnset, En) => "No password or token is set. Type one if the remote needs it.", (SecretUnset, Tr) => { "Parola veya belirteç ayarlı değil. Uzak sunucu gerektiriyorsa bir tane yazın." } (SendTestPing, En) => "Send test ping", (SendTestPing, Tr) => "Test pingi gönder", (SignedWith, En) => " Requests are signed with it, so the receiver can check them.", (SignedWith, Tr) => " İstekler bununla imzalanır, böylece alıcı bunları doğrulayabilir.", (StateFailed, En) => "failed, will retry", (StateFailed, Tr) => "başarısız, yeniden denenecek", (StateGaveUp, En) => "gave up", (StateGaveUp, Tr) => "vazgeçildi", (StateOk, En) => "ok", (StateOk, Tr) => "tamam", (StatePending, En) => "pending", (StatePending, Tr) => "beklemede", (Status, En) => "Status", (Status, Tr) => "Durum", (StatusFailed, En) => "failed", (StatusFailed, Tr) => "başarısız", (StatusLower, En) => "status", (StatusLower, Tr) => "durum", (StatusNotRun, En) => "not run yet", (StatusNotRun, Tr) => "henüz çalışmadı", (StatusOk, En) => "ok", (StatusOk, Tr) => "tamam", (SyncHeading, En) => "Sync", (SyncHeading, Tr) => "Eşitleme", (SyncIntro, En) => "Queues a sync now. The result shows in the list.", (SyncIntro, Tr) => "Şimdi bir eşitleme sıraya alır. Sonuç listede görünür.", (SyncNow, En) => "Sync now", (SyncNow, Tr) => "Şimdi eşitle", (Test, En) => "Test", (Test, Tr) => "Test", (TestIntro, En) => { "Sends a ping event to the URL, to check that it is reachable and signs requests correctly." } (TestIntro, Tr) => { "URL'ye bir ping olayı gönderir; erişilebilir olduğunu ve istekleri doğru imzaladığını denetler." } (UrlHintKeep, En) => "Leave blank to keep the current URL.", (UrlHintKeep, Tr) => "Mevcut URL'yi korumak için boş bırakın.", (UrlHintNew, En) => { "HTTPS only, unless the instance allows HTTP. Addresses inside the network are refused unless the instance allows them." } (UrlHintNew, Tr) => { "Sunucu izin vermedikçe yalnızca HTTPS kullanılır. Ağ içindeki adresler de sunucu izin vermedikçe reddedilir." } (UsernameOptional, En) => "Username (optional)", (UsernameOptional, Tr) => "Kullanıcı adı (isteğe bağlı)", (Webhooks, En) => "Webhooks", (Webhooks, Tr) => "Web kancaları", (WebhooksIntro, En) => { "Each active webhook receives the events it subscribes to as signed JSON POST requests. The last delivery shows whether the receiver answered with a 2xx status." } (WebhooksIntro, Tr) => { "Etkin her web kancası, abone olduğu olayları imzalı JSON POST istekleri olarak alır. Son teslimat, alıcının 2xx durumuyla yanıt verip vermediğini gösterir." } (Yes, En) => "yes", (Yes, Tr) => "evet", } } /// "The sync interval must be 0 (manual only) or at least {min} minutes." pub fn interval_too_short(lang: Lang, min: u32) -> String { match lang { Lang::En => format!("The sync interval must be 0 (manual only) or at least {min} minutes."), Lang::Tr => { format!("Eşitleme aralığı 0 (yalnızca elle) ya da en az {min} dakika olmalıdır.") } } } /// "The username can be at most {max} characters and cannot contain a colon." pub fn username_too_long(lang: Lang, max: usize) -> String { match lang { Lang::En => { format!("The username can be at most {max} characters and cannot contain a colon.") } Lang::Tr => format!( "Kullanıcı adı en fazla {max} karakter olabilir ve iki nokta üst üste içeremez." ), } } /// "The password or token can be at most {max} characters." pub fn password_too_long(lang: Lang, max: usize) -> String { match lang { Lang::En => format!("The password or token can be at most {max} characters."), Lang::Tr => format!("Parola veya belirteç en fazla {max} karakter olabilir."), } } /// "The secret can be at most {max} characters. Nothing was saved." pub fn secret_too_long(lang: Lang, max: usize) -> String { match lang { Lang::En => format!("The secret can be at most {max} characters. Nothing was saved."), Lang::Tr => { format!("Gizli anahtar en fazla {max} karakter olabilir. Hiçbir şey kaydedilmedi.") } } } /// "every 8 h" or "8 saatte bir". pub fn every_hours(lang: Lang, hours: u32) -> String { match lang { Lang::En => format!("every {hours} h"), Lang::Tr => format!("{hours} saatte bir"), } } /// "every 90 min" or "90 dakikada bir". pub fn every_minutes(lang: Lang, minutes: u32) -> String { match lang { Lang::En => format!("every {minutes} min"), Lang::Tr => format!("{minutes} dakikada bir"), } } /// "The last 50 deliveries. Open one to see what was sent and what came back." pub fn recent_deliveries(lang: Lang, shown: u32) -> String { match lang { Lang::En => format!( "The last {shown} deliveries. Open one to see what was sent and what came back." ), Lang::Tr => { format!("Son {shown} teslimat. Birini açıp gönderileni ve alınan yanıtı görün.") } } } #[cfg(test)] mod tests { use super::*; #[test] fn every_key_has_an_english_and_a_turkish_phrase() { for key in ALL { assert!(!t(Lang::En, *key).is_empty(), "{key:?} has no English"); assert!(!t(Lang::Tr, *key).is_empty(), "{key:?} has no Turkish"); } } #[test] fn turkish_differs_from_english_for_some_keys() { let differing = ALL .iter() .filter(|key| t(Lang::En, **key) != t(Lang::Tr, **key)) .count(); assert!(differing >= 3, "only {differing} keys differ"); } #[test] fn helpers_keep_english_wording() { assert_eq!(every_hours(Lang::En, 8), "every 8 h"); assert_eq!(every_minutes(Lang::En, 90), "every 90 min"); assert_eq!( recent_deliveries(Lang::En, 50), "The last 50 deliveries. Open one to see what was sent and what came back." ); } }