Skip to content

Commit

Permalink
feat: project fluent i18n
Browse files Browse the repository at this point in the history
  • Loading branch information
wash2 committed Apr 14, 2022
1 parent 97d7607 commit a0a7e51
Show file tree
Hide file tree
Showing 9 changed files with 421 additions and 5 deletions.
355 changes: 355 additions & 0 deletions Cargo.lock

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ cosmic-theme = { git = "https://github.com/pop-os/cosmic-theme" }
xdg = "2.4.0"
anyhow = "1.0.56"
freedesktop-desktop-entry = "0.5.0"
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.4"
rust-embed = "6.3.0"

[features]
default = ["dev"]
Expand Down
3 changes: 1 addition & 2 deletions data/com.System76.CosmicLauncher.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
<component type="desktop-application">
<id>com.system76.CosmicLauncher</id>
<metadata_license>CC0</metadata_license>
<!-- Insert your license of choice here -->
<!-- <project_license>MIT</project_license> -->
<project_license>MPL</project_license>
<name>Cosmic Launcher</name>
<summary>Write a GTK + Rust application</summary>
<description>
Expand Down
4 changes: 4 additions & 0 deletions i18n.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fallback_language = "en"

[fluent]
assets_dir = "i18n"
1 change: 1 addition & 0 deletions i18n/en/cosmic_launcher.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cosmic-launcher = Cosmic Launcher
4 changes: 3 additions & 1 deletion src/application.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use crate::search_result_object::SearchResultObject;
use crate::utils::BoxedSearchResult;
use gtk4::{gdk::Display, gio, glib, prelude::*, subclass::prelude::*, CssProvider, StyleContext};
use log::debug;
use log::{debug, info};
use once_cell::sync::OnceCell;
use tokio::{runtime::Runtime, sync::mpsc};
use tokio_stream::StreamExt;
Expand Down Expand Up @@ -181,6 +181,8 @@ impl CosmicLauncherApplication {

pub fn run(&self) {
ApplicationExtManual::run(self);
info!("Cosmic Launcher ({})", config::APP_ID);
info!("Version: {}", config::VERSION);
}
}

Expand Down
36 changes: 36 additions & 0 deletions src/localize.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
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<FluentLanguageLoader> = 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.
pub fn localizer() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))
}
16 changes: 15 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod desktop_entry_data;
mod search_result_object;
mod search_result_row;

mod localize;
mod utils;
mod window;
use gtk4::{gio, glib};
Expand All @@ -15,12 +16,25 @@ use self::config::RESOURCES_FILE;

use self::application::CosmicLauncherApplication;

pub fn localize() {
let localizer = crate::localize::localizer();
let requested_languages = i18n_embed::DesktopLanguageRequester::requested_languages();

if let Err(error) = localizer.select(&requested_languages) {
eprintln!(
"Error while loading language for pop-desktop-widget {}",
error
);
}
}

fn main() {
// Initialize logger
pretty_env_logger::init();

glib::set_application_name("Cosmic Launcher");
glib::set_application_name(config::APP_ID);

localize();
let res = gio::Resource::load(RESOURCES_FILE).expect("Could not load gresource file");
gio::resources_register(&res);
let rt = Runtime::new().unwrap();
Expand Down
4 changes: 3 additions & 1 deletion src/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

use crate::{
application::{CosmicLauncherApplication, Event, TX},
fl,
search_result_object::SearchResultObject,
search_result_row::SearchResultRow,
utils,
};

use cascade::cascade;
use gdk4_x11::X11Display;
use gtk4::{
Expand Down Expand Up @@ -69,7 +71,7 @@ impl CosmicLauncherWindow {
cascade! {
&self_;
..set_width_request(600);
..set_title(Some("Cosmic Launcher"));
..set_title(Some(&fl!("cosmic-launcher")));
..set_decorated(false);
..set_resizable(false);
..add_css_class("root_window");
Expand Down

0 comments on commit a0a7e51

Please sign in to comment.