From 0f0ee85d1acd39d613e3e90cc83061e0aeb932d8 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 26 Dec 2023 13:40:38 -0800 Subject: [PATCH] Add i18n support --- i18n.toml | 4 ++++ i18n/en/cosmic_workspaces.ftl | 1 + src/localize.rs | 40 +++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 i18n.toml create mode 100644 i18n/en/cosmic_workspaces.ftl create mode 100644 src/localize.rs diff --git a/i18n.toml b/i18n.toml new file mode 100644 index 0000000..76f7c31 --- /dev/null +++ b/i18n.toml @@ -0,0 +1,4 @@ +fallback_language = "en" + +[fluent] +assets_dir = "i18n" diff --git a/i18n/en/cosmic_workspaces.ftl b/i18n/en/cosmic_workspaces.ftl new file mode 100644 index 0000000..fb5bac3 --- /dev/null +++ b/i18n/en/cosmic_workspaces.ftl @@ -0,0 +1 @@ +new-workspace = New Workspace diff --git a/src/localize.rs b/src/localize.rs new file mode 100644 index 0000000..263c17f --- /dev/null +++ b/src/localize.rs @@ -0,0 +1,40 @@ +// Copyright 2023 System76 +// SPDX-License-Identifier: GPL-3.0-only + +use i18n_embed::{ + fluent::{fluent_language_loader, FluentLanguageLoader}, + DefaultLocalizer, LanguageLoader, Localizer, +}; +use once_cell::sync::Lazy; +use rust_embed::RustEmbed; + +#[derive(RustEmbed)] +#[folder = "i18n/"] +struct Localizations; + +pub static LANGUAGE_LOADER: Lazy = Lazy::new(|| { + let loader: FluentLanguageLoader = fluent_language_loader!(); + + loader + .load_fallback_language(&Localizations) + .expect("Error while loading fallback language"); + + loader +}); + +#[macro_export] +macro_rules! fl { + ($message_id:literal) => {{ + i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id) + }}; + + ($message_id:literal, $($args:expr),*) => {{ + i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *) + }}; +} + +// Get the `Localizer` to be used for localizing this library. +#[must_use] +pub fn localizer() -> Box { + Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations)) +}