Skip to content

Commit b2998f4

Browse files
committed
Add translation support
1 parent 4faee39 commit b2998f4

File tree

8 files changed

+446
-49
lines changed

8 files changed

+446
-49
lines changed

Cargo.lock

+287-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ fontdb = "0.15.0"
1111
lazy_static = "1.4.0"
1212
log = "0.4.20"
1313
rfd = "0.12.0"
14+
# Internationalization
15+
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
16+
i18n-embed-fl = "0.6.4"
17+
rust-embed = "6.3.0"
1418

1519
[dependencies.cosmic-text]
1620
git = "https://github.com/pop-os/cosmic-text"

i18n.toml

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
fallback_language = "en"
2+
3+
[fluent]
4+
assets_dir = "i18n"

i18n/en/cosmic_edit.ftl

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
new-document = New document
2+
open-project = Open project
3+
4+
# Menu
5+
6+
## File
7+
file = File
8+
new-file = New file
9+
new-window = New window
10+
open-file = Open file...
11+
open-recent = Open recent
12+
todo = TODO
13+
save = Save
14+
save-as = Save as...
15+
revert-all-changes = Revert all changes
16+
document-statistics = Document statistics...
17+
document-type = Document type...
18+
encoding = Encoding...
19+
print = Print
20+
quit = Quit
21+
22+
## Edit
23+
edit = Edit
24+
undo = Undo
25+
redo = Redo
26+
cut = Cut
27+
copy = Copy
28+
paste = Pate
29+
find = Find
30+
replace = Replace
31+
spell-check = Spell check...
32+
33+
## View
34+
view = View
35+
indentation = Indentation
36+
37+
### Indentation
38+
automatic-indentation = Automatic Indentation
39+
tab-width = Tab width: {$tab_width}
40+
convert-indentation-to-spaces = Convert indentation to spaces
41+
convert-indentation-to-tabs = Convert indentation to tabs
42+
43+
word-wrap = Word wrap
44+
show-line-numbers = Show line numbers
45+
highlight-current-line = Highlight current line
46+
syntax-highlighting = Syntax highlighting...
47+
settings = Settings...
48+
keyboard-shortcuts = Keyboard shortcuts...
49+
about-cosmic-text-editor = About COSMIC Text Editor

src/localize.rs

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use i18n_embed::{
2+
fluent::{fluent_language_loader, FluentLanguageLoader},
3+
DefaultLocalizer, LanguageLoader, Localizer,
4+
};
5+
use rust_embed::RustEmbed;
6+
7+
#[derive(RustEmbed)]
8+
#[folder = "i18n/"]
9+
struct Localizations;
10+
11+
lazy_static::lazy_static! {
12+
pub static ref LANGUAGE_LOADER: FluentLanguageLoader = {
13+
let loader: FluentLanguageLoader = fluent_language_loader!();
14+
15+
loader
16+
.load_fallback_language(&Localizations)
17+
.expect("Error while loading fallback language");
18+
19+
loader
20+
};
21+
}
22+
23+
#[macro_export]
24+
macro_rules! fl {
25+
($message_id:literal) => {{
26+
i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id)
27+
}};
28+
29+
($message_id:literal, $($args:expr),*) => {{
30+
i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *)
31+
}};
32+
}
33+
34+
// Get the `Localizer` to be used for localizing this library.
35+
pub fn localizer() -> Box<dyn Localizer> {
36+
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))
37+
}
38+
39+
pub fn localize() {
40+
let localizer = localizer();
41+
let requested_languages = i18n_embed::DesktopLanguageRequester::requested_languages();
42+
43+
if let Err(error) = localizer.select(&requested_languages) {
44+
eprintln!("Error while loading language for App List {}", error);
45+
}
46+
}

src/main.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ use std::{
1818
sync::Mutex,
1919
};
2020

21+
mod localize;
22+
2123
use self::menu::menu_bar;
2224
mod menu;
2325

@@ -39,6 +41,8 @@ lazy_static::lazy_static! {
3941
fn main() -> Result<(), Box<dyn std::error::Error>> {
4042
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
4143

44+
localize::localize();
45+
4246
let settings = Settings::default().size_limits(Limits::NONE.min_width(400.0).min_height(200.0));
4347
let flags = ();
4448
cosmic::app::run::<App>(settings, flags)?;
@@ -303,7 +307,7 @@ impl cosmic::Application for App {
303307
app.nav_model
304308
.insert()
305309
.icon(icon::from_name("folder-open-symbolic").size(16).icon())
306-
.text("Open project");
310+
.text(fl!("open-project"));
307311
}
308312

309313
// Open an empty file if no arguments provided

src/menu.rs

+49-44
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ use cosmic::{
1111
Element,
1212
};
1313

14-
use crate::{Config, Message};
14+
use crate::{fl, Config, Message};
1515

1616
pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> {
1717
//TODO: port to libcosmic
1818
let menu_root = |label| {
19-
widget::button(label)
19+
widget::button(widget::text(label))
2020
.padding([4, 12])
2121
.style(theme::Button::MenuRoot)
2222
};
@@ -36,84 +36,89 @@ pub fn menu_bar<'a>(config: &Config) -> Element<'a, Message> {
3636
);
3737
}
3838

39-
let menu_folder = |label| menu_button!(label, horizontal_space(Length::Fill), ">");
39+
let menu_folder =
40+
|label| menu_button!(widget::text(label), horizontal_space(Length::Fill), ">");
4041

41-
let menu_item = |label, message| MenuTree::new(menu_button!(label).on_press(message));
42+
let menu_item =
43+
|label, message| MenuTree::new(menu_button!(widget::text(label)).on_press(message));
4244

4345
let menu_key = |label, key, message| {
44-
MenuTree::new(menu_button!(label, horizontal_space(Length::Fill), key).on_press(message))
46+
MenuTree::new(
47+
menu_button!(widget::text(label), horizontal_space(Length::Fill), key)
48+
.on_press(message),
49+
)
4550
};
4651

4752
MenuBar::new(vec![
4853
MenuTree::with_children(
49-
menu_root("File"),
54+
menu_root(fl!("file")),
5055
vec![
51-
menu_key("New file", "Ctrl + N", Message::New),
52-
menu_key("New window", "Ctrl + Shift + N", Message::Todo),
56+
menu_key(fl!("new-file"), "Ctrl + N", Message::New),
57+
menu_key(fl!("new-window"), "Ctrl + Shift + N", Message::Todo),
5358
MenuTree::new(horizontal_rule(1)),
54-
menu_key("Open file...", "Ctrl + O", Message::OpenFileDialog),
59+
menu_key(fl!("open-file"), "Ctrl + O", Message::OpenFileDialog),
5560
MenuTree::with_children(
56-
menu_folder("Open recent"),
57-
vec![menu_item("TODO", Message::Todo)],
61+
menu_folder(fl!("open-recent")),
62+
vec![menu_item(fl!("todo"), Message::Todo)],
5863
),
5964
MenuTree::new(horizontal_rule(1)),
60-
menu_key("Save", "Ctrl + S", Message::Save),
61-
menu_key("Save as...", "Ctrl + Shift + S", Message::Todo),
65+
menu_key(fl!("save"), "Ctrl + S", Message::Save),
66+
menu_key(fl!("save-as"), "Ctrl + Shift + S", Message::Todo),
6267
MenuTree::new(horizontal_rule(1)),
63-
menu_item("Revert all changes", Message::Todo),
68+
menu_item(fl!("revert-all-changes"), Message::Todo),
6469
MenuTree::new(horizontal_rule(1)),
65-
menu_item("Document statistics...", Message::Todo),
66-
menu_item("Document type...", Message::Todo),
67-
menu_item("Encoding...", Message::Todo),
68-
menu_item("Print", Message::Todo),
70+
menu_item(fl!("document-statistics"), Message::Todo),
71+
menu_item(fl!("document-type"), Message::Todo),
72+
menu_item(fl!("encoding"), Message::Todo),
73+
menu_item(fl!("print"), Message::Todo),
6974
MenuTree::new(horizontal_rule(1)),
70-
menu_key("Quit", "Ctrl + Q", Message::Todo),
75+
menu_key(fl!("quit"), "Ctrl + Q", Message::Todo),
7176
],
7277
),
7378
MenuTree::with_children(
74-
menu_root("Edit"),
79+
menu_root(fl!("edit")),
7580
vec![
76-
menu_key("Undo", "Ctrl + Z", Message::Todo),
77-
menu_key("Redo", "Ctrl + Shift + Z", Message::Todo),
81+
menu_key(fl!("undo"), "Ctrl + Z", Message::Todo),
82+
menu_key(fl!("redo"), "Ctrl + Shift + Z", Message::Todo),
7883
MenuTree::new(horizontal_rule(1)),
79-
menu_key("Cut", "Ctrl + X", Message::Todo),
80-
menu_key("Copy", "Ctrl + C", Message::Todo),
81-
menu_key("Paste", "Ctrl + V", Message::Todo),
84+
menu_key(fl!("cut"), "Ctrl + X", Message::Todo),
85+
menu_key(fl!("copy"), "Ctrl + C", Message::Todo),
86+
menu_key(fl!("paste"), "Ctrl + V", Message::Todo),
8287
MenuTree::new(horizontal_rule(1)),
83-
menu_key("Find", "Ctrl + F", Message::Todo),
84-
menu_key("Replace", "Ctrl + H", Message::Todo),
88+
menu_key(fl!("find"), "Ctrl + F", Message::Todo),
89+
menu_key(fl!("replace"), "Ctrl + H", Message::Todo),
8590
MenuTree::new(horizontal_rule(1)),
86-
menu_item("Spell check...", Message::Todo),
91+
menu_item(fl!("spell-check"), Message::Todo),
8792
],
8893
),
8994
MenuTree::with_children(
90-
menu_root("View"),
95+
menu_root(fl!("view")),
9196
vec![
9297
MenuTree::with_children(
93-
menu_folder("Indentation"),
98+
menu_folder(fl!("indentation")),
9499
vec![
95-
menu_item("Automatic indentation", Message::Todo),
100+
menu_item(fl!("automatic-indentation"), Message::Todo),
96101
MenuTree::new(horizontal_rule(1)),
97-
menu_item("Tab width: 1", Message::Todo),
98-
menu_item("Tab width: 2", Message::Todo),
99-
menu_item("Tab width: 4", Message::Todo),
100-
menu_item("Tab width: 8", Message::Todo),
102+
menu_item(fl!("tab-width", tab_width = 1), Message::Todo),
103+
menu_item(fl!("tab-width", tab_width = 2), Message::Todo),
104+
menu_item(fl!("tab-width", tab_width = 4), Message::Todo),
105+
menu_item(fl!("tab-width", tab_width = 8), Message::Todo),
101106
MenuTree::new(horizontal_rule(1)),
102-
menu_item("Convert indentation to spaces", Message::Todo),
103-
menu_item("Convert indentation to tabs", Message::Todo),
107+
menu_item(fl!("convert-indentation-to-spaces"), Message::Todo),
108+
menu_item(fl!("convert-indentation-to-tabs"), Message::Todo),
104109
],
105110
),
106111
MenuTree::new(horizontal_rule(1)),
107-
menu_item("Word wrap", Message::Todo),
108-
menu_item("Show line numbers", Message::Todo),
109-
menu_item("Highlight current line", Message::Todo),
110-
menu_item("Syntax highlighting...", Message::Todo),
112+
menu_item(fl!("word-wrap"), Message::Todo),
113+
menu_item(fl!("show-line-numbers"), Message::Todo),
114+
menu_item(fl!("highlight-current-line"), Message::Todo),
115+
menu_item(fl!("syntax-highlighting"), Message::Todo),
111116
MenuTree::new(horizontal_rule(1)),
112-
menu_key("Settings...", "Ctrl + ,", Message::Todo),
117+
menu_key(fl!("settings"), "Ctrl + ,", Message::Todo),
113118
MenuTree::new(horizontal_rule(1)),
114-
menu_item("Keyboard shortcuts...", Message::Todo),
119+
menu_item(fl!("keyboard-shortcuts"), Message::Todo),
115120
MenuTree::new(horizontal_rule(1)),
116-
menu_item("About COSMIC Text Editor", Message::Todo),
121+
menu_item(fl!("about-cosmic-text-editor"), Message::Todo),
117122
],
118123
),
119124
])

src/tab.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use cosmic_text::{Attrs, Buffer, Edit, Metrics, SyntaxEditor, ViEditor, Wrap};
44
use std::{fs, path::PathBuf, sync::Mutex};
55

6-
use crate::{Config, FONT_SYSTEM, SYNTAX_SYSTEM};
6+
use crate::{fl, Config, FONT_SYSTEM, SYNTAX_SYSTEM};
77

88
static FONT_SIZES: &'static [Metrics] = &[
99
Metrics::new(10.0, 14.0), // Caption
@@ -104,7 +104,7 @@ impl Tab {
104104
None => format!("{}", path.display()),
105105
}
106106
} else {
107-
"New document".to_string()
107+
fl!("new-document")
108108
}
109109
}
110110
}

0 commit comments

Comments
 (0)