collective

Browse / github.com/storytold/craft-launcher / patch

i18n: add Turkish (tr) interface language

i18n: add Turkish (tr) interface language ## Summary This pull request adds Turkish (`tr`) interface language support to ArtCraft Launcher. ### Changes - Added a Turkish translation catalog (`tr.tsv`). - Registered Turkish in the language registry (`lang.rs`). - Added Turkish to the language selection menu. - Preserved existing translations and language fallback behavior. ### Testing - `cargo check -p artcraft-launcher` — passed. - `cargo run --release -p artcraft-launcher` — built and launched successfully. - Verified the Turkish interface on Windows 11. - Confirmed that Turkish characters display correctly. - Tested the main scre

Status
open
Score
0.00
Adopters
0 other operators
Author
emreg35 (imported from pull request #557, open)
Base
307efcf45a080af9643e750d43034eb25540cef8
Size
+577 −2 in 2 files
Review
pending
Shared
2026-10-28
Id
162a0e93baa0234a21f20785

How it went

No other operator has reported using it yet.

Diff

raw · crates/ui-egui/src/i18n/lang.rs crates/ui-egui/src/i18n/tr.tsv

diff --git a/crates/ui-egui/src/i18n/lang.rs b/crates/ui-egui/src/i18n/lang.rs--- a/crates/ui-egui/src/i18n/lang.rs+++ b/crates/ui-egui/src/i18n/lang.rs@@ -1,8 +1,8 @@ //! The language registry and matching locale tags to it.- use std::sync::OnceLock;  use super::catalog::Catalog;+ use super::detect::system_lang;  /// The writing system a language is drawn in, and so the system font it needs. Languages that@@ -10,335 +10,582 @@ use super::detect::system_lang; /// faces), so each script is its own. The bundled faces have no CJK glyphs, so a language with a /// script borrows a system font for it (`crate::theme::cjk_font`). #[derive(Clone, Copy, Debug, PartialEq, Eq)]+ pub enum Script {+     Chinese,+     Japanese,+ }  impl Script {+     /// Every script a language can be written in.     pub const ALL: [Script; 2] = [Script::Chinese, Script::Japanese];+ }  /// One supported UI language. pub struct LangInfo {+     /// Canonical BCP 47 code (`en`, `ru`, `zh-CN`, `de`, `fr`, `pt-BR`, `es`, `cs`, `pl`, `hu`, `ja`).     /// Also the `interfaceLanguage` value.     pub code: &'static str,+     /// The language's name in itself, shown in the Preferences dropdown.     pub name: &'static str,+     /// The language's name in English, shown instead where its own script can't be drawn.     pub english_name: &'static str,+     /// The writing system this language is drawn in, or `None` if it needs no system CJK font.     pub script: Option<Script>,+     /// Catalog file contents (empty for the built-in English).     pub source: &'static str,+     /// Plural form index for a count (English, German, Spanish and Hungarian: 0 = one, 1 = other;     /// Russian: 0 = one, 1 = few, 2 = many; Czech: 0 = one, 1 = few, 2 = other; Polish: 0 = one only     /// for 1, 1 = few, 2 = many; French: 0 = one for 0 and 1; a language whose nouns don't inflect     /// for number: always 0).     pub plural: fn(u64) -> usize,+     /// Number of plural forms the catalog's `@plural` rows carry (checked by tests).     pub plural_forms: usize,+     /// Must the catalog cover every `tl!` literal? (checked by tests)     pub complete_menus: bool,+     catalog: OnceLock<Catalog>,+ }  fn plural_one_other(n: u64) -> usize {+     usize::from(n != 1)+ }  /// French: 0 and 1 are singular ("0 mise à jour"), everything else plural. fn plural_zero_one(n: u64) -> usize {+     usize::from(n > 1)+ }  /// A language whose nouns don't inflect for number: one form for every count. fn plural_none(_: u64) -> usize {+     0+ }  /// Russian and Ukrainian integer counts: 1 (but not 11) is `one`, 2–4 (but not 12–14) /// `few`, everything else `many`. pub(super) fn plural_east_slavic(n: u64) -> usize {+     match n % 100 {+         11..=14 => 2,+         _ => match n % 10 {+             1 => 0,+             2..=4 => 1,+             _ => 2,+         },+     }+ }  /// Czech integer counts: 1 is `one`, 2–4 are `few`, everything else is `other`. pub(super) fn plural_czech(n: u64) -> usize {+     match n {+         1 => 0,+         2..=4 => 1,+         _ => 2,+     }+ }  /// Polish integer counts: only 1 itself is `one` (21 is "21 aplikacji"), 2–4 in the last digit /// (but not 12–14) `few`, everything else `many`. pub(super) fn plural_polish(n: u64) -> usize {+     if n == 1 {+         0+     } else if matches!(n % 10, 2..=4) && !matches!(n % 100, 12..=14) {+         1+     } else {+         2+     }+ }  /// The registry. English first: it is the fallback and the source language.-pub static LANGUAGES: [LangInfo; 11] = [+pub static LANGUAGES: [LangInfo; 12] = [+     LangInfo {+         code: "en",+         name: "English",+         english_name: "English",+         script: None,+         source: "",+         plural: plural_one_other,+         plural_forms: 2,+         complete_menus: false,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "ru",+         name: "Русский",+         english_name: "Russian",+         script: None,+         source: include_str!("ru.tsv"),+         plural: plural_east_slavic,+         plural_forms: 3,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "zh-CN",+         name: "简体中文",+         english_name: "Simplified Chinese",+         script: Some(Script::Chinese),+         source: include_str!("zh-CN.tsv"),+         plural: plural_none,+         plural_forms: 1,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "de",+         name: "Deutsch",+         english_name: "German",+         script: None,+         source: include_str!("de.tsv"),+         plural: plural_one_other,+         plural_forms: 2,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "fr",+         name: "Français",+         english_name: "French",+         script: None,+         source: include_str!("fr.tsv"),+         plural: plural_zero_one,+         plural_forms: 2,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "pt-BR",+         name: "Português (Brasil)",+         english_name: "Portuguese (Brazil)",+         script: None,+         source: include_str!("pt-BR.tsv"),+         plural: plural_one_other,+         plural_forms: 2,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "es",+         name: "Español",+         english_name: "Spanish",+         script: None,+         source: include_str!("es.tsv"),+         plural: plural_one_other,+         plural_forms: 2,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "cs",+         name: "Čeština",+         english_name: "Czech",+         script: None,+         source: include_str!("cs.tsv"),+         plural: plural_czech,+         plural_forms: 3,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "pl",+         name: "Polski",+         english_name: "Polish",+         script: None,+         source: include_str!("pl.tsv"),+         plural: plural_polish,+         plural_forms: 3,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "hu",+         name: "Magyar",+         english_name: "Hungarian",+         script: None,+         source: include_str!("hu.tsv"),+         plural: plural_one_other,+         plural_forms: 2,+         complete_menus: true,+         catalog: OnceLock::new(),+     },+     LangInfo {+         code: "ja",+         name: "日本語",+         english_name: "Japanese",+         script: Some(Script::Japanese),+         source: include_str!("ja.tsv"),+         plural: plural_none,+         plural_forms: 1,+         complete_menus: true,++        catalog: OnceLock::new(),++    },++    LangInfo {+        code: "tr",+        name: "Türkçe",+        english_name: "Turkish",+        script: None,+        source: include_str!("tr.tsv"),+        plural: plural_one_other,+        plural_forms: 2,+        complete_menus: false,         catalog: OnceLock::new(),     }, ];  impl LangInfo {+     pub(super) fn catalog(&self) -> &Catalog {+         self.catalog.get_or_init(|| Catalog::parse(self.source))+     }+ }  /// A language the UI can be shown in (a handle into [`LANGUAGES`]). #[derive(Clone, Copy)]+ pub struct Lang(pub(super) &'static LangInfo);  impl std::fmt::Debug for Lang {+     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {+         write!(f, "Lang({})", self.0.code)+     }+ }  impl PartialEq for Lang {+     fn eq(&self, other: &Self) -> bool {+         self.0.code == other.0.code+     }+ }  impl Eq for Lang {}  impl Lang {+     pub const EN: Lang = Lang(&LANGUAGES[0]);+     pub const RU: Lang = Lang(&LANGUAGES[1]);+     pub const ZH_CN: Lang = Lang(&LANGUAGES[2]);+     pub const DE: Lang = Lang(&LANGUAGES[3]);+     pub const FR: Lang = Lang(&LANGUAGES[4]);+     pub const PT_BR: Lang = Lang(&LANGUAGES[5]);+     pub const ES: Lang = Lang(&LANGUAGES[6]);+     pub const CS: Lang = Lang(&LANGUAGES[7]);+     pub const PL: Lang = Lang(&LANGUAGES[8]);+     pub const HU: Lang = Lang(&LANGUAGES[9]);+     pub const JA: Lang = Lang(&LANGUAGES[10]);+    pub const TR: Lang = Lang(&LANGUAGES[11]);      pub fn code(self) -> &'static str {+         self.0.code+     }      /// A language by its exact code (case-insensitive).     pub fn from_code(code: &str) -> Option<Lang> {+         LANGUAGES.iter().find(|l| l.code.eq_ignore_ascii_case(code)).map(Lang)+     }      /// Resolve the `interfaceLanguage` preference: a language code, or `auto` (and anything     /// unknown) to follow the system locale.     pub fn from_pref(pref: &str) -> Lang {+         Lang::from_code(pref).unwrap_or_else(system_lang)+     }      /// Every registered language.     pub fn all() -> impl Iterator<Item = Lang> {+         LANGUAGES.iter().map(Lang)+     }      pub fn name(self) -> &'static str {+         self.0.name+     }      /// The language's name in English.     pub fn english_name(self) -> &'static str {+         self.0.english_name+     }      /// Does drawing this language need a CJK font from the system?     pub fn needs_cjk_font(self) -> bool {+         self.0.script.is_some()+     }      /// The writing system this language is drawn in, if it needs a system CJK font.     pub fn script(self) -> Option<Script> {+         self.0.script+     }      /// Does this language's catalog claim to cover every `tl!` literal?     pub fn complete_menus(self) -> bool {+         self.0.complete_menus+     }      /// Index into [`LANGUAGES`].     pub(super) fn index(self) -> usize {+         LANGUAGES.iter().position(|l| l.code == self.0.code).unwrap_or(0)+     }      pub(super) fn catalog(self) -> &'static Catalog {+         self.0.catalog()+     }+ }  /// Candidate language codes for a locale tag, most specific first: `ru_RU.UTF-8` → /// `ru-ru`, `ru`. pub(super) fn candidates(tag: &str) -> Vec<String> {+     let base = tag.split(['.', '@']).next().unwrap_or("").replace('_', "-").to_ascii_lowercase();+     let parts: Vec<&str> = base.split('-').filter(|p| !p.is_empty()).collect();+     (1..=parts.len()).rev().filter_map(|n| parts.get(..n)).map(|p| p.join("-")).collect()+ }  /// The registered language for a locale tag such as `ru_RU.UTF-8`, `ru-RU`, `zh-Hans-CN`; /// `None` if the language isn't supported. `C`/`POSIX` mean English. pub fn lang_from_tag(tag: &str) -> Option<Lang> {+     let cands = candidates(tag);+     match cands.last().map(String::as_str) {+         Some("c" | "posix") => Some(Lang::EN),+         Some("zh") => chinese(cands.first().map_or("zh", String::as_str)),+         Some("pt") => Some(Lang::PT_BR),+         _ => cands.iter().find_map(|c| Lang::from_code(c)),+     }+ }  /// Chinese by script: Simplified for `zh-Hans`, and for a bare `zh` or the regions that write /// Simplified (mainland China, Singapore) when no script is given. An explicit script wins over /// the region (`zh-Hant-CN` is Traditional); Traditional Chinese isn't offered. fn chinese(tag: &str) -> Option<Lang> {+     let parts: Vec<&str> = tag.split('-').collect();+     if parts.contains(&"hant") {+         None+     } else if parts.contains(&"hans") || parts.len() == 1 || parts.iter().any(|p| matches!(*p, "cn" | "sg")) {+         Some(Lang::ZH_CN)+     } else {+         None+     }+ }diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsvnew file mode 100644--- /dev/null+++ b/crates/ui-egui/src/i18n/tr.tsv@@ -0,0 +1,328 @@+# Turkish (tr) catalog for ArtCraft Launcher.+# Format: context<TAB>source<TAB>translation+# Preserve placeholders, plural variants and command IDs.+# Application names and technical package extensions remain unchanged.++	Launcher	Launcher+	Craft App Suite	Craft App Suite+	Open Source Tools for Creatives, Makers, and Builders	İçerik Üreticileri, Tasarımcılar ve Geliştiriciler için Açık Kaynak Araçlar+	Settings	Ayarlar+	Check for updates	Güncellemeleri denetle+	Grid	Izgara+	Table	Tablo+	Show apps as cards	Uygulamaları kart olarak göster+	Show apps as a table	Uygulamaları tablo olarak göster+	All	Tümü+	Updates	Güncellemeler+	Not installed	Yüklü değil+	Search apps	Uygulama ara+	Sort	Sırala+	Suite order	Paket sırası+	Name	Ad+	Inspired by	Esinlenilen uygulama+	Status	Durum+	Installed version	Yüklü sürüm+	Latest version	En son sürüm+	Newest release	En yeni sürüm+	Discord	Discord+	GitHub	GitHub+	Website	Web sitesi+	Classic apps	Klasik uygulamalar+	New apps	Yeni uygulamalar+	NEW	YENİ+	Install	Yükle+	Update to {v}	{v} sürümüne güncelle+	Open	Aç+	Download for {os}	{os} için indir+	Download	İndir+	Coming soon	Yakında+	Checking…	Denetleniyor…+	Not available	Kullanılamıyor+	Offline	Çevrimdışı+	Downloading {done} of {total}	{total} içinden {done} indiriliyor+	Downloading…	İndiriliyor…+	Reconnecting…	Yeniden bağlanılıyor…+	Verifying…	Doğrulanıyor…+	Installing, then restarting…	Yükleniyor, ardından yeniden başlatılacak…+	Installing…	Yükleniyor…+	Removing…	Kaldırılıyor…+	Pause download	İndirmeyi duraklat+	Cancel download	İndirmeyi iptal et+	Resume download	İndirmeyi sürdür+	Discard download	İndirmeyi sil+	Release notes	Sürüm notları+	Show in Finder	Finder'da göster+	Show in Explorer	Dosya Gezgini'nde göster+	Show in Files	Dosyalarda göster+	Reinstall	Yeniden yükle+	Uninstall…	Kaldır…+	All releases	Tüm sürümler+	ArtCraft Launcher {version} is available.	ArtCraft Launcher {version} sürümü kullanılabilir.+	Dismiss	Kapat+	Update and restart	Güncelle ve yeniden başlat+	A new version is available. Would you like to relaunch with the updated version?	Yeni bir sürüm mevcut. Güncellenen sürümle yeniden başlatmak ister misin?+	Later	Daha sonra+	What's new	Yenilikler+	No notes were published with this release.	Bu sürüm için sürüm notu yayımlanmadı.+	Released {date}	Yayımlanma tarihi: {date}+	Open on GitHub	GitHub'da aç+	Close	Kapat+	ArtCraft Launcher {version}	ArtCraft Launcher {version}+	Only when I ask	Yalnızca ben istediğimde+	Automatically download and install updates	Güncellemeleri otomatik indir ve yükle+	Notify me when an installed app has an update	Yüklü bir uygulama için güncelleme olduğunda beni bilgilendir+	Include pre-releases (betas and release candidates)	Ön sürümleri dahil et (beta ve sürüm adayları)+	Installing on Linux	Linux'ta yükleme+	Installing on Windows	Windows'ta yükleme+	Install new apps as	Yeni uygulamaları şu biçimde yükle+	System package (recommended)	Sistem paketi (önerilir)+	Updates always use the format an app was installed with.	Güncellemeler her zaman uygulamanın yüklendiği paket biçimini kullanır.+	Running in the background	Arka planda çalışıyor+	Keep running in the tray when the window is closed	Pencere kapandığında sistem tepsisinde çalışmaya devam et+	Show the window on the current desktop	Pencereyi geçerli masaüstünde göster+	Start ArtCraft Launcher when I log in	Oturum açtığımda ArtCraft Launcher'ı başlat+	Community	Topluluk+	Questions, ideas and news from the ArtCraft team	ArtCraft ekibinden sorular, fikirler ve haberler+	Appearance	Görünüm+	Quit ArtCraft Launcher	ArtCraft Launcher'dan çık+	Done	Bitti+	Uninstall {name}?	{name} kaldırılsın mı?+	The app will be moved to the Trash. Your documents and settings stay.	Uygulama Çöp Sepeti'ne taşınacak. Belgelerin ve ayarların korunacak.+	Windows will remove it like any installed program. Your documents and settings stay.	Windows, uygulamayı diğer yüklü programlar gibi kaldıracak. Belgelerin ve ayarların korunacak.+	Your system's package manager will remove it, and may ask for your password. Your documents and settings stay.	Sisteminin paket yöneticisi uygulamayı kaldıracak ve şifreni isteyebilir. Belgelerin ve ayarların korunacak.+	The app will be removed. Your documents and settings stay.	Uygulama kaldırılacak. Belgelerin ve ayarların korunacak.+	Uninstall	Kaldır+	Cancel	İptal+	Checked {ago}	Son denetleme: {ago}+	just now	az önce+	yesterday	dün+	{month} {day}, {year}	{day} {month} {year}+	Automatically	Otomatik+	Every Craft app	Tüm Craft uygulamaları+	Apps on this computer	Bu bilgisayardaki uygulamalar+	Installed apps with a newer version	Yeni sürümü bulunan yüklü uygulamalar+	Apps you can install	Yükleyebileceğin uygulamalar+	Hide App	Uygulamayı gizle+	Unhide App	Uygulamayı göster+	Hidden Apps	Gizli uygulamalar+	Apps you hid	Gizlediğin uygulamalar+	Checked {ago} · using {sources}	Son denetleme: {ago} · kaynak: {sources}+	{a} and {b}	{a} ve {b}+	Join the Discord	Discord'a katıl+	Learn more	Daha fazla bilgi+	Minimize	Simge durumuna küçült+	Maximize	Ekranı kapla+	Restore	Geri yükle+	New	Yeni+	OK	Tamam+	Open link	Bağlantıyı aç+	Update	Güncelle+	{name} icon	{name} simgesi+	Loading ArtCraft Launcher…	ArtCraft Launcher yükleniyor…+	Cancel update	Güncellemeyi iptal et+	Stop waiting; the update can be started again later	Beklemeyi durdur; güncelleme daha sonra yeniden başlatılabilir+	Download again	Yeniden indir+	Install cancelled	Yükleme iptal edildi+	Install cancelled. The download is kept for the next try.	Yükleme iptal edildi. İndirilen dosya sonraki deneme için saklanacak.+	Update cancelled	Güncelleme iptal edildi+	Uninstall cancelled	Kaldırma işlemi iptal edildi+	Retry install	Yüklemeyi yeniden dene+	Retry update to {version}	{version} sürümüne güncellemeyi yeniden dene+	The download is still here. It's checked again, then installed.	İndirilen dosya hâlâ burada. Yeniden doğrulanıp yüklenecek.+	Waiting for another app…	Başka bir uygulama bekleniyor…+	Waiting for other installs…	Diğer yüklemeler bekleniyor…+	Installer (.msi)	Yükleyici (.msi)+	Portable (.zip)	Taşınabilir sürüm (.zip)+	Disk image (.dmg)	Disk kalıbı (.dmg)+	Debian package (.deb)	Debian paketi (.deb)+	RPM package (.rpm)	RPM paketi (.rpm)+	Flatpak bundle	Flatpak paketi+	Tarball (.tar.gz)	Tar arşivi (.tar.gz)+photocraft	Image editing	Görsel düzenleme+vectorcraft	Vector illustration	Vektörel çizim+filmcraft	Video editing, color and sound	Video düzenleme, renk ve ses+lightcraft	Photo library and raw development	Fotoğraf arşivi ve RAW işleme+pdfcraft	Reading, organizing and protecting PDFs	PDF okuma, düzenleme ve koruma+effectcraft	Motion graphics and visual effects	Hareketli grafikler ve görsel efektler+designcraft	Page layout and publishing	Sayfa düzeni ve yayıncılık+wordcraft	Writing and document design	Yazma ve belge tasarımı+deckcraft	Presentations and slide shows	Sunumlar ve slayt gösterileri+gridcraft	Spreadsheets and data	Elektronik tablolar ve veriler+cadcraft	Computer-aided design and drafting	Bilgisayar destekli tasarım ve teknik çizim+soundcraft	Recording, editing and mixing audio	Ses kaydı, düzenleme ve miksaj+figcraft	Interface design and prototyping	Arayüz tasarımı ve prototipleme+month	Jan	Oca+month	Feb	Şub+month	Mar	Mar+month	Apr	Nis+month	May	May+month	Jun	Haz+month	Jul	Tem+month	Aug	Ağu+month	Sep	Eyl+month	Oct	Eki+month	Nov	Kas+month	Dec	Ara+	Not checked yet	Henüz denetlenmedi+	GitHub's hourly limit was reached; full details return in {min} min	GitHub'ın saatlik sınırına ulaşıldı; tüm ayrıntılar {min} dakika sonra yeniden gösterilecek+	GitHub limit hit; back in {min} min	GitHub sınırına ulaşıldı; {min} dakika sonra yeniden denenecek+	Installing for {platform}	{platform} için yükleniyor+	Downloads for {platform}	{platform} için indirilebilir dosyalar+	No downloads for this system	Bu sistem için indirilebilir dosya yok+	Join the ArtCraft community on Discord	Discord'da ArtCraft topluluğuna katıl+	ArtCraft on {name}	{name} üzerinde ArtCraft+	Couldn't open {name}: {e}	{name} açılamadı: {e}+	Download cancelled	İndirme iptal edildi+	Available to install	Yüklenebilir+	Available	Kullanılabilir+	Installed · up to date	Yüklü · güncel+	Update available	Güncelleme mevcut+	Installed	Yüklü+	installed	yüklü+	Not available here	Burada kullanılamıyor+	Updating…	Güncelleniyor…+	Update paused	Güncelleme duraklatıldı+	Download paused	İndirme duraklatıldı+	{version} installed → {latest} released	Yüklü: {version} → yayımlanan: {latest}+	Version {version}	Sürüm {version}+	{installed} installed · latest {latest}	Yüklü: {installed} · en son: {latest}+	Installed · latest {latest}	Yüklü · en son sürüm: {latest}+	Version {version} installed	{version} sürümü yüklü+	Version {latest}	Sürüm {latest}+	No release published yet	Henüz bir sürüm yayımlanmadı+	ArtCraft Launcher	ArtCraft Launcher+	App	Uygulama+	Latest	En son+	Released	Yayımlanma tarihi+	Auto	Otomatik+	Language	Dil+	Ascending	Artan+	Descending	Azalan+	Click to reverse the order	Sıralamayı tersine çevirmek için tıkla+	Click to sort by this column	Bu sütuna göre sıralamak için tıkla+	Like {name}	{name} gibi+	{done} of {total}	{total} içinden {done}+	Downloading	İndiriliyor+	Verifying checksum…	Sağlama toplamı doğrulanıyor…+	Resume	Sürdür+	{done} of {total} downloaded	{total} içinden {done} indirildi+	{done} downloaded	{done} indirildi+	Checking for updates…	Güncellemeler denetleniyor…+	Downloads the new version, replaces this one and opens it again	Yeni sürümü indirir, mevcut sürümün yerine koyar ve yeniden açar+	Couldn't check for updates: {f}	Güncellemeler denetlenemedi: {f}+	GitHub repository	GitHub deposu+	ArtCraft	ArtCraft+	Update 1 app	1 uygulamayı güncelle+	Update all ({count})	Tümünü güncelle ({count})+	⊞  Grid	⊞  Izgara+	☰  Table	☰  Tablo+	🔍  Search apps	🔍  Uygulama ara+	{name} {version}	{name} {version}+	Match system	Sistemle aynı+	Dark	Koyu+	Light	Açık+	Full changelog	Tüm değişiklikler+	link	bağlantı+	No apps match	Eşleşen uygulama yok+	Open ArtCraft Launcher to update.	Güncellemek için ArtCraft Launcher'ı aç.+	{name} {v} is available	{name} {v} sürümü kullanılabilir+	{count} updates are available	{count} güncelleme mevcut+	These notes weren't fetched (GitHub's request limit was reached). They're on the release page.	Bu notlar alınamadı (GitHub istek sınırına ulaşıldı). Notlar sürüm sayfasında bulunuyor.+	When on, opening the launcher from the menu bar brings its window to the desktop you're on. When off, macOS switches you to the desktop the window was on.	Etkinleştirildiğinde, menü çubuğundan başlatıcıyı açmak pencereyi bulunduğun masaüstüne getirir. Devre dışı bırakıldığında macOS, pencerenin bulunduğu masaüstüne geçer.+	Couldn't change the login item: {e}	Oturum açılış öğesi değiştirilemedi: {e}+column	App	Uygulama+column	Installed	Yüklü+column	Latest	En son+column	Released	Yayımlandı+filter	Installed	Yüklü+	{name} details	{name} ayrıntıları+@plural	{n} app|{n} apps	{n} uygulama|{n} uygulama+@plural	{n} min ago|{n} min ago	{n} dakika önce|{n} dakika önce+@plural	{n} h ago|{n} h ago	{n} saat önce|{n} saat önce+@plural	{n} day ago|{n} days ago	{n} gün önce|{n} gün önce+@msg	Couldn't open {name}: {e}	{name} açılamadı: {e}+@msg	Download cancelled	İndirme iptal edildi+@msg	{name} updated to {version}	{name}, {version} sürümüne güncellendi+@msg	{name} installed: {version}	{name} yüklendi: {version}+@msg	{name} updated to {version} (this release publishes no checksum, so only its size was checked)	{name}, {version} sürümüne güncellendi (bu sürümde sağlama toplamı yayımlanmadığı için yalnızca dosya boyutu doğrulandı)+@msg	{name} installed: {version} (this release publishes no checksum, so only its size was checked)	{name} yüklendi: {version} (bu sürümde sağlama toplamı yayımlanmadığı için yalnızca dosya boyutu doğrulandı)+@msg	{name} was removed	{name} kaldırıldı+@msg	{name} is running. Quit it, then try again.	{name} çalışıyor. Uygulamadan çıkıp yeniden dene.+@id	app.install	Yükle+@id	app.update	{v} sürümüne güncelle+@id	app.open	Aç+@id	app.download	{os} için indir+@id	app.reveal	Finder'da göster+@id	app.reinstall	Yeniden yükle+@id	app.uninstall	Kaldır…+@id	app.notes	Sürüm notları+@id	app.website	Web sitesi+@id	app.github	GitHub deposu+@id	app.releases	Tüm sürümler+@id	launcher.update	Güncelle ve yeniden başlat+@id	launcher.download	İndir+@id	launcher.notes	Yenilikler+@id	launcher.dismiss	Kapat+@id	settings.open	Ayarlar+@id	settings.quit	ArtCraft Launcher'dan çık+@id	view.grid	Izgara+@id	view.table	Tablo+@id	filter.all	Tümü+@id	filter.installed	Yüklü+@id	filter.updates	Güncellemeler+@id	filter.notinstalled	Yüklü değil+@id	sort.suite	Paket sırası+@id	sort.name	Ad+@id	sort.inspired	Esinlenilen uygulama+@id	sort.status	Durum+@id	sort.installed	Yüklü sürüm+@id	sort.latest	En son sürüm+@id	sort.released	En yeni sürüm+@id	help.discord	Discord+@id	help.github	GitHub+@id	help.website	Web sitesi+@id	update.check	Güncellemeleri denetle+@id	update.check_auto	Güncellemeleri otomatik denetle+@id	update.notify	Yüklü bir uygulama için güncelleme olduğunda beni bilgilendir+@id	update.prereleases	Ön sürümleri dahil et (beta ve sürüm adayları)+@id	linux.preferred_kind	Yeni uygulamaları şu biçimde yükle+@id	tray.close_to_tray	Pencere kapandığında sistem tepsisinde çalışmaya devam et+@id	tray.show_on_current_desktop	Pencereyi geçerli masaüstünde göster+@id	tray.login_item	Oturum açtığımda ArtCraft Launcher'ı başlat+@id	appearance.theme	Görünüm+	Show ArtCraft Launcher	ArtCraft Launcher'ı göster+	Check for Updates	Güncellemeleri denetle+	Visit getartcraft.com	getartcraft.com adresini ziyaret et+	ArtCraft on GitHub	GitHub'da ArtCraft+	Join the ArtCraft Discord	ArtCraft Discord'una katıl+	App details	Uygulama ayrıntıları+	Close (Esc)	Kapat (Esc)+	Features	Özellikler+	Latest release	En son sürüm+	Version	Sürüm+	Platforms	Platformlar+	Releases	Sürümler+	Enlarge picture	Resmi büyüt+	Click to enlarge	Büyütmek için tıkla+	Previous picture (←)	Önceki resim (←)+	Next picture (→)	Sonraki resim (→)+	Loading pictures…	Resimler yükleniyor…+	Pictures couldn't be loaded. Reopen this page to try again.	Resimler yüklenemedi. Yeniden denemek için bu sayfayı tekrar aç.+@plural	ArtCraft Launcher · {n} update available|ArtCraft Launcher · {n} updates available	ArtCraft Launcher · {n} güncelleme mevcut|ArtCraft Launcher · {n} güncelleme mevcut+	Install folder	Yükleme klasörü+	Default install folder	Varsayılan yükleme klasörü+	System default	Sistem varsayılanı+	Browse…	Gözat…+	Use default	Varsayılanı kullan+	New installs use this folder. Updates stay in their current location.	Yeni yüklemeler bu klasöre yapılır. Güncellemeler mevcut konumlarında kalır.+	Custom folders use AppImage on Linux.	Linux'ta özel klasörler için AppImage kullanılır.+	The system manages install locations here.	Bu sistemde yükleme konumlarını sistem yönetir.+@msg	couldn't use install folder {path}: {reason}	{path} yükleme klasörü kullanılamadı: {reason}+@msg	this release has no AppImage for a custom install folder	Bu sürümde özel yükleme klasörü için AppImage bulunmuyor+@msg	custom install folders aren't supported on this system	Bu sistemde özel yükleme klasörleri desteklenmiyor+@msg	{path} already exists and wasn't installed by ArtCraft Launcher	{path} zaten mevcut ve ArtCraft Launcher tarafından yüklenmemiş+@msg	couldn't move {path} to Trash ({reason}). Remove it in Finder instead.	{path}, Çöp Sepeti'ne taşınamadı ({reason}). Bunun yerine Finder'dan kaldır.+	Apps are placed inside this folder.	Uygulamalar bu klasörün içine yerleştirilir.+	Replace what's there?	Mevcut içerik değiştirilsin mi?+	{path} already exists. Installing {name} will overwrite it.	{path} zaten mevcut. {name} yüklenirse üzerine yazılacak.+	Replace	Değiştir