From f3136bd319de604e5b08a750ada047c2bb6de63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Wed, 25 Jan 2023 23:04:53 +0100 Subject: [PATCH] Pull user visible messages from localization library --- Cargo.lock | 243 ++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 6 ++ locales/de.yml | 4 + locales/en.yml | 4 + src/bot.rs | 6 +- src/main.rs | 13 ++- 6 files changed, 266 insertions(+), 10 deletions(-) create mode 100644 locales/de.yml create mode 100644 locales/en.yml diff --git a/Cargo.lock b/Cargo.lock index fba8623..e02b8a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anyhow" version = "1.0.65" @@ -32,7 +41,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a941c39708478e8eea39243b5983f1c42d2717b3620ee91f4a52115fd02ac43f" dependencies = [ - "itertools", + "itertools 0.9.0", "proc-macro-error", "proc-macro2", "quote", @@ -114,6 +123,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "bstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45ea9b00a7b3f2988e9a65ad3917e62123c38dba709b666506207be96d1790b" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.11.0" @@ -146,12 +165,14 @@ dependencies = [ "diesel_migrations", "ical", "log", + "once_cell", "pretty_env_logger", "regex", "reqwest", "rrule", + "rust-i18n", "serde", - "serde_yaml", + "serde_yaml 0.9.13", "teloxide", "thiserror", "tokio", @@ -206,6 +227,21 @@ dependencies = [ "phf_codegen", ] +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + [[package]] name = "concurrent-queue" version = "1.2.4" @@ -257,7 +293,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.10.0", "syn", ] @@ -526,6 +562,25 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + [[package]] name = "h2" version = "0.3.14" @@ -684,6 +739,23 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "ignore" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +dependencies = [ + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + [[package]] name = "indexmap" version = "1.9.1" @@ -718,6 +790,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.3" @@ -755,6 +836,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 = "log" version = "0.4.17" @@ -864,9 +951,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" [[package]] name = "openssl" @@ -1181,6 +1268,75 @@ dependencies = [ "thiserror", ] +[[package]] +name = "rust-i18n" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e99913232afabc7678c569e252f896f6cbc5bac0ce5298771e53dd22d7ac26c9" +dependencies = [ + "anyhow", + "clap", + "glob", + "itertools 0.10.5", + "once_cell", + "quote", + "regex", + "rust-i18n-extract", + "rust-i18n-macro", + "serde", + "serde_derive", + "toml", +] + +[[package]] +name = "rust-i18n-extract" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec44568e2cdf4bfb7a62381bbc6fcdf0a27c60cd503dfa12c59e6c17cf3177fa" +dependencies = [ + "anyhow", + "ignore", + "proc-macro2", + "quote", + "regex", + "rust-i18n-support", + "serde", + "serde_json", + "serde_yaml 0.8.26", + "syn", +] + +[[package]] +name = "rust-i18n-macro" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7e3e8f27d472822c5cf092a22631ebc667d9f8dc89dfc50ef4e87f4ebdf92f" +dependencies = [ + "glob", + "once_cell", + "proc-macro2", + "quote", + "rust-i18n-support", + "serde", + "serde_json", + "serde_yaml 0.8.26", + "syn", +] + +[[package]] +name = "rust-i18n-support" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e6bbf2d058c3558bef952564ceb9afcb19631cde22b47dc44f436e62ecfb916" +dependencies = [ + "glob", + "once_cell", + "proc-macro2", + "serde", + "serde_json", + "serde_yaml 0.8.26", +] + [[package]] name = "rustc_version" version = "0.4.0" @@ -1196,6 +1352,15 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +[[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.20" @@ -1296,6 +1461,18 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_yaml" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + [[package]] name = "serde_yaml" version = "0.9.13" @@ -1343,6 +1520,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.10.0" @@ -1465,6 +1648,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thiserror" version = "1.0.37" @@ -1485,6 +1677,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + [[package]] name = "time" version = "0.1.44" @@ -1655,6 +1856,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + [[package]] name = "unsafe-libyaml" version = "0.2.4" @@ -1688,6 +1895,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "vecrem" version = "0.1.0" @@ -1706,6 +1919,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + [[package]] name = "want" version = "0.3.0" @@ -1886,3 +2110,12 @@ checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/Cargo.toml b/Cargo.toml index d71a91b..31961f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,12 +16,18 @@ diesel = { version = "2.0.2", features = ["chrono", "sqlite"] } diesel_migrations = "2.0.0" ical = { version = "0.7.0", features = ["ical"], default-features = false } log = "0.4.17" +once_cell = "1.17.0" pretty_env_logger = "0.4.0" regex = "1.6.0" reqwest = "0.11.12" rrule = "0.10.0" +rust-i18n = "1.1.1" serde = { version = "1.0.145", features = ["derive"] } serde_yaml = "0.9.13" teloxide = { version = "0.11.0", features = ["macros", "throttle"] } thiserror = "1.0.37" tokio = { version = "1.21.2", features = ["macros"] } + +[package.metadata.i18n] +available-locales = ["en", "de"] +default-locale = "de" diff --git a/locales/de.yml b/locales/de.yml new file mode 100644 index 0000000..dc77a86 --- /dev/null +++ b/locales/de.yml @@ -0,0 +1,4 @@ +messages: + next_appointment: "Nächster Termin: %{weekday}, %{date}" + appointment_today: "Heute um %{start_time} Uhr geht's weiter" + starting_now: "Jetzt geht's weiter" diff --git a/locales/en.yml b/locales/en.yml new file mode 100644 index 0000000..af2457e --- /dev/null +++ b/locales/en.yml @@ -0,0 +1,4 @@ +messages: + next_appointment: "Next meeting: %{weekday}, %{date}" + appointment_today: "Next meeting is today at %{start_time}" + starting_now: "The meeting starts now" diff --git a/src/bot.rs b/src/bot.rs index a1d123d..7f72747 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -159,7 +159,11 @@ pub async fn fetch_and_announce_appointment( let announcement = bot .send_message( ChatId(chat_info.id), - format!("Nächster Termin: {}, {}", weekday, date_str), + t!( + "messages.next_appointment", + weekday = weekday, + date = &date_str.to_string() + ), ) .await?; diff --git a/src/main.rs b/src/main.rs index 55512e0..8b51cc0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,6 +29,11 @@ use tokio::time::sleep; use crate::db::DbChat; +#[macro_use] +extern crate rust_i18n; + +i18n!("locales"); + #[derive(Deserialize, Debug)] pub struct Config { token: String, @@ -152,16 +157,16 @@ async fn check_task(bot: &Throttle, reminder_time: NaiveTime, db: &Database if now >= appointment.start { reminder = Some(Reminder { time: appointment.start, - text: "Jetzt geht's weiter".into(), + text: t!("messages.starting_now"), }); } else { let reminder_date_time = now.date().and_time(reminder_time).unwrap(); if now >= reminder_date_time { reminder = Some(Reminder { time: reminder_date_time, - text: format!( - "Heute um {} Uhr geht's weiter", - appointment.start.format("%H:%M") + text: t!( + "messages.appointment_today", + start_time = &appointment.start.format("%H:%M").to_string() ), }) }