collective

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

i18n: add Dutch, Danish, Swedish and Finnish interfaces

i18n: add Dutch, Danish, Swedish and Finnish interfaces Four new interface languages: Dutch, Danish, Swedish and Finnish. Each is a complete 307-entry catalog — the whole key union (every plain UI label, `@id` action, `@msg` template, `@plural` pair, `month` abbreviation and craft tagline), written from the meaning of the English labels with each language's standard software vocabulary (Microsoft/Apple style, informal register: je/du/sinä). ## What - `nl.tsv`, `da.tsv`, `sv.tsv`, `fi.tsv`, registered in the language list (11 → 15) with locale matching: `nl-NL`/`nl-BE`, `da-DK`, `sv-SE`/`sv-FI`, `fi-FI` (plus the usual underscore/`.UTF-8` forms).

Status
open
Score
0.00
Adopters
0 other operators
Author
pechnikov2026-star (imported from pull request #453, open)
Base
c99e375a67cba194d386b3e87316d173fbc76343
Size
+1885 −5 in 11 files
Review
pending
Shared
2026-10-28
Id
bdb832a4b2a9c234b986bcb0

How it went

No other operator has reported using it yet.

Diff

raw · README.md crates/ui-egui/src/i18n/da.tsv crates/ui-egui/src/i18n/fi.tsv crates/ui-egui/src/i18n/lang.rs crates/ui-egui/src/i18n/nl.tsv crates/ui-egui/src/i18n/ru.tsv crates/ui-egui/src/i18n/sv.tsv crates/ui-egui/tests/danish.rs crates/ui-egui/tests/dutch.rs crates/ui-egui/tests/finnish.rs crates/ui-egui/tests/swedish.rs

diff --git a/README.md b/README.md--- a/README.md+++ b/README.md@@ -84,15 +84,19 @@ The web version shows the same catalog in the browser, with the latest download  ## Interface languages -The interface is in English, Brazilian Portuguese (Português (Brasil)), Czech (Čeština), French-(Français), German (Deutsch), Hungarian (Magyar), Japanese (日本語), Polish (Polski), Russian-(Русский), Simplified Chinese (简体中文) or Spanish (Español). **Auto**, the default, follows the+The interface is in English, Brazilian Portuguese (Português (Brasil)), Czech (Čeština), Danish+(Dansk), Dutch (Nederlands), Finnish (Suomi), French (Français), German (Deutsch), Hungarian+(Magyar), Japanese (日本語), Polish (Polski), Russian (Русский), Simplified Chinese (简体中文), Spanish+(Español) or Swedish (Svenska). **Auto**, the default, follows the system or browser language; **Settings → Language** picks one and switches at once, and the choice is kept between runs. Czech locales (`cs-CZ`, `cs_CZ.UTF-8`…) select Czech, German ones (`de-DE`, `de-AT`, `de-CH`, `de_DE.UTF-8`…) German, French ones (`fr-FR`, `fr-CA`…) French, Hungarian ones (`hu`, `hu-HU`, `hu_HU.UTF-8`…) Hungarian, Japanese ones (`ja`, `ja-JP`, `ja_JP.UTF-8`…) Japanese, Polish ones (`pl`, `pl-PL`, `pl_PL.UTF-8`) Polish, Spanish ones (`es-ES`, `es-MX`, `es-419`…)-Spanish, and Portuguese ones (`pt-BR`, and `pt-PT` too, for now) Brazilian Portuguese. Simplified+Spanish, Portuguese ones (`pt-BR`, and `pt-PT` too, for now) Brazilian Portuguese, Dutch ones+(`nl-NL`, `nl-BE`, `nl_NL.UTF-8`…) Dutch, Danish ones (`da-DK`, `da_DK.UTF-8`…) Danish, Swedish+ones (`sv-SE`, `sv-FI`, `sv_SE.UTF-8`…) Swedish, and Finnish ones (`fi-FI`, `fi_FI.UTF-8`…)+Finnish. Simplified Chinese locales (`zh-CN`, `zh-SG`, `zh-Hans`, and POSIX forms such as `zh_CN.UTF-8`) select Chinese; Traditional Chinese ones don't. To try a language without changing the setting, start the desktop app with `ARTCRAFT_LAUNCHER_LOCALE=pt-BR`, or add `?lang=ru` to the web address.diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsvnew file mode 100644--- /dev/null+++ b/crates/ui-egui/src/i18n/da.tsv@@ -0,0 +1,327 @@+# Danish (da) catalog for ArtCraft Launcher.+# Format: context<TAB>source<TAB>translation+# Empty context = plain UI string (tl!, t).+# @id = command-id keyed (tr_id).+# @plural = plural forms: one|other (Danish has one plural class, so the forms often coincide).+# @msg = status/error message template (message, msg).+# Other context = disambiguation for tr_ctx.+#+# Clean-room: written from the meaning of ArtCraft Launcher's English labels, in standard+# Danish software terminology in the informal "du" register (Microsoft/Apple da style).+#+# Coverage: the whole interface: every menu string and tl! literal (complete_menus = true).+# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite+# name "Craft App Suite", app names (PhotoCraft, LightCraft, FilmCraft,+# DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft,+# SoundCraft, FigCraft), "GitHub", "Discord", "Finder", "makers".+# Trailing "…" (U+2026) must be preserved. Placeholders must appear in the translation:+# {ago}, {a}, {b}, {count}, {date}, {day}, {done}, {e}, {f}, {installed}, {latest}, {min},+# {month}, {name}, {n}, {os}, {platform}, {sources}, {total}, {version}, {v}, {year}.++	Launcher	Launcher+	Craft App Suite	Craft App Suite+	Open Source Tools for Creatives, Makers, and Builders	Open source-værktøjer til kreative, makers og byggere+	Settings	Indstillinger+	Check for updates	Søg efter opdateringer+	Grid	Gitter+	Table	Tabel+	Show apps as cards	Vis apps som kort+	Show apps as a table	Vis apps som en tabel+	All	Alle+	Updates	Opdateringer+	Not installed	Ikke installerede+	Search apps	Søg efter apps+	Sort	Sortér+	Suite order	Suite-rækkefølge+	Name	Navn+	Inspired by	Inspiret af+	Status	Status+	Installed version	Installeret version+	Latest version	Seneste version+	Newest release	Nyeste udgivelse+	Discord	Discord+	GitHub	GitHub+	Website	Websted+	Classic apps	Klassiske apps+	Classic	Klassisk+	New apps	Nye apps+	NEW	NY+	Install	Installér+	Update to {v}	Opdatér til {v}+	Open	Åbn+	Download for {os}	Download til {os}+	Download	Download+	Coming soon	Kommer snart+	Checking…	Tjekker…+	Not available	Ikke tilgængelig+	Offline	Offline+	Downloading {done} of {total}	Downloader {done} af {total}+	Downloading…	Downloader…+	Reconnecting…	Genopretter forbindelsen…+	Verifying…	Verificerer…+	Installing, then restarting…	Installerer og genstarter…+	Installing…	Installerer…+	Removing…	Fjerner…+	Pause download	Sæt download på pause+	Cancel download	Annullér download+	Resume download	Genoptag download+	Discard download	Kassér download+	Release notes	Udgivelsesnoter+	Show in Finder	Vis i Finder+	Show in Explorer	Vis i Stifinder+	Show in Files	Vis i Filer+	Reinstall	Geninstallér+	Uninstall…	Afinstallér…+	All releases	Alle udgivelser+	ArtCraft Launcher {version} is available.	ArtCraft Launcher {version} er tilgængelig.+	Dismiss	Skjul+	Update and restart	Opdatér og genstart+	A new version is available. Would you like to relaunch with the updated version?	En ny version er tilgængelig. Vil du genstarte med den opdaterede version?+	Later	Senere+	What's new	Nyheder+	No notes were published with this release.	Der blev ikke udgivet noter med denne udgivelse.+	Released {date}	Udgivet {date}+	Open on GitHub	Åbn på GitHub+	Close	Luk+	ArtCraft Launcher {version}	ArtCraft Launcher {version}+	Only when I ask	Kun når jeg beder om det+	Automatically download and install updates	Download og installér opdateringer automatisk+	Notify me when an installed app has an update	Underret mig, når en installeret app har en opdatering+	Include pre-releases (betas and release candidates)	Medtag forhåndsudgivelser (betaer og release candidates)+	Installing on Linux	Installation på Linux+	Install new apps as	Installér nye apps som+	System package (recommended)	Systempakke (anbefalet)+	Updates always use the format an app was installed with.	Opdateringer bruger altid det format, som en app blev installeret med.+	Running in the background	Kører i baggrunden+	Keep running in the tray when the window is closed	Kør videre i systembakken, når vinduet lukkes+	Show the window on the current desktop	Vis vinduet på det aktuelle skrivebord+	Start ArtCraft Launcher when I log in	Start ArtCraft Launcher, når jeg logger på+	Community	Fællesskab+	Questions, ideas and news from the ArtCraft team	Spørgsmål, idéer og nyheder fra ArtCraft-teamet+	Appearance	Udseende+	Quit ArtCraft Launcher	Afslut ArtCraft Launcher+	Done	Udført+	Uninstall {name}?	Afinstallér {name}?+	The app will be moved to the Trash. Your documents and settings stay.	Appen flyttes til Papirkurven. Dine dokumenter og indstillinger bevares.+	Windows will remove it like any installed program. Your documents and settings stay.	Windows fjerner den ligesom ethvert andet installeret program. Dine dokumenter og indstillinger bevares.+	Your system's package manager will remove it, and may ask for your password. Your documents and settings stay.	Systemets pakkehåndtering fjerner den og vil muligvis bede om din adgangskode. Dine dokumenter og indstillinger bevares.+	The app will be removed. Your documents and settings stay.	Appen fjernes. Dine dokumenter og indstillinger bevares.+	Uninstall	Afinstallér+	Cancel	Annullér+	Checked {ago}	Tjekket {ago}+	just now	lige nu+	yesterday	i går+	{month} {day}, {year}	{day}. {month} {year}+	Automatically	Automatisk+	Every Craft app	Alle Craft-apps+	Apps on this computer	Apps på denne computer+	Installed apps with a newer version	Installerede apps med en nyere version+	Apps you can install	Apps, du kan installere+	Hide App	Skjul app+	Unhide App	Vis app igen+	Hidden Apps	Skjulte apps+	Apps you hid	Apps, du har skjult+	Checked {ago} · using {sources}	Tjekket {ago} · via {sources}+	{a} and {b}	{a} og {b}+	Join the Discord	Slut dig til Discord+	Learn more	Få mere at vide+	Minimize	Minimér+	Maximize	Maksimér+	Restore	Gendan+	New	Ny+	OK	OK+	Open link	Åbn link+	Update	Opdatér+	{name} icon	{name}-ikon+	Loading ArtCraft Launcher…	Indlæser ArtCraft Launcher…+	Cancel update	Annullér opdatering+	Stop waiting; the update can be started again later	Stop med at vente; opdateringen kan startes igen senere+	Download again	Download igen+	Install cancelled	Installation annulleret+	Install cancelled. The download is kept for the next try.	Installation annulleret. Downloaden gemmes til næste forsøg.+	Update cancelled	Opdatering annulleret+	Uninstall cancelled	Afinstallation annulleret+	Retry install	Prøv installation igen+	Retry update to {version}	Prøv opdatering til {version} igen+	The download is still here. It's checked again, then installed.	Downloaden er der stadig. Den tjekkes igen og installeres derefter.+	Waiting for another app…	Venter på en anden app…+	Waiting for other installs…	Venter på andre installationer…+	Installer (.msi)	Installationsprogram (.msi)+	Portable (.zip)	Portable (.zip)+	Disk image (.dmg)	Diskaftryk (.dmg)+	Debian package (.deb)	Debian-pakke (.deb)+	RPM package (.rpm)	RPM-pakke (.rpm)+	Flatpak bundle	Flatpak-bundle+	Tarball (.tar.gz)	Tar-arkiv (.tar.gz)+photocraft	Image editing	Billedredigering+vectorcraft	Vector illustration	Vektorillustration+filmcraft	Video editing, color and sound	Videoredigering, farve og lyd+lightcraft	Photo library and raw development	Fotobibliotek og raw-fremkaldelse+pdfcraft	Reading, organizing and protecting PDFs	Læsning, organisering og beskyttelse af PDF-filer+effectcraft	Motion graphics and visual effects	Motion graphics og visuelle effekter+designcraft	Page layout and publishing	Sideopsætning og publicering+wordcraft	Writing and document design	Skrivning og dokumentdesign+deckcraft	Presentations and slide shows	Præsentationer og diasshows+gridcraft	Spreadsheets and data	Regneark og data+cadcraft	Computer-aided design and drafting	Computerstøttet design og tegning+soundcraft	Recording, editing and mixing audio	Optagelse, redigering og mixing af lyd+figcraft	Interface design and prototyping	Interface-design og prototyping+month	Jan	jan+month	Feb	feb+month	Mar	mar+month	Apr	apr+month	May	maj+month	Jun	jun+month	Jul	jul+month	Aug	aug+month	Sep	sep+month	Oct	okt+month	Nov	nov+month	Dec	dec+	Not checked yet	Ikke tjekket endnu+	GitHub's hourly limit was reached; full details return in {min} min	GitHubs grænse pr. time blev nået; alle detaljer vender tilbage om {min} min+	GitHub limit hit; back in {min} min	GitHub-grænsen er nået; tilbage om {min} min+	Installing for {platform}	Installation til {platform}+	Downloads for {platform}	Downloads til {platform}+	No downloads for this system	Ingen downloads til dette system+	Join the ArtCraft community on Discord	Slut dig til ArtCraft-fællesskabet på Discord+	ArtCraft on {name}	ArtCraft på {name}+	Couldn't open {name}: {e}	Kunne ikke åbne {name}: {e}+	Download cancelled	Download annulleret+	Available to install	Kan installeres+	Available	Tilgængelig+	Installed · up to date	Installeret · ajour+	Update available	Opdatering tilgængelig+	Installed	Installeret+	installed	installeret+	Not available here	Ikke tilgængelig her+	Updating…	Opdaterer…+	Update paused	Opdatering sat på pause+	Download paused	Download sat på pause+	{version} installed → {latest} released	{version} installeret → {latest} udgivet+	Version {version}	Version {version}+	{installed} installed · latest {latest}	{installed} installeret · seneste {latest}+	Installed · latest {latest}	Installeret · seneste {latest}+	Version {version} installed	Version {version} installeret+	Version {latest}	Version {latest}+	No release published yet	Ingen udgivelser endnu+	ArtCraft Launcher	ArtCraft Launcher+	App	App+	Latest	Seneste+	Released	Udgivet+	Auto	Auto+	Language	Sprog+	Ascending	Stigende+	Descending	Faldende+	Click to reverse the order	Klik for at vende rækkefølgen+	Click to sort by this column	Klik for at sortere efter denne kolonne+	Like {name}	Ligesom {name}+	{done} of {total}	{done} af {total}+	Downloading	Downloader+	Verifying checksum…	Verificerer kontrolsum…+	Resume	Genoptag+	{done} of {total} downloaded	{done} af {total} downloadet+	{done} downloaded	{done} downloadet+	Checking for updates…	Søger efter opdateringer…+	Downloads the new version, replaces this one and opens it again	Downloader den nye version, erstatter denne og åbner den igen+	Couldn't check for updates: {f}	Kunne ikke søge efter opdateringer: {f}+	Website (coming soon)	Websted (kommer snart)+	GitHub repository	GitHub-repository+	ArtCraft	ArtCraft+	Update 1 app	Opdatér 1 app+	Update all ({count})	Opdatér alle ({count})+	⊞  Grid	⊞  Gitter+	☰  Table	☰  Tabel+	🔍  Search apps	🔍  Søg efter apps+	{name} {version}	{name} {version}+	Match system	Følg systemet+	Dark	Mørk+	Light	Lys+	Full changelog	Fuld ændringslog+	link	link+	No apps match	Ingen apps matcher+	Open ArtCraft Launcher to update.	Åbn ArtCraft Launcher for at opdatere.+	{name} {v} is available	{name} {v} er tilgængelig+	{count} updates are available	Der er {count} tilgængelige opdateringer+	These notes weren't fetched (GitHub's request limit was reached). They're on the release page.	Disse noter blev ikke hentet (GitHubs anmodningsgrænse blev nået). De findes på udgivelsessiden.+	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.	Når den er slået til, vises vinduet på det skrivebord, du er på, når du åbner launcher-appen fra menulinjen. Når den er slået fra, skifter macOS dig til det skrivebord, vinduet var på.+	Couldn't change the login item: {e}	Kunne ikke ændre login-elementet: {e}+column	App	App+column	Installed	Installeret+column	Latest	Seneste+column	Released	Udgivet+filter	Installed	Installerede+	App details	Detaljer om appen+	Close (Esc)	Luk (Esc)+	Features	Funktioner+	Latest release	Seneste udgivelse+	Version	Version+	Platforms	Platforme+	Releases	Udgivelser+	Enlarge picture	Forstør billede+	Click to enlarge	Klik for at forstørre+	Previous picture (←)	Forrige billede (←)+	Next picture (→)	Næste billede (→)+	Loading pictures…	Indlæser billeder…+	Pictures couldn't be loaded. Reopen this page to try again.	Billederne kunne ikke indlæses. Åbn siden igen for at prøve en gang til.+	{name} details	Detaljer om {name}+@plural	{n} app|{n} apps	{n} app|{n} apps+@plural	{n} min ago|{n} min ago	for {n} min siden|for {n} min siden+@plural	{n} h ago|{n} h ago	for {n} t siden|for {n} t siden+@plural	{n} day ago|{n} days ago	for {n} dag siden|for {n} dage siden+@msg	Couldn't open {name}: {e}	Kunne ikke åbne {name}: {e}+@msg	Download cancelled	Download annulleret+@msg	{name} updated to {version}	{name} opdateret til {version}+@msg	{name} installed: {version}	{name} installeret: {version}+@msg	{name} updated to {version} (this release publishes no checksum, so only its size was checked)	{name} opdateret til {version} (denne udgivelse offentliggør ingen kontrolsum, så kun dens størrelse blev kontrolleret)+@msg	{name} installed: {version} (this release publishes no checksum, so only its size was checked)	{name} installeret: {version} (denne udgivelse offentliggør ingen kontrolsum, så kun dens størrelse blev kontrolleret)+@msg	{name} was removed	{name} blev fjernet+@msg	{name} is running. Quit it, then try again.	{name} kører. Luk den, og prøv igen.+@id	app.install	Installér+@id	app.update	Opdatér til {v}+@id	app.open	Åbn+@id	app.download	Download til {os}+@id	app.reveal	Vis i Finder+@id	app.reinstall	Geninstallér+@id	app.uninstall	Afinstallér…+@id	app.notes	Udgivelsesnoter+@id	app.website	Websted+@id	app.github	GitHub-repository+@id	app.releases	Alle udgivelser+@id	launcher.update	Opdatér og genstart+@id	launcher.download	Download+@id	launcher.notes	Nyheder+@id	launcher.dismiss	Skjul+@id	settings.open	Indstillinger+@id	settings.quit	Afslut ArtCraft Launcher+@id	view.grid	Gitter+@id	view.table	Tabel+@id	filter.all	Alle+@id	filter.installed	Installerede+@id	filter.updates	Opdateringer+@id	filter.notinstalled	Ikke installerede+@id	sort.suite	Suite-rækkefølge+@id	sort.name	Navn+@id	sort.inspired	Inspiret af+@id	sort.status	Status+@id	sort.installed	Installeret version+@id	sort.latest	Seneste version+@id	sort.released	Nyeste udgivelse+@id	help.discord	Discord+@id	help.github	GitHub+@id	help.website	Websted+@id	update.check	Søg efter opdateringer+@id	update.check_auto	Søg efter opdateringer automatisk+@id	update.notify	Underret mig, når en installeret app har en opdatering+@id	update.prereleases	Medtag forhåndsudgivelser (betaer og release candidates)+@id	linux.preferred_kind	Installér nye apps som+@id	tray.close_to_tray	Kør videre i systembakken, når vinduet lukkes+@id	tray.show_on_current_desktop	Vis vinduet på det aktuelle skrivebord+@id	tray.login_item	Start ArtCraft Launcher, når jeg logger på+@id	appearance.theme	Udseende+	Show ArtCraft Launcher	Vis ArtCraft Launcher+	Check for Updates	Søg efter opdateringer+	Visit getartcraft.com	Besøg getartcraft.com+	ArtCraft on GitHub	ArtCraft på GitHub+	Join the ArtCraft Discord	Slut dig til ArtCraft-Discord+@plural	ArtCraft Launcher · {n} update available|ArtCraft Launcher · {n} updates available	ArtCraft Launcher · {n} tilgængelig opdatering|ArtCraft Launcher · {n} tilgængelige opdateringerdiff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsvnew file mode 100644--- /dev/null+++ b/crates/ui-egui/src/i18n/fi.tsv@@ -0,0 +1,328 @@+# Finnish (fi) catalog for ArtCraft Launcher.+# Format: context<TAB>source<TAB>translation+# Empty context = plain UI string (tl!, t).+# @id = command-id keyed (tr_id).+# @plural = plural forms: one|other (only 1 is "one" in Finnish).+# @msg = status/error message template (message, msg).+# Other context = disambiguation for tr_ctx.+#+# Clean-room: written from the meaning of ArtCraft Launcher's English labels, in standard+# Finnish software terminology (Microsoft/Apple fi style): concise labels, lowercase+# sentence style, imperative for buttons.+#+# Coverage: the whole interface: every menu string and tl! literal (complete_menus = true).+# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite+# name "Craft App Suite", app names (PhotoCraft, LightCraft, FilmCraft,+# DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft,+# SoundCraft, FigCraft), "GitHub", "Discord", "Finder".+# Trailing "…" (U+2026) must be preserved. Placeholders must appear in the translation:+# {ago}, {a}, {b}, {count}, {date}, {day}, {done}, {e}, {f}, {installed}, {latest}, {min},+# {month}, {name}, {n}, {os}, {platform}, {sources}, {total}, {version}, {v}, {year}.++	Launcher	Launcher+	Craft App Suite	Craft App Suite+	Open Source Tools for Creatives, Makers, and Builders	Avoimen lähdekoodin työkalut luojille, tekijöille ja rakentajille+	Settings	Asetukset+	Check for updates	Tarkista päivitykset+	Grid	Ruudukko+	Table	Taulukko+	Show apps as cards	Näytä sovellukset kortteina+	Show apps as a table	Näytä sovellukset taulukkona+	All	Kaikki+	Updates	Päivitykset+	Not installed	Ei asennettu+	Search apps	Etsi sovelluksia+	Sort	Järjestä+	Suite order	Suiten järjestys+	Name	Nimi+	Inspired by	Innoittaja+	Status	Tila+	Installed version	Asennettu versio+	Latest version	Uusin versio+	Newest release	Uusin julkaisu+	Discord	Discord+	GitHub	GitHub+	Website	Verkkosivusto+	Classic apps	Perinteiset sovellukset+	Classic	Perinteiset+	New apps	Uudet sovellukset+	NEW	UUSI+	Install	Asenna+	Update to {v}	Päivitä versioon {v}+	Open	Avaa+	Download for {os}	Lataa {os}-versio+	Download	Lataa+	Coming soon	Tulossa pian+	Checking…	Tarkistetaan…+	Not available	Ei saatavilla+	Offline	Ei verkkoyhteyttä+	Downloading {done} of {total}	Ladataan {done}/{total}+	Downloading…	Ladataan…+	Reconnecting…	Yhdistetään uudelleen…+	Verifying…	Varmistetaan…+	Installing, then restarting…	Asennetaan ja käynnistetään uudelleen…+	Installing…	Asennetaan…+	Removing…	Poistetaan…+	Pause download	Keskeytä lataus+	Cancel download	Peruuta lataus+	Resume download	Jatka latausta+	Discard download	Hylkää lataus+	Release notes	Julkaisutiedot+	Show in Finder	Näytä Finderissä+	Show in Explorer	Näytä Resurssienhallinnassa+	Show in Files	Näytä Tiedostot-sovelluksessa+	Reinstall	Asenna uudelleen+	Uninstall…	Poista asennus…+	All releases	Kaikki julkaisut+	ArtCraft Launcher {version} is available.	ArtCraft Launcher {version} on saatavilla.+	Dismiss	Ohita+	Update and restart	Päivitä ja käynnistä uudelleen+	A new version is available. Would you like to relaunch with the updated version?	Uusi versio on saatavilla. Haluatko käynnistää ohjelman uudelleen päivitetyn version kanssa?+	Later	Myöhemmin+	What's new	Uutta+	No notes were published with this release.	Tämän julkaisun mukana ei ole julkaisutietoja.+	Released {date}	Julkaistu {date}+	Open on GitHub	Avaa GitHubissa+	Close	Sulje+	ArtCraft Launcher {version}	ArtCraft Launcher {version}+	Only when I ask	Vain pyynnöstäni+	Automatically download and install updates	Lataa ja asenna päivitykset automaattisesti+	Notify me when an installed app has an update	Ilmoita, kun asennetulla sovelluksella on päivitys+	Include pre-releases (betas and release candidates)	Sisällytä esiversiot (beetat ja julkaisuehdokkaat)+	Installing on Linux	Asentaminen Linuxissa+	Install new apps as	Asenna uudet sovellukset muodossa+	System package (recommended)	Järjestelmäpaketti (suositeltu)+	Updates always use the format an app was installed with.	Päivitykset käyttävät aina muotoa, jolla sovellus on asennettu.+	Running in the background	Taustalla ajaminen+	Keep running in the tray when the window is closed	Pidä käynnissä ilmoitusalueella, kun ikkuna suljetaan+	Show the window on the current desktop	Näytä ikkuna nykyisellä työpöydällä+	Start ArtCraft Launcher when I log in	Käynnistä ArtCraft Launcher, kun kirjaudun sisään+	Community	Yhteisö+	Questions, ideas and news from the ArtCraft team	Kysymyksiä, ideoita ja uutisia ArtCraft-tiimiltä+	Appearance	Ulkoasu+	Quit ArtCraft Launcher	Lopeta ArtCraft Launcher+	Done	Valmis+	Uninstall {name}?	Poistetaanko {name}?+	The app will be moved to the Trash. Your documents and settings stay.	Sovellus siirretään roskakoriin. Tiedostosi ja asetuksesi säilyvät.+	Windows will remove it like any installed program. Your documents and settings stay.	Windows poistaa sen kuten minkä tahansa asennetun ohjelman. Tiedostosi ja asetuksesi säilyvät.+	Your system's package manager will remove it, and may ask for your password. Your documents and settings stay.	Järjestelmän pakettienhallinta poistaa sen ja saattaa pyytää salasanaasi. Tiedostosi ja asetuksesi säilyvät.+	The app will be removed. Your documents and settings stay.	Sovellus poistetaan. Tiedostosi ja asetuksesi säilyvät.+	Uninstall	Poista asennus+	Cancel	Peruuta+	Checked {ago}	Tarkistettu {ago}+	just now	juuri nyt+	yesterday	eilen+	{month} {day}, {year}	{day}. {month} {year}+	Automatically	Automaattisesti+	Every Craft app	Kaikki Craft-sovellukset+	Apps on this computer	Tämän tietokoneen sovellukset+	Installed apps with a newer version	Asennetut sovellukset, joista on uudempi versio+	Apps you can install	Asennettavat sovellukset+	Hide App	Piilota sovellus+	Unhide App	Näytä piilotettu sovellus+	Hidden Apps	Piilotetut sovellukset+	Apps you hid	Piilottamasi sovellukset+	Checked {ago} · using {sources}	Tarkistettu {ago} · lähteinä {sources}+	{a} and {b}	{a} ja {b}+	Join the Discord	Liity Discordiin+	Learn more	Lisätietoja+	Minimize	Pienennä+	Maximize	Suurenna+	Restore	Palauta+	New	Uusi+	OK	OK+	Open link	Avaa linkki+	Update	Päivitä+	{name} icon	{name}-kuvake+	Loading ArtCraft Launcher…	Ladataan ArtCraft Launcheria…+	Cancel update	Peruuta päivitys+	Stop waiting; the update can be started again later	Lopeta odottaminen; päivityksen voi käynnistää uudelleen myöhemmin+	Download again	Lataa uudelleen+	Install cancelled	Asennus peruutettu+	Install cancelled. The download is kept for the next try.	Asennus peruutettiin. Lataus säilytetään seuraavaa yritystä varten.+	Update cancelled	Päivitys peruutettu+	Uninstall cancelled	Poisto peruutettiin+	Retry install	Yritä asennusta uudelleen+	Retry update to {version}	Yritä päivitystä versioon {version} uudelleen+	The download is still here. It's checked again, then installed.	Lataus on edelleen olemassa. Se tarkistetaan uudelleen ja asennetaan sitten.+	Waiting for another app…	Odotetaan toista sovellusta…+	Waiting for other installs…	Odotetaan muita asennuksia…+	Installer (.msi)	Asennusohjelma (.msi)+	Portable (.zip)	Siirrettävä (.zip)+	Disk image (.dmg)	Levykuva (.dmg)+	Debian package (.deb)	Debian-paketti (.deb)+	RPM package (.rpm)	RPM-paketti (.rpm)+	Flatpak bundle	Flatpak-paketti+	Tarball (.tar.gz)	Tar-arkisto (.tar.gz)+photocraft	Image editing	Kuvankäsittely+vectorcraft	Vector illustration	Vektorigrafiikka+filmcraft	Video editing, color and sound	Videoeditointi, väri ja ääni+lightcraft	Photo library and raw development	Kuvakirjasto ja raakakuvien kehitys+pdfcraft	Reading, organizing and protecting PDFs	PDF-tiedostojen lukeminen, järjestäminen ja suojaaminen+effectcraft	Motion graphics and visual effects	Liikegrafiikka ja visuaaliset efektit+designcraft	Page layout and publishing	Sivuasettelu ja julkaiseminen+wordcraft	Writing and document design	Kirjoittaminen ja asiakirjojen muotoilu+deckcraft	Presentations and slide shows	Esitykset ja diaesitykset+gridcraft	Spreadsheets and data	Taulukkolaskenta ja data+cadcraft	Computer-aided design and drafting	Tietokoneavusteinen suunnittelu ja tekninen piirtäminen+soundcraft	Recording, editing and mixing audio	Äänen tallennus, muokkaus ja miksaus+figcraft	Interface design and prototyping	Käyttöliittymäsuunnittelu ja prototypointi+month	Jan	tam+month	Feb	hel+month	Mar	maa+month	Apr	huh+month	May	tou+month	Jun	kes+month	Jul	hei+month	Aug	elo+month	Sep	syy+month	Oct	lok+month	Nov	mar+month	Dec	jou+	Not checked yet	Ei vielä tarkistettu+	GitHub's hourly limit was reached; full details return in {min} min	GitHubin tuntikohtainen raja saavutettiin; kaikki tiedot ovat taas saatavilla {min} min kuluttua+	GitHub limit hit; back in {min} min	GitHubin raja tuli vastaan; taas käytettävissä {min} min kuluttua+	Installing for {platform}	Asennus alustalle {platform}+	Downloads for {platform}	Lataukset alustalle {platform}+	No downloads for this system	Tälle järjestelmälle ei ole latauksia+	Join the ArtCraft community on Discord	Liity ArtCraft-yhteisöön Discordissa+	ArtCraft on {name}	ArtCraft: {name}+	Couldn't open {name}: {e}	Ei voitu avata {name}: {e}+	Download cancelled	Lataus peruutettu+	Available to install	Asennettavissa+	Available	Saatavilla+	Installed · up to date	Asennettu · ajan tasalla+	Update available	Päivitys saatavilla+	Installed	Asennettu+	installed	asennettu+	Not available here	Ei saatavilla täällä+	Updating…	Päivitetään…+	Update paused	Päivitys keskeytetty+	Download paused	Lataus keskeytetty+	{version} installed → {latest} released	{version} asennettu → {latest} julkaistu+	Version {version}	Versio {version}+	{installed} installed · latest {latest}	{installed} asennettu · uusin {latest}+	Installed · latest {latest}	Asennettu · uusin {latest}+	Version {version} installed	Versio {version} asennettu+	Version {latest}	Versio {latest}+	No release published yet	Ei vielä julkaisuja+	ArtCraft Launcher	ArtCraft Launcher+	App	Sovellus+	Latest	Uusin+	Released	Julkaistu+	Auto	Automaattinen+	Language	Kieli+	Ascending	Nouseva+	Descending	Laskeva+	Click to reverse the order	Vaihda järjestyksen suunta napsauttamalla+	Click to sort by this column	Järjestä tämän sarakkeen mukaan napsauttamalla+	Like {name}	Kuten {name}+	{done} of {total}	{done}/{total}+	Downloading	Ladataan+	Verifying checksum…	Varmistetaan tarkistussummaa…+	Resume	Jatka+	{done} of {total} downloaded	{done}/{total} ladattu+	{done} downloaded	{done} ladattu+	Checking for updates…	Tarkistetaan päivityksiä…+	Downloads the new version, replaces this one and opens it again	Lataa uuden version, korvaa tämän ja käynnistää sen uudelleen+	Couldn't check for updates: {f}	Päivityksiä ei voitu tarkistaa: {f}+	Website (coming soon)	Verkkosivusto (tulossa pian)+	GitHub repository	GitHub-tietovarasto+	ArtCraft	ArtCraft+	Update 1 app	Päivitä 1 sovellus+	Update all ({count})	Päivitä kaikki ({count})+	⊞  Grid	⊞  Ruudukko+	☰  Table	☰  Taulukko+	🔍  Search apps	🔍  Etsi sovelluksia+	{name} {version}	{name} {version}+	Match system	Järjestelmän mukainen+	Dark	Tumma+	Light	Vaalea+	Full changelog	Koko muutosloki+	link	linkki+	No apps match	Mikään sovellus ei vastaa hakua+	Open ArtCraft Launcher to update.	Avaa ArtCraft Launcher päivittämistä varten.+	{name} {v} is available	{name} {v} on saatavilla+	{count} updates are available	{count} päivitystä on saatavilla+	These notes weren't fetched (GitHub's request limit was reached). They're on the release page.	Näitä julkaisutietoja ei noudettu (GitHubin pyyntöraja saavutettiin). Ne löytyvät julkaisusivulta.+	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.	Kun asetus on käytössä, ArtCraft Launcherin avaaminen valikkopalkista tuo sen ikkunan työpöydälle, jolla olet. Kun asetus on pois käytöstä, macOS siirtää sinut työpöydälle, jolla ikkuna on.+	Couldn't change the login item: {e}	Kirjautumiskohteen muuttaminen ei onnistunut: {e}+column	App	Sovellus+column	Installed	Asennettu+column	Latest	Uusin+column	Released	Julkaistu+filter	Installed	Asennetut+	App details	Sovelluksen tiedot+	Close (Esc)	Sulje (Esc)+	Features	Ominaisuudet+	Latest release	Uusin julkaisu+	Version	Versio+	Platforms	Alustat+	Releases	Julkaisut+	Enlarge picture	Suurenna kuva+	Click to enlarge	Suurenna napsauttamalla+	Previous picture (←)	Edellinen kuva (←)+	Next picture (→)	Seuraava kuva (→)+	Loading pictures…	Ladataan kuvia…+	Pictures couldn't be loaded. Reopen this page to try again.	Kuvien lataaminen ei onnistunut. Avaa sivu uudelleen ja yritä uudestaan.+	{name} details	{name} · tiedot+@plural	{n} app|{n} apps	{n} sovellus|{n} sovellusta+@plural	{n} min ago|{n} min ago	{n} min sitten|{n} min sitten+@plural	{n} h ago|{n} h ago	{n} t sitten|{n} t sitten+@plural	{n} day ago|{n} days ago	{n} päivä sitten|{n} päivää sitten+@msg	Couldn't open {name}: {e}	Ei voitu avata {name}: {e}+@msg	Download cancelled	Lataus peruutettu+@msg	{name} updated to {version}	{name} päivitettiin versioon {version}+@msg	{name} installed: {version}	{name} asennettu: {version}+@msg	{name} updated to {version} (this release publishes no checksum, so only its size was checked)	{name} päivitettiin versioon {version} (tämä julkaisu ei julkaise tarkistussummaa, joten vain sen koko tarkistettiin)+@msg	{name} installed: {version} (this release publishes no checksum, so only its size was checked)	{name} asennettu: {version} (tämä julkaisu ei julkaise tarkistussummaa, joten vain sen koko tarkistettiin)+@msg	{name} was removed	{name} poistettiin+@msg	{name} is running. Quit it, then try again.	{name} on käynnissä. Lopeta se ja yritä sitten uudelleen.+@id	app.install	Asenna+@id	app.update	Päivitä versioon {v}+@id	app.open	Avaa+@id	app.download	Lataa {os}-versio+@id	app.reveal	Näytä Finderissä+@id	app.reinstall	Asenna uudelleen+@id	app.uninstall	Poista asennus…+@id	app.notes	Julkaisutiedot+@id	app.website	Verkkosivusto+@id	app.github	GitHub-tietovarasto+@id	app.releases	Kaikki julkaisut+@id	launcher.update	Päivitä ja käynnistä uudelleen+@id	launcher.download	Lataa+@id	launcher.notes	Uutta+@id	launcher.dismiss	Ohita+@id	settings.open	Asetukset+@id	settings.quit	Lopeta ArtCraft Launcher+@id	view.grid	Ruudukko+@id	view.table	Taulukko+@id	filter.all	Kaikki+@id	filter.installed	Asennetut+@id	filter.updates	Päivitykset+@id	filter.notinstalled	Ei asennettu+@id	sort.suite	Suiten järjestys+@id	sort.name	Nimi+@id	sort.inspired	Innoittaja+@id	sort.status	Tila+@id	sort.installed	Asennettu versio+@id	sort.latest	Uusin versio+@id	sort.released	Uusin julkaisu+@id	help.discord	Discord+@id	help.github	GitHub+@id	help.website	Verkkosivusto+@id	update.check	Tarkista päivitykset+@id	update.check_auto	Tarkista päivitykset automaattisesti+@id	update.notify	Ilmoita, kun asennetulla sovelluksella on päivitys+@id	update.prereleases	Sisällytä esiversiot (beetat ja julkaisuehdokkaat)+@id	linux.preferred_kind	Asenna uudet sovellukset muodossa+@id	tray.close_to_tray	Pidä käynnissä ilmoitusalueella, kun ikkuna suljetaan+@id	tray.show_on_current_desktop	Näytä ikkuna nykyisellä työpöydällä+@id	tray.login_item	Käynnistä ArtCraft Launcher, kun kirjaudun sisään+@id	appearance.theme	Ulkoasu+	Show ArtCraft Launcher	Näytä ArtCraft Launcher+	Check for Updates	Tarkista päivitykset+	Visit getartcraft.com	Siirry sivulle getartcraft.com+	ArtCraft on GitHub	ArtCraft GitHubissa+	Join the ArtCraft Discord	Liity ArtCraftin Discordiin+@plural	ArtCraft Launcher · {n} update available|ArtCraft Launcher · {n} updates available	ArtCraft Launcher · {n} päivitys saatavilla|ArtCraft Launcher · {n} päivitystä saatavilladiff --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@@ -94,7 +94,7 @@ pub(super) fn plural_polish(n: u64) -> usize { }  /// The registry. English first: it is the fallback and the source language.-pub static LANGUAGES: [LangInfo; 11] = [+pub static LANGUAGES: [LangInfo; 15] = [     LangInfo {         code: "en",         name: "English",@@ -216,6 +216,50 @@ pub static LANGUAGES: [LangInfo; 11] = [         complete_menus: true,         catalog: OnceLock::new(),     },+    LangInfo {+        code: "nl",+        name: "Nederlands",+        english_name: "Dutch",+        script: None,+        source: include_str!("nl.tsv"),+        plural: plural_one_other,+        plural_forms: 2,+        complete_menus: true,+        catalog: OnceLock::new(),+    },+    LangInfo {+        code: "da",+        name: "Dansk",+        english_name: "Danish",+        script: None,+        source: include_str!("da.tsv"),+        plural: plural_one_other,+        plural_forms: 2,+        complete_menus: true,+        catalog: OnceLock::new(),+    },+    LangInfo {+        code: "sv",+        name: "Svenska",+        english_name: "Swedish",+        script: None,+        source: include_str!("sv.tsv"),+        plural: plural_one_other,+        plural_forms: 2,+        complete_menus: true,+        catalog: OnceLock::new(),+    },+    LangInfo {+        code: "fi",+        name: "Suomi",+        english_name: "Finnish",+        script: None,+        source: include_str!("fi.tsv"),+        plural: plural_one_other,+        plural_forms: 2,+        complete_menus: true,+        catalog: OnceLock::new(),+    }, ];  impl LangInfo {diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsvnew file mode 100644--- /dev/null+++ b/crates/ui-egui/src/i18n/nl.tsv@@ -0,0 +1,328 @@+# Dutch (nl) catalog for ArtCraft Launcher.+# Format: context<TAB>source<TAB>translation+# Empty context = plain UI string (tl!, t).+# @id = command-id keyed (tr_id).+# @plural = plural forms: one|other (only 1 is "one" in Dutch).+# @msg = status/error message template (message, msg).+# Other context = disambiguation for tr_ctx.+#+# Clean-room: written from the meaning of ArtCraft Launcher's English labels, in neutral+# standard Dutch for the Netherlands and Flanders (the interface addresses the user as "je";+# software terminology follows the Dutch Microsoft/Apple style).+#+# Coverage: the whole interface: every menu string and tl! literal (complete_menus = true).+# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite+# name "Craft App Suite", app names (PhotoCraft, LightCraft, FilmCraft,+# DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft,+# SoundCraft, FigCraft), "GitHub", "Discord", "Finder", "makers".+# Trailing "…" (U+2026) must be preserved. Placeholders must appear in the translation:+# {ago}, {a}, {b}, {count}, {date}, {day}, {done}, {e}, {f}, {installed}, {latest}, {min},+# {month}, {name}, {n}, {os}, {platform}, {sources}, {total}, {version}, {v}, {year}.++	Launcher	Launcher+	Craft App Suite	Craft App Suite+	Open Source Tools for Creatives, Makers, and Builders	Open source-tools voor creatievelingen, makers en bouwers+	Settings	Instellingen+	Check for updates	Controleren op updates+	Grid	Raster+	Table	Tabel+	Show apps as cards	Apps als kaarten weergeven+	Show apps as a table	Apps als tabel weergeven+	All	Alle+	Updates	Updates+	Not installed	Niet geïnstalleerd+	Search apps	Apps zoeken+	Sort	Sorteren+	Suite order	Suitevolgorde+	Name	Naam+	Inspired by	Geïnspireerd door+	Status	Status+	Installed version	Geïnstalleerde versie+	Latest version	Nieuwste versie+	Newest release	Nieuwste release+	Discord	Discord+	GitHub	GitHub+	Website	Website+	Classic apps	Klassieke apps+	Classic	Klassiek+	New apps	Nieuwe apps+	NEW	NIEUW+	Install	Installeren+	Update to {v}	Bijwerken naar {v}+	Open	Openen+	Download for {os}	Downloaden voor {os}+	Download	Downloaden+	Coming soon	Binnenkort beschikbaar+	Checking…	Controleren…+	Not available	Niet beschikbaar+	Offline	Offline+	Downloading {done} of {total}	Downloaden: {done} van {total}+	Downloading…	Downloaden…+	Reconnecting…	Opnieuw verbinden…+	Verifying…	Verifiëren…+	Installing, then restarting…	Installeren en daarna opnieuw opstarten…+	Installing…	Installeren…+	Removing…	Verwijderen…+	Pause download	Download pauzeren+	Cancel download	Download annuleren+	Resume download	Download hervatten+	Discard download	Download weggooien+	Release notes	Releaseopmerkingen+	Show in Finder	In Finder tonen+	Show in Explorer	In Verkenner tonen+	Show in Files	In Bestanden tonen+	Reinstall	Opnieuw installeren+	Uninstall…	Verwijderen…+	All releases	Alle releases+	ArtCraft Launcher {version} is available.	ArtCraft Launcher {version} is beschikbaar.+	Dismiss	Negeren+	Update and restart	Bijwerken en opnieuw opstarten+	A new version is available. Would you like to relaunch with the updated version?	Er is een nieuwe versie beschikbaar. Wil je opnieuw opstarten met de bijgewerkte versie?+	Later	Later+	What's new	Wat is er nieuw+	No notes were published with this release.	Bij deze release zijn geen opmerkingen gepubliceerd.+	Released {date}	Uitgebracht op {date}+	Open on GitHub	Openen op GitHub+	Close	Sluiten+	ArtCraft Launcher {version}	ArtCraft Launcher {version}+	Only when I ask	Alleen als ik het vraag+	Automatically download and install updates	Updates automatisch downloaden en installeren+	Notify me when an installed app has an update	Me laten weten wanneer een geïnstalleerde app een update heeft+	Include pre-releases (betas and release candidates)	Pre-releases opnemen (bèta's en release candidates)+	Installing on Linux	Installeren op Linux+	Install new apps as	Nieuwe apps installeren als+	System package (recommended)	Systeempakket (aanbevolen)+	Updates always use the format an app was installed with.	Updates gebruiken altijd de indeling waarmee een app is geïnstalleerd.+	Running in the background	Op de achtergrond uitvoeren+	Keep running in the tray when the window is closed	Actief blijven in het systeemvak wanneer het venster wordt gesloten+	Show the window on the current desktop	Het venster op het huidige bureaublad tonen+	Start ArtCraft Launcher when I log in	ArtCraft Launcher starten wanneer ik me aanmeld+	Community	Community+	Questions, ideas and news from the ArtCraft team	Vragen, ideeën en nieuws van het ArtCraft-team+	Appearance	Vormgeving+	Quit ArtCraft Launcher	ArtCraft Launcher afsluiten+	Done	Gereed+	Uninstall {name}?	{name} verwijderen?+	The app will be moved to the Trash. Your documents and settings stay.	De app wordt verplaatst naar de prullenbak. Je documenten en instellingen blijven staan.+	Windows will remove it like any installed program. Your documents and settings stay.	Windows verwijdert de app zoals elk geïnstalleerd programma. Je documenten en instellingen blijven staan.+	Your system's package manager will remove it, and may ask for your password. Your documents and settings stay.	De pakketbeheerder van je systeem verwijdert de app en kan om je wachtwoord vragen. Je documenten en instellingen blijven staan.+	The app will be removed. Your documents and settings stay.	De app wordt verwijderd. Je documenten en instellingen blijven staan.+	Uninstall	Verwijderen+	Cancel	Annuleren+	Checked {ago}	Gecontroleerd {ago}+	just now	zojuist+	yesterday	gisteren+	{month} {day}, {year}	{day} {month} {year}+	Automatically	Automatisch+	Every Craft app	Alle Craft-apps+	Apps on this computer	Apps op deze computer+	Installed apps with a newer version	Geïnstalleerde apps met een nieuwere versie+	Apps you can install	Apps die je kunt installeren+	Hide App	App verbergen+	Unhide App	App weer tonen+	Hidden Apps	Verborgen apps+	Apps you hid	Apps die je hebt verborgen+	Checked {ago} · using {sources}	Gecontroleerd {ago} · met {sources}+	{a} and {b}	{a} en {b}+	Join the Discord	Word lid van de Discord+	Learn more	Meer informatie+	Minimize	Minimaliseren+	Maximize	Maximaliseren+	Restore	Herstellen+	New	Nieuw+	OK	OK+	Open link	Koppeling openen+	Update	Bijwerken+	{name} icon	Pictogram van {name}+	Loading ArtCraft Launcher…	ArtCraft Launcher wordt geladen…+	Cancel update	Update annuleren+	Stop waiting; the update can be started again later	Stoppen met wachten; de update kan later opnieuw worden gestart+	Download again	Opnieuw downloaden+	Install cancelled	Installatie geannuleerd+	Install cancelled. The download is kept for the next try.	Installatie geannuleerd. De download wordt bewaard voor de volgende poging.+	Update cancelled	Update geannuleerd+	Uninstall cancelled	Verwijderen geannuleerd+	Retry install	Installatie opnieuw proberen+	Retry update to {version}	Bijwerken naar {version} opnieuw proberen+	The download is still here. It's checked again, then installed.	De download is er nog. Deze wordt opnieuw gecontroleerd en daarna geïnstalleerd.+	Waiting for another app…	Wachten op een andere app…+	Waiting for other installs…	Wachten op andere installaties…+	Installer (.msi)	Installatieprogramma (.msi)+	Portable (.zip)	Portable (.zip)+	Disk image (.dmg)	Schijfkopie (.dmg)+	Debian package (.deb)	Debian-pakket (.deb)+	RPM package (.rpm)	RPM-pakket (.rpm)+	Flatpak bundle	Flatpak-bundel+	Tarball (.tar.gz)	Tar-archief (.tar.gz)+photocraft	Image editing	Beeldbewerking+vectorcraft	Vector illustration	Vectorillustraties+filmcraft	Video editing, color and sound	Videobewerking, kleur en geluid+lightcraft	Photo library and raw development	Fotobibliotheek en RAW-ontwikkeling+pdfcraft	Reading, organizing and protecting PDFs	Pdf's lezen, organiseren en beveiligen+effectcraft	Motion graphics and visual effects	Motion graphics en visuele effecten+designcraft	Page layout and publishing	Pagina's opmaken en publiceren+wordcraft	Writing and document design	Schrijven en documentontwerp+deckcraft	Presentations and slide shows	Presentaties en diavoorstellingen+gridcraft	Spreadsheets and data	Spreadsheets en data+cadcraft	Computer-aided design and drafting	CAD: ontwerpen en technisch tekenen+soundcraft	Recording, editing and mixing audio	Audio opnemen, bewerken en mixen+figcraft	Interface design and prototyping	Interfaceontwerp en prototyping+month	Jan	jan+month	Feb	feb+month	Mar	mrt+month	Apr	apr+month	May	mei+month	Jun	jun+month	Jul	jul+month	Aug	aug+month	Sep	sep+month	Oct	okt+month	Nov	nov+month	Dec	dec+	Not checked yet	Nog niet gecontroleerd+	GitHub's hourly limit was reached; full details return in {min} min	Het uurlimiet van GitHub is bereikt; volledige details zijn over {min} min weer beschikbaar+	GitHub limit hit; back in {min} min	GitHub-limiet bereikt; over {min} min weer beschikbaar+	Installing for {platform}	Installeren voor {platform}+	Downloads for {platform}	Downloads voor {platform}+	No downloads for this system	Geen downloads voor dit systeem+	Join the ArtCraft community on Discord	Word lid van de ArtCraft-community op Discord+	ArtCraft on {name}	ArtCraft op {name}+	Couldn't open {name}: {e}	Kon {name} niet openen: {e}+	Download cancelled	Download geannuleerd+	Available to install	Beschikbaar om te installeren+	Available	Beschikbaar+	Installed · up to date	Geïnstalleerd · up-to-date+	Update available	Update beschikbaar+	Installed	Geïnstalleerd+	installed	geïnstalleerd+	Not available here	Hier niet beschikbaar+	Updating…	Bijwerken…+	Update paused	Update gepauzeerd+	Download paused	Download gepauzeerd+	{version} installed → {latest} released	{version} geïnstalleerd → {latest} uitgebracht+	Version {version}	Versie {version}+	{installed} installed · latest {latest}	{installed} geïnstalleerd · nieuwste {latest}+	Installed · latest {latest}	Geïnstalleerd · nieuwste {latest}+	Version {version} installed	Versie {version} geïnstalleerd+	Version {latest}	Versie {latest}+	No release published yet	Nog geen release gepubliceerd+	ArtCraft Launcher	ArtCraft Launcher+	App	App+	Latest	Nieuwste+	Released	Uitgebracht+	Auto	Automatisch+	Language	Taal+	Ascending	Oplopend+	Descending	Aflopend+	Click to reverse the order	Klik om de volgorde om te draaien+	Click to sort by this column	Klik om op deze kolom te sorteren+	Like {name}	Zoals {name}+	{done} of {total}	{done} van {total}+	Downloading	Downloaden+	Verifying checksum…	Controlesom verifiëren…+	Resume	Hervatten+	{done} of {total} downloaded	{done} van {total} gedownload+	{done} downloaded	{done} gedownload+	Checking for updates…	Controleren op updates…+	Downloads the new version, replaces this one and opens it again	Downloadt de nieuwe versie, vervangt de huidige en opent de app opnieuw+	Couldn't check for updates: {f}	Kon niet controleren op updates: {f}+	Website (coming soon)	Website (binnenkort beschikbaar)+	GitHub repository	GitHub-repository+	ArtCraft	ArtCraft+	Update 1 app	1 app bijwerken+	Update all ({count})	Alles bijwerken ({count})+	⊞  Grid	⊞  Raster+	☰  Table	☰  Tabel+	🔍  Search apps	🔍  Apps zoeken+	{name} {version}	{name} {version}+	Match system	Systeem volgen+	Dark	Donker+	Light	Licht+	Full changelog	Volledig wijzigingslogboek+	link	koppeling+	No apps match	Geen apps gevonden+	Open ArtCraft Launcher to update.	Open ArtCraft Launcher om bij te werken.+	{name} {v} is available	{name} {v} is beschikbaar+	{count} updates are available	Er zijn {count} updates beschikbaar+	These notes weren't fetched (GitHub's request limit was reached). They're on the release page.	Deze opmerkingen zijn niet opgehaald (de aanvraaglimiet van GitHub is bereikt). Ze staan op de releasepagina.+	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.	Als dit aan staat, wordt het venster van de launcher naar het bureaublad gebracht waar je je bevindt als je de launcher vanuit de menubalk opent. Als dit uit staat, schakelt macOS je over naar het bureaublad waar het venster zich bevond.+	Couldn't change the login item: {e}	Kon het inlogitem niet wijzigen: {e}+column	App	App+column	Installed	Geïnstalleerd+column	Latest	Nieuwste+column	Released	Uitgebracht+filter	Installed	Geïnstalleerd+	App details	Details van de app+	Close (Esc)	Sluiten (Esc)+	Features	Functies+	Latest release	Nieuwste release+	Version	Versie+	Platforms	Platformen+	Releases	Releases+	Enlarge picture	Afbeelding vergroten+	Click to enlarge	Klik om te vergroten+	Previous picture (←)	Vorige afbeelding (←)+	Next picture (→)	Volgende afbeelding (→)+	Loading pictures…	Afbeeldingen worden geladen…+	Pictures couldn't be loaded. Reopen this page to try again.	De afbeeldingen konden niet worden geladen. Open deze pagina opnieuw om het nog eens te proberen.+	{name} details	Details van {name}+@plural	{n} app|{n} apps	{n} app|{n} apps+@plural	{n} min ago|{n} min ago	{n} min geleden|{n} min geleden+@plural	{n} h ago|{n} h ago	{n} uur geleden|{n} uur geleden+@plural	{n} day ago|{n} days ago	{n} dag geleden|{n} dagen geleden+@msg	Couldn't open {name}: {e}	Kon {name} niet openen: {e}+@msg	Download cancelled	Download geannuleerd+@msg	{name} updated to {version}	{name} bijgewerkt naar {version}+@msg	{name} installed: {version}	{name} geïnstalleerd: {version}+@msg	{name} updated to {version} (this release publishes no checksum, so only its size was checked)	{name} bijgewerkt naar {version} (deze release publiceert geen controlesom, dus alleen de grootte is gecontroleerd)+@msg	{name} installed: {version} (this release publishes no checksum, so only its size was checked)	{name} geïnstalleerd: {version} (deze release publiceert geen controlesom, dus alleen de grootte is gecontroleerd)+@msg	{name} was removed	{name} is verwijderd+@msg	{name} is running. Quit it, then try again.	{name} is actief. Sluit de app af en probeer het opnieuw.+@id	app.install	Installeren+@id	app.update	Bijwerken naar {v}+@id	app.open	Openen+@id	app.download	Downloaden voor {os}+@id	app.reveal	In Finder tonen+@id	app.reinstall	Opnieuw installeren+@id	app.uninstall	Verwijderen…+@id	app.notes	Releaseopmerkingen+@id	app.website	Website+@id	app.github	GitHub-repository+@id	app.releases	Alle releases+@id	launcher.update	Bijwerken en opnieuw opstarten+@id	launcher.download	Downloaden+@id	launcher.notes	Wat is er nieuw+@id	launcher.dismiss	Negeren+@id	settings.open	Instellingen+@id	settings.quit	ArtCraft Launcher afsluiten+@id	view.grid	Raster+@id	view.table	Tabel+@id	filter.all	Alle+@id	filter.installed	Geïnstalleerd+@id	filter.updates	Updates+@id	filter.notinstalled	Niet geïnstalleerd+@id	sort.suite	Suitevolgorde+@id	sort.name	Naam+@id	sort.inspired	Geïnspireerd door+@id	sort.status	Status+@id	sort.installed	Geïnstalleerde versie+@id	sort.latest	Nieuwste versie+@id	sort.released	Nieuwste release+@id	help.discord	Discord+@id	help.github	GitHub+@id	help.website	Website+@id	update.check	Controleren op updates+@id	update.check_auto	Automatisch controleren op updates+@id	update.notify	Me laten weten wanneer een geïnstalleerde app een update heeft+@id	update.prereleases	Pre-releases opnemen (bèta's en release candidates)+@id	linux.preferred_kind	Nieuwe apps installeren als+@id	tray.close_to_tray	Actief blijven in het systeemvak wanneer het venster wordt gesloten+@id	tray.show_on_current_desktop	Het venster op het huidige bureaublad tonen+@id	tray.login_item	ArtCraft Launcher starten wanneer ik me aanmeld+@id	appearance.theme	Vormgeving+	Show ArtCraft Launcher	ArtCraft Launcher tonen+	Check for Updates	Controleren op updates+	Visit getartcraft.com	getartcraft.com bezoeken+	ArtCraft on GitHub	ArtCraft op GitHub+	Join the ArtCraft Discord	Word lid van de ArtCraft Discord+@plural	ArtCraft Launcher · {n} update available|ArtCraft Launcher · {n} updates available	ArtCraft Launcher · {n} update beschikbaar|ArtCraft Launcher · {n} updates beschikbaardiff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv--- a/crates/ui-egui/src/i18n/ru.tsv+++ b/crates/ui-egui/src/i18n/ru.tsv@@ -129,6 +129,11 @@ 	Maximize	Развернуть 	Restore	Восстановить 	New	Новое+	Classic	Классическое+	Inspired by	Вдохновлено+	Like {name}	Как {name}+	Website (coming soon)	Веб-сайт (появится скоро)+@id	sort.inspired	По вдохновению 	OK	ОК 	Open link	Открыть ссылку 	Update	Обновитьdiff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsvnew file mode 100644--- /dev/null+++ b/crates/ui-egui/src/i18n/sv.tsv@@ -0,0 +1,328 @@+# Swedish (sv) catalog for ArtCraft Launcher.+# Format: context<TAB>source<TAB>translation+# Empty context = plain UI string (tl!, t).+# @id = command-id keyed (tr_id).+# @plural = plural forms: one|other (only 1 is "one" in Swedish).+# @msg = status/error message template (message, msg).+# Other context = disambiguation for tr_ctx.+#+# Clean-room: written from the meaning of ArtCraft Launcher's English labels, in standard+# Swedish following the wording conventions of Swedish software UIs (the interface addresses+# the user as "du").+#+# Coverage: the whole interface: every menu string and tl! literal (complete_menus = true).+# Left in English on purpose: product name "ArtCraft Launcher" (and its "Launcher" tag), suite+# name "Craft App Suite", app names (PhotoCraft, LightCraft, FilmCraft,+# DesignCraft, VectorCraft, PdfCraft, EffectCraft, WordCraft, DeckCraft, GridCraft, CADCraft,+# SoundCraft, FigCraft), "GitHub", "Discord", "Finder", "makers".+# Trailing "…" (U+2026) must be preserved. Placeholders must appear in the translation:+# {ago}, {a}, {b}, {count}, {date}, {day}, {done}, {e}, {f}, {installed}, {latest}, {min},+# {month}, {name}, {n}, {os}, {platform}, {sources}, {total}, {version}, {v}, {year}.++	Launcher	Launcher+	Craft App Suite	Craft App Suite+	Open Source Tools for Creatives, Makers, and Builders	Verktyg med öppen källkod för kreatörer, makers och byggare+	Settings	Inställningar+	Check for updates	Sök efter uppdateringar+	Grid	Rutnät+	Table	Tabell+	Show apps as cards	Visa appar som kort+	Show apps as a table	Visa appar som en tabell+	All	Alla+	Updates	Uppdateringar+	Not installed	Inte installerade+	Search apps	Sök bland appar+	Sort	Sortera+	Suite order	Svitordning+	Name	Namn+	Inspired by	Inspiration från+	Status	Status+	Installed version	Installerad version+	Latest version	Senaste version+	Newest release	Senaste utgåva+	Discord	Discord+	GitHub	GitHub+	Website	Webbplats+	Classic apps	Klassiska appar+	Classic	Klassisk+	New apps	Nya appar+	NEW	NY+	Install	Installera+	Update to {v}	Uppdatera till {v}+	Open	Öppna+	Download for {os}	Hämta för {os}+	Download	Hämta+	Coming soon	Kommer snart+	Checking…	Kontrollerar…+	Not available	Inte tillgänglig+	Offline	Offline+	Downloading {done} of {total}	Hämtar {done} av {total}+	Downloading…	Hämtar…+	Reconnecting…	Ansluter igen…+	Verifying…	Verifierar…+	Installing, then restarting…	Installerar och startar om…+	Installing…	Installerar…+	Removing…	Tar bort…+	Pause download	Pausa hämtningen+	Cancel download	Avbryt hämtningen+	Resume download	Återuppta hämtningen+	Discard download	Radera hämtningen+	Release notes	Versionsfakta+	Show in Finder	Visa i Finder+	Show in Explorer	Visa i Utforskaren+	Show in Files	Visa i Filer+	Reinstall	Installera om+	Uninstall…	Avinstallera…+	All releases	Alla utgåvor+	ArtCraft Launcher {version} is available.	ArtCraft Launcher {version} är tillgänglig.+	Dismiss	Ignorera+	Update and restart	Uppdatera och starta om+	A new version is available. Would you like to relaunch with the updated version?	En ny version finns tillgänglig. Vill du starta om med den uppdaterade versionen?+	Later	Senare+	What's new	Nyheter+	No notes were published with this release.	Den här utgåvan publicerades utan versionsfakta.+	Released {date}	Utgiven {date}+	Open on GitHub	Öppna på GitHub+	Close	Stäng+	ArtCraft Launcher {version}	ArtCraft Launcher {version}+	Only when I ask	Endast när jag ber om det+	Automatically download and install updates	Hämta och installera uppdateringar automatiskt+	Notify me when an installed app has an update	Meddela mig när en installerad app har en uppdatering+	Include pre-releases (betas and release candidates)	Inkludera förhandsversioner (betaversioner och kandidatutgåvor)+	Installing on Linux	Installation på Linux+	Install new apps as	Installera nya appar som+	System package (recommended)	Systempaket (rekommenderas)+	Updates always use the format an app was installed with.	Uppdateringar använder alltid det format appen installerades med.+	Running in the background	Kör i bakgrunden+	Keep running in the tray when the window is closed	Fortsätt köras i systemfältet när fönstret stängs+	Show the window on the current desktop	Visa fönstret på det aktuella skrivbordet+	Start ArtCraft Launcher when I log in	Starta ArtCraft Launcher när jag loggar in+	Community	Community+	Questions, ideas and news from the ArtCraft team	Frågor, idéer och nyheter från ArtCraft-teamet+	Appearance	Utseende+	Quit ArtCraft Launcher	Avsluta ArtCraft Launcher+	Done	Klar+	Uninstall {name}?	Avinstallera {name}?+	The app will be moved to the Trash. Your documents and settings stay.	Appen flyttas till papperskorgen. Dina dokument och inställningar finns kvar.+	Windows will remove it like any installed program. Your documents and settings stay.	Windows tar bort den som ett vanligt installerat program. Dina dokument och inställningar finns kvar.+	Your system's package manager will remove it, and may ask for your password. Your documents and settings stay.	Systemets pakethanterare tar bort den och kan be om ditt lösenord. Dina dokument och inställningar finns kvar.+	The app will be removed. Your documents and settings stay.	Appen tas bort. Dina dokument och inställningar finns kvar.+	Uninstall	Avinstallera+	Cancel	Avbryt+	Checked {ago}	Kontrollerad {ago}+	just now	just nu+	yesterday	igår+	{month} {day}, {year}	{day} {month} {year}+	Automatically	Automatiskt+	Every Craft app	Alla Craft-appar+	Apps on this computer	Appar på den här datorn+	Installed apps with a newer version	Installerade appar med nyare version+	Apps you can install	Appar du kan installera+	Hide App	Dölj app+	Unhide App	Visa app+	Hidden Apps	Dolda appar+	Apps you hid	Appar du har dolt+	Checked {ago} · using {sources}	Kontrollerad {ago} · med {sources}+	{a} and {b}	{a} och {b}+	Join the Discord	Gå med i Discord+	Learn more	Läs mer+	Minimize	Minimera+	Maximize	Maximera+	Restore	Återställ+	New	Ny+	OK	OK+	Open link	Öppna länk+	Update	Uppdatera+	{name} icon	{name}-ikon+	Loading ArtCraft Launcher…	Laddar ArtCraft Launcher…+	Cancel update	Avbryt uppdateringen+	Stop waiting; the update can be started again later	Sluta vänta; uppdateringen kan startas igen senare+	Download again	Hämta igen+	Install cancelled	Installationen avbröts+	Install cancelled. The download is kept for the next try.	Installationen avbröts. Hämtningen sparas till nästa försök.+	Update cancelled	Uppdateringen avbröts+	Uninstall cancelled	Avinstallationen avbröts+	Retry install	Försök installera igen+	Retry update to {version}	Försök uppdatera till {version} igen+	The download is still here. It's checked again, then installed.	Hämtningen finns kvar. Den kontrolleras igen och installeras sedan.+	Waiting for another app…	Väntar på en annan app…+	Waiting for other installs…	Väntar på andra installationer…+	Installer (.msi)	Installationsprogram (.msi)+	Portable (.zip)	Portabel (.zip)+	Disk image (.dmg)	Diskavbildning (.dmg)+	Debian package (.deb)	Debian-paket (.deb)+	RPM package (.rpm)	RPM-paket (.rpm)+	Flatpak bundle	Flatpak-paket+	Tarball (.tar.gz)	Tar-arkiv (.tar.gz)+photocraft	Image editing	Bildredigering+vectorcraft	Vector illustration	Vektorillustration+filmcraft	Video editing, color and sound	Videoredigering, färg och ljud+lightcraft	Photo library and raw development	Bildbibliotek och utveckling av raw-filer+pdfcraft	Reading, organizing and protecting PDFs	Läsa, organisera och skydda PDF-filer+effectcraft	Motion graphics and visual effects	Rörlig grafik och visuella effekter+designcraft	Page layout and publishing	Layout och publicering+wordcraft	Writing and document design	Skrivande och dokumentformgivning+deckcraft	Presentations and slide shows	Presentationer och bildspel+gridcraft	Spreadsheets and data	Kalkylblad och data+cadcraft	Computer-aided design and drafting	Datorstödd konstruktion och ritning+soundcraft	Recording, editing and mixing audio	Inspelning, redigering och mixning av ljud+figcraft	Interface design and prototyping	Gränssnittsdesign och prototypning+month	Jan	jan+month	Feb	feb+month	Mar	mar+month	Apr	apr+month	May	maj+month	Jun	jun+month	Jul	jul+month	Aug	aug+month	Sep	sep+month	Oct	okt+month	Nov	nov+month	Dec	dec+	Not checked yet	Inte kontrollerad ännu+	GitHub's hourly limit was reached; full details return in {min} min	GitHubs gräns per timme har nåtts; all information är tillbaka om {min} min+	GitHub limit hit; back in {min} min	GitHub-gränsen har nåtts; tillbaka om {min} min+	Installing for {platform}	Installerar för {platform}+	Downloads for {platform}	Hämtningar för {platform}+	No downloads for this system	Inga hämtningar för det här systemet+	Join the ArtCraft community on Discord	Gå med i ArtCraft-communityn på Discord+	ArtCraft on {name}	ArtCraft på {name}+	Couldn't open {name}: {e}	Kunde inte öppna {name}: {e}+	Download cancelled	Hämtningen avbröts+	Available to install	Kan installeras+	Available	Tillgänglig+	Installed · up to date	Installerad · aktuell+	Update available	Uppdatering tillgänglig+	Installed	Installerad+	installed	installerad+	Not available here	Inte tillgänglig här+	Updating…	Uppdaterar…+	Update paused	Uppdateringen pausad+	Download paused	Hämtningen pausad+	{version} installed → {latest} released	{version} installerad → {latest} utgiven+	Version {version}	Version {version}+	{installed} installed · latest {latest}	{installed} installerade · senaste {latest}+	Installed · latest {latest}	Installerad · senaste {latest}+	Version {version} installed	Version {version} installerad+	Version {latest}	Version {latest}+	No release published yet	Ingen utgåva publicerad än+	ArtCraft Launcher	ArtCraft Launcher+	App	App+	Latest	Senaste+	Released	Utgiven+	Auto	Automatiskt+	Language	Språk+	Ascending	Stigande+	Descending	Fallande+	Click to reverse the order	Klicka för att vända ordningen+	Click to sort by this column	Klicka för att sortera efter den här kolumnen+	Like {name}	Liknar {name}+	{done} of {total}	{done} av {total}+	Downloading	Hämtar+	Verifying checksum…	Verifierar kontrollsumma…+	Resume	Återuppta+	{done} of {total} downloaded	{done} av {total} hämtat+	{done} downloaded	{done} hämtat+	Checking for updates…	Söker efter uppdateringar…+	Downloads the new version, replaces this one and opens it again	Hämtar den nya versionen, ersätter den här och öppnar den igen+	Couldn't check for updates: {f}	Kunde inte söka efter uppdateringar: {f}+	Website (coming soon)	Webbplats (kommer snart)+	GitHub repository	GitHub-arkiv+	ArtCraft	ArtCraft+	Update 1 app	Uppdatera 1 app+	Update all ({count})	Uppdatera alla ({count})+	⊞  Grid	⊞  Rutnät+	☰  Table	☰  Tabell+	🔍  Search apps	🔍  Sök bland appar+	{name} {version}	{name} {version}+	Match system	Följ systemet+	Dark	Mörkt+	Light	Ljust+	Full changelog	Fullständig ändringslogg+	link	länk+	No apps match	Inga appar matchar+	Open ArtCraft Launcher to update.	Öppna ArtCraft Launcher för att uppdatera.+	{name} {v} is available	{name} {v} är tillgänglig+	{count} updates are available	Det finns {count} uppdateringar+	These notes weren't fetched (GitHub's request limit was reached). They're on the release page.	De här versionsfaktorna hämtades inte (GitHubs gräns för antal anrop har nåtts). De finns på utgåvans sida.+	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.	När den är aktiverad flyttas fönstret till skrivbordet du befinner dig på när du öppnar startprogrammet från menyraden. När den är inaktiverad växlar macOS till skrivbordet där fönstret befann sig.+	Couldn't change the login item: {e}	Kunde inte ändra inloggningsobjektet: {e}+column	App	App+column	Installed	Installerad+column	Latest	Senaste+column	Released	Utgiven+filter	Installed	Installerade+	App details	Appinformation+	Close (Esc)	Stäng (Esc)+	Features	Funktioner+	Latest release	Senaste utgåvan+	Version	Version+	Platforms	Plattformar+	Releases	Utgåvor+	Enlarge picture	Förstora bild+	Click to enlarge	Klicka för att förstora+	Previous picture (←)	Föregående bild (←)+	Next picture (→)	Nästa bild (→)+	Loading pictures…	Laddar bilder…+	Pictures couldn't be loaded. Reopen this page to try again.	Bilderna kunde inte laddas. Öppna sidan igen och försök en gång till.+	{name} details	Information om {name}+@plural	{n} app|{n} apps	{n} app|{n} appar+@plural	{n} min ago|{n} min ago	för {n} min sedan|för {n} min sedan+@plural	{n} h ago|{n} h ago	för {n} h sedan|för {n} h sedan+@plural	{n} day ago|{n} days ago	för {n} dag sedan|för {n} dagar sedan+@msg	Couldn't open {name}: {e}	Kunde inte öppna {name}: {e}+@msg	Download cancelled	Hämtningen avbröts+@msg	{name} updated to {version}	{name} har uppdaterats till {version}+@msg	{name} installed: {version}	{name} har installerats: {version}+@msg	{name} updated to {version} (this release publishes no checksum, so only its size was checked)	{name} har uppdaterats till {version} (den här utgåvan publicerar ingen kontrollsumma, så endast dess storlek kontrollerades)+@msg	{name} installed: {version} (this release publishes no checksum, so only its size was checked)	{name} har installerats: {version} (den här utgåvan publicerar ingen kontrollsumma, så endast dess storlek kontrollerades)+@msg	{name} was removed	{name} har tagits bort+@msg	{name} is running. Quit it, then try again.	{name} körs. Avsluta den och försök igen.+@id	app.install	Installera+@id	app.update	Uppdatera till {v}+@id	app.open	Öppna+@id	app.download	Hämta för {os}+@id	app.reveal	Visa i Finder+@id	app.reinstall	Installera om+@id	app.uninstall	Avinstallera…+@id	app.notes	Versionsfakta+@id	app.website	Webbplats+@id	app.github	GitHub-arkiv+@id	app.releases	Alla utgåvor+@id	launcher.update	Uppdatera och starta om+@id	launcher.download	Hämta+@id	launcher.notes	Nyheter+@id	launcher.dismiss	Ignorera+@id	settings.open	Inställningar+@id	settings.quit	Avsluta ArtCraft Launcher+@id	view.grid	Rutnät+@id	view.table	Tabell+@id	filter.all	Alla+@id	filter.installed	Installerade+@id	filter.updates	Uppdateringar+@id	filter.notinstalled	Inte installerade+@id	sort.suite	Svitordning+@id	sort.name	Namn+@id	sort.inspired	Inspiration från+@id	sort.status	Status+@id	sort.installed	Installerad version+@id	sort.latest	Senaste version+@id	sort.released	Senaste utgåva+@id	help.discord	Discord+@id	help.github	GitHub+@id	help.website	Webbplats+@id	update.check	Sök efter uppdateringar+@id	update.check_auto	Sök efter uppdateringar automatiskt+@id	update.notify	Meddela mig när en installerad app har en uppdatering+@id	update.prereleases	Inkludera förhandsversioner (betaversioner och kandidatutgåvor)+@id	linux.preferred_kind	Installera nya appar som+@id	tray.close_to_tray	Fortsätt köras i systemfältet när fönstret stängs+@id	tray.show_on_current_desktop	Visa fönstret på det aktuella skrivbordet+@id	tray.login_item	Starta ArtCraft Launcher när jag loggar in+@id	appearance.theme	Utseende+	Show ArtCraft Launcher	Visa ArtCraft Launcher+	Check for Updates	Sök efter uppdateringar+	Visit getartcraft.com	Besök getartcraft.com+	ArtCraft on GitHub	ArtCraft på GitHub+	Join the ArtCraft Discord	Gå med i ArtCrafts Discord+@plural	ArtCraft Launcher · {n} update available|ArtCraft Launcher · {n} updates available	ArtCraft Launcher · {n} uppdatering tillgänglig|ArtCraft Launcher · {n} uppdateringar tillgängligadiff --git a/crates/ui-egui/tests/danish.rs b/crates/ui-egui/tests/danish.rsnew file mode 100644--- /dev/null+++ b/crates/ui-egui/tests/danish.rs@@ -0,0 +1,129 @@+//! The Danish UI, in its own test binary: the UI language is process-wide, so it can't share one+//! with the English UI tests. `ARTCRAFT_LAUNCHER_SNAPSHOTS=<dir>` also saves screenshots (run with+//! `-- --test-threads=1`, see `ui.rs`).++use std::cell::Cell;+use std::rc::Rc;++use artcraft_launcher_core::protocol::{Backend, Capabilities, Command, Event, JobPhase, LatestRelease, Origin, Source};+use artcraft_launcher_core::release::{Asset, Release};+use artcraft_launcher_core::status::InstallSource;+use artcraft_launcher_core::{Arch, Installed, Os, Platform, SUITE, version};+use artcraft_launcher_ui_egui::settings::ViewMode;+use artcraft_launcher_ui_egui::{Host, LauncherUi, Settings};+use egui_kittest::Harness;+use egui_kittest::kittest::Queryable;++const NOW: i64 = 1_791_500_000;++struct Fake {+    events: Vec<Event>,+    clock: Rc<Cell<i64>>,+}++impl Backend for Fake {+    fn send(&mut self, _command: Command) {}+    fn poll(&mut self) -> Vec<Event> {+        std::mem::take(&mut self.events)+    }+    fn capabilities(&self) -> Capabilities {+        Capabilities { manage_apps: true, reveal_label: "Show in Finder", self_update: true }+    }+    fn platform(&self) -> Option<Platform> {+        Some(Platform { os: Os::MacOs, arch: Arch::Arm64 })+    }+    fn now(&self) -> i64 {+        self.clock.get()+    }+}++struct NoHost;+impl Host for NoHost {}++fn release(id: &str, v: &str, at: i64) -> Release {+    let name = format!("{id}-{v}-macos-universal.dmg");+    Release {+        tag: format!("v{v}"),+        version: version::parse(v),+        name: format!("v{v}"),+        published_at: Some(at),+        html_url: format!("https://github.com/storytold/{id}/releases/tag/v{v}"),+        notes: String::new(),+        prerelease: false,+        assets: vec![Asset {+            name: name.clone(),+            size: 150 << 20,+            url: format!("https://github.com/storytold/{id}/releases/download/v{v}/{name}"),+            sha256: None,+        }],+    }+}++fn events() -> Vec<Event> {+    let mut ev = Vec::new();+    for (i, app) in SUITE.iter().enumerate() {+        let latest = LatestRelease::Found(release(app.id, "0.5.0", NOW - 40 * 86_400 - i as i64 * 600));+        ev.push(Event::Latest { app: app.id.into(), latest, from: Origin::ArtCraftApi });+        let installed = matches!(app.id, "photocraft" | "lightcraft").then(|| Installed {+            version: version::parse(if app.id == "photocraft" { "0.4.1" } else { "0.5.0" }),+            source: InstallSource::MacApp,+            location: format!("/Applications/{}.app", app.name),+            package: None,+        });+        ev.push(Event::Detected { app: app.id.into(), installed });+    }+    ev.push(Event::Progress { app: "filmcraft".into(), phase: JobPhase::Verifying });+    ev.push(Event::CheckFinished { at: NOW - 180, source: Source::Feed, rate_limited_until: None });+    // A backend message, translated through its `@msg` template where it's shown.+    ev.push(Event::JobFinished { app: "lightcraft".into(), result: Ok("LightCraft updated to 0.5.0".into()) });+    ev+}++fn harness(view: ViewMode) -> Harness<'static, Option<LauncherUi>> {+    artcraft_launcher_ui_egui::i18n::set_test_lang(artcraft_launcher_ui_egui::i18n::Lang::EN);+    let mut backend = Some(Fake { events: events(), clock: Rc::new(Cell::new(NOW)) });+    let settings =+        Settings { view, notify: false, language: "da".into(), theme: artcraft_launcher_ui_egui::theme::ThemeChoice::Dark, ..Settings::default() };+    Harness::builder().with_size(egui::vec2(1180.0, 900.0)).with_theme(egui::Theme::Dark).build_ui_state(+        move |ui, state: &mut Option<LauncherUi>| {+            if state.is_none()+                && let Some(b) = backend.take()+            {+                *state = Some(LauncherUi::new(ui.ctx(), Box::new(b), settings.clone()));+            }+            if let Some(l) = state.as_mut() {+                l.logic(&ui.ctx().clone(), &mut NoHost);+                l.ui(ui, &mut NoHost);+            }+        },+        None,+    )+}++fn snapshot(h: &mut Harness<'_, Option<LauncherUi>>, name: &str) {+    let Some(dir) = std::env::var_os("ARTCRAFT_LAUNCHER_SNAPSHOTS") else { return };+    let img = h.render().unwrap();+    img.save(std::path::Path::new(&dir).join(format!("{name}.png"))).unwrap();+}++// One test: the UI language is process-wide.+#[test]+fn danish_ui_translates_labels_dates_and_messages() {+    let mut h = harness(ViewMode::Grid);+    h.run_steps(8);+    snapshot(&mut h, "grid-da-dark");+    // Product names stay in English.+    h.get_by_label("Launcher");+    h.get_by_label("Craft App Suite");+    h.get_by_label("Billedredigering");+    h.get_by_label("Opdatér til 0.5.0");+    h.get_by_label_contains("Verificerer kontrolsum…");+    h.get_by_label_contains("Tjekket for 3 min siden · via ArtCraft API");+    h.get_by_label("LightCraft opdateret til 0.5.0");++    let mut table = harness(ViewMode::Table);+    table.run_steps(8);+    snapshot(&mut table, "table-da-dark");+    table.get_by_label("Installeret");+    assert!(table.query_all_by_label_contains("aug 2026").count() >= 1);+}diff --git a/crates/ui-egui/tests/dutch.rs b/crates/ui-egui/tests/dutch.rsnew file mode 100644--- /dev/null+++ b/crates/ui-egui/tests/dutch.rs@@ -0,0 +1,129 @@+//! The Dutch UI, in its own test binary: the UI language is process-wide, so it can't share one+//! with the English UI tests. `ARTCRAFT_LAUNCHER_SNAPSHOTS=<dir>` also saves screenshots (run with+//! `-- --test-threads=1`, see `ui.rs`).++use std::cell::Cell;+use std::rc::Rc;++use artcraft_launcher_core::protocol::{Backend, Capabilities, Command, Event, JobPhase, LatestRelease, Origin, Source};+use artcraft_launcher_core::release::{Asset, Release};+use artcraft_launcher_core::status::InstallSource;+use artcraft_launcher_core::{Arch, Installed, Os, Platform, SUITE, version};+use artcraft_launcher_ui_egui::settings::ViewMode;+use artcraft_launcher_ui_egui::{Host, LauncherUi, Settings};+use egui_kittest::Harness;+use egui_kittest::kittest::Queryable;++const NOW: i64 = 1_791_500_000;++struct Fake {+    events: Vec<Event>,+    clock: Rc<Cell<i64>>,+}++impl Backend for Fake {+    fn send(&mut self, _command: Command) {}+    fn poll(&mut self) -> Vec<Event> {+        std::mem::take(&mut self.events)+    }+    fn capabilities(&self) -> Capabilities {+        Capabilities { manage_apps: true, reveal_label: "Show in Finder", self_update: true }+    }+    fn platform(&self) -> Option<Platform> {+        Some(Platform { os: Os::MacOs, arch: Arch::Arm64 })+    }+    fn now(&self) -> i64 {+        self.clock.get()+    }+}++struct NoHost;+impl Host for NoHost {}++fn release(id: &str, v: &str, at: i64) -> Release {+    let name = format!("{id}-{v}-macos-universal.dmg");+    Release {+        tag: format!("v{v}"),+        version: version::parse(v),+        name: format!("v{v}"),+        published_at: Some(at),+        html_url: format!("https://github.com/storytold/{id}/releases/tag/v{v}"),+        notes: String::new(),+        prerelease: false,+        assets: vec![Asset {+            name: name.clone(),+            size: 150 << 20,+            url: format!("https://github.com/storytold/{id}/releases/download/v{v}/{name}"),+            sha256: None,+        }],+    }+}++fn events() -> Vec<Event> {+    let mut ev = Vec::new();+    for (i, app) in SUITE.iter().enumerate() {+        let latest = LatestRelease::Found(release(app.id, "0.5.0", NOW - 40 * 86_400 - i as i64 * 600));+        ev.push(Event::Latest { app: app.id.into(), latest, from: Origin::ArtCraftApi });+        let installed = matches!(app.id, "photocraft" | "lightcraft").then(|| Installed {+            version: version::parse(if app.id == "photocraft" { "0.4.1" } else { "0.5.0" }),+            source: InstallSource::MacApp,+            location: format!("/Applications/{}.app", app.name),+            package: None,+        });+        ev.push(Event::Detected { app: app.id.into(), installed });+    }+    ev.push(Event::Progress { app: "filmcraft".into(), phase: JobPhase::Verifying });+    ev.push(Event::CheckFinished { at: NOW - 180, source: Source::Feed, rate_limited_until: None });+    // A backend message, translated through its `@msg` template where it's shown.+    ev.push(Event::JobFinished { app: "lightcraft".into(), result: Ok("LightCraft updated to 0.5.0".into()) });+    ev+}++fn harness(view: ViewMode) -> Harness<'static, Option<LauncherUi>> {+    artcraft_launcher_ui_egui::i18n::set_test_lang(artcraft_launcher_ui_egui::i18n::Lang::EN);+    let mut backend = Some(Fake { events: events(), clock: Rc::new(Cell::new(NOW)) });+    let settings =+        Settings { view, notify: false, language: "nl".into(), theme: artcraft_launcher_ui_egui::theme::ThemeChoice::Dark, ..Settings::default() };+    Harness::builder().with_size(egui::vec2(1180.0, 900.0)).with_theme(egui::Theme::Dark).build_ui_state(+        move |ui, state: &mut Option<LauncherUi>| {+            if state.is_none()+                && let Some(b) = backend.take()+            {+                *state = Some(LauncherUi::new(ui.ctx(), Box::new(b), settings.clone()));+            }+            if let Some(l) = state.as_mut() {+                l.logic(&ui.ctx().clone(), &mut NoHost);+                l.ui(ui, &mut NoHost);+            }+        },+        None,+    )+}++fn snapshot(h: &mut Harness<'_, Option<LauncherUi>>, name: &str) {+    let Some(dir) = std::env::var_os("ARTCRAFT_LAUNCHER_SNAPSHOTS") else { return };+    let img = h.render().unwrap();+    img.save(std::path::Path::new(&dir).join(format!("{name}.png"))).unwrap();+}++// One test: the UI language is process-wide.+#[test]+fn dutch_ui_translates_labels_dates_and_messages() {+    let mut h = harness(ViewMode::Grid);+    h.run_steps(8);+    snapshot(&mut h, "grid-nl-dark");+    // Product names stay in English.+    h.get_by_label("Launcher");+    h.get_by_label("Craft App Suite");+    h.get_by_label("Beeldbewerking");+    h.get_by_label("Bijwerken naar 0.5.0");+    h.get_by_label_contains("Controlesom verifiëren…");+    h.get_by_label_contains("Gecontroleerd 3 min geleden · met ArtCraft API");+    h.get_by_label("LightCraft bijgewerkt naar 0.5.0");++    let mut table = harness(ViewMode::Table);+    table.run_steps(8);+    snapshot(&mut table, "table-nl-dark");+    table.get_by_label("Geïnstalleerd");+    assert!(table.query_all_by_label_contains("aug 2026").count() >= 1);+}diff --git a/crates/ui-egui/tests/finnish.rs b/crates/ui-egui/tests/finnish.rsnew file mode 100644--- /dev/null+++ b/crates/ui-egui/tests/finnish.rs@@ -0,0 +1,129 @@+//! The Finnish UI, in its own test binary: the UI language is process-wide, so it can't share one+//! with the English UI tests. `ARTCRAFT_LAUNCHER_SNAPSHOTS=<dir>` also saves screenshots (run with+//! `-- --test-threads=1`, see `ui.rs`).++use std::cell::Cell;+use std::rc::Rc;++use artcraft_launcher_core::protocol::{Backend, Capabilities, Command, Event, JobPhase, LatestRelease, Origin, Source};+use artcraft_launcher_core::release::{Asset, Release};+use artcraft_launcher_core::status::InstallSource;+use artcraft_launcher_core::{Arch, Installed, Os, Platform, SUITE, version};+use artcraft_launcher_ui_egui::settings::ViewMode;+use artcraft_launcher_ui_egui::{Host, LauncherUi, Settings};+use egui_kittest::Harness;+use egui_kittest::kittest::Queryable;++const NOW: i64 = 1_791_500_000;++struct Fake {+    events: Vec<Event>,+    clock: Rc<Cell<i64>>,+}++impl Backend for Fake {+    fn send(&mut self, _command: Command) {}+    fn poll(&mut self) -> Vec<Event> {+        std::mem::take(&mut self.events)+    }+    fn capabilities(&self) -> Capabilities {+        Capabilities { manage_apps: true, reveal_label: "Show in Finder", self_update: true }+    }+    fn platform(&self) -> Option<Platform> {+        Some(Platform { os: Os::MacOs, arch: Arch::Arm64 })+    }+    fn now(&self) -> i64 {+        self.clock.get()+    }+}++struct NoHost;+impl Host for NoHost {}++fn release(id: &str, v: &str, at: i64) -> Release {+    let name = format!("{id}-{v}-macos-universal.dmg");+    Release {+        tag: format!("v{v}"),+        version: version::parse(v),+        name: format!("v{v}"),+        published_at: Some(at),+        html_url: format!("https://github.com/storytold/{id}/releases/tag/v{v}"),+        notes: String::new(),+        prerelease: false,+        assets: vec![Asset {+            name: name.clone(),+            size: 150 << 20,+            url: format!("https://github.com/storytold/{id}/releases/download/v{v}/{name}"),+            sha256: None,+        }],+    }+}++fn events() -> Vec<Event> {+    let mut ev = Vec::new();+    for (i, app) in SUITE.iter().enumerate() {+        let latest = LatestRelease::Found(release(app.id, "0.5.0", NOW - 40 * 86_400 - i as i64 * 600));+        ev.push(Event::Latest { app: app.id.into(), latest, from: Origin::ArtCraftApi });+        let installed = matches!(app.id, "photocraft" | "lightcraft").then(|| Installed {+            version: version::parse(if app.id == "photocraft" { "0.4.1" } else { "0.5.0" }),+            source: InstallSource::MacApp,+            location: format!("/Applications/{}.app", app.name),+            package: None,+        });+        ev.push(Event::Detected { app: app.id.into(), installed });+    }+    ev.push(Event::Progress { app: "filmcraft".into(), phase: JobPhase::Verifying });+    ev.push(Event::CheckFinished { at: NOW - 180, source: Source::Feed, rate_limited_until: None });+    // A backend message, translated through its `@msg` template where it's shown.+    ev.push(Event::JobFinished { app: "lightcraft".into(), result: Ok("LightCraft updated to 0.5.0".into()) });+    ev+}++fn harness(view: ViewMode) -> Harness<'static, Option<LauncherUi>> {+    artcraft_launcher_ui_egui::i18n::set_test_lang(artcraft_launcher_ui_egui::i18n::Lang::EN);+    let mut backend = Some(Fake { events: events(), clock: Rc::new(Cell::new(NOW)) });+    let settings =+        Settings { view, notify: false, language: "fi".into(), theme: artcraft_launcher_ui_egui::theme::ThemeChoice::Dark, ..Settings::default() };+    Harness::builder().with_size(egui::vec2(1180.0, 900.0)).with_theme(egui::Theme::Dark).build_ui_state(+        move |ui, state: &mut Option<LauncherUi>| {+            if state.is_none()+                && let Some(b) = backend.take()+            {+                *state = Some(LauncherUi::new(ui.ctx(), Box::new(b), settings.clone()));+            }+            if let Some(l) = state.as_mut() {+                l.logic(&ui.ctx().clone(), &mut NoHost);+                l.ui(ui, &mut NoHost);+            }+        },+        None,+    )+}++fn snapshot(h: &mut Harness<'_, Option<LauncherUi>>, name: &str) {+    let Some(dir) = std::env::var_os("ARTCRAFT_LAUNCHER_SNAPSHOTS") else { return };+    let img = h.render().unwrap();+    img.save(std::path::Path::new(&dir).join(format!("{name}.png"))).unwrap();+}++// One test: the UI language is process-wide.+#[test]+fn finnish_ui_translates_labels_dates_and_messages() {+    let mut h = harness(ViewMode::Grid);+    h.run_steps(8);+    snapshot(&mut h, "grid-fi-dark");+    // Product names stay in English.+    h.get_by_label("Launcher");+    h.get_by_label("Craft App Suite");+    h.get_by_label("Kuvankäsittely");+    h.get_by_label("Päivitä versioon 0.5.0");+    h.get_by_label_contains("Varmistetaan tarkistussummaa…");+    h.get_by_label_contains("Tarkistettu 3 min sitten · lähteinä ArtCraft API");+    h.get_by_label("LightCraft päivitettiin versioon 0.5.0");++    let mut table = harness(ViewMode::Table);+    table.run_steps(8);+    snapshot(&mut table, "table-fi-dark");+    table.get_by_label("Asennettu");+    assert!(table.query_all_by_label_contains("elo 2026").count() >= 1);+}diff --git a/crates/ui-egui/tests/swedish.rs b/crates/ui-egui/tests/swedish.rsnew file mode 100644--- /dev/null+++ b/crates/ui-egui/tests/swedish.rs@@ -0,0 +1,129 @@+//! The Swedish UI, in its own test binary: the UI language is process-wide, so it can't share one+//! with the English UI tests. `ARTCRAFT_LAUNCHER_SNAPSHOTS=<dir>` also saves screenshots (run with+//! `-- --test-threads=1`, see `ui.rs`).++use std::cell::Cell;+use std::rc::Rc;++use artcraft_launcher_core::protocol::{Backend, Capabilities, Command, Event, JobPhase, LatestRelease, Origin, Source};+use artcraft_launcher_core::release::{Asset, Release};+use artcraft_launcher_core::status::InstallSource;+use artcraft_launcher_core::{Arch, Installed, Os, Platform, SUITE, version};+use artcraft_launcher_ui_egui::settings::ViewMode;+use artcraft_launcher_ui_egui::{Host, LauncherUi, Settings};+use egui_kittest::Harness;+use egui_kittest::kittest::Queryable;++const NOW: i64 = 1_791_500_000;++struct Fake {+    events: Vec<Event>,+    clock: Rc<Cell<i64>>,+}++impl Backend for Fake {+    fn send(&mut self, _command: Command) {}+    fn poll(&mut self) -> Vec<Event> {+        std::mem::take(&mut self.events)+    }+    fn capabilities(&self) -> Capabilities {+        Capabilities { manage_apps: true, reveal_label: "Show in Finder", self_update: true }+    }+    fn platform(&self) -> Option<Platform> {+        Some(Platform { os: Os::MacOs, arch: Arch::Arm64 })+    }+    fn now(&self) -> i64 {+        self.clock.get()+    }+}++struct NoHost;+impl Host for NoHost {}++fn release(id: &str, v: &str, at: i64) -> Release {+    let name = format!("{id}-{v}-macos-universal.dmg");+    Release {+        tag: format!("v{v}"),+        version: version::parse(v),+        name: format!("v{v}"),+        published_at: Some(at),+        html_url: format!("https://github.com/storytold/{id}/releases/tag/v{v}"),+        notes: String::new(),+        prerelease: false,+        assets: vec![Asset {+            name: name.clone(),+            size: 150 << 20,+            url: format!("https://github.com/storytold/{id}/releases/download/v{v}/{name}"),+            sha256: None,+        }],+    }+}++fn events() -> Vec<Event> {+    let mut ev = Vec::new();+    for (i, app) in SUITE.iter().enumerate() {+        let latest = LatestRelease::Found(release(app.id, "0.5.0", NOW - 40 * 86_400 - i as i64 * 600));+        ev.push(Event::Latest { app: app.id.into(), latest, from: Origin::ArtCraftApi });+        let installed = matches!(app.id, "photocraft" | "lightcraft").then(|| Installed {+            version: version::parse(if app.id == "photocraft" { "0.4.1" } else { "0.5.0" }),+            source: InstallSource::MacApp,+            location: format!("/Applications/{}.app", app.name),+            package: None,+        });+        ev.push(Event::Detected { app: app.id.into(), installed });+    }+    ev.push(Event::Progress { app: "filmcraft".into(), phase: JobPhase::Verifying });+    ev.push(Event::CheckFinished { at: NOW - 180, source: Source::Feed, rate_limited_until: None });+    // A backend message, translated through its `@msg` template where it's shown.+    ev.push(Event::JobFinished { app: "lightcraft".into(), result: Ok("LightCraft updated to 0.5.0".into()) });+    ev+}++fn harness(view: ViewMode) -> Harness<'static, Option<LauncherUi>> {+    artcraft_launcher_ui_egui::i18n::set_test_lang(artcraft_launcher_ui_egui::i18n::Lang::EN);+    let mut backend = Some(Fake { events: events(), clock: Rc::new(Cell::new(NOW)) });+    let settings =+        Settings { view, notify: false, language: "sv".into(), theme: artcraft_launcher_ui_egui::theme::ThemeChoice::Dark, ..Settings::default() };+    Harness::builder().with_size(egui::vec2(1180.0, 900.0)).with_theme(egui::Theme::Dark).build_ui_state(+        move |ui, state: &mut Option<LauncherUi>| {+            if state.is_none()+                && let Some(b) = backend.take()+            {+                *state = Some(LauncherUi::new(ui.ctx(), Box::new(b), settings.clone()));+            }+            if let Some(l) = state.as_mut() {+                l.logic(&ui.ctx().clone(), &mut NoHost);+                l.ui(ui, &mut NoHost);+            }+        },+        None,+    )+}++fn snapshot(h: &mut Harness<'_, Option<LauncherUi>>, name: &str) {+    let Some(dir) = std::env::var_os("ARTCRAFT_LAUNCHER_SNAPSHOTS") else { return };+    let img = h.render().unwrap();+    img.save(std::path::Path::new(&dir).join(format!("{name}.png"))).unwrap();+}++// One test: the UI language is process-wide.+#[test]+fn swedish_ui_translates_labels_dates_and_messages() {+    let mut h = harness(ViewMode::Grid);+    h.run_steps(8);+    snapshot(&mut h, "grid-sv-dark");+    // Product names stay in English.+    h.get_by_label("Launcher");+    h.get_by_label("Craft App Suite");+    h.get_by_label("Bildredigering");+    h.get_by_label("Uppdatera till 0.5.0");+    h.get_by_label_contains("Verifierar kontrollsumma…");+    h.get_by_label_contains("Kontrollerad för 3 min sedan · med ArtCraft API");+    h.get_by_label("LightCraft har uppdaterats till 0.5.0");++    let mut table = harness(ViewMode::Table);+    table.run_steps(8);+    snapshot(&mut table, "table-sv-dark");+    table.get_by_label("Installerad");+    assert!(table.query_all_by_label_contains("aug 2026").count() >= 1);+}