diff --git a/Cargo.lock b/Cargo.lock index 34bdece91..35474ffca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1667,6 +1667,19 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "fontdb" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8d8cbea8f21307d7e84bca254772981296f058a1d36b461bf4d83a7499fc9e" +dependencies = [ + "log", + "memmap2 0.6.2", + "slotmap", + "tinyvec", + "ttf-parser", +] + [[package]] name = "foreign-types" version = "0.3.2" @@ -2733,6 +2746,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -3843,6 +3865,7 @@ dependencies = [ "egui-winit", "embed-resource", "fluent-templates", + "fontdb", "futures", "generational-arena", "isahc", @@ -4202,7 +4225,7 @@ checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" dependencies = [ "ab_glyph", "log", - "memmap2", + "memmap2 0.5.10", "smithay-client-toolkit", "tiny-skia", ] @@ -4379,7 +4402,7 @@ dependencies = [ "dlib", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "nix 0.24.3", "pkg-config", "wayland-client", diff --git a/desktop/src/gui/controller.rs b/desktop/src/gui/controller.rs index 19487fcc5..f2405af0a 100644 --- a/desktop/src/gui/controller.rs +++ b/desktop/src/gui/controller.rs @@ -14,6 +14,7 @@ use ruffle_render_wgpu::utils::{format_list, get_backend_names}; use std::rc::Rc; use std::sync::{Arc, MutexGuard}; use std::time::{Duration, Instant}; +use unic_langid::LanguageIdentifier; use url::Url; use winit::dpi::PhysicalSize; use winit::event_loop::EventLoop; @@ -83,9 +84,7 @@ impl GuiController { }, ); let descriptors = Descriptors::new(adapter, device, queue); - let system_fonts = load_system_fonts().unwrap_or_default(); let egui_ctx = Context::default(); - egui_ctx.set_fonts(system_fonts); if let Some(Theme::Light) = window.theme() { egui_ctx.set_visuals(egui::Visuals::light()); } @@ -104,6 +103,8 @@ impl GuiController { let egui_renderer = egui_wgpu::Renderer::new(&descriptors.device, surface_format, None, 1); let event_loop = event_loop.create_proxy(); let gui = RuffleGui::new(event_loop, opt.movie_url.clone(), PlayerOptions::from(opt)); + let system_fonts = load_system_fonts(gui.locale.to_owned()).unwrap_or_default(); + egui_ctx.set_fonts(system_fonts); Ok(Self { descriptors: Arc::new(descriptors), egui_ctx, @@ -316,17 +317,33 @@ impl GuiController { } // try to load known unicode supporting fonts to draw cjk characters in egui -fn load_system_fonts() -> anyhow::Result { +fn load_system_fonts(locale: LanguageIdentifier) -> anyhow::Result { let mut font_database = Database::default(); font_database.load_system_fonts(); - let system_unicode_fonts = Query { - families: &[ - Family::Name("MS UI Gothic"), // windows + let mut families = Vec::new(); + if let Some(windows_font) = match locale.language.as_str() { + "ja" => Some(Family::Name("MS UI Gothic")), + "zh" => Some(match locale.to_string().as_str() { + "zh-CN" => Family::Name("Microsoft YaHei"), + _ => Family::Name("Microsoft JhengHei"), + }), + "ko" => Some(Family::Name("Malgun Gothic")), + _ => None, + } { + families.push(windows_font); + } + families.extend( + [ Family::Name("Arial Unicode MS"), // macos Family::Name("Noto Sans"), // linux Family::SansSerif, - ], + ] + .iter(), + ); + + let system_unicode_fonts = Query { + families: &families, ..Query::default() };