internationalize and localize in french with fluent

using crates fluent-templates and rocket-accept-language
This commit is contained in:
Miraty 2024-04-14 21:46:58 +02:00
parent ed2df001f4
commit fccff4d136
11 changed files with 430 additions and 368 deletions

531
Cargo.lock generated
View File

@ -2,6 +2,12 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "accept-language"
version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f27d075294830fcab6f66e320dab524bc6d048f4a151698e153205559113772"
[[package]]
name = "addr2line"
version = "0.21.0"
@ -26,27 +32,18 @@ dependencies = [
"memchr",
]
[[package]]
name = "android-tzdata"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]]
name = "anyhow"
version = "1.0.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1"
[[package]]
name = "arc-swap"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
[[package]]
name = "async-stream"
version = "0.3.5"
@ -200,40 +197,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
version = "0.4.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b"
dependencies = [
"android-tzdata",
"iana-time-zone",
"num-traits",
"windows-targets 0.52.3",
]
[[package]]
name = "chrono-tz"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e"
dependencies = [
"chrono",
"chrono-tz-build",
"phf",
]
[[package]]
name = "chrono-tz-build"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f"
dependencies = [
"parse-zoneinfo",
"phf",
"phf_codegen",
]
[[package]]
name = "cookie"
version = "0.18.0"
@ -270,15 +233,6 @@ dependencies = [
"libc",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.5"
@ -323,12 +277,6 @@ dependencies = [
"powerfmt",
]
[[package]]
name = "deunicode"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6e854126756c496b8c81dec88f9a706b15b875c5849d4097a3854476b9fdf94"
[[package]]
name = "devise"
version = "0.4.1"
@ -404,6 +352,17 @@ dependencies = [
"crypto-common",
]
[[package]]
name = "displaydoc"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "either"
version = "1.10.0"
@ -456,15 +415,104 @@ dependencies = [
]
[[package]]
name = "filetime"
version = "0.2.23"
name = "fluent"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
checksum = "61f69378194459db76abd2ce3952b790db103ceb003008d3d50d97c41ff847a7"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"windows-sys 0.52.0",
"fluent-bundle",
"unic-langid",
]
[[package]]
name = "fluent-bundle"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd"
dependencies = [
"fluent-langneg",
"fluent-syntax",
"intl-memoizer",
"intl_pluralrules",
"rustc-hash",
"self_cell 0.10.3",
"smallvec",
"unic-langid",
]
[[package]]
name = "fluent-langneg"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94"
dependencies = [
"unic-langid",
]
[[package]]
name = "fluent-syntax"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78"
dependencies = [
"thiserror",
]
[[package]]
name = "fluent-template-macros"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6ed4e698f4d91b4c8e8e21779fea045709f399057c470cb8fa5f3369b2e19fd"
dependencies = [
"flume 0.10.14",
"ignore",
"once_cell",
"proc-macro2",
"quote",
"syn",
"unic-langid",
]
[[package]]
name = "fluent-templates"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ce2bb37143b7e57115052cea4fc552f4e98462af54c36cf1303af1d5e231be0"
dependencies = [
"arc-swap",
"fluent",
"fluent-bundle",
"fluent-langneg",
"fluent-syntax",
"fluent-template-macros",
"flume 0.11.0",
"heck",
"ignore",
"intl-memoizer",
"log",
"once_cell",
"serde_json",
"tera",
"thiserror",
"unic-langid",
]
[[package]]
name = "flume"
version = "0.10.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
dependencies = [
"spin",
]
[[package]]
name = "flume"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
dependencies = [
"spin",
]
[[package]]
@ -482,15 +530,6 @@ dependencies = [
"percent-encoding",
]
[[package]]
name = "fsevent-sys"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
dependencies = [
"libc",
]
[[package]]
name = "futures"
version = "0.3.30"
@ -651,6 +690,12 @@ version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "hermit-abi"
version = "0.3.8"
@ -691,15 +736,6 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "humansize"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7"
dependencies = [
"libm",
]
[[package]]
name = "hyper"
version = "0.14.28"
@ -738,29 +774,6 @@ dependencies = [
"tokio-rustls",
]
[[package]]
name = "iana-time-zone"
version = "0.1.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
"windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
"cc",
]
[[package]]
name = "idna"
version = "0.5.0"
@ -805,23 +818,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
[[package]]
name = "inotify"
version = "0.9.6"
name = "intl-memoizer"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f"
dependencies = [
"bitflags 1.3.2",
"inotify-sys",
"libc",
"type-map",
"unic-langid",
]
[[package]]
name = "inotify-sys"
version = "0.1.5"
name = "intl_pluralrules"
version = "7.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972"
dependencies = [
"libc",
"unic-langid",
]
[[package]]
@ -856,26 +868,6 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "kqueue"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c"
dependencies = [
"kqueue-sys",
"libc",
]
[[package]]
name = "kqueue-sys"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
dependencies = [
"bitflags 1.3.2",
"libc",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@ -888,12 +880,6 @@ version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "libm"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
[[package]]
name = "libsqlite3-sys"
version = "0.27.0"
@ -984,7 +970,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
dependencies = [
"libc",
"log",
"wasi",
"windows-sys 0.48.0",
]
@ -1019,34 +1004,6 @@ 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 = "notify"
version = "6.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
dependencies = [
"bitflags 2.4.2",
"crossbeam-channel",
"filetime",
"fsevent-sys",
"inotify",
"kqueue",
"libc",
"log",
"mio",
"walkdir",
"windows-sys 0.48.0",
]
[[package]]
name = "nu-ansi-term"
version = "0.46.0"
@ -1063,15 +1020,6 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "num-traits"
version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.16.0"
@ -1126,15 +1074,6 @@ dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "parse-zoneinfo"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41"
dependencies = [
"regex",
]
[[package]]
name = "pear"
version = "0.2.8"
@ -1209,44 +1148,6 @@ dependencies = [
"sha2",
]
[[package]]
name = "phf"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
dependencies = [
"phf_shared",
]
[[package]]
name = "phf_codegen"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
dependencies = [
"phf_generator",
"phf_shared",
]
[[package]]
name = "phf_generator"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
dependencies = [
"phf_shared",
"rand",
]
[[package]]
name = "phf_shared"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project-lite"
version = "0.2.13"
@ -1277,6 +1178,12 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro-hack"
version = "0.5.20+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
version = "1.0.78"
@ -1505,6 +1412,17 @@ dependencies = [
"yansi",
]
[[package]]
name = "rocket-accept-language"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "948e5f96a6a959aec6e05fb3140a1f7fde523055239bc19aa77e639d99e66c66"
dependencies = [
"accept-language",
"rocket",
"unic-langid",
]
[[package]]
name = "rocket_codegen"
version = "0.5.0"
@ -1522,19 +1440,6 @@ dependencies = [
"version_check",
]
[[package]]
name = "rocket_dyn_templates"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04bfc006e547e4f72b760ab861f5943b688aed8a82c4977b5500c98f5d17dbfa"
dependencies = [
"normpath",
"notify",
"rocket",
"tera",
"walkdir",
]
[[package]]
name = "rocket_http"
version = "0.5.0"
@ -1568,6 +1473,12 @@ version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustix"
version = "0.38.31"
@ -1655,6 +1566,21 @@ dependencies = [
"untrusted",
]
[[package]]
name = "self_cell"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d"
dependencies = [
"self_cell 1.0.3",
]
[[package]]
name = "self_cell"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba"
[[package]]
name = "serde"
version = "1.0.197"
@ -1677,9 +1603,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.114"
version = "1.0.116"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
dependencies = [
"itoa",
"ryu",
@ -1712,12 +1638,16 @@ name = "services"
version = "0.1.0"
dependencies = [
"diesel",
"fluent-templates",
"reqwest",
"rocket",
"rocket_dyn_templates",
"rocket-accept-language",
"serde",
"serde_json",
"tera",
"texting_robots",
"tokio",
"unic-langid",
]
[[package]]
@ -1749,12 +1679,6 @@ dependencies = [
"libc",
]
[[package]]
name = "siphasher"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
[[package]]
name = "slab"
version = "0.4.9"
@ -1764,16 +1688,6 @@ dependencies = [
"autocfg",
]
[[package]]
name = "slug"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4"
dependencies = [
"deunicode",
"wasm-bindgen",
]
[[package]]
name = "smallvec"
version = "1.13.1"
@ -1795,6 +1709,9 @@ name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
dependencies = [
"lock_api",
]
[[package]]
name = "stable-pattern"
@ -1870,19 +1787,13 @@ version = "1.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8"
dependencies = [
"chrono",
"chrono-tz",
"globwalk",
"humansize",
"lazy_static",
"percent-encoding",
"pest",
"pest_derive",
"rand",
"regex",
"serde",
"serde_json",
"slug",
"unic-segment",
]
@ -1904,18 +1815,18 @@ dependencies = [
[[package]]
name = "thiserror"
version = "1.0.57"
version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.57"
version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
dependencies = [
"proc-macro2",
"quote",
@ -1963,6 +1874,15 @@ dependencies = [
"time-core",
]
[[package]]
name = "tinystr"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece"
dependencies = [
"displaydoc",
]
[[package]]
name = "tinyvec"
version = "1.6.0"
@ -2161,6 +2081,15 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "type-map"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46"
dependencies = [
"rustc-hash",
]
[[package]]
name = "typenum"
version = "1.17.0"
@ -2213,6 +2142,49 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
[[package]]
name = "unic-langid"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "238722e6d794ed130f91f4ea33e01fcff4f188d92337a21297892521c72df516"
dependencies = [
"unic-langid-impl",
"unic-langid-macros",
]
[[package]]
name = "unic-langid-impl"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bd55a2063fdea4ef1f8633243a7b0524cbeef1905ae04c31a1c9b9775c55bc6"
dependencies = [
"tinystr",
]
[[package]]
name = "unic-langid-macros"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c854cefb82ff2816410ce606acbad1b3af065140907b29be9229040752b83ec"
dependencies = [
"proc-macro-hack",
"tinystr",
"unic-langid-impl",
"unic-langid-macros-impl",
]
[[package]]
name = "unic-langid-macros-impl"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fea2a4c80deb4fb3ca51f66b5e2dd91e3642bbce52234bcf22e41668281208e4"
dependencies = [
"proc-macro-hack",
"quote",
"syn",
"unic-langid-impl",
]
[[package]]
name = "unic-segment"
version = "0.9.0"
@ -2451,15 +2423,6 @@ dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "windows-core"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets 0.52.3",
]
[[package]]
name = "windows-sys"
version = "0.48.0"

View File

@ -7,12 +7,24 @@ edition = "2021"
name = "updater"
path = "src/updater.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
serde = "1.0.197"
texting_robots = "0.2.2"
tokio = "1.36.0"
rocket-accept-language = { version = "0.8.6", default-features = false }
serde = { version = "1.0.197", default-features = false }
serde_json = { version = "1.0.116", default-features = false }
tera = { version = "1.19.1", default-features = false }
texting_robots = { version = "0.2.2", default-features = false }
tokio = { version = "1.36.0", default-features = false }
unic-langid = { version = "0.9.4", default-features = false }
[dependencies.fluent-templates]
version = "0.9.2"
default-features = false
features = ["tera", "use-ignore", "macros"]
[dependencies.diesel]
version = "2.1.4"
default-features = false
features = ["sqlite"]
[dependencies.reqwest]
version = "0.11.24"
@ -22,20 +34,10 @@ features = [
"socks",
]
[dependencies.diesel]
version = "2.1.4"
default-features = false
features = ["sqlite"]
[dependencies.rocket]
version = "0.5.0"
default-features = false
[dependencies.rocket_dyn_templates]
version = "0.1.0"
default-features = false
features = ["tera"]
[profile.release]
opt-level = "z"
lto = true

22
locales/en/services.ftl Normal file
View File

@ -0,0 +1,22 @@
brand = Services
count-scans = Displaying { $nb } scans:
count-services = Displaying { $nb } services:
-ipv6 = IPv6
-ipv4 = IPv4
title-list-scans = Scans list
title-list-services = Services list
title-add-service = Add service
title-error = Error
table-url = URL
table-software = Software
table-server = Server
table-timestamp = Timestamp
table-ipv6 = { -ipv6 }
table-ipv4 = { -ipv4 }
table-ipv6-availability = { -ipv6 } availability
table-ipv4-availability = { -ipv4 } availability
field-url = Service URL

22
locales/fr/services.ftl Normal file
View File

@ -0,0 +1,22 @@
brand = Services
count-scans = Affichage de { $nb } scans :
count-services = Affichage de { $nb } services :
-ipv6 = IPv6
-ipv4 = IPv4
title-list-scans = Liste des scans
title-list-services = Liste des services
title-add-service = Ajouter un service
title-error = Erreur
table-url = URL
table-software = Logiciel
table-server = Serveur
table-timestamp = Timestamp
table-ipv6 = { -ipv6 }
table-ipv4 = { -ipv4 }
table-ipv6-availability = Disponibilité { -ipv6 }
table-ipv4-availability = Disponibilité { -ipv4 }
field-url = URL du service

View File

@ -3,55 +3,100 @@ extern crate rocket;
mod check;
use crate::check::check;
use ::services::establish_connection;
use diesel::prelude::*;
use rocket::form;
use rocket::form::*;
use rocket_dyn_templates::Template;
use services::models::*;
use diesel::prelude::*;
use fluent_templates::FluentLoader;
use rocket::{
form::{self, Error, Form, Strict},
response::content::RawHtml,
State,
};
use rocket_accept_language::{language, AcceptLanguage, LanguageIdentifier};
use serde_json::json;
use tera::{Context, Tera, Value};
use unic_langid::{langid, subtags::Language};
const LANGUAGE_DEFAULT: Language = language!("en");
const SL: [LanguageIdentifier; 2] = [langid!("en"), langid!("fr")];
fluent_templates::static_loader! {
static LOCALES = {
locales: "./locales",
fallback_language: "en",
};
}
fn gen_context(accept_language: &AcceptLanguage, values: Value) -> Context {
let mut cont: Context = Context::from_value(json!({
"ln": &accept_language
.get_appropriate_language_region(&SL)
.unwrap_or((LANGUAGE_DEFAULT, None)).0.as_str()
}))
.unwrap();
cont.extend(Context::from_value(values).unwrap());
cont
}
#[launch]
fn rocket() -> _ {
rocket::build()
.attach(Template::fairing())
.mount("/", routes![list_services])
.mount("/", routes![list_scans])
.mount("/", routes![add_service_get])
.mount("/", routes![add_service_post])
let mut tera = Tera::new("templates/*.html.tera").unwrap();
tera.register_function("fluent", FluentLoader::new(&*LOCALES));
rocket::build().manage(tera).mount(
"/",
routes![list_services, list_scans, add_service_get, add_service_post],
)
}
#[get("/list-services")]
fn list_services() -> Template {
Template::render(
"list-services",
rocket_dyn_templates::context! {
services: services::schema::services::dsl::services
.limit(300)
.select(Services::as_select())
.load(&mut establish_connection())
.unwrap(),
},
#[get("/")]
fn list_services(tera: &State<Tera>, al: &AcceptLanguage) -> RawHtml<String> {
RawHtml(
tera.render(
"list-services.html.tera",
&gen_context(
al,
json!({
"services": &services::schema::services::dsl::services
.limit(300)
.select(Services::as_select())
.load(&mut establish_connection())
.unwrap()
}),
),
)
.unwrap(),
)
}
#[get("/list-scans")]
fn list_scans() -> Template {
Template::render(
"list-scans",
rocket_dyn_templates::context! {
scans: services::schema::scans::dsl::scans
.limit(1000)
.select(Scans::as_select())
.load(&mut establish_connection())
.unwrap(),
},
fn list_scans(tera: &State<Tera>, al: &AcceptLanguage) -> RawHtml<String> {
RawHtml(
tera.render(
"list-scans.html.tera",
&gen_context(
al,
json!({
"scans": services::schema::scans::dsl::scans
.limit(1000)
.select(Scans::as_select())
.load(&mut establish_connection())
.unwrap()
}),
),
)
.unwrap(),
)
}
#[get("/add-service")]
fn add_service_get() -> Template {
Template::render("add-service", rocket_dyn_templates::context! {})
fn add_service_get(tera: &State<Tera>, al: &AcceptLanguage) -> RawHtml<String> {
RawHtml(
tera.render("add-service.html.tera", &gen_context(al, json!({})))
.unwrap(),
)
}
fn check_url<'v>(url: &str) -> form::Result<'v, ()> {
@ -78,18 +123,23 @@ struct Submission<'r> {
}
#[post("/add-service", data = "<submission>")]
async fn add_service_post(submission: Form<Strict<Submission<'_>>>) -> Template {
async fn add_service_post(
submission: Form<Strict<Submission<'_>>>,
tera: &State<Tera>,
al: &AcceptLanguage,
) -> RawHtml<String> {
use ::services::schema::services::dsl::*;
use diesel::associations::HasTable;
let service = match check(submission.url, None).await {
Ok(service) => service,
Err(err) => {
return Template::render(
"error",
rocket_dyn_templates::context! {
error_message: err,
},
return RawHtml(
tera.render(
"error.html.tera",
&gen_context(al, json!({"error_message": &err})),
)
.unwrap(),
);
}
};
@ -107,5 +157,8 @@ async fn add_service_post(submission: Form<Strict<Submission<'_>>>) -> Template
.execute(&mut establish_connection())
.unwrap();
Template::render("add-service", rocket_dyn_templates::context! {})
RawHtml(
tera.render("add-service.html.tera", &gen_context(al, json!({})))
.unwrap(),
)
}

View File

@ -1,5 +1,5 @@
use diesel::prelude::*;
use rocket_dyn_templates::serde::Serialize;
use serde::Serialize;
#[derive(Queryable, Selectable, Insertable, Serialize, Debug)]
#[diesel(table_name = crate::schema::services)]

View File

@ -1,9 +1,9 @@
{% extends "base" %}
{% block title %}Add service{% endblock title %}
{% extends "base.html.tera" %}
{% block title %}{{ fluent(key="title-add-service", lang=ln) }}{% endblock title %}
{% block content %}
<form method="POST" target="add-service">
<label for="url">Service URL</label>
<label for="url">{{ fluent(key="field-url", lang=ln) }}</label>
<br>
<input type="text" name="url" id="url">
<br>

View File

@ -1,15 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<html lang="{{ ln }}">
<head>
<meta charset="utf-8">
<title>{% block title %}{% endblock title %} • Services</title>
<title>{% block title %}{% endblock title %} • {{ fluent(key="brand", lang=ln) }}</title>
</head>
<body>
<nav>
<ul>
<li><a href="list-services">List services</a></li>
<li><a href="list-scans">List scans</a></li>
<li><a href="add-service">Add service</a></li>
<li><a href=".">{{ fluent(key="title-list-services", lang=ln) }}</a></li>
<li><a href="list-scans">{{ fluent(key="title-list-scans", lang=ln) }}</a></li>
<li><a href="add-service">{{ fluent(key="title-add-service", lang=ln) }}</a></li>
</ul>
</nav>
<main>

View File

@ -1,5 +1,5 @@
{% extends "base" %}
{% block title %}Error{% endblock title %}
{% extends "base.html.tera" %}
{% block title %}{{ fluent(key="title-error", lang=ln) }}{% endblock title %}
{% block content %}
<p>

View File

@ -1,18 +1,18 @@
{% extends "base" %}
{% block title %}Scans list{% endblock title %}
{% extends "base.html.tera" %}
{% block title %}{{ fluent(key="title-list-scans", lang=ln) }}{% endblock title %}
{% block content %}
<p>
Displaying {{ scans | length }} scans:
{{ fluent(key="count-scans", lang=ln, nb=scans|length) }}
</p>
<table>
<thead>
<tr>
<th>Installation</th>
<th>Timestamp</th>
<th>IPv6</th>
<th>IPv4</th>
<th>{{ fluent(key="table-url", lang=ln) }}</th>
<th>{{ fluent(key="table-timestamp", lang=ln) }}</th>
<th>{{ fluent(key="table-ipv6", lang=ln) }}</th>
<th>{{ fluent(key="table-ipv4", lang=ln) }}</th>
</tr>
</thead>
<tbody>

View File

@ -1,21 +1,21 @@
{% extends "base" %}
{% block title %}List services{% endblock title %}
{% extends "base.html.tera" %}
{% block title %}{{ fluent(key="title-list-services", lang=ln) }}{% endblock title %}
{% block content %}
<p>
Displaying {{ services | length }} services:
{{ fluent(key="count-services", lang=ln, nb=services|length) }}
</p>
<table>
<thead>
<tr>
<th>URL</th>
<th>Software</th>
<th>Server</th>
<th>IPv6</th>
<th>IPv4</th>
<th>IPv6 availability</th>
<th>IPv4 availability</th>
<th>{{ fluent(key="table-url", lang=ln) }}</th>
<th>{{ fluent(key="table-software", lang=ln) }}</th>
<th>{{ fluent(key="table-server", lang=ln) }}</th>
<th>{{ fluent(key="table-ipv6", lang=ln) }}</th>
<th>{{ fluent(key="table-ipv4", lang=ln) }}</th>
<th>{{ fluent(key="table-ipv6-availability", lang=ln) }}</th>
<th>{{ fluent(key="table-ipv4-availability", lang=ln) }}</th>
</tr>
</thead>
<tbody>