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
@@ -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.new file mode 100644@@ -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 opdateringernew file mode 100644@@ -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ä saatavilla@@ -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 {new file mode 100644@@ -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 beschikbaar@@ -129,6 +129,11 @@ Maximize Развернуть Restore Восстановить New Новое+ Classic Классическое+ Inspired by Вдохновлено+ Like {name} Как {name}+ Website (coming soon) Веб-сайт (появится скоро)+@id sort.inspired По вдохновению OK ОК Open link Открыть ссылку Update Обновитьnew file mode 100644@@ -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ängliganew file mode 100644@@ -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);+}new file mode 100644@@ -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);+}new file mode 100644@@ -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);+}new file mode 100644@@ -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);+}