diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 72f4fee..f9703af 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -47,3 +47,6 @@ default = ["custom-protocol"] # this feature is used used for production builds where `devPath` points to the filesystem # DO NOT remove this custom-protocol = ["tauri/custom-protocol"] + +[profile.release] +strip = true # Automatically strip symbols from the binary. diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index d105e77..03c442c 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -2,6 +2,7 @@ use serde::{Serialize, Serializer}; pub mod binaries; pub mod config; +pub mod download; pub mod features; pub mod game; pub mod logging; diff --git a/src-tauri/src/commands/download.rs b/src-tauri/src/commands/download.rs new file mode 100644 index 0000000..f05487c --- /dev/null +++ b/src-tauri/src/commands/download.rs @@ -0,0 +1,35 @@ +use std::path::{Path, PathBuf}; + +use crate::util::{file::create_dir, network}; + +use super::CommandError; + +#[tauri::command] +pub async fn download_file(url: String, destination: String) -> Result<(), CommandError> { + let download_path = PathBuf::from(&destination); + match download_path.parent() { + Some(parent) => { + if parent == Path::new("") { + return Err(CommandError::OSOperation( + "Unable to successfully download file".to_owned(), + )); + } else { + create_dir(&parent.to_path_buf()).map_err(|_| { + CommandError::VersionManagement(format!( + "Unable to prepare destination folder '{}' for download", + parent.display() + )) + })?; + } + } + None => { + return Err(CommandError::OSOperation( + "Unable to successfully download file".to_owned(), + )); + } + } + network::download_file(&url, &download_path) + .await + .map_err(|_| CommandError::OSOperation("Unable to successfully download file".to_owned()))?; + Ok(()) +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index e4c18dd..902ba89 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -158,6 +158,7 @@ fn main() { commands::config::set_locale, commands::config::get_enabled_texture_packs, commands::config::cleanup_enabled_texture_packs, + commands::download::download_file, commands::game::reset_game_settings, commands::game::uninstall_game, commands::game::get_furthest_game_milestone, diff --git a/src/assets/fonts/Noto Sans/arabic/NotoSansArabic-VariableFont.ttf b/src/assets/fonts/Noto Sans/arabic/NotoSansArabic-VariableFont.ttf deleted file mode 100644 index 0356020..0000000 Binary files a/src/assets/fonts/Noto Sans/arabic/NotoSansArabic-VariableFont.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Black.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-Black.ttf deleted file mode 100644 index 05771e5..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-Black.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Black.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-Black.woff2 new file mode 100644 index 0000000..a6d432c Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-Black.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Bold.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-Bold.ttf deleted file mode 100644 index 0d19068..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-Bold.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Bold.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-Bold.woff2 new file mode 100644 index 0000000..3a2689c Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-Bold.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.ttf deleted file mode 100644 index a74c69a..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.woff2 new file mode 100644 index 0000000..85925f5 Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.ttf deleted file mode 100644 index 13c4bbc..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.woff2 new file mode 100644 index 0000000..50ac7ae Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Light.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-Light.ttf deleted file mode 100644 index 8fde662..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-Light.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Light.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-Light.woff2 new file mode 100644 index 0000000..20295ba Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-Light.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Medium.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-Medium.ttf deleted file mode 100644 index faf167c..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-Medium.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Medium.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-Medium.woff2 new file mode 100644 index 0000000..82e807d Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-Medium.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Regular.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-Regular.ttf deleted file mode 100644 index 7552fbe..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-Regular.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Regular.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-Regular.woff2 new file mode 100644 index 0000000..f777c4d Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-Regular.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.ttf deleted file mode 100644 index b460754..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.woff2 new file mode 100644 index 0000000..71175b1 Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Thin.ttf b/src/assets/fonts/Noto Sans/general/NotoSans-Thin.ttf deleted file mode 100644 index b5af044..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSans-Thin.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSans-Thin.woff2 b/src/assets/fonts/Noto Sans/general/NotoSans-Thin.woff2 new file mode 100644 index 0000000..22bfecd Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSans-Thin.woff2 differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.ttf b/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.ttf deleted file mode 100644 index 49f5e26..0000000 Binary files a/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.ttf and /dev/null differ diff --git a/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.woff2 b/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.woff2 new file mode 100644 index 0000000..859b28c Binary files /dev/null and b/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.woff2 differ diff --git a/src/assets/fonts/Noto Sans/japanese/NotoSansJP-VariableFont.ttf b/src/assets/fonts/Noto Sans/japanese/NotoSansJP-VariableFont.ttf deleted file mode 100644 index 505477e..0000000 Binary files a/src/assets/fonts/Noto Sans/japanese/NotoSansJP-VariableFont.ttf and /dev/null differ diff --git a/src/css/fonts.css b/src/css/fonts.css index 765888a..1b39feb 100644 --- a/src/css/fonts.css +++ b/src/css/fonts.css @@ -1,70 +1,60 @@ @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Thin.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Thin.woff2"); font-weight: 100; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-ExtraLight.woff2"); font-weight: 200; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Light.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Light.woff2"); font-weight: 300; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Regular.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Regular.woff2"); font-weight: 400; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Medium.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Medium.woff2"); font-weight: 500; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-SemiBold.woff2"); font-weight: 600; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Bold.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Bold.woff2"); font-weight: 700; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-ExtraBold.woff2"); font-weight: 800; } @font-face { font-family: "Noto Sans"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Black.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSans-Black.woff2"); font-weight: 900; } @font-face { font-family: "Noto Sans Mono"; - src: url("/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.ttf"); -} - -@font-face { - font-family: "Noto Sans Arabic"; - src: url("/src/assets/fonts/Noto Sans/NotoSansArabic-VariableFont.ttf"); -} - -@font-face { - font-family: "Noto Sans JP"; - src: url("/src/assets/fonts/Noto Sans/NotoSansJP-VariableFont.ttf"); + src: url("/src/assets/fonts/Noto Sans/general/NotoSansMono-VariableFont.woff2"); } .font-mono { diff --git a/src/lib/i18n/i18n.ts b/src/lib/i18n/i18n.ts index 0bd2967..76df444 100644 --- a/src/lib/i18n/i18n.ts +++ b/src/lib/i18n/i18n.ts @@ -1,10 +1,12 @@ import { addMessages, init, register } from "svelte-i18n"; -interface Locale { +export interface Locale { id: string; flag: string; localizedName: string; fontFamily?: string; + fontFileName?: string; + fontDownloadUrl?: string; } // https://omniglot.com/language/names.htm @@ -19,6 +21,9 @@ export const AVAILABLE_LOCALES: Locale[] = [ flag: "🇸🇦", localizedName: "العربية الفصحى", fontFamily: "Noto Sans Arabic", + fontFileName: "NotoSansArabic-VariableFont.woff2", + fontDownloadUrl: + "https://github.com/open-goal/launcher-assets/releases/download/fonts%2Fv1.0.0/NotoSansArabic-VariableFont.woff2", }, { id: "ca-ES", @@ -90,11 +95,18 @@ export const AVAILABLE_LOCALES: Locale[] = [ flag: "🇯🇵", localizedName: "日本語", fontFamily: "Noto Sans JP", + fontFileName: "NotoSansJP-VariableFont.woff2", + fontDownloadUrl: + "https://github.com/open-goal/launcher-assets/releases/download/fonts%2Fv1.0.0/NotoSansJP-VariableFont.woff2", }, { id: "ko-KR", flag: "🇰🇷", localizedName: "한국어", + fontFamily: "Noto Sans KR", + fontFileName: "NotoSansKR-VariableFont_wght.woff2", + fontDownloadUrl: + "https://github.com/open-goal/launcher-assets/releases/download/fonts%2Fv1.0.0/NotoSansKR-VariableFont_wght.woff2", }, { id: "nl-NL", @@ -160,11 +172,19 @@ export const AVAILABLE_LOCALES: Locale[] = [ id: "zh-CN", flag: "🇨🇳", localizedName: "简体中文", + fontFamily: "Noto Sans SC", + fontFileName: "NotoSansSC-VariableFont_wght.woff2", + fontDownloadUrl: + "https://github.com/open-goal/launcher-assets/releases/download/fonts%2Fv1.0.0/NotoSansSC-VariableFont_wght.woff2", }, { id: "zh-TW", flag: "🇹🇼", localizedName: "繁體中文", + fontFamily: "Noto Sans TC", + fontFileName: "NotoSansTC-VariableFont_wght.woff2", + fontDownloadUrl: + "https://github.com/open-goal/launcher-assets/releases/download/fonts%2Fv1.0.0/NotoSansTC-VariableFont_wght.woff2", }, ]; diff --git a/src/lib/rpc/config.ts b/src/lib/rpc/config.ts index 5153134..704fc94 100644 --- a/src/lib/rpc/config.ts +++ b/src/lib/rpc/config.ts @@ -3,7 +3,10 @@ import { locale as svelteLocale } from "svelte-i18n"; import { errorLog } from "./logging"; import { invoke_rpc } from "./rpc"; import type { VersionFolders } from "./versions"; -import { AVAILABLE_LOCALES } from "$lib/i18n/i18n"; +import { AVAILABLE_LOCALES, type Locale } from "$lib/i18n/i18n"; +import { readBinaryFile, BaseDirectory, exists } from "@tauri-apps/api/fs"; +import { appDataDir, join } from "@tauri-apps/api/path"; +import { convertFileSrc } from "@tauri-apps/api/tauri"; export async function oldDataDirectoryExists(): Promise { return await invoke_rpc("has_old_data_directory", {}, () => false); @@ -106,23 +109,72 @@ export async function getLocale(): Promise { return await invoke_rpc("get_locale", {}, () => "en-US"); } +export async function localeSpecificFontAvailableForDownload( + localeId: string, +): Promise { + let localeInfo = AVAILABLE_LOCALES.find((locale) => locale.id === localeId); + if ( + localeInfo !== undefined && + localeInfo.fontFileName !== undefined && + localeInfo.fontDownloadUrl !== undefined + ) { + const fontPath = await join( + await appDataDir(), + "fonts", + localeInfo.fontFileName, + ); + const fontAlreadyDownloaded = await exists(fontPath); + if (fontAlreadyDownloaded) { + return undefined; + } + return localeInfo; + } + return undefined; +} + export async function setLocale(localeId: string): Promise { return await invoke_rpc( "set_locale", { locale: localeId }, () => {}, - null, // no toast - () => { + undefined, // no toast + async () => { svelteLocale.set(localeId); // Update CSS variable if needed let localeInfo = AVAILABLE_LOCALES.find( (locale) => locale.id === localeId, ); - if (localeInfo !== undefined && localeInfo.fontFamily !== undefined) { - document.documentElement.style.setProperty( - "--launcher-font-family", - localeInfo.fontFamily, + if ( + localeInfo !== undefined && + localeInfo.fontFamily !== undefined && + localeInfo.fontFileName !== undefined + ) { + // Dynamically get the font + const fontPath = await join( + await appDataDir(), + "fonts", + localeInfo.fontFileName, ); + const fontExists = await exists(fontPath); + if (fontExists) { + const assetUrl = convertFileSrc(fontPath); + var newFontStyle = document.createElement("style"); + newFontStyle.appendChild( + document.createTextNode( + `@font-face {\nfont-family: "${localeInfo.fontFamily}";\nsrc: url('${assetUrl}');\n}\n`, + ), + ); + document.head.appendChild(newFontStyle); + document.documentElement.style.setProperty( + "--launcher-font-family", + localeInfo.fontFamily, + ); + } else { + document.documentElement.style.setProperty( + "--launcher-font-family", + "Noto Sans", + ); + } } else { document.documentElement.style.setProperty( "--launcher-font-family", diff --git a/src/lib/rpc/download.ts b/src/lib/rpc/download.ts new file mode 100644 index 0000000..528a779 --- /dev/null +++ b/src/lib/rpc/download.ts @@ -0,0 +1,13 @@ +import { invoke_rpc } from "./rpc"; + +export async function downloadFile( + url: String, + destination: String, +): Promise { + await invoke_rpc( + "download_file", + { url, destination }, + () => {}, + "Unable to download file", + ); +} diff --git a/src/routes/settings/General.svelte b/src/routes/settings/General.svelte index 016004d..0bf99a5 100644 --- a/src/routes/settings/General.svelte +++ b/src/routes/settings/General.svelte @@ -1,24 +1,36 @@ @@ -45,7 +61,10 @@ items={availableLocales} bind:value={currentLocale} on:change={async (evt) => { - setLocale(evt.target.value); + await setLocale(evt.target.value); + localeFontForDownload = await localeSpecificFontAvailableForDownload( + evt.target.value, + ); }} /> @@ -59,6 +78,36 @@ > {$_("settings_general_localeChange_helper_2")} + {#if localeFontForDownload !== undefined} + + {/if}