Merge PR #663: i18n: Turkish (tr) interface language

This commit is contained in:
aiongg
2026-10-22 02:34:35 +00:00
10 changed files with 466 additions and 8 deletions
+5 -2
View File
@@ -60,11 +60,14 @@ sync_github_name = true
[people.jsymes21-byte]
real_name = "James Symes"
sync_github_name = true
[people.Silvertree2010]
display_name = "Netter"
sync_github_name = false
[people.Shnrqpdr]
sync_github_name = true
[people.yeniufuklar-com]
real_name = "Ufuk Efe"
display_name = "Ufuk Efe"
sync_github_name = true
+1 -1
View File
@@ -1,7 +1,7 @@
//! Renders the whole GridCraft window offscreen (wgpu, no window) to a PNG.
//!
//! `cargo run --release -p gridcraft-ui-egui --example snapshot -- [--sample sales] [--in file.xlsx]
//! [--size 1440x900] [--scale 2] [--cmd 'id={json}']... [--tab Insert] [--dark] [--language en|zh|ja|ko|ru|pt|cs]
//! [--size 1440x900] [--scale 2] [--cmd 'id={json}']... [--tab Insert] [--dark] [--language en|es|zh|ja|ko|ru|pt|de|cs|fr|tr]
//! [--dialog 'name={json}'] [--hf-edit header|footer] out.png`
use gridcraft_engine::Session;
+5 -1
View File
@@ -195,7 +195,11 @@ pub fn handle(app: &mut SheetApp, ctx: &egui::Context, method: &str, p: &Json) -
"Submit Print Job",
"existing file.print sheet/pagination params → {printing,bytes,pending}; submits without opening a dialog",
),
("app.language.set", "Interface Language", "{language: \"en\"|\"zh\"|\"ja\"|\"ko\"|\"ru\"|\"pt\"|\"de\"|\"cs\"} (alias: code)"),
(
"app.language.set",
"Interface Language",
"{language: \"en\"|\"zh\"|\"ja\"|\"ko\"|\"ru\"|\"pt\"|\"de\"|\"cs\"|\"fr\"|\"tr\"} (alias: code)",
),
("app.language.english", "Interface Language: English", ""),
("app.language.japanese", "Interface Language: Japanese", ""),
] {
+17 -1
View File
@@ -17,6 +17,7 @@ mod ko;
mod pt;
mod ru;
mod sr;
mod tr;
mod zh;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
@@ -35,10 +36,12 @@ pub enum Language {
Cs,
Fr,
Sr,
Tr,
}
impl Language {
pub const ALL: [Self; 11] = [Self::En, Self::Es, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr];
pub const ALL: [Self; 12] =
[Self::En, Self::Es, Self::Zh, Self::Ja, Self::Ko, Self::Ru, Self::PtBr, Self::De, Self::Cs, Self::Fr, Self::Sr, Self::Tr];
/// The language's own name, shown in the switcher.
pub fn name(self) -> &'static str {
@@ -54,6 +57,7 @@ impl Language {
Self::Cs => "Čeština",
Self::Fr => "Français",
Self::Sr => "Srpski",
Self::Tr => "Türkçe",
}
}
@@ -71,6 +75,7 @@ impl Language {
Self::Cs => "cs",
Self::Fr => "fr",
Self::Sr => "sr",
Self::Tr => "tr",
}
}
@@ -91,6 +96,7 @@ impl Language {
"cs" => Some(Self::Cs),
"fr" => Some(Self::Fr),
"sr" => Some(Self::Sr),
"tr" => Some(Self::Tr),
_ => None,
}
}
@@ -129,6 +135,7 @@ impl Language {
Self::Cs => cs::translate(text),
Self::Fr => fr::translate(text),
Self::Sr => sr::translate(text),
Self::Tr => tr::translate(text),
};
translated.unwrap_or_else(|| text.rsplit_once('|').map_or(text, |(_, label)| label))
}
@@ -611,6 +618,7 @@ mod tests {
assert!(cs::translate(english).is_some_and(|text| !text.is_empty()), "missing Czech: {english}");
assert!(fr::translate(english).is_some_and(|text| !text.is_empty()), "missing French: {english}");
assert!(sr::translate(english).is_some_and(|text| !text.is_empty()), "missing Serbian: {english}");
assert!(tr::translate(english).is_some_and(|text| !text.is_empty()), "missing Turkish: {english}");
}
assert_eq!(Language::Ja.tr("Data"), "データ");
assert_eq!(Language::Zh.tr("Data"), "数据");
@@ -624,6 +632,8 @@ mod tests {
assert_eq!(Language::De.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::Fr.tr("Data"), "Données");
assert_eq!(Language::Fr.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::Tr.tr("Data"), "Veri");
assert_eq!(Language::Tr.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::PtBr.tr("Date"), "Data");
assert_eq!(Language::PtBr.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::Ja.tr("Sheet1!A1"), "Sheet1!A1");
@@ -634,6 +644,7 @@ mod tests {
assert_eq!(Language::Cs.tr("Data"), "Data");
assert_eq!(Language::Cs.tr("Formulas"), "Vzorce");
assert_eq!(Language::Cs.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::Tr.tr("Formulas"), "Formüller");
// A `context|label` key shows only its label in English and splits the translation.
assert_eq!(Language::En.tr("Page Layout|Orientation"), "Orientation");
assert_eq!(Language::Ja.tr("Page Layout|Orientation"), "印刷の向き");
@@ -644,6 +655,8 @@ mod tests {
assert_eq!(Language::Sr.tr("Sheet1!A1"), "Sheet1!A1");
assert_eq!(Language::Sr.tr("Page Layout|Orientation"), "Orijentacija");
assert_eq!(Language::Sr.tr("Orientation"), "Orijentacija");
assert_eq!(Language::Tr.tr("Page Layout|Orientation"), "Sayfa Yönü");
assert_eq!(Language::Tr.tr("Orientation"), "Yönlendirme");
assert_eq!(Language::parse("xx"), None);
}
@@ -738,6 +751,9 @@ mod tests {
assert_eq!(Language::from_tag("sr-Latn-RS"), Some(Language::Sr));
assert_eq!(Language::from_tag("sr-RS"), Some(Language::Sr));
assert_eq!(Language::parse("sr"), Some(Language::Sr));
assert_eq!(Language::from_tag("tr-TR"), Some(Language::Tr));
assert_eq!(Language::from_tag("tr_TR.UTF-8"), Some(Language::Tr));
assert_eq!(Language::parse("tr"), Some(Language::Tr));
}
#[test]
+414
View File
@@ -0,0 +1,414 @@
//! Turkish translations for the interface strings in i18n.rs. Labels follow the wording Turkish
//! spreadsheet users know; anything absent falls back to English.
pub(super) fn translate(text: &str) -> Option<&'static str> {
Some(match text {
"Paste" => "Yapıştır",
"Paste Values" => "Değerleri Yapıştır",
"Paste Formulas" => "Formülleri Yapıştır",
"Paste Formatting" => "Biçimlendirmeyi Yapıştır",
"Transpose" => "Devrik Dönüştür",
"Paste Link" => "Bağlantı Yapıştır",
"Paste Special…" => "Özel Yapıştır…",
"Cut (⌘X)" => "Kes (⌘X)",
"Copy (⌘C)" => "Kopyala (⌘C)",
"Format Painter (double-click to keep it on)" => "Biçim Boyacısı (açık tutmak için çift tıklayın)",
"Bold (⌘B)" => "Kalın (⌘B)",
"Italic (⌘I)" => "İtalik (⌘I)",
"Underline (⌘U)" => "Altı Çizili (⌘U)",
"Double Underline" => "Çift Alt Çizgi",
"Strikethrough" => "Üstü Çizili",
"Underline" => "Altı Çizili",
"Increase Font Size" => "Yazı Tipi Boyutunu Büyüt",
"Decrease Font Size" => "Yazı Tipi Boyutunu Küçült",
"Wrap Text" => "Metni Kaydır",
"Merge & Center" => "Birleştir ve Ortala",
"Merge Cells" => "Hücreleri Birleştir",
"Merge Across" => "Yatay Birleştir",
"Unmerge Cells" => "Hücreleri Çöz",
"Fill Color" => "Dolgu Rengi",
"Font Color" => "Yazı Tipi Rengi",
"Borders" => "Kenarlıklar",
"Top\nAlign" => "Üste\nHizala",
"Middle\nAlign" => "Ortaya\nHizala",
"Bottom\nAlign" => "Alta\nHizala",
"Left" => "Sol",
"Right" => "Sağ",
"Center" => "Orta",
"Horizontal" => "Yatay",
"Vertical Text" => "Dikey Metin",
"Decrease Indent" => "Girintiyi Azalt",
"Increase Indent" => "Girintiyi Artır",
"Orientation" => "Yönlendirme",
"Angle Counterclockwise" => "Saat Yönünün Tersine Açılı",
"Angle Clockwise" => "Saat Yönünde Açılı",
"Rotate Text Up" => "Metni Yukarı Döndür",
"Rotate Text Down" => "Metni Aşağı Döndür",
"Accounting Number Format" => "Muhasebe Sayı Biçimi",
"Percent Style" => "Yüzde Stili",
"Comma Style" => "Virgül Stili",
"Increase Decimal" => "Ondalık Artır",
"Decrease Decimal" => "Ondalık Azalt",
"More Accounting Formats…" => "Diğer Muhasebe Biçimleri…",
"Conditional\nFormatting" => "Koşullu\nBiçimlendirme",
"Conditional Formatting" => "Koşullu Biçimlendirme",
"Format\nas Table" => "Tablo Olarak\nBiçimlendir",
"Cell\nStyles" => "Hücre\nStilleri",
"Format Cells…" => "Hücreleri Biçimlendir…",
"Format Cell Alignment…" => "Hücre Hizalamayı Biçimlendir…",
"Format\nPane" => "Biçim\nBölmesi",
"Format" => "Biçim",
"Insert" => "Ekle",
"Insert Cells…" => "Hücre Ekle…",
"Delete" => "Sil",
"Delete Cells…" => "Hücreleri Sil…",
"Insert Sheet Rows" => "Sayfa Satırları Ekle",
"Insert Sheet Columns" => "Sayfa Sütunları Ekle",
"Delete Sheet Rows" => "Sayfa Satırlarını Sil",
"Delete Sheet Columns" => "Sayfa Sütunlarını Sil",
"Row Height…" => "Satır Yüksekliği…",
"AutoFit Row Height" => "Satır Yüksekliğini En Uygun Yap",
"Column Width…" => "Sütun Genişliği…",
"AutoFit Column Width" => "Sütun Genişliğini En Uygun Yap",
"Default Width…" => "Varsayılan Genişlik…",
"Hide Rows" => "Satırları Gizle",
"Unhide Rows" => "Satırları Göster",
"Hide Columns" => "Sütunları Gizle",
"Unhide Columns" => "Sütunları Göster",
"Lock Cell" => "Hücreyi Kilitle",
"Clear" => "Temizle",
"Clear All" => "Tümünü Temizle",
"Clear Formats" => "Biçimleri Temizle",
"Clear Contents" => "İçeriği Temizle",
"Clear Comments and Notes" => "Açıklamaları ve Notları Temizle",
"Clear Hyperlinks" => "Köprüleri Temizle",
"AutoSum" => "Otomatik Toplam",
"AutoSum (⌘⇧T)" => "Otomatik Toplam (⌘⇧T)",
"Flash\nFill" => "Hızlı\nDoldurma",
"Flash Fill" => "Hızlı Doldurma",
"Fill" => "Doldur",
"Clear Print Area" => "Yazdırma Alanını Temizle",
"Find &\nSelect" => "Bul ve\nSeç",
"Find…" => "Bul…",
"Replace…" => "Değiştir…",
"Go To…" => "Git…",
"Go To Special…" => "Özel Git…",
"PivotTable" => "Özet Tablo",
"Recommended\nCharts" => "Önerilen\nGrafikler",
"Table" => "Tablo",
"Pictures" => "Resimler",
"Shapes" => "Şekiller",
"Icons" => "Simgeler",
"Text\nBox" => "Metin\nKutusu",
"Comment" => "Açıklama",
"New\nComment" => "Yeni\nAçıklama",
"New Note" => "Yeni Not",
"Show/Hide Note" => "Notu Göster/Gizle",
"Header &\nFooter" => "Üstbilgi ve\nAltbilgi",
"Text to\nColumns" => "Metni Sütunlara\nDönüştür",
"Link" => "Köprü",
"Symbol" => "Simge",
"Sparklines" => "Mini Grafikler",
"Header & Footer" => "Üstbilgi ve Altbilgi",
"Draw with ink" => "Mürekkeple Çiz",
"Eraser" => "Silgi",
"Ink to\nShape" => "Mürekkebi\nŞekle Dönüştür",
"Select\nObjects" => "Nesneleri\nSeç",
"Themes" => "Temalar",
"Margins" => "Kenar Boşlukları",
"Left Margin" => "Sol Kenar Boşluğu",
"Right Margin" => "Sağ Kenar Boşluğu",
"Top Margin" => "Üst Kenar Boşluğu",
"Bottom Margin" => "Alt Kenar Boşluğu",
"Header Margin" => "Üstbilgi Kenar Boşluğu",
"Footer Margin" => "Altbilgi Kenar Boşluğu",
"Size" => "Boyut",
"Print\nArea" => "Yazdırma\nAlanı",
"Set Print Area" => "Yazdırma Alanını Belirle",
"Breaks" => "Kesmeler",
"Insert Page Break" => "Sayfa Sonu Ekle",
"Remove Page Break" => "Sayfa Sonunu Kaldır",
"Reset All Page Breaks" => "Tüm Sayfa Sonlarını Sıfırla",
"Print\nTitles" => "Başlıkları\nYazdır",
"Narrow" => "Dar",
"Wide" => "Geniş",
"Normal" => "Normal",
"Portrait" => "Dikey",
"Landscape" => "Yatay",
"Custom Margins…" => "Özel Kenar Boşlukları…",
"Insert\nFunction" => "İşlev\nEkle",
"Name\nManager" => "Ad\nYöneticisi",
"Define Name" => "Ad Tanımla",
"Use in Formula" => "Formülde Kullan",
"Create from Selection" => "Seçimden Oluştur",
"Trace Precedents" => "Etkileyenleri İzle",
"Trace Dependents" => "Etkilenenleri İzle",
"Remove Arrows" => "Okları Kaldır",
"Show Formulas" => "Formülleri Göster",
"Error Checking" => "Hata Denetimi",
"Evaluate Formula" => "Formülü Değerlendir",
"Watch Window" => "Gözcü Penceresi",
"Calculation\nOptions" => "Hesaplama\nSeçenekleri",
"Calculate Now" => "Şimdi Hesapla",
"Calculate Sheet" => "Sayfayı Hesapla",
"Automatic" => "Otomatik",
"Automatic Except for Data Tables" => "Veri Tabloları Dışında Otomatik",
"Manual" => "El ile",
"Sort &\nFilter" => "Sırala ve\nFiltre Uygula",
"Sort" => "Sırala",
"Sort A to Z" => "A'dan Z'ye Sırala",
"Sort Z to A" => "Z'den A'ya Sırala",
"Custom Sort…" => "Özel Sıralama…",
"Filter" => "Filtre",
"Reapply" => "Yeniden Uygula",
"Get Data\n(Text/CSV)" => "Veri Al\n(Metin/CSV)",
"Remove\nDuplicates" => "Yinelenenleri\nKaldır",
"Data\nValidation" => "Veri\nDoğrulama",
"Data Validation" => "Veri Doğrulama",
"Data Validation…" => "Veri Doğrulama…",
"Circle Invalid Data" => "Geçersiz Verileri Daire İçine Al",
"Clear Validation" => "Doğrulamayı Temizle",
"Group" => "Gruplandır",
"Ungroup" => "Grubu Çöz",
"Show Detail" => "Ayrıntıyı Göster",
"Hide Detail" => "Ayrıntıyı Gizle",
"Subtotal" => "Alt Toplam",
"What-If\nAnalysis" => "Durum\nÇözümlemesi",
"Data Table…" => "Veri Tablosu…",
"Scenario Manager…" => "Senaryo Yöneticisi…",
"Goal Seek…" => "Hedef Ara…",
"Spelling" => "Yazım Denetimi",
"Check\nAccessibility" => "Erişilebilirliği\nDenetle",
"Threaded Comments" => "Yanıtlanan Açıklamalar",
"Show\nComments" => "Açıklamaları\nGöster",
"Protect\nWorkbook" => "Çalışma Kitabını\nKoru",
"Unprotect\nSheet" => "Sayfa Korumasını\nKaldır",
"Protect Sheet…" => "Sayfayı Koru…",
"Comments" => "Açıklamalar",
"Notes" => "Notlar",
"Page Break\nPreview" => "Sayfa Sonu\nÖnizleme",
"Page\nLayout" => "Sayfa\nDüzeni",
"Formula Bar" => "Formül Çubuğu",
"Gridlines" => "Kılavuz Çizgileri",
"Headings" => "Başlıklar",
"Zoom" => "Yakınlaştır",
"Forecast\nSheet" => "Tahmin\nSayfası",
"Add footer" => "Altbilgi ekle",
"Add header" => "Üstbilgi ekle",
"Click to add data" => "Veri eklemek için tıklayın",
"Current Date" => "Geçerli Tarih",
"Current\nDate" => "Geçerli\nTarih",
"Current\nTime" => "Geçerli\nSaat",
"Current Time" => "Geçerli Saat",
"File Name" => "Dosya Adı",
"File\nName" => "Dosya\nAdı",
"File\nPath" => "Dosya\nYolu",
"File Path" => "Dosya Yolu",
"Footer" => "Altbilgi",
"Different First Page" => "İlk Sayfada Farklı",
"Different Odd & Even Pages" => "Tek ve Çift Sayfalarda Farklı",
"Go to Footer" => "Altbilgiye Git",
"Go to Header" => "Üstbilgiye Git",
"Go to\nFooter" => "Altbilgiye\nGit",
"Go to\nHeader" => "Üstbilgiye\nGit",
"Header" => "Üstbilgi",
"(none)" => "(yok)",
"Number\nof Pages" => "Sayfa\nSayısı",
"Number of Pages" => "Sayfa Sayısı",
"Page\nNumber" => "Sayfa\nNumarası",
"Page Number" => "Sayfa Numarası",
"Ruler" => "Cetvel",
"Sheet Name" => "Sayfa Adı",
"Sheet\nName" => "Sayfa\nAdı",
"Animations" => "Animasyonlar",
"Glide the selection outline to the cell you move to instead of jumping there" => {
"Seçim çerçevesini atlamak yerine taşındığınız hücreye kaydırarak hareket ettir"
}
"Insert Copied Cells" => "Kopyalanan Hücreleri Ekle",
"Insert Copied Cells…" => "Kopyalanan Hücreleri Ekle…",
"Insert Cut Cells" => "Kesilen Hücreleri Ekle",
"Insert Paste" => "Ekleyerek Yapıştır",
"Previous" => "Önceki",
"Next" => "Sonraki",
"Previous Comment" => "Önceki Açıklama",
"Next Comment" => "Sonraki Açıklama",
"Show All Notes" => "Tüm Notları Göster",
"Convert to Comments" => "Açıklamalara Dönüştür",
"Checkbox" => "Onay Kutusu",
"Insert checkboxes in the selected cells" => "Seçili hücrelere onay kutuları ekle",
"Sheet\nRight-to-Left" => "Sayfa\nSağdan Sola",
"Sheet Right-to-Left" => "Sayfa Sağdan Sola",
"Data\nAnalysis" => "Veri\nAnalizi",
"Data Analysis" => "Veri Analizi",
"Solver" => "Çözücü",
"Allow Edit\nRanges" => "Aralıkları Düzenlemeye\nİzin Ver",
"Allow Edit Ranges" => "Aralıkları Düzenlemeye İzin Ver",
"Drag to freeze columns" => "Sütunları dondurmak için sürükleyin",
"Drag to freeze rows" => "Satırları dondurmak için sürükleyin",
"Select\nData" => "Veri\nSeç",
"File" => "Dosya",
"Back" => "Geri",
"New" => "Yeni",
"Open" => "Aç",
"Info" => "Bilgi",
"Save" => "Kaydet",
"Save As" => "Farklı Kaydet",
"Export" => "Dışarı Aktar",
"Close" => "Kapat",
"Options" => "Seçenekler",
"Blank workbook" => "Boş çalışma kitabı",
"Recent" => "Son Kullanılanlar",
"No recent workbooks yet." => "Henüz son kullanılan çalışma kitabı yok.",
"More workbooks" => "Diğer çalışma kitapları",
"Modified" => "Değiştirilme Tarihi",
"Not available" => "Kullanılamıyor",
"Just now" => "Az önce",
"Yesterday" => "Dün",
"{n} min ago" => "{n} dk. önce",
"{n} h ago" => "{n} sa. önce",
"{n} days ago" => "{n} gün önce",
"{n} weeks ago" => "{n} hafta önce",
"{n} months ago" => "{n} ay önce",
"{n} years ago" => "{n} yıl önce",
"Browse…" => "Gözat…",
"Not saved yet" => "Henüz kaydedilmedi",
"Location" => "Konum",
"Sheets" => "Sayfalar",
"Protect Workbook" => "Çalışma Kitabını Koru",
"Sheet structure is locked: sheets can't be added, moved, renamed or deleted." => {
"Sayfa yapısı kilitli: sayfalar eklenemez, taşınamaz, yeniden adlandırılamaz veya silinemez."
}
"Lock the sheet structure so sheets can't be added, moved, renamed or deleted." => {
"Sayfaların eklenmesini, taşınmasını, yeniden adlandırılmasını veya silinmesini önlemek için sayfa yapısını kilitleyin."
}
"Properties" => "Özellikler",
"Title" => "Başlık",
"Subject" => "Konu",
"Author" => "Yazar",
"Company" => "Şirket",
"Keywords" => "Anahtar Sözcükler",
"Description" => "Açıklama",
"No workbook is open." => "Açık çalışma kitabı yok.",
"Save as type" => "Kayıt türü",
"Excel Workbook (*.xlsx)" => "Excel Çalışma Kitabı (*.xlsx)",
"CSV UTF-8 (Comma delimited) (*.csv)" => "CSV UTF-8 (Virgülle ayrılmış) (*.csv)",
"Web Page (*.html)" => "Web Sayfası (*.html)",
"PDF (*.pdf)" => "PDF Belgesi (*.pdf)",
"Download" => "İndir",
"A CSV file, web page or PDF is a copy: the workbook keeps its own file." => {
"CSV dosyası, web sayfası veya PDF bir kopyadır: çalışma kitabı kendi dosyasını korur."
}
"Save the workbook under another name or in another folder." => "Çalışma kitabını başka bir adla veya başka bir klasöre kaydedin.",
"Print Active Sheets" => "Etkin Sayfaları Yazdır",
"Print Entire Workbook" => "Tüm Çalışma Kitabını Yazdır",
"Fit Sheet on One Page" => "Sayfayı Bir Sayfaya Sığdır",
"Page Setup…" => "Sayfa Yapısı…",
"Page {page} of {pages}" => "Sayfa {page} / {pages}",
"Nothing to print." => "Yazdırılacak bir şey yok.",
"Previous page" => "Önceki sayfa",
"Next page" => "Sonraki sayfa",
"Create PDF" => "PDF Oluştur",
"Save the sheet as a PDF document that keeps its page layout." => "Sayfayı, sayfa düzenini koruyan bir PDF belgesi olarak kaydedin.",
"Change File Type" => "Dosya Türünü Değiştir",
"CSV (Comma delimited)" => "CSV (Virgülle ayrılmış)",
"Save the active sheet as comma-separated text." => "Etkin sayfayı virgülle ayrılmış metin olarak kaydedin.",
"Web Page (.html)" => "Web Sayfası (.html)",
"Save the workbook as a web page." => "Çalışma kitabını web sayfası olarak kaydedin.",
"Options|General" => "Genel",
"Options|Save" => "Kaydet",
"Show formula bar" => "Formül çubuğunu göster",
"Enable AutoComplete for cell values" => "Hücre değerleri için Otomatik Tamamla'yı etkinleştir",
"Save .xlsx workbooks automatically after every change" => ".xlsx çalışma kitaplarını her değişiklikten sonra otomatik olarak kaydet",
"Workbook calculation" => "Çalışma kitabı hesaplaması",
"Enable iterative calculation" => "Yinelemeli hesaplamayı etkinleştir",
"Calculation settings are saved with the workbook." => "Hesaplama ayarları çalışma kitabıyla birlikte kaydedilir.",
"Interface size" => "Arayüz boyutu",
"Auto" => "Otomatik",
"100%" => "%100",
"Zoom to\nSelection" => "Seçimi\nYakınlaştır",
"Freeze\nPanes" => "Bölmeleri\nDondur",
"Freeze Panes" => "Bölmeleri Dondur",
"Freeze Top Row" => "Üst Satırı Dondur",
"Freeze First Column" => "İlk Sütunu Dondur",
"Unfreeze Panes" => "Bölmeleri Çöz",
"Dark Mode" => "Koyu Mod",
"Interface language" => "Arayüz dili",
"Command\nPalette" => "Komut\nPaleti",
"Agent\nControl" => "Ajan\nKontrolü",
"Action\nJournal" => "İşlem\nGünlüğü",
"About\nGridCraft" => "GridCraft\nHakkında",
"Share" => "Paylaş",
"Add Chart\nElement" => "Grafik Öğesi\nEkle",
"Change\nChart Type" => "Grafik Türünü\nDeğiştir",
"Switch\nRow/Column" => "Satır/Sütun\nDeğiştir",
"Data Labels: None" => "Veri Etiketleri: Yok",
"Data Labels: Show" => "Veri Etiketleri: Göster",
"Legend: None" => "Gösterge: Yok",
"Legend: Bottom" => "Gösterge: Alt",
"Legend: Top" => "Gösterge: Üst",
"Legend: Right" => "Gösterge: Sağ",
"Gridlines: None" => "Kılavuz Çizgileri: Yok",
"Gridlines: Show" => "Kılavuz Çizgileri: Göster",
"Chart\nTitle" => "Grafik\nBaşlığı",
"Delete\nChart" => "Grafiği\nSil",
"Convert\nto Range" => "Aralığa\nDönüştür",
"Table\nStyles" => "Tablo\nStilleri",
"Top 10 Items" => "İlk 10 Öğe",
"Top 10%" => "İlk %10",
"Bottom 10 Items" => "Son 10 Öğe",
"Bottom 10%" => "Son %10",
"Above Average" => "Ortalamanın Üstünde",
"Below Average" => "Ortalamanın Altında",
"Clear Rules from Entire Sheet" => "Kuralları Tüm Sayfadan Temizle",
"Clear Rules from Selected Cells" => "Kuralları Seçili Hücrelerden Temizle",
"Constants" => "Sabitler",
"Data Bars" => "Veri Çubukları",
"Color Scales" => "Renk Ölçekleri",
"Icon Sets" => "Simge Kümeleri",
"Home" => "Giriş",
"Draw" => "Çiz",
"Page Layout" => "Sayfa Düzeni",
"Formulas" => "Formüller",
"Data" => "Veri",
"Review" => "Gözden Geçir",
"View" => "Görünüm",
"Automate" => "Otomatikleştir",
"Table Design" => "Tablo Tasarımı",
"Chart Design" => "Grafik Tasarımı",
"Ready" => "Hazır",
"Enter" => "Giriş",
"Edit" => "Düzenle",
"Point" => "İşaretle",
"Calculate" => "Hesapla",
"Select destination and press Enter or choose Paste" => "Hedefi seçip Enter tuşuna basın veya Yapıştır'ı seçin",
"General" => "Genel",
"Number" => "Sayı",
"Currency" => "Para Birimi",
"Accounting" => "Muhasebe",
"Date" => "Tarih",
"Time" => "Saat",
"Percentage" => "Yüzde",
"Fraction" => "Kesir",
"Scientific" => "Bilimsel",
"Text" => "Metin",
"Special" => "Özel",
"Custom" => "İsteğe Uyarlanmış",
"Short Date" => "Kısa Tarih",
"Long Date" => "Uzun Tarih",
"More Number Formats…" => "Diğer Sayı Biçimleri…",
"Financial" => "Finansal",
"Logical" => "Mantıksal",
"Date &\nTime" => "Tarih ve\nSaat",
"Lookup &\nReference" => "Arama ve\nBaşvuru",
"Math &\nTrig" => "Matematik ve\nTrigonometri",
"More\nFunctions" => "Diğer\nİşlevler",
"Page Layout|Orientation" => "Sayfa Yönü",
"Display theme" => "Görüntü teması",
"System" => "Sistem",
"Light" => "Açık",
"Dark" => "Koyu",
"Sheet Options|View" => "Görünüm",
"Print" => "Yazdır",
_ => return None,
})
}
+3 -1
View File
@@ -654,7 +654,9 @@ impl SheetApp {
self.ui.language = l;
Ok(json!({"language": l}))
}
None => Err(format!("unknown language {code:?} (use \"en\", \"es\", \"zh\", \"ja\", \"ko\", \"ru\", \"pt\" or \"cs\")")),
None => Err(format!(
"unknown language {code:?} (use \"en\", \"es\", \"zh\", \"ja\", \"ko\", \"ru\", \"pt\", \"de\", \"cs\", \"fr\" or \"tr\")"
)),
}
}
"app.language.english" => {
+1 -1
View File
@@ -837,7 +837,7 @@ mod tests {
["sys-cjk-han-zh", "sys-cjk-han-ja", "sys-cjk-hangul", "sys-thai", "sys-hebrew", "sys-symbols", "sys-symbols-2"]
);
assert_eq!(HanOrder::of(Language::Ja), HanOrder::Japanese);
for l in [Language::En, Language::Zh, Language::Ko, Language::Ru, Language::PtBr, Language::De, Language::Cs] {
for l in [Language::En, Language::Zh, Language::Ko, Language::Ru, Language::PtBr, Language::De, Language::Cs, Language::Fr, Language::Tr] {
assert_eq!(HanOrder::of(l), HanOrder::Chinese, "{l:?} shares the default order (no font rebuild)");
}
}
+15
View File
@@ -219,3 +219,18 @@ fn user_defined_prefix_is_hidden_while_editing_and_kept_on_commit() {
assert!(app.commit_edit(0, 0, false, false));
assert_eq!(formula(&app), "_xludf.EOMONTH()&_xludf.CONCAT(\"_xludf.x\")");
}
#[test]
fn turkish_interface_retains_its_canonical_formula_fallback() {
let mut app = app();
app.run("app.language.set", json!({"code":"tr-TR"})).unwrap();
assert_eq!(app.ui.language, Language::Tr);
assert_eq!(app.ui.language.tr("Data"), "Veri");
assert_eq!(app.ui.language.tr("Formulas"), "Formüller");
assert!(enter(&mut app, "=SUM(1.5,2.25)"));
app.begin_edit(None, true);
assert_eq!(app.editor.as_ref().unwrap().text, "=SUM(1.5,2.25)");
assert!(!enter(&mut app, "=TOPLA(1;2)"));
let restored: UiState = serde_json::from_str(&serde_json::to_string(&app.ui).unwrap()).unwrap();
assert_eq!(restored.language, Language::Tr);
}
+2
View File
@@ -364,6 +364,8 @@ fn language_switch_translates_the_ribbon_and_persists() {
(Language::Ru, "Данные"),
(Language::PtBr, "Dados"),
(Language::De, "Daten"),
(Language::Fr, "Données"),
(Language::Tr, "Veri"),
] {
h.state_mut().run("app.language.set", json!({"language": language.code()})).unwrap();
h.run_steps(2); // every locale renders the ribbon without panicking
+3 -1
View File
@@ -60,8 +60,9 @@ separators, number/date formats, machine translation with agent review, and scri
| German | de | 266 (~12%) | no | Latin: yes | no | menus only | 4–8 h |
| Korean | ko | 266 (~12%) | no | Hangul via the CJK fallback; IME unverified | no | menus only | 6–10 h |
| Vietnamese | vi | 0 (0%) | no | Latin with stacked diacritics: unverified | no | none | 6–10 h |
| Turkish | tr | 382 (~17%) | no | Latin: yes | yes | menus only | 4–8 h |
Other shipped languages: Russian (ru) and German (de), 266 labels each (~12%), menus only.
Other shipped languages: Russian (ru), German (de), Czech (cs), French (fr) and Turkish (tr), menus only.
**Total:** catalog work 10–20 h + languages 92–144 h ≈ **100–165 h**. Parallelizes almost fully
once the catalog covers dialogs and commands. **Needs a human:** native-speaker review of every
@@ -89,6 +90,7 @@ language (none so far) and of localized function names.
| 2026-10-19 | trivial | Text boxes and shapes keep right-to-left paragraph direction (`a:pPr rtl`) on XLSX save, so Excel-authored Arabic and Hebrew text boxes reopen right to left |
| 2026-10-19 | minor | Save as Web Page and copied HTML mark right-to-left sheets `dir="rtl"`, let General-aligned Arabic and Hebrew text align by its own direction (`dir="auto"`), and keep numbers on right-to-left sheets left to right and on the left |
| 2026-10-19 | minor | French and Serbian kept the context in three `context\|label` translations ("Options\|Général", "Opcije\|Opšte" for `Options\|General`; also `Options\|Save`, `Sheet Options\|View`). `tr` shows a found translation as it is, so File › Options headings and the Sheet Options "View" checkboxes showed the prefix. Fixed; a test checks that no catalog shows a `\|` |
| 2026-10-12 | minor | Turkish ribbon catalog (`i18n/tr.rs`, 382 labels); `tr` locale tags (tr-TR, tr_TR…) resolve to Turkish |
| 2026-10-12 | minor | Format Cells looks up its tabs, labels, options and note through `Language::tr` (Fill tab keyed `Format Cells\|Fill`); dialog titles and OK/Cancel too. Labels already in a table (Number, Currency, Fill…) show translated; the rest fall back to English until the tables add them |
| 2026-10-12 | minor | Brazilian Portuguese catalog (`i18n/pt.rs`) grows from 377 to 923 entries: every key the other catalogs translate, including the dialog strings #669 starts looking up (~42%) |
| 2026-10-11 | minor | German ribbon catalog (`i18n/de.rs`, 266 labels, ~12%); `de` locale tags (de-DE, de-AT, de-CH…) resolve to German. PR #163 (localized German formulas/numbers) still open |