Tahinli/forge
public0 watching
★ 0
| 1 | //! Strings for the pull request conversation, Files tab review threads and review routes. |
| 2 | //! See `docs` in `super` for the pattern. |
| 3 | |
| 4 | use std::fmt::Display; |
| 5 | |
| 6 | use super::Lang; |
| 7 | |
| 8 | #[derive(Clone, Copy, Debug, PartialEq, Eq)] |
| 9 | pub enum K { |
| 10 | StateMerged, |
| 11 | StateOpen, |
| 12 | StateClosed, |
| 13 | Unknown, |
| 14 | ByWantsToMerge, |
| 15 | ByInto, |
| 16 | ByFrom, |
| 17 | BylineEnd, |
| 18 | TabConversation, |
| 19 | PullPages, |
| 20 | MergeClean, |
| 21 | MergeConflict, |
| 22 | MergeUpToDate, |
| 23 | MergeChecking, |
| 24 | ReloadToCheck, |
| 25 | MergeStyleLegend, |
| 26 | StyleMergeCommit, |
| 27 | StyleSquash, |
| 28 | StyleFastForward, |
| 29 | MergeMessageLabel, |
| 30 | MergeButton, |
| 31 | MergedByPrefix, |
| 32 | MergedByMiddle, |
| 33 | MergedAsSep, |
| 34 | DismissButton, |
| 35 | ArchivedReadOnly, |
| 36 | LoginBefore, |
| 37 | LoginLink, |
| 38 | LoginAfter, |
| 39 | MergedCannotChange, |
| 40 | NoCommits, |
| 41 | Committed, |
| 42 | BrowseFiles, |
| 43 | ErrConflict, |
| 44 | ErrUpToDate, |
| 45 | ErrFfImpossible, |
| 46 | ErrBaseMoved, |
| 47 | ErrAlreadyMerged, |
| 48 | ErrNotOpen, |
| 49 | ErrHeadMissing, |
| 50 | ErrBaseMissing, |
| 51 | ErrNeedsApprovals, |
| 52 | ErrChangesRequested, |
| 53 | ErrNotUpToDate, |
| 54 | ErrMessageInvalid, |
| 55 | ReviewErrStale, |
| 56 | ReviewErrOwnPr, |
| 57 | ReviewErrEmpty, |
| 58 | ReviewErrInvalid, |
| 59 | ReviewErrBadLine, |
| 60 | ReviewErrClosed, |
| 61 | EditReviewComment, |
| 62 | CommentLabel, |
| 63 | SaveComment, |
| 64 | CancelButton, |
| 65 | Unresolve, |
| 66 | Resolve, |
| 67 | Outdated, |
| 68 | Pending, |
| 69 | ReplyLabel, |
| 70 | ReplyButton, |
| 71 | Edited, |
| 72 | EditLink, |
| 73 | DeleteButton, |
| 74 | } |
| 75 | |
| 76 | pub fn t(lang: Lang, key: K) -> &'static str { |
| 77 | use K::*; |
| 78 | use Lang::{En, Tr}; |
| 79 | match (key, lang) { |
| 80 | (StateMerged, En) => "Merged", |
| 81 | (StateMerged, Tr) => "Birleştirildi", |
| 82 | (StateOpen, En) => "Open", |
| 83 | (StateOpen, Tr) => "Açık", |
| 84 | (StateClosed, En) => "Closed", |
| 85 | (StateClosed, Tr) => "Kapalı", |
| 86 | (Unknown, En) => "unknown", |
| 87 | (Unknown, Tr) => "bilinmiyor", |
| 88 | (ByWantsToMerge, En) => " wants to merge ", |
| 89 | (ByWantsToMerge, Tr) => ", ", |
| 90 | (ByInto, En) => " into ", |
| 91 | (ByInto, Tr) => " dalına ", |
| 92 | (ByFrom, En) => " from ", |
| 93 | (ByFrom, Tr) => " dalından ", |
| 94 | (BylineEnd, En) => " · ", |
| 95 | (BylineEnd, Tr) => " birleştirmek istiyor · ", |
| 96 | (TabConversation, En) => "Conversation", |
| 97 | (TabConversation, Tr) => "Tartışma", |
| 98 | (PullPages, En) => "Pull request pages", |
| 99 | (PullPages, Tr) => "Çekme isteği sayfaları", |
| 100 | (MergeClean, En) => "This branch has no conflicts with the base branch", |
| 101 | (MergeClean, Tr) => "Bu dalın taban dalla çakışması yok", |
| 102 | (MergeConflict, En) => "This branch has conflicts that must be resolved", |
| 103 | (MergeConflict, Tr) => "Bu dalda çözülmesi gereken çakışmalar var", |
| 104 | (MergeUpToDate, En) => "This branch is already up to date with base", |
| 105 | (MergeUpToDate, Tr) => "Bu dal zaten taban dalla güncel", |
| 106 | (MergeChecking, En) => "Checking mergeability\u{2026}", |
| 107 | (MergeChecking, Tr) => "Birleştirilebilirlik kontrol ediliyor\u{2026}", |
| 108 | (ReloadToCheck, En) => "Reload to check again", |
| 109 | (ReloadToCheck, Tr) => "Yeniden kontrol etmek için sayfayı yenileyin", |
| 110 | (MergeStyleLegend, En) => "Merge style", |
| 111 | (MergeStyleLegend, Tr) => "Birleştirme yöntemi", |
| 112 | (StyleMergeCommit, En) => " Create a merge commit", |
| 113 | (StyleMergeCommit, Tr) => " Birleştirme commit’i oluştur", |
| 114 | (StyleSquash, En) => " Squash and merge", |
| 115 | (StyleSquash, Tr) => " Sıkıştır ve birleştir", |
| 116 | (StyleFastForward, En) => " Fast-forward", |
| 117 | (StyleFastForward, Tr) => " İleri sarma (fast-forward)", |
| 118 | (MergeMessageLabel, En) => "Merge commit message (optional)", |
| 119 | (MergeMessageLabel, Tr) => "Birleştirme commit mesajı (isteğe bağlı)", |
| 120 | (MergeButton, En) => "Merge pull request", |
| 121 | (MergeButton, Tr) => "Çekme isteğini birleştir", |
| 122 | (MergedByPrefix, En) => "Merged by ", |
| 123 | (MergedByPrefix, Tr) => "Birleştiren: ", |
| 124 | (MergedByMiddle, En) => " ", |
| 125 | (MergedByMiddle, Tr) => " · ", |
| 126 | (MergedAsSep, En) => " as ", |
| 127 | (MergedAsSep, Tr) => " · commit ", |
| 128 | (DismissButton, En) => "Dismiss", |
| 129 | (DismissButton, Tr) => "Yok say", |
| 130 | (ArchivedReadOnly, En) => { |
| 131 | "This repository is archived, so its pull requests are read-only." |
| 132 | } |
| 133 | (ArchivedReadOnly, Tr) => "Bu depo arşivlendiği için çekme istekleri salt okunurdur.", |
| 134 | (LoginBefore, En) => "", |
| 135 | (LoginBefore, Tr) => "Yorum yazmak için ", |
| 136 | (LoginLink, En) => "Log in", |
| 137 | (LoginLink, Tr) => "giriş yapın", |
| 138 | (LoginAfter, En) => " to comment.", |
| 139 | (LoginAfter, Tr) => ".", |
| 140 | (MergedCannotChange, En) => "A merged pull request cannot change state.", |
| 141 | (MergedCannotChange, Tr) => "Birleştirilmiş bir çekme isteğinin durumu değiştirilemez.", |
| 142 | (NoCommits, En) => "No commits.", |
| 143 | (NoCommits, Tr) => "Commit yok.", |
| 144 | (Committed, En) => "committed", |
| 145 | (Committed, Tr) => "işledi", |
| 146 | (BrowseFiles, En) => "Browse files", |
| 147 | (BrowseFiles, Tr) => "Dosyalara göz at", |
| 148 | (ErrConflict, En) => { |
| 149 | "This branch has conflicts that must be resolved. Resolve them on the branch, then try again." |
| 150 | } |
| 151 | (ErrConflict, Tr) => { |
| 152 | "Bu dalda çözülmesi gereken çakışmalar var. Çakışmaları dalda çözün, sonra yeniden deneyin." |
| 153 | } |
| 154 | (ErrUpToDate, En) => { |
| 155 | "There is nothing to merge: this branch is already contained in the base branch." |
| 156 | } |
| 157 | (ErrUpToDate, Tr) => { |
| 158 | "Birleştirilecek bir şey yok: bu dal zaten taban dalın içinde yer alıyor." |
| 159 | } |
| 160 | (ErrFfImpossible, En) => { |
| 161 | "A fast-forward is not possible because the base branch has commits this branch does not contain. Choose a merge commit or a squash instead." |
| 162 | } |
| 163 | (ErrFfImpossible, Tr) => { |
| 164 | "Taban dalda bu dalda bulunmayan commitler olduğu için ileri sarma yapılamaz. Bunun yerine birleştirme commit’i veya sıkıştırma seçin." |
| 165 | } |
| 166 | (ErrBaseMoved, En) => { |
| 167 | "The base branch changed while you were merging. Reload this page and try again." |
| 168 | } |
| 169 | (ErrBaseMoved, Tr) => { |
| 170 | "Birleştirme sırasında taban dal değişti. Bu sayfayı yenileyip yeniden deneyin." |
| 171 | } |
| 172 | (ErrAlreadyMerged, En) => "This pull request is already merged.", |
| 173 | (ErrAlreadyMerged, Tr) => "Bu çekme isteği zaten birleştirilmiş.", |
| 174 | (ErrNotOpen, En) => "This pull request is closed, so it cannot be merged.", |
| 175 | (ErrNotOpen, Tr) => "Bu çekme isteği kapalı olduğu için birleştirilemez.", |
| 176 | (ErrHeadMissing, En) => { |
| 177 | "The head repository was deleted, so this pull request cannot be merged." |
| 178 | } |
| 179 | (ErrHeadMissing, Tr) => "Kaynak depo silindiği için bu çekme isteği birleştirilemez.", |
| 180 | (ErrBaseMissing, En) => "The base branch does not exist.", |
| 181 | (ErrBaseMissing, Tr) => "Taban dal mevcut değil.", |
| 182 | (ErrNeedsApprovals, En) => { |
| 183 | "This branch needs more approvals from reviewers with Write access before it can be merged." |
| 184 | } |
| 185 | (ErrNeedsApprovals, Tr) => { |
| 186 | "Bu dalın birleştirilmesi için yazma yetkisi olan inceleyenlerden daha fazla onay gerekiyor." |
| 187 | } |
| 188 | (ErrChangesRequested, En) => { |
| 189 | "Changes have been requested, so this branch cannot be merged until they are resolved." |
| 190 | } |
| 191 | (ErrChangesRequested, Tr) => { |
| 192 | "Değişiklik istendiği için bu dal, istenen değişiklikler çözülene kadar birleştirilemez." |
| 193 | } |
| 194 | (ErrNotUpToDate, En) => { |
| 195 | "The pull request head must contain the latest base branch before it can be merged. Update the branch, then try again." |
| 196 | } |
| 197 | (ErrNotUpToDate, Tr) => { |
| 198 | "Çekme isteğinin kaynak dalı, birleştirilmeden önce en son taban dalı içermelidir. Dalı güncelleyip yeniden deneyin." |
| 199 | } |
| 200 | (ErrMessageInvalid, En) => { |
| 201 | "The merge message is longer than 64 KiB or contains a NUL byte. Shorten it and try again." |
| 202 | } |
| 203 | (ErrMessageInvalid, Tr) => { |
| 204 | "Birleştirme mesajı 64 KiB’tan uzun veya NUL karakteri içeriyor. Kısaltıp yeniden deneyin." |
| 205 | } |
| 206 | (ReviewErrStale, En) => "The pull request changed. Reload the page and try again.", |
| 207 | (ReviewErrStale, Tr) => "Çekme isteği değişti. Sayfayı yenileyip yeniden deneyin.", |
| 208 | (ReviewErrOwnPr, En) => "You cannot approve or request changes on your own pull request.", |
| 209 | (ReviewErrOwnPr, Tr) => { |
| 210 | "Kendi çekme isteğinizi onaylayamaz veya üzerinde değişiklik isteyemezsiniz." |
| 211 | } |
| 212 | (ReviewErrEmpty, En) => "Write a comment before you submit.", |
| 213 | (ReviewErrEmpty, Tr) => "Göndermeden önce bir yorum yazın.", |
| 214 | (ReviewErrInvalid, En) => "That comment could not be saved.", |
| 215 | (ReviewErrInvalid, Tr) => "Bu yorum kaydedilemedi.", |
| 216 | (ReviewErrBadLine, En) => { |
| 217 | "That line is not part of this diff any more. Reload the page and try again." |
| 218 | } |
| 219 | (ReviewErrBadLine, Tr) => { |
| 220 | "Bu satır artık bu farkın parçası değil. Sayfayı yenileyip yeniden deneyin." |
| 221 | } |
| 222 | (ReviewErrClosed, En) => "This pull request is closed, so new reviews cannot be submitted.", |
| 223 | (ReviewErrClosed, Tr) => { |
| 224 | "Bu çekme isteği kapalı olduğu için yeni incelemeler gönderilemez." |
| 225 | } |
| 226 | (EditReviewComment, En) => "Edit review comment", |
| 227 | (EditReviewComment, Tr) => "İnceleme yorumunu düzenle", |
| 228 | (CommentLabel, En) => "Comment", |
| 229 | (CommentLabel, Tr) => "Yorum", |
| 230 | (SaveComment, En) => "Save comment", |
| 231 | (SaveComment, Tr) => "Yorumu kaydet", |
| 232 | (CancelButton, En) => "Cancel", |
| 233 | (CancelButton, Tr) => "İptal", |
| 234 | (Unresolve, En) => "Unresolve", |
| 235 | (Unresolve, Tr) => "Çözümü geri al", |
| 236 | (Resolve, En) => "Resolve", |
| 237 | (Resolve, Tr) => "Çözüldü olarak işaretle", |
| 238 | (Outdated, En) => "Outdated", |
| 239 | (Outdated, Tr) => "Güncel değil", |
| 240 | (Pending, En) => "Pending", |
| 241 | (Pending, Tr) => "Bekliyor", |
| 242 | (ReplyLabel, En) => "Reply", |
| 243 | (ReplyLabel, Tr) => "Yanıt", |
| 244 | (ReplyButton, En) => "Reply", |
| 245 | (ReplyButton, Tr) => "Yanıtla", |
| 246 | (Edited, En) => "edited", |
| 247 | (Edited, Tr) => "düzenlendi", |
| 248 | (EditLink, En) => "Edit", |
| 249 | (EditLink, Tr) => "Düzenle", |
| 250 | (DeleteButton, En) => "Delete", |
| 251 | (DeleteButton, Tr) => "Sil", |
| 252 | } |
| 253 | } |
| 254 | |
| 255 | /// "1 commit", "3 commits"; Turkish does not pluralise after a number. |
| 256 | pub fn commit_count_line(lang: Lang, count: usize) -> String { |
| 257 | match lang { |
| 258 | Lang::En if count == 1 => "1 commit".to_owned(), |
| 259 | Lang::En => format!("{count} commits"), |
| 260 | Lang::Tr => format!("{count} commit’i"), |
| 261 | } |
| 262 | } |
| 263 | |
| 264 | /// The Commits sub-tab label with its count. |
| 265 | pub fn commits_tab(lang: Lang, count: usize) -> String { |
| 266 | match lang { |
| 267 | Lang::En => format!("Commits {count}"), |
| 268 | Lang::Tr => format!("Commitler {count}"), |
| 269 | } |
| 270 | } |
| 271 | |
| 272 | /// The Files changed sub-tab label with its count. |
| 273 | pub fn files_tab(lang: Lang, count: usize) -> String { |
| 274 | match lang { |
| 275 | Lang::En => format!("Files changed {count}"), |
| 276 | Lang::Tr => format!("Değişen dosyalar {count}"), |
| 277 | } |
| 278 | } |
| 279 | |
| 280 | /// A head branch whose repository was deleted. |
| 281 | pub fn branch_deleted(lang: Lang, branch: &str) -> String { |
| 282 | match lang { |
| 283 | Lang::En => format!("{branch} (deleted)"), |
| 284 | Lang::Tr => format!("{branch} (silinmiş)"), |
| 285 | } |
| 286 | } |
| 287 | |
| 288 | /// "2 of 3 required approvals". |
| 289 | pub fn approvals_of(lang: Lang, have: impl Display, need: impl Display) -> String { |
| 290 | match lang { |
| 291 | Lang::En => format!("{have} of {need} required approvals"), |
| 292 | Lang::Tr => format!("{have} / {need} gerekli onay"), |
| 293 | } |
| 294 | } |
| 295 | |
| 296 | /// "Approved by Ada, Lin". |
| 297 | pub fn approved_by(lang: Lang, names: &str) -> String { |
| 298 | match lang { |
| 299 | Lang::En => format!("Approved by {names}"), |
| 300 | Lang::Tr => format!("{names} tarafından onaylandı"), |
| 301 | } |
| 302 | } |
| 303 | |
| 304 | /// "Changes requested by Ada". |
| 305 | pub fn changes_requested_by(lang: Lang, names: &str) -> String { |
| 306 | match lang { |
| 307 | Lang::En => format!("Changes requested by {names}"), |
| 308 | Lang::Tr => format!("{names} tarafından değişiklik istendi"), |
| 309 | } |
| 310 | } |
| 311 | |
| 312 | /// The label of the reason field on a Dismiss form. |
| 313 | pub fn dismiss_reason(lang: Lang, author: &str) -> String { |
| 314 | match lang { |
| 315 | Lang::En => format!("Reason for dismissing {author}'s review"), |
| 316 | Lang::Tr => format!("{author} adlı kullanıcının incelemesini yok saymanın nedeni"), |
| 317 | } |
| 318 | } |
| 319 | |
| 320 | /// The summary of a resolved thread, naming its `path:line`. |
| 321 | pub fn resolved_conversation(lang: Lang, location: &str) -> String { |
| 322 | match lang { |
| 323 | Lang::En => format!("Resolved conversation on {location}"), |
| 324 | Lang::Tr => format!("{location} konumundaki tartışma çözüldü"), |
| 325 | } |
| 326 | } |
| 327 | |
| 328 | /// The page title of the edit form for a review comment on a pull request. |
| 329 | pub fn edit_title(lang: Lang, number: i64, repo: &str) -> String { |
| 330 | match lang { |
| 331 | Lang::En => format!("Edit review comment on #{number} \u{b7} {repo}"), |
| 332 | Lang::Tr => { |
| 333 | format!("#{number} numaralı çekme isteğindeki inceleme yorumunu düzenle \u{b7} {repo}") |
| 334 | } |
| 335 | } |
| 336 | } |
| 337 | |
| 338 | #[cfg(test)] |
| 339 | pub const ALL: &[K] = &[ |
| 340 | K::StateMerged, |
| 341 | K::StateOpen, |
| 342 | K::StateClosed, |
| 343 | K::Unknown, |
| 344 | K::ByWantsToMerge, |
| 345 | K::ByInto, |
| 346 | K::ByFrom, |
| 347 | K::BylineEnd, |
| 348 | K::TabConversation, |
| 349 | K::PullPages, |
| 350 | K::MergeClean, |
| 351 | K::MergeConflict, |
| 352 | K::MergeUpToDate, |
| 353 | K::MergeChecking, |
| 354 | K::ReloadToCheck, |
| 355 | K::MergeStyleLegend, |
| 356 | K::StyleMergeCommit, |
| 357 | K::StyleSquash, |
| 358 | K::StyleFastForward, |
| 359 | K::MergeMessageLabel, |
| 360 | K::MergeButton, |
| 361 | K::MergedByPrefix, |
| 362 | K::MergedByMiddle, |
| 363 | K::MergedAsSep, |
| 364 | K::DismissButton, |
| 365 | K::ArchivedReadOnly, |
| 366 | K::LoginBefore, |
| 367 | K::LoginLink, |
| 368 | K::LoginAfter, |
| 369 | K::MergedCannotChange, |
| 370 | K::NoCommits, |
| 371 | K::Committed, |
| 372 | K::BrowseFiles, |
| 373 | K::ErrConflict, |
| 374 | K::ErrUpToDate, |
| 375 | K::ErrFfImpossible, |
| 376 | K::ErrBaseMoved, |
| 377 | K::ErrAlreadyMerged, |
| 378 | K::ErrNotOpen, |
| 379 | K::ErrHeadMissing, |
| 380 | K::ErrBaseMissing, |
| 381 | K::ErrNeedsApprovals, |
| 382 | K::ErrChangesRequested, |
| 383 | K::ErrNotUpToDate, |
| 384 | K::ErrMessageInvalid, |
| 385 | K::ReviewErrStale, |
| 386 | K::ReviewErrOwnPr, |
| 387 | K::ReviewErrEmpty, |
| 388 | K::ReviewErrInvalid, |
| 389 | K::ReviewErrBadLine, |
| 390 | K::ReviewErrClosed, |
| 391 | K::EditReviewComment, |
| 392 | K::CommentLabel, |
| 393 | K::SaveComment, |
| 394 | K::CancelButton, |
| 395 | K::Unresolve, |
| 396 | K::Resolve, |
| 397 | K::Outdated, |
| 398 | K::Pending, |
| 399 | K::ReplyLabel, |
| 400 | K::ReplyButton, |
| 401 | K::Edited, |
| 402 | K::EditLink, |
| 403 | K::DeleteButton, |
| 404 | ]; |
| 405 | |
| 406 | #[cfg(test)] |
| 407 | mod tests { |
| 408 | use super::*; |
| 409 | |
| 410 | #[test] |
| 411 | fn every_key_has_english_and_turkish() { |
| 412 | for key in ALL { |
| 413 | // The English lead before a login link is empty by design. |
| 414 | if *key != K::LoginBefore { |
| 415 | assert!(!t(Lang::En, *key).is_empty(), "{key:?} has no English"); |
| 416 | } |
| 417 | assert!(!t(Lang::Tr, *key).is_empty(), "{key:?} has no Turkish"); |
| 418 | } |
| 419 | } |
| 420 | |
| 421 | #[test] |
| 422 | fn turkish_differs_from_english_for_translated_keys() { |
| 423 | let differing = ALL |
| 424 | .iter() |
| 425 | .filter(|key| t(Lang::En, **key) != t(Lang::Tr, **key)) |
| 426 | .count(); |
| 427 | assert!(differing >= 3, "only {differing} keys differ"); |
| 428 | assert_eq!(t(Lang::En, K::StateOpen), "Open"); |
| 429 | assert_eq!(t(Lang::Tr, K::StateOpen), "Açık"); |
| 430 | } |
| 431 | |
| 432 | #[test] |
| 433 | fn counted_helpers_match_english_text() { |
| 434 | assert_eq!(commit_count_line(Lang::En, 1), "1 commit"); |
| 435 | assert_eq!(commit_count_line(Lang::En, 3), "3 commits"); |
| 436 | assert_eq!(commits_tab(Lang::En, 4), "Commits 4"); |
| 437 | assert_eq!(files_tab(Lang::En, 2), "Files changed 2"); |
| 438 | assert_eq!(approvals_of(Lang::En, 1, 2), "1 of 2 required approvals"); |
| 439 | assert_eq!(commit_count_line(Lang::Tr, 3), "3 commit’i"); |
| 440 | } |
| 441 | } |