From 49d473f0cf4d3a3ad740967134865d2d7189336e Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sat, 2 Mar 2024 20:16:18 +0200 Subject: [PATCH] move all bot reply message texts to i18n yml file to avoid litering code with long strings --- Cargo.lock | 266 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + locales/en.yml | 5 + src/bot/bot.rs | 3 +- src/bot/op.rs | 7 +- src/bot/start.rs | 4 +- src/main.rs | 2 + 7 files changed, 282 insertions(+), 6 deletions(-) create mode 100644 locales/en.yml diff --git a/Cargo.lock b/Cargo.lock index 4789e0e..16e8eee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,6 +65,12 @@ dependencies = [ "syn 2.0.49", ] +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "atoi" version = "2.0.0" @@ -141,6 +147,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bstr" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.14.0" @@ -244,6 +260,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-queue" version = "0.3.11" @@ -622,6 +657,36 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags 1.3.2", + "ignore", + "walkdir", +] + [[package]] name = "h2" version = "0.3.21" @@ -801,6 +866,22 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "ignore" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "include_dir" version = "0.7.3" @@ -911,6 +992,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.8" @@ -999,6 +1086,7 @@ dependencies = [ "dotenv", "ordered-float", "regex", + "rust-i18n", "serde", "serde_json", "sqlx", @@ -1049,6 +1137,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "normpath" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5831952a9476f2fed74b77d74182fa5ddc4d21c72ec45a333b250e3ed0272804" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1500,6 +1597,57 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust-i18n" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dcd94370631e5658a0a23635f7f47e43d06a00ad948e0bb5de79b00d85b880c" +dependencies = [ + "globwalk", + "once_cell", + "regex", + "rust-i18n-macro", + "rust-i18n-support", + "smallvec", +] + +[[package]] +name = "rust-i18n-macro" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "355763801dcf287e777e42def7c578410783477b804b1107852119e0b2518396" +dependencies = [ + "glob", + "once_cell", + "proc-macro2", + "quote", + "rust-i18n-support", + "serde", + "serde_json", + "serde_yaml", + "syn 2.0.49", +] + +[[package]] +name = "rust-i18n-support" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "399801f4d955abf1c3ce3ce2215dc76bd40beb4ae39e3a84936b21a79ce2caa5" +dependencies = [ + "arc-swap", + "globwalk", + "lazy_static", + "normpath", + "once_cell", + "proc-macro2", + "regex", + "serde", + "serde_json", + "serde_yaml", + "toml", + "triomphe", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1534,6 +1682,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.22" @@ -1609,6 +1766,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1633,6 +1799,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "serde_yaml" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +dependencies = [ + "indexmap 1.9.3", + "ryu", + "serde", + "yaml-rust", +] + [[package]] name = "sha1" version = "0.10.6" @@ -1951,6 +2129,12 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "stringprep" version = "0.1.4" @@ -2248,6 +2432,40 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.3", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -2324,6 +2542,17 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "triomphe" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +dependencies = [ + "arc-swap", + "serde", + "stable_deref_trait", +] + [[package]] name = "try-lock" version = "0.2.4" @@ -2423,6 +2652,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -2549,6 +2788,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2687,6 +2935,15 @@ version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -2697,6 +2954,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/Cargo.toml b/Cargo.toml index 506468a..061d973 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,4 @@ url = "2.5.0" tracing = { version = "0.1.40", features = ["async-await"] } tracing-appender = "0.2.3" tracing-subscriber = "0.3.18" +rust-i18n = "3.0.1" diff --git a/locales/en.yml b/locales/en.yml new file mode 100644 index 0000000..8d65a4b --- /dev/null +++ b/locales/en.yml @@ -0,0 +1,5 @@ +test_response: "test response" +op_yourself: "Now you're an admin" +has_to_reply: "You have to reply on target's message" +cant_do_that: "You can't do that bruh" +started_private_chat: "Since you've initiated private chat now you could receive messages from bot" \ No newline at end of file diff --git a/src/bot/bot.rs b/src/bot/bot.rs index 0d69152..24d32e8 100644 --- a/src/bot/bot.rs +++ b/src/bot/bot.rs @@ -7,6 +7,7 @@ use std::time::Duration; use teloxide::dispatching::{dialogue, dialogue::InMemStorage, UpdateHandler}; use teloxide::{prelude::*, update_listeners::Polling, utils::command::BotCommands}; use tracing::{event, Level}; +use rust_i18n::t; use super::types::*; use crate::db::DbPool; @@ -84,7 +85,7 @@ enum Command { } async fn cmd_test(bot: Bot, msg: Message, _db: DbPool) -> HandlerResult { - bot.send_message(msg.chat.id, "test response").await?; + bot.send_message(msg.chat.id, t!("test_response")).await?; dbg!(msg); Ok(()) diff --git a/src/bot/op.rs b/src/bot/op.rs index 04ba161..d837f23 100644 --- a/src/bot/op.rs +++ b/src/bot/op.rs @@ -1,6 +1,7 @@ use sqlx::Row; use teloxide::prelude::*; use tracing::{event, Level}; +use rust_i18n::t; use super::types::HandlerResult; use crate::db::user::{create_user, find_or_create_user}; @@ -22,7 +23,7 @@ pub async fn cmd_op(bot: Bot, msg: Message, db: DbPool) -> HandlerResult { user.tg_id, user.username_or_name() ); - bot.send_message(msg.chat.id, "Now you're an admin").await?; + bot.send_message(msg.chat.id, t!("op_yourself")).await?; } else { let user = find_or_create_user(&db, tg_user).await?; if user.is_admin == 1 { @@ -36,11 +37,11 @@ pub async fn cmd_op(bot: Bot, msg: Message, db: DbPool) -> HandlerResult { event!(Level::INFO, "opped {}", target); bot.send_message(msg.chat.id, "opped").await?; } else { - bot.send_message(msg.chat.id, "You have to reply on target's message") + bot.send_message(msg.chat.id, t!("has_to_reply")) .await?; } } else { - bot.send_message(msg.chat.id, "You can't do that bruh") + bot.send_message(msg.chat.id, t!("cant_do_that")) .await?; } } diff --git a/src/bot/start.rs b/src/bot/start.rs index d1a853e..da99af8 100644 --- a/src/bot/start.rs +++ b/src/bot/start.rs @@ -1,6 +1,6 @@ -use sqlx::Row; use teloxide::prelude::*; use tracing::{event, Level}; +use rust_i18n::t; use super::types::HandlerResult; use crate::db::user::find_or_create_user; @@ -16,7 +16,7 @@ pub async fn cmd_start(bot: Bot, msg: Message, db: DbPool) -> HandlerResult { .await?; event!(Level::INFO, "user {} has started private chat with bot", user); - bot.send_message(msg.chat.id, "Since you've initiated private chat now you could receive messages from bot").await?; + bot.send_message(msg.chat.id, t!("started_private_chat")).await?; } } Ok(()) diff --git a/src/main.rs b/src/main.rs index 4bb61dc..990e19f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,8 @@ use log::log_init; mod db; use db::db_init; +rust_i18n::i18n!("locales"); + #[tokio::main] async fn main() -> anyhow::Result<()> { dotenv().ok();