//! Strings for the issue, label, milestone and edit-history pages. Sentences that carry values //! have a helper below the `t` match, which returns a `String`. use super::Lang; #[allow(dead_code)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum K { // Shared labels and buttons. CouldNotSave, GoBack, Issues, Labels, Milestones, Pinned, Comment, Edit, Delete, Title, Description, Cancel, Name, Color, Reason, None, Open, Closed, Search, Sort, Unknown, System, Edited, EditedBy, Raw, // Pin box and sidebar pin. IssuePages, PinIssue, UnpinIssue, PinnedTopNote, NotPinned, PinnedIssues, // Lock reasons: the lowercase reader text, then the select options. LockOffTopic, LockTooHeated, LockResolved, LockSpam, OptOffTopic, OptTooHeated, OptResolved, OptSpam, ConversationLocked, ArchivedIssuesReadOnly, LogIn, LogInLink, ToComment, // Timeline events. ClosedCompleted, ClosedNotPlanned, ClosedThis, ReopenedThis, ReferencedThis, LockedConversation, UnlockedConversation, PinnedThisIssue, UnpinnedThisIssue, MergedCommit, PushedNewCommits, DeletedHeadBranch, InCommit, ReviewDismissedPrefix, // Item byline and edit forms. OpenedThis, StateClosedNotPlanned, SaveChanges, EditComment, SaveComment, // Reviews and reactions. ApprovedChanges, RequestedChanges, Reviewed, ApprovedDismissed, RequestedDismissed, ReviewedDismissed, DismissedPrefix, AddReaction, NoDescription, // Sidebar boxes. NoRepoLabels, SaveLabels, NoneYet, Assignees, CommaUsernames, SaveAssignees, NoOneAssigned, MilestoneBox, NoneOption, SaveMilestone, NoMilestone, ConversationBox, Locked, UnlockConversation, NoReason, LockReasonAria, LockConversation, LockedToCollaborators, OpenToEveryone, // Comment form. AddComment, CloseCompleted, CloseNotPlanned, ReopenWithComment, CommentEmpty, // Label page. LabelsArchived, NoLabelsYet, AddDefaultLabels, SaveLabel, NewLabel, CreateLabel, OpenLabelCount, // Milestone page. MilestonesArchived, NoDueDate, Overdue, MilestoneState, NoClosedMilestones, NoOpenMilestones, NewMilestone, DueDate, CreateMilestone, EditMilestone, BackToMilestones, StateLabel, ClosedMilestoneCount, OpenMilestoneCount, // Issue list and new issue. OpenIssue, ClosedIssue, SortNewest, SortOldest, SortUpdated, NewIssue, NoIssuesMatch, SearchTitles, IssuesByState, LabelsAndMilestones, FiltersApplied, ClearFilters, Opened, By, ChooseTemplate, BlankIssue, MarkdownSupported, SubmitNewIssue, Newer, Older, // Edit history. HistIssueDescription, HistPullDescription, HistComment, HistReviewComment, NoTextChange, NoEarlierVersions, } /// The text after the time in "editor edited 3 days ago". Turkish puts the verb last. pub fn edited_after(lang: Lang) -> &'static str { match lang { Lang::En => "", Lang::Tr => " düzenledi", } } /// The text after the time in "opened this 3 days ago". Turkish puts the verb last. pub fn opened_after(lang: Lang) -> &'static str { match lang { Lang::En => "", Lang::Tr => " açtı", } } pub fn t(lang: Lang, key: K) -> &'static str { match (key, lang) { (K::CouldNotSave, Lang::En) => "Could not save", (K::CouldNotSave, Lang::Tr) => "Kaydedilemedi", (K::GoBack, Lang::En) => "Go back", (K::GoBack, Lang::Tr) => "Geri dön", (K::Issues, Lang::En) => "Issues", (K::Issues, Lang::Tr) => "Sorunlar", (K::Labels, Lang::En) => "Labels", (K::Labels, Lang::Tr) => "Etiketler", (K::Milestones, Lang::En) => "Milestones", (K::Milestones, Lang::Tr) => "Kilometre taşları", (K::Pinned, Lang::En) => "Pinned", (K::Pinned, Lang::Tr) => "Sabitlenmiş", (K::Comment, Lang::En) => "Comment", (K::Comment, Lang::Tr) => "Yorum", (K::Edit, Lang::En) => "Edit", (K::Edit, Lang::Tr) => "Düzenle", (K::Delete, Lang::En) => "Delete", (K::Delete, Lang::Tr) => "Sil", (K::Title, Lang::En) => "Title", (K::Title, Lang::Tr) => "Başlık", (K::Description, Lang::En) => "Description", (K::Description, Lang::Tr) => "Açıklama", (K::Cancel, Lang::En) => "Cancel", (K::Cancel, Lang::Tr) => "İptal", (K::Name, Lang::En) => "Name", (K::Name, Lang::Tr) => "Ad", (K::Color, Lang::En) => "Color", (K::Color, Lang::Tr) => "Renk", (K::Reason, Lang::En) => "Reason", (K::Reason, Lang::Tr) => "Neden", (K::None, Lang::En) => "None", (K::None, Lang::Tr) => "Yok", (K::Open, Lang::En) => "Open", (K::Open, Lang::Tr) => "Açık", (K::Closed, Lang::En) => "Closed", (K::Closed, Lang::Tr) => "Kapalı", (K::Search, Lang::En) => "Search", (K::Search, Lang::Tr) => "Ara", (K::Sort, Lang::En) => "Sort", (K::Sort, Lang::Tr) => "Sırala", (K::Unknown, Lang::En) => "unknown", (K::Unknown, Lang::Tr) => "bilinmeyen", (K::System, Lang::En) => "system", (K::System, Lang::Tr) => "sistem", (K::Edited, Lang::En) => "edited", (K::Edited, Lang::Tr) => "düzenlendi", (K::EditedBy, Lang::En) => " edited ", (K::EditedBy, Lang::Tr) => " ", (K::Raw, Lang::En) => "Raw", (K::Raw, Lang::Tr) => "Ham", (K::IssuePages, Lang::En) => "Issue pages", (K::IssuePages, Lang::Tr) => "Sorun sayfaları", (K::PinIssue, Lang::En) => "Pin issue", (K::PinIssue, Lang::Tr) => "Sorunu sabitle", (K::UnpinIssue, Lang::En) => "Unpin issue", (K::UnpinIssue, Lang::Tr) => "Sabitlemeyi kaldır", (K::PinnedTopNote, Lang::En) => "Pinned to the top of the issue list.", (K::PinnedTopNote, Lang::Tr) => "Sorun listesinin en üstünde sabitlendi.", (K::NotPinned, Lang::En) => "Not pinned.", (K::NotPinned, Lang::Tr) => "Sabitlenmemiş.", (K::PinnedIssues, Lang::En) => "Pinned issues", (K::PinnedIssues, Lang::Tr) => "Sabitlenmiş sorunlar", (K::LockOffTopic, Lang::En) => "off-topic", (K::LockOffTopic, Lang::Tr) => "konu dışı", (K::LockTooHeated, Lang::En) => "too heated", (K::LockTooHeated, Lang::Tr) => "tartışma kızıştı", (K::LockResolved, Lang::En) => "resolved", (K::LockResolved, Lang::Tr) => "çözüldü", (K::LockSpam, Lang::En) => "spam", (K::LockSpam, Lang::Tr) => "spam", (K::OptOffTopic, Lang::En) => "Off-topic", (K::OptOffTopic, Lang::Tr) => "Konu dışı", (K::OptTooHeated, Lang::En) => "Too heated", (K::OptTooHeated, Lang::Tr) => "Tartışma kızıştı", (K::OptResolved, Lang::En) => "Resolved", (K::OptResolved, Lang::Tr) => "Çözüldü", (K::OptSpam, Lang::En) => "Spam", (K::OptSpam, Lang::Tr) => "Spam", (K::ConversationLocked, Lang::En) => { "This conversation has been locked and limited to collaborators." } (K::ConversationLocked, Lang::Tr) => { "Bu tartışma kilitlendi ve yalnızca katkıda bulunanlarla sınırlandı." } (K::ArchivedIssuesReadOnly, Lang::En) => { "This repository is archived, so its issues are read-only." } (K::ArchivedIssuesReadOnly, Lang::Tr) => { "Bu depo arşivlenmiş, bu yüzden sorunları salt okunurdur." } (K::LogIn, Lang::En) => "Log in", (K::LogIn, Lang::Tr) => "Giriş yap", (K::LogInLink, Lang::En) => "Log in", (K::LogInLink, Lang::Tr) => "giriş yapın", (K::ToComment, Lang::En) => " to comment.", (K::ToComment, Lang::Tr) => ".", (K::ClosedCompleted, Lang::En) => "closed this as completed", (K::ClosedCompleted, Lang::Tr) => "bunu tamamlandı olarak kapattı", (K::ClosedNotPlanned, Lang::En) => "closed this as not planned", (K::ClosedNotPlanned, Lang::Tr) => "bunu planlanmadı olarak kapattı", (K::ClosedThis, Lang::En) => "closed this", (K::ClosedThis, Lang::Tr) => "bunu kapattı", (K::ReopenedThis, Lang::En) => "reopened this", (K::ReopenedThis, Lang::Tr) => "bunu yeniden açtı", (K::ReferencedThis, Lang::En) => "referenced this", (K::ReferencedThis, Lang::Tr) => "buna atıfta bulundu", (K::LockedConversation, Lang::En) => "locked this conversation", (K::LockedConversation, Lang::Tr) => "bu tartışmayı kilitledi", (K::UnlockedConversation, Lang::En) => "unlocked this conversation", (K::UnlockedConversation, Lang::Tr) => "bu tartışmanın kilidini açtı", (K::PinnedThisIssue, Lang::En) => "pinned this issue", (K::PinnedThisIssue, Lang::Tr) => "bu sorunu sabitledi", (K::UnpinnedThisIssue, Lang::En) => "unpinned this issue", (K::UnpinnedThisIssue, Lang::Tr) => "bu sorunun sabitlemesini kaldırdı", (K::MergedCommit, Lang::En) => "merged commit", (K::MergedCommit, Lang::Tr) => "commit'i birleştirdi", (K::PushedNewCommits, Lang::En) => "pushed new commits", (K::PushedNewCommits, Lang::Tr) => "yeni commit'ler gönderdi", (K::DeletedHeadBranch, Lang::En) => "deleted the head branch", (K::DeletedHeadBranch, Lang::Tr) => "kaynak dalını sildi", (K::InCommit, Lang::En) => " in", (K::InCommit, Lang::Tr) => "commit'inde", (K::ReviewDismissedPrefix, Lang::En) => "dismissed a review: ", (K::ReviewDismissedPrefix, Lang::Tr) => "bir incelemeyi iptal etti: ", (K::OpenedThis, Lang::En) => " opened this ", (K::OpenedThis, Lang::Tr) => " bunu ", (K::StateClosedNotPlanned, Lang::En) => "Closed as not planned", (K::StateClosedNotPlanned, Lang::Tr) => "Planlanmadı olarak kapalı", (K::SaveChanges, Lang::En) => "Save changes", (K::SaveChanges, Lang::Tr) => "Değişiklikleri kaydet", (K::EditComment, Lang::En) => "Edit comment", (K::EditComment, Lang::Tr) => "Yorumu düzenle", (K::SaveComment, Lang::En) => "Save comment", (K::SaveComment, Lang::Tr) => "Yorumu kaydet", (K::ApprovedChanges, Lang::En) => "approved these changes", (K::ApprovedChanges, Lang::Tr) => "bu değişiklikleri onayladı", (K::RequestedChanges, Lang::En) => "requested changes", (K::RequestedChanges, Lang::Tr) => "değişiklik istedi", (K::Reviewed, Lang::En) => "reviewed", (K::Reviewed, Lang::Tr) => "inceledi", (K::ApprovedDismissed, Lang::En) => "approved these changes (dismissed)", (K::ApprovedDismissed, Lang::Tr) => "bu değişiklikleri onayladı (iptal edildi)", (K::RequestedDismissed, Lang::En) => "requested changes (dismissed)", (K::RequestedDismissed, Lang::Tr) => "değişiklik istedi (iptal edildi)", (K::ReviewedDismissed, Lang::En) => "reviewed (dismissed)", (K::ReviewedDismissed, Lang::Tr) => "inceledi (iptal edildi)", (K::DismissedPrefix, Lang::En) => "dismissed: ", (K::DismissedPrefix, Lang::Tr) => "iptal edildi: ", (K::AddReaction, Lang::En) => "Add reaction", (K::AddReaction, Lang::Tr) => "Tepki ekle", (K::NoDescription, Lang::En) => "_No description provided._", (K::NoDescription, Lang::Tr) => "_Açıklama girilmedi._", (K::NoRepoLabels, Lang::En) => "This repository has no labels yet.", (K::NoRepoLabels, Lang::Tr) => "Bu depoda henüz etiket yok.", (K::SaveLabels, Lang::En) => "Save labels", (K::SaveLabels, Lang::Tr) => "Etiketleri kaydet", (K::NoneYet, Lang::En) => "None yet.", (K::NoneYet, Lang::Tr) => "Henüz yok.", (K::Assignees, Lang::En) => "Assignees", (K::Assignees, Lang::Tr) => "Atananlar", (K::CommaUsernames, Lang::En) => "Comma-separated usernames.", (K::CommaUsernames, Lang::Tr) => "Kullanıcı adlarını virgülle ayırın.", (K::SaveAssignees, Lang::En) => "Save assignees", (K::SaveAssignees, Lang::Tr) => "Atananları kaydet", (K::NoOneAssigned, Lang::En) => "No one assigned.", (K::NoOneAssigned, Lang::Tr) => "Kimse atanmadı.", (K::MilestoneBox, Lang::En) => "Milestone", (K::MilestoneBox, Lang::Tr) => "Kilometre taşı", (K::NoneOption, Lang::En) => "None", (K::NoneOption, Lang::Tr) => "Yok", (K::SaveMilestone, Lang::En) => "Save milestone", (K::SaveMilestone, Lang::Tr) => "Kilometre taşını kaydet", (K::NoMilestone, Lang::En) => "No milestone.", (K::NoMilestone, Lang::Tr) => "Kilometre taşı yok.", (K::ConversationBox, Lang::En) => "Conversation", (K::ConversationBox, Lang::Tr) => "Tartışma", (K::Locked, Lang::En) => "Locked", (K::Locked, Lang::Tr) => "Kilitli", (K::UnlockConversation, Lang::En) => "Unlock conversation", (K::UnlockConversation, Lang::Tr) => "Tartışmanın kilidini aç", (K::NoReason, Lang::En) => "No reason", (K::NoReason, Lang::Tr) => "Neden yok", (K::LockReasonAria, Lang::En) => "Lock reason", (K::LockReasonAria, Lang::Tr) => "Kilit nedeni", (K::LockConversation, Lang::En) => "Lock conversation", (K::LockConversation, Lang::Tr) => "Tartışmayı kilitle", (K::LockedToCollaborators, Lang::En) => "Locked to collaborators", (K::LockedToCollaborators, Lang::Tr) => "Katkıda bulunanlarla sınırlı", (K::OpenToEveryone, Lang::En) => "Open to everyone", (K::OpenToEveryone, Lang::Tr) => "Herkese açık", (K::AddComment, Lang::En) => "Add a comment", (K::AddComment, Lang::Tr) => "Yorum ekle", (K::CloseCompleted, Lang::En) => "Close as completed", (K::CloseCompleted, Lang::Tr) => "Tamamlandı olarak kapat", (K::CloseNotPlanned, Lang::En) => "Close as not planned", (K::CloseNotPlanned, Lang::Tr) => "Planlanmadı olarak kapat", (K::ReopenWithComment, Lang::En) => "Reopen with comment", (K::ReopenWithComment, Lang::Tr) => "Yorumla yeniden aç", (K::CommentEmpty, Lang::En) => "Comment cannot be empty.", (K::CommentEmpty, Lang::Tr) => "Yorum boş olamaz.", (K::LabelsArchived, Lang::En) => "This repository is archived. Labels are read-only.", (K::LabelsArchived, Lang::Tr) => "Bu depo arşivlenmiş. Etiketler salt okunur.", (K::NoLabelsYet, Lang::En) => "No labels yet.", (K::NoLabelsYet, Lang::Tr) => "Henüz etiket yok.", (K::AddDefaultLabels, Lang::En) => "Add default labels", (K::AddDefaultLabels, Lang::Tr) => "Varsayılan etiketleri ekle", (K::SaveLabel, Lang::En) => "Save label", (K::SaveLabel, Lang::Tr) => "Etiketi kaydet", (K::NewLabel, Lang::En) => "New label", (K::NewLabel, Lang::Tr) => "Yeni etiket", (K::CreateLabel, Lang::En) => "Create label", (K::CreateLabel, Lang::Tr) => "Etiketi oluştur", (K::OpenLabelCount, Lang::En) => "open", (K::OpenLabelCount, Lang::Tr) => "açık", (K::MilestonesArchived, Lang::En) => { "This repository is archived. Milestones are read-only." } (K::MilestonesArchived, Lang::Tr) => "Bu depo arşivlenmiş. Kilometre taşları salt okunur.", (K::NoDueDate, Lang::En) => "No due date", (K::NoDueDate, Lang::Tr) => "Bitiş tarihi yok", (K::Overdue, Lang::En) => "overdue", (K::Overdue, Lang::Tr) => "gecikmiş", (K::MilestoneState, Lang::En) => "Milestone state", (K::MilestoneState, Lang::Tr) => "Kilometre taşı durumu", (K::NoClosedMilestones, Lang::En) => "No closed milestones.", (K::NoClosedMilestones, Lang::Tr) => "Kapalı kilometre taşı yok.", (K::NoOpenMilestones, Lang::En) => "No open milestones.", (K::NoOpenMilestones, Lang::Tr) => "Açık kilometre taşı yok.", (K::NewMilestone, Lang::En) => "New milestone", (K::NewMilestone, Lang::Tr) => "Yeni kilometre taşı", (K::DueDate, Lang::En) => "Due date", (K::DueDate, Lang::Tr) => "Bitiş tarihi", (K::CreateMilestone, Lang::En) => "Create milestone", (K::CreateMilestone, Lang::Tr) => "Kilometre taşı oluştur", (K::EditMilestone, Lang::En) => "Edit milestone", (K::EditMilestone, Lang::Tr) => "Kilometre taşını düzenle", (K::BackToMilestones, Lang::En) => "Back to milestones", (K::BackToMilestones, Lang::Tr) => "Kilometre taşlarına dön", (K::StateLabel, Lang::En) => "State", (K::StateLabel, Lang::Tr) => "Durum", (K::ClosedMilestoneCount, Lang::En) => "closed", (K::ClosedMilestoneCount, Lang::Tr) => "kapalı", (K::OpenMilestoneCount, Lang::En) => "open", (K::OpenMilestoneCount, Lang::Tr) => "açık", (K::OpenIssue, Lang::En) => "Open issue", (K::OpenIssue, Lang::Tr) => "Açık sorun", (K::ClosedIssue, Lang::En) => "Closed issue", (K::ClosedIssue, Lang::Tr) => "Kapalı sorun", (K::SortNewest, Lang::En) => "Newest", (K::SortNewest, Lang::Tr) => "En yeni", (K::SortOldest, Lang::En) => "Oldest", (K::SortOldest, Lang::Tr) => "En eski", (K::SortUpdated, Lang::En) => "Recently updated", (K::SortUpdated, Lang::Tr) => "Son güncellenen", (K::NewIssue, Lang::En) => "New issue", (K::NewIssue, Lang::Tr) => "Yeni sorun", (K::NoIssuesMatch, Lang::En) => "No issues match these filters.", (K::NoIssuesMatch, Lang::Tr) => "Bu filtrelerle eşleşen sorun yok.", (K::SearchTitles, Lang::En) => "Search titles", (K::SearchTitles, Lang::Tr) => "Başlıklarda ara", (K::IssuesByState, Lang::En) => "Issues by state", (K::IssuesByState, Lang::Tr) => "Duruma göre sorunlar", (K::LabelsAndMilestones, Lang::En) => "Labels and milestones", (K::LabelsAndMilestones, Lang::Tr) => "Etiketler ve kilometre taşları", (K::FiltersApplied, Lang::En) => "Filters applied · ", (K::FiltersApplied, Lang::Tr) => "Filtreler uygulandı · ", (K::ClearFilters, Lang::En) => "Clear filters", (K::ClearFilters, Lang::Tr) => "Filtreleri temizle", (K::Opened, Lang::En) => " opened ", (K::Opened, Lang::Tr) => " açıldı ", (K::By, Lang::En) => " by ", (K::By, Lang::Tr) => " tarafından ", (K::ChooseTemplate, Lang::En) => "Choose a template to start from.", (K::ChooseTemplate, Lang::Tr) => "Başlamak için bir şablon seçin.", (K::BlankIssue, Lang::En) => "Open a blank issue", (K::BlankIssue, Lang::Tr) => "Boş bir sorun aç", (K::MarkdownSupported, Lang::En) => "Markdown supported.", (K::MarkdownSupported, Lang::Tr) => "Markdown desteklenir.", (K::SubmitNewIssue, Lang::En) => "Submit new issue", (K::SubmitNewIssue, Lang::Tr) => "Yeni sorunu gönder", (K::Newer, Lang::En) => "Newer", (K::Newer, Lang::Tr) => "Daha yeni", (K::Older, Lang::En) => "Older", (K::Older, Lang::Tr) => "Daha eski", (K::HistIssueDescription, Lang::En) => "issue description", (K::HistIssueDescription, Lang::Tr) => "sorun açıklaması", (K::HistPullDescription, Lang::En) => "pull request description", (K::HistPullDescription, Lang::Tr) => "çekme isteği açıklaması", (K::HistComment, Lang::En) => "comment", (K::HistComment, Lang::Tr) => "yorum", (K::HistReviewComment, Lang::En) => "review comment", (K::HistReviewComment, Lang::Tr) => "inceleme yorumu", (K::NoTextChange, Lang::En) => "No change to the text.", (K::NoTextChange, Lang::Tr) => "Metinde değişiklik yok.", (K::NoEarlierVersions, Lang::En) => "No earlier versions.", (K::NoEarlierVersions, Lang::Tr) => "Önceki sürüm yok.", } } /// `1 comment` or `3 comments`. Turkish does not pluralise after a number. pub fn comment_count(lang: Lang, n: i64) -> String { match lang { Lang::En => format!("{n} comment{}", if n == 1 { "" } else { "s" }), Lang::Tr => format!("{n} yorum"), } } /// `1 earlier version` or `3 earlier versions`. pub fn earlier_versions(lang: Lang, n: usize) -> String { match lang { Lang::En => format!("{n} earlier version{}", if n == 1 { "" } else { "s" }), Lang::Tr => format!("{n} önceki sürüm"), } } /// `{n} open` on a label row. pub fn open_label_count(lang: Lang, n: i64) -> String { format!("{n} {}", t(lang, K::OpenLabelCount)) } /// `{n} open` on a milestone progress bar. pub fn open_milestone_count(lang: Lang, n: i64) -> String { format!("{n} {}", t(lang, K::OpenMilestoneCount)) } /// `{n} closed` on a milestone progress bar. pub fn closed_milestone_count(lang: Lang, n: i64) -> String { format!("{n} {}", t(lang, K::ClosedMilestoneCount)) } /// `Due {date}` on a milestone row. pub fn due_text(lang: Lang, due: &str) -> String { match lang { Lang::En => format!("Due {due}"), Lang::Tr => format!("Bitiş: {due}"), } } /// The lock notice on a conversation the viewer may not add to, with the reason label. pub fn conversation_locked_for(lang: Lang, reason: &str) -> String { match lang { Lang::En => { format!("This conversation has been locked ({reason}) and limited to collaborators.") } Lang::Tr => format!( "Bu tartışma kilitlendi ({reason}) ve yalnızca katkıda bulunanlarla sınırlandı." ), } } /// `Open {n}` on the issue state tabs. pub fn tab_open(lang: Lang, n: impl std::fmt::Display) -> String { match lang { Lang::En => format!("Open {n}"), Lang::Tr => format!("Açık {n}"), } } /// `Closed {n}` on the issue state tabs. pub fn tab_closed(lang: Lang, n: impl std::fmt::Display) -> String { match lang { Lang::En => format!("Closed {n}"), Lang::Tr => format!("Kapalı {n}"), } } /// `All {n}` on the issue state tabs. pub fn tab_all(lang: Lang, n: impl std::fmt::Display) -> String { match lang { Lang::En => format!("All {n}"), Lang::Tr => format!("Tümü {n}"), } } /// `Page {n}` under the issue list. pub fn page_label(lang: Lang, n: u32) -> String { match lang { Lang::En => format!("Page {n}"), Lang::Tr => format!("Sayfa {n}"), } } /// `Back to #{n}` on the edit history page. pub fn back_to_item(lang: Lang, number: i64) -> String { match lang { Lang::En => format!("Back to #{number}"), Lang::Tr => format!("#{number} numaraya dön"), } } /// `Edit issue #{n}` or `Edit pull request #{n}`. pub fn edit_heading(lang: Lang, pull: bool, number: i64) -> String { match (lang, pull) { (Lang::En, false) => format!("Edit issue #{number}"), (Lang::En, true) => format!("Edit pull request #{number}"), (Lang::Tr, false) => format!("Sorunu düzenle #{number}"), (Lang::Tr, true) => format!("Çekme isteğini düzenle #{number}"), } } /// The title of the item edit page: `Edit #{n} · {repo}`. pub fn edit_title(lang: Lang, number: i64, repo: &str) -> String { match lang { Lang::En => format!("Edit #{number} \u{b7} {repo}"), Lang::Tr => format!("#{number} düzenle \u{b7} {repo}"), } } /// The title of the comment edit page: `Edit comment on #{n} · {repo}`. pub fn edit_comment_title(lang: Lang, number: i64, repo: &str) -> String { match lang { Lang::En => format!("Edit comment on #{number} \u{b7} {repo}"), Lang::Tr => format!("#{number} sorunundaki yorumu düzenle \u{b7} {repo}"), } } /// `{repo} · Issues`. pub fn issues_title(lang: Lang, repo: &str) -> String { match lang { Lang::En => format!("{repo} \u{b7} Issues"), Lang::Tr => format!("{repo} \u{b7} Sorunlar"), } } /// `{repo} · New issue`. pub fn new_issue_title(lang: Lang, repo: &str) -> String { match lang { Lang::En => format!("{repo} \u{b7} New issue"), Lang::Tr => format!("{repo} \u{b7} Yeni sorun"), } } /// `{repo} · Labels`. pub fn labels_title(lang: Lang, repo: &str) -> String { match lang { Lang::En => format!("{repo} \u{b7} Labels"), Lang::Tr => format!("{repo} \u{b7} Etiketler"), } } /// `{repo} · Milestones`. pub fn milestones_title(lang: Lang, repo: &str) -> String { match lang { Lang::En => format!("{repo} \u{b7} Milestones"), Lang::Tr => format!("{repo} \u{b7} Kilometre taşları"), } } /// `{repo} · Edit milestone`. pub fn milestone_edit_title(lang: Lang, repo: &str) -> String { match lang { Lang::En => format!("{repo} \u{b7} Edit milestone"), Lang::Tr => format!("{repo} \u{b7} Kilometre taşını düzenle"), } } /// The reader text for the thing whose history is shown: `issue description`, `comment`, ... pub fn history_what(lang: Lang, pull: bool, target_kind: &str) -> &'static str { match target_kind { "issue" if pull => t(lang, K::HistPullDescription), "issue" => t(lang, K::HistIssueDescription), "comment" => t(lang, K::HistComment), _ => t(lang, K::HistReviewComment), } } /// The history page title: `Edit history of a {what} · {suffix}`. pub fn history_title(lang: Lang, what: &str, suffix: &str) -> String { match lang { Lang::En => format!("Edit history of a {what} \u{b7} {suffix}"), Lang::Tr => format!("Düzenleme geçmişi: {what} \u{b7} {suffix}"), } } /// The history page heading: `Edit history of {what}`. pub fn history_heading(lang: Lang, what: &str) -> String { match lang { Lang::En => format!("Edit history of {what}"), Lang::Tr => format!("Düzenleme geçmişi: {what}"), } } /// The title change line in the edit history: `Title: {from} → {to}`. pub fn title_change(lang: Lang, from: &str, to: &str) -> String { match lang { Lang::En => format!("Title: {from} \u{2192} {to}"), Lang::Tr => format!("Başlık: {from} \u{2192} {to}"), } } /// `{names} and {more} more` on a reaction's hover text. pub fn reaction_more(lang: Lang, names: &str, more: usize) -> String { match lang { Lang::En => format!("{names} and {more} more"), Lang::Tr => format!("{names} ve {more} daha"), } } // Timeline event sentences. pub fn event_label_added(lang: Lang, label: &str) -> String { match lang { Lang::En => format!("added the {label} label"), Lang::Tr => format!("{label} etiketini ekledi"), } } pub fn event_label_removed(lang: Lang, label: &str) -> String { match lang { Lang::En => format!("removed the {label} label"), Lang::Tr => format!("{label} etiketini kaldırdı"), } } pub fn event_assigned(lang: Lang, user: &str) -> String { match lang { Lang::En => format!("assigned {user}"), Lang::Tr => format!("{user} kullanıcısını atadı"), } } pub fn event_unassigned(lang: Lang, user: &str) -> String { match lang { Lang::En => format!("unassigned {user}"), Lang::Tr => format!("{user} kullanıcısının atamasını kaldırdı"), } } pub fn event_milestone_added(lang: Lang, title: &str) -> String { match lang { Lang::En => format!("added this to the {title} milestone"), Lang::Tr => format!("bunu {title} kilometre taşına ekledi"), } } pub fn event_milestone_removed(lang: Lang, title: &str) -> String { match lang { Lang::En => format!("removed this from the {title} milestone"), Lang::Tr => format!("bunu {title} kilometre taşından çıkardı"), } } pub fn event_renamed(lang: Lang, from: &str, to: &str) -> String { match lang { Lang::En => format!("changed the title from {from} to {to}"), Lang::Tr => format!("başlığı {from} yerine {to} olarak değiştirdi"), } } pub fn event_locked_as(lang: Lang, reason: &str) -> String { match lang { Lang::En => format!("locked this conversation as {reason}"), Lang::Tr => format!("bu tartışmayı {reason} olarak kilitledi"), } } pub fn event_branch_deleted(lang: Lang, branch: &str) -> String { match lang { Lang::En => format!("deleted the {branch} branch"), Lang::Tr => format!("{branch} dalını sildi"), } } pub fn event_branch_restored(lang: Lang, branch: &str) -> String { match lang { Lang::En => format!("restored the {branch} branch"), Lang::Tr => format!("{branch} dalını geri yükledi"), } } pub fn event_thread_resolved(lang: Lang, path: &str) -> String { match lang { Lang::En => format!("resolved a conversation on {path}"), Lang::Tr => format!("{path} üzerindeki bir tartışmayı çözdü"), } } pub fn event_thread_unresolved(lang: Lang, path: &str) -> String { match lang { Lang::En => format!("unresolved a conversation on {path}"), Lang::Tr => format!("{path} üzerindeki bir tartışmayı yeniden açtı"), } } pub fn event_base_changed(lang: Lang, from: &str, to: &str) -> String { match lang { Lang::En => format!("changed the base branch from {from} to {to}"), Lang::Tr => format!("temel dalı {from} yerine {to} olarak değiştirdi"), } } /// `into {branch}` after a merged event. pub fn event_merged_into(lang: Lang, branch: &str) -> String { match lang { Lang::En => format!("into {branch}"), Lang::Tr => format!("{branch} dalına"), } } /// `from {a}..{b}` after a head update. pub fn event_pushed_range(lang: Lang, from: &str, to: &str) -> String { match lang { Lang::En => format!("from {from}..{to}"), Lang::Tr => format!("{from}..{to} arasında"), } } /// The lead-in before the sign-in link under a conversation: empty in English, and in Turkish the /// purpose comes first, as in `Yorum yapmak için giriş yapın.` pub fn comment_login_lead(lang: Lang) -> &'static str { match lang { Lang::En => "", Lang::Tr => "Yorum yapmak için ", } } /// The text on either side of a commit link in a `closed`, `referenced` or `merged` timeline /// event, as `(before, after)`. `verb` is the localised verb, `branch` the base branch for /// `merged` (empty when unknown) and `linked` whether the commit link is shown. English reads /// `closed this in ` or `merged commit into `. Turkish puts the commit first /// and the verb last, so with a link the whole sentence moves after it: ` commit'inde ...`. pub fn commit_event_sides( lang: Lang, kind: &str, verb: &str, branch: &str, linked: bool, ) -> (String, String) { match (lang, kind) { (Lang::En, "merged") => { let after = if branch.is_empty() { String::new() } else { event_merged_into(lang, branch) }; (verb.to_owned(), after) } (Lang::En, _) if linked => (format!("{verb}{}", t(lang, K::InCommit)), String::new()), (Lang::En, _) => (verb.to_owned(), String::new()), (Lang::Tr, "merged") => { let sentence = if branch.is_empty() { t(lang, K::MergedCommit).to_owned() } else { format!("commit'i {branch} dalına birleştirdi") }; if linked { (String::new(), sentence) } else { (sentence, String::new()) } } (Lang::Tr, _) if linked => (String::new(), format!("{} {verb}", t(lang, K::InCommit))), (Lang::Tr, _) => (verb.to_owned(), String::new()), } } #[cfg(test)] mod tests { use super::{K, Lang, commit_event_sides, t}; const ALL: &[K] = &[ K::CouldNotSave, K::GoBack, K::Issues, K::Labels, K::Milestones, K::Pinned, K::Comment, K::Edit, K::Delete, K::Title, K::Description, K::Cancel, K::Name, K::Color, K::Reason, K::None, K::Open, K::Closed, K::Search, K::Sort, K::Unknown, K::System, K::Edited, K::EditedBy, K::Raw, K::IssuePages, K::PinIssue, K::UnpinIssue, K::PinnedTopNote, K::NotPinned, K::PinnedIssues, K::LockOffTopic, K::LockTooHeated, K::LockResolved, K::LockSpam, K::OptOffTopic, K::OptTooHeated, K::OptResolved, K::OptSpam, K::ConversationLocked, K::ArchivedIssuesReadOnly, K::LogIn, K::LogInLink, K::ToComment, K::ClosedCompleted, K::ClosedNotPlanned, K::ClosedThis, K::ReopenedThis, K::ReferencedThis, K::LockedConversation, K::UnlockedConversation, K::PinnedThisIssue, K::UnpinnedThisIssue, K::MergedCommit, K::PushedNewCommits, K::DeletedHeadBranch, K::InCommit, K::ReviewDismissedPrefix, K::OpenedThis, K::StateClosedNotPlanned, K::SaveChanges, K::EditComment, K::SaveComment, K::ApprovedChanges, K::RequestedChanges, K::Reviewed, K::ApprovedDismissed, K::RequestedDismissed, K::ReviewedDismissed, K::DismissedPrefix, K::AddReaction, K::NoDescription, K::NoRepoLabels, K::SaveLabels, K::NoneYet, K::Assignees, K::CommaUsernames, K::SaveAssignees, K::NoOneAssigned, K::MilestoneBox, K::NoneOption, K::SaveMilestone, K::NoMilestone, K::ConversationBox, K::Locked, K::UnlockConversation, K::NoReason, K::LockReasonAria, K::LockConversation, K::LockedToCollaborators, K::OpenToEveryone, K::AddComment, K::CloseCompleted, K::CloseNotPlanned, K::ReopenWithComment, K::CommentEmpty, K::LabelsArchived, K::NoLabelsYet, K::AddDefaultLabels, K::SaveLabel, K::NewLabel, K::CreateLabel, K::OpenLabelCount, K::MilestonesArchived, K::NoDueDate, K::Overdue, K::MilestoneState, K::NoClosedMilestones, K::NoOpenMilestones, K::NewMilestone, K::DueDate, K::CreateMilestone, K::EditMilestone, K::BackToMilestones, K::StateLabel, K::ClosedMilestoneCount, K::OpenMilestoneCount, K::OpenIssue, K::ClosedIssue, K::SortNewest, K::SortOldest, K::SortUpdated, K::NewIssue, K::NoIssuesMatch, K::SearchTitles, K::IssuesByState, K::LabelsAndMilestones, K::FiltersApplied, K::ClearFilters, K::Opened, K::By, K::ChooseTemplate, K::BlankIssue, K::MarkdownSupported, K::SubmitNewIssue, K::Newer, K::Older, K::HistIssueDescription, K::HistPullDescription, K::HistComment, K::HistReviewComment, K::NoTextChange, K::NoEarlierVersions, ]; #[test] fn every_key_has_both_languages() { let mut differing = 0; for key in ALL { let en = t(Lang::En, *key); let tr = t(Lang::Tr, *key); assert!(!en.is_empty(), "{key:?} has no English text"); assert!(!tr.is_empty(), "{key:?} has no Turkish text"); if en != tr { differing += 1; } } assert!(differing >= 3, "only {differing} keys differ from English"); } #[test] fn english_commit_sides_are_unchanged() { let (before, after) = commit_event_sides(Lang::En, "closed", "closed this", "", true); assert_eq!((before.as_str(), after.as_str()), ("closed this in", "")); let (before, after) = commit_event_sides(Lang::En, "merged", "merged commit", "main", true); assert_eq!( (before.as_str(), after.as_str()), ("merged commit", "into main") ); let (before, after) = commit_event_sides(Lang::En, "merged", "merged commit", "", false); assert_eq!((before.as_str(), after.as_str()), ("merged commit", "")); } }