//! 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", ""));
}
}