Skip to content

Commit 220389d

Browse files
committed
feat: added switcher for languages and used translation everywhere
1 parent df92909 commit 220389d

21 files changed

+289
-46
lines changed

Cargo.toml

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@ serde_json = "*"
1010
dialoguer = "*"
1111
serde = { version = "1.0.129", features = ["derive"] }
1212
clap = "*"
13-
execute = "*"
13+
execute = "*"
14+
i18n-embed = { version = "*", features = ["fluent-system", "desktop-requester"]}
15+
once_cell = "*"
16+
lazy_static = "1.4"

src/cli/add_identity.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::cli::prompts::{prompt_alias, prompt_hostname, prompt_path};
33
use crate::domain::create_identity::{structs,enums};
44
use crate::domain::create_identity::create_identity::execute;
55

6+
use crate::infrastructure::i18n::translate;
67
use crate::repositories::traits::Repository;
78
use std::sync::Arc;
89

@@ -18,14 +19,14 @@ pub fn run(repo: Arc<dyn Repository>) {
1819
config_path,
1920
},
2021
_ => {
21-
println!("An error occurred during the prompt");
22+
println!("{}", translate("general:errors.promptError"));
2223
return;
2324
}
2425
};
2526
match execute(repo, req) {
26-
Ok(res) => println!("Added Config Identity with such alias: {:?}", res.alias),
27-
Err(enums::CreateIdentityError::BadRequest) => println!("The request is invalid"),
28-
Err(enums::CreateIdentityError::Conflict) => println!("This Config Identity already exists"),
29-
Err(enums::CreateIdentityError::Unknown) => println!("An unknown error occurred"),
27+
Ok(res) => println!("{} {:?}", translate("add_identity:cli.successful"), res.alias),
28+
Err(enums::CreateIdentityError::BadRequest) => println!("{}", translate("general:errors.requestInvalidError")),
29+
Err(enums::CreateIdentityError::Conflict) => println!("{}", translate("add_identity:cli.alreadyExistsError")),
30+
Err(enums::CreateIdentityError::Unknown) => println!("{}", translate("general:errors.unknownError")),
3031
};
3132
}

src/cli/delete_identity.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
use crate::domain::delete_identity::enums;
22
use crate::domain::delete_identity::delete_identity::execute;
33

4+
use crate::infrastructure::i18n::translate;
45
use crate::repositories::traits::Repository;
56
use std::sync::Arc;
67

78
pub fn run(repo: Arc<dyn Repository>) {
89
match execute(repo) {
9-
Ok(()) => println!("This Config Identity has been deleted"),
10-
Err(enums::DeleteIdentityError::BadRequest) => println!("The request is invalid"),
11-
Err(enums::DeleteIdentityError::NotFound) => println!("Config Identities do not exist"),
12-
Err(enums::DeleteIdentityError::Unknown) => println!("An unknown error occurred"),
10+
Ok(()) => println!("{}", translate("delete_identity:cli.successful")),
11+
Err(enums::DeleteIdentityError::BadRequest) => println!("{}", translate("general:errors.requestInvalidError")),
12+
Err(enums::DeleteIdentityError::NotFound) => println!("{}", translate("general:errors.noConfigIdentitiesFound")),
13+
Err(enums::DeleteIdentityError::Unknown) => println!("{}", translate("general:errors.unknownError")),
1314
}
1415
}

src/cli/mod.rs

+19-6
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
mod add_identity;
22
mod use_identity;
33
mod delete_identity;
4+
mod switch_language;
45
mod prompts;
56

6-
use crate::repositories::traits::Repository;
7+
use crate::{repositories::traits::Repository, infrastructure::i18n::translate};
78
use crate::domain;
89
use dialoguer::{theme::ColorfulTheme, Select};
910
use std::sync::Arc;
1011

1112
pub fn run(repo: Arc<dyn Repository>) {
1213
while let Ok(index) = Select::with_theme(&ColorfulTheme::default())
13-
.with_prompt("Make your choice")
14-
.items(&["Use Identity", "Add Identity", "Delete Identity", "Exit"])
14+
.with_prompt(translate("prompts:menu.title"))
15+
.items(&[
16+
translate("prompts:menu.useIdentity"),
17+
translate("prompts:menu.addIdentity"),
18+
translate("prompts:menu.deleteIdentity"),
19+
translate("prompts:menu.switchLanguage"),
20+
translate("prompts:menu.exit"),
21+
])
1522
.default(0)
1623
.interact()
1724
{
@@ -20,18 +27,24 @@ pub fn run(repo: Arc<dyn Repository>) {
2027
if let Err(err) = use_identity::run(repo.clone()) {
2128
match err {
2229
domain::use_identity::enums::UseIdentityError::NotFound => {
23-
println!("Config Identities do not exist");
30+
println!("{}", translate("general:errors.noConfigIdentitiesFound"));
2431
}
2532
domain::use_identity::enums::UseIdentityError::Unknown => {
26-
println!("An unknown error occurred");
33+
println!("{}", translate("general:errors.unknownError"));
2734
}
2835
}
2936
continue; // Restart the loop and prompt for index again
3037
}
3138
}
3239
1 => add_identity::run(repo.clone()),
3340
2 => delete_identity::run(repo.clone()),
34-
3 => break,
41+
3 => {
42+
if let Err(_) = switch_language::run(repo.clone()) {
43+
println!("{}", translate("general:errors.unknownError"));
44+
continue; // Restart the loop and prompt for index again
45+
}
46+
}
47+
4 => break,
3548
_ => continue,
3649
};
3750
}

src/cli/prompts.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
use dialoguer::Input;
22

3+
use crate::infrastructure::i18n::translate;
4+
35
pub fn prompt_alias() -> Result<String, ()> {
4-
match Input::new().with_prompt("Alias for your identity").interact_text() {
6+
match Input::new().with_prompt(translate("prompts:inputs.alias")).interact_text() {
57
Ok(alias) => Ok(alias),
68
_ => Err(()),
79
}
810
}
911

1012
pub fn prompt_hostname() -> Result<String, ()> {
11-
match Input::new().with_prompt("Hostname").interact_text() {
13+
match Input::new().with_prompt(translate("prompts:inputs.hostname")).interact_text() {
1214
Ok(hostname) => Ok(hostname),
1315
_ => Err(()),
1416
}
1517
}
1618

1719
pub fn prompt_path() -> Result<String, ()> {
18-
match Input::new().with_prompt("Global path").interact_text() {
20+
match Input::new().with_prompt(translate("prompts:inputs.globalPath")).interact_text() {
1921
Ok(path) => Ok(path),
2022
_ => Err(()),
2123
}

src/cli/switch_language.rs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use crate::repositories::traits::Repository;
2+
3+
use crate::domain::switch_language::switch_language::execute;
4+
5+
use std::sync::Arc;
6+
7+
pub fn run(repo: Arc<dyn Repository>) -> Result<(), Box<dyn std::error::Error>> {
8+
execute(repo.clone())?;
9+
10+
Ok(())
11+
}
12+

src/cli/use_identity.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ pub fn run(repo: Arc<dyn Repository>) -> Result<(), enums::UseIdentityError> {
99
if let Err(err) = execute(repo.clone()) {
1010
match err {
1111
enums::UseIdentityError::NotFound | enums::UseIdentityError::Unknown => {
12-
return Err(err.into()); // Propagate the error
12+
return Err(err.into());
1313
}
1414
}
1515
}
1616

17-
println!("Added using of Config Identity with such alias");
1817
Ok(())
1918
}
2019

src/domain/delete_identity/delete_identity.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use dialoguer::theme::ColorfulTheme;
88

99
use super::enums::DeleteIdentityError;
1010
use super::structs::DeleteIdentityResponse;
11+
use crate::{infrastructure::i18n::translate};
1112

1213
pub fn execute(repo: Arc<dyn Repository>) -> Result<(), DeleteIdentityError> {
1314
let identities = match repo.find_all() {
@@ -32,7 +33,7 @@ pub fn execute(repo: Arc<dyn Repository>) -> Result<(), DeleteIdentityError> {
3233

3334
// Move it to cli
3435
let selection = Select::with_theme(&ColorfulTheme::default())
35-
.with_prompt("Pick your Config Identity")
36+
.with_prompt(translate("delete_identity:domain.chooseConfig"))
3637
.default(0)
3738
.items(&selections[..])
3839
.interact()

src/domain/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod create_identity;
22
pub mod use_identity;
33
pub mod delete_identity;
4+
pub mod switch_language;
45
pub mod entities;
56

src/domain/switch_language/enums.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#[derive(Debug)]
2+
pub enum Languages {
3+
En,
4+
Ua,
5+
}
6+
7+
impl Languages {
8+
pub fn as_str(&self) -> &str {
9+
match self {
10+
Languages::En => "en",
11+
Languages::Ua => "ua",
12+
}
13+
}
14+
}

src/domain/switch_language/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub mod switch_language;
2+
pub mod enums;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use std::sync::Arc;
2+
3+
use crate::domain::switch_language::enums::Languages;
4+
use crate::infrastructure::i18n::set_default_language;
5+
use crate::repositories::traits::Repository;
6+
use crate::{infrastructure::i18n::translate};
7+
8+
use dialoguer::Select;
9+
use dialoguer::theme::ColorfulTheme;
10+
11+
pub fn execute(repo: Arc<dyn Repository>) -> Result<(), Box<dyn std::error::Error>> {
12+
let selections: [&str; 2] = ["english", "українська"];
13+
14+
let selection = Select::with_theme(&ColorfulTheme::default())
15+
.with_prompt(translate("switch_language:domain.chooseLanguage"))
16+
.default(0)
17+
.items(&selections)
18+
.interact()
19+
.unwrap();
20+
21+
let language_selection = selections[selection];
22+
let language_code = match language_selection {
23+
"english" => Languages::En.as_str(),
24+
"українська" => Languages::Ua.as_str(),
25+
_ => panic!("{}", translate("switch_language:domain.unknownLanguage")),
26+
};
27+
28+
repo.write_language(language_code)?;
29+
set_default_language(language_code);
30+
31+
return Ok(());
32+
}

src/domain/use_identity/use_identity.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use execute::Execute;
1313

1414
use super::enums::UseIdentityError;
1515
use super::structs::UseIdentityResponse;
16+
use crate::{infrastructure::i18n::translate};
1617

1718
pub fn execute(repo: Arc<dyn Repository>) -> Result<UseIdentityResponse, UseIdentityError> {
1819
let identities = match repo.find_all() {
@@ -24,7 +25,9 @@ pub fn execute(repo: Arc<dyn Repository>) -> Result<UseIdentityResponse, UseIden
2425
hostname: String::from(p.hostname),
2526
})
2627
.collect::<Vec<UseIdentityResponse>>()),
27-
Err(FindIdentitiesRepositoryError::Unknown) => Err(UseIdentityError::Unknown),
28+
Err(_err) => {
29+
Err(UseIdentityError::Unknown)
30+
},
2831
};
2932

3033
match identities {
@@ -36,14 +39,12 @@ pub fn execute(repo: Arc<dyn Repository>) -> Result<UseIdentityResponse, UseIden
3639
}
3740

3841
let selection = Select::with_theme(&ColorfulTheme::default())
39-
.with_prompt("Pick your Config Identity")
42+
.with_prompt(translate("use_identity:domain.chooseIdentity"))
4043
.default(0)
4144
.items(&selections[..])
4245
.interact()
4346
.unwrap();
4447

45-
println!("Your choose this identity: {}", selections[selection]);
46-
4748
let identity_alias = &selections[selection];
4849

4950
let config_identity: Result<UseIdentityResponse, UseIdentityError> = match Alias::try_from(identity_alias.to_owned()) {
@@ -104,8 +105,6 @@ pub fn execute(repo: Arc<dyn Repository>) -> Result<UseIdentityResponse, UseIden
104105
return Ok(unwrapped_config_identity);
105106
},
106107
Err(_err) => {
107-
println!("UseIdentityError: {:#?}", _err);
108-
109108
panic!()
110109
}
111110
}

0 commit comments

Comments
 (0)